Skip to content

Commit 8d16bf6

Browse files
authored
Refactor i64 example (#24)
1 parent c0b53bc commit 8d16bf6

File tree

4 files changed

+70
-46
lines changed

4 files changed

+70
-46
lines changed

i64/asconfig.json

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"entries": [
3+
"./assembly/i64.ts"
4+
],
5+
"options": {
6+
"runtime": "stub",
7+
"sourceMap": true,
8+
"measure": true
9+
},
10+
"targets": {
11+
"debug": {
12+
"outFile": "build/debug.wasm",
13+
"textFile": "build/debug.wat",
14+
"debug": true
15+
},
16+
"release": {
17+
"outFile": "build/release.wasm",
18+
"textFile": "build/release.wat",
19+
"optimizeLevel": 3,
20+
"shrinkLevel": 0,
21+
"noAssert": true
22+
}
23+
}
24+
}

i64/assembly/i64.ts

+40-40
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1-
var lo: u32, hi: u32;
1+
import {
2+
clz as builtin_clz,
3+
ctz as builtin_ctz,
4+
popcnt as builtin_popcnt,
5+
rotl as builtin_rotl,
6+
rotr as builtin_rotr,
7+
} from "builtins";
8+
9+
let
10+
lo: u32,
11+
hi: u32;
212

313
export function getLo(): u32 {
414
return lo;
@@ -8,186 +18,176 @@ export function getHi(): u32 {
818
return hi;
919
}
1020

11-
import { clz as builtin_clz } from "builtins";
12-
1321
export function clz(loLeft: u32, hiLeft: u32): void {
1422
var ret = builtin_clz<u64>(<u64>loLeft | <u64>hiLeft << 32);
1523
lo = <u32>ret;
1624
hi = 0;
1725
}
1826

19-
import { ctz as builtin_ctz } from "builtins";
20-
2127
export function ctz(loLeft: u32, hiLeft: u32): void {
2228
var ret = builtin_ctz<u64>(<u64>loLeft | <u64>hiLeft << 32);
2329
lo = <u32>ret;
2430
hi = 0;
2531
}
2632

27-
import { popcnt as builtin_popcnt } from "builtins";
28-
2933
export function popcnt(loLeft: u32, hiLeft: u32): void {
3034
var ret = builtin_popcnt<u64>(<u64>loLeft | <u64>hiLeft << 32);
3135
lo = <u32>ret;
3236
hi = 0;
3337
}
3438

3539
export function eqz(loLeft: u32, hiLeft: u32): void {
36-
var ret: bool = !(<u64>loLeft | <u64>hiLeft << 32);
40+
var ret = !(<u64>loLeft | <u64>hiLeft << 32);
3741
lo = u32(ret);
3842
hi = 0;
3943
}
4044

4145
export function add(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
4246
var ret = (<u64>loLeft | <u64>hiLeft << 32) + (<u64>loRight | <u64>hiRight << 32);
4347
lo = <u32>ret;
44-
hi = <u32>(ret >> 32);
48+
hi = u32(ret >> 32);
4549
}
4650

4751
export function sub(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
4852
var ret = (<u64>loLeft | <u64>hiLeft << 32) - (<u64>loRight | <u64>hiRight << 32);
4953
lo = <u32>ret;
50-
hi = <u32>(ret >> 32);
54+
hi = u32(ret >> 32);
5155
}
5256

5357
export function mul(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
5458
var ret = (<u64>loLeft | <u64>hiLeft << 32) * (<u64>loRight | <u64>hiRight << 32);
5559
lo = <u32>ret;
56-
hi = <u32>(ret >> 32);
60+
hi = u32(ret >> 32);
5761
}
5862

5963
export function div_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
60-
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) / <i64>(<u64>loRight | <u64>hiRight << 32));
64+
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) / i64(<u64>loRight | <u64>hiRight << 32));
6165
lo = <u32>ret;
62-
hi = <u32>(ret >> 32);
66+
hi = u32(ret >> 32);
6367
}
6468

