Index: src/arm/virtual-frame-arm.h |
=================================================================== |
--- src/arm/virtual-frame-arm.h (revision 4770) |
+++ src/arm/virtual-frame-arm.h (working copy) |
@@ -154,10 +154,7 @@ |
// Forget elements from the top of the frame to match an actual frame (eg, |
// the frame after a runtime call). No code is emitted except to bring the |
// frame to a spilled state. |
- void Forget(int count) { |
- SpillAll(); |
- element_count_ -= count; |
- } |
+ void Forget(int count); |
// Spill all values from the frame to memory. |
void SpillAll(); |
@@ -184,8 +181,14 @@ |
// Make this virtual frame have a state identical to an expected virtual |
// frame. As a side effect, code may be emitted to make this frame match |
// the expected one. |
+ void MergeTo(VirtualFrame* expected, Condition cond = al); |
void MergeTo(const VirtualFrame* expected, Condition cond = al); |
+ // Checks whether this frame can be branched to by the other frame. |
+ bool IsCompatibleWith(const VirtualFrame* other) const { |
+ return (tos_known_smi_map_ & (~other->tos_known_smi_map_)) == 0; |
+ } |
+ |
// Detach a frame from its code generator, perhaps temporarily. This |
// tells the register allocator that it is free to use frame-internal |
// registers. Used when the code generator's frame is switched from this |
@@ -234,6 +237,11 @@ |
return MemOperand(sp, adjusted_index * kPointerSize); |
} |
+ bool KnownSmiAt(int index) { |
+ if (index >= kTOSKnownSmiMapSize) return false; |
+ return (tos_known_smi_map_ & (1 << index)) != 0; |
+ } |
+ |
// A frame-allocated local as an assembly operand. |
inline MemOperand LocalAt(int index); |
@@ -352,9 +360,9 @@ |
// Push an element on top of the expression stack and emit a |
// corresponding push instruction. |
- void EmitPush(Register reg); |
- void EmitPush(Operand operand); |
- void EmitPush(MemOperand operand); |
+ void EmitPush(Register reg, TypeInfo type_info = TypeInfo::Unknown()); |
+ void EmitPush(Operand operand, TypeInfo type_info = TypeInfo::Unknown()); |
+ void EmitPush(MemOperand operand, TypeInfo type_info = TypeInfo::Unknown()); |
void EmitPushRoot(Heap::RootListIndex index); |
// Overwrite the nth thing on the stack. If the nth position is in a |
@@ -419,6 +427,8 @@ |
int element_count_; |
TopOfStack top_of_stack_state_:3; |
int register_allocation_map_:kNumberOfAllocatedRegisters; |
+ static const int kTOSKnownSmiMapSize = 4; |
+ unsigned tos_known_smi_map_:kTOSKnownSmiMapSize; |
// The index of the element that is at the processor's stack pointer |
// (the sp register). For now since everything is in memory it is given |
@@ -473,6 +483,25 @@ |
inline bool Equals(const VirtualFrame* other); |
+ inline void LowerHeight(int count) { |
+ element_count_ -= count; |
+ if (count >= kTOSKnownSmiMapSize) { |
+ tos_known_smi_map_ = 0; |
+ } else { |
+ tos_known_smi_map_ >>= count; |
+ } |
+ } |
+ |
+ inline void RaiseHeight(int count, unsigned known_smi_map = 0) { |
+ ASSERT(known_smi_map < (1u << count)); |
+ element_count_ += count; |
+ if (count >= kTOSKnownSmiMapSize) { |
+ tos_known_smi_map_ = known_smi_map; |
+ } else { |
+ tos_known_smi_map_ = ((tos_known_smi_map_ << count) | known_smi_map); |
+ } |
+ } |
+ |
friend class JumpTarget; |
}; |