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

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

Issue 2363123002: Revert of [fullcodegen] Refactor code that calls store ICs. (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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_PPC 5 #if V8_TARGET_ARCH_PPC
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 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS); 1126 PrepareForBailoutForId(stmt->ExitId(), BailoutState::NO_REGISTERS);
1127 __ bind(&exit); 1127 __ bind(&exit);
1128 decrement_loop_depth(); 1128 decrement_loop_depth();
1129 } 1129 }
1130 1130
1131 1131
1132 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, 1132 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
1133 FeedbackVectorSlot slot) { 1133 FeedbackVectorSlot slot) {
1134 DCHECK(NeedsHomeObject(initializer)); 1134 DCHECK(NeedsHomeObject(initializer));
1135 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1135 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1136 __ mov(StoreDescriptor::NameRegister(),
1137 Operand(isolate()->factory()->home_object_symbol()));
1136 __ LoadP(StoreDescriptor::ValueRegister(), 1138 __ LoadP(StoreDescriptor::ValueRegister(),
1137 MemOperand(sp, offset * kPointerSize)); 1139 MemOperand(sp, offset * kPointerSize));
1138 CallStoreIC(slot, isolate()->factory()->home_object_symbol()); 1140 EmitLoadStoreICSlot(slot);
1141 CallStoreIC();
1139 } 1142 }
1140 1143
1141 1144
1142 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, 1145 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
1143 int offset, 1146 int offset,
1144 FeedbackVectorSlot slot) { 1147 FeedbackVectorSlot slot) {
1145 DCHECK(NeedsHomeObject(initializer)); 1148 DCHECK(NeedsHomeObject(initializer));
1146 __ Move(StoreDescriptor::ReceiverRegister(), r3); 1149 __ Move(StoreDescriptor::ReceiverRegister(), r3);
1150 __ mov(StoreDescriptor::NameRegister(),
1151 Operand(isolate()->factory()->home_object_symbol()));
1147 __ LoadP(StoreDescriptor::ValueRegister(), 1152 __ LoadP(StoreDescriptor::ValueRegister(),
1148 MemOperand(sp, offset * kPointerSize)); 1153 MemOperand(sp, offset * kPointerSize));
1149 CallStoreIC(slot, isolate()->factory()->home_object_symbol()); 1154 EmitLoadStoreICSlot(slot);
1155 CallStoreIC();
1150 } 1156 }
1151 1157
1152 1158
1153 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, 1159 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
1154 TypeofMode typeof_mode, 1160 TypeofMode typeof_mode,
1155 Label* slow) { 1161 Label* slow) {
1156 Register current = cp; 1162 Register current = cp;
1157 Register next = r4; 1163 Register next = r4;
1158 Register temp = r5; 1164 Register temp = r5;
1159 1165
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); 1380 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value()));
1375 // Fall through. 1381 // Fall through.
1376 case ObjectLiteral::Property::COMPUTED: 1382 case ObjectLiteral::Property::COMPUTED:
1377 // It is safe to use [[Put]] here because the boilerplate already 1383 // It is safe to use [[Put]] here because the boilerplate already
1378 // contains computed properties with an uninitialized value. 1384 // contains computed properties with an uninitialized value.
1379 if (key->IsStringLiteral()) { 1385 if (key->IsStringLiteral()) {
1380 DCHECK(key->IsPropertyName()); 1386 DCHECK(key->IsPropertyName());
1381 if (property->emit_store()) { 1387 if (property->emit_store()) {
1382 VisitForAccumulatorValue(value); 1388 VisitForAccumulatorValue(value);
1383 DCHECK(StoreDescriptor::ValueRegister().is(r3)); 1389 DCHECK(StoreDescriptor::ValueRegister().is(r3));
1390 __ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
1384 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1391 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1385 CallStoreIC(property->GetSlot(0), key->value()); 1392 EmitLoadStoreICSlot(property->GetSlot(0));
1393 CallStoreIC();
1386 PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); 1394 PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
1387 1395
1388 if (NeedsHomeObject(value)) { 1396 if (NeedsHomeObject(value)) {
1389 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); 1397 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1));
1390 } 1398 }
1391 } else { 1399 } else {
1392 VisitForEffect(value); 1400 VisitForEffect(value);
1393 } 1401 }
1394 break; 1402 break;
1395 } 1403 }
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 1579
1572 if (!result_saved) { 1580 if (!result_saved) {
1573 PushOperand(r3); 1581 PushOperand(r3);
1574 result_saved = true; 1582 result_saved = true;
1575 } 1583 }
1576 VisitForAccumulatorValue(subexpr); 1584 VisitForAccumulatorValue(subexpr);
1577 1585
1578 __ LoadSmiLiteral(StoreDescriptor::NameRegister(), 1586 __ LoadSmiLiteral(StoreDescriptor::NameRegister(),
1579 Smi::FromInt(array_index)); 1587 Smi::FromInt(array_index));
1580 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1588 __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1581 CallKeyedStoreIC(expr->LiteralFeedbackSlot()); 1589 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot());
1590 CallKeyedStoreIC();
1582 1591
1583 PrepareForBailoutForId(expr->GetIdForElement(array_index), 1592 PrepareForBailoutForId(expr->GetIdForElement(array_index),
1584 BailoutState::NO_REGISTERS); 1593 BailoutState::NO_REGISTERS);
1585 } 1594 }
1586 1595
1587 if (result_saved) { 1596 if (result_saved) {
1588 context()->PlugTOS(); 1597 context()->PlugTOS();
1589 } else { 1598 } else {
1590 context()->Plug(r3); 1599 context()->Plug(r3);
1591 } 1600 }
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 Variable* var = expr->AsVariableProxy()->var(); 2056 Variable* var = expr->AsVariableProxy()->var();
2048 EffectContext context(this); 2057 EffectContext context(this);
2049 EmitVariableAssignment(var, Token::ASSIGN, slot); 2058 EmitVariableAssignment(var, Token::ASSIGN, slot);
2050 break; 2059 break;
2051 } 2060 }
2052 case NAMED_PROPERTY: { 2061 case NAMED_PROPERTY: {
2053 PushOperand(r3); // Preserve value. 2062 PushOperand(r3); // Preserve value.
2054 VisitForAccumulatorValue(prop->obj()); 2063 VisitForAccumulatorValue(prop->obj());
2055 __ Move(StoreDescriptor::ReceiverRegister(), r3); 2064 __ Move(StoreDescriptor::ReceiverRegister(), r3);
2056 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. 2065 PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
2057 CallStoreIC(slot, prop->key()->AsLiteral()->value()); 2066 __ mov(StoreDescriptor::NameRegister(),
2067 Operand(prop->key()->AsLiteral()->value()));
2068 EmitLoadStoreICSlot(slot);
2069 CallStoreIC();
2058 break; 2070 break;
2059 } 2071 }
2060 case NAMED_SUPER_PROPERTY: { 2072 case NAMED_SUPER_PROPERTY: {
2061 PushOperand(r3); 2073 PushOperand(r3);
2062 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2074 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2063 VisitForAccumulatorValue( 2075 VisitForAccumulatorValue(
2064 prop->obj()->AsSuperPropertyReference()->home_object()); 2076 prop->obj()->AsSuperPropertyReference()->home_object());
2065 // stack: value, this; r3: home_object 2077 // stack: value, this; r3: home_object
2066 Register scratch = r5; 2078 Register scratch = r5;
2067 Register scratch2 = r6; 2079 Register scratch2 = r6;
(...skipping 26 matching lines...) Expand all
2094 EmitKeyedSuperPropertyStore(prop); 2106 EmitKeyedSuperPropertyStore(prop);
2095 break; 2107 break;
2096 } 2108 }
2097 case KEYED_PROPERTY: { 2109 case KEYED_PROPERTY: {
2098 PushOperand(r3); // Preserve value. 2110 PushOperand(r3); // Preserve value.
2099 VisitForStackValue(prop->obj()); 2111 VisitForStackValue(prop->obj());
2100 VisitForAccumulatorValue(prop->key()); 2112 VisitForAccumulatorValue(prop->key());
2101 __ Move(StoreDescriptor::NameRegister(), r3); 2113 __ Move(StoreDescriptor::NameRegister(), r3);
2102 PopOperands(StoreDescriptor::ValueRegister(), 2114 PopOperands(StoreDescriptor::ValueRegister(),
2103 StoreDescriptor::ReceiverRegister()); 2115 StoreDescriptor::ReceiverRegister());
2104 CallKeyedStoreIC(slot); 2116 EmitLoadStoreICSlot(slot);
2117 CallKeyedStoreIC();
2105 break; 2118 break;
2106 } 2119 }
2107 } 2120 }
2108 context()->Plug(r3); 2121 context()->Plug(r3);
2109 } 2122 }
2110 2123
2111 2124
2112 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 2125 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
2113 Variable* var, MemOperand location) { 2126 Variable* var, MemOperand location) {
2114 __ StoreP(result_register(), location, r0); 2127 __ StoreP(result_register(), location, r0);
2115 if (var->IsContextSlot()) { 2128 if (var->IsContextSlot()) {
2116 // RecordWrite may destroy all its register arguments. 2129 // RecordWrite may destroy all its register arguments.
2117 __ mr(r6, result_register()); 2130 __ mr(r6, result_register());
2118 int offset = Context::SlotOffset(var->index()); 2131 int offset = Context::SlotOffset(var->index());
2119 __ RecordWriteContextSlot(r4, offset, r6, r5, kLRHasBeenSaved, 2132 __ RecordWriteContextSlot(r4, offset, r6, r5, kLRHasBeenSaved,
2120 kDontSaveFPRegs); 2133 kDontSaveFPRegs);
2121 } 2134 }
2122 } 2135 }
2123 2136
2124 2137
2125 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, 2138 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
2126 FeedbackVectorSlot slot) { 2139 FeedbackVectorSlot slot) {
2127 if (var->IsUnallocated()) { 2140 if (var->IsUnallocated()) {
2128 // Global var, const, or let. 2141 // Global var, const, or let.
2142 __ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
2129 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); 2143 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
2130 CallStoreIC(slot, var->name()); 2144 EmitLoadStoreICSlot(slot);
2145 CallStoreIC();
2131 2146
2132 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { 2147 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
2133 DCHECK(!var->IsLookupSlot()); 2148 DCHECK(!var->IsLookupSlot());
2134 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); 2149 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
2135 MemOperand location = VarOperand(var, r4); 2150 MemOperand location = VarOperand(var, r4);
2136 // Perform an initialization check for lexically declared variables. 2151 // Perform an initialization check for lexically declared variables.
2137 if (var->binding_needs_init()) { 2152 if (var->binding_needs_init()) {
2138 Label assign; 2153 Label assign;
2139 __ LoadP(r6, location); 2154 __ LoadP(r6, location);
2140 __ CompareRoot(r6, Heap::kTheHoleValueRootIndex); 2155 __ CompareRoot(r6, Heap::kTheHoleValueRootIndex);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2188 } 2203 }
2189 } 2204 }
2190 2205
2191 2206
2192 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { 2207 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
2193 // Assignment to a property, using a named store IC. 2208 // Assignment to a property, using a named store IC.
2194 Property* prop = expr->target()->AsProperty(); 2209 Property* prop = expr->target()->AsProperty();
2195 DCHECK(prop != NULL); 2210 DCHECK(prop != NULL);
2196 DCHECK(prop->key()->IsLiteral()); 2211 DCHECK(prop->key()->IsLiteral());
2197 2212
2213 __ mov(StoreDescriptor::NameRegister(),
2214 Operand(prop->key()->AsLiteral()->value()));
2198 PopOperand(StoreDescriptor::ReceiverRegister()); 2215 PopOperand(StoreDescriptor::ReceiverRegister());
2199 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value()); 2216 EmitLoadStoreICSlot(expr->AssignmentSlot());
2217 CallStoreIC();
2200 2218
2201 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2219 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2202 context()->Plug(r3); 2220 context()->Plug(r3);
2203 } 2221 }
2204 2222
2205 2223
2206 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { 2224 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
2207 // Assignment to named property of super. 2225 // Assignment to named property of super.
2208 // r3 : value 2226 // r3 : value
2209 // stack : receiver ('this'), home_object 2227 // stack : receiver ('this'), home_object
(...skipping 21 matching lines...) Expand all
2231 : Runtime::kStoreKeyedToSuper_Sloppy)); 2249 : Runtime::kStoreKeyedToSuper_Sloppy));
2232 } 2250 }
2233 2251
2234 2252
2235 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 2253 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2236 // Assignment to a property, using a keyed store IC. 2254 // Assignment to a property, using a keyed store IC.
2237 PopOperands(StoreDescriptor::ReceiverRegister(), 2255 PopOperands(StoreDescriptor::ReceiverRegister(),
2238 StoreDescriptor::NameRegister()); 2256 StoreDescriptor::NameRegister());
2239 DCHECK(StoreDescriptor::ValueRegister().is(r3)); 2257 DCHECK(StoreDescriptor::ValueRegister().is(r3));
2240 2258
2241 CallKeyedStoreIC(expr->AssignmentSlot()); 2259 EmitLoadStoreICSlot(expr->AssignmentSlot());
2260 CallKeyedStoreIC();
2242 2261
2243 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2262 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2244 context()->Plug(r3); 2263 context()->Plug(r3);
2245 } 2264 }
2246 2265
2247 2266
2248 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { 2267 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) {
2249 ic_total_count_++; 2268 ic_total_count_++;
2250 __ Call(code, RelocInfo::CODE_TARGET, ast_id); 2269 __ Call(code, RelocInfo::CODE_TARGET, ast_id);
2251 } 2270 }
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after
3275 } 3294 }
3276 } else { 3295 } else {
3277 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), 3296 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
3278 Token::ASSIGN, expr->CountSlot()); 3297 Token::ASSIGN, expr->CountSlot());
3279 PrepareForBailoutForId(expr->AssignmentId(), 3298 PrepareForBailoutForId(expr->AssignmentId(),
3280 BailoutState::TOS_REGISTER); 3299 BailoutState::TOS_REGISTER);
3281 context()->Plug(r3); 3300 context()->Plug(r3);
3282 } 3301 }
3283 break; 3302 break;
3284 case NAMED_PROPERTY: { 3303 case NAMED_PROPERTY: {
3304 __ mov(StoreDescriptor::NameRegister(),
3305 Operand(prop->key()->AsLiteral()->value()));
3285 PopOperand(StoreDescriptor::ReceiverRegister()); 3306 PopOperand(StoreDescriptor::ReceiverRegister());
3286 CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value()); 3307 EmitLoadStoreICSlot(expr->CountSlot());
3308 CallStoreIC();
3287 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 3309 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
3288 if (expr->is_postfix()) { 3310 if (expr->is_postfix()) {
3289 if (!context()->IsEffect()) { 3311 if (!context()->IsEffect()) {
3290 context()->PlugTOS(); 3312 context()->PlugTOS();
3291 } 3313 }
3292 } else { 3314 } else {
3293 context()->Plug(r3); 3315 context()->Plug(r3);
3294 } 3316 }
3295 break; 3317 break;
3296 } 3318 }
(...skipping 17 matching lines...) Expand all
3314 context()->PlugTOS(); 3336 context()->PlugTOS();
3315 } 3337 }
3316 } else { 3338 } else {
3317 context()->Plug(r3); 3339 context()->Plug(r3);
3318 } 3340 }
3319 break; 3341 break;
3320 } 3342 }
3321 case KEYED_PROPERTY: { 3343 case KEYED_PROPERTY: {
3322 PopOperands(StoreDescriptor::ReceiverRegister(), 3344 PopOperands(StoreDescriptor::ReceiverRegister(),
3323 StoreDescriptor::NameRegister()); 3345 StoreDescriptor::NameRegister());
3324 CallKeyedStoreIC(expr->CountSlot()); 3346 EmitLoadStoreICSlot(expr->CountSlot());
3347 CallKeyedStoreIC();
3325 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 3348 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
3326 if (expr->is_postfix()) { 3349 if (expr->is_postfix()) {
3327 if (!context()->IsEffect()) { 3350 if (!context()->IsEffect()) {
3328 context()->PlugTOS(); 3351 context()->PlugTOS();
3329 } 3352 }
3330 } else { 3353 } else {
3331 context()->Plug(r3); 3354 context()->Plug(r3);
3332 } 3355 }
3333 break; 3356 break;
3334 } 3357 }
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
3692 3715
3693 DCHECK(Assembler::IsCrSet(Assembler::instr_at(cmp_address))); 3716 DCHECK(Assembler::IsCrSet(Assembler::instr_at(cmp_address)));
3694 3717
3695 DCHECK(interrupt_address == 3718 DCHECK(interrupt_address ==
3696 isolate->builtins()->OnStackReplacement()->entry()); 3719 isolate->builtins()->OnStackReplacement()->entry());
3697 return ON_STACK_REPLACEMENT; 3720 return ON_STACK_REPLACEMENT;
3698 } 3721 }
3699 } // namespace internal 3722 } // namespace internal
3700 } // namespace v8 3723 } // namespace v8
3701 #endif // V8_TARGET_ARCH_PPC 3724 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/full-codegen/mips64/full-codegen-mips64.cc ('k') | src/full-codegen/s390/full-codegen-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698