| Index: test/cctest/wasm/test-run-wasm-64.cc
|
| diff --git a/test/cctest/wasm/test-run-wasm-64.cc b/test/cctest/wasm/test-run-wasm-64.cc
|
| index 6f879641e69c80232f23ed49a7476dac56a611d2..1ba12fc2c054085208a9168d6181d43810776d87 100644
|
| --- a/test/cctest/wasm/test-run-wasm-64.cc
|
| +++ b/test/cctest/wasm/test-run-wasm-64.cc
|
| @@ -12,10 +12,15 @@
|
| #include "test/cctest/compiler/value-helper.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;
|
| +#define CHECK_TRAP32(x) \
|
| + CHECK_EQ(0xdeadbeef, (bit_cast<uint32_t>(x)) & 0xFFFFFFFF)
|
| +#define CHECK_TRAP64(x) \
|
| + CHECK_EQ(0xdeadbeefdeadbeef, (bit_cast<uint64_t>(x)) & 0xFFFFFFFFFFFFFFFF)
|
| +#define CHECK_TRAP(x) CHECK_TRAP32(x)
|
| +
|
| +#define asi64(x) static_cast<int64_t>(x)
|
| +
|
| +#define asu64(x) static_cast<uint64_t>(x)
|
|
|
| // todo(ahaas): I added a list of missing instructions here to make merging
|
| // easier when I do them one by one.
|
| @@ -23,9 +28,134 @@
|
| // kExprI64Sub:
|
| // kExprI64Mul:
|
| // kExprI64DivS:
|
| +
|
| +TEST(Run_WasmI64DivS) {
|
| + WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
|
| + BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + FOR_INT64_INPUTS(i) {
|
| + FOR_INT64_INPUTS(j) {
|
| + if (*j == 0) {
|
| + CHECK_TRAP64(r.Call(*i, *j));
|
| + } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) {
|
| + CHECK_TRAP64(r.Call(*i, *j));
|
| + } else {
|
| + CHECK_EQ(*i / *j, r.Call(*i, *j));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(Run_WasmI64DivS_Trap) {
|
| + WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
|
| + BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + CHECK_EQ(0, r.Call(asi64(0), asi64(100)));
|
| + CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
|
| + CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
|
| + CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
|
| + CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
|
| +}
|
| +
|
| +TEST(Run_WasmI64DivS_Byzero_Const) {
|
| + for (int8_t denom = -2; denom < 8; denom++) {
|
| + WasmRunner<int64_t> r(MachineType::Int64());
|
| + BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
|
| + for (int64_t val = -7; val < 8; val++) {
|
| + if (denom == 0) {
|
| + CHECK_TRAP64(r.Call(val));
|
| + } else {
|
| + CHECK_EQ(val / denom, r.Call(val));
|
| + }
|
| + }
|
| + }
|
| +}
|
| // kExprI64DivU:
|
| +
|
| +TEST(Run_WasmI64DivU) {
|
| + WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
|
| + BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + FOR_UINT64_INPUTS(i) {
|
| + FOR_UINT64_INPUTS(j) {
|
| + if (*j == 0) {
|
| + CHECK_TRAP64(r.Call(*i, *j));
|
| + } else {
|
| + CHECK_EQ(*i / *j, r.Call(*i, *j));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(Run_WasmI64DivU_Trap) {
|
| + WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
|
| + BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + CHECK_EQ(0, r.Call(asu64(0), asu64(100)));
|
| + CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
|
| + CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
|
| + CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
|
| +}
|
| +
|
| +TEST(Run_WasmI64DivU_Byzero_Const) {
|
| + for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) {
|
| + WasmRunner<uint64_t> r(MachineType::Uint64());
|
| + BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
|
| +
|
| + for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) {
|
| + if (denom == 0) {
|
| + CHECK_TRAP64(r.Call(val));
|
| + } else {
|
| + CHECK_EQ(val / denom, r.Call(val));
|
| + }
|
| + }
|
| + }
|
| +}
|
| // kExprI64RemS:
|
| +TEST(Run_WasmI64RemS) {
|
| + WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
|
| + BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + FOR_INT64_INPUTS(i) {
|
| + FOR_INT64_INPUTS(j) {
|
| + if (*j == 0) {
|
| + CHECK_TRAP64(r.Call(*i, *j));
|
| + } else {
|
| + CHECK_EQ(*i % *j, r.Call(*i, *j));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(Run_WasmI64RemS_Trap) {
|
| + WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
|
| + BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + CHECK_EQ(33, r.Call(asi64(133), asi64(100)));
|
| + CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
|
| + CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
|
| + CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
|
| + CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
|
| +}
|
| +
|
| // kExprI64RemU:
|
| +TEST(Run_WasmI64RemU) {
|
| + WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
|
| + BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + FOR_UINT64_INPUTS(i) {
|
| + FOR_UINT64_INPUTS(j) {
|
| + if (*j == 0) {
|
| + CHECK_TRAP64(r.Call(*i, *j));
|
| + } else {
|
| + CHECK_EQ(*i % *j, r.Call(*i, *j));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(Run_Wasm_I64RemU_Trap) {
|
| + WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
|
| + BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
|
| + CHECK_EQ(17, r.Call(asu64(217), asu64(100)));
|
| + CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
|
| + CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
|
| + CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
|
| +}
|
| +
|
| // kExprI64And:
|
| TEST(Run_WasmI64And) {
|
| WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
|
|
|