| 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;
|
| };
|
|
|
|
|