 Chromium Code Reviews
 Chromium Code Reviews Issue 1961004:
  First step towards making JumpTarget work on ARM.  Instead...  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
    
  
    Issue 1961004:
  First step towards making JumpTarget work on ARM.  Instead...  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/| 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 |