Chromium Code Reviews| Index: src/codegen-ia32.cc |
| =================================================================== |
| --- src/codegen-ia32.cc (revision 1618) |
| +++ src/codegen-ia32.cc (working copy) |
| @@ -4380,9 +4380,12 @@ |
| void CodeGenerator::GenerateArgumentsAccess(ZoneList<Expression*>* args) { |
| ASSERT(args->length() == 1); |
| - // Load the key onto the stack and set register eax to the formal |
| - // parameters count for the currently executing function. |
| + // Load the key into edx and set eax to the formal parameters count |
| + // for the currently executing function. |
| 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(), |
| @@ -4390,8 +4393,8 @@ |
| // Call the shared stub to get to arguments[key]. |
| ArgumentsAccessStub stub(ArgumentsAccessStub::READ_ELEMENT); |
| - Result result = frame_->CallStub(&stub, ¶meters_count, 0); |
| - frame_->SetElementAt(0, &result); |
| + Result result = frame_->CallStub(&stub, ¶meters_count, &key, 0); |
| + frame_->Push(&result); |
| } |
| @@ -6289,6 +6292,8 @@ |
| void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| + // The key is in edx and the parameter count is in eax. |
| + |
| // The displacement is used for skipping the frame pointer on the |
| // stack. It is the offset of the last parameter (if any) relative |
| // to the frame pointer. |
| @@ -6296,48 +6301,51 @@ |
| // Check that the key is a smi. |
| Label slow; |
| - __ mov(ebx, Operand(esp, 1 * kPointerSize)); // skip return address |
| - __ test(ebx, Immediate(kSmiTagMask)); |
| + __ test(edx, Immediate(kSmiTagMask)); |
| __ j(not_zero, &slow, not_taken); |
| // Check if the calling frame is an arguments adaptor frame. |
| Label adaptor; |
| - __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
| - __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); |
| + __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
| + __ mov(ecx, Operand(ebx, StandardFrameConstants::kContextOffset)); |
| __ cmp(ecx, ArgumentsAdaptorFrame::SENTINEL); |
| __ j(equal, &adaptor); |
| // Check index against formal parameters count limit passed in |
| // through register eax. Use unsigned comparison to get negative |
| // check for free. |
| - __ cmp(ebx, Operand(eax)); |
| + __ cmp(edx, Operand(eax)); |
| __ j(above_equal, &slow, not_taken); |
| // Read the argument from the stack and return it. |
| ASSERT(kSmiTagSize == 1 && kSmiTag == 0); // shifting code depends on this |
| - __ lea(edx, Operand(ebp, eax, times_2, 0)); |
| - __ neg(ebx); |
| - __ mov(eax, Operand(edx, ebx, times_2, kDisplacement)); |
| + __ lea(ebx, Operand(ebp, eax, times_2, 0)); |
| + __ neg(edx); |
| + __ mov(eax, Operand(ebx, edx, times_2, kDisplacement)); |
| __ ret(0); |
| // Arguments adaptor case: Check index against actual arguments |
| // limit found in the arguments adaptor frame. Use unsigned |
| // comparison to get negative check for free. |
| __ bind(&adaptor); |
| - __ mov(ecx, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| - __ cmp(ebx, Operand(ecx)); |
| + __ mov(ecx, Operand(ebx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| + __ cmp(edx, Operand(ecx)); |
| __ j(above_equal, &slow, not_taken); |
| // Read the argument from the stack and return it. |
| ASSERT(kSmiTagSize == 1 && kSmiTag == 0); // shifting code depends on this |
| - __ lea(edx, Operand(edx, ecx, times_2, 0)); |
| - __ neg(ebx); |
| - __ mov(eax, Operand(edx, ebx, times_2, kDisplacement)); |
| + __ lea(ebx, Operand(ebx, ecx, times_2, 0)); |
| + __ neg(edx); |
| + __ mov(eax, Operand(ebx, edx, times_2, kDisplacement)); |
| __ ret(0); |
| // Slow-case: Handle non-smi or out-of-bounds access to arguments |
| // by calling the runtime system. |
| __ bind(&slow); |
| + __ int3(); |
|
Kevin Millikin (Chromium)
2009/03/26 12:45:00
Oops. Removed.
|
| + __ pop(ebx); // Return address. |
| + __ push(edx); |
| + __ push(ebx); |
| __ TailCallRuntime(ExternalReference(Runtime::kGetArgumentsProperty), 1); |
| } |