| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index b2f6eb732e2e6cdad1d38480e49103863c82fcd2..f05e3dc120e1aea033e049e058560e0a0d22344d 100644
|
| --- a/src/compiler/machine-operator.cc
|
| +++ b/src/compiler/machine-operator.cc
|
| @@ -85,6 +85,11 @@ MachineType AtomicExchangeRepresentationOf(Operator const* op) {
|
| return OpParameter<MachineType>(op);
|
| }
|
|
|
| +MachineType AtomicCompareExchangeRepresentationOf(Operator const* op) {
|
| + DCHECK_EQ(IrOpcode::kAtomicCompareExchange, 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) \
|
| @@ -607,6 +612,19 @@ struct MachineOperatorGlobalCache {
|
| ATOMIC_TYPE_LIST(ATOMIC_EXCHANGE)
|
| #undef ATOMIC_EXCHANGE
|
|
|
| +#define ATOMIC_COMPARE_EXCHANGE(Type) \
|
| + struct AtomicCompareExchange##Type##Operator \
|
| + : public Operator1<MachineType> { \
|
| + AtomicCompareExchange##Type##Operator() \
|
| + : Operator1<MachineType>(IrOpcode::kAtomicCompareExchange, \
|
| + Operator::kNoDeopt | Operator::kNoThrow, \
|
| + "AtomicCompareExchange", 4, 1, 1, 1, 1, 0, \
|
| + MachineType::Type()) {} \
|
| + }; \
|
| + AtomicCompareExchange##Type##Operator kAtomicCompareExchange##Type;
|
| + ATOMIC_TYPE_LIST(ATOMIC_COMPARE_EXCHANGE)
|
| +#undef ATOMIC_COMPARE_EXCHANGE
|
| +
|
| // The {BitcastWordToTagged} operator must not be marked as pure (especially
|
| // not idempotent), because otherwise the splitting logic in the Scheduler
|
| // might decide to split these operators, thus potentially creating live
|
| @@ -874,6 +892,17 @@ const Operator* MachineOperatorBuilder::AtomicExchange(MachineType rep) {
|
| return nullptr;
|
| }
|
|
|
| +const Operator* MachineOperatorBuilder::AtomicCompareExchange(MachineType rep) {
|
| +#define COMPARE_EXCHANGE(kRep) \
|
| + if (rep == MachineType::kRep()) { \
|
| + return &cache_.kAtomicCompareExchange##kRep; \
|
| + }
|
| + ATOMIC_TYPE_LIST(COMPARE_EXCHANGE)
|
| +#undef COMPARE_EXCHANGE
|
| + UNREACHABLE();
|
| + return nullptr;
|
| +}
|
| +
|
| #define SIMD_LANE_OPS(Type, lane_count) \
|
| const Operator* MachineOperatorBuilder::Type##ExtractLane( \
|
| int32_t lane_index) { \
|
|
|