6569
export function div_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
6670
var ret = (<u64>loLeft | <u64>hiLeft << 32) / (<u64>loRight | <u64>hiRight << 32);
6771
lo = <u32>ret;
68-
hi = <u32>(ret >> 32);
72+
hi = u32(ret >> 32);
6973
}
7074

7175
export function rem_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
72-
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) % <i64>(<u64>loRight | <u64>hiRight << 32));
76+
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) % i64(<u64>loRight | <u64>hiRight << 32));
7377
lo = <u32>ret;
74-
hi = <u32>(ret >> 32);
78+
hi = u32(ret >> 32);
7579
}
7680

7781
export function rem_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
7882
var ret = (<u64>loLeft | <u64>hiLeft << 32) % (<u64>loRight | <u64>hiRight << 32);
7983
lo = <u32>ret;
80-
hi = <u32>(ret >>> 32);
84+
hi = u32(ret >>> 32);
8185
}
8286

8387
export function and(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
8488
var ret = (<u64>loLeft | <u64>hiLeft << 32) & (<u64>loRight | <u64>hiRight << 32);
8589
lo = <u32>ret;
86-
hi = <u32>(ret >>> 32);
90+
hi = u32(ret >>> 32);
8791
}
8892

8993
export function or(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
9094
var ret = (<u64>loLeft | <u64>hiLeft << 32) | (<u64>loRight | <u64>hiRight << 32);
9195
lo = <u32>ret;
92-
hi = <u32>(ret >>> 32);
96+
hi = u32(ret >>> 32);
9397
}
9498

9599
export function xor(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
96100
var ret = (<u64>loLeft | <u64>hiLeft << 32) ^ (<u64>loRight | <u64>hiRight << 32);
97101
lo = <u32>ret;
98-
hi = <u32>(ret >>> 32);
102+
hi = u32(ret >>> 32);
99103
}
100104

101105
export function shl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
102106
var ret = (<u64>loLeft | <u64>hiLeft << 32) << (<u64>loRight | <u64>hiRight << 32);
103107
lo = <u32>ret;
104-
hi = <u32>(ret >>> 32);
108+
hi = u32(ret >>> 32);
105109
}
106110

107111
export function shr_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
108-
var ret = <u64>(<i64>(<u64>loLeft | <u64>hiLeft << 32) >> <i64>(<u64>loRight | <u64>hiRight << 32));
112+
var ret = u64(i64(<u64>loLeft | <u64>hiLeft << 32) >> i64(<u64>loRight | <u64>hiRight << 32));
109113
lo = <u32>ret;
110-
hi = <u32>(ret >>> 32);
114+
hi = u32(ret >>> 32);
111115
}
112116

113117
export function shr_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
114118
var ret = (<u64>loLeft | <u64>hiLeft << 32) >> (<u64>loRight | <u64>hiRight << 32);
115119
lo = <u32>ret;
116-
hi = <u32>(ret >>> 32);
120+
hi = u32(ret >>> 32);
117121
}
118122

119-
import { rotl as builtin_rotl } from "builtins";
120-
121123
export function rotl(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
122124
var ret = builtin_rotl<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
123125
lo = <u32>ret;
124-
hi = <u32>(ret >>> 32);
126+
hi = u32(ret >>> 32);
125127
}
126128

127-
import { rotr as builtin_rotr } from "builtins";
128-
129129
export function rotr(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
130130
var ret = builtin_rotr<u64>(<u64>loLeft | <u64>hiLeft << 32, <u64>loRight | <u64>hiRight << 32);
131131
lo = <u32>ret;
132-
hi = <u32>(ret >>> 32);
132+
hi = u32(ret >>> 32);
133133
}
134134

135135
export function eq(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
136-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) == (<u64>loRight | <u64>hiRight << 32);
136+
var ret = (<u64>loLeft | <u64>hiLeft << 32) == (<u64>loRight | <u64>hiRight << 32);
137137
lo = u32(ret);
138138
hi = 0;
139139
}
140140

