Index: test/cctest/wasm/test-run-wasm.cc |
diff --git a/test/cctest/wasm/test-run-wasm.cc b/test/cctest/wasm/test-run-wasm.cc |
index 36a211e83f9317e6b1d4d4f65d6c8be68b6a6636..0db24e80a2aad98bb0d05cb51eff2874ab5a6aac 100644 |
--- a/test/cctest/wasm/test-run-wasm.cc |
+++ b/test/cctest/wasm/test-run-wasm.cc |
@@ -6,6 +6,8 @@ |
#include <stdlib.h> |
#include <string.h> |
+#include "src/base/platform/elapsed-timer.h" |
+ |
#include "src/wasm/wasm-macro-gen.h" |
#include "test/cctest/cctest.h" |
@@ -19,10 +21,10 @@ using namespace v8::internal::compiler; |
using namespace v8::internal::wasm; |
// for even shorter tests. |
-#define B2(a, b) kExprBlock, 2, a, b |
-#define B1(a) kExprBlock, 1, a |
-#define RET(x) kExprReturn, x |
-#define RET_I8(x) kExprReturn, kExprI8Const, x |
+#define B2(a, b) kExprBlock, a, b, kExprEnd |
+#define B1(a) kExprBlock, a, kExprEnd |
+#define RET(x) x, kExprReturn, 1 |
+#define RET_I8(x) kExprI8Const, x, kExprReturn, 1 |
TEST(Run_WasmInt8Const) { |
WasmRunner<int32_t> r; |
@@ -686,6 +688,25 @@ TEST(Run_Wasm_IfElse_P) { |
} |
} |
+TEST(Run_Wasm_If_chain) { |
+ WasmRunner<int32_t> r(MachineType::Int32()); |
+ // if (p0) 13; if (p0) 14; 15 |
+ BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_I8(13)), |
+ WASM_IF(WASM_GET_LOCAL(0), WASM_I8(14)), WASM_I8(15)); |
+ FOR_INT32_INPUTS(i) { CHECK_EQ(15, r.Call(*i)); } |
+} |
+ |
+TEST(Run_Wasm_If_chain_set) { |
+ WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
+ // if (p0) p1 = 73; if (p0) p1 = 74; p1 |
+ BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(1, WASM_I8(73))), |
+ WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(1, WASM_I8(74))), |
+ WASM_GET_LOCAL(1)); |
+ FOR_INT32_INPUTS(i) { |
+ int32_t expected = *i ? 74 : *i; |
+ CHECK_EQ(expected, r.Call(*i, *i)); |
+ } |
+} |
TEST(Run_Wasm_IfElse_Unreachable1) { |
WasmRunner<int32_t> r; |
@@ -1073,7 +1094,7 @@ TEST(Run_Wasm_Block_If_P) { |
// { if (p0) return 51; return 52; } |
BUILD(r, B2( // -- |
WASM_IF(WASM_GET_LOCAL(0), // -- |
- WASM_BRV(0, WASM_I8(51))), // -- |
+ WASM_BRV(1, WASM_I8(51))), // -- |
WASM_I8(52))); // -- |
FOR_INT32_INPUTS(i) { |
int32_t expected = *i ? 51 : 52; |
@@ -1174,7 +1195,7 @@ TEST(Run_Wasm_CountDown) { |
WASM_BLOCK( |
2, WASM_LOOP( |
1, WASM_IF(WASM_GET_LOCAL(0), |
- WASM_BRV(0, WASM_SET_LOCAL( |
+ WASM_BRV(1, WASM_SET_LOCAL( |
0, WASM_I32_SUB(WASM_GET_LOCAL(0), |
WASM_I8(1)))))), |
WASM_GET_LOCAL(0))); |
@@ -1188,7 +1209,7 @@ TEST(Run_Wasm_CountDown_fallthru) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
BUILD(r, |
WASM_BLOCK( |
- 2, WASM_LOOP(3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), WASM_BREAK(0)), |
+ 2, WASM_LOOP(3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), WASM_BREAK(1)), |
WASM_SET_LOCAL( |
0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), |
WASM_CONTINUE(0)), |
@@ -1214,7 +1235,7 @@ TEST(Run_Wasm_WhileCountDown) { |
TEST(Run_Wasm_Loop_if_break1) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
- BUILD(r, B2(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(0)), |
+ BUILD(r, B2(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)), |
WASM_SET_LOCAL(0, WASM_I8(99))), |
WASM_GET_LOCAL(0))); |
CHECK_EQ(99, r.Call(0)); |
@@ -1247,6 +1268,23 @@ TEST(Run_Wasm_Loop_if_break_fallthru) { |
CHECK_EQ(-22, r.Call(-22)); |
} |
+TEST(Run_Wasm_IfBreak1) { |
+ WasmRunner<int32_t> r(MachineType::Int32()); |
+ BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SEQ(WASM_BR(0), WASM_UNREACHABLE)), |
+ WASM_I8(91)); |
+ CHECK_EQ(91, r.Call(0)); |
+ CHECK_EQ(91, r.Call(1)); |
+ CHECK_EQ(91, r.Call(-8734)); |
+} |
+ |
+TEST(Run_Wasm_IfBreak2) { |
+ WasmRunner<int32_t> r(MachineType::Int32()); |
+ BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SEQ(WASM_BR(0), RET_I8(77))), |
+ WASM_I8(81)); |
+ CHECK_EQ(81, r.Call(0)); |
+ CHECK_EQ(81, r.Call(1)); |
+ CHECK_EQ(81, r.Call(-8734)); |
+} |
TEST(Run_Wasm_LoadMemI32) { |
TestingModule module; |
@@ -1528,10 +1566,10 @@ TEST(Run_Wasm_CheckMachIntsZero) { |
module.AddMemoryElems<uint32_t>(kNumElems); |
WasmRunner<uint32_t> r(&module, MachineType::Int32()); |
- BUILD(r, kExprBlock, 2, kExprLoop, 1, kExprIf, kExprGetLocal, 0, kExprBr, 0, |
- kExprIfElse, kExprI32LoadMem, ZERO_ALIGNMENT, ZERO_OFFSET, |
- kExprGetLocal, 0, kExprBr, 2, kExprI8Const, 255, kExprSetLocal, 0, |
- kExprI32Sub, kExprGetLocal, 0, kExprI8Const, 4, kExprI8Const, 0); |
+ BUILD(r, kExprLoop, kExprGetLocal, 0, kExprIf, kExprGetLocal, 0, |
+ kExprI32LoadMem, 0, 0, kExprIf, kExprI8Const, 255, kExprReturn, ARITY_1, |
+ kExprEnd, kExprGetLocal, 0, kExprI8Const, 4, kExprI32Sub, kExprSetLocal, |
+ 0, kExprBr, ARITY_1, DEPTH_0, kExprEnd, kExprEnd, kExprI8Const, 0); |
module.BlankMemory(); |
CHECK_EQ(0, r.Call((kNumElems - 1) * 4)); |
@@ -1695,7 +1733,7 @@ TEST(Run_Wasm_Infinite_Loop_not_taken1) { |
TEST(Run_Wasm_Infinite_Loop_not_taken2) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
- BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(45)), |
+ BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(45)), |
WASM_INFINITE_LOOP))); |
// Run the code, but don't go into the infinite loop. |
CHECK_EQ(45, r.Call(1)); |
@@ -1726,14 +1764,13 @@ static void TestBuildGraphForSimpleExpression(WasmOpcode opcode) { |
FunctionSig* sig = WasmOpcodes::Signature(opcode); |
if (sig->parameter_count() == 1) { |
- byte code[] = {WASM_NO_LOCALS, static_cast<byte>(opcode), kExprGetLocal, 0}; |
+ byte code[] = {WASM_NO_LOCALS, kExprGetLocal, 0, static_cast<byte>(opcode)}; |
TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code, |
code + arraysize(code)); |
} else { |
CHECK_EQ(2, sig->parameter_count()); |
- byte code[] = {WASM_NO_LOCALS, static_cast<byte>(opcode), |
- kExprGetLocal, 0, |
- kExprGetLocal, 1}; |
+ byte code[] = {WASM_NO_LOCALS, kExprGetLocal, 0, kExprGetLocal, 1, |
+ static_cast<byte>(opcode)}; |
TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code, |
code + arraysize(code)); |
} |
@@ -1982,8 +2019,8 @@ TEST(Run_WasmCallF32StackParameter) { |
// Build the calling function. |
WasmRunner<float> r(&module); |
- BUILD(r, WASM_CALL_FUNCTION( |
- index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f), |
+ BUILD(r, WASM_CALL_FUNCTIONN( |
+ 19, index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f), |
WASM_F32(8.0f), WASM_F32(16.0f), WASM_F32(32.0f), |
WASM_F32(64.0f), WASM_F32(128.0f), WASM_F32(256.0f), |
WASM_F32(1.5f), WASM_F32(2.5f), WASM_F32(4.5f), WASM_F32(8.5f), |
@@ -2007,13 +2044,13 @@ TEST(Run_WasmCallF64StackParameter) { |
// Build the calling function. |
WasmRunner<double> r(&module); |
- BUILD(r, WASM_CALL_FUNCTION(index, WASM_F64(1.0), WASM_F64(2.0), |
- WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0), |
- WASM_F64(32.0), WASM_F64(64.0), WASM_F64(128.0), |
- WASM_F64(256.0), WASM_F64(1.5), WASM_F64(2.5), |
- WASM_F64(4.5), WASM_F64(8.5), WASM_F64(16.5), |
- WASM_F64(32.5), WASM_F64(64.5), WASM_F64(128.5), |
- WASM_F64(256.5), WASM_F64(512.5))); |
+ BUILD(r, WASM_CALL_FUNCTIONN(19, index, WASM_F64(1.0), WASM_F64(2.0), |
+ WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0), |
+ WASM_F64(32.0), WASM_F64(64.0), WASM_F64(128.0), |
+ WASM_F64(256.0), WASM_F64(1.5), WASM_F64(2.5), |
+ WASM_F64(4.5), WASM_F64(8.5), WASM_F64(16.5), |
+ WASM_F64(32.5), WASM_F64(64.5), WASM_F64(128.5), |
+ WASM_F64(256.5), WASM_F64(512.5))); |
float result = r.Call(); |
CHECK_EQ(256.5, result); |
@@ -2054,7 +2091,7 @@ TEST(Run_WasmCall_Int32Add) { |
// Build the caller function. |
WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32()); |
- BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
FOR_INT32_INPUTS(i) { |
FOR_INT32_INPUTS(j) { |
@@ -2076,7 +2113,7 @@ TEST(Run_WasmCall_Float32Sub) { |
// Builder the caller function. |
WasmRunner<float> r(&module, MachineType::Float32(), MachineType::Float32()); |
- BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
FOR_FLOAT32_INPUTS(i) { |
FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, r.Call(*i, *j)); } |
@@ -2165,23 +2202,30 @@ static void Run_WasmMixedCall_N(int start) { |
// Build the calling function. |
// ========================================================================= |
WasmRunner<int32_t> r(&module); |
- |
std::vector<byte> code; |
- ADD_CODE(code, |
- static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), |
- ZERO_ALIGNMENT, ZERO_OFFSET); |
+ |
+ // Load the offset for the store. |
ADD_CODE(code, WASM_ZERO); |
- ADD_CODE(code, kExprCallFunction, static_cast<byte>(index)); |
+ // Load the arguments. |
for (int i = 0; i < num_params; i++) { |
int offset = (i + 1) * kElemSize; |
ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); |
} |
+ // Call the selector function. |
+ ADD_CODE(code, kExprCallFunction, static_cast<byte>(num_params), |
+ static_cast<byte>(index)); |
+ |
+ // Store the result in memory. |
+ ADD_CODE(code, |
+ static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), |
+ ZERO_ALIGNMENT, ZERO_OFFSET); |
+ |
+ // Return the expected value. |
ADD_CODE(code, WASM_I32V_2(kExpected)); |
- size_t end = code.size(); |
- code.push_back(0); |
- r.Build(&code[0], &code[end]); |
+ |
+ r.Build(&code[0], &code[0] + code.size()); |
// Run the code. |
for (int t = 0; t < 10; t++) { |
@@ -2216,10 +2260,10 @@ TEST(Run_Wasm_AddCall) { |
byte local = r.AllocateLocal(kAstI32); |
BUILD(r, B2(WASM_SET_LOCAL(local, WASM_I8(99)), |
WASM_I32_ADD( |
- WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(0), |
- WASM_GET_LOCAL(0)), |
- WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(1), |
- WASM_GET_LOCAL(local))))); |
+ WASM_CALL_FUNCTION2(t1.function_index_, WASM_GET_LOCAL(0), |
+ WASM_GET_LOCAL(0)), |
+ WASM_CALL_FUNCTION2(t1.function_index_, WASM_GET_LOCAL(1), |
+ WASM_GET_LOCAL(local))))); |
CHECK_EQ(198, r.Call(0)); |
CHECK_EQ(200, r.Call(1)); |
@@ -2230,7 +2274,7 @@ TEST(Run_Wasm_CountDown_expr) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
BUILD(r, WASM_LOOP( |
3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), |
- WASM_BREAKV(0, WASM_GET_LOCAL(0))), |
+ WASM_BREAKV(1, WASM_GET_LOCAL(0))), |
WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), |
WASM_CONTINUE(0))); |
CHECK_EQ(0, r.Call(1)); |
@@ -2241,7 +2285,7 @@ TEST(Run_Wasm_CountDown_expr) { |
TEST(Run_Wasm_ExprBlock2a) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
- BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(1))); |
+ BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(1))), WASM_I8(1))); |
CHECK_EQ(1, r.Call(0)); |
CHECK_EQ(1, r.Call(1)); |
} |
@@ -2249,7 +2293,7 @@ TEST(Run_Wasm_ExprBlock2a) { |
TEST(Run_Wasm_ExprBlock2b) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
- BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(2))); |
+ BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(1))), WASM_I8(2))); |
CHECK_EQ(2, r.Call(0)); |
CHECK_EQ(1, r.Call(1)); |
} |
@@ -2274,15 +2318,15 @@ TEST(Run_Wasm_ExprBlock2d) { |
TEST(Run_Wasm_ExprBlock_ManualSwitch) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
BUILD(r, WASM_BLOCK(6, WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(1)), |
- WASM_BRV(0, WASM_I8(11))), |
+ WASM_BRV(1, WASM_I8(11))), |
WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(2)), |
- WASM_BRV(0, WASM_I8(12))), |
+ WASM_BRV(1, WASM_I8(12))), |
WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(3)), |
- WASM_BRV(0, WASM_I8(13))), |
+ WASM_BRV(1, WASM_I8(13))), |
WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(4)), |
- WASM_BRV(0, WASM_I8(14))), |
+ WASM_BRV(1, WASM_I8(14))), |
WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(5)), |
- WASM_BRV(0, WASM_I8(15))), |
+ WASM_BRV(1, WASM_I8(15))), |
WASM_I8(99))); |
CHECK_EQ(99, r.Call(0)); |
CHECK_EQ(11, r.Call(1)); |
@@ -2338,7 +2382,7 @@ TEST(Run_Wasm_ExprBlock_if) { |
WasmRunner<int32_t> r(MachineType::Int32()); |
BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(11)), |
- WASM_BRV(0, WASM_I8(14))))); |
+ WASM_BRV(1, WASM_I8(14))))); |
CHECK_EQ(11, r.Call(1)); |
CHECK_EQ(14, r.Call(0)); |
@@ -2352,10 +2396,9 @@ TEST(Run_Wasm_ExprBlock_nested_ifs) { |
1, WASM_IF_ELSE( |
WASM_GET_LOCAL(0), |
WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(11)), |
- WASM_BRV(0, WASM_I8(12))), |
+ WASM_BRV(1, WASM_I8(12))), |
WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(13)), |
- WASM_BRV(0, WASM_I8(14)))))); |
- |
+ WASM_BRV(1, WASM_I8(14)))))); |
CHECK_EQ(11, r.Call(1, 1)); |
CHECK_EQ(12, r.Call(1, 0)); |
@@ -2371,10 +2414,9 @@ TEST(Run_Wasm_ExprLoop_nested_ifs) { |
1, WASM_IF_ELSE( |
WASM_GET_LOCAL(0), |
WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(11)), |
- WASM_BRV(1, WASM_I8(12))), |
+ WASM_BRV(3, WASM_I8(12))), |
WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(13)), |
- WASM_BRV(1, WASM_I8(14)))))); |
- |
+ WASM_BRV(3, WASM_I8(14)))))); |
CHECK_EQ(11, r.Call(1, 1)); |
CHECK_EQ(12, r.Call(1, 0)); |
@@ -2382,7 +2424,6 @@ TEST(Run_Wasm_ExprLoop_nested_ifs) { |
CHECK_EQ(14, r.Call(0, 0)); |
} |
- |
TEST(Run_Wasm_SimpleCallIndirect) { |
TestSignatures sigs; |
TestingModule module; |
@@ -2407,7 +2448,7 @@ TEST(Run_Wasm_SimpleCallIndirect) { |
// Builder the caller function. |
WasmRunner<int32_t> r(&module, MachineType::Int32()); |
- BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); |
+ BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); |
CHECK_EQ(88, r.Call(0)); |
CHECK_EQ(44, r.Call(1)); |
@@ -2440,11 +2481,11 @@ TEST(Run_Wasm_MultipleCallIndirect) { |
// Builder the caller function. |
WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32(), |
MachineType::Int32()); |
- BUILD(r, |
- WASM_I32_ADD(WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), |
- WASM_GET_LOCAL(2)), |
- WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2), |
- WASM_GET_LOCAL(0)))); |
+ BUILD(r, WASM_I32_ADD( |
+ WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), |
+ WASM_GET_LOCAL(2)), |
+ WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2), |
+ WASM_GET_LOCAL(0)))); |
CHECK_EQ(5, r.Call(0, 1, 2)); |
CHECK_EQ(19, r.Call(0, 1, 9)); |
@@ -2472,7 +2513,7 @@ TEST(Run_Wasm_CallIndirect_NoTable) { |
// Builder the caller function. |
WasmRunner<int32_t> r(&module, MachineType::Int32()); |
- BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); |
+ BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); |
CHECK_TRAP(r.Call(0)); |
CHECK_TRAP(r.Call(1)); |
@@ -2793,11 +2834,11 @@ void CompileCallIndirectMany(LocalType param) { |
WasmFunctionCompiler t(sig, &module); |
std::vector<byte> code; |
- ADD_CODE(code, kExprCallIndirect, 1); |
ADD_CODE(code, kExprI8Const, 0); |
for (byte p = 0; p < num_params; p++) { |
ADD_CODE(code, kExprGetLocal, p); |
} |
+ ADD_CODE(code, kExprCallIndirect, static_cast<byte>(num_params), 1); |
t.Build(&code[0], &code[0] + code.size()); |
t.Compile(); |