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_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
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 2965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2976 __ Ldr(vector, FieldMemOperand(vector, | 2976 __ Ldr(vector, FieldMemOperand(vector, |
2977 JSFunction::kSharedFunctionInfoOffset)); | 2977 JSFunction::kSharedFunctionInfoOffset)); |
2978 __ Ldr(vector, FieldMemOperand(vector, | 2978 __ Ldr(vector, FieldMemOperand(vector, |
2979 SharedFunctionInfo::kFeedbackVectorOffset)); | 2979 SharedFunctionInfo::kFeedbackVectorOffset)); |
2980 } | 2980 } |
2981 | 2981 |
2982 | 2982 |
2983 void CallIC_ArrayStub::Generate(MacroAssembler* masm) { | 2983 void CallIC_ArrayStub::Generate(MacroAssembler* masm) { |
2984 // x1 - function | 2984 // x1 - function |
2985 // x3 - slot id | 2985 // x3 - slot id |
| 2986 // x2 - vector |
2986 Label miss; | 2987 Label miss; |
2987 Register function = x1; | 2988 Register function = x1; |
2988 Register feedback_vector = x2; | 2989 Register feedback_vector = x2; |
2989 Register index = x3; | 2990 Register index = x3; |
2990 Register scratch = x4; | 2991 Register scratch = x4; |
2991 | 2992 |
2992 EmitLoadTypeFeedbackVector(masm, feedback_vector); | |
2993 | |
2994 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, scratch); | 2993 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, scratch); |
2995 __ Cmp(function, scratch); | 2994 __ Cmp(function, scratch); |
2996 __ B(ne, &miss); | 2995 __ B(ne, &miss); |
2997 | 2996 |
2998 __ Mov(x0, Operand(arg_count())); | 2997 __ Mov(x0, Operand(arg_count())); |
2999 | 2998 |
3000 __ Add(scratch, feedback_vector, | 2999 __ Add(scratch, feedback_vector, |
3001 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 3000 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
3002 __ Ldr(scratch, FieldMemOperand(scratch, FixedArray::kHeaderSize)); | 3001 __ Ldr(scratch, FieldMemOperand(scratch, FixedArray::kHeaderSize)); |
3003 | 3002 |
(...skipping 18 matching lines...) Expand all Loading... |
3022 | 3021 |
3023 __ Unreachable(); | 3022 __ Unreachable(); |
3024 } | 3023 } |
3025 | 3024 |
3026 | 3025 |
3027 void CallICStub::Generate(MacroAssembler* masm) { | 3026 void CallICStub::Generate(MacroAssembler* masm) { |
3028 ASM_LOCATION("CallICStub"); | 3027 ASM_LOCATION("CallICStub"); |
3029 | 3028 |
3030 // x1 - function | 3029 // x1 - function |
3031 // x3 - slot id (Smi) | 3030 // x3 - slot id (Smi) |
| 3031 // x2 - vector |
3032 const int with_types_offset = | 3032 const int with_types_offset = |
3033 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); | 3033 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); |
3034 const int generic_offset = | 3034 const int generic_offset = |
3035 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex); | 3035 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex); |
3036 Label extra_checks_or_miss, slow_start; | 3036 Label extra_checks_or_miss, slow_start; |
3037 Label slow, non_function, wrap, cont; | 3037 Label slow, non_function, wrap, cont; |
3038 Label have_js_function; | 3038 Label have_js_function; |
3039 int argc = arg_count(); | 3039 int argc = arg_count(); |
3040 ParameterCount actual(argc); | 3040 ParameterCount actual(argc); |
3041 | 3041 |
3042 Register function = x1; | 3042 Register function = x1; |
3043 Register feedback_vector = x2; | 3043 Register feedback_vector = x2; |
3044 Register index = x3; | 3044 Register index = x3; |
3045 Register type = x4; | 3045 Register type = x4; |
3046 | 3046 |
3047 EmitLoadTypeFeedbackVector(masm, feedback_vector); | |
3048 | |
3049 // The checks. First, does x1 match the recorded monomorphic target? | 3047 // The checks. First, does x1 match the recorded monomorphic target? |
3050 __ Add(x4, feedback_vector, | 3048 __ Add(x4, feedback_vector, |
3051 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 3049 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
3052 __ Ldr(x4, FieldMemOperand(x4, FixedArray::kHeaderSize)); | 3050 __ Ldr(x4, FieldMemOperand(x4, FixedArray::kHeaderSize)); |
3053 | 3051 |
3054 __ Cmp(x4, function); | 3052 __ Cmp(x4, function); |
3055 __ B(ne, &extra_checks_or_miss); | 3053 __ B(ne, &extra_checks_or_miss); |
3056 | 3054 |
3057 __ bind(&have_js_function); | 3055 __ bind(&have_js_function); |
3058 if (CallAsMethod()) { | 3056 if (CallAsMethod()) { |
(...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4367 } | 4365 } |
4368 | 4366 |
4369 | 4367 |
4370 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { | 4368 void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) { |
4371 EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister()); | 4369 EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister()); |
4372 VectorKeyedLoadStub stub(isolate()); | 4370 VectorKeyedLoadStub stub(isolate()); |
4373 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 4371 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
4374 } | 4372 } |
4375 | 4373 |
4376 | 4374 |
| 4375 void CallICTrampolineStub::Generate(MacroAssembler* masm) { |
| 4376 EmitLoadTypeFeedbackVector(masm, x2); |
| 4377 CallICStub stub(isolate(), state()); |
| 4378 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4379 } |
| 4380 |
| 4381 |
| 4382 void CallIC_ArrayTrampolineStub::Generate(MacroAssembler* masm) { |
| 4383 EmitLoadTypeFeedbackVector(masm, x2); |
| 4384 CallIC_ArrayStub stub(isolate(), state()); |
| 4385 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 4386 } |
| 4387 |
| 4388 |
4377 // The entry hook is a "BumpSystemStackPointer" instruction (sub), followed by | 4389 // The entry hook is a "BumpSystemStackPointer" instruction (sub), followed by |
4378 // a "Push lr" instruction, followed by a call. | 4390 // a "Push lr" instruction, followed by a call. |
4379 static const unsigned int kProfileEntryHookCallSize = | 4391 static const unsigned int kProfileEntryHookCallSize = |
4380 Assembler::kCallSizeWithRelocation + (2 * kInstructionSize); | 4392 Assembler::kCallSizeWithRelocation + (2 * kInstructionSize); |
4381 | 4393 |
4382 | 4394 |
4383 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { | 4395 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { |
4384 if (masm->isolate()->function_entry_hook() != NULL) { | 4396 if (masm->isolate()->function_entry_hook() != NULL) { |
4385 ProfileEntryHookStub stub(masm->isolate()); | 4397 ProfileEntryHookStub stub(masm->isolate()); |
4386 Assembler::BlockConstPoolScope no_const_pools(masm); | 4398 Assembler::BlockConstPoolScope no_const_pools(masm); |
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5391 kStackUnwindSpace, NULL, spill_offset, | 5403 kStackUnwindSpace, NULL, spill_offset, |
5392 MemOperand(fp, 6 * kPointerSize), NULL); | 5404 MemOperand(fp, 6 * kPointerSize), NULL); |
5393 } | 5405 } |
5394 | 5406 |
5395 | 5407 |
5396 #undef __ | 5408 #undef __ |
5397 | 5409 |
5398 } } // namespace v8::internal | 5410 } } // namespace v8::internal |
5399 | 5411 |
5400 #endif // V8_TARGET_ARCH_ARM64 | 5412 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |