Index: src/compiler/instruction.h |
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
index 4d6538c828acc26ea6757a84a9c1fd94b8c337fe..0379509840e9eec6f09826316cc36e3a077b0ffa 100644 |
--- a/src/compiler/instruction.h |
+++ b/src/compiler/instruction.h |
@@ -35,8 +35,7 @@ class InstructionOperand { |
// kInvalidVirtualRegister and some DCHECKS. |
enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, ALLOCATED }; |
- InstructionOperand() |
- : InstructionOperand(INVALID, 0, kInvalidVirtualRegister) {} |
+ InstructionOperand() : InstructionOperand(INVALID) {} |
Kind kind() const { return KindField::decode(value_); } |
@@ -75,19 +74,9 @@ class InstructionOperand { |
} |
protected: |
- InstructionOperand(Kind kind, int index, int virtual_register) { |
- if (kind != UNALLOCATED && kind != CONSTANT) { |
- DCHECK(virtual_register == kInvalidVirtualRegister); |
- } |
- value_ = KindField::encode(kind); |
- value_ |= |
- VirtualRegisterField::encode(static_cast<uint32_t>(virtual_register)); |
- value_ |= static_cast<int64_t>(index) << IndexField::kShift; |
- } |
+ explicit InstructionOperand(Kind kind) : value_(KindField::encode(kind)) {} |
- typedef BitField64<Kind, 0, 3> KindField; |
- typedef BitField64<uint32_t, 3, 32> VirtualRegisterField; |
- typedef BitField64<int32_t, 35, 29> IndexField; |
+ class KindField : public BitField64<Kind, 0, 3> {}; |
uint64_t value_; |
}; |
@@ -146,14 +135,14 @@ class UnallocatedOperand : public InstructionOperand { |
}; |
UnallocatedOperand(ExtendedPolicy policy, int virtual_register) |
- : InstructionOperand(UNALLOCATED, 0, virtual_register) { |
+ : UnallocatedOperand(virtual_register) { |
value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
value_ |= ExtendedPolicyField::encode(policy); |
value_ |= LifetimeField::encode(USED_AT_END); |
} |
UnallocatedOperand(BasicPolicy policy, int index, int virtual_register) |
- : InstructionOperand(UNALLOCATED, 0, virtual_register) { |
+ : UnallocatedOperand(virtual_register) { |
DCHECK(policy == FIXED_SLOT); |
value_ |= BasicPolicyField::encode(policy); |
value_ |= static_cast<int64_t>(index) << FixedSlotIndexField::kShift; |
@@ -161,7 +150,7 @@ class UnallocatedOperand : public InstructionOperand { |
} |
UnallocatedOperand(ExtendedPolicy policy, int index, int virtual_register) |
- : InstructionOperand(UNALLOCATED, 0, virtual_register) { |
+ : UnallocatedOperand(virtual_register) { |
DCHECK(policy == FIXED_REGISTER || policy == FIXED_DOUBLE_REGISTER); |
value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
value_ |= ExtendedPolicyField::encode(policy); |
@@ -171,7 +160,7 @@ class UnallocatedOperand : public InstructionOperand { |
UnallocatedOperand(ExtendedPolicy policy, Lifetime lifetime, |
int virtual_register) |
- : InstructionOperand(UNALLOCATED, 0, virtual_register) { |
+ : UnallocatedOperand(virtual_register) { |
value_ |= BasicPolicyField::encode(EXTENDED_POLICY); |
value_ |= ExtendedPolicyField::encode(policy); |
value_ |= LifetimeField::encode(lifetime); |
@@ -183,40 +172,6 @@ class UnallocatedOperand : public InstructionOperand { |
return New(zone, UnallocatedOperand(ANY, virtual_register())); |
} |
- // The encoding used for UnallocatedOperand operands depends on the policy |
- // that is |
- // stored within the operand. The FIXED_SLOT policy uses a compact encoding |
- // because it accommodates a larger pay-load. |
- // |
- // For FIXED_SLOT policy: |
- // +------------------------------------------------+ |
- // | slot_index | 0 | virtual_register | 001 | |
- // +------------------------------------------------+ |
- // |
- // For all other (extended) policies: |
- // +-----------------------------------------------------+ |
- // | reg_index | L | PPP | 1 | virtual_register | 001 | |
- // +-----------------------------------------------------+ |
- // L ... Lifetime |
- // P ... Policy |
- // |
- // The slot index is a signed value which requires us to decode it manually |
- // instead of using the BitField utility class. |
- |
- // All bits fit into the index field. |
- STATIC_ASSERT(IndexField::kShift == 35); |
- |
- // BitFields for all unallocated operands. |
- class BasicPolicyField : public BitField64<BasicPolicy, 35, 1> {}; |
- |
- // BitFields specific to BasicPolicy::FIXED_SLOT. |
- class FixedSlotIndexField : public BitField64<int, 36, 28> {}; |
- |
- // BitFields specific to BasicPolicy::EXTENDED_POLICY. |
- class ExtendedPolicyField : public BitField64<ExtendedPolicy, 36, 3> {}; |
- class LifetimeField : public BitField64<Lifetime, 39, 1> {}; |
- class FixedRegisterField : public BitField64<int, 40, 6> {}; |
- |
// Predicates for the operand policy. |
bool HasAnyPolicy() const { |
return basic_policy() == EXTENDED_POLICY && extended_policy() == ANY; |
@@ -292,13 +247,58 @@ class UnallocatedOperand : public InstructionOperand { |
} |
INSTRUCTION_OPERAND_CASTS(UnallocatedOperand, UNALLOCATED); |
+ |
+ // The encoding used for UnallocatedOperand operands depends on the policy |
+ // that is |
+ // stored within the operand. The FIXED_SLOT policy uses a compact encoding |
+ // because it accommodates a larger pay-load. |
+ // |
+ // For FIXED_SLOT policy: |
+ // +------------------------------------------------+ |
+ // | slot_index | 0 | virtual_register | 001 | |
+ // +------------------------------------------------+ |
+ // |
+ // For all other (extended) policies: |
+ // +-----------------------------------------------------+ |
+ // | reg_index | L | PPP | 1 | virtual_register | 001 | |
+ // +-----------------------------------------------------+ |
+ // L ... Lifetime |
+ // P ... Policy |
+ // |
+ // The slot index is a signed value which requires us to decode it manually |
+ // instead of using the BitField utility class. |
+ |
+ STATIC_ASSERT(KindField::kSize == 3); |
+ |
+ class VirtualRegisterField : public BitField64<uint32_t, 3, 32> {}; |
+ |
+ // BitFields for all unallocated operands. |
+ class BasicPolicyField : public BitField64<BasicPolicy, 35, 1> {}; |
+ |
+ // BitFields specific to BasicPolicy::FIXED_SLOT. |
+ class FixedSlotIndexField : public BitField64<int, 36, 28> {}; |
+ |
+ // BitFields specific to BasicPolicy::EXTENDED_POLICY. |
+ class ExtendedPolicyField : public BitField64<ExtendedPolicy, 36, 3> {}; |
+ class LifetimeField : public BitField64<Lifetime, 39, 1> {}; |
+ class FixedRegisterField : public BitField64<int, 40, 6> {}; |
+ |
+ private: |
+ explicit UnallocatedOperand(int virtual_register) |
+ : InstructionOperand(UNALLOCATED) { |
+ value_ |= |
+ VirtualRegisterField::encode(static_cast<uint32_t>(virtual_register)); |
+ } |
}; |
class ConstantOperand : public InstructionOperand { |
public: |
explicit ConstantOperand(int virtual_register) |
- : InstructionOperand(CONSTANT, 0, virtual_register) {} |
+ : InstructionOperand(CONSTANT) { |
+ value_ |= |
+ VirtualRegisterField::encode(static_cast<uint32_t>(virtual_register)); |
+ } |
int32_t virtual_register() const { |
return static_cast<int32_t>(VirtualRegisterField::decode(value_)); |
@@ -309,13 +309,17 @@ class ConstantOperand : public InstructionOperand { |
} |
INSTRUCTION_OPERAND_CASTS(ConstantOperand, CONSTANT); |
+ |
+ STATIC_ASSERT(KindField::kSize == 3); |
+ class VirtualRegisterField : public BitField64<uint32_t, 3, 32> {}; |
}; |
class ImmediateOperand : public InstructionOperand { |
public: |
- explicit ImmediateOperand(int index) |
- : InstructionOperand(IMMEDIATE, index, kInvalidVirtualRegister) {} |
+ explicit ImmediateOperand(int index) : InstructionOperand(IMMEDIATE) { |
+ value_ |= static_cast<int64_t>(index) << IndexField::kShift; |
+ } |
int index() const { |
return static_cast<int64_t>(value_) >> IndexField::kShift; |
@@ -326,6 +330,9 @@ class ImmediateOperand : public InstructionOperand { |
} |
INSTRUCTION_OPERAND_CASTS(ImmediateOperand, IMMEDIATE); |
+ |
+ STATIC_ASSERT(KindField::kSize == 3); |
+ class IndexField : public BitField64<int32_t, 35, 29> {}; |
}; |
@@ -339,9 +346,10 @@ class AllocatedOperand : public InstructionOperand { |
}; |
AllocatedOperand(AllocatedKind kind, int index) |
- : InstructionOperand(ALLOCATED, index, kInvalidVirtualRegister) { |
- if (kind == REGISTER || kind == DOUBLE_REGISTER) DCHECK(index >= 0); |
- value_ = AllocatedKindField::update(value_, kind); |
+ : InstructionOperand(ALLOCATED) { |
+ DCHECK_IMPLIES(kind == REGISTER || kind == DOUBLE_REGISTER, index >= 0); |
+ value_ |= AllocatedKindField::encode(kind); |
+ value_ |= static_cast<int64_t>(index) << IndexField::kShift; |
} |
int index() const { |
@@ -358,8 +366,9 @@ class AllocatedOperand : public InstructionOperand { |
INSTRUCTION_OPERAND_CASTS(AllocatedOperand, ALLOCATED); |
- private: |
- typedef BitField64<AllocatedKind, 3, 2> AllocatedKindField; |
+ STATIC_ASSERT(KindField::kSize == 3); |
+ class AllocatedKindField : public BitField64<AllocatedKind, 3, 2> {}; |
+ class IndexField : public BitField64<int32_t, 35, 29> {}; |
}; |