| 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_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| 11 #include "src/codegen.h" | 11 #include "src/codegen.h" |
| 12 #include "src/ic/handler-compiler.h" | 12 #include "src/ic/handler-compiler.h" |
| 13 #include "src/ic/ic.h" | 13 #include "src/ic/ic.h" |
| 14 #include "src/ic/stub-cache.h" | 14 #include "src/ic/stub-cache.h" |
| 15 #include "src/isolate.h" | 15 #include "src/isolate.h" |
| 16 #include "src/regexp/jsregexp.h" | 16 #include "src/regexp/jsregexp.h" |
| 17 #include "src/regexp/regexp-macro-assembler.h" | 17 #include "src/regexp/regexp-macro-assembler.h" |
| 18 #include "src/runtime/runtime.h" | 18 #include "src/runtime/runtime.h" |
| 19 | 19 |
| 20 #include "src/arm/code-stubs-arm.h" | 20 #include "src/arm/code-stubs-arm.h" |
| 21 | 21 |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 | 24 |
| 25 #define __ ACCESS_MASM(masm) |
| 25 | 26 |
| 26 static void InitializeArrayConstructorDescriptor( | 27 void ArrayNArgumentsConstructorStub::Generate(MacroAssembler* masm) { |
| 27 Isolate* isolate, CodeStubDescriptor* descriptor, | 28 __ lsl(r5, r0, Operand(kPointerSizeLog2)); |
| 28 int constant_stack_parameter_count) { | 29 __ str(r1, MemOperand(sp, r5)); |
| 29 Address deopt_handler = Runtime::FunctionForId( | 30 __ Push(r1); |
| 30 Runtime::kArrayConstructor)->entry; | 31 __ Push(r2); |
| 31 | 32 __ add(r0, r0, Operand(3)); |
| 32 if (constant_stack_parameter_count == 0) { | 33 __ TailCallRuntime(Runtime::kNewArray); |
| 33 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 34 JS_FUNCTION_STUB_MODE); | |
| 35 } else { | |
| 36 descriptor->Initialize(r0, deopt_handler, constant_stack_parameter_count, | |
| 37 JS_FUNCTION_STUB_MODE); | |
| 38 } | |
| 39 } | 34 } |
| 40 | 35 |
| 41 | |
| 42 static void InitializeInternalArrayConstructorDescriptor( | |
| 43 Isolate* isolate, CodeStubDescriptor* descriptor, | |
| 44 int constant_stack_parameter_count) { | |
| 45 Address deopt_handler = Runtime::FunctionForId( | |
| 46 Runtime::kInternalArrayConstructor)->entry; | |
| 47 | |
| 48 if (constant_stack_parameter_count == 0) { | |
| 49 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 50 JS_FUNCTION_STUB_MODE); | |
| 51 } else { | |
| 52 descriptor->Initialize(r0, deopt_handler, constant_stack_parameter_count, | |
| 53 JS_FUNCTION_STUB_MODE); | |
| 54 } | |
| 55 } | |
| 56 | |
| 57 | |
| 58 void ArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 59 CodeStubDescriptor* descriptor) { | |
| 60 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 61 } | |
| 62 | |
| 63 | |
| 64 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 36 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| 65 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; | 37 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; |
| 66 descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 38 descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 67 } | 39 } |
| 68 | 40 |
| 69 void FastFunctionBindStub::InitializeDescriptor( | 41 void FastFunctionBindStub::InitializeDescriptor( |
| 70 CodeStubDescriptor* descriptor) { | 42 CodeStubDescriptor* descriptor) { |
| 71 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; | 43 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; |
| 72 descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 44 descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 73 } | 45 } |
| 74 | 46 |
| 75 void InternalArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 76 CodeStubDescriptor* descriptor) { | |
| 77 InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 78 } | |
| 79 | |
| 80 | |
| 81 #define __ ACCESS_MASM(masm) | |
| 82 | |
| 83 static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, | 47 static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, |
| 84 Condition cond); | 48 Condition cond); |
| 85 static void EmitSmiNonsmiComparison(MacroAssembler* masm, | 49 static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
| 86 Register lhs, | 50 Register lhs, |
| 87 Register rhs, | 51 Register rhs, |
| 88 Label* lhs_not_nan, | 52 Label* lhs_not_nan, |
| 89 Label* slow, | 53 Label* slow, |
| 90 bool strict); | 54 bool strict); |
| 91 static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm, | 55 static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm, |
| 92 Register lhs, | 56 Register lhs, |
| (...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 | 893 |
| 930 bool CEntryStub::NeedsImmovableCode() { | 894 bool CEntryStub::NeedsImmovableCode() { |
| 931 return true; | 895 return true; |
| 932 } | 896 } |
| 933 | 897 |
| 934 | 898 |
| 935 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 899 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 936 CEntryStub::GenerateAheadOfTime(isolate); | 900 CEntryStub::GenerateAheadOfTime(isolate); |
| 937 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 901 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 938 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 902 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 939 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 903 CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate); |
| 940 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | 904 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 941 CreateWeakCellStub::GenerateAheadOfTime(isolate); | 905 CreateWeakCellStub::GenerateAheadOfTime(isolate); |
| 942 BinaryOpICStub::GenerateAheadOfTime(isolate); | 906 BinaryOpICStub::GenerateAheadOfTime(isolate); |
| 943 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); | 907 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 944 StoreFastElementStub::GenerateAheadOfTime(isolate); | 908 StoreFastElementStub::GenerateAheadOfTime(isolate); |
| 945 TypeofStub::GenerateAheadOfTime(isolate); | 909 TypeofStub::GenerateAheadOfTime(isolate); |
| 946 } | 910 } |
| 947 | 911 |
| 948 | 912 |
| 949 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 913 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| (...skipping 3226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4176 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 4140 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 4177 T stub(isolate, kind); | 4141 T stub(isolate, kind); |
| 4178 stub.GetCode(); | 4142 stub.GetCode(); |
| 4179 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 4143 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 4180 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); | 4144 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); |
| 4181 stub1.GetCode(); | 4145 stub1.GetCode(); |
| 4182 } | 4146 } |
| 4183 } | 4147 } |
| 4184 } | 4148 } |
| 4185 | 4149 |
| 4186 | 4150 void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 4187 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | |
| 4188 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 4151 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 4189 isolate); | 4152 isolate); |
| 4190 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( | 4153 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( |
| 4191 isolate); | 4154 isolate); |
| 4192 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( | 4155 ArrayNArgumentsConstructorStub stub(isolate); |
| 4193 isolate); | 4156 stub.GetCode(); |
| 4194 } | |
| 4195 | |
| 4196 | |
| 4197 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( | |
| 4198 Isolate* isolate) { | |
| 4199 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; | 4157 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; |
| 4200 for (int i = 0; i < 2; i++) { | 4158 for (int i = 0; i < 2; i++) { |
| 4201 // For internal arrays we only need a few things | 4159 // For internal arrays we only need a few things |
| 4202 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); | 4160 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); |
| 4203 stubh1.GetCode(); | 4161 stubh1.GetCode(); |
| 4204 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 4162 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 4205 stubh2.GetCode(); | 4163 stubh2.GetCode(); |
| 4206 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); | |
| 4207 stubh3.GetCode(); | |
| 4208 } | 4164 } |
| 4209 } | 4165 } |
| 4210 | 4166 |
| 4211 | 4167 |
| 4212 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 4168 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 4213 MacroAssembler* masm, | 4169 MacroAssembler* masm, |
| 4214 AllocationSiteOverrideMode mode) { | 4170 AllocationSiteOverrideMode mode) { |
| 4215 if (argument_count() == ANY) { | 4171 if (argument_count() == ANY) { |
| 4216 Label not_zero_case, not_one_case; | 4172 Label not_zero_case, not_one_case; |
| 4217 __ tst(r0, r0); | 4173 __ tst(r0, r0); |
| 4218 __ b(ne, ¬_zero_case); | 4174 __ b(ne, ¬_zero_case); |
| 4219 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4175 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4220 | 4176 |
| 4221 __ bind(¬_zero_case); | 4177 __ bind(¬_zero_case); |
| 4222 __ cmp(r0, Operand(1)); | 4178 __ cmp(r0, Operand(1)); |
| 4223 __ b(gt, ¬_one_case); | 4179 __ b(gt, ¬_one_case); |
| 4224 CreateArrayDispatchOneArgument(masm, mode); | 4180 CreateArrayDispatchOneArgument(masm, mode); |
| 4225 | 4181 |
| 4226 __ bind(¬_one_case); | 4182 __ bind(¬_one_case); |
| 4227 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4183 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4184 __ TailCallStub(&stub); |
| 4228 } else if (argument_count() == NONE) { | 4185 } else if (argument_count() == NONE) { |
| 4229 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4186 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4230 } else if (argument_count() == ONE) { | 4187 } else if (argument_count() == ONE) { |
| 4231 CreateArrayDispatchOneArgument(masm, mode); | 4188 CreateArrayDispatchOneArgument(masm, mode); |
| 4232 } else if (argument_count() == MORE_THAN_ONE) { | 4189 } else if (argument_count() == MORE_THAN_ONE) { |
| 4233 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4190 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4191 __ TailCallStub(&stub); |
| 4234 } else { | 4192 } else { |
| 4235 UNREACHABLE(); | 4193 UNREACHABLE(); |
| 4236 } | 4194 } |
| 4237 } | 4195 } |
| 4238 | 4196 |
| 4239 | 4197 |
| 4240 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4198 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4241 // ----------- S t a t e ------------- | 4199 // ----------- S t a t e ------------- |
| 4242 // -- r0 : argc (only if argument_count() == ANY) | 4200 // -- r0 : argc (only if argument_count() == ANY) |
| 4243 // -- r1 : constructor | 4201 // -- r1 : constructor |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4305 } | 4263 } |
| 4306 | 4264 |
| 4307 | 4265 |
| 4308 void InternalArrayConstructorStub::GenerateCase( | 4266 void InternalArrayConstructorStub::GenerateCase( |
| 4309 MacroAssembler* masm, ElementsKind kind) { | 4267 MacroAssembler* masm, ElementsKind kind) { |
| 4310 __ cmp(r0, Operand(1)); | 4268 __ cmp(r0, Operand(1)); |
| 4311 | 4269 |
| 4312 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); | 4270 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); |
| 4313 __ TailCallStub(&stub0, lo); | 4271 __ TailCallStub(&stub0, lo); |
| 4314 | 4272 |
| 4315 InternalArrayNArgumentsConstructorStub stubN(isolate(), kind); | 4273 ArrayNArgumentsConstructorStub stubN(isolate()); |
| 4316 __ TailCallStub(&stubN, hi); | 4274 __ TailCallStub(&stubN, hi); |
| 4317 | 4275 |
| 4318 if (IsFastPackedElementsKind(kind)) { | 4276 if (IsFastPackedElementsKind(kind)) { |
| 4319 // We might need to create a holey array | 4277 // We might need to create a holey array |
| 4320 // look at the first argument | 4278 // look at the first argument |
| 4321 __ ldr(r3, MemOperand(sp, 0)); | 4279 __ ldr(r3, MemOperand(sp, 0)); |
| 4322 __ cmp(r3, Operand::Zero()); | 4280 __ cmp(r3, Operand::Zero()); |
| 4323 | 4281 |
| 4324 InternalArraySingleArgumentConstructorStub | 4282 InternalArraySingleArgumentConstructorStub |
| 4325 stub1_holey(isolate(), GetHoleyElementsKind(kind)); | 4283 stub1_holey(isolate(), GetHoleyElementsKind(kind)); |
| (...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5426 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 5384 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 5427 kStackUnwindSpace, NULL, return_value_operand, NULL); | 5385 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 5428 } | 5386 } |
| 5429 | 5387 |
| 5430 #undef __ | 5388 #undef __ |
| 5431 | 5389 |
| 5432 } // namespace internal | 5390 } // namespace internal |
| 5433 } // namespace v8 | 5391 } // namespace v8 |
| 5434 | 5392 |
| 5435 #endif // V8_TARGET_ARCH_ARM | 5393 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |