Index: test/mjsunit/wasm/asm-wasm.js |
diff --git a/test/mjsunit/wasm/asm-wasm.js b/test/mjsunit/wasm/asm-wasm.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8a803cdcd4616982e15a82020199df9e03d1bcdf |
--- /dev/null |
+++ b/test/mjsunit/wasm/asm-wasm.js |
@@ -0,0 +1,559 @@ |
+// 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. |
+ |
+function IntTest() { |
+ "use asm"; |
+ function sum(a, b) { |
+ a = a|0; |
+ b = b|0; |
+ var c = (b + 1)|0 |
+ return (a + c + 1)|0; |
+ } |
+ |
+ function caller() { |
+ return sum(77,22) | 0; |
+ } |
+ |
+ return {caller: caller}; |
+} |
+ |
+assertEquals(101, WASM.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, WASM.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() { |
+ WASM.asmCompileRun(BadModule.toString()) |
+}); |
+ |
+function TestReturnInBlock() { |
+ "use asm"; |
+ |
+ function caller() { |
+ if(1) { |
+ { |
+ { |
+ return 1; |
+ } |
+ } |
+ } |
+ return 0; |
+ } |
+ |
+ return {caller: caller}; |
+} |
+ |
+assertEquals(1, WASM.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, WASM.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, WASM.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, WASM.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, WASM.asmCompileRun(TestReturnInWhileWithoutBraces.toString())); |
+ |
+function TestBreakInWhile() { |
+ "use asm"; |
+ |
+ function caller() { |
+ while(1) { |
+ break; |
+ } |
+ return 8; |
+ } |
+ |
+ return {caller: caller}; |
+} |
+ |
+assertEquals(8, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.asmCompileRun(TestContinueInNamedWhile.toString())); |
+ |
+function TestNot() { |
+ "use asm"; |
+ |
+ function caller() { |
+ var a = !(2 > 3); |
+ return a | 0; |
+ } |
+ |
+ return {caller:caller}; |
+} |
+ |
+assertEquals(1, WASM.asmCompileRun(TestNot.toString())); |
+ |
+function TestNotEquals() { |
+ "use asm"; |
+ |
+ function caller() { |
+ var a = 3; |
+ if (a != 2) { |
+ return 21; |
+ } |
+ return 0; |
+ } |
+ |
+ return {caller:caller}; |
+} |
+ |
+assertEquals(21, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.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, WASM.asmCompileRun(TestModDoubleNegative.toString())); |
+*/ |
+ |
+function TestGlobals() { |
+ "use asm"; |
+ |
+ var a = 0.0; |
+ var b = 0.0; |
+ var c = 0.0; |
+ |
+ function add() { |
+ c = a + b; |
+ } |
+ |
+ function caller() { |
+ a = 23.75; |
+ b = 7.75; |
+ add(); |
+ return (~~c)|0; |
+ } |
+ |
+ return {caller:caller}; |
+} |
+ |
+assertEquals(31, WASM.asmCompileRun(TestGlobals.toString())); |
+ |
+function TestGlobalsWithInit() { |
+ "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 = WASM.instantiateModuleFromAsm(TestGlobalsWithInit.toString()); |
+module.init(); |
+assertEquals(77.5, module.add()); |