| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index 6e1180f9f5d6e9b5779d7a527a9c945cd43a14a2..a4aaa66cfdd242713d7acfeab4888aa6263d8677 100644
|
| --- a/src/compiler/machine-operator.cc
|
| +++ b/src/compiler/machine-operator.cc
|
| @@ -53,71 +53,71 @@ StoreRepresentation const& StoreRepresentationOf(Operator const* op) {
|
|
|
|
|
| #define PURE_OP_LIST(V) \
|
| - V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word32Shl, Operator::kNoProperties, 2, 1) \
|
| - V(Word32Shr, Operator::kNoProperties, 2, 1) \
|
| - V(Word32Sar, Operator::kNoProperties, 2, 1) \
|
| - V(Word32Ror, Operator::kNoProperties, 2, 1) \
|
| - V(Word32Equal, Operator::kCommutative, 2, 1) \
|
| - V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Word64Shl, Operator::kNoProperties, 2, 1) \
|
| - V(Word64Shr, Operator::kNoProperties, 2, 1) \
|
| - V(Word64Sar, Operator::kNoProperties, 2, 1) \
|
| - V(Word64Ror, Operator::kNoProperties, 2, 1) \
|
| - V(Word64Equal, Operator::kCommutative, 2, 1) \
|
| - V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| + V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word32Shl, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word32Shr, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word32Sar, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word32Ror, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word32Equal, Operator::kCommutative, 2, 0, 1) \
|
| + V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Word64Shl, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word64Shr, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word64Sar, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word64Ror, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Word64Equal, Operator::kCommutative, 2, 0, 1) \
|
| + V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \
|
| - 2) \
|
| - V(Int32Sub, Operator::kNoProperties, 2, 1) \
|
| - V(Int32SubWithOverflow, Operator::kNoProperties, 2, 2) \
|
| - V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Int32Div, Operator::kNoProperties, 2, 1) \
|
| - V(Int32Mod, Operator::kNoProperties, 2, 1) \
|
| - V(Int32LessThan, Operator::kNoProperties, 2, 1) \
|
| - V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 1) \
|
| - V(Uint32Div, Operator::kNoProperties, 2, 1) \
|
| - V(Uint32LessThan, Operator::kNoProperties, 2, 1) \
|
| - V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 1) \
|
| - V(Uint32Mod, Operator::kNoProperties, 2, 1) \
|
| - V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Int64Sub, Operator::kNoProperties, 2, 1) \
|
| - V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 1) \
|
| - V(Int64Div, Operator::kNoProperties, 2, 1) \
|
| - V(Int64Mod, Operator::kNoProperties, 2, 1) \
|
| - V(Int64LessThan, Operator::kNoProperties, 2, 1) \
|
| - V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 1) \
|
| - V(Uint64Div, Operator::kNoProperties, 2, 1) \
|
| - V(Uint64LessThan, Operator::kNoProperties, 2, 1) \
|
| - V(Uint64Mod, Operator::kNoProperties, 2, 1) \
|
| - V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 1) \
|
| - V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 1) \
|
| - V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 1) \
|
| - V(TruncateFloat64ToInt32, Operator::kNoProperties, 1, 1) \
|
| - V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 1) \
|
| - V(Float64Add, Operator::kCommutative, 2, 1) \
|
| - V(Float64Sub, Operator::kNoProperties, 2, 1) \
|
| - V(Float64Mul, Operator::kCommutative, 2, 1) \
|
| - V(Float64Div, Operator::kNoProperties, 2, 1) \
|
| - V(Float64Mod, Operator::kNoProperties, 2, 1) \
|
| - V(Float64Sqrt, Operator::kNoProperties, 1, 1) \
|
| - V(Float64Ceil, Operator::kNoProperties, 1, 1) \
|
| - V(Float64Floor, Operator::kNoProperties, 1, 1) \
|
| - V(Float64RoundTruncate, Operator::kNoProperties, 1, 1) \
|
| - V(Float64RoundTiesAway, Operator::kNoProperties, 1, 1) \
|
| - V(Float64Equal, Operator::kCommutative, 2, 1) \
|
| - V(Float64LessThan, Operator::kNoProperties, 2, 1) \
|
| - V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 1) \
|
| - V(LoadStackPointer, Operator::kNoProperties, 0, 1)
|
| + 0, 2) \
|
| + V(Int32Sub, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int32SubWithOverflow, Operator::kNoProperties, 2, 0, 2) \
|
| + V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Int32Div, Operator::kNoProperties, 2, 1, 1) \
|
| + V(Int32Mod, Operator::kNoProperties, 2, 1, 1) \
|
| + V(Int32LessThan, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint32Div, Operator::kNoProperties, 2, 1, 1) \
|
| + V(Uint32LessThan, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint32Mod, Operator::kNoProperties, 2, 1, 1) \
|
| + V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Int64Sub, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| + V(Int64Div, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int64Mod, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int64LessThan, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint64Div, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Uint64Mod, Operator::kNoProperties, 2, 0, 1) \
|
| + V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
|
| + V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 0, 1) \
|
| + V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
|
| + V(TruncateFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
|
| + V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64Add, Operator::kCommutative, 2, 0, 1) \
|
| + V(Float64Sub, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Float64Mul, Operator::kCommutative, 2, 0, 1) \
|
| + V(Float64Div, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Float64Mod, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Float64Sqrt, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64Ceil, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64Floor, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64RoundTruncate, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64RoundTiesAway, Operator::kNoProperties, 1, 0, 1) \
|
| + V(Float64Equal, Operator::kCommutative, 2, 0, 1) \
|
| + V(Float64LessThan, Operator::kNoProperties, 2, 0, 1) \
|
| + V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
|
| + V(LoadStackPointer, Operator::kNoProperties, 0, 0, 1)
|
|
|
|
|
| #define MACHINE_TYPE_LIST(V) \
|
| @@ -142,64 +142,68 @@ StoreRepresentation const& StoreRepresentationOf(Operator const* op) {
|
| V(RepTagged)
|
|
|
|
|
| -struct MachineOperatorBuilderImpl {
|
| -#define PURE(Name, properties, input_count, output_count) \
|
| - struct Name##Operator FINAL : public SimpleOperator { \
|
| - Name##Operator() \
|
| - : SimpleOperator(IrOpcode::k##Name, Operator::kPure | properties, \
|
| - input_count, output_count, #Name) {} \
|
| - }; \
|
| +struct MachineOperatorGlobalCache {
|
| +#define PURE(Name, properties, value_input_count, control_input_count, \
|
| + output_count) \
|
| + struct Name##Operator FINAL : public Operator { \
|
| + Name##Operator() \
|
| + : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
|
| + value_input_count, 0, control_input_count, output_count, 0, \
|
| + 0) {} \
|
| + }; \
|
| Name##Operator k##Name;
|
| PURE_OP_LIST(PURE)
|
| #undef PURE
|
|
|
| -#define LOAD(Type) \
|
| - struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \
|
| - Load##Type##Operator() \
|
| - : Operator1<LoadRepresentation>( \
|
| - IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, 2, 1, \
|
| - "Load", k##Type) {} \
|
| - }; \
|
| +#define LOAD(Type) \
|
| + struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \
|
| + Load##Type##Operator() \
|
| + : Operator1<LoadRepresentation>( \
|
| + IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, \
|
| + "Load", 2, 1, 1, 1, 1, 0, k##Type) {} \
|
| + }; \
|
| Load##Type##Operator k##Load##Type;
|
| MACHINE_TYPE_LIST(LOAD)
|
| #undef LOAD
|
|
|
| -#define STORE(Type) \
|
| - struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
|
| - explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
|
| - : Operator1<StoreRepresentation>( \
|
| - IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, 3, 0, \
|
| - "Store", StoreRepresentation(k##Type, write_barrier_kind)) {} \
|
| - }; \
|
| - struct Store##Type##NoWriteBarrier##Operator FINAL \
|
| - : public Store##Type##Operator { \
|
| - Store##Type##NoWriteBarrier##Operator() \
|
| - : Store##Type##Operator(kNoWriteBarrier) {} \
|
| - }; \
|
| - struct Store##Type##FullWriteBarrier##Operator FINAL \
|
| - : public Store##Type##Operator { \
|
| - Store##Type##FullWriteBarrier##Operator() \
|
| - : Store##Type##Operator(kFullWriteBarrier) {} \
|
| - }; \
|
| - Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier; \
|
| +#define STORE(Type) \
|
| + struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
|
| + explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
|
| + : Operator1<StoreRepresentation>( \
|
| + IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, \
|
| + "Store", 3, 1, 1, 0, 1, 0, \
|
| + StoreRepresentation(k##Type, write_barrier_kind)) {} \
|
| + }; \
|
| + struct Store##Type##NoWriteBarrier##Operator FINAL \
|
| + : public Store##Type##Operator { \
|
| + Store##Type##NoWriteBarrier##Operator() \
|
| + : Store##Type##Operator(kNoWriteBarrier) {} \
|
| + }; \
|
| + struct Store##Type##FullWriteBarrier##Operator FINAL \
|
| + : public Store##Type##Operator { \
|
| + Store##Type##FullWriteBarrier##Operator() \
|
| + : Store##Type##Operator(kFullWriteBarrier) {} \
|
| + }; \
|
| + Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier; \
|
| Store##Type##FullWriteBarrier##Operator k##Store##Type##FullWriteBarrier;
|
| MACHINE_TYPE_LIST(STORE)
|
| #undef STORE
|
| };
|
|
|
|
|
| -static base::LazyInstance<MachineOperatorBuilderImpl>::type kImpl =
|
| +static base::LazyInstance<MachineOperatorGlobalCache>::type kCache =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
|
|
| MachineOperatorBuilder::MachineOperatorBuilder(MachineType word, Flags flags)
|
| - : impl_(kImpl.Get()), word_(word), flags_(flags) {
|
| + : cache_(kCache.Get()), word_(word), flags_(flags) {
|
| DCHECK(word == kRepWord32 || word == kRepWord64);
|
| }
|
|
|
|
|
| -#define PURE(Name, properties, input_count, output_count) \
|
| - const Operator* MachineOperatorBuilder::Name() { return &impl_.k##Name; }
|
| +#define PURE(Name, properties, value_input_count, control_input_count, \
|
| + output_count) \
|
| + const Operator* MachineOperatorBuilder::Name() { return &cache_.k##Name; }
|
| PURE_OP_LIST(PURE)
|
| #undef PURE
|
|
|
| @@ -208,7 +212,7 @@ const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) {
|
| switch (rep) {
|
| #define LOAD(Type) \
|
| case k##Type: \
|
| - return &impl_.k##Load##Type;
|
| + return &cache_.k##Load##Type;
|
| MACHINE_TYPE_LIST(LOAD)
|
| #undef LOAD
|
|
|
| @@ -222,14 +226,14 @@ const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) {
|
|
|
| const Operator* MachineOperatorBuilder::Store(StoreRepresentation rep) {
|
| switch (rep.machine_type()) {
|
| -#define STORE(Type) \
|
| - case k##Type: \
|
| - switch (rep.write_barrier_kind()) { \
|
| - case kNoWriteBarrier: \
|
| - return &impl_.k##Store##Type##NoWriteBarrier; \
|
| - case kFullWriteBarrier: \
|
| - return &impl_.k##Store##Type##FullWriteBarrier; \
|
| - } \
|
| +#define STORE(Type) \
|
| + case k##Type: \
|
| + switch (rep.write_barrier_kind()) { \
|
| + case kNoWriteBarrier: \
|
| + return &cache_.k##Store##Type##NoWriteBarrier; \
|
| + case kFullWriteBarrier: \
|
| + return &cache_.k##Store##Type##FullWriteBarrier; \
|
| + } \
|
| break;
|
| MACHINE_TYPE_LIST(STORE)
|
| #undef STORE
|
|
|