Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Side by Side Diff: src/arm64/code-stubs-arm64.cc

Issue 2024253002: [stubs] Remove N-argument Hydrogen-based Array constructor stub (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix arm64 Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_ARM64 5 #if V8_TARGET_ARCH_ARM64
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 18
19 #include "src/arm64/code-stubs-arm64.h" 19 #include "src/arm64/code-stubs-arm64.h"
20 #include "src/arm64/frames-arm64.h" 20 #include "src/arm64/frames-arm64.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 __ Mov(x5, Operand(x0, LSL, kPointerSizeLog2));
28 int constant_stack_parameter_count) { 29 __ Str(x1, MemOperand(jssp, x5));
29 // cp: context 30 __ Push(x1);
30 // x1: function 31 __ Push(x2);
31 // x2: allocation site with elements kind 32 __ Add(x0, x0, Operand(3));
32 // x0: number of arguments to the constructor function 33 __ TailCallRuntime(Runtime::kNewArray);
33 Address deopt_handler = Runtime::FunctionForId(
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(x0, deopt_handler, constant_stack_parameter_count,
41 JS_FUNCTION_STUB_MODE);
42 }
43 } 34 }
44 35
45
46 void ArrayNArgumentsConstructorStub::InitializeDescriptor(
47 CodeStubDescriptor* descriptor) {
48 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1);
49 }
50
51
52 static void InitializeInternalArrayConstructorDescriptor(
53 Isolate* isolate, CodeStubDescriptor* descriptor,
54 int constant_stack_parameter_count) {
55 Address deopt_handler = Runtime::FunctionForId(
56 Runtime::kInternalArrayConstructor)->entry;
57
58 if (constant_stack_parameter_count == 0) {
59 descriptor->Initialize(deopt_handler, constant_stack_parameter_count,
60 JS_FUNCTION_STUB_MODE);
61 } else {
62 descriptor->Initialize(x0, deopt_handler, constant_stack_parameter_count,
63 JS_FUNCTION_STUB_MODE);
64 }
65 }
66
67
68 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { 36 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
69 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; 37 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
70 descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); 38 descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
71 } 39 }
72 40
73 void FastFunctionBindStub::InitializeDescriptor( 41 void FastFunctionBindStub::InitializeDescriptor(
74 CodeStubDescriptor* descriptor) { 42 CodeStubDescriptor* descriptor) {
75 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; 43 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry;
76 descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); 44 descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
77 } 45 }
78 46
79 void InternalArrayNArgumentsConstructorStub::InitializeDescriptor(
80 CodeStubDescriptor* descriptor) {
81 InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1);
82 }
83
84
85 #define __ ACCESS_MASM(masm)
86
87
88 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, 47 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm,
89 ExternalReference miss) { 48 ExternalReference miss) {
90 // Update the static counter each time a new code stub is generated. 49 // Update the static counter each time a new code stub is generated.
91 isolate()->counters()->code_stubs()->Increment(); 50 isolate()->counters()->code_stubs()->Increment();
92 51
93 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); 52 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor();
94 int param_count = descriptor.GetRegisterParameterCount(); 53 int param_count = descriptor.GetRegisterParameterCount();
95 { 54 {
96 // Call the runtime system in a fresh internal frame. 55 // Call the runtime system in a fresh internal frame.
97 FrameScope scope(masm, StackFrame::INTERNAL); 56 FrameScope scope(masm, StackFrame::INTERNAL);
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 932
974 933
975 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { 934 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) {
976 // It is important that the following stubs are generated in this order 935 // It is important that the following stubs are generated in this order
977 // because pregenerated stubs can only call other pregenerated stubs. 936 // because pregenerated stubs can only call other pregenerated stubs.
978 // RecordWriteStub uses StoreBufferOverflowStub, which in turn uses 937 // RecordWriteStub uses StoreBufferOverflowStub, which in turn uses
979 // CEntryStub. 938 // CEntryStub.
980 CEntryStub::GenerateAheadOfTime(isolate); 939 CEntryStub::GenerateAheadOfTime(isolate);
981 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); 940 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate);
982 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); 941 StubFailureTrampolineStub::GenerateAheadOfTime(isolate);
983 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); 942 CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate);
984 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); 943 CreateAllocationSiteStub::GenerateAheadOfTime(isolate);
985 CreateWeakCellStub::GenerateAheadOfTime(isolate); 944 CreateWeakCellStub::GenerateAheadOfTime(isolate);
986 BinaryOpICStub::GenerateAheadOfTime(isolate); 945 BinaryOpICStub::GenerateAheadOfTime(isolate);
987 StoreRegistersStateStub::GenerateAheadOfTime(isolate); 946 StoreRegistersStateStub::GenerateAheadOfTime(isolate);
988 RestoreRegistersStateStub::GenerateAheadOfTime(isolate); 947 RestoreRegistersStateStub::GenerateAheadOfTime(isolate);
989 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); 948 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate);
990 StoreFastElementStub::GenerateAheadOfTime(isolate); 949 StoreFastElementStub::GenerateAheadOfTime(isolate);
991 TypeofStub::GenerateAheadOfTime(isolate); 950 TypeofStub::GenerateAheadOfTime(isolate);
992 } 951 }
993 952
(...skipping 3432 matching lines...) Expand 10 before | Expand all | Expand 10 after
4426 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); 4385 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i);
4427 T stub(isolate, kind); 4386 T stub(isolate, kind);
4428 stub.GetCode(); 4387 stub.GetCode();
4429 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { 4388 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) {
4430 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); 4389 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES);
4431 stub1.GetCode(); 4390 stub1.GetCode();
4432 } 4391 }
4433 } 4392 }
4434 } 4393 }
4435 4394
4436 4395 void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) {
4437 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) {
4438 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( 4396 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>(
4439 isolate); 4397 isolate);
4440 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( 4398 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>(
4441 isolate); 4399 isolate);
4442 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( 4400 ArrayNArgumentsConstructorStub stub(isolate);
4443 isolate); 4401 stub.GetCode();
4444 }
4445
4446
4447 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(
4448 Isolate* isolate) {
4449 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; 4402 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS };
4450 for (int i = 0; i < 2; i++) { 4403 for (int i = 0; i < 2; i++) {
4451 // For internal arrays we only need a few things 4404 // For internal arrays we only need a few things
4452 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); 4405 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]);
4453 stubh1.GetCode(); 4406 stubh1.GetCode();
4454 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); 4407 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]);
4455 stubh2.GetCode(); 4408 stubh2.GetCode();
4456 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]);
4457 stubh3.GetCode();
4458 } 4409 }
4459 } 4410 }
4460 4411
4461 4412
4462 void ArrayConstructorStub::GenerateDispatchToArrayStub( 4413 void ArrayConstructorStub::GenerateDispatchToArrayStub(
4463 MacroAssembler* masm, 4414 MacroAssembler* masm,
4464 AllocationSiteOverrideMode mode) { 4415 AllocationSiteOverrideMode mode) {
4465 Register argc = x0; 4416 Register argc = x0;
4466 if (argument_count() == ANY) { 4417 if (argument_count() == ANY) {
4467 Label zero_case, n_case; 4418 Label zero_case, n_case;
4468 __ Cbz(argc, &zero_case); 4419 __ Cbz(argc, &zero_case);
4469 __ Cmp(argc, 1); 4420 __ Cmp(argc, 1);
4470 __ B(ne, &n_case); 4421 __ B(ne, &n_case);
4471 4422
4472 // One argument. 4423 // One argument.
4473 CreateArrayDispatchOneArgument(masm, mode); 4424 CreateArrayDispatchOneArgument(masm, mode);
4474 4425
4475 __ Bind(&zero_case); 4426 __ Bind(&zero_case);
4476 // No arguments. 4427 // No arguments.
4477 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); 4428 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode);
4478 4429
4479 __ Bind(&n_case); 4430 __ Bind(&n_case);
4480 // N arguments. 4431 // N arguments.
4481 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); 4432 ArrayNArgumentsConstructorStub stub(masm->isolate());
4482 4433 __ TailCallStub(&stub);
4483 } else if (argument_count() == NONE) { 4434 } else if (argument_count() == NONE) {
4484 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); 4435 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode);
4485 } else if (argument_count() == ONE) { 4436 } else if (argument_count() == ONE) {
4486 CreateArrayDispatchOneArgument(masm, mode); 4437 CreateArrayDispatchOneArgument(masm, mode);
4487 } else if (argument_count() == MORE_THAN_ONE) { 4438 } else if (argument_count() == MORE_THAN_ONE) {
4488 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); 4439 ArrayNArgumentsConstructorStub stub(masm->isolate());
4440 __ TailCallStub(&stub);
4489 } else { 4441 } else {
4490 UNREACHABLE(); 4442 UNREACHABLE();
4491 } 4443 }
4492 } 4444 }
4493 4445
4494 4446
4495 void ArrayConstructorStub::Generate(MacroAssembler* masm) { 4447 void ArrayConstructorStub::Generate(MacroAssembler* masm) {
4496 ASM_LOCATION("ArrayConstructorStub::Generate"); 4448 ASM_LOCATION("ArrayConstructorStub::Generate");
4497 // ----------- S t a t e ------------- 4449 // ----------- S t a t e -------------
4498 // -- x0 : argc (only if argument_count() is ANY or MORE_THAN_ONE) 4450 // -- x0 : argc (only if argument_count() is ANY or MORE_THAN_ONE)
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
4593 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind); 4545 InternalArraySingleArgumentConstructorStub stub1(isolate(), kind);
4594 __ TailCallStub(&stub1); 4546 __ TailCallStub(&stub1);
4595 4547
4596 __ Bind(&zero_case); 4548 __ Bind(&zero_case);
4597 // No arguments. 4549 // No arguments.
4598 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); 4550 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind);
4599 __ TailCallStub(&stub0); 4551 __ TailCallStub(&stub0);
4600 4552
4601 __ Bind(&n_case); 4553 __ Bind(&n_case);
4602 // N arguments. 4554 // N arguments.
4603 InternalArrayNArgumentsConstructorStub stubN(isolate(), kind); 4555 ArrayNArgumentsConstructorStub stubN(isolate());
4604 __ TailCallStub(&stubN); 4556 __ TailCallStub(&stubN);
4605 } 4557 }
4606 4558
4607 4559
4608 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { 4560 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
4609 // ----------- S t a t e ------------- 4561 // ----------- S t a t e -------------
4610 // -- x0 : argc 4562 // -- x0 : argc
4611 // -- x1 : constructor 4563 // -- x1 : constructor
4612 // -- sp[0] : return address 4564 // -- sp[0] : return address
4613 // -- sp[4] : last argument 4565 // -- sp[4] : last argument
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after
5822 kStackUnwindSpace, NULL, spill_offset, 5774 kStackUnwindSpace, NULL, spill_offset,
5823 return_value_operand, NULL); 5775 return_value_operand, NULL);
5824 } 5776 }
5825 5777
5826 #undef __ 5778 #undef __
5827 5779
5828 } // namespace internal 5780 } // namespace internal
5829 } // namespace v8 5781 } // namespace v8
5830 5782
5831 #endif // V8_TARGET_ARCH_ARM64 5783 #endif // V8_TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698