// 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(=) | 0", "(=) ? 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); 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); 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); print("Testing ASMJS: " + orig); var asmfunc = eval("(" + asm_source + ")"); 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()");