28392ab196
[0xC] Convert to stack machine semantics. [0xC] Use section codes instead of names. [0xC] Add elements section decoding. [0xC] Decoding of globals section. [0xC] Decoding of memory section. [0xC] Decoding of imports section. [0xC] Decoding of exports section. [0xC] Decoding of data section. [0xC] Remove CallImport bytecode. [0xC] Function bodies have an implicit block. [0xC] Remove the bottom label from loops. [0xC] Add signatures to blocks. [0xC] Remove arities from branches. Add tests for init expression decoding. Rework compilation of import wrappers and how they are patched. Rework function indices in debugging. Fix ASM->WASM builder for stack machine. Reorganize asm.js foreign functions due to import indices change. R=ahaas@chromium.org,rossberg@chromium.org,bradnelson@chromium.org BUG=chromium:575167 LOG=Y Committed: https://crrev.com/76eb976a67273b8c03c744f64ad850b0432554b9 Review-Url: https://codereview.chromium.org/2345593003 Cr-Original-Commit-Position: refs/heads/master@{#39678} Cr-Commit-Position: refs/heads/master@{#39795}
152 lines
3.8 KiB
JavaScript
152 lines
3.8 KiB
JavaScript
// 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()");
|