| Index: src/codegen-ia32.cc
|
| ===================================================================
|
| --- src/codegen-ia32.cc (revision 1625)
|
| +++ src/codegen-ia32.cc (working copy)
|
| @@ -1508,12 +1508,10 @@
|
| __ test(left_side.reg(), Immediate(kSmiTagMask));
|
| is_smi.Branch(zero, &left_side, &right_side, taken);
|
|
|
| - // Setup and call the compare stub, which expects arguments in edx
|
| - // and eax.
|
| + // Setup and call the compare stub, which expects its arguments
|
| + // in registers.
|
| CompareStub stub(cc, strict);
|
| - left_side.ToRegister(edx); // Only left_side currently uses a register.
|
| - right_side.ToRegister(eax); // left_side is not in eax. eax is free.
|
| - Result result = frame_->CallStub(&stub, &left_side, &right_side, 0);
|
| + Result result = frame_->CallStub(&stub, &left_side, &right_side);
|
| result.ToRegister();
|
| __ cmp(result.reg(), 0);
|
| result.Unuse();
|
| @@ -1588,23 +1586,10 @@
|
| temp.Unuse();
|
| is_smi.Branch(zero, &left_side, &right_side, taken);
|
| }
|
| - // When non-smi, call out to the compare stub. "parameters" setup by
|
| - // calling code in edx and eax and "result" is returned in the flags.
|
| - if (!left_side.reg().is(eax)) {
|
| - right_side.ToRegister(eax);
|
| - left_side.ToRegister(edx);
|
| - } else if (!right_side.reg().is(edx)) {
|
| - left_side.ToRegister(edx);
|
| - right_side.ToRegister(eax);
|
| - } else {
|
| - frame_->Spill(eax); // Can be multiply referenced, even now.
|
| - frame_->Spill(edx);
|
| - __ xchg(eax, edx);
|
| - // If left_side and right_side become real (non-dummy) arguments
|
| - // to CallStub, they need to be swapped in this case.
|
| - }
|
| + // When non-smi, call out to the compare stub, which expects its
|
| + // arguments in registers.
|
| CompareStub stub(cc, strict);
|
| - Result answer = frame_->CallStub(&stub, &right_side, &left_side, 0);
|
| + Result answer = frame_->CallStub(&stub, &left_side, &right_side);
|
| if (cc == equal) {
|
| __ test(answer.reg(), Operand(answer.reg()));
|
| } else {
|
| @@ -4392,15 +4377,12 @@
|
|
|
| void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 0);
|
| - Result initial_value = allocator()->Allocate(eax);
|
| - ASSERT(initial_value.is_valid());
|
| - __ Set(initial_value.reg(),
|
| - Immediate(Smi::FromInt(scope_->num_parameters())));
|
| // ArgumentsAccessStub takes the parameter count as an input argument
|
| - // in register eax.
|
| + // in register eax. Create a constant result for it.
|
| + Result count(Handle<Smi>(Smi::FromInt(scope_->num_parameters())), this);
|
| // Call the shared stub to get to the arguments.length.
|
| ArgumentsAccessStub stub(ArgumentsAccessStub::READ_LENGTH);
|
| - Result result = frame_->CallStub(&stub, &initial_value, 0);
|
| + Result result = frame_->CallStub(&stub, &count);
|
| frame_->Push(&result);
|
| }
|
|
|
| @@ -4475,20 +4457,15 @@
|
| void CodeGenerator::GenerateArgumentsAccess(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 1);
|
|
|
| - // Load the key into edx and set eax to the formal parameters count
|
| - // for the currently executing function.
|
| + // ArgumentsAccessStub expects the key in edx and the formal
|
| + // parameter count in eax.
|
| Load(args->at(0));
|
| Result key = frame_->Pop();
|
| - key.ToRegister(edx);
|
| -
|
| - Result parameters_count = allocator()->Allocate(eax);
|
| - ASSERT(parameters_count.is_valid());
|
| - __ Set(parameters_count.reg(),
|
| - Immediate(Smi::FromInt(scope_->num_parameters())));
|
| -
|
| + // Explicitly create a constant result.
|
| + Result count(Handle<Smi>(Smi::FromInt(scope_->num_parameters())), this);
|
| // Call the shared stub to get to arguments[key].
|
| ArgumentsAccessStub stub(ArgumentsAccessStub::READ_ELEMENT);
|
| - Result result = frame_->CallStub(&stub, ¶meters_count, &key, 0);
|
| + Result result = frame_->CallStub(&stub, &key, &count);
|
| frame_->Push(&result);
|
| }
|
|
|
| @@ -4647,8 +4624,7 @@
|
| UnarySubStub stub;
|
| // TODO(1222589): remove dependency of TOS being cached inside stub
|
| Result operand = frame_->Pop();
|
| - operand.ToRegister(eax);
|
| - Result answer = frame_->CallStub(&stub, &operand, 0);
|
| + Result answer = frame_->CallStub(&stub, &operand);
|
| frame_->Push(&answer);
|
| break;
|
| }
|
| @@ -4781,15 +4757,13 @@
|
|
|
| Result value(cgen);
|
| enter()->Bind(&value);
|
| - value.ToRegister(eax); // The stubs below expect their argument in eax.
|
| -
|
| if (is_postfix_) {
|
| RevertToNumberStub to_number_stub(is_increment_);
|
| - value = generator()->frame()->CallStub(&to_number_stub, &value, 0);
|
| + value = generator()->frame()->CallStub(&to_number_stub, &value);
|
| }
|
|
|
| CounterOpStub stub(result_offset_, is_postfix_, is_increment_);
|
| - value = generator()->frame()->CallStub(&stub, &value, 0);
|
| + value = generator()->frame()->CallStub(&stub, &value);
|
| exit_.Jump(&value);
|
| }
|
|
|
|
|