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

Side by Side Diff: src/full-codegen/arm64/full-codegen-arm64.cc

Issue 2316453002: [fullcodegen] Introduce single bottleneck for calling KeyedStoreIC. (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/full-codegen.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/full-codegen/full-codegen.h" 7 #include "src/full-codegen/full-codegen.h"
8 #include "src/ast/compile-time-value.h" 8 #include "src/ast/compile-time-value.h"
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 1586
1587 if (!result_saved) { 1587 if (!result_saved) {
1588 PushOperand(x0); 1588 PushOperand(x0);
1589 result_saved = true; 1589 result_saved = true;
1590 } 1590 }
1591 VisitForAccumulatorValue(subexpr); 1591 VisitForAccumulatorValue(subexpr);
1592 1592
1593 __ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); 1593 __ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index));
1594 __ Peek(StoreDescriptor::ReceiverRegister(), 0); 1594 __ Peek(StoreDescriptor::ReceiverRegister(), 0);
1595 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); 1595 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot());
1596 Handle<Code> ic = 1596 CallKeyedStoreIC();
1597 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
1598 CallIC(ic);
1599 1597
1600 PrepareForBailoutForId(expr->GetIdForElement(array_index), 1598 PrepareForBailoutForId(expr->GetIdForElement(array_index),
1601 BailoutState::NO_REGISTERS); 1599 BailoutState::NO_REGISTERS);
1602 } 1600 }
1603 1601
1604 // In case the array literal contains spread expressions it has two parts. The 1602 // In case the array literal contains spread expressions it has two parts. The
1605 // first part is the "static" array which has a literal index is handled 1603 // first part is the "static" array which has a literal index is handled
1606 // above. The second part is the part after the first spread expression 1604 // above. The second part is the part after the first spread expression
1607 // (inclusive) and these elements gets appended to the array. Note that the 1605 // (inclusive) and these elements gets appended to the array. Note that the
1608 // number elements an iterable produces is unknown ahead of time. 1606 // number elements an iterable produces is unknown ahead of time.
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
2005 break; 2003 break;
2006 } 2004 }
2007 case KEYED_PROPERTY: { 2005 case KEYED_PROPERTY: {
2008 PushOperand(x0); // Preserve value. 2006 PushOperand(x0); // Preserve value.
2009 VisitForStackValue(prop->obj()); 2007 VisitForStackValue(prop->obj());
2010 VisitForAccumulatorValue(prop->key()); 2008 VisitForAccumulatorValue(prop->key());
2011 __ Mov(StoreDescriptor::NameRegister(), x0); 2009 __ Mov(StoreDescriptor::NameRegister(), x0);
2012 PopOperands(StoreDescriptor::ReceiverRegister(), 2010 PopOperands(StoreDescriptor::ReceiverRegister(),
2013 StoreDescriptor::ValueRegister()); 2011 StoreDescriptor::ValueRegister());
2014 EmitLoadStoreICSlot(slot); 2012 EmitLoadStoreICSlot(slot);
2015 Handle<Code> ic = 2013 CallKeyedStoreIC();
2016 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
2017 CallIC(ic);
2018 break; 2014 break;
2019 } 2015 }
2020 } 2016 }
2021 context()->Plug(x0); 2017 context()->Plug(x0);
2022 } 2018 }
2023 2019
2024 2020
2025 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 2021 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
2026 Variable* var, MemOperand location) { 2022 Variable* var, MemOperand location) {
2027 __ Str(result_register(), location); 2023 __ Str(result_register(), location);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 2147
2152 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 2148 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2153 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment"); 2149 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment");
2154 // Assignment to a property, using a keyed store IC. 2150 // Assignment to a property, using a keyed store IC.
2155 2151
2156 // TODO(all): Could we pass this in registers rather than on the stack? 2152 // TODO(all): Could we pass this in registers rather than on the stack?
2157 PopOperands(StoreDescriptor::NameRegister(), 2153 PopOperands(StoreDescriptor::NameRegister(),
2158 StoreDescriptor::ReceiverRegister()); 2154 StoreDescriptor::ReceiverRegister());
2159 DCHECK(StoreDescriptor::ValueRegister().is(x0)); 2155 DCHECK(StoreDescriptor::ValueRegister().is(x0));
2160 2156
2161 Handle<Code> ic =
2162 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
2163 EmitLoadStoreICSlot(expr->AssignmentSlot()); 2157 EmitLoadStoreICSlot(expr->AssignmentSlot());
2164 CallIC(ic); 2158 CallKeyedStoreIC();
2165 2159
2166 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2160 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2167 context()->Plug(x0); 2161 context()->Plug(x0);
2168 } 2162 }
2169 2163
2170 2164
2171 void FullCodeGenerator::CallIC(Handle<Code> code, 2165 void FullCodeGenerator::CallIC(Handle<Code> code,
2172 TypeFeedbackId ast_id) { 2166 TypeFeedbackId ast_id) {
2173 ic_total_count_++; 2167 ic_total_count_++;
2174 // All calls must have a predictable size in full-codegen code to ensure that 2168 // All calls must have a predictable size in full-codegen code to ensure that
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3277 context()->PlugTOS(); 3271 context()->PlugTOS();
3278 } 3272 }
3279 } else { 3273 } else {
3280 context()->Plug(x0); 3274 context()->Plug(x0);
3281 } 3275 }
3282 break; 3276 break;
3283 } 3277 }
3284 case KEYED_PROPERTY: { 3278 case KEYED_PROPERTY: {
3285 PopOperand(StoreDescriptor::NameRegister()); 3279 PopOperand(StoreDescriptor::NameRegister());
3286 PopOperand(StoreDescriptor::ReceiverRegister()); 3280 PopOperand(StoreDescriptor::ReceiverRegister());
3287 Handle<Code> ic =
3288 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
3289 EmitLoadStoreICSlot(expr->CountSlot()); 3281 EmitLoadStoreICSlot(expr->CountSlot());
3290 CallIC(ic); 3282 CallKeyedStoreIC();
3291 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 3283 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
3292 if (expr->is_postfix()) { 3284 if (expr->is_postfix()) {
3293 if (!context()->IsEffect()) { 3285 if (!context()->IsEffect()) {
3294 context()->PlugTOS(); 3286 context()->PlugTOS();
3295 } 3287 }
3296 } else { 3288 } else {
3297 context()->Plug(x0); 3289 context()->Plug(x0);
3298 } 3290 }
3299 break; 3291 break;
3300 } 3292 }
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
3819 } 3811 }
3820 3812
3821 return INTERRUPT; 3813 return INTERRUPT;
3822 } 3814 }
3823 3815
3824 3816
3825 } // namespace internal 3817 } // namespace internal
3826 } // namespace v8 3818 } // namespace v8
3827 3819
3828 #endif // V8_TARGET_ARCH_ARM64 3820 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/full-codegen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698