| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- /* global assert,testRunner */ // eslint rule
- WScript.Flag("-WasmSignExtends");
- WScript.Flag("-WasmI64");
- WScript.LoadScriptFile("../UnitTestFramework/UnitTestFramework.js");
- function makeCSETest(type, op1, op2, tests) {
- return {
- name: op2 ? `${type}.${op1}/${type}.${op2} no cse` : `${type}.${op1} cse`,
- body() {
- const buf = WebAssembly.wabt.convertWast2Wasm(`
- (module
- (func (export "func") (param $x ${type}) (result ${type})
- (${type}.sub
- (${type}.${op1} (get_local $x))
- (${type}.${op2 || op1} (get_local $x))
- )
- )
- )`);
- const mod = new WebAssembly.Module(buf);
- const {exports: {func}} = new WebAssembly.Instance(mod);
- const name = op2 ? `${op1}/${op2}` : op1;
- const assertion = op2 ? assert.areNotEqual : assert.areEqual;
- let j = 0;
- for (let i = 0; i < tests.length * 10; ++i) {
- const input = tests[j++ % tests.length];
- const result = func(input);
- if (type === "i64") {
- assertion(0, result.low|0, `${type}.${name}(0x${input.toString(16)}) = 0x${(result.low|0).toString(16)} low`);
- if (!op2) {
- assertion(0, result.high|0, `${type}.${name}(0x${input.toString(16)}) = 0x${(result.high|0).toString(16)} high`);
- }
- } else {
- assertion(0, result|0, `${type}.${name}(0x${input.toString(16)})`);
- }
- }
- }
- };
- }
- const tests = [
- makeCSETest("i32", "extend8_s" , null, [0xFF, 1, 0x1FF]),
- makeCSETest("i32", "extend16_s", null, [0xFF, 1, 0xFFFF, 0x1FFFF]),
- makeCSETest("i64", "extend8_s" , null, [0xFF, 1, 0x1FF]),
- makeCSETest("i64", "extend16_s", null, [0xFF, 1, 0xFFFF, 0x1FFFF]),
- makeCSETest("i64", "extend32_s", null, [0xFF, 1, 0xFFFF, 0xFFFFFFFF, {low: 0xFFFFFFFF, high: 1}]),
- makeCSETest("i32", "extend8_s" , "extend16_s", [0xFF, 0x1FF, 0xFF4F, 0x1FF4F]),
- makeCSETest("i32", "extend16_s", "extend8_s" , [0xFF, 0x1FF, 0xFF4F, 0x1FF4F]),
- makeCSETest("i64", "extend8_s" , "extend16_s", [0xFF, 0x1FF, 0xFF4F, 0x1FF4F]),
- makeCSETest("i64", "extend8_s" , "extend32_s", [0xFF, 0x1FF, 0xFF4F, 0x1FF4F]),
- makeCSETest("i64", "extend16_s", "extend8_s" , [0xFF, 0xFF4F, 0x1FF4F]),
- makeCSETest("i64", "extend16_s", "extend32_s", [0xFFFF, 0x14FFF]),
- makeCSETest("i64", "extend32_s", "extend8_s" , [0xFF, 0xFF4F, 0xFFF4FFFF, {low: 0x4FFFFFFF, high: 1}]),
- makeCSETest("i64", "extend32_s", "extend16_s", [0xFF4F, 0xFFF4FFFF, {low: 0x4FFFFFFF, high: 1}]),
- ];
- WScript.LoadScriptFile("../UnitTestFramework/yargs.js");
- const argv = yargsParse(WScript.Arguments, {
- boolean: ["verbose"],
- number: ["start", "end"],
- default: {
- verbose: true,
- start: 0,
- end: tests.length
- }
- }).argv;
- const todoTests = tests
- .slice(argv.start, argv.end);
- testRunner.run(todoTests, {verbose: argv.verbose});
|