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

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

Issue 637203002: X87: Support for super keyed loads where key is a name. (Closed) Base URL: https://chromium.googlesource.com/external/v8.git@bleeding_edge
Patch Set: Created 6 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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_X87 7 #if V8_TARGET_ARCH_X87
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 2269 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 if (FLAG_vector_ics) { 2280 if (FLAG_vector_ics) {
2281 __ mov(VectorLoadICDescriptor::SlotRegister(), 2281 __ mov(VectorLoadICDescriptor::SlotRegister(),
2282 Immediate(Smi::FromInt(prop->PropertyFeedbackSlot()))); 2282 Immediate(Smi::FromInt(prop->PropertyFeedbackSlot())));
2283 CallIC(ic); 2283 CallIC(ic);
2284 } else { 2284 } else {
2285 CallIC(ic, prop->PropertyFeedbackId()); 2285 CallIC(ic, prop->PropertyFeedbackId());
2286 } 2286 }
2287 } 2287 }
2288 2288
2289 2289
2290 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) {
2291 // Stack: receiver, home_object, key.
2292 SetSourcePosition(prop->position());
2293
2294 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3);
2295 }
2296
2297
2290 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, 2298 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
2291 Token::Value op, 2299 Token::Value op,
2292 OverwriteMode mode, 2300 OverwriteMode mode,
2293 Expression* left, 2301 Expression* left,
2294 Expression* right) { 2302 Expression* right) {
2295 // Do combined smi check of the operands. Left operand is on the 2303 // Do combined smi check of the operands. Left operand is on the
2296 // stack. Right operand is in eax. 2304 // stack. Right operand is in eax.
2297 Label smi_case, done, stub_call; 2305 Label smi_case, done, stub_call;
2298 __ pop(edx); 2306 __ pop(edx);
2299 __ mov(ecx, eax); 2307 __ mov(ecx, eax);
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
2585 EmitNamedPropertyLoad(expr); 2593 EmitNamedPropertyLoad(expr);
2586 } else { 2594 } else {
2587 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2595 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2588 EmitLoadHomeObject(expr->obj()->AsSuperReference()); 2596 EmitLoadHomeObject(expr->obj()->AsSuperReference());
2589 __ push(result_register()); 2597 __ push(result_register());
2590 EmitNamedSuperPropertyLoad(expr); 2598 EmitNamedSuperPropertyLoad(expr);
2591 } 2599 }
2592 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2600 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2593 context()->Plug(eax); 2601 context()->Plug(eax);
2594 } else { 2602 } else {
2595 VisitForStackValue(expr->obj()); 2603 if (!expr->IsSuperAccess()) {
2596 VisitForAccumulatorValue(expr->key()); 2604 VisitForStackValue(expr->obj());
2597 __ pop(LoadDescriptor::ReceiverRegister()); // Object. 2605 VisitForAccumulatorValue(expr->key());
2598 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. 2606 __ pop(LoadDescriptor::ReceiverRegister()); // Object.
2599 EmitKeyedPropertyLoad(expr); 2607 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key.
2608 EmitKeyedPropertyLoad(expr);
2609 } else {
2610 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2611 EmitLoadHomeObject(expr->obj()->AsSuperReference());
2612 __ push(result_register());
2613 VisitForStackValue(expr->key());
2614 EmitKeyedSuperPropertyLoad(expr);
2615 }
2600 context()->Plug(eax); 2616 context()->Plug(eax);
2601 } 2617 }
2602 } 2618 }
2603 2619
2604 2620
2605 void FullCodeGenerator::CallIC(Handle<Code> code, 2621 void FullCodeGenerator::CallIC(Handle<Code> code,
2606 TypeFeedbackId ast_id) { 2622 TypeFeedbackId ast_id) {
2607 ic_total_count_++; 2623 ic_total_count_++;
2608 __ call(code, RelocInfo::CODE_TARGET, ast_id); 2624 __ call(code, RelocInfo::CODE_TARGET, ast_id);
2609 } 2625 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2692 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); 2708 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG);
2693 2709
2694 // Push the target function under the receiver. 2710 // Push the target function under the receiver.
2695 __ push(Operand(esp, 0)); 2711 __ push(Operand(esp, 0));
2696 __ mov(Operand(esp, kPointerSize), eax); 2712 __ mov(Operand(esp, kPointerSize), eax);
2697 2713
2698 EmitCall(expr, CallICState::METHOD); 2714 EmitCall(expr, CallICState::METHOD);
2699 } 2715 }
2700 2716
2701 2717
2718 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
2719 Expression* callee = expr->expression();
2720 DCHECK(callee->IsProperty());
2721 Property* prop = callee->AsProperty();
2722 DCHECK(prop->IsSuperAccess());
2723
2724 SetSourcePosition(prop->position());
2725 // Load the function from the receiver.
2726 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference();
2727 EmitLoadHomeObject(super_ref);
2728 __ push(eax);
2729 VisitForAccumulatorValue(super_ref->this_var());
2730 __ push(eax);
2731 __ push(eax);
2732 __ push(Operand(esp, kPointerSize * 2));
2733 VisitForStackValue(prop->key());
2734 // Stack here:
2735 // - home_object
2736 // - this (receiver)
2737 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
2738 // - home_object
2739 // - key
2740 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3);
2741
2742 // Replace home_object with target function.
2743 __ mov(Operand(esp, kPointerSize), eax);
2744
2745 // Stack here:
2746 // - target function
2747 // - this (receiver)
2748 EmitCall(expr, CallICState::METHOD);
2749 }
2750
2751
2702 void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) { 2752 void FullCodeGenerator::EmitCall(Call* expr, CallICState::CallType call_type) {
2703 // Load the arguments. 2753 // Load the arguments.
2704 ZoneList<Expression*>* args = expr->arguments(); 2754 ZoneList<Expression*>* args = expr->arguments();
2705 int arg_count = args->length(); 2755 int arg_count = args->length();
2706 { PreservePositionScope scope(masm()->positions_recorder()); 2756 { PreservePositionScope scope(masm()->positions_recorder());
2707 for (int i = 0; i < arg_count; i++) { 2757 for (int i = 0; i < arg_count; i++) {
2708 VisitForStackValue(args->at(i)); 2758 VisitForStackValue(args->at(i));
2709 } 2759 }
2710 } 2760 }
2711 2761
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2833 __ bind(&call); 2883 __ bind(&call);
2834 } 2884 }
2835 2885
2836 // The receiver is either the global receiver or an object found by 2886 // The receiver is either the global receiver or an object found by
2837 // LoadContextSlot. 2887 // LoadContextSlot.
2838 EmitCall(expr); 2888 EmitCall(expr);
2839 2889
2840 } else if (call_type == Call::PROPERTY_CALL) { 2890 } else if (call_type == Call::PROPERTY_CALL) {
2841 Property* property = callee->AsProperty(); 2891 Property* property = callee->AsProperty();
2842 bool is_named_call = property->key()->IsPropertyName(); 2892 bool is_named_call = property->key()->IsPropertyName();
2843 // super.x() is handled in EmitCallWithLoadIC. 2893 if (property->IsSuperAccess()) {
2844 if (property->IsSuperAccess() && is_named_call) { 2894 if (is_named_call) {
2845 EmitSuperCallWithLoadIC(expr); 2895 EmitSuperCallWithLoadIC(expr);
2896 } else {
2897 EmitKeyedSuperCallWithLoadIC(expr);
2898 }
2846 } else { 2899 } else {
2847 { 2900 {
2848 PreservePositionScope scope(masm()->positions_recorder()); 2901 PreservePositionScope scope(masm()->positions_recorder());
2849 VisitForStackValue(property->obj()); 2902 VisitForStackValue(property->obj());
2850 } 2903 }
2851 if (is_named_call) { 2904 if (is_named_call) {
2852 EmitCallWithLoadIC(expr); 2905 EmitCallWithLoadIC(expr);
2853 } else { 2906 } else {
2854 EmitKeyedCallWithLoadIC(expr, property->key()); 2907 EmitKeyedCallWithLoadIC(expr, property->key());
2855 } 2908 }
(...skipping 2109 matching lines...) Expand 10 before | Expand all | Expand 10 after
4965 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), 5018 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(),
4966 Assembler::target_address_at(call_target_address, 5019 Assembler::target_address_at(call_target_address,
4967 unoptimized_code)); 5020 unoptimized_code));
4968 return OSR_AFTER_STACK_CHECK; 5021 return OSR_AFTER_STACK_CHECK;
4969 } 5022 }
4970 5023
4971 5024
4972 } } // namespace v8::internal 5025 } } // namespace v8::internal
4973 5026
4974 #endif // V8_TARGET_ARCH_X87 5027 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698