Chromium Code Reviews| Index: src/arm/codegen-arm.cc |
| =================================================================== |
| --- src/arm/codegen-arm.cc (revision 4641) |
| +++ src/arm/codegen-arm.cc (working copy) |
| @@ -4958,7 +4958,6 @@ |
| #ifdef DEBUG |
| int original_height = frame_->height(); |
| #endif |
| - VirtualFrame::SpilledScope spilled_scope(frame_); |
| Comment cmnt(masm_, "[ CountOperation"); |
| bool is_postfix = node->is_postfix(); |
| @@ -4967,10 +4966,8 @@ |
| Variable* var = node->expression()->AsVariableProxy()->AsVariable(); |
| bool is_const = (var != NULL && var->mode() == Variable::CONST); |
| - // Postfix: Make room for the result. |
| if (is_postfix) { |
| - __ mov(r0, Operand(0)); |
| - frame_->EmitPush(r0); |
| + frame_->EmitPush(Operand(Smi::FromInt(0))); |
| } |
| // A constant reference is not saved to, so a constant reference is not a |
| @@ -4980,35 +4977,33 @@ |
| // Spoof the virtual frame to have the expected height (one higher |
| // than on entry). |
| if (!is_postfix) { |
| - __ mov(r0, Operand(Smi::FromInt(0))); |
| - frame_->EmitPush(r0); |
| + frame_->EmitPush(Operand(Smi::FromInt(0))); |
| } |
| ASSERT_EQ(original_height + 1, frame_->height()); |
| return; |
| } |
| + // This pushes 0, 1 or 2 words on the object to be used later when updating |
| + // the target. It also pushes the current value of the target. |
| target.GetValue(); |
| - frame_->EmitPop(r0); |
| JumpTarget slow; |
| JumpTarget exit; |
| - // Load the value (1) into register r1. |
| - __ mov(r1, Operand(Smi::FromInt(1))); |
| - |
| // Check for smi operand. |
| - __ tst(r0, Operand(kSmiTagMask)); |
| + Register tos = frame_->PopToRegister(); |
| + __ tst(tos, Operand(kSmiTagMask)); |
| slow.Branch(ne); |
| // Postfix: Store the old value as the result. |
| if (is_postfix) { |
| - __ str(r0, frame_->ElementAt(target.size())); |
| + frame_->OverwriteStackPosition(tos, target.size()); |
| } |
| // Perform optimistic increment/decrement. |
| if (is_increment) { |
| - __ add(r0, r0, Operand(r1), SetCC); |
| + __ add(tos, tos, Operand(Smi::FromInt(1)), SetCC); |
| } else { |
| - __ sub(r0, r0, Operand(r1), SetCC); |
| + __ sub(tos, tos, Operand(Smi::FromInt(1)), SetCC); |
| } |
| // If the increment/decrement didn't overflow, we're done. |
| @@ -5016,41 +5011,49 @@ |
| // Revert optimistic increment/decrement. |
| if (is_increment) { |
| - __ sub(r0, r0, Operand(r1)); |
| + __ sub(tos, tos, Operand(Smi::FromInt(1))); |
| } else { |
| - __ add(r0, r0, Operand(r1)); |
| + __ add(tos, tos, Operand(Smi::FromInt(1))); |
| } |
| - // Slow case: Convert to number. |
| + // Slow case: Convert to number. At this point the |
| + // value to be incremented is in the tos register.. |
| slow.Bind(); |
| - { |
| - // Convert the operand to a number. |
| - frame_->EmitPush(r0); |
| - frame_->InvokeBuiltin(Builtins::TO_NUMBER, CALL_JS, 1); |
| - } |
| + |
| + // Convert the operand to a number. |
| + frame_->EmitPush(tos); |
| + |
| + // Work with a spilled frame from here. |
| + frame_->SpillAll(); |
| + frame_->InvokeBuiltin(Builtins::TO_NUMBER, CALL_JS, 1); |
| + |
| if (is_postfix) { |
| // Postfix: store to result (on the stack). |
| __ str(r0, frame_->ElementAt(target.size())); |
| } |
| // Compute the new value. |
| - __ mov(r1, Operand(Smi::FromInt(1))); |
| frame_->EmitPush(r0); |
| - frame_->EmitPush(r1); |
| + frame_->EmitPush(Operand(Smi::FromInt(1))); |
| if (is_increment) { |
| frame_->CallRuntime(Runtime::kNumberAdd, 2); |
| } else { |
| frame_->CallRuntime(Runtime::kNumberSub, 2); |
| } |
| + __ Move(tos, r0); |
|
Søren Thygesen Gjesse
2010/05/11 13:46:12
Perhaps make a spill scope from SpillAll above to
Erik Corry
2010/05/12 09:00:32
Done.
|
| // Store the new value in the target if not const. |
| + // At this point the answer is in the tos register. |
| exit.Bind(); |
| - frame_->EmitPush(r0); |
| + frame_->EmitPush(tos); |
| + // Set the target with the result, leaving the result on |
| + // top of the stack. Removes the target from the stack if |
| + // it has a non-zero size. |
| if (!is_const) target.SetValue(NOT_CONST_INIT); |
| } |
| // Postfix: Discard the new value and use the old. |
| - if (is_postfix) frame_->EmitPop(r0); |
| + if (is_postfix) frame_->Pop(); |
| ASSERT_EQ(original_height + 1, frame_->height()); |
| } |