blob: 2efb006436a23333c7bf5bb48d92a46022a7d2d5 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-wasm
6
Ben Murdochda12d292016-06-02 14:46:10 +01007function assertWasm(expected, func, ffi) {
8 print("Testing " + func.name + "...");
9 assertEquals(expected, Wasm.instantiateModuleFromAsm(
10 func.toString(), ffi).caller());
11}
12
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000013function EmptyTest() {
14 "use asm";
15 function caller() {
16 empty();
17 return 11;
18 }
19 function empty() {
20 }
21 return {caller: caller};
22}
23
Ben Murdochda12d292016-06-02 14:46:10 +010024assertWasm(11, EmptyTest);
Ben Murdoch097c5b22016-05-18 11:27:45 +010025
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026
27function IntTest() {
28 "use asm";
29 function sum(a, b) {
30 a = a|0;
31 b = b|0;
32 var c = (b + 1)|0
33 var d = 3.0;
Ben Murdoch097c5b22016-05-18 11:27:45 +010034 var e = ~~d; // double conversion
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035 return (a + c + 1)|0;
36 }
37
38 function caller() {
39 return sum(77,22) | 0;
40 }
41
42 return {caller: caller};
43}
44
Ben Murdochda12d292016-06-02 14:46:10 +010045assertWasm(101,IntTest);
Ben Murdoch097c5b22016-05-18 11:27:45 +010046
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047
48function Float64Test() {
49 "use asm";
50 function sum(a, b) {
51 a = +a;
52 b = +b;
53 return +(a + b);
54 }
55
56 function caller() {
57 var a = +sum(70.1,10.2);
58 var ret = 0|0;
59 if (a == 80.3) {
60 ret = 1|0;
61 } else {
62 ret = 0|0;
63 }
64 return ret|0;
65 }
66
67 return {caller: caller};
68}
69
Ben Murdochda12d292016-06-02 14:46:10 +010070assertWasm(1, Float64Test);
Ben Murdoch097c5b22016-05-18 11:27:45 +010071
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072
73function BadModule() {
74 "use asm";
75 function caller(a, b) {
76 a = a|0;
77 b = b+0;
78 var c = (b + 1)|0
79 return (a + c + 1)|0;
80 }
81
82 function caller() {
83 return call(1, 2)|0;
84 }
85
86 return {caller: caller};
87}
88
89assertThrows(function() {
Ben Murdochda12d292016-06-02 14:46:10 +010090 Wasm.instantiateModuleFromAsm(BadModule.toString()).caller();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000091});
92
Ben Murdoch097c5b22016-05-18 11:27:45 +010093
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000094function TestReturnInBlock() {
95 "use asm";
96
97 function caller() {
98 if(1) {
99 {
100 {
101 return 1;
102 }
103 }
104 }
105 return 0;
106 }
107
108 return {caller: caller};
109}
110
Ben Murdochda12d292016-06-02 14:46:10 +0100111assertWasm(1, TestReturnInBlock);
112
113
114function TestAddSimple() {
115 "use asm";
116
117 function caller() {
118 var x = 0;
119 x = (x + 1)|0;
120 return x|0;
121 }
122
123 return {caller: caller};
124}
125
126assertWasm(1, TestAddSimple);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100127
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128
129function TestWhileSimple() {
130 "use asm";
131
132 function caller() {
133 var x = 0;
134 while(x < 5) {
135 x = (x + 1)|0;
136 }
137 return x|0;
138 }
139
140 return {caller: caller};
141}
142
Ben Murdochda12d292016-06-02 14:46:10 +0100143assertWasm(5, TestWhileSimple);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100144
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000145
146function TestWhileWithoutBraces() {
147 "use asm";
148
149 function caller() {
150 var x = 0;
151 while(x <= 3)
152 x = (x + 1)|0;
153 return x|0;
154 }
155
156 return {caller: caller};
157}
158
Ben Murdochda12d292016-06-02 14:46:10 +0100159assertWasm(4, TestWhileWithoutBraces);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100160
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161
162function TestReturnInWhile() {
163 "use asm";
164
165 function caller() {
166 var x = 0;
167 while(x < 10) {
168 x = (x + 6)|0;
169 return x|0;
170 }
171 return x|0;
172 }
173
174 return {caller: caller};
175}
176
Ben Murdochda12d292016-06-02 14:46:10 +0100177assertWasm(6, TestReturnInWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100178
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179
180function TestReturnInWhileWithoutBraces() {
181 "use asm";
182
183 function caller() {
184 var x = 0;
185 while(x < 5)
186 return 7;
187 return x|0;
188 }
189
190 return {caller: caller};
191}
192
Ben Murdochda12d292016-06-02 14:46:10 +0100193assertWasm(7, TestReturnInWhileWithoutBraces);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100194
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000195
196function TestBreakInWhile() {
197 "use asm";
198
199 function caller() {
200 while(1) {
201 break;
202 }
203 return 8;
204 }
205
206 return {caller: caller};
207}
208
Ben Murdochda12d292016-06-02 14:46:10 +0100209assertWasm(8, TestBreakInWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100210
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211
212function TestBreakInNestedWhile() {
213 "use asm";
214
215 function caller() {
216 var x = 1.0;
217 while(x < 1.5) {
218 while(1)
219 break;
220 x = +(x + 0.25);
221 }
222 var ret = 0;
223 if (x == 1.5) {
224 ret = 9;
225 }
226 return ret|0;
227 }
228
229 return {caller: caller};
230}
231
Ben Murdochda12d292016-06-02 14:46:10 +0100232assertWasm(9, TestBreakInNestedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100233
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000234
235function TestBreakInBlock() {
236 "use asm";
237
238 function caller() {
239 var x = 0;
240 abc: {
241 x = 10;
242 if (x == 10) {
243 break abc;
244 }
245 x = 20;
246 }
247 return x|0;
248 }
249
250 return {caller: caller};
251}
252
Ben Murdochda12d292016-06-02 14:46:10 +0100253assertWasm(10, TestBreakInBlock);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100254
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255
256function TestBreakInNamedWhile() {
257 "use asm";
258
259 function caller() {
260 var x = 0;
261 outer: while (1) {
262 x = (x + 1)|0;
263 while (x == 11) {
264 break outer;
265 }
266 }
267 return x|0;
268 }
269
270 return {caller: caller};
271}
272
Ben Murdochda12d292016-06-02 14:46:10 +0100273assertWasm(11, TestBreakInNamedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100274
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000275
276function TestContinue() {
277 "use asm";
278
279 function caller() {
280 var x = 5;
281 var ret = 0;
282 while (x >= 0) {
283 x = (x - 1)|0;
284 if (x == 2) {
285 continue;
286 }
287 ret = (ret - 1)|0;
288 }
289 return ret|0;
290 }
291
292 return {caller: caller};
293}
294
Ben Murdochda12d292016-06-02 14:46:10 +0100295assertWasm(-5, TestContinue);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100296
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297
298function TestContinueInNamedWhile() {
299 "use asm";
300
301 function caller() {
302 var x = 5;
303 var y = 0;
304 var ret = 0;
305 outer: while (x > 0) {
306 x = (x - 1)|0;
307 y = 0;
308 while (y < 5) {
309 if (x == 3) {
310 continue outer;
311 }
312 ret = (ret + 1)|0;
313 y = (y + 1)|0;
314 }
315 }
316 return ret|0;
317 }
318
319 return {caller: caller};
320}
321
Ben Murdochda12d292016-06-02 14:46:10 +0100322assertWasm(20, TestContinueInNamedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100323
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000324
325function TestNot() {
326 "use asm";
327
328 function caller() {
329 var a = !(2 > 3);
330 return a | 0;
331 }
332
333 return {caller:caller};
334}
335
Ben Murdochda12d292016-06-02 14:46:10 +0100336assertWasm(1, TestNot);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100337
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338
339function TestNotEquals() {
340 "use asm";
341
342 function caller() {
343 var a = 3;
344 if (a != 2) {
345 return 21;
346 }
347 return 0;
348 }
349
350 return {caller:caller};
351}
352
Ben Murdochda12d292016-06-02 14:46:10 +0100353assertWasm(21, TestNotEquals);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100354
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355
356function TestUnsignedComparison() {
357 "use asm";
358
359 function caller() {
360 var a = 0xffffffff;
361 if ((a>>>0) > (0>>>0)) {
362 return 22;
363 }
364 return 0;
365 }
366
367 return {caller:caller};
368}
369
Ben Murdochda12d292016-06-02 14:46:10 +0100370assertWasm(22, TestUnsignedComparison);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100371
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000372
373function TestMixedAdd() {
374 "use asm";
375
376 function caller() {
377 var a = 0x80000000;
378 var b = 0x7fffffff;
379 var c = 0;
380 c = ((a>>>0) + b)|0;
381 if ((c >>> 0) > (0>>>0)) {
382 if (c < 0) {
383 return 23;
384 }
385 }
386 return 0;
387 }
388
389 return {caller:caller};
390}
391
Ben Murdochda12d292016-06-02 14:46:10 +0100392assertWasm(23, TestMixedAdd);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100393
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394
395function TestInt32HeapAccess(stdlib, foreign, buffer) {
396 "use asm";
397
398 var m = new stdlib.Int32Array(buffer);
399 function caller() {
400 var i = 4;
401
402 m[0] = (i + 1) | 0;
403 m[i >> 2] = ((m[0]|0) + 1) | 0;
404 m[2] = ((m[i >> 2]|0) + 1) | 0;
405 return m[2] | 0;
406 }
407
408 return {caller: caller};
409}
410
Ben Murdochda12d292016-06-02 14:46:10 +0100411assertWasm(7, TestInt32HeapAccess);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100412
413
414function TestInt32HeapAccessExternal() {
415 var memory = new ArrayBuffer(1024);
416 var memory_int32 = new Int32Array(memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100417 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100418 TestInt32HeapAccess.toString(), null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100419 assertEquals(7, module.caller());
420 assertEquals(7, memory_int32[2]);
421}
422
423TestInt32HeapAccessExternal();
424
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425
426function TestHeapAccessIntTypes() {
427 var types = [
Ben Murdoch097c5b22016-05-18 11:27:45 +0100428 [Int8Array, 'Int8Array', '>> 0'],
429 [Uint8Array, 'Uint8Array', '>> 0'],
430 [Int16Array, 'Int16Array', '>> 1'],
431 [Uint16Array, 'Uint16Array', '>> 1'],
432 [Int32Array, 'Int32Array', '>> 2'],
433 [Uint32Array, 'Uint32Array', '>> 2'],
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000434 ];
435 for (var i = 0; i < types.length; i++) {
436 var code = TestInt32HeapAccess.toString();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100437 code = code.replace('Int32Array', types[i][1]);
438 code = code.replace(/>> 2/g, types[i][2]);
439 var memory = new ArrayBuffer(1024);
440 var memory_view = new types[i][0](memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100441 var module = Wasm.instantiateModuleFromAsm(code, null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100442 assertEquals(7, module.caller());
443 assertEquals(7, memory_view[2]);
Ben Murdochda12d292016-06-02 14:46:10 +0100444 assertEquals(7, Wasm.instantiateModuleFromAsm(code).caller());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000445 }
446}
447
448TestHeapAccessIntTypes();
449
Ben Murdoch097c5b22016-05-18 11:27:45 +0100450
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000451function TestFloatHeapAccess(stdlib, foreign, buffer) {
452 "use asm";
453
454 var f32 = new stdlib.Float32Array(buffer);
455 var f64 = new stdlib.Float64Array(buffer);
456 var fround = stdlib.Math.fround;
457 function caller() {
458 var i = 8;
459 var j = 8;
460 var v = 6.0;
461
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000462 f64[2] = v + 1.0;
463 f64[i >> 3] = +f64[2] + 1.0;
464 f64[j >> 3] = +f64[j >> 3] + 1.0;
465 i = +f64[i >> 3] == 9.0;
466 return i|0;
467 }
468
469 return {caller: caller};
470}
471
Ben Murdochda12d292016-06-02 14:46:10 +0100472assertEquals(1, Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100473 TestFloatHeapAccess.toString()).caller());
474
475
476function TestFloatHeapAccessExternal() {
477 var memory = new ArrayBuffer(1024);
478 var memory_float64 = new Float64Array(memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100479 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100480 TestFloatHeapAccess.toString(), null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100481 assertEquals(1, module.caller());
482 assertEquals(9.0, memory_float64[1]);
483}
484
485TestFloatHeapAccessExternal();
486
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000487
488function TestConvertI32() {
489 "use asm";
490
491 function caller() {
492 var a = 1.5;
493 if ((~~(a + a)) == 3) {
494 return 24;
495 }
496 return 0;
497 }
498
499 return {caller:caller};
500}
501
Ben Murdochda12d292016-06-02 14:46:10 +0100502assertWasm(24, TestConvertI32);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100503
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000504
505function TestConvertF64FromInt() {
506 "use asm";
507
508 function caller() {
509 var a = 1;
Ben Murdochda12d292016-06-02 14:46:10 +0100510 if ((+((a + a)|0)) > 1.5) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000511 return 25;
512 }
513 return 0;
514 }
515
516 return {caller:caller};
517}
518
Ben Murdochda12d292016-06-02 14:46:10 +0100519assertWasm(25, TestConvertF64FromInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100520
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000521
522function TestConvertF64FromUnsigned() {
523 "use asm";
524
525 function caller() {
526 var a = 0xffffffff;
527 if ((+(a>>>0)) > 0.0) {
Ben Murdochda12d292016-06-02 14:46:10 +0100528 if((+(a|0)) < 0.0) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000529 return 26;
530 }
531 }
532 return 0;
533 }
534
535 return {caller:caller};
536}
537
Ben Murdochda12d292016-06-02 14:46:10 +0100538assertWasm(26, TestConvertF64FromUnsigned);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100539
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000540
541function TestModInt() {
542 "use asm";
543
544 function caller() {
545 var a = -83;
546 var b = 28;
547 return ((a|0)%(b|0))|0;
548 }
549
550 return {caller:caller};
551}
552
Ben Murdochda12d292016-06-02 14:46:10 +0100553assertWasm(-27,TestModInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100554
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000555
556function TestModUnsignedInt() {
557 "use asm";
558
559 function caller() {
560 var a = 0x80000000; //2147483648
561 var b = 10;
562 return ((a>>>0)%(b>>>0))|0;
563 }
564
565 return {caller:caller};
566}
567
Ben Murdochda12d292016-06-02 14:46:10 +0100568assertWasm(8, TestModUnsignedInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100569
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000570
571function TestModDouble() {
572 "use asm";
573
574 function caller() {
575 var a = 5.25;
576 var b = 2.5;
577 if (a%b == 0.25) {
578 return 28;
579 }
580 return 0;
581 }
582
583 return {caller:caller};
584}
585
Ben Murdochda12d292016-06-02 14:46:10 +0100586assertWasm(28, TestModDouble);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100587
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000588
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000589function TestModDoubleNegative() {
590 "use asm";
591
592 function caller() {
593 var a = -34359738368.25;
594 var b = 2.5;
595 if (a%b == -0.75) {
596 return 28;
597 }
598 return 0;
599 }
600
601 return {caller:caller};
602}
603
Ben Murdochda12d292016-06-02 14:46:10 +0100604assertWasm(28, TestModDoubleNegative);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000605
Ben Murdochda12d292016-06-02 14:46:10 +0100606(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000607function TestNamedFunctions() {
608 "use asm";
609
610 var a = 0.0;
611 var b = 0.0;
612
613 function add() {
614 return +(a + b);
615 }
616
617 function init() {
618 a = 43.25;
619 b = 34.25;
620 }
621
622 return {init:init,
623 add:add};
624}
625
Ben Murdochda12d292016-06-02 14:46:10 +0100626var module = Wasm.instantiateModuleFromAsm(TestNamedFunctions.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000627module.init();
628assertEquals(77.5, module.add());
Ben Murdochda12d292016-06-02 14:46:10 +0100629})();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000630
Ben Murdochda12d292016-06-02 14:46:10 +0100631(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000632function TestGlobalsWithInit() {
633 "use asm";
634
635 var a = 43.25;
636 var b = 34.25;
637
638 function add() {
639 return +(a + b);
640 }
641
642 return {add:add};
643}
644
Ben Murdochda12d292016-06-02 14:46:10 +0100645var module = Wasm.instantiateModuleFromAsm(TestGlobalsWithInit.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000646assertEquals(77.5, module.add());
Ben Murdochda12d292016-06-02 14:46:10 +0100647})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100648
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000649function TestForLoop() {
650 "use asm"
651
652 function caller() {
653 var ret = 0;
654 var i = 0;
655 for (i = 2; i <= 10; i = (i+1)|0) {
656 ret = (ret + i) | 0;
657 }
658 return ret|0;
659 }
660
661 return {caller:caller};
662}
663
Ben Murdochda12d292016-06-02 14:46:10 +0100664assertWasm(54, TestForLoop);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100665
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000666
667function TestForLoopWithoutInit() {
668 "use asm"
669
670 function caller() {
671 var ret = 0;
672 var i = 0;
673 for (; i < 10; i = (i+1)|0) {
674 ret = (ret + 10) | 0;
675 }
676 return ret|0;
677 }
678
679 return {caller:caller};
680}
681
Ben Murdochda12d292016-06-02 14:46:10 +0100682assertWasm(100,TestForLoopWithoutInit);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100683
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000684
685function TestForLoopWithoutCondition() {
686 "use asm"
687
688 function caller() {
689 var ret = 0;
690 var i = 0;
691 for (i=1;; i = (i+1)|0) {
692 ret = (ret + i) | 0;
693 if (i == 11) {
694 break;
695 }
696 }
697 return ret|0;
698 }
699
700 return {caller:caller};
701}
702
Ben Murdochda12d292016-06-02 14:46:10 +0100703assertWasm(66, TestForLoopWithoutCondition);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100704
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000705
706function TestForLoopWithoutNext() {
707 "use asm"
708
709 function caller() {
710 var i = 0;
711 for (i=1; i < 41;) {
712 i = (i + 1) | 0;
713 }
714 return i|0;
715 }
716
717 return {caller:caller};
718}
719
Ben Murdochda12d292016-06-02 14:46:10 +0100720assertWasm(41, TestForLoopWithoutNext);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100721
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000722
723function TestForLoopWithoutBody() {
724 "use asm"
725
726 function caller() {
727 var i = 0;
728 for (i=1; i < 45 ; i = (i+1)|0) {
729 }
730 return i|0;
731 }
732
733 return {caller:caller};
734}
735
Ben Murdochda12d292016-06-02 14:46:10 +0100736assertWasm(45, TestForLoopWithoutBody);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100737
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000738
739function TestDoWhile() {
740 "use asm"
741
742 function caller() {
743 var i = 0;
744 var ret = 21;
745 do {
746 ret = (ret + ret)|0;
747 i = (i + 1)|0;
748 } while (i < 2);
749 return ret|0;
750 }
751
752 return {caller:caller};
753}
754
Ben Murdochda12d292016-06-02 14:46:10 +0100755assertWasm(84, TestDoWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100756
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000757
758function TestConditional() {
759 "use asm"
760
761 function caller() {
762 var x = 1;
763 return ((x > 0) ? 41 : 71)|0;
764 }
765
766 return {caller:caller};
767}
768
Ben Murdochda12d292016-06-02 14:46:10 +0100769assertWasm(41, TestConditional);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100770
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000771
772function TestSwitch() {
773 "use asm"
774
775 function caller() {
776 var ret = 0;
777 var x = 7;
778 switch (x) {
779 case 1: return 0;
780 case 7: {
781 ret = 12;
782 break;
783 }
784 default: return 0;
785 }
786 switch (x) {
787 case 1: return 0;
788 case 8: return 0;
789 default: ret = (ret + 11)|0;
790 }
791 return ret|0;
792 }
793
794 return {caller:caller};
795}
796
Ben Murdochda12d292016-06-02 14:46:10 +0100797assertWasm(23, TestSwitch);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100798
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000799
800function TestSwitchFallthrough() {
801 "use asm"
802
803 function caller() {
804 var x = 17;
805 var ret = 0;
806 switch (x) {
807 case 17:
808 case 14: ret = 39;
809 case 1: ret = (ret + 3)|0;
810 case 4: break;
811 default: ret = (ret + 1)|0;
812 }
813 return ret|0;
814 }
815
816 return {caller:caller};
817}
818
Ben Murdochda12d292016-06-02 14:46:10 +0100819assertWasm(42, TestSwitchFallthrough);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100820
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000821
822function TestNestedSwitch() {
823 "use asm"
824
825 function caller() {
826 var x = 3;
827 var y = -13;
828 switch (x) {
829 case 1: return 0;
830 case 3: {
831 switch (y) {
832 case 2: return 0;
833 case -13: return 43;
834 default: return 0;
835 }
836 }
837 default: return 0;
838 }
839 return 0;
840 }
841
842 return {caller:caller};
843}
844
Ben Murdochda12d292016-06-02 14:46:10 +0100845assertWasm(43, TestNestedSwitch);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100846
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000847
Ben Murdochda12d292016-06-02 14:46:10 +0100848(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000849function TestInitFunctionWithNoGlobals() {
850 "use asm";
851 function caller() {
852 return 51;
853 }
854 return {caller};
855}
856
Ben Murdochda12d292016-06-02 14:46:10 +0100857var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000858 TestInitFunctionWithNoGlobals.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000859assertEquals(51, module.caller());
Ben Murdochda12d292016-06-02 14:46:10 +0100860})();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000861
Ben Murdochda12d292016-06-02 14:46:10 +0100862(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000863function TestExportNameDifferentFromFunctionName() {
864 "use asm";
865 function caller() {
866 return 55;
867 }
868 return {alt_caller:caller};
869}
870
Ben Murdochda12d292016-06-02 14:46:10 +0100871var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000872 TestExportNameDifferentFromFunctionName.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000873assertEquals(55, module.alt_caller());
Ben Murdochda12d292016-06-02 14:46:10 +0100874})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100875
876function TestFunctionTableSingleFunction() {
877 "use asm";
878
879 function dummy() {
880 return 71;
881 }
882
883 function caller() {
884 return function_table[0&0]() | 0;
885 }
886
887 var function_table = [dummy]
888
889 return {caller:caller};
890}
891
Ben Murdochda12d292016-06-02 14:46:10 +0100892assertWasm(71, TestFunctionTableSingleFunction);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100893
894
895function TestFunctionTableMultipleFunctions() {
896 "use asm";
897
898 function inc1(x) {
899 x = x|0;
900 return (x+1)|0;
901 }
902
903 function inc2(x) {
904 x = x|0;
905 return (x+2)|0;
906 }
907
908 function caller() {
909 if (function_table[0&1](50) == 51) {
910 if (function_table[1&1](60) == 62) {
911 return 73;
912 }
913 }
914 return 0;
915 }
916
917 var function_table = [inc1, inc2]
918
919 return {caller:caller};
920}
921
Ben Murdochda12d292016-06-02 14:46:10 +0100922assertWasm(73, TestFunctionTableMultipleFunctions);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100923
924
Ben Murdochda12d292016-06-02 14:46:10 +0100925(function () {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100926function TestFunctionTable() {
927 "use asm";
928
929 function add(a, b) {
930 a = a|0;
931 b = b|0;
932 return (a+b)|0;
933 }
934
935 function sub(a, b) {
936 a = a|0;
937 b = b|0;
938 return (a-b)|0;
939 }
940
941 function inc(a) {
942 a = a|0;
943 return (a+1)|0;
944 }
945
946 function caller(table_id, fun_id, arg1, arg2) {
947 table_id = table_id|0;
948 fun_id = fun_id|0;
949 arg1 = arg1|0;
950 arg2 = arg2|0;
951 if (table_id == 0) {
952 return funBin[fun_id&3](arg1, arg2)|0;
953 } else if (table_id == 1) {
954 return fun[fun_id&0](arg1)|0;
955 }
956 return 0;
957 }
958
959 var funBin = [add, sub, sub, add];
960 var fun = [inc];
961
962 return {caller:caller};
963}
964
Ben Murdochda12d292016-06-02 14:46:10 +0100965var module = Wasm.instantiateModuleFromAsm(TestFunctionTable.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +0100966assertEquals(55, module.caller(0, 0, 33, 22));
967assertEquals(11, module.caller(0, 1, 33, 22));
968assertEquals(9, module.caller(0, 2, 54, 45));
969assertEquals(99, module.caller(0, 3, 54, 45));
970assertEquals(23, module.caller(0, 4, 12, 11));
971assertEquals(31, module.caller(1, 0, 30, 11));
Ben Murdochda12d292016-06-02 14:46:10 +0100972})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100973
974
975function TestForeignFunctions() {
976 function AsmModule(stdlib, foreign, buffer) {
977 "use asm";
978
979 var setVal = foreign.setVal;
980 var getVal = foreign.getVal;
981
982 function caller(initial_value, new_value) {
983 initial_value = initial_value|0;
984 new_value = new_value|0;
985 if ((getVal()|0) == (initial_value|0)) {
986 setVal(new_value|0);
987 return getVal()|0;
988 }
989 return 0;
990 }
991
992 return {caller:caller};
993 }
994
995 function ffi(initial_val) {
996 var val = initial_val;
997
998 function getVal() {
999 return val;
1000 }
1001
1002 function setVal(new_val) {
1003 val = new_val;
1004 }
1005
1006 return {getVal:getVal, setVal:setVal};
1007 }
1008
1009 var foreign = new ffi(23);
1010
Ben Murdochda12d292016-06-02 14:46:10 +01001011 var module = Wasm.instantiateModuleFromAsm(AsmModule.toString(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001012 foreign, null);
1013
Ben Murdoch097c5b22016-05-18 11:27:45 +01001014 assertEquals(103, module.caller(23, 103));
1015}
1016
1017TestForeignFunctions();
1018
1019
1020function TestForeignFunctionMultipleUse() {
1021 function AsmModule(stdlib, foreign, buffer) {
1022 "use asm";
1023
1024 var getVal = foreign.getVal;
1025
1026 function caller(int_val, double_val) {
1027 int_val = int_val|0;
1028 double_val = +double_val;
1029 if ((getVal()|0) == (int_val|0)) {
1030 if ((+getVal()) == (+double_val)) {
1031 return 89;
1032 }
1033 }
1034 return 0;
1035 }
1036
1037 return {caller:caller};
1038 }
1039
1040 function ffi() {
1041 function getVal() {
1042 return 83.25;
1043 }
1044
1045 return {getVal:getVal};
1046 }
1047
1048 var foreign = new ffi();
1049
Ben Murdochda12d292016-06-02 14:46:10 +01001050 var module = Wasm.instantiateModuleFromAsm(AsmModule.toString(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001051 foreign, null);
1052
Ben Murdoch097c5b22016-05-18 11:27:45 +01001053 assertEquals(89, module.caller(83, 83.25));
1054}
1055
1056TestForeignFunctionMultipleUse();
1057
1058
1059function TestForeignVariables() {
1060 function AsmModule(stdlib, foreign, buffer) {
1061 "use asm";
1062
1063 var i1 = foreign.foo | 0;
1064 var f1 = +foreign.bar;
1065 var i2 = foreign.baz | 0;
1066 var f2 = +foreign.baz;
1067
1068 function geti1() {
1069 return i1|0;
1070 }
1071
1072 function getf1() {
1073 return +f1;
1074 }
1075
1076 function geti2() {
1077 return i2|0;
1078 }
1079
1080 function getf2() {
1081 return +f2;
1082 }
1083
1084 return {geti1:geti1, getf1:getf1, geti2:geti2, getf2:getf2};
1085 }
1086
1087 function TestCase(env, i1, f1, i2, f2) {
Ben Murdochda12d292016-06-02 14:46:10 +01001088 print("Testing foreign variables...");
1089 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +01001090 AsmModule.toString(), env);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001091 assertEquals(i1, module.geti1());
1092 assertEquals(f1, module.getf1());
1093 assertEquals(i2, module.geti2());
1094 assertEquals(f2, module.getf2());
1095 }
1096
1097 // Check normal operation.
1098 TestCase({foo: 123, bar: 234.5, baz: 345.7}, 123, 234.5, 345, 345.7);
1099 // Check partial operation.
1100 TestCase({baz: 345.7}, 0, NaN, 345, 345.7);
1101 // Check that undefined values are converted to proper defaults.
1102 TestCase({qux: 999}, 0, NaN, 0, NaN);
1103 // Check that an undefined ffi is ok.
1104 TestCase(undefined, 0, NaN, 0, NaN);
1105 // Check that true values are converted properly.
1106 TestCase({foo: true, bar: true, baz: true}, 1, 1.0, 1, 1.0);
1107 // Check that false values are converted properly.
1108 TestCase({foo: false, bar: false, baz: false}, 0, 0, 0, 0);
1109 // Check that null values are converted properly.
1110 TestCase({foo: null, bar: null, baz: null}, 0, 0, 0, 0);
1111 // Check that string values are converted properly.
1112 TestCase({foo: 'hi', bar: 'there', baz: 'dude'}, 0, NaN, 0, NaN);
1113 TestCase({foo: '0xff', bar: '234', baz: '456.1'}, 255, 234, 456, 456.1, 456);
1114 // Check that Date values are converted properly.
1115 TestCase({foo: new Date(123), bar: new Date(456),
1116 baz: new Date(789)}, 123, 456, 789, 789);
1117 // Check that list values are converted properly.
1118 TestCase({foo: [], bar: [], baz: []}, 0, 0, 0, 0);
1119 // Check that object values are converted properly.
1120 TestCase({foo: {}, bar: {}, baz: {}}, 0, NaN, 0, NaN);
1121 // Check that getter object values are converted properly.
1122 var o = {
1123 get foo() {
1124 return 123.4;
1125 }
1126 };
1127 TestCase({foo: o.foo, bar: o.foo, baz: o.foo}, 123, 123.4, 123, 123.4);
1128 // Check that getter object values are converted properly.
1129 var o = {
1130 get baz() {
1131 return 123.4;
1132 }
1133 };
1134 TestCase(o, 0, NaN, 123, 123.4);
1135 // Check that objects with valueOf are converted properly.
1136 var o = {
1137 valueOf: function() { return 99; }
1138 };
1139 TestCase({foo: o, bar: o, baz: o}, 99, 99, 99, 99);
1140 // Check that function values are converted properly.
1141 TestCase({foo: TestCase, bar: TestCase, qux: TestCase}, 0, NaN, 0, NaN);
1142 // Check that a missing ffi object is safe.
1143 TestCase(undefined, 0, NaN, 0, NaN);
1144}
1145
1146TestForeignVariables();
1147
1148
1149(function() {
1150 function TestByteHeapAccessCompat(stdlib, foreign, buffer) {
1151 "use asm";
1152
1153 var HEAP8 = new stdlib.Uint8Array(buffer);
1154 var HEAP32 = new stdlib.Int32Array(buffer);
1155
1156 function store(i, v) {
1157 i = i | 0;
1158 v = v | 0;
1159 HEAP32[i >> 2] = v;
1160 }
1161
1162 function storeb(i, v) {
1163 i = i | 0;
1164 v = v | 0;
1165 HEAP8[i | 0] = v;
1166 }
1167
1168 function load(i) {
1169 i = i | 0;
1170 return HEAP8[i] | 0;
1171 }
1172
1173 function iload(i) {
1174 i = i | 0;
1175 return HEAP8[HEAP32[i >> 2] | 0] | 0;
1176 }
1177
1178 return {load: load, iload: iload, store: store, storeb: storeb};
1179 }
1180
Ben Murdochda12d292016-06-02 14:46:10 +01001181 var m = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +01001182 TestByteHeapAccessCompat.toString());
1183 m.store(0, 20);
1184 m.store(4, 21);
1185 m.store(8, 22);
1186 m.storeb(20, 123);
1187 m.storeb(21, 42);
1188 m.storeb(22, 77);
1189 assertEquals(123, m.load(20));
1190 assertEquals(42, m.load(21));
1191 assertEquals(77, m.load(22));
1192 assertEquals(123, m.iload(0));
1193 assertEquals(42, m.iload(4));
1194 assertEquals(77, m.iload(8));
1195})();
1196
1197
Ben Murdochda12d292016-06-02 14:46:10 +01001198function TestGlobalBlock(stdlib, foreign, buffer) {
1199 "use asm";
Ben Murdoch097c5b22016-05-18 11:27:45 +01001200
Ben Murdochda12d292016-06-02 14:46:10 +01001201 var x = foreign.x | 0, y = foreign.y | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001202
Ben Murdochda12d292016-06-02 14:46:10 +01001203 function test() {
1204 return (x + y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001205 }
1206
Ben Murdochda12d292016-06-02 14:46:10 +01001207 return {caller: test};
1208}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001209
Ben Murdochda12d292016-06-02 14:46:10 +01001210assertWasm(15, TestGlobalBlock, { x: 4, y: 11 });
Ben Murdoch097c5b22016-05-18 11:27:45 +01001211
1212(function TestComma() {
1213 function CommaModule() {
1214 "use asm";
1215
1216 function ifunc(a, b) {
1217 a = +a;
1218 b = b | 0;
1219 return (a, b) | 0;
1220 }
1221
1222 function dfunc(a, b) {
1223 a = a | 0;
1224 b = +b;
1225 return +(a, b);
1226 }
1227
1228 return {ifunc: ifunc, dfunc: dfunc};
1229 }
1230
Ben Murdochda12d292016-06-02 14:46:10 +01001231 var m = Wasm.instantiateModuleFromAsm(CommaModule.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001232 assertEquals(123, m.ifunc(456.7, 123));
1233 assertEquals(123.4, m.dfunc(456, 123.4));
1234})();
1235
1236
Ben Murdochda12d292016-06-02 14:46:10 +01001237function TestFloatAsDouble(stdlib) {
1238 "use asm";
1239 var fround = stdlib.Math.fround;
1240 function func() {
1241 var x = fround(1.0);
1242 return +fround(x);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001243 }
Ben Murdochda12d292016-06-02 14:46:10 +01001244 return {caller: func};
1245}
1246assertWasm(1, TestFloatAsDouble);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001247
1248
Ben Murdochda12d292016-06-02 14:46:10 +01001249function TestOr() {
1250 "use asm";
1251 function func() {
1252 var x = 1;
1253 var y = 2;
1254 return (x | y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001255 }
Ben Murdochda12d292016-06-02 14:46:10 +01001256 return {caller: func};
1257}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001258
Ben Murdochda12d292016-06-02 14:46:10 +01001259assertWasm(3, TestOr);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001260
1261
Ben Murdochda12d292016-06-02 14:46:10 +01001262function TestAnd() {
1263 "use asm";
1264 function func() {
1265 var x = 3;
1266 var y = 2;
1267 return (x & y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001268 }
Ben Murdochda12d292016-06-02 14:46:10 +01001269 return {caller: func};
1270}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001271
Ben Murdochda12d292016-06-02 14:46:10 +01001272assertWasm(2, TestAnd);
1273
1274
1275function TestXor() {
1276 "use asm";
1277 function func() {
1278 var x = 3;
1279 var y = 2;
1280 return (x ^ y) | 0;
1281 }
1282 return {caller: func};
1283}
1284
1285assertWasm(1, TestXor);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001286
1287
1288(function TestIntishAssignment() {
1289 function Module(stdlib, foreign, heap) {
1290 "use asm";
1291 var HEAP32 = new stdlib.Int32Array(heap);
1292 function func() {
1293 var a = 1;
1294 var b = 2;
1295 HEAP32[0] = a + b;
1296 return HEAP32[0] | 0;
1297 }
1298 return {func: func};
1299 }
1300
Ben Murdochda12d292016-06-02 14:46:10 +01001301 var m = Wasm.instantiateModuleFromAsm(Module.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001302 assertEquals(3, m.func());
1303})();
1304
1305
1306(function TestFloatishAssignment() {
1307 function Module(stdlib, foreign, heap) {
1308 "use asm";
1309 var HEAPF32 = new stdlib.Float32Array(heap);
1310 var fround = stdlib.Math.fround;
1311 function func() {
1312 var a = fround(1.0);
1313 var b = fround(2.0);
1314 HEAPF32[0] = a + b;
1315 return +HEAPF32[0];
1316 }
1317 return {func: func};
1318 }
1319
Ben Murdochda12d292016-06-02 14:46:10 +01001320 var m = Wasm.instantiateModuleFromAsm(Module.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001321 assertEquals(3, m.func());
Ben Murdochda12d292016-06-02 14:46:10 +01001322})();
1323
1324
1325(function TestDoubleToFloatAssignment() {
1326 function Module(stdlib, foreign, heap) {
1327 "use asm";
1328 var HEAPF32 = new stdlib.Float32Array(heap);
1329 var fround = stdlib.Math.fround;
1330 function func() {
1331 var a = 1.23;
1332 HEAPF32[0] = a;
1333 return +HEAPF32[0];
1334 }
1335 return {func: func};
1336 }
1337
1338 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1339 assertEquals(1.23, m.func());
1340});
1341
1342
1343(function TestIntegerMultiplyBothWays() {
1344 function Module(stdlib, foreign, heap) {
1345 "use asm";
1346 function func() {
1347 var a = 1;
1348 return ((a * 3) + (4 * a)) | 0;
1349 }
1350 return {func: func};
1351 }
1352
1353 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1354 assertEquals(7, m.func());
1355})();
1356
1357
1358(function TestBadMultiplyIntish() {
1359 function Module(stdlib, foreign, heap) {
1360 "use asm";
1361 function func() {
1362 var a = 1;
1363 return ((a + a) * 4) | 0;
1364 }
1365 return {func: func};
1366 }
1367 assertThrows(function() {
1368 Wasm.instantiateModuleFromAsm(Module.toString());
1369 });
1370})();
1371
1372
1373(function TestBadCastFromInt() {
1374 function Module(stdlib, foreign, heap) {
1375 "use asm";
1376 function func() {
1377 var a = 1;
1378 return +a;
1379 }
1380 return {func: func};
1381 }
1382 assertThrows(function() {
1383 Wasm.instantiateModuleFromAsm(Module.toString());
1384 });
1385})();
1386
1387
1388(function TestAndNegative() {
1389 function Module() {
1390 "use asm";
1391 function func() {
1392 var x = 1;
1393 var y = 2;
1394 var z = 0;
1395 z = x + y & -1;
1396 return z | 0;
1397 }
1398 return {func: func};
1399 }
1400
1401 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1402 assertEquals(3, m.func());
1403})();
1404
1405
1406(function TestNegativeDouble() {
1407 function Module() {
1408 "use asm";
1409 function func() {
1410 var x = -(34359738368.25);
1411 var y = -2.5;
1412 return +(x + y);
1413 }
1414 return {func: func};
1415 }
1416
1417 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1418 assertEquals(-34359738370.75, m.func());
1419})();
1420
1421
1422(function TestBadAndDouble() {
1423 function Module() {
1424 "use asm";
1425 function func() {
1426 var x = 1.0;
1427 var y = 2.0;
1428 return (x & y) | 0;
1429 }
1430 return {func: func};
1431 }
1432
1433 assertThrows(function() {
1434 Wasm.instantiateModuleFromAsm(Module.toString());
1435 });
1436})();
1437
1438
1439(function TestAndIntAndHeapValue() {
1440 function Module(stdlib, foreign, buffer) {
1441 "use asm";
1442 var HEAP32 = new stdlib.Int32Array(buffer);
1443 function func() {
1444 var x = 0;
1445 x = HEAP32[0] & -1;
1446 return x | 0;
1447 }
1448 return {func: func};
1449 }
1450
1451 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1452 assertEquals(0, m.func());
1453})();
1454
1455(function TestOutOfBoundsConversion() {
1456 function asmModule($a,$b,$c){'use asm';
1457 function aaa() {
1458 var f = 0.0;
1459 var a = 0;
1460 f = 5616315000.000001;
1461 a = ~~f >>>0;
1462 return a | 0;
1463 }
1464 return { main : aaa };
1465 }
1466 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
1467 assertEquals(1321347704, wasm.main());
1468})();
1469
1470(function TestUnsignedLiterals() {
1471 function asmModule() {
1472 "use asm";
1473 function u0xffffffff() {
1474 var f = 0xffffffff;
1475 return +(f >>> 0);
1476 }
1477 function u0x80000000() {
1478 var f = 0x80000000;
1479 return +(f >>> 0);
1480 }
1481 function u0x87654321() {
1482 var f = 0x87654321;
1483 return +(f >>> 0);
1484 }
1485 return {
1486 u0xffffffff: u0xffffffff,
1487 u0x80000000: u0x80000000,
1488 u0x87654321: u0x87654321,
1489 };
1490 }
1491 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
1492 assertEquals(0xffffffff, wasm.u0xffffffff());
1493 assertEquals(0x80000000, wasm.u0x80000000());
1494 assertEquals(0x87654321, wasm.u0x87654321());
1495})();