OLD | NEW |
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/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/debug/debug.h" | 10 #include "src/debug/debug.h" |
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1228 } | 1228 } |
1229 | 1229 |
1230 | 1230 |
1231 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, | 1231 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, |
1232 FeedbackVectorSlot slot) { | 1232 FeedbackVectorSlot slot) { |
1233 DCHECK(NeedsHomeObject(initializer)); | 1233 DCHECK(NeedsHomeObject(initializer)); |
1234 __ Peek(StoreDescriptor::ReceiverRegister(), 0); | 1234 __ Peek(StoreDescriptor::ReceiverRegister(), 0); |
1235 __ Mov(StoreDescriptor::NameRegister(), | 1235 __ Mov(StoreDescriptor::NameRegister(), |
1236 Operand(isolate()->factory()->home_object_symbol())); | 1236 Operand(isolate()->factory()->home_object_symbol())); |
1237 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); | 1237 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); |
1238 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1238 EmitLoadStoreICSlot(slot); |
1239 CallStoreIC(); | 1239 CallStoreIC(); |
1240 } | 1240 } |
1241 | 1241 |
1242 | 1242 |
1243 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, | 1243 void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, |
1244 int offset, | 1244 int offset, |
1245 FeedbackVectorSlot slot) { | 1245 FeedbackVectorSlot slot) { |
1246 DCHECK(NeedsHomeObject(initializer)); | 1246 DCHECK(NeedsHomeObject(initializer)); |
1247 __ Move(StoreDescriptor::ReceiverRegister(), x0); | 1247 __ Move(StoreDescriptor::ReceiverRegister(), x0); |
1248 __ Mov(StoreDescriptor::NameRegister(), | 1248 __ Mov(StoreDescriptor::NameRegister(), |
1249 Operand(isolate()->factory()->home_object_symbol())); | 1249 Operand(isolate()->factory()->home_object_symbol())); |
1250 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); | 1250 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); |
1251 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 1251 EmitLoadStoreICSlot(slot); |
1252 CallStoreIC(); | 1252 CallStoreIC(); |
1253 } | 1253 } |
1254 | 1254 |
1255 | 1255 |
1256 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, | 1256 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
1257 TypeofMode typeof_mode, | 1257 TypeofMode typeof_mode, |
1258 Label* slow) { | 1258 Label* slow) { |
1259 Register current = cp; | 1259 Register current = cp; |
1260 Register next = x10; | 1260 Register next = x10; |
1261 Register temp = x11; | 1261 Register temp = x11; |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 // Fall through. | 1556 // Fall through. |
1557 case ObjectLiteral::Property::COMPUTED: | 1557 case ObjectLiteral::Property::COMPUTED: |
1558 // It is safe to use [[Put]] here because the boilerplate already | 1558 // It is safe to use [[Put]] here because the boilerplate already |
1559 // contains computed properties with an uninitialized value. | 1559 // contains computed properties with an uninitialized value. |
1560 if (key->value()->IsInternalizedString()) { | 1560 if (key->value()->IsInternalizedString()) { |
1561 if (property->emit_store()) { | 1561 if (property->emit_store()) { |
1562 VisitForAccumulatorValue(value); | 1562 VisitForAccumulatorValue(value); |
1563 DCHECK(StoreDescriptor::ValueRegister().is(x0)); | 1563 DCHECK(StoreDescriptor::ValueRegister().is(x0)); |
1564 __ Mov(StoreDescriptor::NameRegister(), Operand(key->value())); | 1564 __ Mov(StoreDescriptor::NameRegister(), Operand(key->value())); |
1565 __ Peek(StoreDescriptor::ReceiverRegister(), 0); | 1565 __ Peek(StoreDescriptor::ReceiverRegister(), 0); |
1566 if (FLAG_vector_stores) { | 1566 EmitLoadStoreICSlot(property->GetSlot(0)); |
1567 EmitLoadStoreICSlot(property->GetSlot(0)); | 1567 CallStoreIC(); |
1568 CallStoreIC(); | |
1569 } else { | |
1570 CallStoreIC(key->LiteralFeedbackId()); | |
1571 } | |
1572 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1568 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
1573 | 1569 |
1574 if (NeedsHomeObject(value)) { | 1570 if (NeedsHomeObject(value)) { |
1575 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); | 1571 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); |
1576 } | 1572 } |
1577 } else { | 1573 } else { |
1578 VisitForEffect(value); | 1574 VisitForEffect(value); |
1579 } | 1575 } |
1580 break; | 1576 break; |
1581 } | 1577 } |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1753 // is already set in the cloned array. | 1749 // is already set in the cloned array. |
1754 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1750 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
1755 | 1751 |
1756 if (!result_saved) { | 1752 if (!result_saved) { |
1757 __ Mov(x1, Smi::FromInt(expr->literal_index())); | 1753 __ Mov(x1, Smi::FromInt(expr->literal_index())); |
1758 __ Push(x0, x1); | 1754 __ Push(x0, x1); |
1759 result_saved = true; | 1755 result_saved = true; |
1760 } | 1756 } |
1761 VisitForAccumulatorValue(subexpr); | 1757 VisitForAccumulatorValue(subexpr); |
1762 | 1758 |
1763 if (FLAG_vector_stores) { | 1759 __ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); |
1764 __ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); | 1760 __ Peek(StoreDescriptor::ReceiverRegister(), kPointerSize); |
1765 __ Peek(StoreDescriptor::ReceiverRegister(), kPointerSize); | 1761 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); |
1766 EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); | 1762 Handle<Code> ic = |
1767 Handle<Code> ic = | 1763 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
1768 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 1764 CallIC(ic); |
1769 CallIC(ic); | |
1770 } else if (has_fast_elements) { | |
1771 int offset = FixedArray::kHeaderSize + (array_index * kPointerSize); | |
1772 __ Peek(x6, kPointerSize); // Copy of array literal. | |
1773 __ Ldr(x1, FieldMemOperand(x6, JSObject::kElementsOffset)); | |
1774 __ Str(result_register(), FieldMemOperand(x1, offset)); | |
1775 // Update the write barrier for the array store. | |
1776 __ RecordWriteField(x1, offset, result_register(), x10, | |
1777 kLRHasBeenSaved, kDontSaveFPRegs, | |
1778 EMIT_REMEMBERED_SET, INLINE_SMI_CHECK); | |
1779 } else { | |
1780 __ Mov(x3, Smi::FromInt(array_index)); | |
1781 StoreArrayLiteralElementStub stub(isolate()); | |
1782 __ CallStub(&stub); | |
1783 } | |
1784 | 1765 |
1785 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); | 1766 PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); |
1786 } | 1767 } |
1787 | 1768 |
1788 // In case the array literal contains spread expressions it has two parts. The | 1769 // In case the array literal contains spread expressions it has two parts. The |
1789 // first part is the "static" array which has a literal index is handled | 1770 // first part is the "static" array which has a literal index is handled |
1790 // above. The second part is the part after the first spread expression | 1771 // above. The second part is the part after the first spread expression |
1791 // (inclusive) and these elements gets appended to the array. Note that the | 1772 // (inclusive) and these elements gets appended to the array. Note that the |
1792 // number elements an iterable produces is unknown ahead of time. | 1773 // number elements an iterable produces is unknown ahead of time. |
1793 if (array_index < length && result_saved) { | 1774 if (array_index < length && result_saved) { |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2202 } | 2183 } |
2203 case NAMED_PROPERTY: { | 2184 case NAMED_PROPERTY: { |
2204 __ Push(x0); // Preserve value. | 2185 __ Push(x0); // Preserve value. |
2205 VisitForAccumulatorValue(prop->obj()); | 2186 VisitForAccumulatorValue(prop->obj()); |
2206 // TODO(all): We could introduce a VisitForRegValue(reg, expr) to avoid | 2187 // TODO(all): We could introduce a VisitForRegValue(reg, expr) to avoid |
2207 // this copy. | 2188 // this copy. |
2208 __ Mov(StoreDescriptor::ReceiverRegister(), x0); | 2189 __ Mov(StoreDescriptor::ReceiverRegister(), x0); |
2209 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2190 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
2210 __ Mov(StoreDescriptor::NameRegister(), | 2191 __ Mov(StoreDescriptor::NameRegister(), |
2211 Operand(prop->key()->AsLiteral()->value())); | 2192 Operand(prop->key()->AsLiteral()->value())); |
2212 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2193 EmitLoadStoreICSlot(slot); |
2213 CallStoreIC(); | 2194 CallStoreIC(); |
2214 break; | 2195 break; |
2215 } | 2196 } |
2216 case NAMED_SUPER_PROPERTY: { | 2197 case NAMED_SUPER_PROPERTY: { |
2217 __ Push(x0); | 2198 __ Push(x0); |
2218 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 2199 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
2219 VisitForAccumulatorValue( | 2200 VisitForAccumulatorValue( |
2220 prop->obj()->AsSuperPropertyReference()->home_object()); | 2201 prop->obj()->AsSuperPropertyReference()->home_object()); |
2221 // stack: value, this; x0: home_object | 2202 // stack: value, this; x0: home_object |
2222 Register scratch = x10; | 2203 Register scratch = x10; |
(...skipping 27 matching lines...) Expand all Loading... |
2250 EmitKeyedSuperPropertyStore(prop); | 2231 EmitKeyedSuperPropertyStore(prop); |
2251 break; | 2232 break; |
2252 } | 2233 } |
2253 case KEYED_PROPERTY: { | 2234 case KEYED_PROPERTY: { |
2254 __ Push(x0); // Preserve value. | 2235 __ Push(x0); // Preserve value. |
2255 VisitForStackValue(prop->obj()); | 2236 VisitForStackValue(prop->obj()); |
2256 VisitForAccumulatorValue(prop->key()); | 2237 VisitForAccumulatorValue(prop->key()); |
2257 __ Mov(StoreDescriptor::NameRegister(), x0); | 2238 __ Mov(StoreDescriptor::NameRegister(), x0); |
2258 __ Pop(StoreDescriptor::ReceiverRegister(), | 2239 __ Pop(StoreDescriptor::ReceiverRegister(), |
2259 StoreDescriptor::ValueRegister()); | 2240 StoreDescriptor::ValueRegister()); |
2260 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2241 EmitLoadStoreICSlot(slot); |
2261 Handle<Code> ic = | 2242 Handle<Code> ic = |
2262 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2243 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
2263 CallIC(ic); | 2244 CallIC(ic); |
2264 break; | 2245 break; |
2265 } | 2246 } |
2266 } | 2247 } |
2267 context()->Plug(x0); | 2248 context()->Plug(x0); |
2268 } | 2249 } |
2269 | 2250 |
2270 | 2251 |
(...skipping 10 matching lines...) Expand all Loading... |
2281 } | 2262 } |
2282 | 2263 |
2283 | 2264 |
2284 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, | 2265 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
2285 FeedbackVectorSlot slot) { | 2266 FeedbackVectorSlot slot) { |
2286 ASM_LOCATION("FullCodeGenerator::EmitVariableAssignment"); | 2267 ASM_LOCATION("FullCodeGenerator::EmitVariableAssignment"); |
2287 if (var->IsUnallocated()) { | 2268 if (var->IsUnallocated()) { |
2288 // Global var, const, or let. | 2269 // Global var, const, or let. |
2289 __ Mov(StoreDescriptor::NameRegister(), Operand(var->name())); | 2270 __ Mov(StoreDescriptor::NameRegister(), Operand(var->name())); |
2290 __ Ldr(StoreDescriptor::ReceiverRegister(), GlobalObjectMemOperand()); | 2271 __ Ldr(StoreDescriptor::ReceiverRegister(), GlobalObjectMemOperand()); |
2291 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2272 EmitLoadStoreICSlot(slot); |
2292 CallStoreIC(); | 2273 CallStoreIC(); |
2293 | 2274 |
2294 } else if (var->mode() == LET && op != Token::INIT) { | 2275 } else if (var->mode() == LET && op != Token::INIT) { |
2295 // Non-initializing assignment to let variable needs a write barrier. | 2276 // Non-initializing assignment to let variable needs a write barrier. |
2296 DCHECK(!var->IsLookupSlot()); | 2277 DCHECK(!var->IsLookupSlot()); |
2297 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2278 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
2298 Label assign; | 2279 Label assign; |
2299 MemOperand location = VarOperand(var, x1); | 2280 MemOperand location = VarOperand(var, x1); |
2300 __ Ldr(x10, location); | 2281 __ Ldr(x10, location); |
2301 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &assign); | 2282 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &assign); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2388 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2369 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
2389 ASM_LOCATION("FullCodeGenerator::EmitNamedPropertyAssignment"); | 2370 ASM_LOCATION("FullCodeGenerator::EmitNamedPropertyAssignment"); |
2390 // Assignment to a property, using a named store IC. | 2371 // Assignment to a property, using a named store IC. |
2391 Property* prop = expr->target()->AsProperty(); | 2372 Property* prop = expr->target()->AsProperty(); |
2392 DCHECK(prop != NULL); | 2373 DCHECK(prop != NULL); |
2393 DCHECK(prop->key()->IsLiteral()); | 2374 DCHECK(prop->key()->IsLiteral()); |
2394 | 2375 |
2395 __ Mov(StoreDescriptor::NameRegister(), | 2376 __ Mov(StoreDescriptor::NameRegister(), |
2396 Operand(prop->key()->AsLiteral()->value())); | 2377 Operand(prop->key()->AsLiteral()->value())); |
2397 __ Pop(StoreDescriptor::ReceiverRegister()); | 2378 __ Pop(StoreDescriptor::ReceiverRegister()); |
2398 if (FLAG_vector_stores) { | 2379 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
2399 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2380 CallStoreIC(); |
2400 CallStoreIC(); | |
2401 } else { | |
2402 CallStoreIC(expr->AssignmentFeedbackId()); | |
2403 } | |
2404 | 2381 |
2405 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2382 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2406 context()->Plug(x0); | 2383 context()->Plug(x0); |
2407 } | 2384 } |
2408 | 2385 |
2409 | 2386 |
2410 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2387 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
2411 // Assignment to named property of super. | 2388 // Assignment to named property of super. |
2412 // x0 : value | 2389 // x0 : value |
2413 // stack : receiver ('this'), home_object | 2390 // stack : receiver ('this'), home_object |
(...skipping 26 matching lines...) Expand all Loading... |
2440 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2417 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2441 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment"); | 2418 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment"); |
2442 // Assignment to a property, using a keyed store IC. | 2419 // Assignment to a property, using a keyed store IC. |
2443 | 2420 |
2444 // TODO(all): Could we pass this in registers rather than on the stack? | 2421 // TODO(all): Could we pass this in registers rather than on the stack? |
2445 __ Pop(StoreDescriptor::NameRegister(), StoreDescriptor::ReceiverRegister()); | 2422 __ Pop(StoreDescriptor::NameRegister(), StoreDescriptor::ReceiverRegister()); |
2446 DCHECK(StoreDescriptor::ValueRegister().is(x0)); | 2423 DCHECK(StoreDescriptor::ValueRegister().is(x0)); |
2447 | 2424 |
2448 Handle<Code> ic = | 2425 Handle<Code> ic = |
2449 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 2426 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
2450 if (FLAG_vector_stores) { | 2427 EmitLoadStoreICSlot(expr->AssignmentSlot()); |
2451 EmitLoadStoreICSlot(expr->AssignmentSlot()); | 2428 CallIC(ic); |
2452 CallIC(ic); | |
2453 } else { | |
2454 CallIC(ic, expr->AssignmentFeedbackId()); | |
2455 } | |
2456 | 2429 |
2457 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2430 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2458 context()->Plug(x0); | 2431 context()->Plug(x0); |
2459 } | 2432 } |
2460 | 2433 |
2461 | 2434 |
2462 void FullCodeGenerator::VisitProperty(Property* expr) { | 2435 void FullCodeGenerator::VisitProperty(Property* expr) { |
2463 Comment cmnt(masm_, "[ Property"); | 2436 Comment cmnt(masm_, "[ Property"); |
2464 SetExpressionPosition(expr); | 2437 SetExpressionPosition(expr); |
2465 Expression* key = expr->key(); | 2438 Expression* key = expr->key(); |
(...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4292 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4265 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
4293 Token::ASSIGN, expr->CountSlot()); | 4266 Token::ASSIGN, expr->CountSlot()); |
4294 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4267 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4295 context()->Plug(x0); | 4268 context()->Plug(x0); |
4296 } | 4269 } |
4297 break; | 4270 break; |
4298 case NAMED_PROPERTY: { | 4271 case NAMED_PROPERTY: { |
4299 __ Mov(StoreDescriptor::NameRegister(), | 4272 __ Mov(StoreDescriptor::NameRegister(), |
4300 Operand(prop->key()->AsLiteral()->value())); | 4273 Operand(prop->key()->AsLiteral()->value())); |
4301 __ Pop(StoreDescriptor::ReceiverRegister()); | 4274 __ Pop(StoreDescriptor::ReceiverRegister()); |
4302 if (FLAG_vector_stores) { | 4275 EmitLoadStoreICSlot(expr->CountSlot()); |
4303 EmitLoadStoreICSlot(expr->CountSlot()); | 4276 CallStoreIC(); |
4304 CallStoreIC(); | |
4305 } else { | |
4306 CallStoreIC(expr->CountStoreFeedbackId()); | |
4307 } | |
4308 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4277 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4309 if (expr->is_postfix()) { | 4278 if (expr->is_postfix()) { |
4310 if (!context()->IsEffect()) { | 4279 if (!context()->IsEffect()) { |
4311 context()->PlugTOS(); | 4280 context()->PlugTOS(); |
4312 } | 4281 } |
4313 } else { | 4282 } else { |
4314 context()->Plug(x0); | 4283 context()->Plug(x0); |
4315 } | 4284 } |
4316 break; | 4285 break; |
4317 } | 4286 } |
(...skipping 17 matching lines...) Expand all Loading... |
4335 } else { | 4304 } else { |
4336 context()->Plug(x0); | 4305 context()->Plug(x0); |
4337 } | 4306 } |
4338 break; | 4307 break; |
4339 } | 4308 } |
4340 case KEYED_PROPERTY: { | 4309 case KEYED_PROPERTY: { |
4341 __ Pop(StoreDescriptor::NameRegister()); | 4310 __ Pop(StoreDescriptor::NameRegister()); |
4342 __ Pop(StoreDescriptor::ReceiverRegister()); | 4311 __ Pop(StoreDescriptor::ReceiverRegister()); |
4343 Handle<Code> ic = | 4312 Handle<Code> ic = |
4344 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 4313 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
4345 if (FLAG_vector_stores) { | 4314 EmitLoadStoreICSlot(expr->CountSlot()); |
4346 EmitLoadStoreICSlot(expr->CountSlot()); | 4315 CallIC(ic); |
4347 CallIC(ic); | |
4348 } else { | |
4349 CallIC(ic, expr->CountStoreFeedbackId()); | |
4350 } | |
4351 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4316 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4352 if (expr->is_postfix()) { | 4317 if (expr->is_postfix()) { |
4353 if (!context()->IsEffect()) { | 4318 if (!context()->IsEffect()) { |
4354 context()->PlugTOS(); | 4319 context()->PlugTOS(); |
4355 } | 4320 } |
4356 } else { | 4321 } else { |
4357 context()->Plug(x0); | 4322 context()->Plug(x0); |
4358 } | 4323 } |
4359 break; | 4324 break; |
4360 } | 4325 } |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4970 DCHECK(!result_register().is(x10)); | 4935 DCHECK(!result_register().is(x10)); |
4971 ExternalReference pending_message_obj = | 4936 ExternalReference pending_message_obj = |
4972 ExternalReference::address_of_pending_message_obj(isolate()); | 4937 ExternalReference::address_of_pending_message_obj(isolate()); |
4973 __ LoadRoot(x10, Heap::kTheHoleValueRootIndex); | 4938 __ LoadRoot(x10, Heap::kTheHoleValueRootIndex); |
4974 __ Mov(x13, pending_message_obj); | 4939 __ Mov(x13, pending_message_obj); |
4975 __ Str(x10, MemOperand(x13)); | 4940 __ Str(x10, MemOperand(x13)); |
4976 } | 4941 } |
4977 | 4942 |
4978 | 4943 |
4979 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { | 4944 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { |
4980 DCHECK(FLAG_vector_stores && !slot.IsInvalid()); | 4945 DCHECK(!slot.IsInvalid()); |
4981 __ Mov(VectorStoreICTrampolineDescriptor::SlotRegister(), SmiFromSlot(slot)); | 4946 __ Mov(VectorStoreICTrampolineDescriptor::SlotRegister(), SmiFromSlot(slot)); |
4982 } | 4947 } |
4983 | 4948 |
4984 | 4949 |
4985 #undef __ | 4950 #undef __ |
4986 | 4951 |
4987 | 4952 |
4988 void BackEdgeTable::PatchAt(Code* unoptimized_code, | 4953 void BackEdgeTable::PatchAt(Code* unoptimized_code, |
4989 Address pc, | 4954 Address pc, |
4990 BackEdgeState target_state, | 4955 BackEdgeState target_state, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5077 } | 5042 } |
5078 | 5043 |
5079 return INTERRUPT; | 5044 return INTERRUPT; |
5080 } | 5045 } |
5081 | 5046 |
5082 | 5047 |
5083 } // namespace internal | 5048 } // namespace internal |
5084 } // namespace v8 | 5049 } // namespace v8 |
5085 | 5050 |
5086 #endif // V8_TARGET_ARCH_ARM64 | 5051 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |