| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index 8597e7b4df4c3246bde4e37743fcf55377674edd..80310e1f5acbf19c89b4f50d9eaeb51f57ae7f4b 100644
|
| --- a/src/compiler/machine-operator.cc
|
| +++ b/src/compiler/machine-operator.cc
|
| @@ -70,9 +70,9 @@ CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const* op) {
|
| return OpParameter<CheckedStoreRepresentation>(op);
|
| }
|
|
|
| -MachineRepresentation StackSlotRepresentationOf(Operator const* op) {
|
| +int StackSlotSizeOf(Operator const* op) {
|
| DCHECK_EQ(IrOpcode::kStackSlot, op->opcode());
|
| - return OpParameter<MachineRepresentation>(op);
|
| + return OpParameter<int>(op);
|
| }
|
|
|
| MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) {
|
| @@ -458,6 +458,15 @@ MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) {
|
| V(kWord16) \
|
| V(kWord32)
|
|
|
| +#define STACK_SLOT_CACHED_SIZES_LIST(V) V(4) V(8) V(16)
|
| +
|
| +struct StackSlotOperator : public Operator1<int> {
|
| + explicit StackSlotOperator(int size)
|
| + : Operator1<int>(IrOpcode::kStackSlot,
|
| + Operator::kNoDeopt | Operator::kNoThrow, "StackSlot", 0,
|
| + 0, 0, 1, 0, 0, size) {}
|
| +};
|
| +
|
| struct MachineOperatorGlobalCache {
|
| #define PURE(Name, properties, value_input_count, control_input_count, \
|
| output_count) \
|
| @@ -522,17 +531,12 @@ struct MachineOperatorGlobalCache {
|
| MACHINE_TYPE_LIST(LOAD)
|
| #undef LOAD
|
|
|
| -#define STACKSLOT(Type) \
|
| - struct StackSlot##Type##Operator final \
|
| - : public Operator1<MachineRepresentation> { \
|
| - StackSlot##Type##Operator() \
|
| - : Operator1<MachineRepresentation>( \
|
| - IrOpcode::kStackSlot, Operator::kNoDeopt | Operator::kNoThrow, \
|
| - "StackSlot", 0, 0, 0, 1, 0, 0, \
|
| - MachineType::Type().representation()) {} \
|
| - }; \
|
| - StackSlot##Type##Operator kStackSlot##Type;
|
| - MACHINE_TYPE_LIST(STACKSLOT)
|
| +#define STACKSLOT(Size) \
|
| + struct StackSlotOfSize##Size##Operator final : public StackSlotOperator { \
|
| + StackSlotOfSize##Size##Operator() : StackSlotOperator(Size) {} \
|
| + }; \
|
| + StackSlotOfSize##Size##Operator kStackSlotSize##Size;
|
| + STACK_SLOT_CACHED_SIZES_LIST(STACKSLOT)
|
| #undef STACKSLOT
|
|
|
| #define STORE(Type) \
|
| @@ -735,15 +739,21 @@ const Operator* MachineOperatorBuilder::ProtectedLoad(LoadRepresentation rep) {
|
| return nullptr;
|
| }
|
|
|
| -const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep) {
|
| -#define STACKSLOT(Type) \
|
| - if (rep == MachineType::Type().representation()) { \
|
| - return &cache_.kStackSlot##Type; \
|
| +const Operator* MachineOperatorBuilder::StackSlot(int size) {
|
| + DCHECK_LE(0, size);
|
| +#define CASE_CACHED_SIZE(Size) \
|
| + case Size: \
|
| + return &cache_.kStackSlotSize##Size;
|
| + switch (size) {
|
| + STACK_SLOT_CACHED_SIZES_LIST(CASE_CACHED_SIZE);
|
| + default:
|
| + return new (zone_) StackSlotOperator(size);
|
| }
|
| - MACHINE_TYPE_LIST(STACKSLOT)
|
| -#undef STACKSLOT
|
| - UNREACHABLE();
|
| - return nullptr;
|
| +#undef CASE_CACHED_SIZE
|
| +}
|
| +
|
| +const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep) {
|
| + return StackSlot(1 << ElementSizeLog2Of(rep));
|
| }
|
|
|
| const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) {
|
|
|