blob: 4c28b619c306b9b6691e3a8e2a189a372a37de69 [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 Murdochc5610432016-08-08 18:44:38 +010026function VoidReturnTest() {
27 "use asm";
28 function caller() {
29 empty();
30 return 19;
31 }
32 function empty() {
33 var x = 0;
34 if (x) return;
35 }
36 return {caller: caller};
37}
38
39assertWasm(19, VoidReturnTest);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040
41function IntTest() {
42 "use asm";
43 function sum(a, b) {
44 a = a|0;
45 b = b|0;
46 var c = (b + 1)|0
47 var d = 3.0;
Ben Murdoch097c5b22016-05-18 11:27:45 +010048 var e = ~~d; // double conversion
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049 return (a + c + 1)|0;
50 }
51
52 function caller() {
53 return sum(77,22) | 0;
54 }
55
56 return {caller: caller};
57}
58
Ben Murdochda12d292016-06-02 14:46:10 +010059assertWasm(101,IntTest);
Ben Murdoch097c5b22016-05-18 11:27:45 +010060
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061
62function Float64Test() {
63 "use asm";
64 function sum(a, b) {
65 a = +a;
66 b = +b;
67 return +(a + b);
68 }
69
70 function caller() {
71 var a = +sum(70.1,10.2);
72 var ret = 0|0;
73 if (a == 80.3) {
74 ret = 1|0;
75 } else {
76 ret = 0|0;
77 }
78 return ret|0;
79 }
80
81 return {caller: caller};
82}
83
Ben Murdochda12d292016-06-02 14:46:10 +010084assertWasm(1, Float64Test);
Ben Murdoch097c5b22016-05-18 11:27:45 +010085
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086
87function BadModule() {
88 "use asm";
89 function caller(a, b) {
90 a = a|0;
91 b = b+0;
92 var c = (b + 1)|0
93 return (a + c + 1)|0;
94 }
95
96 function caller() {
97 return call(1, 2)|0;
98 }
99
100 return {caller: caller};
101}
102
103assertThrows(function() {
Ben Murdochda12d292016-06-02 14:46:10 +0100104 Wasm.instantiateModuleFromAsm(BadModule.toString()).caller();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105});
106
Ben Murdoch097c5b22016-05-18 11:27:45 +0100107
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108function TestReturnInBlock() {
109 "use asm";
110
111 function caller() {
112 if(1) {
113 {
114 {
115 return 1;
116 }
117 }
118 }
119 return 0;
120 }
121
122 return {caller: caller};
123}
124
Ben Murdochda12d292016-06-02 14:46:10 +0100125assertWasm(1, TestReturnInBlock);
126
127
128function TestAddSimple() {
129 "use asm";
130
131 function caller() {
132 var x = 0;
133 x = (x + 1)|0;
134 return x|0;
135 }
136
137 return {caller: caller};
138}
139
140assertWasm(1, TestAddSimple);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100141
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000142
143function TestWhileSimple() {
144 "use asm";
145
146 function caller() {
147 var x = 0;
148 while(x < 5) {
149 x = (x + 1)|0;
150 }
151 return x|0;
152 }
153
154 return {caller: caller};
155}
156
Ben Murdochda12d292016-06-02 14:46:10 +0100157assertWasm(5, TestWhileSimple);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100158
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000159
160function TestWhileWithoutBraces() {
161 "use asm";
162
163 function caller() {
164 var x = 0;
165 while(x <= 3)
166 x = (x + 1)|0;
167 return x|0;
168 }
169
170 return {caller: caller};
171}
172
Ben Murdochda12d292016-06-02 14:46:10 +0100173assertWasm(4, TestWhileWithoutBraces);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100174
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000175
176function TestReturnInWhile() {
177 "use asm";
178
179 function caller() {
180 var x = 0;
181 while(x < 10) {
182 x = (x + 6)|0;
183 return x|0;
184 }
185 return x|0;
186 }
187
188 return {caller: caller};
189}
190
Ben Murdochda12d292016-06-02 14:46:10 +0100191assertWasm(6, TestReturnInWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100192
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000193
194function TestReturnInWhileWithoutBraces() {
195 "use asm";
196
197 function caller() {
198 var x = 0;
199 while(x < 5)
200 return 7;
201 return x|0;
202 }
203
204 return {caller: caller};
205}
206
Ben Murdochda12d292016-06-02 14:46:10 +0100207assertWasm(7, TestReturnInWhileWithoutBraces);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100208
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209
Ben Murdochc5610432016-08-08 18:44:38 +0100210function TestBreakInIf() {
211 "use asm";
212
213 function caller() {
214 label: {
215 if(1) break label;
216 return 11;
217 }
218 return 12;
219 }
220
221 return {caller: caller};
222}
223
224assertWasm(12, TestBreakInIf);
225
226function TestBreakInIfInDoWhileFalse() {
227 "use asm";
228
229 function caller() {
230 do {
231 if(1) break;
232 return 11;
233 } while(0);
234 return 12;
235 }
236
237 return {caller: caller};
238}
239
240assertWasm(12, TestBreakInIfInDoWhileFalse);
241
242function TestBreakInElse() {
243 "use asm";
244
245 function caller() {
246 do {
247 if(0) ;
248 else break;
249 return 14;
250 } while(0);
251 return 15;
252 }
253
254 return {caller: caller};
255}
256
257assertWasm(15, TestBreakInElse);
258
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259function TestBreakInWhile() {
260 "use asm";
261
262 function caller() {
263 while(1) {
264 break;
265 }
266 return 8;
267 }
268
269 return {caller: caller};
270}
271
Ben Murdochda12d292016-06-02 14:46:10 +0100272assertWasm(8, TestBreakInWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100273
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274
Ben Murdochc5610432016-08-08 18:44:38 +0100275function TestBreakInIfInWhile() {
276 "use asm";
277
278 function caller() {
279 while(1) {
280 if (1) break;
281 else break;
282 }
283 return 8;
284 }
285
286 return {caller: caller};
287}
288
289assertWasm(8, TestBreakInIfInWhile);
290
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291function TestBreakInNestedWhile() {
292 "use asm";
293
294 function caller() {
295 var x = 1.0;
296 while(x < 1.5) {
297 while(1)
298 break;
299 x = +(x + 0.25);
300 }
301 var ret = 0;
302 if (x == 1.5) {
303 ret = 9;
304 }
305 return ret|0;
306 }
307
308 return {caller: caller};
309}
310
Ben Murdochda12d292016-06-02 14:46:10 +0100311assertWasm(9, TestBreakInNestedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100312
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313
314function TestBreakInBlock() {
315 "use asm";
316
317 function caller() {
318 var x = 0;
319 abc: {
320 x = 10;
321 if (x == 10) {
322 break abc;
323 }
324 x = 20;
325 }
326 return x|0;
327 }
328
329 return {caller: caller};
330}
331
Ben Murdochda12d292016-06-02 14:46:10 +0100332assertWasm(10, TestBreakInBlock);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334
335function TestBreakInNamedWhile() {
336 "use asm";
337
338 function caller() {
339 var x = 0;
340 outer: while (1) {
341 x = (x + 1)|0;
342 while (x == 11) {
343 break outer;
344 }
345 }
346 return x|0;
347 }
348
349 return {caller: caller};
350}
351
Ben Murdochda12d292016-06-02 14:46:10 +0100352assertWasm(11, TestBreakInNamedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100353
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354
355function TestContinue() {
356 "use asm";
357
358 function caller() {
359 var x = 5;
360 var ret = 0;
361 while (x >= 0) {
362 x = (x - 1)|0;
363 if (x == 2) {
364 continue;
365 }
366 ret = (ret - 1)|0;
367 }
368 return ret|0;
369 }
370
371 return {caller: caller};
372}
373
Ben Murdochda12d292016-06-02 14:46:10 +0100374assertWasm(-5, TestContinue);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100375
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000376
377function TestContinueInNamedWhile() {
378 "use asm";
379
380 function caller() {
381 var x = 5;
382 var y = 0;
383 var ret = 0;
384 outer: while (x > 0) {
385 x = (x - 1)|0;
386 y = 0;
387 while (y < 5) {
388 if (x == 3) {
389 continue outer;
390 }
391 ret = (ret + 1)|0;
392 y = (y + 1)|0;
393 }
394 }
395 return ret|0;
396 }
397
398 return {caller: caller};
399}
400
Ben Murdochda12d292016-06-02 14:46:10 +0100401assertWasm(20, TestContinueInNamedWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100402
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403
404function TestNot() {
405 "use asm";
406
407 function caller() {
408 var a = !(2 > 3);
409 return a | 0;
410 }
411
412 return {caller:caller};
413}
414
Ben Murdochda12d292016-06-02 14:46:10 +0100415assertWasm(1, TestNot);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100416
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000417
418function TestNotEquals() {
419 "use asm";
420
421 function caller() {
422 var a = 3;
423 if (a != 2) {
424 return 21;
425 }
426 return 0;
427 }
428
429 return {caller:caller};
430}
431
Ben Murdochda12d292016-06-02 14:46:10 +0100432assertWasm(21, TestNotEquals);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100433
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000434
435function TestUnsignedComparison() {
436 "use asm";
437
438 function caller() {
439 var a = 0xffffffff;
440 if ((a>>>0) > (0>>>0)) {
441 return 22;
442 }
443 return 0;
444 }
445
446 return {caller:caller};
447}
448
Ben Murdochda12d292016-06-02 14:46:10 +0100449assertWasm(22, TestUnsignedComparison);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100450
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000451
452function TestMixedAdd() {
453 "use asm";
454
455 function caller() {
456 var a = 0x80000000;
457 var b = 0x7fffffff;
458 var c = 0;
459 c = ((a>>>0) + b)|0;
460 if ((c >>> 0) > (0>>>0)) {
461 if (c < 0) {
462 return 23;
463 }
464 }
465 return 0;
466 }
467
468 return {caller:caller};
469}
470
Ben Murdochda12d292016-06-02 14:46:10 +0100471assertWasm(23, TestMixedAdd);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100472
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000473
474function TestInt32HeapAccess(stdlib, foreign, buffer) {
475 "use asm";
476
477 var m = new stdlib.Int32Array(buffer);
478 function caller() {
479 var i = 4;
480
481 m[0] = (i + 1) | 0;
482 m[i >> 2] = ((m[0]|0) + 1) | 0;
483 m[2] = ((m[i >> 2]|0) + 1) | 0;
484 return m[2] | 0;
485 }
486
487 return {caller: caller};
488}
489
Ben Murdochda12d292016-06-02 14:46:10 +0100490assertWasm(7, TestInt32HeapAccess);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100491
492
493function TestInt32HeapAccessExternal() {
494 var memory = new ArrayBuffer(1024);
495 var memory_int32 = new Int32Array(memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100496 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100497 TestInt32HeapAccess.toString(), null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100498 assertEquals(7, module.caller());
499 assertEquals(7, memory_int32[2]);
500}
501
502TestInt32HeapAccessExternal();
503
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000504
505function TestHeapAccessIntTypes() {
506 var types = [
Ben Murdoch097c5b22016-05-18 11:27:45 +0100507 [Int8Array, 'Int8Array', '>> 0'],
508 [Uint8Array, 'Uint8Array', '>> 0'],
509 [Int16Array, 'Int16Array', '>> 1'],
510 [Uint16Array, 'Uint16Array', '>> 1'],
511 [Int32Array, 'Int32Array', '>> 2'],
512 [Uint32Array, 'Uint32Array', '>> 2'],
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000513 ];
514 for (var i = 0; i < types.length; i++) {
515 var code = TestInt32HeapAccess.toString();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100516 code = code.replace('Int32Array', types[i][1]);
517 code = code.replace(/>> 2/g, types[i][2]);
518 var memory = new ArrayBuffer(1024);
519 var memory_view = new types[i][0](memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100520 var module = Wasm.instantiateModuleFromAsm(code, null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100521 assertEquals(7, module.caller());
522 assertEquals(7, memory_view[2]);
Ben Murdochda12d292016-06-02 14:46:10 +0100523 assertEquals(7, Wasm.instantiateModuleFromAsm(code).caller());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000524 }
525}
526
527TestHeapAccessIntTypes();
528
Ben Murdoch097c5b22016-05-18 11:27:45 +0100529
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000530function TestFloatHeapAccess(stdlib, foreign, buffer) {
531 "use asm";
532
533 var f32 = new stdlib.Float32Array(buffer);
534 var f64 = new stdlib.Float64Array(buffer);
535 var fround = stdlib.Math.fround;
536 function caller() {
537 var i = 8;
538 var j = 8;
539 var v = 6.0;
540
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000541 f64[2] = v + 1.0;
542 f64[i >> 3] = +f64[2] + 1.0;
543 f64[j >> 3] = +f64[j >> 3] + 1.0;
544 i = +f64[i >> 3] == 9.0;
545 return i|0;
546 }
547
548 return {caller: caller};
549}
550
Ben Murdochda12d292016-06-02 14:46:10 +0100551assertEquals(1, Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100552 TestFloatHeapAccess.toString()).caller());
553
554
555function TestFloatHeapAccessExternal() {
556 var memory = new ArrayBuffer(1024);
557 var memory_float64 = new Float64Array(memory);
Ben Murdochda12d292016-06-02 14:46:10 +0100558 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100559 TestFloatHeapAccess.toString(), null, memory);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100560 assertEquals(1, module.caller());
561 assertEquals(9.0, memory_float64[1]);
562}
563
564TestFloatHeapAccessExternal();
565
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000566
567function TestConvertI32() {
568 "use asm";
569
570 function caller() {
571 var a = 1.5;
572 if ((~~(a + a)) == 3) {
573 return 24;
574 }
575 return 0;
576 }
577
578 return {caller:caller};
579}
580
Ben Murdochda12d292016-06-02 14:46:10 +0100581assertWasm(24, TestConvertI32);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100582
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000583
584function TestConvertF64FromInt() {
585 "use asm";
586
587 function caller() {
588 var a = 1;
Ben Murdochda12d292016-06-02 14:46:10 +0100589 if ((+((a + a)|0)) > 1.5) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000590 return 25;
591 }
592 return 0;
593 }
594
595 return {caller:caller};
596}
597
Ben Murdochda12d292016-06-02 14:46:10 +0100598assertWasm(25, TestConvertF64FromInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100599
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000600
601function TestConvertF64FromUnsigned() {
602 "use asm";
603
604 function caller() {
605 var a = 0xffffffff;
606 if ((+(a>>>0)) > 0.0) {
Ben Murdochda12d292016-06-02 14:46:10 +0100607 if((+(a|0)) < 0.0) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000608 return 26;
609 }
610 }
611 return 0;
612 }
613
614 return {caller:caller};
615}
616
Ben Murdochda12d292016-06-02 14:46:10 +0100617assertWasm(26, TestConvertF64FromUnsigned);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100618
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000619
620function TestModInt() {
621 "use asm";
622
623 function caller() {
624 var a = -83;
625 var b = 28;
626 return ((a|0)%(b|0))|0;
627 }
628
629 return {caller:caller};
630}
631
Ben Murdochda12d292016-06-02 14:46:10 +0100632assertWasm(-27,TestModInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100633
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000634
635function TestModUnsignedInt() {
636 "use asm";
637
638 function caller() {
639 var a = 0x80000000; //2147483648
640 var b = 10;
641 return ((a>>>0)%(b>>>0))|0;
642 }
643
644 return {caller:caller};
645}
646
Ben Murdochda12d292016-06-02 14:46:10 +0100647assertWasm(8, TestModUnsignedInt);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100648
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000649
650function TestModDouble() {
651 "use asm";
652
653 function caller() {
654 var a = 5.25;
655 var b = 2.5;
656 if (a%b == 0.25) {
657 return 28;
658 }
659 return 0;
660 }
661
662 return {caller:caller};
663}
664
Ben Murdochda12d292016-06-02 14:46:10 +0100665assertWasm(28, TestModDouble);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100666
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000667
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000668function TestModDoubleNegative() {
669 "use asm";
670
671 function caller() {
672 var a = -34359738368.25;
673 var b = 2.5;
674 if (a%b == -0.75) {
675 return 28;
676 }
677 return 0;
678 }
679
680 return {caller:caller};
681}
682
Ben Murdochda12d292016-06-02 14:46:10 +0100683assertWasm(28, TestModDoubleNegative);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000684
Ben Murdoch61f157c2016-09-16 13:49:30 +0100685
Ben Murdochda12d292016-06-02 14:46:10 +0100686(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000687function TestNamedFunctions() {
688 "use asm";
689
690 var a = 0.0;
691 var b = 0.0;
692
693 function add() {
694 return +(a + b);
695 }
696
697 function init() {
698 a = 43.25;
699 b = 34.25;
700 }
701
702 return {init:init,
703 add:add};
704}
705
Ben Murdochda12d292016-06-02 14:46:10 +0100706var module = Wasm.instantiateModuleFromAsm(TestNamedFunctions.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000707module.init();
708assertEquals(77.5, module.add());
Ben Murdochda12d292016-06-02 14:46:10 +0100709})();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000710
Ben Murdoch61f157c2016-09-16 13:49:30 +0100711
Ben Murdochda12d292016-06-02 14:46:10 +0100712(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000713function TestGlobalsWithInit() {
714 "use asm";
715
716 var a = 43.25;
717 var b = 34.25;
718
719 function add() {
720 return +(a + b);
721 }
722
723 return {add:add};
724}
725
Ben Murdochda12d292016-06-02 14:46:10 +0100726var module = Wasm.instantiateModuleFromAsm(TestGlobalsWithInit.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000727assertEquals(77.5, module.add());
Ben Murdochda12d292016-06-02 14:46:10 +0100728})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100729
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000730function TestForLoop() {
731 "use asm"
732
733 function caller() {
734 var ret = 0;
735 var i = 0;
736 for (i = 2; i <= 10; i = (i+1)|0) {
737 ret = (ret + i) | 0;
738 }
739 return ret|0;
740 }
741
742 return {caller:caller};
743}
744
Ben Murdochda12d292016-06-02 14:46:10 +0100745assertWasm(54, TestForLoop);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100746
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000747
748function TestForLoopWithoutInit() {
749 "use asm"
750
751 function caller() {
752 var ret = 0;
753 var i = 0;
754 for (; i < 10; i = (i+1)|0) {
755 ret = (ret + 10) | 0;
756 }
757 return ret|0;
758 }
759
760 return {caller:caller};
761}
762
Ben Murdochda12d292016-06-02 14:46:10 +0100763assertWasm(100,TestForLoopWithoutInit);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100764
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000765
766function TestForLoopWithoutCondition() {
767 "use asm"
768
769 function caller() {
770 var ret = 0;
771 var i = 0;
772 for (i=1;; i = (i+1)|0) {
773 ret = (ret + i) | 0;
774 if (i == 11) {
775 break;
776 }
777 }
778 return ret|0;
779 }
780
781 return {caller:caller};
782}
783
Ben Murdochda12d292016-06-02 14:46:10 +0100784assertWasm(66, TestForLoopWithoutCondition);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100785
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000786
787function TestForLoopWithoutNext() {
788 "use asm"
789
790 function caller() {
791 var i = 0;
792 for (i=1; i < 41;) {
793 i = (i + 1) | 0;
794 }
795 return i|0;
796 }
797
798 return {caller:caller};
799}
800
Ben Murdochda12d292016-06-02 14:46:10 +0100801assertWasm(41, TestForLoopWithoutNext);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100802
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000803
804function TestForLoopWithoutBody() {
805 "use asm"
806
807 function caller() {
808 var i = 0;
809 for (i=1; i < 45 ; i = (i+1)|0) {
810 }
811 return i|0;
812 }
813
814 return {caller:caller};
815}
816
Ben Murdochda12d292016-06-02 14:46:10 +0100817assertWasm(45, TestForLoopWithoutBody);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100818
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000819
820function TestDoWhile() {
821 "use asm"
822
823 function caller() {
824 var i = 0;
825 var ret = 21;
826 do {
827 ret = (ret + ret)|0;
828 i = (i + 1)|0;
829 } while (i < 2);
830 return ret|0;
831 }
832
833 return {caller:caller};
834}
835
Ben Murdochda12d292016-06-02 14:46:10 +0100836assertWasm(84, TestDoWhile);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100837
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000838
839function TestConditional() {
840 "use asm"
841
842 function caller() {
843 var x = 1;
844 return ((x > 0) ? 41 : 71)|0;
845 }
846
847 return {caller:caller};
848}
849
Ben Murdochda12d292016-06-02 14:46:10 +0100850assertWasm(41, TestConditional);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100851
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000852
Ben Murdochda12d292016-06-02 14:46:10 +0100853(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000854function TestInitFunctionWithNoGlobals() {
855 "use asm";
856 function caller() {
857 return 51;
858 }
859 return {caller};
860}
861
Ben Murdochda12d292016-06-02 14:46:10 +0100862var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000863 TestInitFunctionWithNoGlobals.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000864assertEquals(51, module.caller());
Ben Murdochda12d292016-06-02 14:46:10 +0100865})();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000866
Ben Murdochda12d292016-06-02 14:46:10 +0100867(function () {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000868function TestExportNameDifferentFromFunctionName() {
869 "use asm";
870 function caller() {
871 return 55;
872 }
873 return {alt_caller:caller};
874}
875
Ben Murdochda12d292016-06-02 14:46:10 +0100876var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000877 TestExportNameDifferentFromFunctionName.toString());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000878assertEquals(55, module.alt_caller());
Ben Murdochda12d292016-06-02 14:46:10 +0100879})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100880
881function TestFunctionTableSingleFunction() {
882 "use asm";
883
884 function dummy() {
885 return 71;
886 }
887
888 function caller() {
889 return function_table[0&0]() | 0;
890 }
891
892 var function_table = [dummy]
893
894 return {caller:caller};
895}
896
Ben Murdochda12d292016-06-02 14:46:10 +0100897assertWasm(71, TestFunctionTableSingleFunction);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100898
899
900function TestFunctionTableMultipleFunctions() {
901 "use asm";
902
903 function inc1(x) {
904 x = x|0;
905 return (x+1)|0;
906 }
907
908 function inc2(x) {
909 x = x|0;
910 return (x+2)|0;
911 }
912
913 function caller() {
914 if (function_table[0&1](50) == 51) {
915 if (function_table[1&1](60) == 62) {
916 return 73;
917 }
918 }
919 return 0;
920 }
921
922 var function_table = [inc1, inc2]
923
924 return {caller:caller};
925}
926
Ben Murdochda12d292016-06-02 14:46:10 +0100927assertWasm(73, TestFunctionTableMultipleFunctions);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100928
929
Ben Murdochda12d292016-06-02 14:46:10 +0100930(function () {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100931function TestFunctionTable() {
932 "use asm";
933
934 function add(a, b) {
935 a = a|0;
936 b = b|0;
937 return (a+b)|0;
938 }
939
940 function sub(a, b) {
941 a = a|0;
942 b = b|0;
943 return (a-b)|0;
944 }
945
946 function inc(a) {
947 a = a|0;
948 return (a+1)|0;
949 }
950
951 function caller(table_id, fun_id, arg1, arg2) {
952 table_id = table_id|0;
953 fun_id = fun_id|0;
954 arg1 = arg1|0;
955 arg2 = arg2|0;
956 if (table_id == 0) {
957 return funBin[fun_id&3](arg1, arg2)|0;
958 } else if (table_id == 1) {
959 return fun[fun_id&0](arg1)|0;
960 }
961 return 0;
962 }
963
964 var funBin = [add, sub, sub, add];
965 var fun = [inc];
966
967 return {caller:caller};
968}
969
Ben Murdochda12d292016-06-02 14:46:10 +0100970var module = Wasm.instantiateModuleFromAsm(TestFunctionTable.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +0100971assertEquals(55, module.caller(0, 0, 33, 22));
972assertEquals(11, module.caller(0, 1, 33, 22));
973assertEquals(9, module.caller(0, 2, 54, 45));
974assertEquals(99, module.caller(0, 3, 54, 45));
975assertEquals(23, module.caller(0, 4, 12, 11));
976assertEquals(31, module.caller(1, 0, 30, 11));
Ben Murdochda12d292016-06-02 14:46:10 +0100977})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100978
979
980function TestForeignFunctions() {
981 function AsmModule(stdlib, foreign, buffer) {
982 "use asm";
983
984 var setVal = foreign.setVal;
985 var getVal = foreign.getVal;
986
987 function caller(initial_value, new_value) {
988 initial_value = initial_value|0;
989 new_value = new_value|0;
990 if ((getVal()|0) == (initial_value|0)) {
991 setVal(new_value|0);
992 return getVal()|0;
993 }
994 return 0;
995 }
996
997 return {caller:caller};
998 }
999
1000 function ffi(initial_val) {
1001 var val = initial_val;
1002
1003 function getVal() {
1004 return val;
1005 }
1006
1007 function setVal(new_val) {
1008 val = new_val;
1009 }
1010
1011 return {getVal:getVal, setVal:setVal};
1012 }
1013
1014 var foreign = new ffi(23);
1015
Ben Murdochda12d292016-06-02 14:46:10 +01001016 var module = Wasm.instantiateModuleFromAsm(AsmModule.toString(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001017 foreign, null);
1018
Ben Murdoch097c5b22016-05-18 11:27:45 +01001019 assertEquals(103, module.caller(23, 103));
1020}
1021
1022TestForeignFunctions();
1023
1024
1025function TestForeignFunctionMultipleUse() {
1026 function AsmModule(stdlib, foreign, buffer) {
1027 "use asm";
1028
1029 var getVal = foreign.getVal;
1030
1031 function caller(int_val, double_val) {
1032 int_val = int_val|0;
1033 double_val = +double_val;
1034 if ((getVal()|0) == (int_val|0)) {
1035 if ((+getVal()) == (+double_val)) {
1036 return 89;
1037 }
1038 }
1039 return 0;
1040 }
1041
1042 return {caller:caller};
1043 }
1044
1045 function ffi() {
1046 function getVal() {
1047 return 83.25;
1048 }
1049
1050 return {getVal:getVal};
1051 }
1052
1053 var foreign = new ffi();
1054
Ben Murdochda12d292016-06-02 14:46:10 +01001055 var module = Wasm.instantiateModuleFromAsm(AsmModule.toString(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001056 foreign, null);
1057
Ben Murdoch097c5b22016-05-18 11:27:45 +01001058 assertEquals(89, module.caller(83, 83.25));
1059}
1060
1061TestForeignFunctionMultipleUse();
1062
1063
1064function TestForeignVariables() {
1065 function AsmModule(stdlib, foreign, buffer) {
1066 "use asm";
1067
1068 var i1 = foreign.foo | 0;
1069 var f1 = +foreign.bar;
1070 var i2 = foreign.baz | 0;
1071 var f2 = +foreign.baz;
1072
1073 function geti1() {
1074 return i1|0;
1075 }
1076
1077 function getf1() {
1078 return +f1;
1079 }
1080
1081 function geti2() {
1082 return i2|0;
1083 }
1084
1085 function getf2() {
1086 return +f2;
1087 }
1088
1089 return {geti1:geti1, getf1:getf1, geti2:geti2, getf2:getf2};
1090 }
1091
1092 function TestCase(env, i1, f1, i2, f2) {
Ben Murdochda12d292016-06-02 14:46:10 +01001093 print("Testing foreign variables...");
1094 var module = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +01001095 AsmModule.toString(), env);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001096 assertEquals(i1, module.geti1());
1097 assertEquals(f1, module.getf1());
1098 assertEquals(i2, module.geti2());
1099 assertEquals(f2, module.getf2());
1100 }
1101
1102 // Check normal operation.
1103 TestCase({foo: 123, bar: 234.5, baz: 345.7}, 123, 234.5, 345, 345.7);
1104 // Check partial operation.
1105 TestCase({baz: 345.7}, 0, NaN, 345, 345.7);
1106 // Check that undefined values are converted to proper defaults.
1107 TestCase({qux: 999}, 0, NaN, 0, NaN);
1108 // Check that an undefined ffi is ok.
1109 TestCase(undefined, 0, NaN, 0, NaN);
1110 // Check that true values are converted properly.
1111 TestCase({foo: true, bar: true, baz: true}, 1, 1.0, 1, 1.0);
1112 // Check that false values are converted properly.
1113 TestCase({foo: false, bar: false, baz: false}, 0, 0, 0, 0);
1114 // Check that null values are converted properly.
1115 TestCase({foo: null, bar: null, baz: null}, 0, 0, 0, 0);
1116 // Check that string values are converted properly.
1117 TestCase({foo: 'hi', bar: 'there', baz: 'dude'}, 0, NaN, 0, NaN);
1118 TestCase({foo: '0xff', bar: '234', baz: '456.1'}, 255, 234, 456, 456.1, 456);
1119 // Check that Date values are converted properly.
1120 TestCase({foo: new Date(123), bar: new Date(456),
1121 baz: new Date(789)}, 123, 456, 789, 789);
1122 // Check that list values are converted properly.
1123 TestCase({foo: [], bar: [], baz: []}, 0, 0, 0, 0);
1124 // Check that object values are converted properly.
1125 TestCase({foo: {}, bar: {}, baz: {}}, 0, NaN, 0, NaN);
1126 // Check that getter object values are converted properly.
1127 var o = {
1128 get foo() {
1129 return 123.4;
1130 }
1131 };
1132 TestCase({foo: o.foo, bar: o.foo, baz: o.foo}, 123, 123.4, 123, 123.4);
1133 // Check that getter object values are converted properly.
1134 var o = {
1135 get baz() {
1136 return 123.4;
1137 }
1138 };
1139 TestCase(o, 0, NaN, 123, 123.4);
1140 // Check that objects with valueOf are converted properly.
1141 var o = {
1142 valueOf: function() { return 99; }
1143 };
1144 TestCase({foo: o, bar: o, baz: o}, 99, 99, 99, 99);
1145 // Check that function values are converted properly.
1146 TestCase({foo: TestCase, bar: TestCase, qux: TestCase}, 0, NaN, 0, NaN);
1147 // Check that a missing ffi object is safe.
1148 TestCase(undefined, 0, NaN, 0, NaN);
1149}
1150
1151TestForeignVariables();
1152
1153
1154(function() {
1155 function TestByteHeapAccessCompat(stdlib, foreign, buffer) {
1156 "use asm";
1157
1158 var HEAP8 = new stdlib.Uint8Array(buffer);
1159 var HEAP32 = new stdlib.Int32Array(buffer);
1160
1161 function store(i, v) {
1162 i = i | 0;
1163 v = v | 0;
1164 HEAP32[i >> 2] = v;
1165 }
1166
1167 function storeb(i, v) {
1168 i = i | 0;
1169 v = v | 0;
1170 HEAP8[i | 0] = v;
1171 }
1172
1173 function load(i) {
1174 i = i | 0;
1175 return HEAP8[i] | 0;
1176 }
1177
1178 function iload(i) {
1179 i = i | 0;
1180 return HEAP8[HEAP32[i >> 2] | 0] | 0;
1181 }
1182
1183 return {load: load, iload: iload, store: store, storeb: storeb};
1184 }
1185
Ben Murdochda12d292016-06-02 14:46:10 +01001186 var m = Wasm.instantiateModuleFromAsm(
Ben Murdoch097c5b22016-05-18 11:27:45 +01001187 TestByteHeapAccessCompat.toString());
1188 m.store(0, 20);
1189 m.store(4, 21);
1190 m.store(8, 22);
1191 m.storeb(20, 123);
1192 m.storeb(21, 42);
1193 m.storeb(22, 77);
1194 assertEquals(123, m.load(20));
1195 assertEquals(42, m.load(21));
1196 assertEquals(77, m.load(22));
1197 assertEquals(123, m.iload(0));
1198 assertEquals(42, m.iload(4));
1199 assertEquals(77, m.iload(8));
1200})();
1201
1202
Ben Murdochda12d292016-06-02 14:46:10 +01001203function TestGlobalBlock(stdlib, foreign, buffer) {
1204 "use asm";
Ben Murdoch097c5b22016-05-18 11:27:45 +01001205
Ben Murdochda12d292016-06-02 14:46:10 +01001206 var x = foreign.x | 0, y = foreign.y | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001207
Ben Murdochda12d292016-06-02 14:46:10 +01001208 function test() {
1209 return (x + y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001210 }
1211
Ben Murdochda12d292016-06-02 14:46:10 +01001212 return {caller: test};
1213}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001214
Ben Murdochda12d292016-06-02 14:46:10 +01001215assertWasm(15, TestGlobalBlock, { x: 4, y: 11 });
Ben Murdoch097c5b22016-05-18 11:27:45 +01001216
1217(function TestComma() {
1218 function CommaModule() {
1219 "use asm";
1220
1221 function ifunc(a, b) {
1222 a = +a;
1223 b = b | 0;
1224 return (a, b) | 0;
1225 }
1226
1227 function dfunc(a, b) {
1228 a = a | 0;
1229 b = +b;
1230 return +(a, b);
1231 }
1232
1233 return {ifunc: ifunc, dfunc: dfunc};
1234 }
1235
Ben Murdochda12d292016-06-02 14:46:10 +01001236 var m = Wasm.instantiateModuleFromAsm(CommaModule.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001237 assertEquals(123, m.ifunc(456.7, 123));
1238 assertEquals(123.4, m.dfunc(456, 123.4));
1239})();
1240
1241
Ben Murdochda12d292016-06-02 14:46:10 +01001242function TestFloatAsDouble(stdlib) {
1243 "use asm";
1244 var fround = stdlib.Math.fround;
1245 function func() {
1246 var x = fround(1.0);
1247 return +fround(x);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001248 }
Ben Murdochda12d292016-06-02 14:46:10 +01001249 return {caller: func};
1250}
1251assertWasm(1, TestFloatAsDouble);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001252
1253
Ben Murdochda12d292016-06-02 14:46:10 +01001254function TestOr() {
1255 "use asm";
1256 function func() {
1257 var x = 1;
1258 var y = 2;
1259 return (x | y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001260 }
Ben Murdochda12d292016-06-02 14:46:10 +01001261 return {caller: func};
1262}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001263
Ben Murdochda12d292016-06-02 14:46:10 +01001264assertWasm(3, TestOr);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001265
1266
Ben Murdochda12d292016-06-02 14:46:10 +01001267function TestAnd() {
1268 "use asm";
1269 function func() {
1270 var x = 3;
1271 var y = 2;
1272 return (x & y) | 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001273 }
Ben Murdochda12d292016-06-02 14:46:10 +01001274 return {caller: func};
1275}
Ben Murdoch097c5b22016-05-18 11:27:45 +01001276
Ben Murdochda12d292016-06-02 14:46:10 +01001277assertWasm(2, TestAnd);
1278
1279
1280function TestXor() {
1281 "use asm";
1282 function func() {
1283 var x = 3;
1284 var y = 2;
1285 return (x ^ y) | 0;
1286 }
1287 return {caller: func};
1288}
1289
1290assertWasm(1, TestXor);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001291
1292
1293(function TestIntishAssignment() {
1294 function Module(stdlib, foreign, heap) {
1295 "use asm";
1296 var HEAP32 = new stdlib.Int32Array(heap);
1297 function func() {
1298 var a = 1;
1299 var b = 2;
1300 HEAP32[0] = a + b;
1301 return HEAP32[0] | 0;
1302 }
1303 return {func: func};
1304 }
1305
Ben Murdochda12d292016-06-02 14:46:10 +01001306 var m = Wasm.instantiateModuleFromAsm(Module.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001307 assertEquals(3, m.func());
1308})();
1309
1310
1311(function TestFloatishAssignment() {
1312 function Module(stdlib, foreign, heap) {
1313 "use asm";
1314 var HEAPF32 = new stdlib.Float32Array(heap);
1315 var fround = stdlib.Math.fround;
1316 function func() {
1317 var a = fround(1.0);
1318 var b = fround(2.0);
1319 HEAPF32[0] = a + b;
1320 return +HEAPF32[0];
1321 }
1322 return {func: func};
1323 }
1324
Ben Murdochda12d292016-06-02 14:46:10 +01001325 var m = Wasm.instantiateModuleFromAsm(Module.toString());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001326 assertEquals(3, m.func());
Ben Murdochda12d292016-06-02 14:46:10 +01001327})();
1328
1329
1330(function TestDoubleToFloatAssignment() {
1331 function Module(stdlib, foreign, heap) {
1332 "use asm";
1333 var HEAPF32 = new stdlib.Float32Array(heap);
1334 var fround = stdlib.Math.fround;
1335 function func() {
1336 var a = 1.23;
1337 HEAPF32[0] = a;
1338 return +HEAPF32[0];
1339 }
1340 return {func: func};
1341 }
1342
1343 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1344 assertEquals(1.23, m.func());
1345});
1346
1347
1348(function TestIntegerMultiplyBothWays() {
1349 function Module(stdlib, foreign, heap) {
1350 "use asm";
1351 function func() {
1352 var a = 1;
1353 return ((a * 3) + (4 * a)) | 0;
1354 }
1355 return {func: func};
1356 }
1357
1358 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1359 assertEquals(7, m.func());
1360})();
1361
1362
Ben Murdoch61f157c2016-09-16 13:49:30 +01001363(function TestBadAssignDoubleFromIntish() {
1364 function Module(stdlib, foreign, heap) {
1365 "use asm";
1366 function func() {
1367 var a = 1;
1368 var b = 3.0;
1369 b = a;
1370 }
1371 return {func: func};
1372 }
1373 assertThrows(function() {
1374 Wasm.instantiateModuleFromAsm(Module.toString());
1375 });
1376})();
1377
1378
1379(function TestBadAssignIntFromDouble() {
1380 function Module(stdlib, foreign, heap) {
1381 "use asm";
1382 function func() {
1383 var a = 1;
1384 var b = 3.0;
1385 a = b;
1386 }
1387 return {func: func};
1388 }
1389 assertThrows(function() {
1390 Wasm.instantiateModuleFromAsm(Module.toString());
1391 });
1392})();
1393
1394
Ben Murdochda12d292016-06-02 14:46:10 +01001395(function TestBadMultiplyIntish() {
1396 function Module(stdlib, foreign, heap) {
1397 "use asm";
1398 function func() {
1399 var a = 1;
1400 return ((a + a) * 4) | 0;
1401 }
1402 return {func: func};
1403 }
1404 assertThrows(function() {
1405 Wasm.instantiateModuleFromAsm(Module.toString());
1406 });
1407})();
1408
1409
1410(function TestBadCastFromInt() {
1411 function Module(stdlib, foreign, heap) {
1412 "use asm";
1413 function func() {
1414 var a = 1;
1415 return +a;
1416 }
1417 return {func: func};
1418 }
1419 assertThrows(function() {
1420 Wasm.instantiateModuleFromAsm(Module.toString());
1421 });
1422})();
1423
1424
1425(function TestAndNegative() {
1426 function Module() {
1427 "use asm";
1428 function func() {
1429 var x = 1;
1430 var y = 2;
1431 var z = 0;
1432 z = x + y & -1;
1433 return z | 0;
1434 }
1435 return {func: func};
1436 }
1437
1438 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1439 assertEquals(3, m.func());
1440})();
1441
1442
1443(function TestNegativeDouble() {
1444 function Module() {
1445 "use asm";
1446 function func() {
1447 var x = -(34359738368.25);
1448 var y = -2.5;
1449 return +(x + y);
1450 }
1451 return {func: func};
1452 }
1453
1454 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1455 assertEquals(-34359738370.75, m.func());
1456})();
1457
1458
1459(function TestBadAndDouble() {
1460 function Module() {
1461 "use asm";
1462 function func() {
1463 var x = 1.0;
1464 var y = 2.0;
1465 return (x & y) | 0;
1466 }
1467 return {func: func};
1468 }
1469
1470 assertThrows(function() {
1471 Wasm.instantiateModuleFromAsm(Module.toString());
1472 });
1473})();
1474
1475
1476(function TestAndIntAndHeapValue() {
1477 function Module(stdlib, foreign, buffer) {
1478 "use asm";
1479 var HEAP32 = new stdlib.Int32Array(buffer);
1480 function func() {
1481 var x = 0;
1482 x = HEAP32[0] & -1;
1483 return x | 0;
1484 }
1485 return {func: func};
1486 }
1487
1488 var m = Wasm.instantiateModuleFromAsm(Module.toString());
1489 assertEquals(0, m.func());
1490})();
1491
1492(function TestOutOfBoundsConversion() {
1493 function asmModule($a,$b,$c){'use asm';
1494 function aaa() {
1495 var f = 0.0;
1496 var a = 0;
1497 f = 5616315000.000001;
1498 a = ~~f >>>0;
1499 return a | 0;
1500 }
1501 return { main : aaa };
1502 }
1503 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
1504 assertEquals(1321347704, wasm.main());
1505})();
1506
1507(function TestUnsignedLiterals() {
1508 function asmModule() {
1509 "use asm";
1510 function u0xffffffff() {
1511 var f = 0xffffffff;
1512 return +(f >>> 0);
1513 }
1514 function u0x80000000() {
1515 var f = 0x80000000;
1516 return +(f >>> 0);
1517 }
1518 function u0x87654321() {
1519 var f = 0x87654321;
1520 return +(f >>> 0);
1521 }
1522 return {
1523 u0xffffffff: u0xffffffff,
1524 u0x80000000: u0x80000000,
1525 u0x87654321: u0x87654321,
1526 };
1527 }
1528 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
1529 assertEquals(0xffffffff, wasm.u0xffffffff());
1530 assertEquals(0x80000000, wasm.u0x80000000());
1531 assertEquals(0x87654321, wasm.u0x87654321());
1532})();