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

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

Issue 2363123002: Revert of [fullcodegen] Refactor code that calls store ICs. (Closed)
Patch Set: Created 4 years, 2 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/ppc/full-codegen-ppc.cc ('k') | src/full-codegen/x64/full-codegen-x64.cc » ('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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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_S390 5 #if V8_TARGET_ARCH_S390
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 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 // Exit and decrement the loop depth. 1094 // Exit and decrement the loop depth.
1095 PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); 1095 PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS);
1096 __ bind(&exit); 1096 __ bind(&exit);
1097 decrement_loop_depth(); 1097 decrement_loop_depth();
1098 } 1098 }
1099 1099
1100 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, 1100 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
1101 FeedbackVectorSlot slot) { 1101 FeedbackVectorSlot slot) {
1102 DCHECK(NeedsHomeObject(initializer)); 1102 DCHECK(NeedsHomeObject(initializer));
1103 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1103 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1104 __ mov(StoreDescriptor::NameRegister(),
1105 Operand(isolate()->factory()->home_object_symbol()));
1104 __ LoadP(StoreDescriptor::ValueRegister(), 1106 __ LoadP(StoreDescriptor::ValueRegister(),
1105 MemOperand(sp, offset * kPointerSize)); 1107 MemOperand(sp, offset * kPointerSize));
1106 CallStoreIC(slot, isolate()->factory()->home_object_symbol()); 1108 EmitLoadStoreICSlot(slot);
1109 CallStoreIC();
1107 } 1110 }
1108 1111
1109 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, 1112 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
1110 int offset, 1113 int offset,
1111 FeedbackVectorSlot slot) { 1114 FeedbackVectorSlot slot) {
1112 DCHECK(NeedsHomeObject(initializer)); 1115 DCHECK(NeedsHomeObject(initializer));
1113 __ Move(StoreDescriptor::ReceiverRegister(), r2); 1116 __ Move(StoreDescriptor::ReceiverRegister(), r2);
1117 __ mov(StoreDescriptor::NameRegister(),
1118 Operand(isolate()->factory()->home_object_symbol()));
1114 __ LoadP(StoreDescriptor::ValueRegister(), 1119 __ LoadP(StoreDescriptor::ValueRegister(),
1115 MemOperand(sp, offset * kPointerSize)); 1120 MemOperand(sp, offset * kPointerSize));
1116 CallStoreIC(slot, isolate()->factory()->home_object_symbol()); 1121 EmitLoadStoreICSlot(slot);
1122 CallStoreIC();
1117 } 1123 }
1118 1124
1119 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, 1125 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
1120 TypeofMode typeof_mode, 1126 TypeofMode typeof_mode,
1121 Label* slow) { 1127 Label* slow) {
1122 Register current = cp; 1128 Register current = cp;
1123 Register next = r3; 1129 Register next = r3;
1124 Register temp = r4; 1130 Register temp = r4;
1125 1131
1126 int to_check = scope()->ContextChainLengthUntilOutermostSloppyEval(); 1132 int to_check = scope()->ContextChainLengthUntilOutermostSloppyEval();
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); 1340 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value()));
1335 // Fall through. 1341 // Fall through.
1336 case ObjectLiteral::Property::COMPUTED: 1342 case ObjectLiteral::Property::COMPUTED:
1337 // It is safe to use [[Put]] here because the boilerplate already 1343 // It is safe to use [[Put]] here because the boilerplate already
1338 // contains computed properties with an uninitialized value. 1344 // contains computed properties with an uninitialized value.
1339 if (key->IsStringLiteral()) { 1345 if (key->IsStringLiteral()) {
1340 DCHECK(key->IsPropertyName()); 1346 DCHECK(key->IsPropertyName());
1341 if (property->emit_store()) { 1347 if (property->emit_store()) {
1342 VisitForAccumulatorValue(value); 1348 VisitForAccumulatorValue(value);
1343 DCHECK(StoreDescriptor::ValueRegister().is(r2)); 1349 DCHECK(StoreDescriptor::ValueRegister().is(r2));
1350 __ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
1344 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1351 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1345 CallStoreIC(property->GetSlot(0), key->value()); 1352 EmitLoadStoreICSlot(property->GetSlot(0));
1353 CallStoreIC();
1346 PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); 1354 PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
1347 1355
1348 if (NeedsHomeObject(value)) { 1356 if (NeedsHomeObject(value)) {
1349 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); 1357 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1));
1350 } 1358 }
1351 } else { 1359 } else {
1352 VisitForEffect(value); 1360 VisitForEffect(value);
1353 } 1361 }
1354 break; 1362 break;
1355 } 1363 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 1538
1531 if (!result_saved) { 1539 if (!result_saved) {
1532 PushOperand(r2); 1540 PushOperand(r2);
1533 result_saved = true; 1541 result_saved = true;
1534 } 1542 }
1535 VisitForAccumulatorValue(subexpr); 1543 VisitForAccumulatorValue(subexpr);
1536 1544
1537 __ LoadSmiLiteral(StoreDescriptor::NameRegister(), 1545 __ LoadSmiLiteral(StoreDescriptor::NameRegister(),
1538 Smi::FromInt(array_index)); 1546 Smi::FromInt(array_index));
1539 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1547 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1540 CallKeyedStoreIC(expr->LiteralFeedbackSlot()); 1548 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot());
1549 CallKeyedStoreIC();
1541 1550
1542 PrepareForBailoutForId(expr->GetIdForElement(array_index), 1551 PrepareForBailoutForId(expr->GetIdForElement(array_index),
1543 BailoutState::NO_REGISTERS); 1552 BailoutState::NO_REGISTERS);
1544 } 1553 }
1545 1554
1546 if (result_saved) { 1555 if (result_saved) {
1547 context()->PlugTOS(); 1556 context()->PlugTOS();
1548 } else { 1557 } else {
1549 context()->Plug(r2); 1558 context()->Plug(r2);
1550 } 1559 }
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
2002 Variable* var = expr->AsVariableProxy()->var(); 2011 Variable* var = expr->AsVariableProxy()->var();
2003 EffectContext context(this); 2012 EffectContext context(this);
2004 EmitVariableAssignment(var, Token::ASSIGN, slot); 2013 EmitVariableAssignment(var, Token::ASSIGN, slot);
2005 break; 2014 break;
2006 } 2015 }
2007 case NAMED_PROPERTY: { 2016 case NAMED_PROPERTY: {
2008 PushOperand(r2); // Preserve value. 2017 PushOperand(r2); // Preserve value.
2009 VisitForAccumulatorValue(prop->obj()); 2018 VisitForAccumulatorValue(prop->obj());
2010 __ Move(StoreDescriptor::ReceiverRegister(), r2); 2019 __ Move(StoreDescriptor::ReceiverRegister(), r2);
2011 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. 2020 PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
2012 CallStoreIC(slot, prop->key()->AsLiteral()->value()); 2021 __ mov(StoreDescriptor::NameRegister(),
2022 Operand(prop->key()->AsLiteral()->value()));
2023 EmitLoadStoreICSlot(slot);
2024 CallStoreIC();
2013 break; 2025 break;
2014 } 2026 }
2015 case NAMED_SUPER_PROPERTY: { 2027 case NAMED_SUPER_PROPERTY: {
2016 PushOperand(r2); 2028 PushOperand(r2);
2017 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2029 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2018 VisitForAccumulatorValue( 2030 VisitForAccumulatorValue(
2019 prop->obj()->AsSuperPropertyReference()->home_object()); 2031 prop->obj()->AsSuperPropertyReference()->home_object());
2020 // stack: value, this; r2: home_object 2032 // stack: value, this; r2: home_object
2021 Register scratch = r4; 2033 Register scratch = r4;
2022 Register scratch2 = r5; 2034 Register scratch2 = r5;
(...skipping 26 matching lines...) Expand all
2049 EmitKeyedSuperPropertyStore(prop); 2061 EmitKeyedSuperPropertyStore(prop);
2050 break; 2062 break;
2051 } 2063 }
2052 case KEYED_PROPERTY: { 2064 case KEYED_PROPERTY: {
2053 PushOperand(r2); // Preserve value. 2065 PushOperand(r2); // Preserve value.
2054 VisitForStackValue(prop->obj()); 2066 VisitForStackValue(prop->obj());
2055 VisitForAccumulatorValue(prop->key()); 2067 VisitForAccumulatorValue(prop->key());
2056 __ Move(StoreDescriptor::NameRegister(), r2); 2068 __ Move(StoreDescriptor::NameRegister(), r2);
2057 PopOperands(StoreDescriptor::ValueRegister(), 2069 PopOperands(StoreDescriptor::ValueRegister(),
2058 StoreDescriptor::ReceiverRegister()); 2070 StoreDescriptor::ReceiverRegister());
2059 CallKeyedStoreIC(slot); 2071 EmitLoadStoreICSlot(slot);
2072 CallKeyedStoreIC();
2060 break; 2073 break;
2061 } 2074 }
2062 } 2075 }
2063 context()->Plug(r2); 2076 context()->Plug(r2);
2064 } 2077 }
2065 2078
2066 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 2079 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
2067 Variable* var, MemOperand location) { 2080 Variable* var, MemOperand location) {
2068 __ StoreP(result_register(), location); 2081 __ StoreP(result_register(), location);
2069 if (var->IsContextSlot()) { 2082 if (var->IsContextSlot()) {
2070 // RecordWrite may destroy all its register arguments. 2083 // RecordWrite may destroy all its register arguments.
2071 __ LoadRR(r5, result_register()); 2084 __ LoadRR(r5, result_register());
2072 int offset = Context::SlotOffset(var->index()); 2085 int offset = Context::SlotOffset(var->index());
2073 __ RecordWriteContextSlot(r3, offset, r5, r4, kLRHasBeenSaved, 2086 __ RecordWriteContextSlot(r3, offset, r5, r4, kLRHasBeenSaved,
2074 kDontSaveFPRegs); 2087 kDontSaveFPRegs);
2075 } 2088 }
2076 } 2089 }
2077 2090
2078 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, 2091 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
2079 FeedbackVectorSlot slot) { 2092 FeedbackVectorSlot slot) {
2080 if (var->IsUnallocated()) { 2093 if (var->IsUnallocated()) {
2081 // Global var, const, or let. 2094 // Global var, const, or let.
2095 __ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
2082 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); 2096 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
2083 CallStoreIC(slot, var->name()); 2097 EmitLoadStoreICSlot(slot);
2098 CallStoreIC();
2084 2099
2085 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { 2100 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
2086 // Non-initializing assignment to let variable needs a write barrier. 2101 // Non-initializing assignment to let variable needs a write barrier.
2087 DCHECK(!var->IsLookupSlot()); 2102 DCHECK(!var->IsLookupSlot());
2088 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); 2103 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
2089 MemOperand location = VarOperand(var, r3); 2104 MemOperand location = VarOperand(var, r3);
2090 // Perform an initialization check for lexically declared variables. 2105 // Perform an initialization check for lexically declared variables.
2091 if (var->binding_needs_init()) { 2106 if (var->binding_needs_init()) {
2092 Label assign; 2107 Label assign;
2093 __ LoadP(r5, location); 2108 __ LoadP(r5, location);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2140 } 2155 }
2141 } 2156 }
2142 } 2157 }
2143 2158
2144 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { 2159 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
2145 // Assignment to a property, using a named store IC. 2160 // Assignment to a property, using a named store IC.
2146 Property* prop = expr->target()->AsProperty(); 2161 Property* prop = expr->target()->AsProperty();
2147 DCHECK(prop != NULL); 2162 DCHECK(prop != NULL);
2148 DCHECK(prop->key()->IsLiteral()); 2163 DCHECK(prop->key()->IsLiteral());
2149 2164
2165 __ mov(StoreDescriptor::NameRegister(),
2166 Operand(prop->key()->AsLiteral()->value()));
2150 PopOperand(StoreDescriptor::ReceiverRegister()); 2167 PopOperand(StoreDescriptor::ReceiverRegister());
2151 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value()); 2168 EmitLoadStoreICSlot(expr->AssignmentSlot());
2169 CallStoreIC();
2152 2170
2153 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2171 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2154 context()->Plug(r2); 2172 context()->Plug(r2);
2155 } 2173 }
2156 2174
2157 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { 2175 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
2158 // Assignment to named property of super. 2176 // Assignment to named property of super.
2159 // r2 : value 2177 // r2 : value
2160 // stack : receiver ('this'), home_object 2178 // stack : receiver ('this'), home_object
2161 DCHECK(prop != NULL); 2179 DCHECK(prop != NULL);
(...skipping 18 matching lines...) Expand all
2180 ? Runtime::kStoreKeyedToSuper_Strict 2198 ? Runtime::kStoreKeyedToSuper_Strict
2181 : Runtime::kStoreKeyedToSuper_Sloppy)); 2199 : Runtime::kStoreKeyedToSuper_Sloppy));
2182 } 2200 }
2183 2201
2184 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 2202 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2185 // Assignment to a property, using a keyed store IC. 2203 // Assignment to a property, using a keyed store IC.
2186 PopOperands(StoreDescriptor::ReceiverRegister(), 2204 PopOperands(StoreDescriptor::ReceiverRegister(),
2187 StoreDescriptor::NameRegister()); 2205 StoreDescriptor::NameRegister());
2188 DCHECK(StoreDescriptor::ValueRegister().is(r2)); 2206 DCHECK(StoreDescriptor::ValueRegister().is(r2));
2189 2207
2190 CallKeyedStoreIC(expr->AssignmentSlot()); 2208 EmitLoadStoreICSlot(expr->AssignmentSlot());
2209 CallKeyedStoreIC();
2191 2210
2192 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2211 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2193 context()->Plug(r2); 2212 context()->Plug(r2);
2194 } 2213 }
2195 2214
2196 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { 2215 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) {
2197 ic_total_count_++; 2216 ic_total_count_++;
2198 __ Call(code, RelocInfo::CODE_TARGET, ast_id); 2217 __ Call(code, RelocInfo::CODE_TARGET, ast_id);
2199 } 2218 }
2200 2219
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after
3193 } 3212 }
3194 } else { 3213 } else {
3195 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), 3214 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
3196 Token::ASSIGN, expr->CountSlot()); 3215 Token::ASSIGN, expr->CountSlot());
3197 PrepareForBailoutForId(expr->AssignmentId(), 3216 PrepareForBailoutForId(expr->AssignmentId(),
3198 BailoutState::TOS_REGISTER); 3217 BailoutState::TOS_REGISTER);
3199 context()->Plug(r2); 3218 context()->Plug(r2);
3200 } 3219 }
3201 break; 3220 break;
3202 case NAMED_PROPERTY: { 3221 case NAMED_PROPERTY: {
3222 __ mov(StoreDescriptor::NameRegister(),
3223 Operand(prop->key()->AsLiteral()->value()));
3203 PopOperand(StoreDescriptor::ReceiverRegister()); 3224 PopOperand(StoreDescriptor::ReceiverRegister());
3204 CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value()); 3225 EmitLoadStoreICSlot(expr->CountSlot());
3226 CallStoreIC();
3205 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 3227 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
3206 if (expr->is_postfix()) { 3228 if (expr->is_postfix()) {
3207 if (!context()->IsEffect()) { 3229 if (!context()->IsEffect()) {
3208 context()->PlugTOS(); 3230 context()->PlugTOS();
3209 } 3231 }
3210 } else { 3232 } else {
3211 context()->Plug(r2); 3233 context()->Plug(r2);
3212 } 3234 }
3213 break; 3235 break;
3214 } 3236 }
(...skipping 17 matching lines...) Expand all
3232 context()->PlugTOS(); 3254 context()->PlugTOS();
3233 } 3255 }
3234 } else { 3256 } else {
3235 context()->Plug(r2); 3257 context()->Plug(r2);
3236 } 3258 }
3237 break; 3259 break;
3238 } 3260 }
3239 case KEYED_PROPERTY: { 3261 case KEYED_PROPERTY: {
3240 PopOperands(StoreDescriptor::ReceiverRegister(), 3262 PopOperands(StoreDescriptor::ReceiverRegister(),
3241 StoreDescriptor::NameRegister()); 3263 StoreDescriptor::NameRegister());
3242 CallKeyedStoreIC(expr->CountSlot()); 3264 EmitLoadStoreICSlot(expr->CountSlot());
3265 CallKeyedStoreIC();
3243 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 3266 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
3244 if (expr->is_postfix()) { 3267 if (expr->is_postfix()) {
3245 if (!context()->IsEffect()) { 3268 if (!context()->IsEffect()) {
3246 context()->PlugTOS(); 3269 context()->PlugTOS();
3247 } 3270 }
3248 } else { 3271 } else {
3249 context()->Plug(r2); 3272 context()->Plug(r2);
3250 } 3273 }
3251 break; 3274 break;
3252 } 3275 }
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
3603 DCHECK(kOSRBranchInstruction == br_instr); 3626 DCHECK(kOSRBranchInstruction == br_instr);
3604 3627
3605 DCHECK(interrupt_address == 3628 DCHECK(interrupt_address ==
3606 isolate->builtins()->OnStackReplacement()->entry()); 3629 isolate->builtins()->OnStackReplacement()->entry());
3607 return ON_STACK_REPLACEMENT; 3630 return ON_STACK_REPLACEMENT;
3608 } 3631 }
3609 3632
3610 } // namespace internal 3633 } // namespace internal
3611 } // namespace v8 3634 } // namespace v8
3612 #endif // V8_TARGET_ARCH_S390 3635 #endif // V8_TARGET_ARCH_S390
OLDNEW
« no previous file with comments | « src/full-codegen/ppc/full-codegen-ppc.cc ('k') | src/full-codegen/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698