Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4592) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -33,6 +33,7 @@ |
#include "debug.h" |
#include "ic-inl.h" |
#include "jsregexp.h" |
+#include "jump-target-light-inl.h" |
#include "parser.h" |
#include "regexp-macro-assembler.h" |
#include "regexp-stack.h" |
@@ -44,6 +45,22 @@ |
namespace v8 { |
namespace internal { |
+ |
+// These VirtualFrame methods should actually be in a virtual-frame-arm-inl.h |
Søren Thygesen Gjesse
2010/05/06 07:48:11
Considered adding virtual-frame-arm-inl.h?
|
+// file if such a thing existed. |
+MemOperand VirtualFrame::ParameterAt(int index) { |
+ // Index -1 corresponds to the receiver. |
+ ASSERT(-1 <= index); // -1 is the receiver. |
+ ASSERT(index <= parameter_count()); |
+ return MemOperand(fp, (1 + parameter_count() - index) * kPointerSize); |
+} |
+ |
+ // The receiver frame slot. |
+MemOperand VirtualFrame::Receiver() { |
+ return ParameterAt(-1); |
+} |
+ |
+ |
#define __ ACCESS_MASM(masm_) |
static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
@@ -274,7 +291,7 @@ |
// Initialize the function return target after the locals are set |
// up, because it needs the expected frame height from the frame. |
- function_return_.set_direction(JumpTarget::BIDIRECTIONAL); |
+ function_return_.SetExpectedHeight(); |
function_return_is_shadowed_ = false; |
// Generate code to 'execute' declarations and initialize functions |
@@ -1550,7 +1567,7 @@ |
VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment cmnt(masm_, "[ Block"); |
CodeForStatementPosition(node); |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
VisitStatementsAndSpill(node->statements()); |
if (node->break_target()->is_linked()) { |
node->break_target()->Bind(); |
@@ -1837,7 +1854,7 @@ |
VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment cmnt(masm_, "[ SwitchStatement"); |
CodeForStatementPosition(node); |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
LoadAndSpill(node->tag()); |
@@ -1926,7 +1943,7 @@ |
VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment cmnt(masm_, "[ DoWhileStatement"); |
CodeForStatementPosition(node); |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
JumpTarget body(JumpTarget::BIDIRECTIONAL); |
IncrementLoopNesting(); |
@@ -1936,14 +1953,14 @@ |
ConditionAnalysis info = AnalyzeCondition(node->cond()); |
switch (info) { |
case ALWAYS_TRUE: |
- node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
+ node->continue_target()->SetExpectedHeight(); |
node->continue_target()->Bind(); |
break; |
case ALWAYS_FALSE: |
- node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->continue_target()->SetExpectedHeight(); |
break; |
case DONT_KNOW: |
- node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->continue_target()->SetExpectedHeight(); |
body.Bind(); |
break; |
} |
@@ -2007,12 +2024,12 @@ |
ConditionAnalysis info = AnalyzeCondition(node->cond()); |
if (info == ALWAYS_FALSE) return; |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
IncrementLoopNesting(); |
// Label the top of the loop with the continue target for the backward |
// CFG edge. |
- node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
+ node->continue_target()->SetExpectedHeight(); |
node->continue_target()->Bind(); |
if (info == DONT_KNOW) { |
@@ -2061,17 +2078,17 @@ |
ConditionAnalysis info = AnalyzeCondition(node->cond()); |
if (info == ALWAYS_FALSE) return; |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
IncrementLoopNesting(); |
// If there is no update statement, label the top of the loop with the |
// continue target, otherwise with the loop target. |
JumpTarget loop(JumpTarget::BIDIRECTIONAL); |
if (node->next() == NULL) { |
- node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
+ node->continue_target()->SetExpectedHeight(); |
node->continue_target()->Bind(); |
} else { |
- node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->continue_target()->SetExpectedHeight(); |
loop.Bind(); |
} |
@@ -2276,8 +2293,8 @@ |
// sp[4] : enumerable |
// Grab the current frame's height for the break and continue |
// targets only after all the state is pushed on the frame. |
- node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
- node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
+ node->break_target()->SetExpectedHeight(); |
+ node->continue_target()->SetExpectedHeight(); |
__ ldr(r0, frame_->ElementAt(0)); // load the current count |
__ ldr(r1, frame_->ElementAt(1)); // load the length |