| Index: src/codegen-ia32.cc
|
| ===================================================================
|
| --- src/codegen-ia32.cc (revision 1122)
|
| +++ src/codegen-ia32.cc (working copy)
|
| @@ -174,11 +174,9 @@
|
| ASSERT(scope_->arguments_shadow() != NULL);
|
| Comment cmnt(masm_, "[ Allocate arguments object");
|
| ArgumentsAccessStub stub(ArgumentsAccessStub::NEW_OBJECT);
|
| - VirtualFrame::SpilledScope spilled_scope(this);
|
| - __ lea(eax, frame_->Receiver());
|
| - frame_->EmitPush(frame_->Function());
|
| - frame_->EmitPush(eax);
|
| - frame_->EmitPush(Immediate(Smi::FromInt(scope_->num_parameters())));
|
| + frame_->PushFunction();
|
| + frame_->PushReceiverSlotAddress();
|
| + frame_->Push(Smi::FromInt(scope_->num_parameters()));
|
| Result answer = frame_->CallStub(&stub, 3);
|
| frame_->Push(&answer);
|
| }
|
| @@ -187,14 +185,15 @@
|
| Comment cmnt(masm_, "[ allocate local context");
|
| // Allocate local context.
|
| // Get outer context and create a new context based on it.
|
| - VirtualFrame::SpilledScope spilled_scope(this);
|
| - frame_->EmitPush(frame_->Function());
|
| - frame_->CallRuntime(Runtime::kNewContext, 1); // eax holds the result
|
| + frame_->PushFunction();
|
| + Result context = frame_->CallRuntime(Runtime::kNewContext, 1);
|
|
|
| if (kDebug) {
|
| + frame_->SpillAll(); // Needed for breakpoint below.
|
| JumpTarget verified_true(this);
|
| // Verify eax and esi are the same in debug mode
|
| - __ cmp(eax, Operand(esi));
|
| + __ cmp(context.reg(), Operand(esi));
|
| + context.Unuse();
|
| verified_true.Branch(equal);
|
| __ int3();
|
| verified_true.Bind();
|
| @@ -863,18 +862,17 @@
|
| }
|
|
|
| virtual void Generate() {
|
| - // The argument is actually passed in eax.
|
| - enter()->Bind();
|
| - VirtualFrame::SpilledScope spilled_scope(generator());
|
| + Result arg(generator());
|
| + enter()->Bind(&arg);
|
| + arg.ToRegister();
|
| + generator()->frame()->Spill(arg.reg());
|
| // Undo the optimistic add operation and call the shared stub.
|
| - Immediate immediate(Smi::FromInt(value_));
|
| - __ sub(Operand(eax), immediate);
|
| - generator()->frame()->EmitPush(eax);
|
| - generator()->frame()->EmitPush(immediate);
|
| + __ sub(Operand(arg.reg()), Immediate(Smi::FromInt(value_)));
|
| + generator()->frame()->Push(&arg);
|
| + generator()->frame()->Push(Smi::FromInt(value_));
|
| GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED);
|
| - generator()->frame()->CallStub(&igostub, 2);
|
| - // The result is actually returned in eax.
|
| - exit()->Jump();
|
| + Result result = generator()->frame()->CallStub(&igostub, 2);
|
| + exit()->Jump(&result);
|
| }
|
|
|
| private:
|
| @@ -892,18 +890,18 @@
|
| }
|
|
|
| virtual void Generate() {
|
| - // The argument is actually passed in eax.
|
| - enter()->Bind();
|
| - VirtualFrame::SpilledScope spilled_scope(generator());
|
| + Result arg(generator());
|
| + enter()->Bind(&arg);
|
| + arg.ToRegister();
|
| + generator()->frame()->Spill(arg.reg()); // Should not be needed.
|
| // Undo the optimistic add operation and call the shared stub.
|
| Immediate immediate(Smi::FromInt(value_));
|
| - __ sub(Operand(eax), immediate);
|
| - generator()->frame()->EmitPush(immediate);
|
| - generator()->frame()->EmitPush(eax);
|
| + __ sub(Operand(arg.reg()), immediate);
|
| + generator()->frame()->Push(Smi::FromInt(value_));
|
| + generator()->frame()->Push(&arg);
|
| GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED);
|
| - generator()->frame()->CallStub(&igostub, 2);
|
| - // The result is actually returned in eax.
|
| - exit()->Jump();
|
| + arg = generator()->frame()->CallStub(&igostub, 2);
|
| + exit()->Jump(&arg);
|
| }
|
|
|
| private:
|
| @@ -1001,13 +999,15 @@
|
| deferred = new DeferredInlinedSmiAddReversed(this, int_value,
|
| overwrite_mode);
|
| }
|
| - frame_->EmitPop(eax);
|
| - __ add(Operand(eax), Immediate(value));
|
| - deferred->enter()->Branch(overflow, not_taken);
|
| - __ test(eax, Immediate(kSmiTagMask));
|
| - deferred->enter()->Branch(not_zero, not_taken);
|
| - deferred->exit()->Bind();
|
| - frame_->EmitPush(eax);
|
| + Result operand = frame_->Pop();
|
| + operand.ToRegister();
|
| + frame_->Spill(operand.reg());
|
| + __ add(Operand(operand.reg()), Immediate(value));
|
| + deferred->enter()->Branch(overflow, &operand, not_taken);
|
| + __ test(Operand(operand.reg()), Immediate(kSmiTagMask));
|
| + deferred->enter()->Branch(not_zero, &operand, not_taken);
|
| + deferred->exit()->Bind(&operand);
|
| + frame_->Push(&operand);
|
| break;
|
| }
|
|
|
| @@ -3015,7 +3015,7 @@
|
| if (target.is_illegal()) {
|
| // Fool the virtual frame into thinking that we left the assignment's
|
| // value on the frame.
|
| - frame_->Push(Handle<Object>(Smi::FromInt(0)));
|
| + frame_->Push(Smi::FromInt(0));
|
| return;
|
| }
|
|
|
| @@ -3865,7 +3865,7 @@
|
|
|
| // Postfix: Make room for the result.
|
| if (is_postfix) {
|
| - frame_->Push(Handle<Object>(Smi::FromInt(0)));
|
| + frame_->Push(Smi::FromInt(0));
|
| }
|
|
|
| { Reference target(this, node->expression());
|
| @@ -3873,7 +3873,7 @@
|
| // Spoof the virtual frame to have the expected height (one higher
|
| // than on entry).
|
| if (!is_postfix) {
|
| - frame_->Push(Handle<Object>(Smi::FromInt(0)));
|
| + frame_->Push(Smi::FromInt(0));
|
| }
|
| return;
|
| }
|
|
|