Skip to content

Commit 03315df

Browse files
committed
add i{32,64}-sdiv .wast tests
Signed-off-by: Robin Freyler <[email protected]>
1 parent fd917db commit 03315df

File tree

2 files changed

+410
-0
lines changed

2 files changed

+410
-0
lines changed

tests/op/i32-sdiv.wast

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
;; Identity
2+
3+
(module
4+
(func (export "i32.sdiv(x,1)") (param i32) (result i32)
5+
(i32.div_s (local.get 0) (i32.const 1))
6+
)
7+
)
8+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const 0)) (i32.const 0))
9+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const 1)) (i32.const 1))
10+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const -1)) (i32.const -1))
11+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const 42)) (i32.const 42))
12+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const 0x7FFF_FFFF)) (i32.const 0x7FFF_FFFF))
13+
(assert_return (invoke "i32.sdiv(x,1)" (i32.const 0x8000_0000)) (i32.const 0x8000_0000))
14+
15+
;; Negate
16+
17+
(module
18+
(func (export "i32.sdiv(x,-1)") (param i32) (result i32)
19+
(i32.div_s (local.get 0) (i32.const -1))
20+
)
21+
)
22+
(assert_return (invoke "i32.sdiv(x,-1)" (i32.const 0)) (i32.const 0))
23+
(assert_return (invoke "i32.sdiv(x,-1)" (i32.const 1)) (i32.const -1))
24+
(assert_return (invoke "i32.sdiv(x,-1)" (i32.const -1)) (i32.const 1))
25+
(assert_return (invoke "i32.sdiv(x,-1)" (i32.const 42)) (i32.const -42))
26+
(assert_return (invoke "i32.sdiv(x,-1)" (i32.const 0x7FFF_FFFF)) (i32.const 0x8000_0001))
27+
(assert_trap (invoke "i32.sdiv(x,-1)" (i32.const 0x8000_0000)) "integer overflow")
28+
29+
;; Neutral
30+
31+
(module
32+
(func (export "i32.sdiv(x,x)") (param i32) (result i32)
33+
(i32.div_s (local.get 0) (local.get 0))
34+
)
35+
)
36+
(assert_trap (invoke "i32.sdiv(x,x)" (i32.const 0)) "divide by zero")
37+
(assert_return (invoke "i32.sdiv(x,x)" (i32.const 1)) (i32.const 1))
38+
(assert_return (invoke "i32.sdiv(x,x)" (i32.const -1)) (i32.const 1))
39+
(assert_return (invoke "i32.sdiv(x,x)" (i32.const 42)) (i32.const 1))
40+
(assert_return (invoke "i32.sdiv(x,x)" (i32.const 0x7FFF_FFFF)) (i32.const 1))
41+
(assert_return (invoke "i32.sdiv(x,x)" (i32.const 0x8000_0000)) (i32.const 1))
42+
43+
;; Divide by Power-of-Two
44+
45+
(module
46+
(func (export "i32.sdiv(x,2)") (param i32) (result i32)
47+
(i32.div_s (local.get 0) (i32.const 2))
48+
)
49+
)
50+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const 0)) (i32.const 0))
51+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const 1)) (i32.const 0))
52+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const -1)) (i32.const 0))
53+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const 42)) (i32.const 21))
54+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const 0x7FFF_FFFF)) (i32.const 0x3FFF_FFFF))
55+
(assert_return (invoke "i32.sdiv(x,2)" (i32.const 0x8000_0000)) (i32.const 0xC000_0000))
56+
57+
;; Divide by `i32::MIN`
58+
59+
(module
60+
(func (export "i32.sdiv(x,min)") (param i32) (result i32)
61+
(i32.div_s (local.get 0) (i32.const 0x8000_0000))
62+
)
63+
)
64+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const 0)) (i32.const 0))
65+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const 1)) (i32.const 0))
66+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const -1)) (i32.const 0))
67+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const 42)) (i32.const 0))
68+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const 0x7FFF_FFFF)) (i32.const 0))
69+
(assert_return (invoke "i32.sdiv(x,min)" (i32.const 0x8000_0000)) (i32.const 1))
70+
71+
;; Divide Zero
72+
73+
(module
74+
(func (export "i32.sdiv(0,x)") (param i32) (result i32)
75+
(i32.div_s (i32.const 0) (local.get 0))
76+
)
77+
)
78+
(assert_trap (invoke "i32.sdiv(0,x)" (i32.const 0)) "divide by zero")
79+
(assert_return (invoke "i32.sdiv(0,x)" (i32.const 1)) (i32.const 0))
80+
(assert_return (invoke "i32.sdiv(0,x)" (i32.const -1)) (i32.const 0))
81+
(assert_return (invoke "i32.sdiv(0,x)" (i32.const 42)) (i32.const 0))
82+
(assert_return (invoke "i32.sdiv(0,x)" (i32.const 0x7FFF_FFFF)) (i32.const 0))
83+
(assert_return (invoke "i32.sdiv(0,x)" (i32.const 0x8000_0000)) (i32.const 0))
84+
85+
;; Divide `i32::MAX`
86+
87+
(module
88+
(func (export "i32.sdiv(max,x)") (param i32) (result i32)
89+
(i32.div_s (i32.const 0x7FFF_FFFF) (local.get 0))
90+
)
91+
)
92+
(assert_trap (invoke "i32.sdiv(max,x)" (i32.const 0)) "divide by zero")
93+
(assert_return (invoke "i32.sdiv(max,x)" (i32.const 1)) (i32.const 0x7FFF_FFFF))
94+
(assert_return (invoke "i32.sdiv(max,x)" (i32.const -1)) (i32.const 0x8000_0001))
95+
(assert_return (invoke "i32.sdiv(max,x)" (i32.const 42)) (i32.const 51130563)) ;; i32::MAX / 42
96+
(assert_return (invoke "i32.sdiv(max,x)" (i32.const 0x7FFF_FFFF)) (i32.const 1))
97+
(assert_return (invoke "i32.sdiv(max,x)" (i32.const 0x8000_0000)) (i32.const 0))
98+
99+
;; Small `rhs` immediate
100+
101+
(module
102+
(func (export "i32.sdiv(x,10)") (param i32) (result i32)
103+
(i32.div_s (local.get 0) (i32.const 10))
104+
)
105+
)
106+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const 0)) (i32.const 0))
107+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const 1)) (i32.const 0))
108+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const -1)) (i32.const 0))
109+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const 42)) (i32.const 4))
110+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const 0x7FFF_FFFF)) (i32.const 214748364))
111+
(assert_return (invoke "i32.sdiv(x,10)" (i32.const 0x8000_0000)) (i32.const -214748364))
112+
113+
;; Small `lhs` immediate
114+
115+
(module
116+
(func (export "i32.sdiv(100,x)") (param i32) (result i32)
117+
(i32.div_s (i32.const 100) (local.get 0))
118+
)
119+
)
120+
(assert_trap (invoke "i32.sdiv(100,x)" (i32.const 0)) "divide by zero")
121+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const 1)) (i32.const 100))
122+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const -1)) (i32.const -100))
123+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const 42)) (i32.const 2))
124+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const 100)) (i32.const 1))
125+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const 0x7FFF_FFFF)) (i32.const 0))
126+
(assert_return (invoke "i32.sdiv(100,x)" (i32.const 0x8000_0000)) (i32.const 0))
127+
128+
;; ;; Constant Folding
129+
130+
(module
131+
(func (export "i32.sdiv(0,0)") (result i32)
132+
(i32.div_s (i32.const 0) (i32.const 0))
133+
)
134+
)
135+
(assert_trap (invoke "i32.sdiv(0,0)") "divide by zero")
136+
137+
(module
138+
(func (export "i32.sdiv(0,1)") (result i32)
139+
(i32.div_s (i32.const 0) (i32.const 1))
140+
)
141+
)
142+
(assert_return (invoke "i32.sdiv(0,1)") (i32.const 0))
143+
144+
(module
145+
(func (export "i32.sdiv(0,1)") (result i32)
146+
(i32.div_s (i32.const 0) (i32.const 1))
147+
)
148+
)
149+
(assert_return (invoke "i32.sdiv(0,1)") (i32.const 0))
150+
151+
(module
152+
(func (export "i32.sdiv(1,0)") (result i32)
153+
(i32.div_s (i32.const 1) (i32.const 0))
154+
)
155+
)
156+
(assert_trap (invoke "i32.sdiv(1,0)") "divide by zero")
157+
158+
(module
159+
(func (export "i32.sdiv(1,1)") (result i32)
160+
(i32.div_s (i32.const 1) (i32.const 1))
161+
)
162+
)
163+
(assert_return (invoke "i32.sdiv(1,1)") (i32.const 1))
164+
165+
(module
166+
(func (export "i32.sdiv(3,-1)") (result i32)
167+
(i32.div_s (i32.const 3) (i32.const -1))
168+
)
169+
)
170+
(assert_return (invoke "i32.sdiv(3,-1)") (i32.const -3))
171+
172+
(module
173+
(func (export "i32.sdiv(-1,3)") (result i32)
174+
(i32.div_s (i32.const -1) (i32.const 3))
175+
)
176+
)
177+
(assert_return (invoke "i32.sdiv(-1,3)") (i32.const 0))
178+
179+
(module
180+
(func (export "i32.sdiv(12,4)") (result i32)
181+
(i32.div_s (i32.const 12) (i32.const 4))
182+
)
183+
)
184+
(assert_return (invoke "i32.sdiv(12,4)") (i32.const 3))
185+
186+
(module
187+
(func (export "i32.sdiv(-12,-3)") (result i32)
188+
(i32.div_s (i32.const -12) (i32.const -3))
189+
)
190+
)
191+
(assert_return (invoke "i32.sdiv(-12,-3)") (i32.const 4))
192+
193+
(module
194+
(func (export "i32.sdiv(min,-1)") (result i32)
195+
(i32.div_s (i32.const 0x8000_0000) (i32.const -1))
196+
)
197+
)
198+
(assert_trap (invoke "i32.sdiv(min,-1)") "integer overflow")
199+
200+
(module
201+
(func (export "i32.sdiv(max,-1)") (result i32)
202+
(i32.div_s (i32.const 0x7FFF_FFFF) (i32.const -1))
203+
)
204+
)
205+
(assert_return (invoke "i32.sdiv(max,-1)") (i32.const 0x8000_0001))

0 commit comments

Comments
 (0)