| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 2014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 if (FLAG_vector_ics) { | 2025 if (FLAG_vector_ics) { |
| 2026 __ Mov(VectorLoadICDescriptor::SlotRegister(), | 2026 __ Mov(VectorLoadICDescriptor::SlotRegister(), |
| 2027 Smi::FromInt(prop->PropertyFeedbackSlot())); | 2027 Smi::FromInt(prop->PropertyFeedbackSlot())); |
| 2028 CallIC(ic); | 2028 CallIC(ic); |
| 2029 } else { | 2029 } else { |
| 2030 CallIC(ic, prop->PropertyFeedbackId()); | 2030 CallIC(ic, prop->PropertyFeedbackId()); |
| 2031 } | 2031 } |
| 2032 } | 2032 } |
| 2033 | 2033 |
| 2034 | 2034 |
| 2035 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { |
| 2036 // Stack: receiver, home_object, key. |
| 2037 SetSourcePosition(prop->position()); |
| 2038 |
| 2039 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3); |
| 2040 } |
| 2041 |
| 2042 |
| 2035 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, | 2043 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, |
| 2036 Token::Value op, | 2044 Token::Value op, |
| 2037 OverwriteMode mode, | 2045 OverwriteMode mode, |
| 2038 Expression* left_expr, | 2046 Expression* left_expr, |
| 2039 Expression* right_expr) { | 2047 Expression* right_expr) { |
| 2040 Label done, both_smis, stub_call; | 2048 Label done, both_smis, stub_call; |
| 2041 | 2049 |
| 2042 // Get the arguments. | 2050 // Get the arguments. |
| 2043 Register left = x1; | 2051 Register left = x1; |
| 2044 Register right = x0; | 2052 Register right = x0; |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 EmitNamedPropertyLoad(expr); | 2351 EmitNamedPropertyLoad(expr); |
| 2344 } else { | 2352 } else { |
| 2345 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2353 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2346 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2354 EmitLoadHomeObject(expr->obj()->AsSuperReference()); |
| 2347 __ Push(result_register()); | 2355 __ Push(result_register()); |
| 2348 EmitNamedSuperPropertyLoad(expr); | 2356 EmitNamedSuperPropertyLoad(expr); |
| 2349 } | 2357 } |
| 2350 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2358 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2351 context()->Plug(x0); | 2359 context()->Plug(x0); |
| 2352 } else { | 2360 } else { |
| 2353 VisitForStackValue(expr->obj()); | 2361 if (!expr->IsSuperAccess()) { |
| 2354 VisitForAccumulatorValue(expr->key()); | 2362 VisitForStackValue(expr->obj()); |
| 2355 __ Move(LoadDescriptor::NameRegister(), x0); | 2363 VisitForAccumulatorValue(expr->key()); |
| 2356 __ Pop(LoadDescriptor::ReceiverRegister()); | 2364 __ Move(LoadDescriptor::NameRegister(), x0); |
| 2357 EmitKeyedPropertyLoad(expr); | 2365 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 2366 EmitKeyedPropertyLoad(expr); |
| 2367 } else { |
| 2368 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2369 EmitLoadHomeObject(expr->obj()->AsSuperReference()); |
| 2370 __ Push(result_register()); |
| 2371 VisitForStackValue(expr->key()); |
| 2372 EmitKeyedSuperPropertyLoad(expr); |
| 2373 } |
| 2358 context()->Plug(x0); | 2374 context()->Plug(x0); |
| 2359 } | 2375 } |
| 2360 } | 2376 } |
| 2361 | 2377 |
| 2362 | 2378 |
| 2363 void FullCodeGenerator::CallIC(Handle<Code> code, | 2379 void FullCodeGenerator::CallIC(Handle<Code> code, |
| 2364 TypeFeedbackId ast_id) { | 2380 TypeFeedbackId ast_id) { |
| 2365 ic_total_count_++; | 2381 ic_total_count_++; |
| 2366 // All calls must have a predictable size in full-codegen code to ensure that | 2382 // All calls must have a predictable size in full-codegen code to ensure that |
| 2367 // the debugger can patch them correctly. | 2383 // the debugger can patch them correctly. |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2456 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); | 2472 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); |
| 2457 | 2473 |
| 2458 // Push the target function under the receiver. | 2474 // Push the target function under the receiver. |
| 2459 __ Pop(x10); | 2475 __ Pop(x10); |
| 2460 __ Push(x0, x10); | 2476 __ Push(x0, x10); |
| 2461 | 2477 |
| 2462 EmitCall(expr, CallICState::METHOD); | 2478 EmitCall(expr, CallICState::METHOD); |
| 2463 } | 2479 } |
| 2464 | 2480 |
| 2465 | 2481 |
| 2482 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
| 2483 Expression* callee = expr->expression(); |
| 2484 DCHECK(callee->IsProperty()); |
| 2485 Property* prop = callee->AsProperty(); |
| 2486 DCHECK(prop->IsSuperAccess()); |
| 2487 |
| 2488 SetSourcePosition(prop->position()); |
| 2489 |
| 2490 // Load the function from the receiver. |
| 2491 const Register scratch = x10; |
| 2492 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2493 EmitLoadHomeObject(super_ref); |
| 2494 __ Push(x0); |
| 2495 VisitForAccumulatorValue(super_ref->this_var()); |
| 2496 __ Push(x0); |
| 2497 __ Peek(scratch, kPointerSize); |
| 2498 __ Push(x0, scratch); |
| 2499 VisitForStackValue(prop->key()); |
| 2500 |
| 2501 // Stack here: |
| 2502 // - home_object |
| 2503 // - this (receiver) |
| 2504 // - this (receiver) <-- LoadFromSuper will pop here and below. |
| 2505 // - home_object |
| 2506 // - key |
| 2507 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3); |
| 2508 |
| 2509 // Replace home_object with target function. |
| 2510 __ Poke(x0, kPointerSize); |
| 2511 |
| 2512 // Stack here: |
| 2513 // - target function |
| 2514 // - this (receiver) |
| 2515 EmitCall(expr, CallICState::METHOD); |
| 2516 } |
| 2517 |
| 2518 |
| 2466 void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) { | 2519 void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) { |
| 2467 // Load the arguments. | 2520 // Load the arguments. |
| 2468 ZoneList<Expression*>* args = expr->arguments(); | 2521 ZoneList<Expression*>* args = expr->arguments(); |
| 2469 int arg_count = args->length(); | 2522 int arg_count = args->length(); |
| 2470 { PreservePositionScope scope(masm()->positions_recorder()); | 2523 { PreservePositionScope scope(masm()->positions_recorder()); |
| 2471 for (int i = 0; i < arg_count; i++) { | 2524 for (int i = 0; i < arg_count; i++) { |
| 2472 VisitForStackValue(args->at(i)); | 2525 VisitForStackValue(args->at(i)); |
| 2473 } | 2526 } |
| 2474 } | 2527 } |
| 2475 // Record source position of the IC call. | 2528 // Record source position of the IC call. |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2609 __ Push(x0, x1); | 2662 __ Push(x0, x1); |
| 2610 __ Bind(&call); | 2663 __ Bind(&call); |
| 2611 } | 2664 } |
| 2612 | 2665 |
| 2613 // The receiver is either the global receiver or an object found | 2666 // The receiver is either the global receiver or an object found |
| 2614 // by LoadContextSlot. | 2667 // by LoadContextSlot. |
| 2615 EmitCall(expr); | 2668 EmitCall(expr); |
| 2616 } else if (call_type == Call::PROPERTY_CALL) { | 2669 } else if (call_type == Call::PROPERTY_CALL) { |
| 2617 Property* property = callee->AsProperty(); | 2670 Property* property = callee->AsProperty(); |
| 2618 bool is_named_call = property->key()->IsPropertyName(); | 2671 bool is_named_call = property->key()->IsPropertyName(); |
| 2619 // super.x() is handled in EmitCallWithLoadIC. | 2672 if (property->IsSuperAccess()) { |
| 2620 if (property->IsSuperAccess() && is_named_call) { | 2673 if (is_named_call) { |
| 2621 EmitSuperCallWithLoadIC(expr); | 2674 EmitSuperCallWithLoadIC(expr); |
| 2675 } else { |
| 2676 EmitKeyedSuperCallWithLoadIC(expr); |
| 2677 } |
| 2622 } else { | 2678 } else { |
| 2623 { | 2679 { |
| 2624 PreservePositionScope scope(masm()->positions_recorder()); | 2680 PreservePositionScope scope(masm()->positions_recorder()); |
| 2625 VisitForStackValue(property->obj()); | 2681 VisitForStackValue(property->obj()); |
| 2626 } | 2682 } |
| 2627 if (is_named_call) { | 2683 if (is_named_call) { |
| 2628 EmitCallWithLoadIC(expr); | 2684 EmitCallWithLoadIC(expr); |
| 2629 } else { | 2685 } else { |
| 2630 EmitKeyedCallWithLoadIC(expr, property->key()); | 2686 EmitKeyedCallWithLoadIC(expr, property->key()); |
| 2631 } | 2687 } |
| (...skipping 2439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5071 return previous_; | 5127 return previous_; |
| 5072 } | 5128 } |
| 5073 | 5129 |
| 5074 | 5130 |
| 5075 #undef __ | 5131 #undef __ |
| 5076 | 5132 |
| 5077 | 5133 |
| 5078 } } // namespace v8::internal | 5134 } } // namespace v8::internal |
| 5079 | 5135 |
| 5080 #endif // V8_TARGET_ARCH_ARM64 | 5136 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |