OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 3389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3400 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { | 3400 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { |
3401 DCHECK(ToRegister(instr->context()).is(esi)); | 3401 DCHECK(ToRegister(instr->context()).is(esi)); |
3402 __ push(esi); // The context is the first argument. | 3402 __ push(esi); // The context is the first argument. |
3403 __ push(Immediate(instr->hydrogen()->pairs())); | 3403 __ push(Immediate(instr->hydrogen()->pairs())); |
3404 __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); | 3404 __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); |
3405 CallRuntime(Runtime::kDeclareGlobals, 3, instr); | 3405 CallRuntime(Runtime::kDeclareGlobals, 3, instr); |
3406 } | 3406 } |
3407 | 3407 |
3408 | 3408 |
3409 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 3409 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
3410 int formal_parameter_count, | 3410 int formal_parameter_count, int arity, |
3411 int arity, | 3411 LInstruction* instr) { |
3412 LInstruction* instr, | |
3413 EDIState edi_state) { | |
3414 bool dont_adapt_arguments = | 3412 bool dont_adapt_arguments = |
3415 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 3413 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
3416 bool can_invoke_directly = | 3414 bool can_invoke_directly = |
3417 dont_adapt_arguments || formal_parameter_count == arity; | 3415 dont_adapt_arguments || formal_parameter_count == arity; |
3418 | 3416 |
| 3417 Register function_reg = edi; |
| 3418 |
3419 if (can_invoke_directly) { | 3419 if (can_invoke_directly) { |
3420 if (edi_state == EDI_UNINITIALIZED) { | |
3421 __ LoadHeapObject(edi, function); | |
3422 } | |
3423 | |
3424 // Change context. | 3420 // Change context. |
3425 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 3421 __ mov(esi, FieldOperand(function_reg, JSFunction::kContextOffset)); |
3426 | 3422 |
3427 // Set eax to arguments count if adaption is not needed. Assumes that eax | 3423 // Set eax to arguments count if adaption is not needed. Assumes that eax |
3428 // is available to write to at this point. | 3424 // is available to write to at this point. |
3429 if (dont_adapt_arguments) { | 3425 if (dont_adapt_arguments) { |
3430 __ mov(eax, arity); | 3426 __ mov(eax, arity); |
3431 } | 3427 } |
3432 | 3428 |
3433 // Invoke function directly. | 3429 // Invoke function directly. |
3434 if (function.is_identical_to(info()->closure())) { | 3430 if (function.is_identical_to(info()->closure())) { |
3435 __ CallSelf(); | 3431 __ CallSelf(); |
3436 } else { | 3432 } else { |
3437 __ call(FieldOperand(edi, JSFunction::kCodeEntryOffset)); | 3433 __ call(FieldOperand(function_reg, JSFunction::kCodeEntryOffset)); |
3438 } | 3434 } |
3439 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); | 3435 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
3440 } else { | 3436 } else { |
3441 // We need to adapt arguments. | 3437 // We need to adapt arguments. |
3442 LPointerMap* pointers = instr->pointer_map(); | 3438 LPointerMap* pointers = instr->pointer_map(); |
3443 SafepointGenerator generator( | 3439 SafepointGenerator generator( |
3444 this, pointers, Safepoint::kLazyDeopt); | 3440 this, pointers, Safepoint::kLazyDeopt); |
3445 ParameterCount count(arity); | 3441 ParameterCount count(arity); |
3446 ParameterCount expected(formal_parameter_count); | 3442 ParameterCount expected(formal_parameter_count); |
3447 __ InvokeFunction(function, expected, count, CALL_FUNCTION, generator); | 3443 __ InvokeFunction(function_reg, expected, count, CALL_FUNCTION, generator); |
3448 } | 3444 } |
3449 } | 3445 } |
3450 | 3446 |
3451 | 3447 |
3452 void LCodeGen::DoTailCallThroughMegamorphicCache( | 3448 void LCodeGen::DoTailCallThroughMegamorphicCache( |
3453 LTailCallThroughMegamorphicCache* instr) { | 3449 LTailCallThroughMegamorphicCache* instr) { |
3454 Register receiver = ToRegister(instr->receiver()); | 3450 Register receiver = ToRegister(instr->receiver()); |
3455 Register name = ToRegister(instr->name()); | 3451 Register name = ToRegister(instr->name()); |
3456 DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); | 3452 DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); |
3457 DCHECK(name.is(LoadDescriptor::NameRegister())); | 3453 DCHECK(name.is(LoadDescriptor::NameRegister())); |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3929 Handle<JSFunction> known_function = instr->hydrogen()->known_function(); | 3925 Handle<JSFunction> known_function = instr->hydrogen()->known_function(); |
3930 if (known_function.is_null()) { | 3926 if (known_function.is_null()) { |
3931 LPointerMap* pointers = instr->pointer_map(); | 3927 LPointerMap* pointers = instr->pointer_map(); |
3932 SafepointGenerator generator( | 3928 SafepointGenerator generator( |
3933 this, pointers, Safepoint::kLazyDeopt); | 3929 this, pointers, Safepoint::kLazyDeopt); |
3934 ParameterCount count(instr->arity()); | 3930 ParameterCount count(instr->arity()); |
3935 __ InvokeFunction(edi, count, CALL_FUNCTION, generator); | 3931 __ InvokeFunction(edi, count, CALL_FUNCTION, generator); |
3936 } else { | 3932 } else { |
3937 CallKnownFunction(known_function, | 3933 CallKnownFunction(known_function, |
3938 instr->hydrogen()->formal_parameter_count(), | 3934 instr->hydrogen()->formal_parameter_count(), |
3939 instr->arity(), | 3935 instr->arity(), instr); |
3940 instr, | |
3941 EDI_CONTAINS_TARGET); | |
3942 } | 3936 } |
3943 } | 3937 } |
3944 | 3938 |
3945 | 3939 |
3946 void LCodeGen::DoCallFunction(LCallFunction* instr) { | 3940 void LCodeGen::DoCallFunction(LCallFunction* instr) { |
3947 DCHECK(ToRegister(instr->context()).is(esi)); | 3941 DCHECK(ToRegister(instr->context()).is(esi)); |
3948 DCHECK(ToRegister(instr->function()).is(edi)); | 3942 DCHECK(ToRegister(instr->function()).is(edi)); |
3949 DCHECK(ToRegister(instr->result()).is(eax)); | 3943 DCHECK(ToRegister(instr->result()).is(eax)); |
3950 | 3944 |
3951 int arity = instr->arity(); | 3945 int arity = instr->arity(); |
(...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5742 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5736 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5743 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5737 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5744 } | 5738 } |
5745 | 5739 |
5746 | 5740 |
5747 #undef __ | 5741 #undef __ |
5748 | 5742 |
5749 } } // namespace v8::internal | 5743 } } // namespace v8::internal |
5750 | 5744 |
5751 #endif // V8_TARGET_ARCH_IA32 | 5745 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |