Index: test/mjsunit/wasm/asm-wasm-expr.js |
diff --git a/test/mjsunit/wasm/asm-wasm-expr.js b/test/mjsunit/wasm/asm-wasm-expr.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b20826fe74e9a07446f24a2a55a791cdaabdf97 |
--- /dev/null |
+++ b/test/mjsunit/wasm/asm-wasm-expr.js |
@@ -0,0 +1,151 @@ |
+// Copyright 2016 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: --validate-asm --allow-natives-syntax |
+ |
+var selectedTest = undefined; |
+//selectedTest = 16; |
+ |
+function skip(a) { |
+ return selectedTest != undefined ? a != selectedTest : false; |
+} |
+ |
+const assign_in_stmt = [ |
+ "if (E) =", |
+ "if (=) E", |
+ "if (E) E; else =", |
+ "for (=; E; S) S", |
+ "for (E; =; S) S", |
+ "for (E; E; =) E", |
+ "for (E; E; E) =", |
+ "do { = } while(E)", |
+ "do { S } while (=)", |
+]; |
+const assign_in_expr = [ |
+ "i32_func(=)", |
+ "(=) ? E : E", |
+ "E ? (=) : E", |
+ "E ? E : (=)", |
+ "(=) + E", |
+ "E + (=)", |
+ "imul(=, E)", |
+ "imul(E, =)", |
+ "~(=)", |
+ "(=) | 0", |
+ "(=), E", |
+ "E, (=)", |
+ "E, E, (=)", |
+ "E, (=), E", |
+ "(=), E, E", |
+]; |
+ |
+const stdlib = { |
+ Math: Math, |
+ Int8Array: Int8Array, |
+ Int16Array: Int16Array, |
+ Int32Array: Int32Array, |
+ Uint8Array: Uint8Array, |
+ Uint16Array: Uint16Array, |
+ Uint32Array: Uint32Array, |
+ Float32Array: Float32Array, |
+ Float64Array: Float64Array, |
+}; |
+ |
+const buffer = new ArrayBuffer(65536); |
+ |
+// Template for a module. |
+function MODULE_TEMPLATE(stdlib, foreign, buffer) { |
+ "use asm"; |
+ var imul = stdlib.Math.imul; |
+ var fround = stdlib.Math.fround; |
+ var M = new stdlib.Int32Array(buffer); |
+ var G = 0; |
+ |
+ function void_func() {} |
+ function i32_func(a) { |
+ a = a | 0; |
+ return a | 0; |
+ } |
+ |
+ FUNC_DECL |
+ return {main: main}; |
+} |
+ |
+// Template for main function. |
+{ |
+ function main(i32, f32, f64) { |
+ i32 = i32 | 0; |
+ f32 = fround(f32); |
+ f64 = +f64; |
+ FUNC_BODY |
+ } |
+} |
+ |
+function RunAsmJsTest(asmfunc, expect) { |
+ var asm_source = asmfunc.toString(); |
+ var nonasm_source = asm_source.replace(new RegExp("use asm"), ""); |
+ |
+ print("Testing " + asmfunc.name + " (js)..."); |
+ var js_module = eval("(" + nonasm_source + ")")(stdlib, {}, buffer); |
+ expect(js_module); |
+ |
+ print("Testing " + asmfunc.name + " (asm.js)..."); |
+ var asm_module = asmfunc(stdlib, {}, buffer); |
+ assertTrue(%IsAsmWasmCode(asmfunc)); |
+ expect(asm_module); |
+} |
+ |
+var test = 0; |
+ |
+function DoTheTests(expr, assign, stmt) { |
+ // ==== Expression assignment tests ======================================== |
+ for (let e of assign_in_expr) { |
+ if (skip(++test)) continue; |
+ var orig = e; |
+ e = e.replace(/=/g, assign); |
+ e = e.replace(/E/g, expr); |
+ e = e.replace(/S/g, stmt); |
+ var str = main.toString().replace("FUNC_BODY", "return (" + e + ") | 0;"); |
+ var asm_source = MODULE_TEMPLATE.toString().replace("FUNC_DECL", str); |
+ // TODO(titzer): a verbosity API for these kinds of tests? |
+ // print(asm_source); |
+ |
+ doTest(asm_source, "(" + test + ") " + e); |
+ } |
+ |
+ // ==== Statement assignment tests ========================================= |
+ for (let e of assign_in_stmt) { |
+ if (skip(++test)) continue; |
+ var orig = e; |
+ e = e.replace(/=/g, assign); |
+ e = e.replace(/E/g, expr); |
+ e = e.replace(/S/g, stmt); |
+ var str = main.toString().replace("FUNC_BODY", e + "; return 0;"); |
+ var asm_source = MODULE_TEMPLATE.toString().replace("FUNC_DECL", str); |
+// print(asm_source); |
+ |
+ doTest(asm_source, "(" + test + ") " + e); |
+ } |
+ |
+ function doTest(asm_source, orig) { |
+ var nonasm_source = asm_source.replace(new RegExp("use asm"), ""); |
+ print("Testing JS: " + orig); |
+ var js_module = eval("(" + nonasm_source + ")")(stdlib, {}, buffer); |
+ expect(js_module); |
+ |
+ var asmfunc = eval("(" + asm_source + ")"); |
+ |
+ print("Testing ASMJS: " + orig); |
+ var asm_module = asmfunc(stdlib, {}, buffer); |
+ assertTrue(%IsAsmWasmCode(asmfunc)); |
+ expect(asm_module); |
+ } |
+ |
+ function expect(module) { module.main(0, 0, 0); print(" ok"); return true; } |
+} |
+ |
+DoTheTests("(i32 | 0)", "i32 = 0", "void_func()"); |
+DoTheTests("G", "G = 0", "void_func()"); |
+DoTheTests("G", "G = 0", "G"); |
+DoTheTests("(M[0] | 0)", "M[0] = 0", "void_func()"); |