diff options
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/multi-value.js')
-rw-r--r-- | deps/v8/test/mjsunit/wasm/multi-value.js | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/multi-value.js b/deps/v8/test/mjsunit/wasm/multi-value.js new file mode 100644 index 0000000000..d6eff16293 --- /dev/null +++ b/deps/v8/test/mjsunit/wasm/multi-value.js @@ -0,0 +1,322 @@ +// Copyright 2017 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: --experimental-wasm-mv + +load("test/mjsunit/wasm/wasm-constants.js"); +load("test/mjsunit/wasm/wasm-module-builder.js"); + +(function MultiBlockResultTest() { + print("MultiBlockResultTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_v = builder.addType(kSig_ii_v); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprBlock, sig_ii_v, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprEnd, + kExprI32Add]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); +})(); + +(function MultiBlockParamTest() { + print("MultiBlockParamTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprBlock, sig_i_ii, + kExprI32Add, + kExprEnd]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); +})(); + +(function MultiBlockBrTest() { + print("MultiBlockBrTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_v = builder.addType(kSig_ii_v); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprBlock, sig_ii_v, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprBr, 0, + kExprEnd, + kExprI32Add]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); +})(); + + +(function MultiLoopResultTest() { + print("MultiLoopResultTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_v = builder.addType(kSig_ii_v); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprLoop, sig_ii_v, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprEnd, + kExprI32Add]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); +})(); + +(function MultiLoopParamTest() { + print("MultiLoopParamTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprLoop, sig_i_ii, + kExprI32Add, + kExprEnd]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); +})(); + +(function MultiLoopBrTest() { + print("MultiLoopBrTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_i = builder.addType(kSig_ii_i); + let sig_ii_ii = builder.addType(kSig_ii_ii); + + builder.addFunction("dup", kSig_ii_i) + .addBody([kExprGetLocal, 0, kExprGetLocal, 0]); + builder.addFunction("swap", kSig_ii_ii) + .addBody([kExprGetLocal, 1, kExprGetLocal, 0]); + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprLoop, sig_ii_ii, + kExprCallFunction, 1, // swap + kExprCallFunction, 0, // dup + kExprI32Add, + kExprCallFunction, 0, // dup + kExprI32Const, 20, + kExprI32LeU, + kExprBrIf, 0, + kExprEnd, + kExprDrop]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(0, instance.exports.main(0, 1)); + assertEquals(16, instance.exports.main(1, 1)); + assertEquals(4, instance.exports.main(3, 1)); + assertEquals(4, instance.exports.main(4, 1)); + assertEquals(0, instance.exports.main(0, 2)); + assertEquals(16, instance.exports.main(1, 2)); + assertEquals(8, instance.exports.main(3, 2)); + assertEquals(8, instance.exports.main(4, 2)); + assertEquals(0, instance.exports.main(0, 3)); + assertEquals(8, instance.exports.main(1, 3)); + assertEquals(12, instance.exports.main(3, 3)); + assertEquals(12, instance.exports.main(4, 3)); + assertEquals(0, instance.exports.main(0, 4)); + assertEquals(8, instance.exports.main(1, 4)); + assertEquals(16, instance.exports.main(3, 4)); + assertEquals(16, instance.exports.main(4, 4)); + assertEquals(3, instance.exports.main(100, 3)); + assertEquals(6, instance.exports.main(3, 100)); +})(); + + +(function MultiIfResultTest() { + print("MultiIfResultTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_v = builder.addType(kSig_ii_v); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprIf, sig_ii_v, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprElse, + kExprGetLocal, 1, + kExprGetLocal, 0, + kExprEnd, + kExprI32Sub]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(8, 3), 5); + assertEquals(instance.exports.main(0, 3), 3); +})(); + +(function MultiIfParamTest() { + print("MultiIfParamTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprGetLocal, 0, + kExprIf, sig_i_ii, + kExprI32Add, + kExprElse, + kExprI32Sub, + kExprEnd]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(1, 4), 5); + assertEquals(instance.exports.main(0, 4), -4); +})(); + +(function MultiIfBrTest() { + print("MultiIfBrTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_ii_v = builder.addType(kSig_ii_v); + + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprIf, sig_ii_v, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprBr, 0, + kExprElse, + kExprGetLocal, 1, + kExprGetLocal, 0, + kExprBr, 0, + kExprEnd, + kExprI32Sub]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(8, 3), 5); + assertEquals(instance.exports.main(0, 3), 3); +})(); + +(function MultiResultTest() { + print("MultiResultTest"); + let builder = new WasmModuleBuilder(); + let sig_i_ii = builder.addType(kSig_i_ii); + let sig_iii_ii = builder.addType(kSig_iii_ii); + + builder.addFunction("callee", kSig_iii_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprI32Sub]); + builder.addFunction("main", kSig_i_ii) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 1, + kExprCallFunction, 0, + kExprI32Mul, + kExprI32Add]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(0, 0), 0); + assertEquals(instance.exports.main(1, 0), 1); + assertEquals(instance.exports.main(2, 0), 2); + assertEquals(instance.exports.main(0, 1), -1); + assertEquals(instance.exports.main(0, 2), -4); + assertEquals(instance.exports.main(3, 4), -1); + assertEquals(instance.exports.main(4, 3), 7); +})(); + +(function MultiReturnTest() { + print("MultiReturnTest"); + let builder = new WasmModuleBuilder(); + let sig_i_i = builder.addType(kSig_i_i); + let sig_ii_i = builder.addType(kSig_ii_i); + + builder.addFunction("callee", kSig_ii_i) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 0, + kExprGetLocal, 0, + kExprI32Add, + kExprReturn]); + builder.addFunction("main", kSig_i_i) + .addBody([ + kExprGetLocal, 0, + kExprCallFunction, 0, + kExprI32Mul]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(0), 0); + assertEquals(instance.exports.main(1), 2); + assertEquals(instance.exports.main(2), 8); + assertEquals(instance.exports.main(10), 200); +})(); + +(function MultiBrReturnTest() { + print("MultiBrReturnTest"); + let builder = new WasmModuleBuilder(); + let sig_i_i = builder.addType(kSig_i_i); + let sig_ii_i = builder.addType(kSig_ii_i); + + builder.addFunction("callee", kSig_ii_i) + .addBody([ + kExprGetLocal, 0, + kExprGetLocal, 0, + kExprGetLocal, 0, + kExprI32Add, + kExprBr, 0]); + builder.addFunction("main", kSig_i_i) + .addBody([ + kExprGetLocal, 0, + kExprCallFunction, 0, + kExprI32Mul]) + .exportAs("main"); + + let module = new WebAssembly.Module(builder.toBuffer()); + let instance = new WebAssembly.Instance(module); + assertEquals(instance.exports.main(0), 0); + assertEquals(instance.exports.main(1), 2); + assertEquals(instance.exports.main(2), 8); + assertEquals(instance.exports.main(10), 200); +})(); |