141141
export function ne(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
142-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) != (<u64>loRight | <u64>hiRight << 32);
142+
var ret = (<u64>loLeft | <u64>hiLeft << 32) != (<u64>loRight | <u64>hiRight << 32);
143143
lo = u32(ret);
144144
hi = 0;
145145
}
146146

147147
export function lt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
148-
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) < <i64>(<u64>loRight | <u64>hiRight << 32);
148+
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) < i64(<u64>loRight | <u64>hiRight << 32);
149149
lo = u32(ret);
150150
hi = 0;
151151
}
152152

153153
export function lt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
154-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) < (<u64>loRight | <u64>hiRight << 32);
154+
var ret = (<u64>loLeft | <u64>hiLeft << 32) < (<u64>loRight | <u64>hiRight << 32);
155155
lo = u32(ret);
156156
hi = 0;
157157
}
158158

159159
export function le_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
160-
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) <= <i64>(<u64>loRight | <u64>hiRight << 32);
160+
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) <= i64(<u64>loRight | <u64>hiRight << 32);
161161
lo = u32(ret);
162162
hi = 0;
163163
}
164164

165165
export function le_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
166-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) <= (<u64>loRight | <u64>hiRight << 32);
166+
var ret = (<u64>loLeft | <u64>hiLeft << 32) <= (<u64>loRight | <u64>hiRight << 32);
167167
lo = u32(ret);
168168
hi = 0;
169169
}
170170

171171
export function gt_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
172-
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) > <i64>(<u64>loRight | <u64>hiRight << 32);
172+
var ret = <i64>(<u64>loLeft | <u64>hiLeft << 32) > <i64>(<u64>loRight | <u64>hiRight << 32);
173173
lo = u32(ret);
174174
hi = 0;
175175
}
176176

177177
export function gt_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
178-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) > (<u64>loRight | <u64>hiRight << 32);
178+
var ret = (<u64>loLeft | <u64>hiLeft << 32) > (<u64>loRight | <u64>hiRight << 32);
179179
lo = u32(ret);
180180
hi = 0;
181181
}
182182

183183
export function ge_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
184-
var ret: bool = <i64>(<u64>loLeft | <u64>hiLeft << 32) >= <i64>(<u64>loRight | <u64>hiRight << 32);
184+
var ret = i64(<u64>loLeft | <u64>hiLeft << 32) >= i64(<u64>loRight | <u64>hiRight << 32);
185185
lo = u32(ret);
186186
hi = 0;
187187
}
188188

189189
export function ge_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
190-
var ret: bool = (<u64>loLeft | <u64>hiLeft << 32) >= (<u64>loRight | <u64>hiRight << 32);
190+
var ret = (<u64>loLeft | <u64>hiLeft << 32) >= (<u64>loRight | <u64>hiRight << 32);
191191
lo = u32(ret);
192192
hi = 0;
193193
}

i64/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
var fs = require("fs");
22

33
// Instantiate the module
4-
var mod = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));
4+
var mod = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/release.wasm"));
55
var ins = new WebAssembly.Instance(mod, { /* no imports */ });
66

77
// Export its exports

i64/package.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
"main": "index.js",
66
"types": "index.d.ts",
77
"scripts": {
8-
"asbuild": "npm run asbuild:untouched && npm run asbuild:optimized",
9-
"asbuild:untouched": "asc assembly/i64.ts -t build/untouched.wat -o build/untouched.wasm --runtime stub --sourceMap --debug --measure",
10-
"asbuild:optimized": "asc assembly/i64.ts -t build/optimized.wat -o build/optimized.wasm -O3 --runtime stub --sourceMap --measure",
8+
"asbuild:debug": "asc --target debug",
9+
"asbuild:release": "asc --target release",
10+
"asbuild": "npm run asbuild:debug && npm run asbuild:release",
1111
"test": "node tests"
1212
},
1313
"files": [
1414
"assembly/",
15-
"build/optimized.wasm",
16-
"build/optimized.wasm.map",
15+
"build/release.wasm",
16+
"build/release.wasm.map",
1717
"index.d.ts",
1818
"index.js",
1919
"README.md"

0 commit comments

Comments
 (0)