Index: src/compiler/machine-operator.cc |
diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc |
index 35774c693414c9ac573f8eb4cf052d283958271c..04a590b91d81a7f00ef40c84c63cf81006d1e6ca 100644 |
--- a/src/compiler/machine-operator.cc |
+++ b/src/compiler/machine-operator.cc |
@@ -80,13 +80,7 @@ MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) { |
return OpParameter<MachineRepresentation>(op); |
} |
-MachineType AtomicExchangeRepresentationOf(Operator const* op) { |
- DCHECK_EQ(IrOpcode::kAtomicExchange, op->opcode()); |
- return OpParameter<MachineType>(op); |
-} |
- |
-MachineType AtomicCompareExchangeRepresentationOf(Operator const* op) { |
- DCHECK_EQ(IrOpcode::kAtomicCompareExchange, op->opcode()); |
+MachineType AtomicOpRepresentationOf(Operator const* op) { |
return OpParameter<MachineType>(op); |
} |
@@ -596,17 +590,24 @@ 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 |
+#define ATOMIC_OP(op, type) \ |
+ struct op##type##Operator : public Operator1<MachineType> { \ |
+ op##type##Operator() \ |
+ : Operator1<MachineType>(IrOpcode::k##op, \ |
+ Operator::kNoDeopt | Operator::kNoThrow, #op, \ |
+ 3, 1, 1, 1, 1, 0, MachineType::type()) {} \ |
+ }; \ |
+ op##type##Operator k##op##type; |
+#define ATOMIC_OP_LIST(type) \ |
+ ATOMIC_OP(AtomicExchange, type) \ |
+ ATOMIC_OP(AtomicAdd, type) \ |
+ ATOMIC_OP(AtomicSub, type) \ |
+ ATOMIC_OP(AtomicAnd, type) \ |
+ ATOMIC_OP(AtomicOr, type) \ |
+ ATOMIC_OP(AtomicXor, type) |
+ ATOMIC_TYPE_LIST(ATOMIC_OP_LIST) |
+#undef ATOMIC_OP_LIST |
+#undef ATOMIC_OP |
#define ATOMIC_COMPARE_EXCHANGE(Type) \ |
struct AtomicCompareExchange##Type##Operator \ |
@@ -899,6 +900,61 @@ const Operator* MachineOperatorBuilder::AtomicCompareExchange(MachineType rep) { |
return nullptr; |
} |
+const Operator* MachineOperatorBuilder::AtomicAdd(MachineType rep) { |
+#define ADD(kRep) \ |
+ if (rep == MachineType::kRep()) { \ |
+ return &cache_.kAtomicAdd##kRep; \ |
+ } |
+ ATOMIC_TYPE_LIST(ADD) |
+#undef ADD |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
+const Operator* MachineOperatorBuilder::AtomicSub(MachineType rep) { |
+#define SUB(kRep) \ |
+ if (rep == MachineType::kRep()) { \ |
+ return &cache_.kAtomicSub##kRep; \ |
+ } |
+ ATOMIC_TYPE_LIST(SUB) |
+#undef SUB |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
+const Operator* MachineOperatorBuilder::AtomicAnd(MachineType rep) { |
+#define AND(kRep) \ |
+ if (rep == MachineType::kRep()) { \ |
+ return &cache_.kAtomicAnd##kRep; \ |
+ } |
+ ATOMIC_TYPE_LIST(AND) |
+#undef AND |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
+const Operator* MachineOperatorBuilder::AtomicOr(MachineType rep) { |
+#define OR(kRep) \ |
+ if (rep == MachineType::kRep()) { \ |
+ return &cache_.kAtomicOr##kRep; \ |
+ } |
+ ATOMIC_TYPE_LIST(OR) |
+#undef OR |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
+const Operator* MachineOperatorBuilder::AtomicXor(MachineType rep) { |
+#define XOR(kRep) \ |
+ if (rep == MachineType::kRep()) { \ |
+ return &cache_.kAtomicXor##kRep; \ |
+ } |
+ ATOMIC_TYPE_LIST(XOR) |
+#undef XOR |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
#define SIMD_LANE_OPS(Type, lane_count) \ |
const Operator* MachineOperatorBuilder::Type##ExtractLane( \ |
int32_t lane_index) { \ |