| 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 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 3593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3604 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 3604 formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
| 3605 bool can_invoke_directly = | 3605 bool can_invoke_directly = |
| 3606 dont_adapt_arguments || formal_parameter_count == arity; | 3606 dont_adapt_arguments || formal_parameter_count == arity; |
| 3607 | 3607 |
| 3608 Register function_reg = edi; | 3608 Register function_reg = edi; |
| 3609 | 3609 |
| 3610 if (can_invoke_directly) { | 3610 if (can_invoke_directly) { |
| 3611 // Change context. | 3611 // Change context. |
| 3612 __ mov(esi, FieldOperand(function_reg, JSFunction::kContextOffset)); | 3612 __ mov(esi, FieldOperand(function_reg, JSFunction::kContextOffset)); |
| 3613 | 3613 |
| 3614 // Set eax to arguments count if adaption is not needed. Assumes that eax | 3614 // Always initialize eax to the number of actual arguments. |
| 3615 // is available to write to at this point. | 3615 __ mov(eax, arity); |
| 3616 if (dont_adapt_arguments) { | |
| 3617 __ mov(eax, arity); | |
| 3618 } | |
| 3619 | 3616 |
| 3620 // Invoke function directly. | 3617 // Invoke function directly. |
| 3621 if (function.is_identical_to(info()->closure())) { | 3618 if (function.is_identical_to(info()->closure())) { |
| 3622 __ CallSelf(); | 3619 __ CallSelf(); |
| 3623 } else { | 3620 } else { |
| 3624 __ call(FieldOperand(function_reg, JSFunction::kCodeEntryOffset)); | 3621 __ call(FieldOperand(function_reg, JSFunction::kCodeEntryOffset)); |
| 3625 } | 3622 } |
| 3626 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); | 3623 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
| 3627 } else { | 3624 } else { |
| 3628 // We need to adapt arguments. | 3625 // We need to adapt arguments. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3670 } | 3667 } |
| 3671 generator.AfterCall(); | 3668 generator.AfterCall(); |
| 3672 } | 3669 } |
| 3673 } | 3670 } |
| 3674 | 3671 |
| 3675 | 3672 |
| 3676 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) { | 3673 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) { |
| 3677 DCHECK(ToRegister(instr->function()).is(edi)); | 3674 DCHECK(ToRegister(instr->function()).is(edi)); |
| 3678 DCHECK(ToRegister(instr->result()).is(eax)); | 3675 DCHECK(ToRegister(instr->result()).is(eax)); |
| 3679 | 3676 |
| 3680 if (instr->hydrogen()->pass_argument_count()) { | 3677 __ mov(eax, instr->arity()); |
| 3681 __ mov(eax, instr->arity()); | |
| 3682 } | |
| 3683 | 3678 |
| 3684 // Change context. | 3679 // Change context. |
| 3685 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 3680 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
| 3686 | 3681 |
| 3687 bool is_self_call = false; | 3682 bool is_self_call = false; |
| 3688 if (instr->hydrogen()->function()->IsConstant()) { | 3683 if (instr->hydrogen()->function()->IsConstant()) { |
| 3689 HConstant* fun_const = HConstant::cast(instr->hydrogen()->function()); | 3684 HConstant* fun_const = HConstant::cast(instr->hydrogen()->function()); |
| 3690 Handle<JSFunction> jsfun = | 3685 Handle<JSFunction> jsfun = |
| 3691 Handle<JSFunction>::cast(fun_const->handle(isolate())); | 3686 Handle<JSFunction>::cast(fun_const->handle(isolate())); |
| 3692 is_self_call = jsfun.is_identical_to(info()->closure()); | 3687 is_self_call = jsfun.is_identical_to(info()->closure()); |
| (...skipping 2676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6369 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6364 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6370 } | 6365 } |
| 6371 | 6366 |
| 6372 | 6367 |
| 6373 #undef __ | 6368 #undef __ |
| 6374 | 6369 |
| 6375 } // namespace internal | 6370 } // namespace internal |
| 6376 } // namespace v8 | 6371 } // namespace v8 |
| 6377 | 6372 |
| 6378 #endif // V8_TARGET_ARCH_X87 | 6373 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |