| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_X64 | 5 #if V8_TARGET_ARCH_X64 |
| 6 | 6 |
| 7 #include "src/crankshaft/x64/lithium-codegen-x64.h" | 7 #include "src/crankshaft/x64/lithium-codegen-x64.h" |
| 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 3116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3127 ARGUMENTS_DONT_CONTAIN_RECEIVER); | 3127 ARGUMENTS_DONT_CONTAIN_RECEIVER); |
| 3128 __ Push(args.GetArgumentOperand(0)); | 3128 __ Push(args.GetArgumentOperand(0)); |
| 3129 __ decl(length); | 3129 __ decl(length); |
| 3130 __ j(not_zero, &loop); | 3130 __ j(not_zero, &loop); |
| 3131 | 3131 |
| 3132 // Invoke the function. | 3132 // Invoke the function. |
| 3133 __ bind(&invoke); | 3133 __ bind(&invoke); |
| 3134 | 3134 |
| 3135 InvokeFlag flag = CALL_FUNCTION; | 3135 InvokeFlag flag = CALL_FUNCTION; |
| 3136 if (instr->hydrogen()->tail_call_mode() == TailCallMode::kAllow) { | 3136 if (instr->hydrogen()->tail_call_mode() == TailCallMode::kAllow) { |
| 3137 DCHECK(!info()->saves_caller_doubles()); |
| 3137 // TODO(ishell): drop current frame before pushing arguments to the stack. | 3138 // TODO(ishell): drop current frame before pushing arguments to the stack. |
| 3138 flag = JUMP_FUNCTION; | 3139 flag = JUMP_FUNCTION; |
| 3139 ParameterCount actual(rax); | 3140 ParameterCount actual(rax); |
| 3140 // It is safe to use rbx, rcx and r8 as scratch registers here given that | 3141 // It is safe to use rbx, rcx and r8 as scratch registers here given that |
| 3141 // 1) we are not going to return to caller function anyway, | 3142 // 1) we are not going to return to caller function anyway, |
| 3142 // 2) rbx (expected number of arguments) will be initialized below. | 3143 // 2) rbx (expected number of arguments) will be initialized below. |
| 3143 PrepareForTailCall(actual, rbx, rcx, r8); | 3144 PrepareForTailCall(actual, rbx, rcx, r8); |
| 3144 } | 3145 } |
| 3145 | 3146 |
| 3146 DCHECK(instr->HasPointerMap()); | 3147 DCHECK(instr->HasPointerMap()); |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3680 | 3681 |
| 3681 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { | 3682 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { |
| 3682 HInvokeFunction* hinstr = instr->hydrogen(); | 3683 HInvokeFunction* hinstr = instr->hydrogen(); |
| 3683 DCHECK(ToRegister(instr->context()).is(rsi)); | 3684 DCHECK(ToRegister(instr->context()).is(rsi)); |
| 3684 DCHECK(ToRegister(instr->function()).is(rdi)); | 3685 DCHECK(ToRegister(instr->function()).is(rdi)); |
| 3685 DCHECK(instr->HasPointerMap()); | 3686 DCHECK(instr->HasPointerMap()); |
| 3686 | 3687 |
| 3687 bool is_tail_call = hinstr->tail_call_mode() == TailCallMode::kAllow; | 3688 bool is_tail_call = hinstr->tail_call_mode() == TailCallMode::kAllow; |
| 3688 | 3689 |
| 3689 if (is_tail_call) { | 3690 if (is_tail_call) { |
| 3691 DCHECK(!info()->saves_caller_doubles()); |
| 3690 ParameterCount actual(instr->arity()); | 3692 ParameterCount actual(instr->arity()); |
| 3691 // It is safe to use rbx, rcx and r8 as scratch registers here given that | 3693 // It is safe to use rbx, rcx and r8 as scratch registers here given that |
| 3692 // 1) we are not going to return to caller function anyway, | 3694 // 1) we are not going to return to caller function anyway, |
| 3693 // 2) rbx (expected number of arguments) will be initialized below. | 3695 // 2) rbx (expected number of arguments) will be initialized below. |
| 3694 PrepareForTailCall(actual, rbx, rcx, r8); | 3696 PrepareForTailCall(actual, rbx, rcx, r8); |
| 3695 } | 3697 } |
| 3696 | 3698 |
| 3697 Handle<JSFunction> known_function = hinstr->known_function(); | 3699 Handle<JSFunction> known_function = hinstr->known_function(); |
| 3698 if (known_function.is_null()) { | 3700 if (known_function.is_null()) { |
| 3699 LPointerMap* pointers = instr->pointer_map(); | 3701 LPointerMap* pointers = instr->pointer_map(); |
| (...skipping 1881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5581 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), context); | 5583 __ movp(Operand(rbp, StandardFrameConstants::kContextOffset), context); |
| 5582 } | 5584 } |
| 5583 | 5585 |
| 5584 | 5586 |
| 5585 #undef __ | 5587 #undef __ |
| 5586 | 5588 |
| 5587 } // namespace internal | 5589 } // namespace internal |
| 5588 } // namespace v8 | 5590 } // namespace v8 |
| 5589 | 5591 |
| 5590 #endif // V8_TARGET_ARCH_X64 | 5592 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |