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