| 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_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
| 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/ia32/code-stubs-ia32.h" | 12 #include "src/ia32/code-stubs-ia32.h" |
| 13 #include "src/ia32/frames-ia32.h" | 13 #include "src/ia32/frames-ia32.h" |
| 14 #include "src/ic/handler-compiler.h" | 14 #include "src/ic/handler-compiler.h" |
| 15 #include "src/ic/ic.h" | 15 #include "src/ic/ic.h" |
| 16 #include "src/ic/stub-cache.h" | 16 #include "src/ic/stub-cache.h" |
| 17 #include "src/isolate.h" | 17 #include "src/isolate.h" |
| 18 #include "src/regexp/jsregexp.h" | 18 #include "src/regexp/jsregexp.h" |
| 19 #include "src/regexp/regexp-macro-assembler.h" | 19 #include "src/regexp/regexp-macro-assembler.h" |
| 20 #include "src/runtime/runtime.h" | 20 #include "src/runtime/runtime.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 __ pop(ecx); |
| 28 int constant_stack_parameter_count) { | 29 __ mov(MemOperand(esp, eax, times_4, 0), edi); |
| 29 // register state | 30 __ push(edi); |
| 30 // eax -- number of arguments | 31 __ push(ebx); |
| 31 // edi -- function | 32 __ push(ecx); |
| 32 // ebx -- allocation site with elements kind | 33 __ add(eax, Immediate(3)); |
| 33 Address deopt_handler = Runtime::FunctionForId( | 34 __ TailCallRuntime(Runtime::kNewArray); |
| 34 Runtime::kArrayConstructor)->entry; | |
| 35 | |
| 36 if (constant_stack_parameter_count == 0) { | |
| 37 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 38 JS_FUNCTION_STUB_MODE); | |
| 39 } else { | |
| 40 descriptor->Initialize(eax, deopt_handler, constant_stack_parameter_count, | |
| 41 JS_FUNCTION_STUB_MODE); | |
| 42 } | |
| 43 } | 35 } |
| 44 | 36 |
| 45 | |
| 46 static void InitializeInternalArrayConstructorDescriptor( | |
| 47 Isolate* isolate, CodeStubDescriptor* descriptor, | |
| 48 int constant_stack_parameter_count) { | |
| 49 // register state | |
| 50 // eax -- number of arguments | |
| 51 // edi -- constructor function | |
| 52 Address deopt_handler = Runtime::FunctionForId( | |
| 53 Runtime::kInternalArrayConstructor)->entry; | |
| 54 | |
| 55 if (constant_stack_parameter_count == 0) { | |
| 56 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 57 JS_FUNCTION_STUB_MODE); | |
| 58 } else { | |
| 59 descriptor->Initialize(eax, deopt_handler, constant_stack_parameter_count, | |
| 60 JS_FUNCTION_STUB_MODE); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 | |
| 65 void ArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 66 CodeStubDescriptor* descriptor) { | |
| 67 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 68 } | |
| 69 | |
| 70 | |
| 71 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 37 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| 72 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; | 38 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; |
| 73 descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 39 descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 74 } | 40 } |
| 75 | 41 |
| 76 void FastFunctionBindStub::InitializeDescriptor( | 42 void FastFunctionBindStub::InitializeDescriptor( |
| 77 CodeStubDescriptor* descriptor) { | 43 CodeStubDescriptor* descriptor) { |
| 78 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; | 44 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; |
| 79 descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 45 descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 80 } | 46 } |
| 81 | 47 |
| 82 void InternalArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 83 CodeStubDescriptor* descriptor) { | |
| 84 InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 85 } | |
| 86 | |
| 87 | |
| 88 #define __ ACCESS_MASM(masm) | |
| 89 | |
| 90 | |
| 91 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, | 48 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, |
| 92 ExternalReference miss) { | 49 ExternalReference miss) { |
| 93 // Update the static counter each time a new code stub is generated. | 50 // Update the static counter each time a new code stub is generated. |
| 94 isolate()->counters()->code_stubs()->Increment(); | 51 isolate()->counters()->code_stubs()->Increment(); |
| 95 | 52 |
| 96 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); | 53 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); |
| 97 int param_count = descriptor.GetRegisterParameterCount(); | 54 int param_count = descriptor.GetRegisterParameterCount(); |
| 98 { | 55 { |
| 99 // Call the runtime system in a fresh internal frame. | 56 // Call the runtime system in a fresh internal frame. |
| 100 FrameScope scope(masm, StackFrame::INTERNAL); | 57 FrameScope scope(masm, StackFrame::INTERNAL); |
| (...skipping 1674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1775 bool CEntryStub::NeedsImmovableCode() { | 1732 bool CEntryStub::NeedsImmovableCode() { |
| 1776 return false; | 1733 return false; |
| 1777 } | 1734 } |
| 1778 | 1735 |
| 1779 | 1736 |
| 1780 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 1737 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 1781 CEntryStub::GenerateAheadOfTime(isolate); | 1738 CEntryStub::GenerateAheadOfTime(isolate); |
| 1782 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 1739 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 1783 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 1740 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 1784 // It is important that the store buffer overflow stubs are generated first. | 1741 // It is important that the store buffer overflow stubs are generated first. |
| 1785 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 1742 CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate); |
| 1786 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | 1743 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1787 CreateWeakCellStub::GenerateAheadOfTime(isolate); | 1744 CreateWeakCellStub::GenerateAheadOfTime(isolate); |
| 1788 BinaryOpICStub::GenerateAheadOfTime(isolate); | 1745 BinaryOpICStub::GenerateAheadOfTime(isolate); |
| 1789 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); | 1746 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1790 StoreFastElementStub::GenerateAheadOfTime(isolate); | 1747 StoreFastElementStub::GenerateAheadOfTime(isolate); |
| 1791 TypeofStub::GenerateAheadOfTime(isolate); | 1748 TypeofStub::GenerateAheadOfTime(isolate); |
| 1792 } | 1749 } |
| 1793 | 1750 |
| 1794 | 1751 |
| 1795 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 1752 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| (...skipping 2509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4305 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 4262 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 4306 T stub(isolate, kind); | 4263 T stub(isolate, kind); |
| 4307 stub.GetCode(); | 4264 stub.GetCode(); |
| 4308 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 4265 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 4309 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); | 4266 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); |
| 4310 stub1.GetCode(); | 4267 stub1.GetCode(); |
| 4311 } | 4268 } |
| 4312 } | 4269 } |
| 4313 } | 4270 } |
| 4314 | 4271 |
| 4315 | 4272 void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 4316 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | |
| 4317 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 4273 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 4318 isolate); | 4274 isolate); |
| 4319 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( | 4275 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( |
| 4320 isolate); | 4276 isolate); |
| 4321 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( | 4277 ArrayNArgumentsConstructorStub stub(isolate); |
| 4322 isolate); | 4278 stub.GetCode(); |
| 4323 } | |
| 4324 | 4279 |
| 4325 | |
| 4326 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( | |
| 4327 Isolate* isolate) { | |
| 4328 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; | 4280 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; |
| 4329 for (int i = 0; i < 2; i++) { | 4281 for (int i = 0; i < 2; i++) { |
| 4330 // For internal arrays we only need a few things | 4282 // For internal arrays we only need a few things |
| 4331 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); | 4283 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); |
| 4332 stubh1.GetCode(); | 4284 stubh1.GetCode(); |
| 4333 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 4285 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 4334 stubh2.GetCode(); | 4286 stubh2.GetCode(); |
| 4335 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); | |
| 4336 stubh3.GetCode(); | |
| 4337 } | 4287 } |
| 4338 } | 4288 } |
| 4339 | 4289 |
| 4340 | 4290 |
| 4341 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 4291 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 4342 MacroAssembler* masm, | 4292 MacroAssembler* masm, |
| 4343 AllocationSiteOverrideMode mode) { | 4293 AllocationSiteOverrideMode mode) { |
| 4344 if (argument_count() == ANY) { | 4294 if (argument_count() == ANY) { |
| 4345 Label not_zero_case, not_one_case; | 4295 Label not_zero_case, not_one_case; |
| 4346 __ test(eax, eax); | 4296 __ test(eax, eax); |
| 4347 __ j(not_zero, ¬_zero_case); | 4297 __ j(not_zero, ¬_zero_case); |
| 4348 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4298 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4349 | 4299 |
| 4350 __ bind(¬_zero_case); | 4300 __ bind(¬_zero_case); |
| 4351 __ cmp(eax, 1); | 4301 __ cmp(eax, 1); |
| 4352 __ j(greater, ¬_one_case); | 4302 __ j(greater, ¬_one_case); |
| 4353 CreateArrayDispatchOneArgument(masm, mode); | 4303 CreateArrayDispatchOneArgument(masm, mode); |
| 4354 | 4304 |
| 4355 __ bind(¬_one_case); | 4305 __ bind(¬_one_case); |
| 4356 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4306 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4307 __ TailCallStub(&stub); |
| 4357 } else if (argument_count() == NONE) { | 4308 } else if (argument_count() == NONE) { |
| 4358 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4309 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4359 } else if (argument_count() == ONE) { | 4310 } else if (argument_count() == ONE) { |
| 4360 CreateArrayDispatchOneArgument(masm, mode); | 4311 CreateArrayDispatchOneArgument(masm, mode); |
| 4361 } else if (argument_count() == MORE_THAN_ONE) { | 4312 } else if (argument_count() == MORE_THAN_ONE) { |
| 4362 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4313 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4314 __ TailCallStub(&stub); |
| 4363 } else { | 4315 } else { |
| 4364 UNREACHABLE(); | 4316 UNREACHABLE(); |
| 4365 } | 4317 } |
| 4366 } | 4318 } |
| 4367 | 4319 |
| 4368 | 4320 |
| 4369 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4321 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4370 // ----------- S t a t e ------------- | 4322 // ----------- S t a t e ------------- |
| 4371 // -- eax : argc (only if argument_count() is ANY or MORE_THAN_ONE) | 4323 // -- eax : argc (only if argument_count() is ANY or MORE_THAN_ONE) |
| 4372 // -- ebx : AllocationSite or undefined | 4324 // -- ebx : AllocationSite or undefined |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4464 InternalArraySingleArgumentConstructorStub | 4416 InternalArraySingleArgumentConstructorStub |
| 4465 stub1_holey(isolate(), GetHoleyElementsKind(kind)); | 4417 stub1_holey(isolate(), GetHoleyElementsKind(kind)); |
| 4466 __ TailCallStub(&stub1_holey); | 4418 __ TailCallStub(&stub1_holey); |
| 4467 } | 4419 } |
| 4468 | 4420 |
| 4469 __ bind(&normal_sequence); | 4421 __ bind(&normal_sequence); |
| 4470 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind); | 4422 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind); |
| 4471 __ TailCallStub(&stub1); | 4423 __ TailCallStub(&stub1); |
| 4472 | 4424 |
| 4473 __ bind(¬_one_case); | 4425 __ bind(¬_one_case); |
| 4474 InternalArrayNArgumentsConstructorStub stubN(isolate(), kind); | 4426 ArrayNArgumentsConstructorStub stubN(isolate()); |
| 4475 __ TailCallStub(&stubN); | 4427 __ TailCallStub(&stubN); |
| 4476 } | 4428 } |
| 4477 | 4429 |
| 4478 | 4430 |
| 4479 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { | 4431 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4480 // ----------- S t a t e ------------- | 4432 // ----------- S t a t e ------------- |
| 4481 // -- eax : argc | 4433 // -- eax : argc |
| 4482 // -- edi : constructor | 4434 // -- edi : constructor |
| 4483 // -- esp[0] : return address | 4435 // -- esp[0] : return address |
| 4484 // -- esp[4] : last argument | 4436 // -- esp[4] : last argument |
| (...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5702 kStackUnwindSpace, nullptr, return_value_operand, | 5654 kStackUnwindSpace, nullptr, return_value_operand, |
| 5703 NULL); | 5655 NULL); |
| 5704 } | 5656 } |
| 5705 | 5657 |
| 5706 #undef __ | 5658 #undef __ |
| 5707 | 5659 |
| 5708 } // namespace internal | 5660 } // namespace internal |
| 5709 } // namespace v8 | 5661 } // namespace v8 |
| 5710 | 5662 |
| 5711 #endif // V8_TARGET_ARCH_IA32 | 5663 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |