Index: test/cctest/wasm/test-run-wasm-asmjs.cc |
diff --git a/test/cctest/wasm/test-run-wasm-asmjs.cc b/test/cctest/wasm/test-run-wasm-asmjs.cc |
index 30de588a062e45344ab0f313c380f4853d602841..0fe7faeb99e76818b48372136a509e70c18dad93 100644 |
--- a/test/cctest/wasm/test-run-wasm-asmjs.cc |
+++ b/test/cctest/wasm/test-run-wasm-asmjs.cc |
@@ -26,6 +26,17 @@ using namespace v8::internal::wasm; |
#define RET(x) x, kExprReturn, 1 |
#define RET_I8(x) kExprI8Const, x, kExprReturn, 1 |
+namespace { |
+uint32_t GetMatchingRelocInfoCount(Handle<Code> code, RelocInfo::Mode rmode) { |
+ int filter = 1 << rmode; |
+ uint32_t ret = 0; |
+ for (RelocIterator it(*code, filter); !it.done(); it.next()) { |
+ ++ret; |
+ } |
+ return ret; |
+} |
+} |
+ |
WASM_EXEC_TEST(Int32AsmjsDivS) { |
WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), |
MachineType::Int32()); |
@@ -197,3 +208,77 @@ WASM_EXEC_TEST(StoreMemI32_oob_asm) { |
CHECK_EQ(7777, r.Call(offset, 7777)); |
} |
} |
+ |
+#define FOREACH_INT_CHECKED_LOAD_OP(TEST_BODY) \ |
+ TEST_BODY(kExprI32AsmjsLoadMem8S) \ |
+ TEST_BODY(kExprI32AsmjsLoadMem8U) \ |
+ TEST_BODY(kExprI32AsmjsLoadMem16S) \ |
+ TEST_BODY(kExprI32AsmjsLoadMem16U) \ |
+ TEST_BODY(kExprI32AsmjsLoadMem) |
+ |
+#define FOREACH_INT_CHECKED_STORE_OP(TEST_BODY) \ |
+ TEST_BODY(kExprI32AsmjsStoreMem8) \ |
+ TEST_BODY(kExprI32AsmjsStoreMem16) \ |
+ TEST_BODY(kExprI32AsmjsStoreMem) |
+ |
+#define INT_LOAD_TEST(OP_TYPE) \ |
+ TEST(RunWasm_AsmCheckedRelocInfo##OP_TYPE) { \ |
+ TestingModule module(kExecuteCompiled); \ |
+ WasmRunner<int32_t> r(&module, MachineType::Uint32()); \ |
+ BUILD(r, WASM_UNOP(OP_TYPE, WASM_GET_LOCAL(0))); \ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], \ |
+ RelocInfo::WASM_MEMORY_REFERENCE)); \ |
+ } |
+ |
+FOREACH_INT_CHECKED_LOAD_OP(INT_LOAD_TEST) |
+ |
+#define INT_STORE_TEST(OP_TYPE) \ |
+ TEST(RunWasm_AsmCheckedRelocInfo##OP_TYPE) { \ |
+ TestingModule module(kExecuteCompiled); \ |
+ WasmRunner<int32_t> r(&module, MachineType::Uint32(), \ |
+ MachineType::Uint32()); \ |
+ BUILD(r, WASM_BINOP(OP_TYPE, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); \ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], \ |
+ RelocInfo::WASM_MEMORY_REFERENCE)); \ |
+ } |
+ |
+FOREACH_INT_CHECKED_STORE_OP(INT_STORE_TEST) |
+ |
+TEST(RunWasm_AsmCheckedLoadFloat32RelocInfo) { |
+ TestingModule module(kExecuteCompiled); |
+ WasmRunner<float_t> r(&module, MachineType::Uint32()); |
+ BUILD(r, WASM_UNOP(kExprF32AsmjsLoadMem, WASM_GET_LOCAL(0))); |
+ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], |
+ RelocInfo::WASM_MEMORY_REFERENCE)); |
+} |
+ |
+TEST(RunWasm_AsmCheckedStoreFloat32RelocInfo) { |
+ TestingModule module(kExecuteCompiled); |
+ WasmRunner<float_t> r(&module, MachineType::Uint32(), MachineType::Float32()); |
+ BUILD(r, WASM_BINOP(kExprF32AsmjsStoreMem, WASM_GET_LOCAL(0), |
+ WASM_GET_LOCAL(1))); |
+ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], |
+ RelocInfo::WASM_MEMORY_REFERENCE)); |
+} |
+ |
+TEST(RunWasm_AsmCheckedLoadFloat64RelocInfo) { |
+ TestingModule module(kExecuteCompiled); |
+ WasmRunner<double_t> r(&module, MachineType::Uint32()); |
+ BUILD(r, WASM_UNOP(kExprF64AsmjsLoadMem, WASM_GET_LOCAL(0))); |
+ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], |
+ RelocInfo::WASM_MEMORY_REFERENCE)); |
+} |
+ |
+TEST(RunWasm_AsmCheckedStoreFloat64RelocInfo) { |
+ TestingModule module(kExecuteCompiled); |
+ WasmRunner<double_t> r(&module, MachineType::Uint32(), |
+ MachineType::Float64()); |
+ BUILD(r, WASM_BINOP(kExprF64AsmjsStoreMem, WASM_GET_LOCAL(0), |
+ WASM_GET_LOCAL(1))); |
+ |
+ CHECK_EQ(1, GetMatchingRelocInfoCount(module.instance->function_code[0], |
+ RelocInfo::WASM_MEMORY_REFERENCE)); |
+} |