Index: src/arm/virtual-frame-arm.cc |
=================================================================== |
--- src/arm/virtual-frame-arm.cc (revision 4770) |
+++ src/arm/virtual-frame-arm.cc (working copy) |
@@ -43,7 +43,7 @@ |
// Shuffle things around so the top of stack is in r0 and r1. |
MergeTOSTo(R0_R1_TOS); |
// Pop the two registers off the stack so they are detached from the frame. |
- element_count_ -= 2; |
+ LowerHeight(2); |
top_of_stack_state_ = NO_TOS_REGISTERS; |
} |
@@ -52,7 +52,7 @@ |
// Shuffle things around so the top of stack is only in r1. |
MergeTOSTo(R1_TOS); |
// Pop the register off the stack so it is detached from the frame. |
- element_count_ -= 1; |
+ LowerHeight(1); |
top_of_stack_state_ = NO_TOS_REGISTERS; |
} |
@@ -61,18 +61,27 @@ |
// Shuffle things around so the top of stack only in r0. |
MergeTOSTo(R0_TOS); |
// Pop the register off the stack so it is detached from the frame. |
- element_count_ -= 1; |
+ LowerHeight(1); |
top_of_stack_state_ = NO_TOS_REGISTERS; |
} |
void VirtualFrame::MergeTo(const VirtualFrame* expected, Condition cond) { |
if (Equals(expected)) return; |
+ ASSERT(expected->IsCompatibleWith(this)); |
MergeTOSTo(expected->top_of_stack_state_, cond); |
ASSERT(register_allocation_map_ == expected->register_allocation_map_); |
} |
+void VirtualFrame::MergeTo(VirtualFrame* expected, Condition cond) { |
+ if (Equals(expected)) return; |
+ expected->tos_known_smi_map_ &= tos_known_smi_map_; |
+ MergeTOSTo(expected->top_of_stack_state_, cond); |
+ ASSERT(register_allocation_map_ == expected->register_allocation_map_); |
+} |
+ |
+ |
void VirtualFrame::MergeTOSTo( |
VirtualFrame::TopOfStack expected_top_of_stack_state, Condition cond) { |
#define CASE_NUMBER(a, b) ((a) * TOS_STATES + (b)) |
@@ -420,7 +429,7 @@ |
} |
if (count == 0) return; |
__ add(sp, sp, Operand(count * kPointerSize)); |
- element_count_ -= count; |
+ LowerHeight(count); |
} |
@@ -430,7 +439,7 @@ |
} else { |
top_of_stack_state_ = kStateAfterPop[top_of_stack_state_]; |
} |
- element_count_--; |
+ LowerHeight(1); |
} |
@@ -442,7 +451,7 @@ |
__ mov(reg, kTopRegister[top_of_stack_state_]); |
top_of_stack_state_ = kStateAfterPop[top_of_stack_state_]; |
} |
- element_count_--; |
+ LowerHeight(1); |
} |
@@ -550,7 +559,7 @@ |
UNREACHABLE(); |
} |
} |
- element_count_++; |
+ RaiseHeight(1, tos_known_smi_map_ & 1); |
} |
@@ -589,7 +598,7 @@ |
UNREACHABLE(); |
} |
} |
- element_count_ += 2; |
+ RaiseHeight(2, tos_known_smi_map_ & 3); |
} |
@@ -597,7 +606,7 @@ |
ASSERT(but_not_to_this_one.is(r0) || |
but_not_to_this_one.is(r1) || |
but_not_to_this_one.is(no_reg)); |
- element_count_--; |
+ LowerHeight(1); |
if (top_of_stack_state_ == NO_TOS_REGISTERS) { |
if (but_not_to_this_one.is(r0)) { |
__ pop(r1); |
@@ -625,8 +634,8 @@ |
} |
-void VirtualFrame::EmitPush(Register reg) { |
- element_count_++; |
+void VirtualFrame::EmitPush(Register reg, TypeInfo info) { |
+ RaiseHeight(1, info.IsSmi() ? 1 : 0); |
if (reg.is(cp)) { |
// If we are pushing cp then we are about to make a call and things have to |
// be pushed to the physical stack. There's nothing to be gained my moving |
@@ -659,6 +668,9 @@ |
void VirtualFrame::SetElementAt(Register reg, int this_far_down) { |
+ if (this_far_down < kTOSKnownSmiMapSize) { |
+ tos_known_smi_map_ &= ~(1 << this_far_down); |
+ } |
if (this_far_down == 0) { |
Pop(); |
Register dest = GetTOSRegister(); |
@@ -699,8 +711,8 @@ |
} |
-void VirtualFrame::EmitPush(Operand operand) { |
- element_count_++; |
+void VirtualFrame::EmitPush(Operand operand, TypeInfo info) { |
+ RaiseHeight(1, info.IsSmi() ? 1 : 0); |
if (SpilledScope::is_spilled()) { |
__ mov(r0, operand); |
__ push(r0); |
@@ -712,8 +724,8 @@ |
} |
-void VirtualFrame::EmitPush(MemOperand operand) { |
- element_count_++; |
+void VirtualFrame::EmitPush(MemOperand operand, TypeInfo info) { |
+ RaiseHeight(1, info.IsSmi() ? 1 : 0); |
if (SpilledScope::is_spilled()) { |
__ ldr(r0, operand); |
__ push(r0); |
@@ -726,7 +738,7 @@ |
void VirtualFrame::EmitPushRoot(Heap::RootListIndex index) { |
- element_count_++; |
+ RaiseHeight(1, 0); |
if (SpilledScope::is_spilled()) { |
__ LoadRoot(r0, index); |
__ push(r0); |