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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c8fb32cff527d6fbdda8c99cb62fe0c0a08f5904 |
--- /dev/null |
+++ b/test/cctest/wasm/test-run-wasm-asmjs.cc |
@@ -0,0 +1,92 @@ |
+// Copyright 2016 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. |
+ |
+#include <stdint.h> |
+#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" |
+#include "test/cctest/compiler/value-helper.h" |
+#include "test/cctest/wasm/test-signatures.h" |
+#include "test/cctest/wasm/wasm-run-utils.h" |
+ |
+using namespace v8::base; |
+using namespace v8::internal; |
+using namespace v8::internal::compiler; |
+using namespace v8::internal::wasm; |
+ |
+// for even shorter tests. |
+#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_WASM_Int32AsmjsDivS) { |
+ WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
+ BUILD(r, WASM_BINOP(kExprI32AsmjsDivS, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ const int32_t kMin = std::numeric_limits<int32_t>::min(); |
+ CHECK_EQ(0, r.Call(0, 100)); |
+ CHECK_EQ(0, r.Call(100, 0)); |
+ CHECK_EQ(0, r.Call(-1001, 0)); |
+ CHECK_EQ(kMin, r.Call(kMin, -1)); |
+ CHECK_EQ(0, r.Call(kMin, 0)); |
+} |
+ |
+TEST(Run_WASM_Int32AsmjsRemS) { |
+ WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
+ BUILD(r, WASM_BINOP(kExprI32AsmjsRemS, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ const int32_t kMin = std::numeric_limits<int32_t>::min(); |
+ CHECK_EQ(33, r.Call(133, 100)); |
+ CHECK_EQ(0, r.Call(kMin, -1)); |
+ CHECK_EQ(0, r.Call(100, 0)); |
+ CHECK_EQ(0, r.Call(-1001, 0)); |
+ CHECK_EQ(0, r.Call(kMin, 0)); |
+} |
+ |
+TEST(Run_WASM_Int32AsmjsDivU) { |
+ WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
+ BUILD(r, WASM_BINOP(kExprI32AsmjsDivU, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ const int32_t kMin = std::numeric_limits<int32_t>::min(); |
+ CHECK_EQ(0, r.Call(0, 100)); |
+ CHECK_EQ(0, r.Call(kMin, -1)); |
+ CHECK_EQ(0, r.Call(100, 0)); |
+ CHECK_EQ(0, r.Call(-1001, 0)); |
+ CHECK_EQ(0, r.Call(kMin, 0)); |
+} |
+ |
+TEST(Run_WASM_Int32AsmjsRemU) { |
+ WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
+ BUILD(r, WASM_BINOP(kExprI32AsmjsRemU, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
+ const int32_t kMin = std::numeric_limits<int32_t>::min(); |
+ CHECK_EQ(17, r.Call(217, 100)); |
+ CHECK_EQ(0, r.Call(100, 0)); |
+ CHECK_EQ(0, r.Call(-1001, 0)); |
+ CHECK_EQ(0, r.Call(kMin, 0)); |
+ CHECK_EQ(kMin, r.Call(kMin, -1)); |
+} |
+ |
+TEST(Run_Wasm_LoadMemI32_oob_asm) { |
+ TestingModule module; |
+ module.origin = kAsmJsOrigin; |
+ int32_t* memory = module.AddMemoryElems<int32_t>(8); |
+ WasmRunner<int32_t> r(&module, MachineType::Uint32()); |
+ module.RandomizeMemory(1112); |
+ |
+ BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); |
+ |
+ memory[0] = 999999; |
+ CHECK_EQ(999999, r.Call(0u)); |
+ // TODO(titzer): offset 29-31 should also be OOB. |
+ for (uint32_t offset = 32; offset < 40; offset++) { |
+ CHECK_EQ(0, r.Call(offset)); |
+ } |
+ |
+ for (uint32_t offset = 0x80000000; offset < 0x80000010; offset++) { |
+ CHECK_EQ(0, r.Call(offset)); |
+ } |
+} |