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. |