| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
| 8 | 8 |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 2041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2052 __ movp(vector, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | 2052 __ movp(vector, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); |
| 2053 __ movp(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset)); | 2053 __ movp(vector, FieldOperand(vector, JSFunction::kSharedFunctionInfoOffset)); |
| 2054 __ movp(vector, FieldOperand(vector, | 2054 __ movp(vector, FieldOperand(vector, |
| 2055 SharedFunctionInfo::kFeedbackVectorOffset)); | 2055 SharedFunctionInfo::kFeedbackVectorOffset)); |
| 2056 } | 2056 } |
| 2057 | 2057 |
| 2058 | 2058 |
| 2059 void CallIC_ArrayStub::Generate(MacroAssembler* masm) { | 2059 void CallIC_ArrayStub::Generate(MacroAssembler* masm) { |
| 2060 // rdi - function | 2060 // rdi - function |
| 2061 // rdx - slot id (as integer) | 2061 // rdx - slot id (as integer) |
| 2062 // rbx - vector |
| 2062 Label miss; | 2063 Label miss; |
| 2063 int argc = arg_count(); | 2064 int argc = arg_count(); |
| 2064 ParameterCount actual(argc); | 2065 ParameterCount actual(argc); |
| 2065 | 2066 |
| 2066 EmitLoadTypeFeedbackVector(masm, rbx); | |
| 2067 __ SmiToInteger32(rdx, rdx); | 2067 __ SmiToInteger32(rdx, rdx); |
| 2068 | 2068 |
| 2069 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, rcx); | 2069 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, rcx); |
| 2070 __ cmpp(rdi, rcx); | 2070 __ cmpp(rdi, rcx); |
| 2071 __ j(not_equal, &miss); | 2071 __ j(not_equal, &miss); |
| 2072 | 2072 |
| 2073 __ movp(rax, Immediate(arg_count())); | 2073 __ movp(rax, Immediate(arg_count())); |
| 2074 __ movp(rcx, FieldOperand(rbx, rdx, times_pointer_size, | 2074 __ movp(rcx, FieldOperand(rbx, rdx, times_pointer_size, |
| 2075 FixedArray::kHeaderSize)); | 2075 FixedArray::kHeaderSize)); |
| 2076 // Verify that ecx contains an AllocationSite | 2076 // Verify that ecx contains an AllocationSite |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2093 CallAsMethod()); | 2093 CallAsMethod()); |
| 2094 | 2094 |
| 2095 // Unreachable. | 2095 // Unreachable. |
| 2096 __ int3(); | 2096 __ int3(); |
| 2097 } | 2097 } |
| 2098 | 2098 |
| 2099 | 2099 |
| 2100 void CallICStub::Generate(MacroAssembler* masm) { | 2100 void CallICStub::Generate(MacroAssembler* masm) { |
| 2101 // rdi - function | 2101 // rdi - function |
| 2102 // rdx - slot id | 2102 // rdx - slot id |
| 2103 // rbx - vector |
| 2103 Isolate* isolate = masm->isolate(); | 2104 Isolate* isolate = masm->isolate(); |
| 2104 const int with_types_offset = | 2105 const int with_types_offset = |
| 2105 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); | 2106 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); |
| 2106 const int generic_offset = | 2107 const int generic_offset = |
| 2107 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex); | 2108 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex); |
| 2108 Label extra_checks_or_miss, slow_start; | 2109 Label extra_checks_or_miss, slow_start; |
| 2109 Label slow, non_function, wrap, cont; | 2110 Label slow, non_function, wrap, cont; |
| 2110 Label have_js_function; | 2111 Label have_js_function; |
| 2111 int argc = arg_count(); | 2112 int argc = arg_count(); |
| 2112 StackArgumentsAccessor args(rsp, argc); | 2113 StackArgumentsAccessor args(rsp, argc); |
| 2113 ParameterCount actual(argc); | 2114 ParameterCount actual(argc); |
| 2114 | 2115 |
| 2115 EmitLoadTypeFeedbackVector(masm, rbx); | |
| 2116 | |
| 2117 // The checks. First, does rdi match the recorded monomorphic target? | 2116 // The checks. First, does rdi match the recorded monomorphic target? |
| 2118 __ SmiToInteger32(rdx, rdx); | 2117 __ SmiToInteger32(rdx, rdx); |
| 2119 __ cmpp(rdi, FieldOperand(rbx, rdx, times_pointer_size, | 2118 __ cmpp(rdi, FieldOperand(rbx, rdx, times_pointer_size, |
| 2120 FixedArray::kHeaderSize)); | 2119 FixedArray::kHeaderSize)); |
| 2121 __ j(not_equal, &extra_checks_or_miss); | 2120 __ j(not_equal, &extra_checks_or_miss); |
| 2122 | 2121 |
| 2123 __ bind(&have_js_function); | 2122 __ bind(&have_js_function); |
| 2124 if (CallAsMethod()) { | 2123 if (CallAsMethod()) { |
| 2125 EmitContinueIfStrictOrNative(masm, &cont); | 2124 EmitContinueIfStrictOrNative(masm, &cont); |
| 2126 | 2125 |
| (...skipping 2132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4259 } | 4258 } |
| 4260 | 4259 |
| 4261 | 4260 |
| 4262 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { | 4261 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { |
| 4263 EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister()); | 4262 EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister()); |
| 4264 VectorKeyedLoadStub stub(isolate()); | 4263 VectorKeyedLoadStub stub(isolate()); |
| 4265 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); | 4264 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4266 } | 4265 } |
| 4267 | 4266 |
| 4268 | 4267 |
| 4268 void CallICTrampolineStub::Generate(MacroAssembler* masm) { |
| 4269 EmitLoadTypeFeedbackVector(masm, rbx); |
| 4270 CallICStub stub(isolate(), state()); |
| 4271 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4272 } |
| 4273 |
| 4274 |
| 4275 void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { |
| 4276 EmitLoadTypeFeedbackVector(masm, rbx); |
| 4277 CallIC_ArrayStub stub(isolate(), state()); |
| 4278 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4279 } |
| 4280 |
| 4281 |
| 4269 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { | 4282 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { |
| 4270 if (masm->isolate()->function_entry_hook() != NULL) { | 4283 if (masm->isolate()->function_entry_hook() != NULL) { |
| 4271 ProfileEntryHookStub stub(masm->isolate()); | 4284 ProfileEntryHookStub stub(masm->isolate()); |
| 4272 masm->CallStub(&stub); | 4285 masm->CallStub(&stub); |
| 4273 } | 4286 } |
| 4274 } | 4287 } |
| 4275 | 4288 |
| 4276 | 4289 |
| 4277 void ProfileEntryHookStub::Generate(MacroAssembler* masm) { | 4290 void ProfileEntryHookStub::Generate(MacroAssembler* masm) { |
| 4278 // This stub can be called from essentially anywhere, so it needs to save | 4291 // This stub can be called from essentially anywhere, so it needs to save |
| (...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5026 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, getter_arg, | 5039 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, getter_arg, |
| 5027 kStackSpace, nullptr, return_value_operand, NULL); | 5040 kStackSpace, nullptr, return_value_operand, NULL); |
| 5028 } | 5041 } |
| 5029 | 5042 |
| 5030 | 5043 |
| 5031 #undef __ | 5044 #undef __ |
| 5032 | 5045 |
| 5033 } } // namespace v8::internal | 5046 } } // namespace v8::internal |
| 5034 | 5047 |
| 5035 #endif // V8_TARGET_ARCH_X64 | 5048 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |