Chromium Code Reviews| Index: src/ia32/codegen-ia32.cc |
| diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
| index ec384d12638400fa3bd1c96f39436ad48598966b..d07bd0f64e361b387f5436c138ecd325926b571a 100644 |
| --- a/src/ia32/codegen-ia32.cc |
| +++ b/src/ia32/codegen-ia32.cc |
| @@ -6228,12 +6228,30 @@ 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(); |
|
antonm
2010/03/30 13:28:05
shouldn't you Unuse fp and result at the end of th
antonm
2010/03/30 13:28:05
just curious: any chances allocating the single re
Vitaly Repeshko
2010/03/30 13:40:30
~Result will do it. I think it's only necessary wh
Vitaly Repeshko
2010/03/30 13:40:30
Hard to tell. I can experiment more after this cha
fschneider
2010/03/30 13:44:36
Unuse() is called by the destructor of Result at t
|
| + ASSERT(fp.is_valid() && result.is_valid()); |
| + |
| + Label exit; |
| + |
| + // Get the number of formal parameters. |
| + __ Set(result.reg(), Immediate(Smi::FromInt(scope()->num_parameters()))); |
| + |
| + // Check if the calling frame is an arguments adaptor frame. |
| + __ mov(fp.reg(), Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
| + __ cmp(Operand(fp.reg(), StandardFrameConstants::kContextOffset), |
| + Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| + __ j(not_equal, &exit); |
| + |
| + // Arguments adaptor case: Read the arguments length from the |
| + // adaptor frame. |
| + __ mov(result.reg(), |
| + Operand(fp.reg(), ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| + |
| + __ bind(&exit); |
| + result.set_type_info(TypeInfo::Smi()); |
| + if (FLAG_debug_code) __ AbortIfNotSmi(result.reg()); |
|
antonm
2010/03/30 13:28:05
two questions.
1) why not use cmov still?
2) do w
Vitaly Repeshko
2010/03/30 13:40:30
AFAIK, cmov should be used in totally unpredictabl
|
| frame_->Push(&result); |
| } |
| @@ -10411,30 +10429,6 @@ void GenericUnaryOpStub::Generate(MacroAssembler* masm) { |
| } |
| -void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { |
| - // Check if the calling frame is an arguments adaptor frame. |
| - __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
| - __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); |
| - __ cmp(Operand(ecx), Immediate(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. |
| - if (CpuFeatures::IsSupported(CMOV)) { |
| - CpuFeatures::Scope use_cmov(CMOV); |
| - __ cmov(equal, eax, |
| - Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| - } else { |
| - Label exit; |
| - __ j(not_equal, &exit); |
| - __ mov(eax, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| - __ bind(&exit); |
| - } |
| - __ ret(0); |
| -} |
| - |
| - |
| void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| // The key is in edx and the parameter count is in eax. |