1// 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 7function EmptyTest() { 8 "use asm"; 9 function caller() { 10 empty(); 11 return 11; 12 } 13 function empty() { 14 } 15 return {caller: caller}; 16} 17 18assertEquals(11, _WASMEXP_.asmCompileRun(EmptyTest.toString())); 19 20function IntTest() { 21 "use asm"; 22 function sum(a, b) { 23 a = a|0; 24 b = b|0; 25 var c = (b + 1)|0 26 var d = 3.0; 27 var e = d | 0; // double conversion 28 return (a + c + 1)|0; 29 } 30 31 function caller() { 32 return sum(77,22) | 0; 33 } 34 35 return {caller: caller}; 36} 37 38assertEquals(101, _WASMEXP_.asmCompileRun(IntTest.toString())); 39 40function Float64Test() { 41 "use asm"; 42 function sum(a, b) { 43 a = +a; 44 b = +b; 45 return +(a + b); 46 } 47 48 function caller() { 49 var a = +sum(70.1,10.2); 50 var ret = 0|0; 51 if (a == 80.3) { 52 ret = 1|0; 53 } else { 54 ret = 0|0; 55 } 56 return ret|0; 57 } 58 59 return {caller: caller}; 60} 61 62assertEquals(1, _WASMEXP_.asmCompileRun(Float64Test.toString())); 63 64function BadModule() { 65 "use asm"; 66 function caller(a, b) { 67 a = a|0; 68 b = b+0; 69 var c = (b + 1)|0 70 return (a + c + 1)|0; 71 } 72 73 function caller() { 74 return call(1, 2)|0; 75 } 76 77 return {caller: caller}; 78} 79 80assertThrows(function() { 81 _WASMEXP_.asmCompileRun(BadModule.toString()) 82}); 83 84function TestReturnInBlock() { 85 "use asm"; 86 87 function caller() { 88 if(1) { 89 { 90 { 91 return 1; 92 } 93 } 94 } 95 return 0; 96 } 97 98 return {caller: caller}; 99} 100 101assertEquals(1, _WASMEXP_.asmCompileRun(TestReturnInBlock.toString())); 102 103function TestWhileSimple() { 104 "use asm"; 105 106 function caller() { 107 var x = 0; 108 while(x < 5) { 109 x = (x + 1)|0; 110 } 111 return x|0; 112 } 113 114 return {caller: caller}; 115} 116 117assertEquals(5, _WASMEXP_.asmCompileRun(TestWhileSimple.toString())); 118 119function TestWhileWithoutBraces() { 120 "use asm"; 121 122 function caller() { 123 var x = 0; 124 while(x <= 3) 125 x = (x + 1)|0; 126 return x|0; 127 } 128 129 return {caller: caller}; 130} 131 132assertEquals(4, _WASMEXP_.asmCompileRun(TestWhileWithoutBraces.toString())); 133 134function TestReturnInWhile() { 135 "use asm"; 136 137 function caller() { 138 var x = 0; 139 while(x < 10) { 140 x = (x + 6)|0; 141 return x|0; 142 } 143 return x|0; 144 } 145 146 return {caller: caller}; 147} 148 149assertEquals(6, _WASMEXP_.asmCompileRun(TestReturnInWhile.toString())); 150 151function TestReturnInWhileWithoutBraces() { 152 "use asm"; 153 154 function caller() { 155 var x = 0; 156 while(x < 5) 157 return 7; 158 return x|0; 159 } 160 161 return {caller: caller}; 162} 163 164assertEquals(7, _WASMEXP_.asmCompileRun(TestReturnInWhileWithoutBraces.toString())); 165 166function TestBreakInWhile() { 167 "use asm"; 168 169 function caller() { 170 while(1) { 171 break; 172 } 173 return 8; 174 } 175 176 return {caller: caller}; 177} 178 179assertEquals(8, _WASMEXP_.asmCompileRun(TestBreakInWhile.toString())); 180 181function TestBreakInNestedWhile() { 182 "use asm"; 183 184 function caller() { 185 var x = 1.0; 186 while(x < 1.5) { 187 while(1) 188 break; 189 x = +(x + 0.25); 190 } 191 var ret = 0; 192 if (x == 1.5) { 193 ret = 9; 194 } 195 return ret|0; 196 } 197 198 return {caller: caller}; 199} 200 201assertEquals(9, _WASMEXP_.asmCompileRun(TestBreakInNestedWhile.toString())); 202 203function TestBreakInBlock() { 204 "use asm"; 205 206 function caller() { 207 var x = 0; 208 abc: { 209 x = 10; 210 if (x == 10) { 211 break abc; 212 } 213 x = 20; 214 } 215 return x|0; 216 } 217 218 return {caller: caller}; 219} 220 221assertEquals(10, _WASMEXP_.asmCompileRun(TestBreakInBlock.toString())); 222 223function TestBreakInNamedWhile() { 224 "use asm"; 225 226 function caller() { 227 var x = 0; 228 outer: while (1) { 229 x = (x + 1)|0; 230 while (x == 11) { 231 break outer; 232 } 233 } 234 return x|0; 235 } 236 237 return {caller: caller}; 238} 239 240assertEquals(11, _WASMEXP_.asmCompileRun(TestBreakInNamedWhile.toString())); 241 242function TestContinue() { 243 "use asm"; 244 245 function caller() { 246 var x = 5; 247 var ret = 0; 248 while (x >= 0) { 249 x = (x - 1)|0; 250 if (x == 2) { 251 continue; 252 } 253 ret = (ret - 1)|0; 254 } 255 return ret|0; 256 } 257 258 return {caller: caller}; 259} 260 261assertEquals(-5, _WASMEXP_.asmCompileRun(TestContinue.toString())); 262 263function TestContinueInNamedWhile() { 264 "use asm"; 265 266 function caller() { 267 var x = 5; 268 var y = 0; 269 var ret = 0; 270 outer: while (x > 0) { 271 x = (x - 1)|0; 272 y = 0; 273 while (y < 5) { 274 if (x == 3) { 275 continue outer; 276 } 277 ret = (ret + 1)|0; 278 y = (y + 1)|0; 279 } 280 } 281 return ret|0; 282 } 283 284 return {caller: caller}; 285} 286 287assertEquals(20, _WASMEXP_.asmCompileRun(TestContinueInNamedWhile.toString())); 288 289function TestNot() { 290 "use asm"; 291 292 function caller() { 293 var a = !(2 > 3); 294 return a | 0; 295 } 296 297 return {caller:caller}; 298} 299 300assertEquals(1, _WASMEXP_.asmCompileRun(TestNot.toString())); 301 302function TestNotEquals() { 303 "use asm"; 304 305 function caller() { 306 var a = 3; 307 if (a != 2) { 308 return 21; 309 } 310 return 0; 311 } 312 313 return {caller:caller}; 314} 315 316assertEquals(21, _WASMEXP_.asmCompileRun(TestNotEquals.toString())); 317 318function TestUnsignedComparison() { 319 "use asm"; 320 321 function caller() { 322 var a = 0xffffffff; 323 if ((a>>>0) > (0>>>0)) { 324 return 22; 325 } 326 return 0; 327 } 328 329 return {caller:caller}; 330} 331 332assertEquals(22, _WASMEXP_.asmCompileRun(TestUnsignedComparison.toString())); 333 334function TestMixedAdd() { 335 "use asm"; 336 337 function caller() { 338 var a = 0x80000000; 339 var b = 0x7fffffff; 340 var c = 0; 341 c = ((a>>>0) + b)|0; 342 if ((c >>> 0) > (0>>>0)) { 343 if (c < 0) { 344 return 23; 345 } 346 } 347 return 0; 348 } 349 350 return {caller:caller}; 351} 352 353assertEquals(23, _WASMEXP_.asmCompileRun(TestMixedAdd.toString())); 354 355function TestInt32HeapAccess(stdlib, foreign, buffer) { 356 "use asm"; 357 358 var m = new stdlib.Int32Array(buffer); 359 function caller() { 360 var i = 4; 361 362 m[0] = (i + 1) | 0; 363 m[i >> 2] = ((m[0]|0) + 1) | 0; 364 m[2] = ((m[i >> 2]|0) + 1) | 0; 365 return m[2] | 0; 366 } 367 368 return {caller: caller}; 369} 370 371assertEquals(7, _WASMEXP_.asmCompileRun(TestInt32HeapAccess.toString())); 372 373function TestHeapAccessIntTypes() { 374 var types = [ 375 ['Int8Array', '>> 0'], 376 ['Uint8Array', '>> 0'], 377 ['Int16Array', '>> 1'], 378 ['Uint16Array', '>> 1'], 379 ['Int32Array', '>> 2'], 380 ['Uint32Array', '>> 2'], 381 ]; 382 for (var i = 0; i < types.length; i++) { 383 var code = TestInt32HeapAccess.toString(); 384 code = code.replace('Int32Array', types[i][0]); 385 code = code.replace(/>> 2/g, types[i][1]); 386 assertEquals(7, _WASMEXP_.asmCompileRun(code)); 387 } 388} 389 390TestHeapAccessIntTypes(); 391 392function TestFloatHeapAccess(stdlib, foreign, buffer) { 393 "use asm"; 394 395 var f32 = new stdlib.Float32Array(buffer); 396 var f64 = new stdlib.Float64Array(buffer); 397 var fround = stdlib.Math.fround; 398 function caller() { 399 var i = 8; 400 var j = 8; 401 var v = 6.0; 402 403 // TODO(bradnelson): Add float32 when asm-wasm supports it. 404 f64[2] = v + 1.0; 405 f64[i >> 3] = +f64[2] + 1.0; 406 f64[j >> 3] = +f64[j >> 3] + 1.0; 407 i = +f64[i >> 3] == 9.0; 408 return i|0; 409 } 410 411 return {caller: caller}; 412} 413 414assertEquals(1, _WASMEXP_.asmCompileRun(TestFloatHeapAccess.toString())); 415 416function TestConvertI32() { 417 "use asm"; 418 419 function caller() { 420 var a = 1.5; 421 if ((~~(a + a)) == 3) { 422 return 24; 423 } 424 return 0; 425 } 426 427 return {caller:caller}; 428} 429 430assertEquals(24, _WASMEXP_.asmCompileRun(TestConvertI32.toString())); 431 432function TestConvertF64FromInt() { 433 "use asm"; 434 435 function caller() { 436 var a = 1; 437 if ((+(a + a)) > 1.5) { 438 return 25; 439 } 440 return 0; 441 } 442 443 return {caller:caller}; 444} 445 446assertEquals(25, _WASMEXP_.asmCompileRun(TestConvertF64FromInt.toString())); 447 448function TestConvertF64FromUnsigned() { 449 "use asm"; 450 451 function caller() { 452 var a = 0xffffffff; 453 if ((+(a>>>0)) > 0.0) { 454 if((+a) < 0.0) { 455 return 26; 456 } 457 } 458 return 0; 459 } 460 461 return {caller:caller}; 462} 463 464assertEquals(26, _WASMEXP_.asmCompileRun(TestConvertF64FromUnsigned.toString())); 465 466function TestModInt() { 467 "use asm"; 468 469 function caller() { 470 var a = -83; 471 var b = 28; 472 return ((a|0)%(b|0))|0; 473 } 474 475 return {caller:caller}; 476} 477 478assertEquals(-27, _WASMEXP_.asmCompileRun(TestModInt.toString())); 479 480function TestModUnsignedInt() { 481 "use asm"; 482 483 function caller() { 484 var a = 0x80000000; //2147483648 485 var b = 10; 486 return ((a>>>0)%(b>>>0))|0; 487 } 488 489 return {caller:caller}; 490} 491 492assertEquals(8, _WASMEXP_.asmCompileRun(TestModUnsignedInt.toString())); 493 494function TestModDouble() { 495 "use asm"; 496 497 function caller() { 498 var a = 5.25; 499 var b = 2.5; 500 if (a%b == 0.25) { 501 return 28; 502 } 503 return 0; 504 } 505 506 return {caller:caller}; 507} 508 509assertEquals(28, _WASMEXP_.asmCompileRun(TestModDouble.toString())); 510 511/* 512TODO: Fix parsing of negative doubles 513 Fix code to use trunc instead of casts 514function TestModDoubleNegative() { 515 "use asm"; 516 517 function caller() { 518 var a = -34359738368.25; 519 var b = 2.5; 520 if (a%b == -0.75) { 521 return 28; 522 } 523 return 0; 524 } 525 526 return {caller:caller}; 527} 528 529assertEquals(28, _WASMEXP_.asmCompileRun(TestModDoubleNegative.toString())); 530*/ 531 532function TestNamedFunctions() { 533 "use asm"; 534 535 var a = 0.0; 536 var b = 0.0; 537 538 function add() { 539 return +(a + b); 540 } 541 542 function init() { 543 a = 43.25; 544 b = 34.25; 545 } 546 547 return {init:init, 548 add:add}; 549} 550 551var module = _WASMEXP_.instantiateModuleFromAsm(TestNamedFunctions.toString()); 552module.init(); 553assertEquals(77.5, module.add()); 554 555function TestGlobalsWithInit() { 556 "use asm"; 557 558 var a = 43.25; 559 var b = 34.25; 560 561 function add() { 562 return +(a + b); 563 } 564 565 return {add:add}; 566} 567 568var module = _WASMEXP_.instantiateModuleFromAsm(TestGlobalsWithInit.toString()); 569module.__init__(); 570assertEquals(77.5, module.add()); 571 572function TestForLoop() { 573 "use asm" 574 575 function caller() { 576 var ret = 0; 577 var i = 0; 578 for (i = 2; i <= 10; i = (i+1)|0) { 579 ret = (ret + i) | 0; 580 } 581 return ret|0; 582 } 583 584 return {caller:caller}; 585} 586 587assertEquals(54, _WASMEXP_.asmCompileRun(TestForLoop.toString())); 588 589function TestForLoopWithoutInit() { 590 "use asm" 591 592 function caller() { 593 var ret = 0; 594 var i = 0; 595 for (; i < 10; i = (i+1)|0) { 596 ret = (ret + 10) | 0; 597 } 598 return ret|0; 599 } 600 601 return {caller:caller}; 602} 603 604assertEquals(100, _WASMEXP_.asmCompileRun(TestForLoopWithoutInit.toString())); 605 606function TestForLoopWithoutCondition() { 607 "use asm" 608 609 function caller() { 610 var ret = 0; 611 var i = 0; 612 for (i=1;; i = (i+1)|0) { 613 ret = (ret + i) | 0; 614 if (i == 11) { 615 break; 616 } 617 } 618 return ret|0; 619 } 620 621 return {caller:caller}; 622} 623 624assertEquals(66, _WASMEXP_.asmCompileRun(TestForLoopWithoutCondition.toString())); 625 626function TestForLoopWithoutNext() { 627 "use asm" 628 629 function caller() { 630 var i = 0; 631 for (i=1; i < 41;) { 632 i = (i + 1) | 0; 633 } 634 return i|0; 635 } 636 637 return {caller:caller}; 638} 639 640assertEquals(41, _WASMEXP_.asmCompileRun(TestForLoopWithoutNext.toString())); 641 642function TestForLoopWithoutBody() { 643 "use asm" 644 645 function caller() { 646 var i = 0; 647 for (i=1; i < 45 ; i = (i+1)|0) { 648 } 649 return i|0; 650 } 651 652 return {caller:caller}; 653} 654 655assertEquals(45, _WASMEXP_.asmCompileRun(TestForLoopWithoutBody.toString())); 656 657function TestDoWhile() { 658 "use asm" 659 660 function caller() { 661 var i = 0; 662 var ret = 21; 663 do { 664 ret = (ret + ret)|0; 665 i = (i + 1)|0; 666 } while (i < 2); 667 return ret|0; 668 } 669 670 return {caller:caller}; 671} 672 673assertEquals(84, _WASMEXP_.asmCompileRun(TestDoWhile.toString())); 674 675function TestConditional() { 676 "use asm" 677 678 function caller() { 679 var x = 1; 680 return ((x > 0) ? 41 : 71)|0; 681 } 682 683 return {caller:caller}; 684} 685 686assertEquals(41, _WASMEXP_.asmCompileRun(TestConditional.toString())); 687 688function TestSwitch() { 689 "use asm" 690 691 function caller() { 692 var ret = 0; 693 var x = 7; 694 switch (x) { 695 case 1: return 0; 696 case 7: { 697 ret = 12; 698 break; 699 } 700 default: return 0; 701 } 702 switch (x) { 703 case 1: return 0; 704 case 8: return 0; 705 default: ret = (ret + 11)|0; 706 } 707 return ret|0; 708 } 709 710 return {caller:caller}; 711} 712 713assertEquals(23, _WASMEXP_.asmCompileRun(TestSwitch.toString())); 714 715function TestSwitchFallthrough() { 716 "use asm" 717 718 function caller() { 719 var x = 17; 720 var ret = 0; 721 switch (x) { 722 case 17: 723 case 14: ret = 39; 724 case 1: ret = (ret + 3)|0; 725 case 4: break; 726 default: ret = (ret + 1)|0; 727 } 728 return ret|0; 729 } 730 731 return {caller:caller}; 732} 733 734assertEquals(42, _WASMEXP_.asmCompileRun(TestSwitchFallthrough.toString())); 735 736function TestNestedSwitch() { 737 "use asm" 738 739 function caller() { 740 var x = 3; 741 var y = -13; 742 switch (x) { 743 case 1: return 0; 744 case 3: { 745 switch (y) { 746 case 2: return 0; 747 case -13: return 43; 748 default: return 0; 749 } 750 } 751 default: return 0; 752 } 753 return 0; 754 } 755 756 return {caller:caller}; 757} 758 759assertEquals(43, _WASMEXP_.asmCompileRun(TestNestedSwitch.toString())); 760 761function TestInitFunctionWithNoGlobals() { 762 "use asm"; 763 function caller() { 764 return 51; 765 } 766 return {caller}; 767} 768 769var module = _WASMEXP_.instantiateModuleFromAsm( 770 TestInitFunctionWithNoGlobals.toString()); 771module.__init__(); 772assertEquals(51, module.caller()); 773 774function TestExportNameDifferentFromFunctionName() { 775 "use asm"; 776 function caller() { 777 return 55; 778 } 779 return {alt_caller:caller}; 780} 781 782var module = _WASMEXP_.instantiateModuleFromAsm( 783 TestExportNameDifferentFromFunctionName.toString()); 784module.__init__(); 785assertEquals(55, module.alt_caller()); 786