1;;! wide_arithmetic = true
2
3(module
4  (func (export "i64.add128") (param i64 i64 i64 i64) (result i64 i64)
5    local.get 0
6    local.get 1
7    local.get 2
8    local.get 3
9    i64.add128)
10  (func (export "i64.sub128") (param i64 i64 i64 i64) (result i64 i64)
11    local.get 0
12    local.get 1
13    local.get 2
14    local.get 3
15    i64.sub128)
16  (func (export "i64.mul_wide_s") (param i64 i64) (result i64 i64)
17    local.get 0
18    local.get 1
19    i64.mul_wide_s)
20  (func (export "i64.mul_wide_u") (param i64 i64) (result i64 i64)
21    local.get 0
22    local.get 1
23    i64.mul_wide_u)
24)
25
26;; simple addition
27(assert_return (invoke "i64.add128"
28                  (i64.const 0) (i64.const 0)
29                  (i64.const 0) (i64.const 0))
30               (i64.const 0) (i64.const 0))
31(assert_return (invoke "i64.add128"
32                  (i64.const 0) (i64.const 1)
33                  (i64.const 1) (i64.const 0))
34               (i64.const 1) (i64.const 1))
35(assert_return (invoke "i64.add128"
36                  (i64.const 1) (i64.const 0)
37                  (i64.const -1) (i64.const 0))
38               (i64.const 0) (i64.const 1))
39(assert_return (invoke "i64.add128"
40                  (i64.const 1) (i64.const 1)
41                  (i64.const -1) (i64.const -1))
42               (i64.const 0) (i64.const 1))
43
44;; simple subtraction
45(assert_return (invoke "i64.sub128"
46                  (i64.const 0) (i64.const 0)
47                  (i64.const 0) (i64.const 0))
48               (i64.const 0) (i64.const 0))
49(assert_return (invoke "i64.sub128"
50                  (i64.const 0) (i64.const 0)
51                  (i64.const 1) (i64.const 0))
52               (i64.const -1) (i64.const -1))
53(assert_return (invoke "i64.sub128"
54                  (i64.const 0) (i64.const 1)
55                  (i64.const 1) (i64.const 1))
56               (i64.const -1) (i64.const -1))
57(assert_return (invoke "i64.sub128"
58                  (i64.const 0) (i64.const 0)
59                  (i64.const 1) (i64.const 1))
60               (i64.const -1) (i64.const -2))
61
62;; simple mul_wide
63(assert_return (invoke "i64.mul_wide_s" (i64.const 0) (i64.const 0))
64               (i64.const 0) (i64.const 0))
65(assert_return (invoke "i64.mul_wide_u" (i64.const 0) (i64.const 0))
66               (i64.const 0) (i64.const 0))
67(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const 1))
68               (i64.const 1) (i64.const 0))
69(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 1))
70               (i64.const 1) (i64.const 0))
71(assert_return (invoke "i64.mul_wide_s" (i64.const -1) (i64.const -1))
72               (i64.const 1) (i64.const 0))
73(assert_return (invoke "i64.mul_wide_s" (i64.const -1) (i64.const 1))
74               (i64.const -1) (i64.const -1))
75(assert_return (invoke "i64.mul_wide_u" (i64.const -1) (i64.const 1))
76               (i64.const -1) (i64.const 0))
77
78;; 20 randomly generated test cases for i64.add128
79(assert_return (invoke "i64.add128"
80                   (i64.const -2418420703207364752) (i64.const -1)
81                   (i64.const -1) (i64.const -1))
82               (i64.const -2418420703207364753) (i64.const -1))
83(assert_return (invoke "i64.add128"
84                   (i64.const 0) (i64.const 0)
85                   (i64.const -4579433644172935106) (i64.const -1))
86               (i64.const -4579433644172935106) (i64.const -1))
87(assert_return (invoke "i64.add128"
88                   (i64.const 0) (i64.const 0)
89                   (i64.const 1) (i64.const -1))
90               (i64.const 1) (i64.const -1))
91(assert_return (invoke "i64.add128"
92                   (i64.const 1) (i64.const 0)
93                   (i64.const 1) (i64.const 0))
94               (i64.const 2) (i64.const 0))
95(assert_return (invoke "i64.add128"
96                   (i64.const -1) (i64.const -1)
97                   (i64.const -1) (i64.const -1))
98               (i64.const -2) (i64.const -1))
99(assert_return (invoke "i64.add128"
100                   (i64.const 0) (i64.const -1)
101                   (i64.const 1) (i64.const 0))
102               (i64.const 1) (i64.const -1))
103(assert_return (invoke "i64.add128"
104                   (i64.const 0) (i64.const 0)
105                   (i64.const 0) (i64.const -1))
106               (i64.const 0) (i64.const -1))
107(assert_return (invoke "i64.add128"
108                   (i64.const 1) (i64.const 0)
109                   (i64.const -1) (i64.const -1))
110               (i64.const 0) (i64.const 0))
111(assert_return (invoke "i64.add128"
112                   (i64.const 0) (i64.const 6184727276166606191)
113                   (i64.const 0) (i64.const 1))
114               (i64.const 0) (i64.const 6184727276166606192))
115(assert_return (invoke "i64.add128"
116                   (i64.const -8434911321912688222) (i64.const -1)
117                   (i64.const 1) (i64.const -1))
118               (i64.const -8434911321912688221) (i64.const -2))
119(assert_return (invoke "i64.add128"
120                   (i64.const 1) (i64.const -1)
121                   (i64.const 0) (i64.const -1))
122               (i64.const 1) (i64.const -2))
123(assert_return (invoke "i64.add128"
124                   (i64.const 1) (i64.const -5148941131328838092)
125                   (i64.const 0) (i64.const 0))
126               (i64.const 1) (i64.const -5148941131328838092))
127(assert_return (invoke "i64.add128"
128                   (i64.const 1) (i64.const 1)
129                   (i64.const 1) (i64.const 0))
130               (i64.const 2) (i64.const 1))
131(assert_return (invoke "i64.add128"
132                   (i64.const -1) (i64.const -1)
133                   (i64.const -3636740005180858631) (i64.const -1))
134               (i64.const -3636740005180858632) (i64.const -1))
135(assert_return (invoke "i64.add128"
136                   (i64.const -5529682780229988275) (i64.const -1)
137                   (i64.const 0) (i64.const 0))
138               (i64.const -5529682780229988275) (i64.const -1))
139(assert_return (invoke "i64.add128"
140                   (i64.const 1) (i64.const -5381447440966559717)
141                   (i64.const 1020031372481336745) (i64.const 1))
142               (i64.const 1020031372481336746) (i64.const -5381447440966559716))
143(assert_return (invoke "i64.add128"
144                   (i64.const 1) (i64.const 1)
145                   (i64.const 0) (i64.const 0))
146               (i64.const 1) (i64.const 1))
147(assert_return (invoke "i64.add128"
148                   (i64.const -9133888546939907356) (i64.const -1)
149                   (i64.const 1) (i64.const 1))
150               (i64.const -9133888546939907355) (i64.const 0))
151(assert_return (invoke "i64.add128"
152                   (i64.const -4612047512704241719) (i64.const -1)
153                   (i64.const 0) (i64.const -1))
154               (i64.const -4612047512704241719) (i64.const -2))
155(assert_return (invoke "i64.add128"
156                   (i64.const 414720966820876428) (i64.const -1)
157                   (i64.const 1) (i64.const 0))
158               (i64.const 414720966820876429) (i64.const -1))
159
160
161;; 20 randomly generated test cases for i64.sub128
162(assert_return (invoke "i64.sub128"
163                   (i64.const 0) (i64.const -2459085471354756766)
164                   (i64.const -9151153060221070927) (i64.const -1))
165               (i64.const 9151153060221070927) (i64.const -2459085471354756766))
166(assert_return (invoke "i64.sub128"
167                   (i64.const 4566502638724063423) (i64.const -4282658540409485563)
168                   (i64.const -6884077310018979971) (i64.const -1))
169               (i64.const -6996164124966508222) (i64.const -4282658540409485563))
170(assert_return (invoke "i64.sub128"
171                   (i64.const 1) (i64.const 3118380319444903041)
172                   (i64.const 0) (i64.const 3283115686417695443))
173               (i64.const 1) (i64.const -164735366972792402))
174(assert_return (invoke "i64.sub128"
175                   (i64.const -7208415241680161810) (i64.const -1)
176                   (i64.const 1) (i64.const 0))
177               (i64.const -7208415241680161811) (i64.const -1))
178(assert_return (invoke "i64.sub128"
179                   (i64.const 0) (i64.const 3944850126731328706)
180                   (i64.const 1) (i64.const 1))
181               (i64.const -1) (i64.const 3944850126731328704))
182(assert_return (invoke "i64.sub128"
183                   (i64.const 1) (i64.const -1)
184                   (i64.const -1) (i64.const -1))
185               (i64.const 2) (i64.const -1))
186(assert_return (invoke "i64.sub128"
187                   (i64.const -1) (i64.const -1)
188                   (i64.const 4855833073346115923) (i64.const -6826437637438999645))
189               (i64.const -4855833073346115924) (i64.const 6826437637438999644))
190(assert_return (invoke "i64.sub128"
191                   (i64.const 1) (i64.const 0)
192                   (i64.const -1) (i64.const -1))
193               (i64.const 2) (i64.const 0))
194(assert_return (invoke "i64.sub128"
195                   (i64.const 1) (i64.const 0)
196                   (i64.const 1) (i64.const 0))
197               (i64.const 0) (i64.const 0))
198(assert_return (invoke "i64.sub128"
199                   (i64.const -1) (i64.const -1)
200                   (i64.const 0) (i64.const 0))
201               (i64.const -1) (i64.const -1))
202(assert_return (invoke "i64.sub128"
203                   (i64.const 1) (i64.const -1)
204                   (i64.const -6365475388498096428) (i64.const -1))
205               (i64.const 6365475388498096429) (i64.const -1))
206(assert_return (invoke "i64.sub128"
207                   (i64.const 6804238617560992346) (i64.const -1)
208                   (i64.const 0) (i64.const -1))
209               (i64.const 6804238617560992346) (i64.const 0))
210(assert_return (invoke "i64.sub128"
211                   (i64.const 0) (i64.const 1)
212                   (i64.const 1) (i64.const -7756145513466453619))
213               (i64.const -1) (i64.const 7756145513466453619))
214(assert_return (invoke "i64.sub128"
215                   (i64.const 1) (i64.const -1)
216                   (i64.const 1) (i64.const 1))
217               (i64.const 0) (i64.const -2))
218(assert_return (invoke "i64.sub128"
219                   (i64.const 0) (i64.const 1)
220                   (i64.const 1) (i64.const 0))
221               (i64.const -1) (i64.const 0))
222(assert_return (invoke "i64.sub128"
223                   (i64.const 1) (i64.const 5602881641763648953)
224                   (i64.const -2110589244314239080) (i64.const -1))
225               (i64.const 2110589244314239081) (i64.const 5602881641763648953))
226(assert_return (invoke "i64.sub128"
227                   (i64.const 0) (i64.const 1)
228                   (i64.const -1) (i64.const -1))
229               (i64.const 1) (i64.const 1))
230(assert_return (invoke "i64.sub128"
231                   (i64.const 0) (i64.const -1)
232                   (i64.const 3553816990259121806) (i64.const -2105235417856431622))
233               (i64.const -3553816990259121806) (i64.const 2105235417856431620))
234(assert_return (invoke "i64.sub128"
235                   (i64.const 1861102705894987245) (i64.const 1)
236                   (i64.const 3713781778534059871) (i64.const 1))
237               (i64.const -1852679072639072626) (i64.const -1))
238(assert_return (invoke "i64.sub128"
239                   (i64.const 0) (i64.const -1)
240                   (i64.const 1) (i64.const 1832524486821761762))
241               (i64.const -1) (i64.const -1832524486821761764))
242
243;; 20 randomly generated test cases for i64.mul_wide_s
244(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const 1))
245               (i64.const 1) (i64.const 0))
246(assert_return (invoke "i64.mul_wide_s" (i64.const 0) (i64.const 6287758211025156705))
247               (i64.const 0) (i64.const 0))
248(assert_return (invoke "i64.mul_wide_s" (i64.const -6643537319803451357) (i64.const 1))
249               (i64.const -6643537319803451357) (i64.const -1))
250(assert_return (invoke "i64.mul_wide_s" (i64.const -2483565146858803428) (i64.const 0))
251               (i64.const 0) (i64.const 0))
252(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const 1))
253               (i64.const 1) (i64.const 0))
254(assert_return (invoke "i64.mul_wide_s" (i64.const -3838951433439430085) (i64.const 3471602925362676030))
255               (i64.const 5186941893001237834) (i64.const -722475195264825124))
256(assert_return (invoke "i64.mul_wide_s" (i64.const -8262495286814853129) (i64.const 7883241869666573970))
257               (i64.const -8557189786755031842) (i64.const -3530988912334554469))
258(assert_return (invoke "i64.mul_wide_s" (i64.const 4278371902407959701) (i64.const 1))
259               (i64.const 4278371902407959701) (i64.const 0))
260(assert_return (invoke "i64.mul_wide_s" (i64.const -8852706149487089182) (i64.const -1))
261               (i64.const 8852706149487089182) (i64.const 0))
262(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const -1))
263               (i64.const -1) (i64.const -1))
264(assert_return (invoke "i64.mul_wide_s" (i64.const -1) (i64.const -4329244561838653387))
265               (i64.const 4329244561838653387) (i64.const 0))
266(assert_return (invoke "i64.mul_wide_s" (i64.const -1) (i64.const -1))
267               (i64.const 1) (i64.const 0))
268(assert_return (invoke "i64.mul_wide_s" (i64.const 697896157315764057) (i64.const 1))
269               (i64.const 697896157315764057) (i64.const 0))
270(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const 1))
271               (i64.const 1) (i64.const 0))
272(assert_return (invoke "i64.mul_wide_s" (i64.const -1) (i64.const 0))
273               (i64.const 0) (i64.const 0))
274(assert_return (invoke "i64.mul_wide_s" (i64.const 0) (i64.const -3769664482072947073))
275               (i64.const 0) (i64.const 0))
276(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const 8414291037346403854))
277               (i64.const 8414291037346403854) (i64.const 0))
278(assert_return (invoke "i64.mul_wide_s" (i64.const 1) (i64.const -1))
279               (i64.const -1) (i64.const -1))
280(assert_return (invoke "i64.mul_wide_s" (i64.const 5014655679779318485) (i64.const -5080037812563681985))
281               (i64.const 2842857627777395563) (i64.const -1380983027057486843))
282(assert_return (invoke "i64.mul_wide_s" (i64.const 0) (i64.const 1))
283               (i64.const 0) (i64.const 0))
284
285;; 20 randomly generated test cases for i64.mul_wide_u
286(assert_return (invoke "i64.mul_wide_u" (i64.const -4734436040338162711) (i64.const 0))
287               (i64.const 0) (i64.const 0))
288(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 0))
289               (i64.const 0) (i64.const 0))
290(assert_return (invoke "i64.mul_wide_u" (i64.const 3270597527173764279) (i64.const 6636648075495406358))
291               (i64.const -5430303818902260550) (i64.const 1176674035141685826))
292(assert_return (invoke "i64.mul_wide_u" (i64.const -7771814344630108151) (i64.const 1))
293               (i64.const -7771814344630108151) (i64.const 0))
294(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 0))
295               (i64.const 0) (i64.const 0))
296(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const -7864138787704962081))
297               (i64.const -7864138787704962081) (i64.const 0))
298(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 518555141550256010))
299               (i64.const 518555141550256010) (i64.const 0))
300(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const -1))
301               (i64.const -1) (i64.const 0))
302(assert_return (invoke "i64.mul_wide_u" (i64.const 1118900477321231571) (i64.const -1))
303               (i64.const -1118900477321231571) (i64.const 1118900477321231570))
304(assert_return (invoke "i64.mul_wide_u" (i64.const -1) (i64.const 0))
305               (i64.const 0) (i64.const 0))
306(assert_return (invoke "i64.mul_wide_u" (i64.const -5586890671027490027) (i64.const 1))
307               (i64.const -5586890671027490027) (i64.const 0))
308(assert_return (invoke "i64.mul_wide_u" (i64.const 0) (i64.const 3603850799751152505))
309               (i64.const 0) (i64.const 0))
310(assert_return (invoke "i64.mul_wide_u" (i64.const -1) (i64.const -1))
311               (i64.const 1) (i64.const 18446744073709551614))
312(assert_return (invoke "i64.mul_wide_u" (i64.const 0) (i64.const 1))
313               (i64.const 0) (i64.const 0))
314(assert_return (invoke "i64.mul_wide_u" (i64.const -7344082851774441644) (i64.const 3896439839137544024))
315               (i64.const 5738542512914895072) (i64.const 2345175459296971666))
316(assert_return (invoke "i64.mul_wide_u" (i64.const 0) (i64.const 0))
317               (i64.const 0) (i64.const 0))
318(assert_return (invoke "i64.mul_wide_u" (i64.const 616395976148874061) (i64.const 0))
319               (i64.const 0) (i64.const 0))
320(assert_return (invoke "i64.mul_wide_u" (i64.const 2810729703362889816) (i64.const -1))
321               (i64.const -2810729703362889816) (i64.const 2810729703362889815))
322(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const -1))
323               (i64.const -1) (i64.const 0))
324(assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 0))
325               (i64.const 0) (i64.const 0))
326
327(module
328  (func (export "u64::overflowing_add") (param i64 i64) (result i64 i64)
329    local.get 0
330    i64.const 0
331    local.get 1
332    i64.const 0
333    i64.add128)
334)
335
336(assert_return (invoke "u64::overflowing_add" (i64.const 0) (i64.const 0))
337               (i64.const 0) (i64.const 0))
338(assert_return (invoke "u64::overflowing_add" (i64.const 0) (i64.const 1))
339               (i64.const 1) (i64.const 0))
340(assert_return (invoke "u64::overflowing_add" (i64.const 1) (i64.const -1))
341               (i64.const 0) (i64.const 1))
342(assert_return (invoke "u64::overflowing_add" (i64.const -2) (i64.const -1))
343               (i64.const -3) (i64.const 1))
344