| // 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()"); |