Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: src/compiler/instruction.h

Issue 947153002: [turbofan] encode instruction operand as uint64_t (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/utils.h » ('j') | src/utils.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/instruction.h
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
index d04d0367f5e62c6c788434e216b5ed4b45b4c68e..e36e8936d67d3fb8b6963ad9b57df3c43a80029d 100644
--- a/src/compiler/instruction.h
+++ b/src/compiler/instruction.h
@@ -50,14 +50,11 @@ class InstructionOperand {
DOUBLE_REGISTER
};
- InstructionOperand() : virtual_register_(kInvalidVirtualRegister) {
- ConvertTo(INVALID, 0);
- }
+ InstructionOperand() { ConvertTo(INVALID, 0, kInvalidVirtualRegister); }
- InstructionOperand(Kind kind, int index)
- : virtual_register_(kInvalidVirtualRegister) {
- DCHECK(kind != INVALID);
- ConvertTo(kind, index);
+ InstructionOperand(Kind kind, int index) {
+ DCHECK(kind != UNALLOCATED && kind != INVALID);
+ ConvertTo(kind, index, kInvalidVirtualRegister);
}
static InstructionOperand* New(Zone* zone, Kind kind, int index) {
@@ -65,7 +62,11 @@ class InstructionOperand {
}
Kind kind() const { return KindField::decode(value_); }
- int index() const { return static_cast<int>(value_) >> KindField::kSize; }
+ // TODO(dcarney): move this to subkind operand.
+ int index() const {
+ DCHECK(kind() != UNALLOCATED && kind() != INVALID);
+ return static_cast<int64_t>(value_) >> IndexField::kShift;
+ }
#define INSTRUCTION_OPERAND_PREDICATE(name, type) \
bool Is##name() const { return kind() == type; }
INSTRUCTION_OPERAND_LIST(INSTRUCTION_OPERAND_PREDICATE)
@@ -77,11 +78,8 @@ class InstructionOperand {
}
void ConvertTo(Kind kind, int index) {
- if (kind == REGISTER || kind == DOUBLE_REGISTER) DCHECK(index >= 0);
- value_ = KindField::encode(kind);
- value_ |= bit_cast<unsigned>(index << KindField::kSize);
- DCHECK(this->index() == index);
- if (kind != UNALLOCATED) virtual_register_ = kInvalidVirtualRegister;
+ DCHECK(kind != UNALLOCATED && kind != INVALID);
+ ConvertTo(kind, index, kInvalidVirtualRegister);
}
protected:
@@ -91,15 +89,28 @@ class InstructionOperand {
return new (buffer) SubKindOperand(op);
}
- InstructionOperand(Kind kind, int index, int virtual_register)
- : virtual_register_(virtual_register) {
- ConvertTo(kind, index);
+ InstructionOperand(Kind kind, int index, int virtual_register) {
+ ConvertTo(kind, index, virtual_register);
}
- typedef BitField<Kind, 0, 3> KindField;
- uint32_t value_;
- // TODO(dcarney): this should really be unsigned.
- int32_t virtual_register_;
+ void ConvertTo(Kind kind, int index, int virtual_register) {
+ if (kind == REGISTER || kind == DOUBLE_REGISTER) DCHECK(index >= 0);
+ if (kind != UNALLOCATED) {
+ 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;
+ DCHECK(((kind == UNALLOCATED || kind == INVALID) && index == 0) ||
+ this->index() == index);
+ }
+
+ typedef BitField64<Kind, 0, 3> KindField;
+ typedef BitField64<uint32_t, 3, 32> VirtualRegisterField;
+ typedef BitField64<int32_t, 35, 29> IndexField;
+
+ uint64_t value_;
};
struct PrintableInstructionOperand {
@@ -148,7 +159,7 @@ class UnallocatedOperand : public InstructionOperand {
: InstructionOperand(UNALLOCATED, 0, virtual_register) {
DCHECK(policy == FIXED_SLOT);
value_ |= BasicPolicyField::encode(policy);
- value_ |= static_cast<int32_t>(index) << FixedSlotIndexField::kShift;
+ value_ |= static_cast<int64_t>(index) << FixedSlotIndexField::kShift;
DCHECK(this->fixed_slot_index() == index);
}
@@ -196,35 +207,33 @@ class UnallocatedOperand : public InstructionOperand {
// because it accommodates a larger pay-load.
//
// For FIXED_SLOT policy:
- // +-----------------------------+
- // | slot_index | 0 | 001 |
- // +-----------------------------+
+ // +------------------------------------------------+
+ // | slot_index | 0 | virtual_register | 001 |
+ // +------------------------------------------------+
//
// For all other (extended) policies:
- // +----------------------------------+
- // | reg_index | L | PPP | 1 | 001 | L ... Lifetime
- // +----------------------------------+ P ... Policy
+ // +-----------------------------------------------------+
+ // | 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.
- // The superclass has a KindField.
- STATIC_ASSERT(KindField::kSize == 3);
+ // All bits fit into the index field.
+ STATIC_ASSERT(IndexField::kShift == 35);
// BitFields for all unallocated operands.
- class BasicPolicyField : public BitField<BasicPolicy, 3, 1> {};
+ class BasicPolicyField : public BitField64<BasicPolicy, 35, 1> {};
// BitFields specific to BasicPolicy::FIXED_SLOT.
- class FixedSlotIndexField : public BitField<int, 4, 28> {};
+ class FixedSlotIndexField : public BitField64<int, 36, 28> {};
// BitFields specific to BasicPolicy::EXTENDED_POLICY.
- class ExtendedPolicyField : public BitField<ExtendedPolicy, 4, 3> {};
- class LifetimeField : public BitField<Lifetime, 7, 1> {};
- class FixedRegisterField : public BitField<int, 8, 6> {};
-
- static const int kFixedSlotIndexWidth = FixedSlotIndexField::kSize;
- static const int kMaxFixedSlotIndex = (1 << (kFixedSlotIndexWidth - 1)) - 1;
- static const int kMinFixedSlotIndex = -(1 << (kFixedSlotIndexWidth - 1));
+ 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 {
@@ -268,7 +277,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<int32_t>(value_) >>
+ return static_cast<int>(static_cast<int64_t>(value_) >>
FixedSlotIndexField::kShift);
}
@@ -281,13 +290,13 @@ class UnallocatedOperand : public InstructionOperand {
// [virtual_register]: The virtual register ID for this operand.
int32_t virtual_register() const {
DCHECK_EQ(UNALLOCATED, kind());
- return virtual_register_;
+ return static_cast<int32_t>(VirtualRegisterField::decode(value_));
}
// TODO(dcarney): remove this.
void set_virtual_register(int32_t id) {
DCHECK_EQ(UNALLOCATED, kind());
- virtual_register_ = id;
+ value_ = VirtualRegisterField::update(value_, static_cast<uint32_t>(id));
}
// [lifetime]: Only for non-FIXED_SLOT.
« no previous file with comments | « no previous file | src/utils.h » ('j') | src/utils.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698