Index: src/compiler/instruction.h |
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
index 72299efedda8a5e8fbe0b281466a791f993a4d94..15d6d4c17b508ebdc6af25e1e911967a4f474a9d 100644 |
--- a/src/compiler/instruction.h |
+++ b/src/compiler/instruction.h |
@@ -33,7 +33,17 @@ class InstructionOperand { |
// TODO(dcarney): recover bit. INVALID can be represented as UNALLOCATED with |
// kInvalidVirtualRegister and some DCHECKS. |
- enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, EXPLICIT, ALLOCATED }; |
+ enum Kind { |
+ INVALID, |
+ UNALLOCATED, |
+ CONSTANT, |
+ IMMEDIATE, |
+ // Location operand kinds. |
+ EXPLICIT, |
+ ALLOCATED, |
+ FIRST_LOCATION_OPERAND_KIND = EXPLICIT |
+ // Location operand kinds must be last. |
+ }; |
InstructionOperand() : InstructionOperand(INVALID) {} |
@@ -64,12 +74,16 @@ class InstructionOperand { |
INSTRUCTION_OPERAND_PREDICATE(Allocated, ALLOCATED) |
#undef INSTRUCTION_OPERAND_PREDICATE |
+ inline bool IsAnyLocationOperand() const; |
+ inline bool IsLocationOperand() const; |
+ inline bool IsFPLocationOperand() const; |
inline bool IsAnyRegister() const; |
inline bool IsRegister() const; |
inline bool IsFPRegister() const; |
inline bool IsFloatRegister() const; |
inline bool IsDoubleRegister() const; |
inline bool IsSimd128Register() const; |
+ inline bool IsAnyStackSlot() const; |
inline bool IsStackSlot() const; |
inline bool IsFPStackSlot() const; |
inline bool IsFloatStackSlot() const; |
@@ -482,17 +496,17 @@ class LocationOperand : public InstructionOperand { |
} |
static LocationOperand* cast(InstructionOperand* op) { |
- DCHECK(ALLOCATED == op->kind() || EXPLICIT == op->kind()); |
+ DCHECK(op->IsAnyLocationOperand()); |
return static_cast<LocationOperand*>(op); |
} |
static const LocationOperand* cast(const InstructionOperand* op) { |
- DCHECK(ALLOCATED == op->kind() || EXPLICIT == op->kind()); |
+ DCHECK(op->IsAnyLocationOperand()); |
return static_cast<const LocationOperand*>(op); |
} |
static LocationOperand cast(const InstructionOperand& op) { |
- DCHECK(ALLOCATED == op.kind() || EXPLICIT == op.kind()); |
+ DCHECK(op.IsAnyLocationOperand()); |
return *static_cast<const LocationOperand*>(&op); |
} |
@@ -532,9 +546,22 @@ class AllocatedOperand : public LocationOperand { |
#undef INSTRUCTION_OPERAND_CASTS |
+bool InstructionOperand::IsAnyLocationOperand() const { |
+ return this->kind() >= FIRST_LOCATION_OPERAND_KIND; |
+} |
+ |
+bool InstructionOperand::IsLocationOperand() const { |
+ return IsAnyLocationOperand() && |
+ !IsFloatingPoint(LocationOperand::cast(this)->representation()); |
+} |
+ |
+bool InstructionOperand::IsFPLocationOperand() const { |
+ return IsAnyLocationOperand() && |
+ IsFloatingPoint(LocationOperand::cast(this)->representation()); |
+} |
bool InstructionOperand::IsAnyRegister() const { |
- return (IsAllocated() || IsExplicit()) && |
+ return IsAnyLocationOperand() && |
LocationOperand::cast(this)->location_kind() == |
LocationOperand::REGISTER; |
} |
@@ -568,22 +595,24 @@ bool InstructionOperand::IsSimd128Register() const { |
MachineRepresentation::kSimd128; |
} |
-bool InstructionOperand::IsStackSlot() const { |
- return (IsAllocated() || IsExplicit()) && |
+bool InstructionOperand::IsAnyStackSlot() const { |
+ return IsAnyLocationOperand() && |
LocationOperand::cast(this)->location_kind() == |
- LocationOperand::STACK_SLOT && |
+ LocationOperand::STACK_SLOT; |
+} |
+ |
+bool InstructionOperand::IsStackSlot() const { |
+ return IsAnyStackSlot() && |
!IsFloatingPoint(LocationOperand::cast(this)->representation()); |
} |
bool InstructionOperand::IsFPStackSlot() const { |
- return (IsAllocated() || IsExplicit()) && |
- LocationOperand::cast(this)->location_kind() == |
- LocationOperand::STACK_SLOT && |
+ return IsAnyStackSlot() && |
IsFloatingPoint(LocationOperand::cast(this)->representation()); |
} |
bool InstructionOperand::IsFloatStackSlot() const { |
- return (IsAllocated() || IsExplicit()) && |
+ return IsAnyLocationOperand() && |
LocationOperand::cast(this)->location_kind() == |
LocationOperand::STACK_SLOT && |
LocationOperand::cast(this)->representation() == |
@@ -591,7 +620,7 @@ bool InstructionOperand::IsFloatStackSlot() const { |
} |
bool InstructionOperand::IsDoubleStackSlot() const { |
- return (IsAllocated() || IsExplicit()) && |
+ return IsAnyLocationOperand() && |
LocationOperand::cast(this)->location_kind() == |
LocationOperand::STACK_SLOT && |
LocationOperand::cast(this)->representation() == |
@@ -599,7 +628,7 @@ bool InstructionOperand::IsDoubleStackSlot() const { |
} |
bool InstructionOperand::IsSimd128StackSlot() const { |
- return (IsAllocated() || IsExplicit()) && |
+ return IsAnyLocationOperand() && |
LocationOperand::cast(this)->location_kind() == |
LocationOperand::STACK_SLOT && |
LocationOperand::cast(this)->representation() == |
@@ -607,7 +636,7 @@ bool InstructionOperand::IsSimd128StackSlot() const { |
} |
uint64_t InstructionOperand::GetCanonicalizedValue() const { |
- if (IsAllocated() || IsExplicit()) { |
+ if (IsAnyLocationOperand()) { |
MachineRepresentation canonical = MachineRepresentation::kNone; |
if (IsFPRegister()) { |
// We treat all FP register operands the same for simple aliasing. |