summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/multi-value.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/multi-value.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/multi-value.js322
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);
+})();