| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index 8123dcef8f2e4479080973a98f2745dc08932968..e1a0dce5f3260cd2697433e60a986d3f1459f69c 100644
|
| --- a/src/compiler/machine-operator.cc
|
| +++ b/src/compiler/machine-operator.cc
|
| @@ -80,6 +80,11 @@ MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) {
|
| return OpParameter<MachineRepresentation>(op);
|
| }
|
|
|
| +MachineType AtomicExchangeRepresentationOf(Operator const* op) {
|
| + DCHECK_EQ(IrOpcode::kAtomicExchange, op->opcode());
|
| + return OpParameter<MachineType>(op);
|
| +}
|
| +
|
| #define PURE_BINARY_OP_LIST_32(V) \
|
| V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| @@ -602,6 +607,18 @@ struct MachineOperatorGlobalCache {
|
| ATOMIC_REPRESENTATION_LIST(ATOMIC_STORE)
|
| #undef STORE
|
|
|
| +#define ATOMIC_EXCHANGE(Type) \
|
| + struct AtomicExchange##Type##Operator : public Operator1<MachineType> { \
|
| + AtomicExchange##Type##Operator() \
|
| + : Operator1<MachineType>(IrOpcode::kAtomicExchange, \
|
| + Operator::kNoDeopt | Operator::kNoThrow, \
|
| + "AtomicExchange", 3, 1, 1, 1, 1, 0, \
|
| + MachineType::Type()) {} \
|
| + }; \
|
| + AtomicExchange##Type##Operator kAtomicExchange##Type;
|
| + ATOMIC_TYPE_LIST(ATOMIC_EXCHANGE)
|
| +#undef ATOMIC_EXCHANGE
|
| +
|
| struct DebugBreakOperator : public Operator {
|
| DebugBreakOperator()
|
| : Operator(IrOpcode::kDebugBreak, Operator::kNoThrow, "DebugBreak", 0,
|
| @@ -841,6 +858,17 @@ const Operator* MachineOperatorBuilder::AtomicStore(MachineRepresentation rep) {
|
| return nullptr;
|
| }
|
|
|
| +const Operator* MachineOperatorBuilder::AtomicExchange(MachineType rep) {
|
| +#define EXCHANGE(kRep) \
|
| + if (rep == MachineType::kRep()) { \
|
| + return &cache_.kAtomicExchange##kRep; \
|
| + }
|
| + ATOMIC_TYPE_LIST(EXCHANGE)
|
| +#undef EXCHANGE
|
| + UNREACHABLE();
|
| + return nullptr;
|
| +}
|
| +
|
| #define SIMD_LANE_OPS(Type, lane_count) \
|
| const Operator* MachineOperatorBuilder::Type##ExtractLane( \
|
| int32_t lane_index) { \
|
|
|