Skip to content

Commit 5c4f381

Browse files
authored
Add initial tests and interpreter implementation (#2)
1 parent c5e1773 commit 5c4f381

File tree

4 files changed

+78
-21
lines changed

4 files changed

+78
-21
lines changed

interpreter/valid/valid.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,8 @@ let check_func (c : context) (f : func) =
382382
let is_const (c : context) (e : instr) =
383383
match e.it with
384384
| Const _ -> true
385+
| Binary (Values.I32 I32Op.(Add | Sub | Mul)) -> true
386+
| Binary (Values.I64 I64Op.(Add | Sub | Mul)) -> true
385387
| GlobalGet x -> let GlobalType (_, mut) = global c x in mut = Immutable
386388
| _ -> false
387389

proposals/extended-const/Overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ instruction:
4040

4141
- `i32.add`
4242
- `i32.sub`
43+
- `i32.mul`
4344
- `i64.add`
4445
- `i64.sub`
45-
- `i32.mul`
4646
- `i64.mul`
4747

4848
[spec]: https://webassembly.github.io/spec/core/valid/instructions.html#constant-expressions

test/core/data.wast

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,38 @@
156156
(data (i32.const 1) "a")
157157
)
158158

159+
;; Extended contant expressions
160+
161+
(module
162+
(memory 1)
163+
(data (i32.add (i32.const 0) (i32.const 42)))
164+
)
165+
166+
(module
167+
(memory 1)
168+
(data (i32.sub (i32.const 42) (i32.const 0)))
169+
)
170+
171+
(module
172+
(memory 1)
173+
(data (i32.mul (i32.const 1) (i32.const 2)))
174+
)
175+
176+
;; Combining add, sub, mul and global.get
177+
178+
(module
179+
(global (import "spectest" "global_i32") i32)
180+
(memory 1)
181+
(data (i32.mul
182+
(i32.const 2)
183+
(i32.add
184+
(i32.sub (global.get 0) (i32.const 1))
185+
(i32.const 2)
186+
)
187+
)
188+
)
189+
)
190+
159191
;; Invalid bounds for data
160192

161193
(assert_unlinkable
@@ -455,4 +487,4 @@
455487
(data (global.get 0))
456488
)
457489
"constant expression required"
458-
)
490+
)

test/core/global.wast

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,46 @@
11
;; Test globals
22

33
(module
4+
(global (import "spectest" "global_i32") i32)
5+
(global (import "spectest" "global_i64") i64)
6+
47
(global $a i32 (i32.const -2))
5-
(global (;1;) f32 (f32.const -3))
6-
(global (;2;) f64 (f64.const -4))
8+
(global (;3;) f32 (f32.const -3))
9+
(global (;4;) f64 (f64.const -4))
710
(global $b i64 (i64.const -5))
811

912
(global $x (mut i32) (i32.const -12))
10-
(global (;5;) (mut f32) (f32.const -13))
11-
(global (;6;) (mut f64) (f64.const -14))
13+
(global (;7;) (mut f32) (f32.const -13))
14+
(global (;8;) (mut f64) (f64.const -14))
1215
(global $y (mut i64) (i64.const -15))
1316

17+
(global $z1 i32 (global.get 0))
18+
(global $z2 i64 (global.get 1))
19+
(global $z3 i32 (i32.add (i32.sub (i32.mul (i32.const 20) (i32.const 2)) (i32.const 2)) (i32.const 4)))
20+
(global $z4 i64 (i64.add (i64.sub (i64.mul (i64.const 20) (i64.const 2)) (i64.const 2)) (i64.const 5)))
21+
(global $z5 i32 (i32.add (global.get 0) (i32.const 42)))
22+
(global $z6 i64 (i64.add (global.get 1) (i64.const 42)))
23+
24+
1425
(func (export "get-a") (result i32) (global.get $a))
1526
(func (export "get-b") (result i64) (global.get $b))
1627
(func (export "get-x") (result i32) (global.get $x))
1728
(func (export "get-y") (result i64) (global.get $y))
29+
(func (export "get-z1") (result i32) (global.get $z1))
30+
(func (export "get-z2") (result i64) (global.get $z2))
31+
(func (export "get-z3") (result i32) (global.get $z3))
32+
(func (export "get-z4") (result i64) (global.get $z4))
33+
(func (export "get-z5") (result i32) (global.get $z5))
34+
(func (export "get-z6") (result i64) (global.get $z6))
1835
(func (export "set-x") (param i32) (global.set $x (local.get 0)))
1936
(func (export "set-y") (param i64) (global.set $y (local.get 0)))
2037

21-
(func (export "get-1") (result f32) (global.get 1))
22-
(func (export "get-2") (result f64) (global.get 2))
23-
(func (export "get-5") (result f32) (global.get 5))
24-
(func (export "get-6") (result f64) (global.get 6))
25-
(func (export "set-5") (param f32) (global.set 5 (local.get 0)))
26-
(func (export "set-6") (param f64) (global.set 6 (local.get 0)))
38+
(func (export "get-3") (result f32) (global.get 3))
39+
(func (export "get-4") (result f64) (global.get 4))
40+
(func (export "get-7") (result f32) (global.get 7))
41+
(func (export "get-8") (result f64) (global.get 8))
42+
(func (export "set-7") (param f32) (global.set 7 (local.get 0)))
43+
(func (export "set-8") (param f64) (global.set 8 (local.get 0)))
2744

2845
;; As the argument of control constructs and instructions
2946

@@ -182,21 +199,27 @@
182199
(assert_return (invoke "get-b") (i64.const -5))
183200
(assert_return (invoke "get-x") (i32.const -12))
184201
(assert_return (invoke "get-y") (i64.const -15))
185-
186-
(assert_return (invoke "get-1") (f32.const -3))
187-
(assert_return (invoke "get-2") (f64.const -4))
188-
(assert_return (invoke "get-5") (f32.const -13))
189-
(assert_return (invoke "get-6") (f64.const -14))
202+
(assert_return (invoke "get-z1") (i32.const 666))
203+
(assert_return (invoke "get-z2") (i64.const 666))
204+
(assert_return (invoke "get-z3") (i32.const 42))
205+
(assert_return (invoke "get-z4") (i64.const 43))
206+
(assert_return (invoke "get-z5") (i32.const 708))
207+
(assert_return (invoke "get-z6") (i64.const 708))
208+
209+
(assert_return (invoke "get-3") (f32.const -3))
210+
(assert_return (invoke "get-4") (f64.const -4))
211+
(assert_return (invoke "get-7") (f32.const -13))
212+
(assert_return (invoke "get-8") (f64.const -14))
190213

191214
(assert_return (invoke "set-x" (i32.const 6)))
192215
(assert_return (invoke "set-y" (i64.const 7)))
193-
(assert_return (invoke "set-5" (f32.const 8)))
194-
(assert_return (invoke "set-6" (f64.const 9)))
216+
(assert_return (invoke "set-7" (f32.const 8)))
217+
(assert_return (invoke "set-8" (f64.const 9)))
195218

196219
(assert_return (invoke "get-x") (i32.const 6))
197220
(assert_return (invoke "get-y") (i64.const 7))
198-
(assert_return (invoke "get-5") (f32.const 8))
199-
(assert_return (invoke "get-6") (f64.const 9))
221+
(assert_return (invoke "get-7") (f32.const 8))
222+
(assert_return (invoke "get-8") (f64.const 9))
200223

201224
(assert_return (invoke "as-select-first") (i32.const 6))
202225
(assert_return (invoke "as-select-mid") (i32.const 2))

0 commit comments

Comments
 (0)