| 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/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| 11 #include "src/ic/handler-compiler.h" | 11 #include "src/ic/handler-compiler.h" |
| 12 #include "src/ic/ic.h" | 12 #include "src/ic/ic.h" |
| 13 #include "src/ic/stub-cache.h" | 13 #include "src/ic/stub-cache.h" |
| 14 #include "src/isolate.h" | 14 #include "src/isolate.h" |
| 15 #include "src/regexp/jsregexp.h" | 15 #include "src/regexp/jsregexp.h" |
| 16 #include "src/regexp/regexp-macro-assembler.h" | 16 #include "src/regexp/regexp-macro-assembler.h" |
| 17 #include "src/runtime/runtime.h" | 17 #include "src/runtime/runtime.h" |
| 18 #include "src/x64/code-stubs-x64.h" | 18 #include "src/x64/code-stubs-x64.h" |
| 19 | 19 |
| 20 namespace v8 { | 20 namespace v8 { |
| 21 namespace internal { | 21 namespace internal { |
| 22 | 22 |
| 23 #define __ ACCESS_MASM(masm) |
| 23 | 24 |
| 24 static void InitializeArrayConstructorDescriptor( | 25 void ArrayNArgumentsConstructorStub::Generate(MacroAssembler* masm) { |
| 25 Isolate* isolate, CodeStubDescriptor* descriptor, | 26 __ popq(rcx); |
| 26 int constant_stack_parameter_count) { | 27 __ movq(MemOperand(rsp, rax, times_8, 0), rdi); |
| 27 Address deopt_handler = Runtime::FunctionForId( | 28 __ pushq(rdi); |
| 28 Runtime::kArrayConstructor)->entry; | 29 __ pushq(rbx); |
| 29 | 30 __ pushq(rcx); |
| 30 if (constant_stack_parameter_count == 0) { | 31 __ addq(rax, Immediate(3)); |
| 31 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | 32 __ TailCallRuntime(Runtime::kNewArray); |
| 32 JS_FUNCTION_STUB_MODE); | |
| 33 } else { | |
| 34 descriptor->Initialize(rax, deopt_handler, constant_stack_parameter_count, | |
| 35 JS_FUNCTION_STUB_MODE); | |
| 36 } | |
| 37 } | 33 } |
| 38 | 34 |
| 39 | |
| 40 static void InitializeInternalArrayConstructorDescriptor( | |
| 41 Isolate* isolate, CodeStubDescriptor* descriptor, | |
| 42 int constant_stack_parameter_count) { | |
| 43 Address deopt_handler = Runtime::FunctionForId( | |
| 44 Runtime::kInternalArrayConstructor)->entry; | |
| 45 | |
| 46 if (constant_stack_parameter_count == 0) { | |
| 47 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 48 JS_FUNCTION_STUB_MODE); | |
| 49 } else { | |
| 50 descriptor->Initialize(rax, deopt_handler, constant_stack_parameter_count, | |
| 51 JS_FUNCTION_STUB_MODE); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 | |
| 56 void ArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 57 CodeStubDescriptor* descriptor) { | |
| 58 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 59 } | |
| 60 | |
| 61 | |
| 62 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 35 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| 63 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; | 36 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; |
| 64 descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 37 descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 65 } | 38 } |
| 66 | 39 |
| 67 void FastFunctionBindStub::InitializeDescriptor( | 40 void FastFunctionBindStub::InitializeDescriptor( |
| 68 CodeStubDescriptor* descriptor) { | 41 CodeStubDescriptor* descriptor) { |
| 69 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; | 42 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; |
| 70 descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 43 descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 71 } | 44 } |
| 72 | 45 |
| 73 void InternalArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 74 CodeStubDescriptor* descriptor) { | |
| 75 InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 76 } | |
| 77 | |
| 78 | |
| 79 #define __ ACCESS_MASM(masm) | |
| 80 | |
| 81 | |
| 82 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, | 46 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, |
| 83 ExternalReference miss) { | 47 ExternalReference miss) { |
| 84 // Update the static counter each time a new code stub is generated. | 48 // Update the static counter each time a new code stub is generated. |
| 85 isolate()->counters()->code_stubs()->Increment(); | 49 isolate()->counters()->code_stubs()->Increment(); |
| 86 | 50 |
| 87 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); | 51 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); |
| 88 int param_count = descriptor.GetRegisterParameterCount(); | 52 int param_count = descriptor.GetRegisterParameterCount(); |
| 89 { | 53 { |
| 90 // Call the runtime system in a fresh internal frame. | 54 // Call the runtime system in a fresh internal frame. |
| 91 FrameScope scope(masm, StackFrame::INTERNAL); | 55 FrameScope scope(masm, StackFrame::INTERNAL); |
| (...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 bool CEntryStub::NeedsImmovableCode() { | 1618 bool CEntryStub::NeedsImmovableCode() { |
| 1655 return false; | 1619 return false; |
| 1656 } | 1620 } |
| 1657 | 1621 |
| 1658 | 1622 |
| 1659 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 1623 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 1660 CEntryStub::GenerateAheadOfTime(isolate); | 1624 CEntryStub::GenerateAheadOfTime(isolate); |
| 1661 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 1625 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 1662 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 1626 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 1663 // It is important that the store buffer overflow stubs are generated first. | 1627 // It is important that the store buffer overflow stubs are generated first. |
| 1664 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 1628 CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate); |
| 1665 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | 1629 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1666 CreateWeakCellStub::GenerateAheadOfTime(isolate); | 1630 CreateWeakCellStub::GenerateAheadOfTime(isolate); |
| 1667 BinaryOpICStub::GenerateAheadOfTime(isolate); | 1631 BinaryOpICStub::GenerateAheadOfTime(isolate); |
| 1668 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); | 1632 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1669 StoreFastElementStub::GenerateAheadOfTime(isolate); | 1633 StoreFastElementStub::GenerateAheadOfTime(isolate); |
| 1670 TypeofStub::GenerateAheadOfTime(isolate); | 1634 TypeofStub::GenerateAheadOfTime(isolate); |
| 1671 } | 1635 } |
| 1672 | 1636 |
| 1673 | 1637 |
| 1674 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 1638 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| (...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4030 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 3994 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 4031 T stub(isolate, kind); | 3995 T stub(isolate, kind); |
| 4032 stub.GetCode(); | 3996 stub.GetCode(); |
| 4033 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 3997 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 4034 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); | 3998 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); |
| 4035 stub1.GetCode(); | 3999 stub1.GetCode(); |
| 4036 } | 4000 } |
| 4037 } | 4001 } |
| 4038 } | 4002 } |
| 4039 | 4003 |
| 4040 | 4004 void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 4041 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | |
| 4042 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 4005 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 4043 isolate); | 4006 isolate); |
| 4044 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( | 4007 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( |
| 4045 isolate); | 4008 isolate); |
| 4046 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( | 4009 ArrayNArgumentsConstructorStub stub(isolate); |
| 4047 isolate); | 4010 stub.GetCode(); |
| 4048 } | |
| 4049 | 4011 |
| 4050 | |
| 4051 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( | |
| 4052 Isolate* isolate) { | |
| 4053 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; | 4012 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; |
| 4054 for (int i = 0; i < 2; i++) { | 4013 for (int i = 0; i < 2; i++) { |
| 4055 // For internal arrays we only need a few things | 4014 // For internal arrays we only need a few things |
| 4056 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); | 4015 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); |
| 4057 stubh1.GetCode(); | 4016 stubh1.GetCode(); |
| 4058 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 4017 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 4059 stubh2.GetCode(); | 4018 stubh2.GetCode(); |
| 4060 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); | |
| 4061 stubh3.GetCode(); | |
| 4062 } | 4019 } |
| 4063 } | 4020 } |
| 4064 | 4021 |
| 4065 | 4022 |
| 4066 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 4023 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 4067 MacroAssembler* masm, | 4024 MacroAssembler* masm, |
| 4068 AllocationSiteOverrideMode mode) { | 4025 AllocationSiteOverrideMode mode) { |
| 4069 if (argument_count() == ANY) { | 4026 if (argument_count() == ANY) { |
| 4070 Label not_zero_case, not_one_case; | 4027 Label not_zero_case, not_one_case; |
| 4071 __ testp(rax, rax); | 4028 __ testp(rax, rax); |
| 4072 __ j(not_zero, ¬_zero_case); | 4029 __ j(not_zero, ¬_zero_case); |
| 4073 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4030 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4074 | 4031 |
| 4075 __ bind(¬_zero_case); | 4032 __ bind(¬_zero_case); |
| 4076 __ cmpl(rax, Immediate(1)); | 4033 __ cmpl(rax, Immediate(1)); |
| 4077 __ j(greater, ¬_one_case); | 4034 __ j(greater, ¬_one_case); |
| 4078 CreateArrayDispatchOneArgument(masm, mode); | 4035 CreateArrayDispatchOneArgument(masm, mode); |
| 4079 | 4036 |
| 4080 __ bind(¬_one_case); | 4037 __ bind(¬_one_case); |
| 4081 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4038 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4039 __ TailCallStub(&stub); |
| 4082 } else if (argument_count() == NONE) { | 4040 } else if (argument_count() == NONE) { |
| 4083 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4041 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4084 } else if (argument_count() == ONE) { | 4042 } else if (argument_count() == ONE) { |
| 4085 CreateArrayDispatchOneArgument(masm, mode); | 4043 CreateArrayDispatchOneArgument(masm, mode); |
| 4086 } else if (argument_count() == MORE_THAN_ONE) { | 4044 } else if (argument_count() == MORE_THAN_ONE) { |
| 4087 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4045 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4046 __ TailCallStub(&stub); |
| 4088 } else { | 4047 } else { |
| 4089 UNREACHABLE(); | 4048 UNREACHABLE(); |
| 4090 } | 4049 } |
| 4091 } | 4050 } |
| 4092 | 4051 |
| 4093 | 4052 |
| 4094 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4053 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4095 // ----------- S t a t e ------------- | 4054 // ----------- S t a t e ------------- |
| 4096 // -- rax : argc | 4055 // -- rax : argc |
| 4097 // -- rbx : AllocationSite or undefined | 4056 // -- rbx : AllocationSite or undefined |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4196 InternalArraySingleArgumentConstructorStub | 4155 InternalArraySingleArgumentConstructorStub |
| 4197 stub1_holey(isolate(), GetHoleyElementsKind(kind)); | 4156 stub1_holey(isolate(), GetHoleyElementsKind(kind)); |
| 4198 __ TailCallStub(&stub1_holey); | 4157 __ TailCallStub(&stub1_holey); |
| 4199 } | 4158 } |
| 4200 | 4159 |
| 4201 __ bind(&normal_sequence); | 4160 __ bind(&normal_sequence); |
| 4202 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind); | 4161 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind); |
| 4203 __ TailCallStub(&stub1); | 4162 __ TailCallStub(&stub1); |
| 4204 | 4163 |
| 4205 __ bind(¬_one_case); | 4164 __ bind(¬_one_case); |
| 4206 InternalArrayNArgumentsConstructorStub stubN(isolate(), kind); | 4165 ArrayNArgumentsConstructorStub stubN(isolate()); |
| 4207 __ TailCallStub(&stubN); | 4166 __ TailCallStub(&stubN); |
| 4208 } | 4167 } |
| 4209 | 4168 |
| 4210 | 4169 |
| 4211 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { | 4170 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4212 // ----------- S t a t e ------------- | 4171 // ----------- S t a t e ------------- |
| 4213 // -- rax : argc | 4172 // -- rax : argc |
| 4214 // -- rdi : constructor | 4173 // -- rdi : constructor |
| 4215 // -- rsp[0] : return address | 4174 // -- rsp[0] : return address |
| 4216 // -- rsp[8] : last argument | 4175 // -- rsp[8] : last argument |
| (...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5425 kStackUnwindSpace, nullptr, return_value_operand, | 5384 kStackUnwindSpace, nullptr, return_value_operand, |
| 5426 NULL); | 5385 NULL); |
| 5427 } | 5386 } |
| 5428 | 5387 |
| 5429 #undef __ | 5388 #undef __ |
| 5430 | 5389 |
| 5431 } // namespace internal | 5390 } // namespace internal |
| 5432 } // namespace v8 | 5391 } // namespace v8 |
| 5433 | 5392 |
| 5434 #endif // V8_TARGET_ARCH_X64 | 5393 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |