Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 5067) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -3428,49 +3428,56 @@ |
CodeForStatementPosition(node); |
Slot* loop_var_slot = loop_var->slot(); |
if (loop_var_slot->type() == Slot::LOCAL) { |
- frame_->PushLocalAt(loop_var_slot->index()); |
+ frame_->TakeLocalAt(loop_var_slot->index()); |
} else { |
ASSERT(loop_var_slot->type() == Slot::PARAMETER); |
- frame_->PushParameterAt(loop_var_slot->index()); |
+ frame_->TakeParameterAt(loop_var_slot->index()); |
} |
Result loop_var_result = frame_->Pop(); |
if (!loop_var_result.is_register()) { |
loop_var_result.ToRegister(); |
} |
- |
+ Register loop_var_reg = loop_var_result.reg(); |
+ frame_->Spill(loop_var_reg); |
if (increments) { |
- __ SmiAddConstant(loop_var_result.reg(), |
- loop_var_result.reg(), |
+ __ SmiAddConstant(loop_var_reg, |
+ loop_var_reg, |
Smi::FromInt(1)); |
} else { |
- __ SmiSubConstant(loop_var_result.reg(), |
- loop_var_result.reg(), |
+ __ SmiSubConstant(loop_var_reg, |
+ loop_var_reg, |
Smi::FromInt(1)); |
} |
- { |
- __ SmiCompare(loop_var_result.reg(), limit_value); |
- Condition condition; |
- switch (compare_op) { |
- case Token::LT: |
- condition = less; |
- break; |
- case Token::LTE: |
- condition = less_equal; |
- break; |
- case Token::GT: |
- condition = greater; |
- break; |
- case Token::GTE: |
- condition = greater_equal; |
- break; |
- default: |
- condition = never; |
- UNREACHABLE(); |
- } |
- loop.Branch(condition); |
+ frame_->Push(&loop_var_result); |
+ if (loop_var_slot->type() == Slot::LOCAL) { |
+ frame_->StoreToLocalAt(loop_var_slot->index()); |
+ } else { |
+ ASSERT(loop_var_slot->type() == Slot::PARAMETER); |
+ frame_->StoreToParameterAt(loop_var_slot->index()); |
} |
- loop_var_result.Unuse(); |
+ frame_->Drop(); |
+ |
+ __ SmiCompare(loop_var_reg, limit_value); |
+ Condition condition; |
+ switch (compare_op) { |
+ case Token::LT: |
+ condition = less; |
+ break; |
+ case Token::LTE: |
+ condition = less_equal; |
+ break; |
+ case Token::GT: |
+ condition = greater; |
+ break; |
+ case Token::GTE: |
+ condition = greater_equal; |
+ break; |
+ default: |
+ condition = never; |
+ UNREACHABLE(); |
+ } |
+ loop.Branch(condition); |
} |
if (node->break_target()->is_linked()) { |
node->break_target()->Bind(); |