Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 6210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6221 __ bind(&check_frame_marker); | 6221 __ bind(&check_frame_marker); |
| 6222 __ cmp(Operand(fp.reg(), StandardFrameConstants::kMarkerOffset), | 6222 __ cmp(Operand(fp.reg(), StandardFrameConstants::kMarkerOffset), |
| 6223 Immediate(Smi::FromInt(StackFrame::CONSTRUCT))); | 6223 Immediate(Smi::FromInt(StackFrame::CONSTRUCT))); |
| 6224 fp.Unuse(); | 6224 fp.Unuse(); |
| 6225 destination()->Split(equal); | 6225 destination()->Split(equal); |
| 6226 } | 6226 } |
| 6227 | 6227 |
| 6228 | 6228 |
| 6229 void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) { | 6229 void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) { |
| 6230 ASSERT(args->length() == 0); | 6230 ASSERT(args->length() == 0); |
| 6231 // ArgumentsAccessStub takes the parameter count as an input argument | 6231 |
| 6232 // in register eax. Create a constant result for it. | 6232 Result fp = allocator_->Allocate(); |
| 6233 Result count(Handle<Smi>(Smi::FromInt(scope()->num_parameters()))); | 6233 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
| |
| 6234 // Call the shared stub to get to the arguments.length. | 6234 ASSERT(fp.is_valid() && result.is_valid()); |
| 6235 ArgumentsAccessStub stub(ArgumentsAccessStub::READ_LENGTH); | 6235 |
| 6236 Result result = frame_->CallStub(&stub, &count); | 6236 Label exit; |
| 6237 | |
| 6238 // Get the number of formal parameters. | |
| 6239 __ Set(result.reg(), Immediate(Smi::FromInt(scope()->num_parameters()))); | |
| 6240 | |
| 6241 // Check if the calling frame is an arguments adaptor frame. | |
| 6242 __ mov(fp.reg(), Operand(ebp, StandardFrameConstants::kCallerFPOffset)); | |
| 6243 __ cmp(Operand(fp.reg(), StandardFrameConstants::kContextOffset), | |
| 6244 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | |
| 6245 __ j(not_equal, &exit); | |
| 6246 | |
| 6247 // Arguments adaptor case: Read the arguments length from the | |
| 6248 // adaptor frame. | |
| 6249 __ mov(result.reg(), | |
| 6250 Operand(fp.reg(), ArgumentsAdaptorFrameConstants::kLengthOffset)); | |
| 6251 | |
| 6252 __ bind(&exit); | |
| 6253 result.set_type_info(TypeInfo::Smi()); | |
| 6254 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
| |
| 6237 frame_->Push(&result); | 6255 frame_->Push(&result); |
| 6238 } | 6256 } |
| 6239 | 6257 |
| 6240 | 6258 |
| 6241 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { | 6259 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { |
| 6242 ASSERT(args->length() == 1); | 6260 ASSERT(args->length() == 1); |
| 6243 JumpTarget leave, null, function, non_function_constructor; | 6261 JumpTarget leave, null, function, non_function_constructor; |
| 6244 Load(args->at(0)); // Load the object. | 6262 Load(args->at(0)); // Load the object. |
| 6245 Result obj = frame_->Pop(); | 6263 Result obj = frame_->Pop(); |
| 6246 obj.ToRegister(); | 6264 obj.ToRegister(); |
| (...skipping 4157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10404 break; | 10422 break; |
| 10405 case Token::BIT_NOT: | 10423 case Token::BIT_NOT: |
| 10406 __ InvokeBuiltin(Builtins::BIT_NOT, JUMP_FUNCTION); | 10424 __ InvokeBuiltin(Builtins::BIT_NOT, JUMP_FUNCTION); |
| 10407 break; | 10425 break; |
| 10408 default: | 10426 default: |
| 10409 UNREACHABLE(); | 10427 UNREACHABLE(); |
| 10410 } | 10428 } |
| 10411 } | 10429 } |
| 10412 | 10430 |
| 10413 | 10431 |
| 10414 void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { | |
| 10415 // Check if the calling frame is an arguments adaptor frame. | |
| 10416 __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); | |
| 10417 __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset)); | |
| 10418 __ cmp(Operand(ecx), Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | |
| 10419 | |
| 10420 // Arguments adaptor case: Read the arguments length from the | |
| 10421 // adaptor frame and return it. | |
| 10422 // Otherwise nothing to do: The number of formal parameters has already been | |
| 10423 // passed in register eax by calling function. Just return it. | |
| 10424 if (CpuFeatures::IsSupported(CMOV)) { | |
| 10425 CpuFeatures::Scope use_cmov(CMOV); | |
| 10426 __ cmov(equal, eax, | |
| 10427 Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); | |
| 10428 } else { | |
| 10429 Label exit; | |
| 10430 __ j(not_equal, &exit); | |
| 10431 __ mov(eax, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset)); | |
| 10432 __ bind(&exit); | |
| 10433 } | |
| 10434 __ ret(0); | |
| 10435 } | |
| 10436 | |
| 10437 | |
| 10438 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { | 10432 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| 10439 // The key is in edx and the parameter count is in eax. | 10433 // The key is in edx and the parameter count is in eax. |
| 10440 | 10434 |
| 10441 // The displacement is used for skipping the frame pointer on the | 10435 // The displacement is used for skipping the frame pointer on the |
| 10442 // stack. It is the offset of the last parameter (if any) relative | 10436 // stack. It is the offset of the last parameter (if any) relative |
| 10443 // to the frame pointer. | 10437 // to the frame pointer. |
| 10444 static const int kDisplacement = 1 * kPointerSize; | 10438 static const int kDisplacement = 1 * kPointerSize; |
| 10445 | 10439 |
| 10446 // Check that the key is a smi. | 10440 // Check that the key is a smi. |
| 10447 Label slow; | 10441 Label slow; |
| (...skipping 2153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12601 | 12595 |
| 12602 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12596 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 12603 // tagged as a small integer. | 12597 // tagged as a small integer. |
| 12604 __ bind(&runtime); | 12598 __ bind(&runtime); |
| 12605 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12599 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 12606 } | 12600 } |
| 12607 | 12601 |
| 12608 #undef __ | 12602 #undef __ |
| 12609 | 12603 |
| 12610 } } // namespace v8::internal | 12604 } } // namespace v8::internal |
| OLD | NEW |