| Index: src/x64/codegen-x64.cc
|
| diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
|
| index fd80e751d740d5e90254bb5a734d30ff08ddbc5b..e0351040039e878326f4dc6f90ea6bde9adc3455 100644
|
| --- a/src/x64/codegen-x64.cc
|
| +++ b/src/x64/codegen-x64.cc
|
| @@ -3772,12 +3772,32 @@ void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) {
|
|
|
| void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 0);
|
| - // ArgumentsAccessStub takes the parameter count as an input argument
|
| - // in register eax. Create a constant result for it.
|
| - Result count(Handle<Smi>(Smi::FromInt(scope()->num_parameters())));
|
| - // Call the shared stub to get to the arguments.length.
|
| - ArgumentsAccessStub stub(ArgumentsAccessStub::READ_LENGTH);
|
| - Result result = frame_->CallStub(&stub, &count);
|
| +
|
| + Result fp = allocator_->Allocate();
|
| + Result result = allocator_->Allocate();
|
| + ASSERT(fp.is_valid() && result.is_valid());
|
| +
|
| + Label exit;
|
| +
|
| + // Get the number of formal parameters.
|
| + __ Move(result.reg(), Smi::FromInt(scope()->num_parameters()));
|
| +
|
| + // Check if the calling frame is an arguments adaptor frame.
|
| + __ movq(fp.reg(), Operand(rbp, StandardFrameConstants::kCallerFPOffset));
|
| + __ SmiCompare(Operand(fp.reg(), StandardFrameConstants::kContextOffset),
|
| + Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
| + __ j(not_equal, &exit);
|
| +
|
| + // Arguments adaptor case: Read the arguments length from the
|
| + // adaptor frame.
|
| + __ movq(result.reg(),
|
| + Operand(fp.reg(), ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| +
|
| + __ bind(&exit);
|
| + result.set_type_info(TypeInfo::Smi());
|
| + if (FLAG_debug_code) {
|
| + __ AbortIfNotSmi(result.reg(), "Computed arguments.length is not a smi.");
|
| + }
|
| frame_->Push(&result);
|
| }
|
|
|
| @@ -7787,23 +7807,6 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) {
|
| - // Check if the calling frame is an arguments adaptor frame.
|
| - Label adaptor;
|
| - __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
|
| - __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset),
|
| - Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
| -
|
| - // Arguments adaptor case: Read the arguments length from the
|
| - // adaptor frame and return it.
|
| - // Otherwise nothing to do: The number of formal parameters has already been
|
| - // passed in register eax by calling function. Just return it.
|
| - __ cmovq(equal, rax,
|
| - Operand(rdx, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| - __ ret(0);
|
| -}
|
| -
|
| -
|
| void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
|
| // Check that stack should contain next handler, frame pointer, state and
|
| // return address in that order.
|
|
|