Chromium Code Reviews| Index: src/compiler/instruction.h |
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
| index daa83f29bc55dcad7b9d512911aa8b8a32e7e2fc..2cb4108a9d1be538e31d36d12c16157832ce2ed8 100644 |
| --- a/src/compiler/instruction.h |
| +++ b/src/compiler/instruction.h |
| @@ -73,9 +73,9 @@ class InstructionOperand : public ZoneObject { |
| static void TearDownCaches(); |
| protected: |
| - typedef BitField64<Kind, 0, 3> KindField; |
| + typedef BitField<Kind, 0, 3> KindField; |
| - uint64_t value_; |
| + uint32_t value_; |
| }; |
| typedef ZoneVector<InstructionOperand*> InstructionOperandVector; |
| @@ -115,27 +115,29 @@ class UnallocatedOperand : public InstructionOperand { |
| USED_AT_END |
| }; |
| + static const int kInvalidVirtualRegister = -1; |
| + |
| explicit UnallocatedOperand(ExtendedPolicy policy) |
| - : InstructionOperand(UNALLOCATED, 0) { |
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); |
| + : InstructionOperand(UNALLOCATED, 0), |
| + virtual_register_(kInvalidVirtualRegister) { |
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
| value_ |= ExtendedPolicyField::encode(policy); |
| value_ |= LifetimeField::encode(USED_AT_END); |
| } |
| UnallocatedOperand(BasicPolicy policy, int index) |
| - : InstructionOperand(UNALLOCATED, 0) { |
| + : InstructionOperand(UNALLOCATED, 0), |
| + virtual_register_(kInvalidVirtualRegister) { |
| DCHECK(policy == FIXED_SLOT); |
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); |
| value_ |= BasicPolicyField::encode(policy); |
| - value_ |= static_cast<int64_t>(index) << FixedSlotIndexField::kShift; |
| + value_ |= static_cast<int32_t>(index) << FixedSlotIndexField::kShift; |
| DCHECK(this->fixed_slot_index() == index); |
| } |
| UnallocatedOperand(ExtendedPolicy policy, int index) |
| - : InstructionOperand(UNALLOCATED, 0) { |
| + : InstructionOperand(UNALLOCATED, 0), |
| + virtual_register_(kInvalidVirtualRegister) { |
| DCHECK(policy == FIXED_REGISTER || policy == FIXED_DOUBLE_REGISTER); |
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); |
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
| value_ |= ExtendedPolicyField::encode(policy); |
| value_ |= LifetimeField::encode(USED_AT_END); |
| @@ -143,8 +145,8 @@ class UnallocatedOperand : public InstructionOperand { |
| } |
| UnallocatedOperand(ExtendedPolicy policy, Lifetime lifetime) |
| - : InstructionOperand(UNALLOCATED, 0) { |
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); |
| + : InstructionOperand(UNALLOCATED, 0), |
| + virtual_register_(kInvalidVirtualRegister) { |
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
| value_ |= ExtendedPolicyField::encode(policy); |
| value_ |= LifetimeField::encode(lifetime); |
| @@ -172,35 +174,32 @@ class UnallocatedOperand : public InstructionOperand { |
| // because it accommodates a larger pay-load. |
| // |
| // For FIXED_SLOT policy: |
| - // +------------------------------------------+ |
| - // | slot_index | vreg | 0 | 001 | |
| - // +------------------------------------------+ |
| + // +-----------------------------+ |
| + // | slot_index | 0 | 001 | |
| + // +-----------------------------+ |
| // |
| // For all other (extended) policies: |
| - // +------------------------------------------+ |
| - // | reg_index | L | PPP | vreg | 1 | 001 | L ... Lifetime |
| - // +------------------------------------------+ P ... Policy |
| + // +----------------------------------+ |
| + // | reg_index | L | PPP | 1 | 001 | L ... Lifetime |
| + // +----------------------------------+ P ... Policy |
| // |
| // The slot index is a signed value which requires us to decode it manually |
| - // instead of using the BitField64 utility class. |
| + // instead of using the BitField utility class. |
| // The superclass has a KindField. |
| STATIC_ASSERT(KindField::kSize == 3); |
| // BitFields for all unallocated operands. |
| - class BasicPolicyField : public BitField64<BasicPolicy, 3, 1> {}; |
| - class VirtualRegisterField : public BitField64<unsigned, 4, 30> {}; |
| + class BasicPolicyField : public BitField<BasicPolicy, 3, 1> {}; |
| // BitFields specific to BasicPolicy::FIXED_SLOT. |
| - class FixedSlotIndexField : public BitField64<int, 34, 30> {}; |
| + class FixedSlotIndexField : public BitField<int, 4, 28> {}; |
| // BitFields specific to BasicPolicy::EXTENDED_POLICY. |
| - class ExtendedPolicyField : public BitField64<ExtendedPolicy, 34, 3> {}; |
| - class LifetimeField : public BitField64<Lifetime, 37, 1> {}; |
| - class FixedRegisterField : public BitField64<int, 38, 6> {}; |
| + class ExtendedPolicyField : public BitField<ExtendedPolicy, 4, 3> {}; |
| + class LifetimeField : public BitField<Lifetime, 7, 1> {}; |
| + class FixedRegisterField : public BitField<int, 8, 6> {}; |
| - static const int kInvalidVirtualRegister = VirtualRegisterField::kMax; |
| - static const int kMaxVirtualRegisters = VirtualRegisterField::kMax; |
| static const int kFixedSlotIndexWidth = FixedSlotIndexField::kSize; |
| static const int kMaxFixedSlotIndex = (1 << (kFixedSlotIndexWidth - 1)) - 1; |
| static const int kMinFixedSlotIndex = -(1 << (kFixedSlotIndexWidth - 1)); |
| @@ -244,7 +243,7 @@ class UnallocatedOperand : public InstructionOperand { |
| // [fixed_slot_index]: Only for FIXED_SLOT. |
| int fixed_slot_index() const { |
| DCHECK(HasFixedSlotPolicy()); |
| - return static_cast<int>(bit_cast<int64_t>(value_) >> |
| + return static_cast<int>(bit_cast<int32_t>(value_) >> |
| FixedSlotIndexField::kShift); |
| } |
| @@ -254,10 +253,11 @@ class UnallocatedOperand : public InstructionOperand { |
| return FixedRegisterField::decode(value_); |
| } |
| + // TODO(dcarney): return unsigned or make virtual register opaque. |
| // [virtual_register]: The virtual register ID for this operand. |
| - int virtual_register() const { return VirtualRegisterField::decode(value_); } |
| + int virtual_register() const { return virtual_register_; } |
|
Benedikt Meurer
2015/01/07 11:24:08
Can't we just change the return type to unsigned h
|
| void set_virtual_register(unsigned id) { |
| - value_ = VirtualRegisterField::update(value_, id); |
| + virtual_register_ = static_cast<int>(id); |
| } |
| // [lifetime]: Only for non-FIXED_SLOT. |
| @@ -265,6 +265,9 @@ class UnallocatedOperand : public InstructionOperand { |
| DCHECK(basic_policy() == EXTENDED_POLICY); |
| return LifetimeField::decode(value_) == USED_AT_START; |
| } |
| + |
| + private: |
| + int32_t virtual_register_; |
| }; |
| @@ -947,7 +950,7 @@ class InstructionSequence FINAL : public ZoneObject { |
| InstructionSequence(Zone* zone, InstructionBlocks* instruction_blocks); |
| - int NextVirtualRegister() { return next_virtual_register_++; } |
| + int NextVirtualRegister(); |
| int VirtualRegisterCount() const { return next_virtual_register_; } |
| const InstructionBlocks& instruction_blocks() const { |