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