Skip to content

Commit 114d17b

Browse files
authored
feat(stdlib)!: Convert unsafe Wasm functions to operators (#1734)
* feat!: Move `WasmF32` to operators * feat: Move `WasmF64` to operators * feat: Move `WasmI64` to operators * Feat: `WasmI32` to operators * chore: Update tests and docs * chore: Undo Global Scope's * chore: Apply suggestions from code review * fix: mistake in rebase * chore: Revert changes to `package-lock`
1 parent 2f0f57b commit 114d17b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1895
-1995
lines changed

cli/__test__/index.gr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ include "runtime/unsafe/wasmi64"
66
include "./nearEnv" as Env
77

88
provide let hello = () => {
9+
from WasmI32 use { (+) }
910
let value = "Hello, World!"
1011
let length = WasmI64.load32U(WasmI32.fromGrain(value), 4n)
11-
let ptr = WasmI64.extendI32U(WasmI32.add(WasmI32.fromGrain(value), 8n))
12+
let ptr = WasmI64.extendI32U(WasmI32.fromGrain(value) + 8n)
1213
Env.valueReturn(length, ptr)
1314
}

compiler/test/input/letMutForLoop.gr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ include "runtime/debugPrint"
55

66
@unsafe
77
let foo = () => {
8-
for (let mut x = 0N; WasmI64.ltS(x, 5N); x = WasmI64.add(x, 1N)) {
8+
from WasmI64 use { (+), (<) }
9+
for (let mut x = 0N; x < 5N; x += 1N) {
910
DebugPrint.printI64(x)
1011
}
1112
}

compiler/test/input/mallocTight.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module MallocTight
33

44
include "runtime/malloc"
55
include "runtime/unsafe/wasmi32"
6-
from WasmI32 use { add as (+), sub as (-), mul as (*), eq as (==), ne as (!=) }
6+
from WasmI32 use { (+), (-), (*), (==), (!=) }
77

88
primitive assert = "@assert"
99
primitive ignore = "@ignore"

compiler/test/input/memoryBase/asserts.gr

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ primitive typeMetadata = "@heap.type_metadata"
1212

1313
@unsafe
1414
let doTest = () => {
15-
assert WasmI32.eq(heapBase, 0x110000n)
16-
assert WasmI32.eq(heapStart(), 0x1101A8n)
17-
assert WasmI32.eq(typeMetadata, 0x110008n)
15+
from WasmI32 use { (==) }
16+
assert heapBase == 0x110000n
17+
assert heapStart() == 0x1101A8n
18+
assert typeMetadata == 0x110008n
1819
}
1920

2021
doTest()

compiler/test/stdlib/wasmf32.test.gr

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,58 +5,60 @@ include "runtime/unsafe/conv"
55

66
@unsafe
77
let test = () => {
8+
let eq = (==)
9+
from WasmF32 use { (+), (-), (*), (/), (==), (!=), (<), (<=), (>), (>=) }
810
// unary tests
9-
assert WasmF32.eq(WasmF32.neg(-1.23w), 1.23w)
10-
assert WasmF32.eq(WasmF32.neg(1.23w), -1.23w)
11-
assert WasmF32.eq(WasmF32.abs(1.23w), 1.23w)
12-
assert WasmF32.eq(WasmF32.abs(-1.23w), 1.23w)
13-
assert WasmF32.eq(WasmF32.ceil(1.5w), 2.0w)
14-
assert WasmF32.eq(WasmF32.ceil(-1.5w), -1.0w)
15-
assert WasmF32.eq(WasmF32.floor(1.5w), 1.0w)
16-
assert WasmF32.eq(WasmF32.floor(-1.5w), -2.0w)
17-
assert WasmF32.eq(WasmF32.trunc(1.23w), 1.0w)
18-
assert WasmF32.eq(WasmF32.trunc(-1.23w), -1.0w)
19-
assert WasmF32.eq(WasmF32.nearest(1.23w), 1.0w)
20-
assert WasmF32.eq(WasmF32.nearest(1.73w), 2.0w)
21-
assert WasmF32.eq(WasmF32.nearest(-1.23w), -1.0w)
22-
assert WasmF32.eq(WasmF32.nearest(-1.73w), -2.0w)
23-
assert WasmF32.eq(WasmF32.sqrt(16.0w), 4.0w)
11+
assert WasmF32.neg(-1.23w) == 1.23w
12+
assert WasmF32.neg(1.23w) == -1.23w
13+
assert WasmF32.abs(1.23w) == 1.23w
14+
assert WasmF32.abs(-1.23w) == 1.23w
15+
assert WasmF32.ceil(1.5w) == 2.0w
16+
assert WasmF32.ceil(-1.5w) == -1.0w
17+
assert WasmF32.floor(1.5w) == 1.0w
18+
assert WasmF32.floor(-1.5w) == -2.0w
19+
assert WasmF32.trunc(1.23w) == 1.0w
20+
assert WasmF32.trunc(-1.23w) == -1.0w
21+
assert WasmF32.nearest(1.23w) == 1.0w
22+
assert WasmF32.nearest(1.73w) == 2.0w
23+
assert WasmF32.nearest(-1.23w) == -1.0w
24+
assert WasmF32.nearest(-1.73w) == -2.0w
25+
assert WasmF32.sqrt(16.0w) == 4.0w
2426

2527
// binary tests
26-
assert WasmF32.eq(WasmF32.add(2.5w, 4.0w), 6.5w)
27-
assert WasmF32.eq(WasmF32.sub(2.5w, 4.0w), -1.5w)
28-
assert WasmF32.eq(WasmF32.mul(2.5w, 4.0w), 10.0w)
29-
assert WasmF32.eq(WasmF32.div(2.5w, 4.0w), 0.625w)
30-
assert WasmF32.eq(WasmF32.copySign(2.5w, 4.0w), 2.5w)
31-
assert WasmF32.eq(WasmF32.copySign(2.5w, -4.0w), -2.5w)
32-
assert WasmF32.eq(WasmF32.min(2.5w, 4.0w), 2.5w)
33-
assert WasmF32.eq(WasmF32.max(2.5w, 4.0w), 4.0w)
34-
assert WasmF32.eq(1.23w, 1.23w)
35-
assert !WasmF32.eq(1.23w, -1.23w)
36-
assert WasmF32.ne(1.23w, -1.23w)
37-
assert !WasmF32.ne(1.23w, 1.23w)
38-
assert WasmF32.lt(1.23w, 1.24w)
39-
assert !WasmF32.lt(1.23w, 1.22w)
40-
assert WasmF32.le(1.23w, 1.24w)
41-
assert WasmF32.le(1.23w, 1.23w)
42-
assert !WasmF32.le(1.23w, 1.22w)
43-
assert WasmF32.gt(1.23w, 1.22w)
44-
assert !WasmF32.gt(1.23w, 1.24w)
45-
assert WasmF32.ge(1.23w, 1.22w)
46-
assert WasmF32.ge(1.23w, 1.23w)
47-
assert !WasmF32.ge(1.23w, 1.24w)
28+
assert 2.5w + 4.0w == 6.5w
29+
assert 2.5w - 4.0w == -1.5w
30+
assert 2.5w * 4.0w == 10.0w
31+
assert 2.5w / 4.0w == 0.625w
32+
assert WasmF32.copySign(2.5w, 4.0w) == 2.5w
33+
assert WasmF32.copySign(2.5w, -4.0w) == -2.5w
34+
assert WasmF32.min(2.5w, 4.0w) == 2.5w
35+
assert WasmF32.max(2.5w, 4.0w) == 4.0w
36+
assert 1.23w == 1.23w
37+
assert !(1.23w == -1.23w)
38+
assert 1.23w != -1.23w
39+
assert !(1.23w != 1.23w)
40+
assert 1.23w < 1.24w
41+
assert !(1.23w < 1.22w)
42+
assert 1.23w <= 1.24w
43+
assert 1.23w <= 1.23w
44+
assert !(1.23w <= 1.22w)
45+
assert 1.23w > 1.22w
46+
assert !(1.23w > 1.24w)
47+
assert 1.23w >= 1.22w
48+
assert 1.23w >= 1.23w
49+
assert !(1.23w >= 1.24w)
4850

4951
// conversion tests
50-
assert WasmF32.eq(WasmF32.reinterpretI32(0x42280000n), 42.0w)
51-
assert WasmF32.eq(WasmF32.convertI32S(-1n), -1.0w)
52-
assert WasmF32.eq(WasmF32.convertI32U(-1n), 4294967296.0w)
53-
assert WasmF32.eq(WasmF32.convertI64S(-1N), -1.0w)
54-
assert WasmF32.eq(WasmF32.convertI64U(-1N), 18446744073709552000.0w)
55-
assert WasmF32.eq(WasmF32.demoteF64(1.23W), 1.23w)
52+
assert WasmF32.reinterpretI32(0x42280000n) == 42.0w
53+
assert WasmF32.convertI32S(-1n) == -1.0w
54+
assert WasmF32.convertI32U(-1n) == 4294967296.0w
55+
assert WasmF32.convertI64S(-1N) == -1.0w
56+
assert WasmF32.convertI64U(-1N) == 18446744073709552000.0w
57+
assert WasmF32.demoteF64(1.23W) == 1.23w
5658

5759
// Grain conversion tests
58-
assert Conv.toFloat32(1.23w) == 1.23f
59-
assert WasmF32.eq(Conv.fromFloat32(1.23f), 1.23w)
60+
assert Conv.fromFloat32(1.23f) == 1.23w
61+
assert eq(Conv.toFloat32(1.23w), 1.23f)
6062
}
6163

6264
test()

compiler/test/stdlib/wasmf64.test.gr

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,58 +5,60 @@ include "runtime/unsafe/conv"
55

66
@unsafe
77
let test = () => {
8+
let eq = (==)
9+
from WasmF64 use { (+), (-), (*), (/), (==), (!=), (<), (<=), (>), (>=) }
810
// unary tests
9-
assert WasmF64.eq(WasmF64.neg(-1.23W), 1.23W)
10-
assert WasmF64.eq(WasmF64.neg(1.23W), -1.23W)
11-
assert WasmF64.eq(WasmF64.abs(1.23W), 1.23W)
12-
assert WasmF64.eq(WasmF64.abs(-1.23W), 1.23W)
13-
assert WasmF64.eq(WasmF64.ceil(1.5W), 2.0W)
14-
assert WasmF64.eq(WasmF64.ceil(-1.5W), -1.0W)
15-
assert WasmF64.eq(WasmF64.floor(1.5W), 1.0W)
16-
assert WasmF64.eq(WasmF64.floor(-1.5W), -2.0W)
17-
assert WasmF64.eq(WasmF64.trunc(1.23W), 1.0W)
18-
assert WasmF64.eq(WasmF64.trunc(-1.23W), -1.0W)
19-
assert WasmF64.eq(WasmF64.nearest(1.23W), 1.0W)
20-
assert WasmF64.eq(WasmF64.nearest(1.73W), 2.0W)
21-
assert WasmF64.eq(WasmF64.nearest(-1.23W), -1.0W)
22-
assert WasmF64.eq(WasmF64.nearest(-1.73W), -2.0W)
23-
assert WasmF64.eq(WasmF64.sqrt(16.0W), 4.0W)
11+
assert WasmF64.neg(-1.23W) == 1.23W
12+
assert WasmF64.neg(1.23W) == -1.23W
13+
assert WasmF64.abs(1.23W) == 1.23W
14+
assert WasmF64.abs(-1.23W) == 1.23W
15+
assert WasmF64.ceil(1.5W) == 2.0W
16+
assert WasmF64.ceil(-1.5W) == -1.0W
17+
assert WasmF64.floor(1.5W) == 1.0W
18+
assert WasmF64.floor(-1.5W) == -2.0W
19+
assert WasmF64.trunc(1.23W) == 1.0W
20+
assert WasmF64.trunc(-1.23W) == -1.0W
21+
assert WasmF64.nearest(1.23W) == 1.0W
22+
assert WasmF64.nearest(1.73W) == 2.0W
23+
assert WasmF64.nearest(-1.23W) == -1.0W
24+
assert WasmF64.nearest(-1.73W) == -2.0W
25+
assert WasmF64.sqrt(16.0W) == 4.0W
2426

2527
// binary tests
26-
assert WasmF64.eq(WasmF64.add(2.5W, 4.0W), 6.5W)
27-
assert WasmF64.eq(WasmF64.sub(2.5W, 4.0W), -1.5W)
28-
assert WasmF64.eq(WasmF64.mul(2.5W, 4.0W), 10.0W)
29-
assert WasmF64.eq(WasmF64.div(2.5W, 4.0W), 0.625W)
30-
assert WasmF64.eq(WasmF64.copySign(2.5W, 4.0W), 2.5W)
31-
assert WasmF64.eq(WasmF64.copySign(2.5W, -4.0W), -2.5W)
32-
assert WasmF64.eq(WasmF64.min(2.5W, 4.0W), 2.5W)
33-
assert WasmF64.eq(WasmF64.max(2.5W, 4.0W), 4.0W)
34-
assert WasmF64.eq(1.23W, 1.23W)
35-
assert !WasmF64.eq(1.23W, -1.23W)
36-
assert WasmF64.ne(1.23W, -1.23W)
37-
assert !WasmF64.ne(1.23W, 1.23W)
38-
assert WasmF64.lt(1.23W, 1.24W)
39-
assert !WasmF64.lt(1.23W, 1.22W)
40-
assert WasmF64.le(1.23W, 1.24W)
41-
assert WasmF64.le(1.23W, 1.23W)
42-
assert !WasmF64.le(1.23W, 1.22W)
43-
assert WasmF64.gt(1.23W, 1.22W)
44-
assert !WasmF64.gt(1.23W, 1.24W)
45-
assert WasmF64.ge(1.23W, 1.22W)
46-
assert WasmF64.ge(1.23W, 1.23W)
47-
assert !WasmF64.ge(1.23W, 1.24W)
28+
assert 2.5W + 4.0W == 6.5W
29+
assert 2.5W - 4.0W == -1.5W
30+
assert 2.5W * 4.0W == 10.0W
31+
assert 2.5W / 4.0W == 0.625W
32+
assert WasmF64.copySign(2.5W, 4.0W) == 2.5W
33+
assert WasmF64.copySign(2.5W, -4.0W) == -2.5W
34+
assert WasmF64.min(2.5W, 4.0W) == 2.5W
35+
assert WasmF64.max(2.5W, 4.0W) == 4.0W
36+
assert 1.23W == 1.23W
37+
assert !(1.23W == -1.23W)
38+
assert 1.23W != -1.23W
39+
assert !(1.23W != 1.23W)
40+
assert 1.23W < 1.24W
41+
assert !(1.23W < 1.22W)
42+
assert 1.23W <= 1.24W
43+
assert 1.23W <= 1.23W
44+
assert !(1.23W <= 1.22W)
45+
assert 1.23W > 1.22W
46+
assert !(1.23W > 1.24W)
47+
assert 1.23W >= 1.22W
48+
assert 1.23W >= 1.23W
49+
assert !(1.23W >= 1.24W)
4850

4951
// conversion tests
50-
assert WasmF64.eq(WasmF64.reinterpretI64(0x4045000000000000N), 42.0W)
51-
assert WasmF64.eq(WasmF64.convertI32S(-1n), -1.0W)
52-
assert WasmF64.eq(WasmF64.convertI32U(-1n), 4294967295.0W)
53-
assert WasmF64.eq(WasmF64.convertI64S(-1N), -1.0W)
54-
assert WasmF64.eq(WasmF64.convertI64U(-1N), 18446744073709552000.0W)
55-
assert WasmF64.eq(WasmF64.promoteF32(1.5w), 1.5W)
52+
assert WasmF64.reinterpretI64(0x4045000000000000N) == 42.0W
53+
assert WasmF64.convertI32S(-1n) == -1.0W
54+
assert WasmF64.convertI32U(-1n) == 4294967295.0W
55+
assert WasmF64.convertI64S(-1N) == -1.0W
56+
assert WasmF64.convertI64U(-1N) == 18446744073709552000.0W
57+
assert WasmF64.promoteF32(1.5w) == 1.5W
5658

5759
// Grain conversion tests
58-
assert Conv.toFloat64(1.23W) == 1.23d
59-
assert WasmF64.eq(Conv.fromFloat64(1.23d), 1.23W)
60+
assert eq(Conv.toFloat64(1.23W), 1.23d)
61+
assert Conv.fromFloat64(1.23d) == 1.23W
6062
}
6163

6264
test()

0 commit comments

Comments
 (0)