Index: src/compiler/linkage.h |
diff --git a/src/compiler/linkage.h b/src/compiler/linkage.h |
index 2fee957fa3144cb84596915573da7cead7f9a7ba..033a1cfae613715a616ff13a06ae622eba0fa4af 100644 |
--- a/src/compiler/linkage.h |
+++ b/src/compiler/linkage.h |
@@ -26,33 +26,77 @@ class OsrHelper; |
// Describes the location for a parameter or a return value to a call. |
class LinkageLocation { |
public: |
- explicit LinkageLocation(int location) : location_(location) {} |
+ bool operator==(const LinkageLocation& other) const { |
+ return bit_field_ == other.bit_field_; |
+ } |
- bool is_register() const { |
- return 0 <= location_ && location_ <= ANY_REGISTER; |
+ bool operator!=(const LinkageLocation& other) const { |
+ return !(*this == other); |
} |
- static const int16_t ANY_REGISTER = 1023; |
- static const int16_t MAX_STACK_SLOT = 32767; |
+ static LinkageLocation ForAnyRegister() { |
+ return LinkageLocation(REGISTER, ANY_REGISTER); |
+ } |
- static LinkageLocation AnyRegister() { return LinkageLocation(ANY_REGISTER); } |
+ static LinkageLocation ForRegister(int32_t reg) { |
+ DCHECK(reg >= 0); |
+ return LinkageLocation(REGISTER, reg); |
+ } |
- bool operator==(const LinkageLocation& other) const { |
- return location_ == other.location_; |
+ static LinkageLocation ForCallerFrameSlot(int32_t slot) { |
+ DCHECK(slot < 0); |
+ return LinkageLocation(STACK_SLOT, slot); |
} |
- bool operator!=(const LinkageLocation& other) const { |
- return !(*this == other); |
+ static LinkageLocation ForCalleeFrameSlot(int32_t slot) { |
+ // TODO(titzer): bailout instead of crashing here. |
+ DCHECK(slot >= 0 && slot < LinkageLocation::MAX_STACK_SLOT); |
+ return LinkageLocation(STACK_SLOT, slot); |
} |
private: |
friend class CallDescriptor; |
friend class OperandGenerator; |
- // location < 0 -> a stack slot on the caller frame |
- // 0 <= location < 1023 -> a specific machine register |
- // 1023 <= location < 1024 -> any machine register |
- // 1024 <= location -> a stack slot in the callee frame |
- int16_t location_; |
+ |
+ enum LocationType { REGISTER, STACK_SLOT }; |
+ |
+ class TypeField : public BitField<LocationType, 0, 1> {}; |
+ class LocationField : public BitField<int32_t, TypeField::kNext, 31> {}; |
+ |
+ static const int32_t ANY_REGISTER = -1; |
+ static const int32_t MAX_STACK_SLOT = 32767; |
+ |
+ LinkageLocation(LocationType type, int32_t location) { |
+ bit_field_ = TypeField::encode(type) | |
+ ((location << LocationField::kShift) & LocationField::kMask); |
+ } |
+ |
+ int32_t GetLocation() const { |
+ return static_cast<int32_t>(bit_field_ & LocationField::kMask) >> |
+ LocationField::kShift; |
+ } |
+ |
+ bool IsRegister() const { return TypeField::decode(bit_field_) == REGISTER; } |
+ bool IsAnyRegister() const { |
+ return IsRegister() && GetLocation() == ANY_REGISTER; |
+ } |
+ bool IsCallerFrameSlot() const { return !IsRegister() && GetLocation() < 0; } |
+ bool IsCalleeFrameSlot() const { return !IsRegister() && GetLocation() >= 0; } |
+ |
+ int32_t AsRegister() const { |
+ DCHECK(IsRegister()); |
+ return GetLocation(); |
+ } |
+ int32_t AsCallerFrameSlot() const { |
+ DCHECK(IsCallerFrameSlot()); |
+ return GetLocation(); |
+ } |
+ int32_t AsCalleeFrameSlot() const { |
+ DCHECK(IsCalleeFrameSlot()); |
+ return GetLocation(); |
+ } |
+ |
+ int32_t bit_field_; |
}; |
typedef Signature<LinkageLocation> LocationSignature; |