Skip to content

Commit cc6b0a2

Browse files
committed
Merge pull request #51 from AndrewScheidecker/Fix_i32.wrap
Fixed i32.wrap/i64 being parsed as i64.wrap/i64
2 parents aa25fba + 45c1196 commit cc6b0a2

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

ml-proto/src/host/lexer.mll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ rule token = parse
211211

212212
| "i64.extend_s/i32" { CONVERT (Values.Int64 Int64Op.ExtendSInt32) }
213213
| "i64.extend_u/i32" { CONVERT (Values.Int64 Int64Op.ExtendUInt32) }
214-
| "i64.wrap/i64" { CONVERT (Values.Int32 Int32Op.WrapInt64) }
214+
| "i32.wrap/i64" { CONVERT (Values.Int32 Int32Op.WrapInt64) }
215215
| (ixx as t)".trunc_s/f32"
216216
{ CONVERT (intop t Int32Op.TruncSFloat32 Int64Op.TruncSFloat32) }
217217
| (ixx as t)".trunc_u/f32"

ml-proto/test/conversions.wasm

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
(module
2+
3+
;; i64.extend_s/i32
4+
(func $i64_extend_s_i32 (param $x i32) (result i64) (i64.extend_s/i32 (get_local $x)))
5+
(export "$i64_extend_s_i32" $i64_extend_s_i32)
6+
7+
;; i64.extend_u/i32
8+
(func $i64_extend_u_i32 (param $x i32) (result i64) (i64.extend_u/i32 (get_local $x)))
9+
(export "$i64_extend_u_i32" $i64_extend_u_i32)
10+
11+
;; i32.wrap/i64
12+
(func $i32_wrap_i64 (param $x i64) (result i32) (i32.wrap/i64 (get_local $x)))
13+
(export "$i32_wrap_i64" $i32_wrap_i64)
14+
15+
;; i32.trunc_s/f32
16+
(func $i32_trunc_s_f32 (param $x f32) (result i32) (i32.trunc_s/f32 (get_local $x)))
17+
(export "$i32_trunc_s_f32" $i32_trunc_s_f32)
18+
19+
;; i32.trunc_u/f32
20+
(func $i32_trunc_u_f32 (param $x f32) (result i32) (i32.trunc_u/f32 (get_local $x)))
21+
(export "$i32_trunc_u_f32" $i32_trunc_u_f32)
22+
23+
;; i64.trunc_s/f32
24+
(func $i64_trunc_s_f32 (param $x f32) (result i64) (i64.trunc_s/f32 (get_local $x)))
25+
(export "$i64_trunc_s_f32" $i64_trunc_s_f32)
26+
27+
;; i64.trunc_u/f32
28+
(func $i64_trunc_u_f32 (param $x f32) (result i64) (i64.trunc_u/f32 (get_local $x)))
29+
(export "$i64_trunc_u_f32" $i64_trunc_u_f32)
30+
)
31+
32+
;; i64.extend_s/i32
33+
(assert_eq (invoke "$i64_extend_s_i32" (i32.const 0)) (i64.const 0))
34+
(assert_eq (invoke "$i64_extend_s_i32" (i32.const 10000)) (i64.const 10000))
35+
(assert_eq (invoke "$i64_extend_s_i32" (i32.const -10000)) (i64.const -10000))
36+
37+
;; i64.extend_u/i32
38+
(assert_eq (invoke "$i64_extend_u_i32" (i32.const 0)) (i64.const 0))
39+
(assert_eq (invoke "$i64_extend_u_i32" (i32.const 10000)) (i64.const 10000))
40+
(assert_eq (invoke "$i64_extend_u_i32" (i32.const -10000)) (i64.const 4294957296)) ;; ffff ffff ffff d8f0
41+
42+
;; i32.wrap/i64
43+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -1)) (i32.const -1))
44+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -100000)) (i32.const -100000))
45+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -2147483648)) (i32.const -2147483648)) ;; ffff ffff 8000 0000
46+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -2147483649)) (i32.const 2147483647)) ;; ffff ffff 7fff ffff
47+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -4294967296)) (i32.const 0)) ;; ffff ffff 0000 0000
48+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -4294967297)) (i32.const -1)) ;; ffff fffe ffff ffff
49+
(assert_eq (invoke "$i32_wrap_i64" (i64.const -4294967295)) (i32.const 1)) ;; ffff ffff 0000 0001
50+
(assert_eq (invoke "$i32_wrap_i64" (i64.const 0)) (i32.const 0))
51+
(assert_eq (invoke "$i32_wrap_i64" (i64.const 1311768467463790320)) (i32.const -1698898192)) ;; 1234 5678 9abc def0
52+
(assert_eq (invoke "$i32_wrap_i64" (i64.const 4294967295)) (i32.const -1)) ;; 0000 0000 ffff ffff
53+
(assert_eq (invoke "$i32_wrap_i64" (i64.const 4294967296)) (i32.const 0)) ;; 0000 0001 0000 0000
54+
(assert_eq (invoke "$i32_wrap_i64" (i64.const 4294967297)) (i32.const 1)) ;; 0000 0001 0000 0001
55+
56+
;; i32.trunc_s/f32
57+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const 1.0)) (i32.const 1))
58+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const 1.1)) (i32.const 1))
59+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const 1.5)) (i32.const 1))
60+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const -1.0)) (i32.const -1))
61+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const -1.1)) (i32.const -1))
62+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const -1.5)) (i32.const -1))
63+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const -1.9)) (i32.const -1))
64+
(assert_eq (invoke "$i32_trunc_s_f32" (f32.const -2.0)) (i32.const -2))
65+
66+
;; i32.trunc_u/f32
67+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 1.0)) (i32.const 1))
68+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 1.1)) (i32.const 1))
69+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 1.5)) (i32.const 1))
70+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 1.9)) (i32.const 1))
71+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 2.0)) (i32.const 2))
72+
(assert_eq (invoke "$i32_trunc_u_f32" (f32.const 2147483648)) (i32.const -2147483648)) ;; 0x1.00000p+31 -> 8000 0000
73+
74+
;; i64.trunc_s/f32
75+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const 1.0)) (i64.const 1))
76+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const 1.1)) (i64.const 1))
77+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const 1.5)) (i64.const 1))
78+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -1.0)) (i64.const -1))
79+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -1.1)) (i64.const -1))
80+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -1.5)) (i64.const -1))
81+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -1.9)) (i64.const -1))
82+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -2.0)) (i64.const -2))
83+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const 4294967296)) (i64.const 4294967296)) ;; 0x1.00000p+32 -> 1 0000 0000
84+
(assert_eq (invoke "$i64_trunc_s_f32" (f32.const -4294967296)) (i64.const -4294967296)) ;; -0x1.00000p+32 -> ffff ffff 0000 0000
85+
86+
;; i64.trunc_u/f32
87+
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 1.0)) (i64.const 1))
88+
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 1.1)) (i64.const 1))
89+
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 1.5)) (i64.const 1))
90+
(assert_eq (invoke "$i64_trunc_u_f32" (f32.const 4294967296)) (i64.const 4294967296))
91+
92+
(;
93+
todo:
94+
fxx.convert_s/ixx
95+
fxx.convert_u/ixx
96+
f64.promote/f32
97+
f32.demote/f64
98+
f32.reinterpret/i32
99+
f64.reinterpret/i64
100+
i32.reinterpret/f32
101+
i64.reinterpret/f64
102+
;)

0 commit comments

Comments
 (0)