2017-08-02 21:40:45 +00:00
|
|
|
// 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.
|
|
|
|
|
2018-02-28 22:17:39 +00:00
|
|
|
#include "test/cctest/wasm/wasm-atomics-utils.h"
|
2017-08-02 21:40:45 +00:00
|
|
|
#include "test/common/wasm/wasm-macro-gen.h"
|
|
|
|
|
2017-09-01 12:57:34 +00:00
|
|
|
namespace v8 {
|
|
|
|
namespace internal {
|
|
|
|
namespace wasm {
|
2018-03-03 09:02:01 +00:00
|
|
|
namespace test_run_wasm_atomics {
|
2017-09-01 12:57:34 +00:00
|
|
|
|
2020-08-04 11:09:23 +00:00
|
|
|
void RunU32BinOp(TestExecutionTier execution_tier, WasmOpcode wasm_op,
|
2017-10-25 12:46:43 +00:00
|
|
|
Uint32BinOp expected_op) {
|
2017-08-02 21:40:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2018-04-27 20:00:12 +00:00
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2017-08-02 21:40:45 +00:00
|
|
|
|
2020-12-17 16:55:33 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_BINOP(wasm_op, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
2017-09-23 18:59:12 +00:00
|
|
|
MachineRepresentation::kWord32));
|
2017-08-02 21:40:45 +00:00
|
|
|
|
|
|
|
FOR_UINT32_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint32_t initial = i;
|
2017-08-02 21:40:45 +00:00
|
|
|
FOR_UINT32_INPUTS(j) {
|
2017-08-19 16:34:11 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(j));
|
|
|
|
uint32_t expected = expected_op(i, j);
|
2017-08-19 16:34:11 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
2017-08-02 21:40:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-28 23:40:27 +00:00
|
|
|
#define TEST_OPERATION(Name) \
|
|
|
|
WASM_EXEC_TEST(I32Atomic##Name) { \
|
|
|
|
RunU32BinOp(execution_tier, kExprI32Atomic##Name, Name); \
|
|
|
|
}
|
|
|
|
OPERATION_LIST(TEST_OPERATION)
|
|
|
|
#undef TEST_OPERATION
|
2017-08-02 21:40:45 +00:00
|
|
|
|
2020-08-04 11:09:23 +00:00
|
|
|
void RunU16BinOp(TestExecutionTier tier, WasmOpcode wasm_op,
|
2017-10-25 12:46:43 +00:00
|
|
|
Uint16BinOp expected_op) {
|
2017-08-02 21:40:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(tier);
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint16_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint16_t>(kWasmPageSize / sizeof(uint16_t));
|
2017-08-02 21:40:45 +00:00
|
|
|
|
2020-12-17 16:55:33 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_BINOP(wasm_op, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
2017-09-23 18:59:12 +00:00
|
|
|
MachineRepresentation::kWord16));
|
2017-08-02 21:40:45 +00:00
|
|
|
|
|
|
|
FOR_UINT16_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint16_t initial = i;
|
2017-08-02 21:40:45 +00:00
|
|
|
FOR_UINT16_INPUTS(j) {
|
2017-08-19 16:34:11 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(j));
|
|
|
|
uint16_t expected = expected_op(i, j);
|
2017-08-19 16:34:11 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
2017-08-02 21:40:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-28 23:40:27 +00:00
|
|
|
#define TEST_OPERATION(Name) \
|
|
|
|
WASM_EXEC_TEST(I32Atomic##Name##16U) { \
|
|
|
|
RunU16BinOp(execution_tier, kExprI32Atomic##Name##16U, Name); \
|
|
|
|
}
|
|
|
|
OPERATION_LIST(TEST_OPERATION)
|
|
|
|
#undef TEST_OPERATION
|
2017-08-02 21:40:45 +00:00
|
|
|
|
2020-08-04 11:09:23 +00:00
|
|
|
void RunU8BinOp(TestExecutionTier execution_tier, WasmOpcode wasm_op,
|
2017-10-25 12:46:43 +00:00
|
|
|
Uint8BinOp expected_op) {
|
2017-08-02 21:40:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint8_t* memory = r.builder().AddMemoryElems<uint8_t>(kWasmPageSize);
|
2017-08-02 21:40:45 +00:00
|
|
|
|
2020-12-17 16:55:33 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_BINOP(wasm_op, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
2017-09-23 18:59:12 +00:00
|
|
|
MachineRepresentation::kWord8));
|
2017-08-02 21:40:45 +00:00
|
|
|
|
|
|
|
FOR_UINT8_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint8_t initial = i;
|
2017-08-02 21:40:45 +00:00
|
|
|
FOR_UINT8_INPUTS(j) {
|
2017-08-19 16:34:11 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(j));
|
|
|
|
uint8_t expected = expected_op(i, j);
|
2017-08-19 16:34:11 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
2017-08-02 21:40:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-28 23:40:27 +00:00
|
|
|
#define TEST_OPERATION(Name) \
|
|
|
|
WASM_EXEC_TEST(I32Atomic##Name##8U) { \
|
|
|
|
RunU8BinOp(execution_tier, kExprI32Atomic##Name##8U, Name); \
|
|
|
|
}
|
|
|
|
OPERATION_LIST(TEST_OPERATION)
|
|
|
|
#undef TEST_OPERATION
|
2017-08-25 21:30:35 +00:00
|
|
|
|
2018-04-26 09:58:33 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicCompareExchange) {
|
2017-08-25 21:30:35 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
2017-09-23 18:59:12 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_TERNARY_OP(
|
2020-12-17 16:55:33 +00:00
|
|
|
kExprI32AtomicCompareExchange, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
|
|
|
WASM_LOCAL_GET(1), MachineRepresentation::kWord32));
|
2017-08-25 21:30:35 +00:00
|
|
|
|
|
|
|
FOR_UINT32_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint32_t initial = i;
|
2017-08-25 21:30:35 +00:00
|
|
|
FOR_UINT32_INPUTS(j) {
|
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(i, j));
|
|
|
|
uint32_t expected = CompareExchange(initial, i, j);
|
2017-08-25 21:30:35 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-26 09:58:33 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicCompareExchange16U) {
|
2017-08-25 21:30:35 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint16_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint16_t>(kWasmPageSize / sizeof(uint16_t));
|
2017-08-25 21:30:35 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_TERNARY_OP(kExprI32AtomicCompareExchange16U,
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
|
|
|
WASM_LOCAL_GET(1),
|
2017-09-23 18:59:12 +00:00
|
|
|
MachineRepresentation::kWord16));
|
2017-08-25 21:30:35 +00:00
|
|
|
|
|
|
|
FOR_UINT16_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint16_t initial = i;
|
2017-08-25 21:30:35 +00:00
|
|
|
FOR_UINT16_INPUTS(j) {
|
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(i, j));
|
|
|
|
uint16_t expected = CompareExchange(initial, i, j);
|
2017-08-25 21:30:35 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-26 09:58:33 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicCompareExchange8U) {
|
2017-08-25 21:30:35 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
|
2017-09-14 06:14:48 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint8_t* memory = r.builder().AddMemoryElems<uint8_t>(kWasmPageSize);
|
2017-08-25 21:30:35 +00:00
|
|
|
BUILD(r,
|
|
|
|
WASM_ATOMICS_TERNARY_OP(kExprI32AtomicCompareExchange8U, WASM_I32V_1(0),
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_LOCAL_GET(0), WASM_LOCAL_GET(1),
|
2017-09-23 18:59:12 +00:00
|
|
|
MachineRepresentation::kWord8));
|
2017-08-25 21:30:35 +00:00
|
|
|
|
|
|
|
FOR_UINT8_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint8_t initial = i;
|
2017-08-25 21:30:35 +00:00
|
|
|
FOR_UINT8_INPUTS(j) {
|
|
|
|
r.builder().WriteMemory(&memory[0], initial);
|
2019-02-01 10:37:04 +00:00
|
|
|
CHECK_EQ(initial, r.Call(i, j));
|
|
|
|
uint8_t expected = CompareExchange(initial, i, j);
|
2017-08-25 21:30:35 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-01 12:57:34 +00:00
|
|
|
|
2019-01-29 14:22:30 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicCompareExchange_fail) {
|
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
|
|
|
WasmRunner<uint32_t, uint32_t, uint32_t> r(execution_tier);
|
|
|
|
r.builder().SetHasSharedMemory();
|
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
|
|
|
BUILD(r, WASM_ATOMICS_TERNARY_OP(
|
2020-12-17 16:55:33 +00:00
|
|
|
kExprI32AtomicCompareExchange, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
|
|
|
WASM_LOCAL_GET(1), MachineRepresentation::kWord32));
|
2019-01-29 14:22:30 +00:00
|
|
|
|
|
|
|
// The original value at the memory location.
|
|
|
|
uint32_t old_val = 4;
|
|
|
|
// The value we use as the expected value for the compare-exchange so that it
|
|
|
|
// fails.
|
|
|
|
uint32_t expected = 6;
|
|
|
|
// The new value for the compare-exchange.
|
|
|
|
uint32_t new_val = 5;
|
|
|
|
|
|
|
|
r.builder().WriteMemory(&memory[0], old_val);
|
|
|
|
CHECK_EQ(old_val, r.Call(expected, new_val));
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicLoad) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
2017-10-02 05:05:45 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord32));
|
|
|
|
|
|
|
|
FOR_UINT32_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint32_t expected = i;
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], expected);
|
|
|
|
CHECK_EQ(expected, r.Call());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicLoad16U) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint16_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint16_t>(kWasmPageSize / sizeof(uint16_t));
|
2017-10-02 05:05:45 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad16U, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord16));
|
|
|
|
|
|
|
|
FOR_UINT16_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint16_t expected = i;
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], expected);
|
|
|
|
CHECK_EQ(expected, r.Call());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicLoad8U) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint8_t* memory = r.builder().AddMemoryElems<uint8_t>(kWasmPageSize);
|
2017-10-02 05:05:45 +00:00
|
|
|
BUILD(r, WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad8U, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord8));
|
|
|
|
|
|
|
|
FOR_UINT8_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint8_t expected = i;
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().WriteMemory(&memory[0], expected);
|
|
|
|
CHECK_EQ(expected, r.Call());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicStoreLoad) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
2017-10-02 05:05:45 +00:00
|
|
|
|
|
|
|
BUILD(r,
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore, WASM_ZERO, WASM_LOCAL_GET(0),
|
2017-10-02 05:05:45 +00:00
|
|
|
MachineRepresentation::kWord32),
|
|
|
|
WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord32));
|
|
|
|
|
|
|
|
FOR_UINT32_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint32_t expected = i;
|
|
|
|
CHECK_EQ(expected, r.Call(i));
|
2017-10-02 05:05:45 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicStoreLoad16U) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint16_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint16_t>(kWasmPageSize / sizeof(uint16_t));
|
2017-10-02 05:05:45 +00:00
|
|
|
|
|
|
|
BUILD(
|
|
|
|
r,
|
|
|
|
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore16U, WASM_ZERO,
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_LOCAL_GET(0), MachineRepresentation::kWord16),
|
2017-10-02 05:05:45 +00:00
|
|
|
WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad16U, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord16));
|
|
|
|
|
|
|
|
FOR_UINT16_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint16_t expected = i;
|
|
|
|
CHECK_EQ(expected, r.Call(i));
|
2017-10-02 05:05:45 +00:00
|
|
|
CHECK_EQ(expected, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-01 22:31:45 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicStoreLoad8U) {
|
2017-10-02 05:05:45 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2017-10-02 05:05:45 +00:00
|
|
|
r.builder().SetHasSharedMemory();
|
2018-04-27 20:00:12 +00:00
|
|
|
uint8_t* memory = r.builder().AddMemoryElems<uint8_t>(kWasmPageSize);
|
2017-10-02 05:05:45 +00:00
|
|
|
|
|
|
|
BUILD(r,
|
|
|
|
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore8U, WASM_ZERO,
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_LOCAL_GET(0), MachineRepresentation::kWord8),
|
2017-10-02 05:05:45 +00:00
|
|
|
WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad8U, WASM_ZERO,
|
|
|
|
MachineRepresentation::kWord8));
|
|
|
|
|
|
|
|
FOR_UINT8_INPUTS(i) {
|
2019-02-01 10:37:04 +00:00
|
|
|
uint8_t expected = i;
|
|
|
|
CHECK_EQ(expected, r.Call(i));
|
|
|
|
CHECK_EQ(i, r.builder().ReadMemory(&memory[0]));
|
2017-10-02 05:05:45 +00:00
|
|
|
}
|
|
|
|
}
|
2017-09-08 13:59:05 +00:00
|
|
|
|
2018-07-19 00:38:58 +00:00
|
|
|
WASM_EXEC_TEST(I32AtomicStoreParameter) {
|
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
2018-08-21 15:01:31 +00:00
|
|
|
WasmRunner<uint32_t, uint32_t> r(execution_tier);
|
2018-07-19 00:38:58 +00:00
|
|
|
uint32_t* memory =
|
|
|
|
r.builder().AddMemoryElems<uint32_t>(kWasmPageSize / sizeof(uint32_t));
|
|
|
|
r.builder().SetHasSharedMemory();
|
|
|
|
|
|
|
|
BUILD(r,
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore, WASM_ZERO, WASM_LOCAL_GET(0),
|
2018-07-19 00:38:58 +00:00
|
|
|
MachineRepresentation::kWord8),
|
2020-12-17 16:55:33 +00:00
|
|
|
WASM_ATOMICS_BINOP(kExprI32AtomicAdd, WASM_I32V_1(0), WASM_LOCAL_GET(0),
|
2018-07-19 00:38:58 +00:00
|
|
|
MachineRepresentation::kWord32));
|
|
|
|
CHECK_EQ(10, r.Call(10));
|
|
|
|
CHECK_EQ(20, r.builder().ReadMemory(&memory[0]));
|
|
|
|
}
|
2019-07-18 09:10:30 +00:00
|
|
|
|
|
|
|
WASM_EXEC_TEST(AtomicFence) {
|
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
|
|
|
// Note that this test specifically doesn't use a shared memory, as the fence
|
|
|
|
// instruction does not target a particular linear memory. It may occur in
|
|
|
|
// modules which declare no memory, or a non-shared memory, without causing a
|
|
|
|
// validation error.
|
|
|
|
|
|
|
|
BUILD(r, WASM_ATOMICS_FENCE, WASM_ZERO);
|
|
|
|
CHECK_EQ(0, r.Call());
|
|
|
|
}
|
|
|
|
|
2019-07-31 06:22:49 +00:00
|
|
|
WASM_EXEC_TEST(AtomicStoreNoConsideredEffectful) {
|
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
|
|
|
FLAG_wasm_trap_handler = false; // To use {Load} instead of {ProtectedLoad}.
|
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
|
|
|
r.builder().AddMemoryElems<int32_t>(kWasmPageSize / sizeof(int32_t));
|
|
|
|
r.builder().SetHasSharedMemory();
|
|
|
|
BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_ZERO),
|
|
|
|
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore, WASM_ZERO, WASM_I32V_1(20),
|
|
|
|
MachineRepresentation::kWord32),
|
|
|
|
kExprI64Eqz);
|
|
|
|
CHECK_EQ(1, r.Call());
|
|
|
|
}
|
|
|
|
|
2020-08-04 11:09:23 +00:00
|
|
|
void RunNoEffectTest(TestExecutionTier execution_tier, WasmOpcode wasm_op) {
|
2019-07-31 06:22:49 +00:00
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
|
|
|
FLAG_wasm_trap_handler = false; // To use {Load} instead of {ProtectedLoad}.
|
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
|
|
|
r.builder().AddMemoryElems<int32_t>(kWasmPageSize / sizeof(int32_t));
|
|
|
|
r.builder().SetHasSharedMemory();
|
|
|
|
BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_ZERO),
|
|
|
|
WASM_ATOMICS_BINOP(wasm_op, WASM_ZERO, WASM_I32V_1(20),
|
|
|
|
MachineRepresentation::kWord32),
|
|
|
|
WASM_DROP, kExprI64Eqz);
|
|
|
|
CHECK_EQ(1, r.Call());
|
|
|
|
}
|
|
|
|
|
|
|
|
WASM_EXEC_TEST(AtomicAddNoConsideredEffectful) {
|
|
|
|
RunNoEffectTest(execution_tier, kExprI32AtomicAdd);
|
|
|
|
}
|
|
|
|
|
|
|
|
WASM_EXEC_TEST(AtomicExchangeNoConsideredEffectful) {
|
|
|
|
RunNoEffectTest(execution_tier, kExprI32AtomicExchange);
|
|
|
|
}
|
|
|
|
|
|
|
|
WASM_EXEC_TEST(AtomicCompareExchangeNoConsideredEffectful) {
|
|
|
|
EXPERIMENTAL_FLAG_SCOPE(threads);
|
|
|
|
FLAG_wasm_trap_handler = false; // To use {Load} instead of {ProtectedLoad}.
|
|
|
|
WasmRunner<uint32_t> r(execution_tier);
|
|
|
|
r.builder().AddMemoryElems<int32_t>(kWasmPageSize / sizeof(int32_t));
|
|
|
|
r.builder().SetHasSharedMemory();
|
|
|
|
BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO),
|
|
|
|
WASM_ATOMICS_TERNARY_OP(kExprI32AtomicCompareExchange, WASM_ZERO,
|
|
|
|
WASM_ZERO, WASM_I32V_1(30),
|
|
|
|
MachineRepresentation::kWord32),
|
|
|
|
WASM_DROP, kExprI32Eqz);
|
|
|
|
CHECK_EQ(1, r.Call());
|
|
|
|
}
|
|
|
|
|
2018-03-03 09:02:01 +00:00
|
|
|
} // namespace test_run_wasm_atomics
|
2017-09-01 12:57:34 +00:00
|
|
|
} // namespace wasm
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace v8
|