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

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

Issue 975463002: Implement subclassing Arrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added tests Created 5 years, 9 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 #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 4988 matching lines...) Expand 10 before | Expand all | Expand 10 after
4999 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); 4999 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode);
5000 } else { 5000 } else {
5001 UNREACHABLE(); 5001 UNREACHABLE();
5002 } 5002 }
5003 } 5003 }
5004 5004
5005 5005
5006 void ArrayConstructorStub::Generate(MacroAssembler* masm) { 5006 void ArrayConstructorStub::Generate(MacroAssembler* masm) {
5007 ASM_LOCATION("ArrayConstructorStub::Generate"); 5007 ASM_LOCATION("ArrayConstructorStub::Generate");
5008 // ----------- S t a t e ------------- 5008 // ----------- S t a t e -------------
5009 // -- x0 : argc (only if argument_count() == ANY) 5009 // -- x0 : argc (only if argument_count() is ANY or MORE_THAN_ONE)
5010 // -- x1 : constructor 5010 // -- x1 : constructor
5011 // -- x2 : AllocationSite or undefined 5011 // -- x2 : AllocationSite or undefined
5012 // -- x3 : original constructor 5012 // -- x3 : original constructor
5013 // -- sp[0] : return address 5013 // -- sp[0] : last argument
5014 // -- sp[4] : last argument
5015 // ----------------------------------- 5014 // -----------------------------------
5016 Register constructor = x1; 5015 Register constructor = x1;
5017 Register allocation_site = x2; 5016 Register allocation_site = x2;
5018 Register original_constructor = x3; 5017 Register original_constructor = x3;
5019 5018
5020 if (FLAG_debug_code) { 5019 if (FLAG_debug_code) {
5021 // The array construct code is only set for the global and natives 5020 // The array construct code is only set for the global and natives
5022 // builtin Array functions which always have maps. 5021 // builtin Array functions which always have maps.
5023 5022
5024 Label unexpected_map, map_ok; 5023 Label unexpected_map, map_ok;
(...skipping 23 matching lines...) Expand all
5048 5047
5049 __ Ldrsw(kind, 5048 __ Ldrsw(kind,
5050 UntagSmiFieldMemOperand(allocation_site, 5049 UntagSmiFieldMemOperand(allocation_site,
5051 AllocationSite::kTransitionInfoOffset)); 5050 AllocationSite::kTransitionInfoOffset));
5052 __ And(kind, kind, AllocationSite::ElementsKindBits::kMask); 5051 __ And(kind, kind, AllocationSite::ElementsKindBits::kMask);
5053 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); 5052 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE);
5054 5053
5055 __ Bind(&no_info); 5054 __ Bind(&no_info);
5056 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); 5055 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES);
5057 5056
5057 // Subclassing support.
5058 __ Bind(&subclassing); 5058 __ Bind(&subclassing);
5059 __ TailCallRuntime(Runtime::kThrowArrayNotSubclassableError, 0, 1); 5059 __ Push(constructor, original_constructor);
5060 // Adjust argc.
5061 switch (argument_count()) {
5062 case ANY:
5063 case MORE_THAN_ONE:
5064 __ add(x0, x0, Operand(2));
5065 break;
5066 case NONE:
5067 __ Mov(x0, Operand(2));
5068 break;
5069 case ONE:
5070 __ Mov(x0, Operand(3));
5071 break;
5072 }
5073 __ JumpToExternalReference(
5074 ExternalReference(Runtime::kArrayConstructorWithSubclassing, isolate()));
5060 } 5075 }
5061 5076
5062 5077
5063 void InternalArrayConstructorStub::GenerateCase( 5078 void InternalArrayConstructorStub::GenerateCase(
5064 MacroAssembler* masm, ElementsKind kind) { 5079 MacroAssembler* masm, ElementsKind kind) {
5065 Label zero_case, n_case; 5080 Label zero_case, n_case;
5066 Register argc = x0; 5081 Register argc = x0;
5067 5082
5068 __ Cbz(argc, &zero_case); 5083 __ Cbz(argc, &zero_case);
5069 __ CompareAndBranch(argc, 1, ne, &n_case); 5084 __ CompareAndBranch(argc, 1, ne, &n_case);
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
5493 kStackUnwindSpace, NULL, spill_offset, 5508 kStackUnwindSpace, NULL, spill_offset,
5494 MemOperand(fp, 6 * kPointerSize), NULL); 5509 MemOperand(fp, 6 * kPointerSize), NULL);
5495 } 5510 }
5496 5511
5497 5512
5498 #undef __ 5513 #undef __
5499 5514
5500 } } // namespace v8::internal 5515 } } // namespace v8::internal
5501 5516
5502 #endif // V8_TARGET_ARCH_ARM64 5517 #endif // V8_TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698