| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --expose-wasm |
| |
| function EmptyTest() { |
| "use asm"; |
| function caller() { |
| empty(); |
| return 11; |
| } |
| function empty() { |
| } |
| return {caller: caller}; |
| } |
| |
| assertEquals(11, _WASMEXP_.asmCompileRun(EmptyTest.toString())); |
| |
| function IntTest() { |
| "use asm"; |
| function sum(a, b) { |
| a = a|0; |
| b = b|0; |
| var c = (b + 1)|0 |
| var d = 3.0; |
| var e = d | 0; // double conversion |
| return (a + c + 1)|0; |
| } |
| |
| function caller() { |
| return sum(77,22) | 0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(101, _WASMEXP_.asmCompileRun(IntTest.toString())); |
| |
| function Float64Test() { |
| "use asm"; |
| function sum(a, b) { |
| a = +a; |
| b = +b; |
| return +(a + b); |
| } |
| |
| function caller() { |
| var a = +sum(70.1,10.2); |
| var ret = 0|0; |
| if (a == 80.3) { |
| ret = 1|0; |
| } else { |
| ret = 0|0; |
| } |
| return ret|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(1, _WASMEXP_.asmCompileRun(Float64Test.toString())); |
| |
| function BadModule() { |
| "use asm"; |
| function caller(a, b) { |
| a = a|0; |
| b = b+0; |
| var c = (b + 1)|0 |
| return (a + c + 1)|0; |
| } |
| |
| function caller() { |
| return call(1, 2)|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertThrows(function() { |
| _WASMEXP_.asmCompileRun(BadModule.toString()) |
| }); |
| |
| function TestReturnInBlock() { |
| "use asm"; |
| |
| function caller() { |
| if(1) { |
| { |
| { |
| return 1; |
| } |
| } |
| } |
| return 0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(1, _WASMEXP_.asmCompileRun(TestReturnInBlock.toString())); |
| |
| function TestWhileSimple() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| while(x < 5) { |
| x = (x + 1)|0; |
| } |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(5, _WASMEXP_.asmCompileRun(TestWhileSimple.toString())); |
| |
| function TestWhileWithoutBraces() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| while(x <= 3) |
| x = (x + 1)|0; |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(4, _WASMEXP_.asmCompileRun(TestWhileWithoutBraces.toString())); |
| |
| function TestReturnInWhile() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| while(x < 10) { |
| x = (x + 6)|0; |
| return x|0; |
| } |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(6, _WASMEXP_.asmCompileRun(TestReturnInWhile.toString())); |
| |
| function TestReturnInWhileWithoutBraces() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| while(x < 5) |
| return 7; |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(7, _WASMEXP_.asmCompileRun(TestReturnInWhileWithoutBraces.toString())); |
| |
| function TestBreakInWhile() { |
| "use asm"; |
| |
| function caller() { |
| while(1) { |
| break; |
| } |
| return 8; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(8, _WASMEXP_.asmCompileRun(TestBreakInWhile.toString())); |
| |
| function TestBreakInNestedWhile() { |
| "use asm"; |
| |
| function caller() { |
| var x = 1.0; |
| while(x < 1.5) { |
| while(1) |
| break; |
| x = +(x + 0.25); |
| } |
| var ret = 0; |
| if (x == 1.5) { |
| ret = 9; |
| } |
| return ret|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(9, _WASMEXP_.asmCompileRun(TestBreakInNestedWhile.toString())); |
| |
| function TestBreakInBlock() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| abc: { |
| x = 10; |
| if (x == 10) { |
| break abc; |
| } |
| x = 20; |
| } |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(10, _WASMEXP_.asmCompileRun(TestBreakInBlock.toString())); |
| |
| function TestBreakInNamedWhile() { |
| "use asm"; |
| |
| function caller() { |
| var x = 0; |
| outer: while (1) { |
| x = (x + 1)|0; |
| while (x == 11) { |
| break outer; |
| } |
| } |
| return x|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(11, _WASMEXP_.asmCompileRun(TestBreakInNamedWhile.toString())); |
| |
| function TestContinue() { |
| "use asm"; |
| |
| function caller() { |
| var x = 5; |
| var ret = 0; |
| while (x >= 0) { |
| x = (x - 1)|0; |
| if (x == 2) { |
| continue; |
| } |
| ret = (ret - 1)|0; |
| } |
| return ret|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(-5, _WASMEXP_.asmCompileRun(TestContinue.toString())); |
| |
| function TestContinueInNamedWhile() { |
| "use asm"; |
| |
| function caller() { |
| var x = 5; |
| var y = 0; |
| var ret = 0; |
| outer: while (x > 0) { |
| x = (x - 1)|0; |
| y = 0; |
| while (y < 5) { |
| if (x == 3) { |
| continue outer; |
| } |
| ret = (ret + 1)|0; |
| y = (y + 1)|0; |
| } |
| } |
| return ret|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(20, _WASMEXP_.asmCompileRun(TestContinueInNamedWhile.toString())); |
| |
| function TestNot() { |
| "use asm"; |
| |
| function caller() { |
| var a = !(2 > 3); |
| return a | 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(1, _WASMEXP_.asmCompileRun(TestNot.toString())); |
| |
| function TestNotEquals() { |
| "use asm"; |
| |
| function caller() { |
| var a = 3; |
| if (a != 2) { |
| return 21; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(21, _WASMEXP_.asmCompileRun(TestNotEquals.toString())); |
| |
| function TestUnsignedComparison() { |
| "use asm"; |
| |
| function caller() { |
| var a = 0xffffffff; |
| if ((a>>>0) > (0>>>0)) { |
| return 22; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(22, _WASMEXP_.asmCompileRun(TestUnsignedComparison.toString())); |
| |
| function TestMixedAdd() { |
| "use asm"; |
| |
| function caller() { |
| var a = 0x80000000; |
| var b = 0x7fffffff; |
| var c = 0; |
| c = ((a>>>0) + b)|0; |
| if ((c >>> 0) > (0>>>0)) { |
| if (c < 0) { |
| return 23; |
| } |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(23, _WASMEXP_.asmCompileRun(TestMixedAdd.toString())); |
| |
| function TestInt32HeapAccess(stdlib, foreign, buffer) { |
| "use asm"; |
| |
| var m = new stdlib.Int32Array(buffer); |
| function caller() { |
| var i = 4; |
| |
| m[0] = (i + 1) | 0; |
| m[i >> 2] = ((m[0]|0) + 1) | 0; |
| m[2] = ((m[i >> 2]|0) + 1) | 0; |
| return m[2] | 0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(7, _WASMEXP_.asmCompileRun(TestInt32HeapAccess.toString())); |
| |
| function TestHeapAccessIntTypes() { |
| var types = [ |
| ['Int8Array', '>> 0'], |
| ['Uint8Array', '>> 0'], |
| ['Int16Array', '>> 1'], |
| ['Uint16Array', '>> 1'], |
| ['Int32Array', '>> 2'], |
| ['Uint32Array', '>> 2'], |
| ]; |
| for (var i = 0; i < types.length; i++) { |
| var code = TestInt32HeapAccess.toString(); |
| code = code.replace('Int32Array', types[i][0]); |
| code = code.replace(/>> 2/g, types[i][1]); |
| assertEquals(7, _WASMEXP_.asmCompileRun(code)); |
| } |
| } |
| |
| TestHeapAccessIntTypes(); |
| |
| function TestFloatHeapAccess(stdlib, foreign, buffer) { |
| "use asm"; |
| |
| var f32 = new stdlib.Float32Array(buffer); |
| var f64 = new stdlib.Float64Array(buffer); |
| var fround = stdlib.Math.fround; |
| function caller() { |
| var i = 8; |
| var j = 8; |
| var v = 6.0; |
| |
| // TODO(bradnelson): Add float32 when asm-wasm supports it. |
| f64[2] = v + 1.0; |
| f64[i >> 3] = +f64[2] + 1.0; |
| f64[j >> 3] = +f64[j >> 3] + 1.0; |
| i = +f64[i >> 3] == 9.0; |
| return i|0; |
| } |
| |
| return {caller: caller}; |
| } |
| |
| assertEquals(1, _WASMEXP_.asmCompileRun(TestFloatHeapAccess.toString())); |
| |
| function TestConvertI32() { |
| "use asm"; |
| |
| function caller() { |
| var a = 1.5; |
| if ((~~(a + a)) == 3) { |
| return 24; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(24, _WASMEXP_.asmCompileRun(TestConvertI32.toString())); |
| |
| function TestConvertF64FromInt() { |
| "use asm"; |
| |
| function caller() { |
| var a = 1; |
| if ((+(a + a)) > 1.5) { |
| return 25; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(25, _WASMEXP_.asmCompileRun(TestConvertF64FromInt.toString())); |
| |
| function TestConvertF64FromUnsigned() { |
| "use asm"; |
| |
| function caller() { |
| var a = 0xffffffff; |
| if ((+(a>>>0)) > 0.0) { |
| if((+a) < 0.0) { |
| return 26; |
| } |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(26, _WASMEXP_.asmCompileRun(TestConvertF64FromUnsigned.toString())); |
| |
| function TestModInt() { |
| "use asm"; |
| |
| function caller() { |
| var a = -83; |
| var b = 28; |
| return ((a|0)%(b|0))|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(-27, _WASMEXP_.asmCompileRun(TestModInt.toString())); |
| |
| function TestModUnsignedInt() { |
| "use asm"; |
| |
| function caller() { |
| var a = 0x80000000; //2147483648 |
| var b = 10; |
| return ((a>>>0)%(b>>>0))|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(8, _WASMEXP_.asmCompileRun(TestModUnsignedInt.toString())); |
| |
| function TestModDouble() { |
| "use asm"; |
| |
| function caller() { |
| var a = 5.25; |
| var b = 2.5; |
| if (a%b == 0.25) { |
| return 28; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(28, _WASMEXP_.asmCompileRun(TestModDouble.toString())); |
| |
| /* |
| TODO: Fix parsing of negative doubles |
| Fix code to use trunc instead of casts |
| function TestModDoubleNegative() { |
| "use asm"; |
| |
| function caller() { |
| var a = -34359738368.25; |
| var b = 2.5; |
| if (a%b == -0.75) { |
| return 28; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(28, _WASMEXP_.asmCompileRun(TestModDoubleNegative.toString())); |
| */ |
| |
| function TestNamedFunctions() { |
| "use asm"; |
| |
| var a = 0.0; |
| var b = 0.0; |
| |
| function add() { |
| return +(a + b); |
| } |
| |
| function init() { |
| a = 43.25; |
| b = 34.25; |
| } |
| |
| return {init:init, |
| add:add}; |
| } |
| |
| var module = _WASMEXP_.instantiateModuleFromAsm(TestNamedFunctions.toString()); |
| module.init(); |
| assertEquals(77.5, module.add()); |
| |
| function TestGlobalsWithInit() { |
| "use asm"; |
| |
| var a = 43.25; |
| var b = 34.25; |
| |
| function add() { |
| return +(a + b); |
| } |
| |
| return {add:add}; |
| } |
| |
| var module = _WASMEXP_.instantiateModuleFromAsm(TestGlobalsWithInit.toString()); |
| module.__init__(); |
| assertEquals(77.5, module.add()); |
| |
| function TestForLoop() { |
| "use asm" |
| |
| function caller() { |
| var ret = 0; |
| var i = 0; |
| for (i = 2; i <= 10; i = (i+1)|0) { |
| ret = (ret + i) | 0; |
| } |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(54, _WASMEXP_.asmCompileRun(TestForLoop.toString())); |
| |
| function TestForLoopWithoutInit() { |
| "use asm" |
| |
| function caller() { |
| var ret = 0; |
| var i = 0; |
| for (; i < 10; i = (i+1)|0) { |
| ret = (ret + 10) | 0; |
| } |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(100, _WASMEXP_.asmCompileRun(TestForLoopWithoutInit.toString())); |
| |
| function TestForLoopWithoutCondition() { |
| "use asm" |
| |
| function caller() { |
| var ret = 0; |
| var i = 0; |
| for (i=1;; i = (i+1)|0) { |
| ret = (ret + i) | 0; |
| if (i == 11) { |
| break; |
| } |
| } |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(66, _WASMEXP_.asmCompileRun(TestForLoopWithoutCondition.toString())); |
| |
| function TestForLoopWithoutNext() { |
| "use asm" |
| |
| function caller() { |
| var i = 0; |
| for (i=1; i < 41;) { |
| i = (i + 1) | 0; |
| } |
| return i|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(41, _WASMEXP_.asmCompileRun(TestForLoopWithoutNext.toString())); |
| |
| function TestForLoopWithoutBody() { |
| "use asm" |
| |
| function caller() { |
| var i = 0; |
| for (i=1; i < 45 ; i = (i+1)|0) { |
| } |
| return i|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(45, _WASMEXP_.asmCompileRun(TestForLoopWithoutBody.toString())); |
| |
| function TestDoWhile() { |
| "use asm" |
| |
| function caller() { |
| var i = 0; |
| var ret = 21; |
| do { |
| ret = (ret + ret)|0; |
| i = (i + 1)|0; |
| } while (i < 2); |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(84, _WASMEXP_.asmCompileRun(TestDoWhile.toString())); |
| |
| function TestConditional() { |
| "use asm" |
| |
| function caller() { |
| var x = 1; |
| return ((x > 0) ? 41 : 71)|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(41, _WASMEXP_.asmCompileRun(TestConditional.toString())); |
| |
| function TestSwitch() { |
| "use asm" |
| |
| function caller() { |
| var ret = 0; |
| var x = 7; |
| switch (x) { |
| case 1: return 0; |
| case 7: { |
| ret = 12; |
| break; |
| } |
| default: return 0; |
| } |
| switch (x) { |
| case 1: return 0; |
| case 8: return 0; |
| default: ret = (ret + 11)|0; |
| } |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(23, _WASMEXP_.asmCompileRun(TestSwitch.toString())); |
| |
| function TestSwitchFallthrough() { |
| "use asm" |
| |
| function caller() { |
| var x = 17; |
| var ret = 0; |
| switch (x) { |
| case 17: |
| case 14: ret = 39; |
| case 1: ret = (ret + 3)|0; |
| case 4: break; |
| default: ret = (ret + 1)|0; |
| } |
| return ret|0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(42, _WASMEXP_.asmCompileRun(TestSwitchFallthrough.toString())); |
| |
| function TestNestedSwitch() { |
| "use asm" |
| |
| function caller() { |
| var x = 3; |
| var y = -13; |
| switch (x) { |
| case 1: return 0; |
| case 3: { |
| switch (y) { |
| case 2: return 0; |
| case -13: return 43; |
| default: return 0; |
| } |
| } |
| default: return 0; |
| } |
| return 0; |
| } |
| |
| return {caller:caller}; |
| } |
| |
| assertEquals(43, _WASMEXP_.asmCompileRun(TestNestedSwitch.toString())); |
| |
| function TestInitFunctionWithNoGlobals() { |
| "use asm"; |
| function caller() { |
| return 51; |
| } |
| return {caller}; |
| } |
| |
| var module = _WASMEXP_.instantiateModuleFromAsm( |
| TestInitFunctionWithNoGlobals.toString()); |
| module.__init__(); |
| assertEquals(51, module.caller()); |
| |
| function TestExportNameDifferentFromFunctionName() { |
| "use asm"; |
| function caller() { |
| return 55; |
| } |
| return {alt_caller:caller}; |
| } |
| |
| var module = _WASMEXP_.instantiateModuleFromAsm( |
| TestExportNameDifferentFromFunctionName.toString()); |
| module.__init__(); |
| assertEquals(55, module.alt_caller()); |