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

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

Issue 1154103005: Refactor lexical home object binding (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git rebase Created 5 years, 6 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 | « src/mips/full-codegen-mips.cc ('k') | src/parser.cc » ('j') | 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_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 // Note on Mips implementation: 9 // Note on Mips implementation:
10 // 10 //
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 } else if (FLAG_debug_code) { 241 } else if (FLAG_debug_code) {
242 Label done; 242 Label done;
243 __ JumpIfInNewSpace(cp, a0, &done); 243 __ JumpIfInNewSpace(cp, a0, &done);
244 __ Abort(kExpectedNewSpaceObject); 244 __ Abort(kExpectedNewSpaceObject);
245 __ bind(&done); 245 __ bind(&done);
246 } 246 }
247 } 247 }
248 } 248 }
249 } 249 }
250 250
251 Variable* home_object_var = scope()->home_object_var();
252 if (home_object_var != nullptr) {
253 __ Push(a1);
254 }
255
256 // Possibly set up a local binding to the this function which is used in 251 // Possibly set up a local binding to the this function which is used in
257 // derived constructors with super calls. 252 // derived constructors with super calls.
258 Variable* this_function_var = scope()->this_function_var(); 253 Variable* this_function_var = scope()->this_function_var();
259 if (this_function_var != nullptr) { 254 if (this_function_var != nullptr) {
260 Comment cmnt(masm_, "[ This function"); 255 Comment cmnt(masm_, "[ This function");
261 SetVar(this_function_var, a1, a2, a3); 256 SetVar(this_function_var, a1, a2, a3);
262 } 257 }
263 258
264 Variable* new_target_var = scope()->new_target_var(); 259 Variable* new_target_var = scope()->new_target_var();
265 if (new_target_var != nullptr) { 260 if (new_target_var != nullptr) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; 326 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW;
332 } else { 327 } else {
333 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; 328 type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
334 } 329 }
335 ArgumentsAccessStub stub(isolate(), type, has_new_target); 330 ArgumentsAccessStub stub(isolate(), type, has_new_target);
336 __ CallStub(&stub); 331 __ CallStub(&stub);
337 332
338 SetVar(arguments, v0, a1, a2); 333 SetVar(arguments, v0, a1, a2);
339 } 334 }
340 335
341 // Possibly set up a local binding to the [[HomeObject]].
342 if (home_object_var != nullptr) {
343 Comment cmnt(masm_, "[ Home object");
344 __ pop(LoadDescriptor::ReceiverRegister());
345 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
346 __ li(LoadDescriptor::NameRegister(), home_object_symbol);
347 __ li(LoadDescriptor::SlotRegister(),
348 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot())));
349 CallLoadIC(NOT_CONTEXTUAL);
350
351 SetVar(home_object_var, v0, a1, a2);
352 }
353
354 if (FLAG_trace) { 336 if (FLAG_trace) {
355 __ CallRuntime(Runtime::kTraceEnter, 0); 337 __ CallRuntime(Runtime::kTraceEnter, 0);
356 } 338 }
357 // Visit the declarations and body unless there is an illegal 339 // Visit the declarations and body unless there is an illegal
358 // redeclaration. 340 // redeclaration.
359 if (scope()->HasIllegalRedeclaration()) { 341 if (scope()->HasIllegalRedeclaration()) {
360 Comment cmnt(masm_, "[ Declarations"); 342 Comment cmnt(masm_, "[ Declarations");
361 scope()->VisitIllegalRedeclaration(this); 343 scope()->VisitIllegalRedeclaration(this);
362 344
363 } else { 345 } else {
(...skipping 1637 matching lines...) Expand 10 before | Expand all | Expand 10 after
2001 VisitForStackValue(property->obj()); 1983 VisitForStackValue(property->obj());
2002 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1984 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
2003 } else { 1985 } else {
2004 VisitForStackValue(property->obj()); 1986 VisitForStackValue(property->obj());
2005 } 1987 }
2006 break; 1988 break;
2007 case NAMED_SUPER_PROPERTY: 1989 case NAMED_SUPER_PROPERTY:
2008 VisitForStackValue( 1990 VisitForStackValue(
2009 property->obj()->AsSuperPropertyReference()->this_var()); 1991 property->obj()->AsSuperPropertyReference()->this_var());
2010 VisitForAccumulatorValue( 1992 VisitForAccumulatorValue(
2011 property->obj()->AsSuperPropertyReference()->home_object_var()); 1993 property->obj()->AsSuperPropertyReference()->home_object());
2012 __ Push(result_register()); 1994 __ Push(result_register());
2013 if (expr->is_compound()) { 1995 if (expr->is_compound()) {
2014 const Register scratch = a1; 1996 const Register scratch = a1;
2015 __ ld(scratch, MemOperand(sp, kPointerSize)); 1997 __ ld(scratch, MemOperand(sp, kPointerSize));
2016 __ Push(scratch, result_register()); 1998 __ Push(scratch, result_register());
2017 } 1999 }
2018 break; 2000 break;
2019 case KEYED_SUPER_PROPERTY: { 2001 case KEYED_SUPER_PROPERTY: {
2020 const Register scratch = a1; 2002 const Register scratch = a1;
2021 VisitForStackValue( 2003 VisitForStackValue(
2022 property->obj()->AsSuperPropertyReference()->this_var()); 2004 property->obj()->AsSuperPropertyReference()->this_var());
2023 VisitForAccumulatorValue( 2005 VisitForAccumulatorValue(
2024 property->obj()->AsSuperPropertyReference()->home_object_var()); 2006 property->obj()->AsSuperPropertyReference()->home_object());
2025 __ Move(scratch, result_register()); 2007 __ Move(scratch, result_register());
2026 VisitForAccumulatorValue(property->key()); 2008 VisitForAccumulatorValue(property->key());
2027 __ Push(scratch, result_register()); 2009 __ Push(scratch, result_register());
2028 if (expr->is_compound()) { 2010 if (expr->is_compound()) {
2029 const Register scratch1 = a4; 2011 const Register scratch1 = a4;
2030 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize)); 2012 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize));
2031 __ Push(scratch1, scratch, result_register()); 2013 __ Push(scratch1, scratch, result_register());
2032 } 2014 }
2033 break; 2015 break;
2034 } 2016 }
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after
2650 __ li(StoreDescriptor::NameRegister(), 2632 __ li(StoreDescriptor::NameRegister(),
2651 Operand(prop->key()->AsLiteral()->value())); 2633 Operand(prop->key()->AsLiteral()->value()));
2652 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); 2634 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2653 CallStoreIC(); 2635 CallStoreIC();
2654 break; 2636 break;
2655 } 2637 }
2656 case NAMED_SUPER_PROPERTY: { 2638 case NAMED_SUPER_PROPERTY: {
2657 __ Push(v0); 2639 __ Push(v0);
2658 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2640 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2659 VisitForAccumulatorValue( 2641 VisitForAccumulatorValue(
2660 prop->obj()->AsSuperPropertyReference()->home_object_var()); 2642 prop->obj()->AsSuperPropertyReference()->home_object());
2661 // stack: value, this; v0: home_object 2643 // stack: value, this; v0: home_object
2662 Register scratch = a2; 2644 Register scratch = a2;
2663 Register scratch2 = a3; 2645 Register scratch2 = a3;
2664 __ mov(scratch, result_register()); // home_object 2646 __ mov(scratch, result_register()); // home_object
2665 __ ld(v0, MemOperand(sp, kPointerSize)); // value 2647 __ ld(v0, MemOperand(sp, kPointerSize)); // value
2666 __ ld(scratch2, MemOperand(sp, 0)); // this 2648 __ ld(scratch2, MemOperand(sp, 0)); // this
2667 __ sd(scratch2, MemOperand(sp, kPointerSize)); // this 2649 __ sd(scratch2, MemOperand(sp, kPointerSize)); // this
2668 __ sd(scratch, MemOperand(sp, 0)); // home_object 2650 __ sd(scratch, MemOperand(sp, 0)); // home_object
2669 // stack: this, home_object; v0: value 2651 // stack: this, home_object; v0: value
2670 EmitNamedSuperPropertyStore(prop); 2652 EmitNamedSuperPropertyStore(prop);
2671 break; 2653 break;
2672 } 2654 }
2673 case KEYED_SUPER_PROPERTY: { 2655 case KEYED_SUPER_PROPERTY: {
2674 __ Push(v0); 2656 __ Push(v0);
2675 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2657 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2676 VisitForStackValue( 2658 VisitForStackValue(
2677 prop->obj()->AsSuperPropertyReference()->home_object_var()); 2659 prop->obj()->AsSuperPropertyReference()->home_object());
2678 VisitForAccumulatorValue(prop->key()); 2660 VisitForAccumulatorValue(prop->key());
2679 Register scratch = a2; 2661 Register scratch = a2;
2680 Register scratch2 = a3; 2662 Register scratch2 = a3;
2681 __ ld(scratch2, MemOperand(sp, 2 * kPointerSize)); // value 2663 __ ld(scratch2, MemOperand(sp, 2 * kPointerSize)); // value
2682 // stack: value, this, home_object; v0: key, a3: value 2664 // stack: value, this, home_object; v0: key, a3: value
2683 __ ld(scratch, MemOperand(sp, kPointerSize)); // this 2665 __ ld(scratch, MemOperand(sp, kPointerSize)); // this
2684 __ sd(scratch, MemOperand(sp, 2 * kPointerSize)); 2666 __ sd(scratch, MemOperand(sp, 2 * kPointerSize));
2685 __ ld(scratch, MemOperand(sp, 0)); // home_object 2667 __ ld(scratch, MemOperand(sp, 0)); // home_object
2686 __ sd(scratch, MemOperand(sp, kPointerSize)); 2668 __ sd(scratch, MemOperand(sp, kPointerSize));
2687 __ sd(v0, MemOperand(sp, 0)); 2669 __ sd(v0, MemOperand(sp, 0));
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
2902 Expression* key = expr->key(); 2884 Expression* key = expr->key();
2903 2885
2904 if (key->IsPropertyName()) { 2886 if (key->IsPropertyName()) {
2905 if (!expr->IsSuperAccess()) { 2887 if (!expr->IsSuperAccess()) {
2906 VisitForAccumulatorValue(expr->obj()); 2888 VisitForAccumulatorValue(expr->obj());
2907 __ Move(LoadDescriptor::ReceiverRegister(), v0); 2889 __ Move(LoadDescriptor::ReceiverRegister(), v0);
2908 EmitNamedPropertyLoad(expr); 2890 EmitNamedPropertyLoad(expr);
2909 } else { 2891 } else {
2910 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); 2892 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var());
2911 VisitForStackValue( 2893 VisitForStackValue(
2912 expr->obj()->AsSuperPropertyReference()->home_object_var()); 2894 expr->obj()->AsSuperPropertyReference()->home_object());
2913 EmitNamedSuperPropertyLoad(expr); 2895 EmitNamedSuperPropertyLoad(expr);
2914 } 2896 }
2915 } else { 2897 } else {
2916 if (!expr->IsSuperAccess()) { 2898 if (!expr->IsSuperAccess()) {
2917 VisitForStackValue(expr->obj()); 2899 VisitForStackValue(expr->obj());
2918 VisitForAccumulatorValue(expr->key()); 2900 VisitForAccumulatorValue(expr->key());
2919 __ Move(LoadDescriptor::NameRegister(), v0); 2901 __ Move(LoadDescriptor::NameRegister(), v0);
2920 __ pop(LoadDescriptor::ReceiverRegister()); 2902 __ pop(LoadDescriptor::ReceiverRegister());
2921 EmitKeyedPropertyLoad(expr); 2903 EmitKeyedPropertyLoad(expr);
2922 } else { 2904 } else {
2923 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); 2905 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var());
2924 VisitForStackValue( 2906 VisitForStackValue(
2925 expr->obj()->AsSuperPropertyReference()->home_object_var()); 2907 expr->obj()->AsSuperPropertyReference()->home_object());
2926 VisitForStackValue(expr->key()); 2908 VisitForStackValue(expr->key());
2927 EmitKeyedSuperPropertyLoad(expr); 2909 EmitKeyedSuperPropertyLoad(expr);
2928 } 2910 }
2929 } 2911 }
2930 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2912 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2931 context()->Plug(v0); 2913 context()->Plug(v0);
2932 } 2914 }
2933 2915
2934 2916
2935 void FullCodeGenerator::CallIC(Handle<Code> code, 2917 void FullCodeGenerator::CallIC(Handle<Code> code,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2978 DCHECK(callee->IsProperty()); 2960 DCHECK(callee->IsProperty());
2979 Property* prop = callee->AsProperty(); 2961 Property* prop = callee->AsProperty();
2980 DCHECK(prop->IsSuperAccess()); 2962 DCHECK(prop->IsSuperAccess());
2981 2963
2982 SetSourcePosition(prop->position()); 2964 SetSourcePosition(prop->position());
2983 Literal* key = prop->key()->AsLiteral(); 2965 Literal* key = prop->key()->AsLiteral();
2984 DCHECK(!key->value()->IsSmi()); 2966 DCHECK(!key->value()->IsSmi());
2985 // Load the function from the receiver. 2967 // Load the function from the receiver.
2986 const Register scratch = a1; 2968 const Register scratch = a1;
2987 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); 2969 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
2988 VisitForAccumulatorValue(super_ref->home_object_var()); 2970 VisitForAccumulatorValue(super_ref->home_object());
2989 __ mov(scratch, v0); 2971 __ mov(scratch, v0);
2990 VisitForAccumulatorValue(super_ref->this_var()); 2972 VisitForAccumulatorValue(super_ref->this_var());
2991 __ Push(scratch, v0, v0, scratch); 2973 __ Push(scratch, v0, v0, scratch);
2992 __ Push(key->value()); 2974 __ Push(key->value());
2993 2975
2994 // Stack here: 2976 // Stack here:
2995 // - home_object 2977 // - home_object
2996 // - this (receiver) 2978 // - this (receiver)
2997 // - this (receiver) <-- LoadFromSuper will pop here and below. 2979 // - this (receiver) <-- LoadFromSuper will pop here and below.
2998 // - home_object 2980 // - home_object
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { 3018 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
3037 Expression* callee = expr->expression(); 3019 Expression* callee = expr->expression();
3038 DCHECK(callee->IsProperty()); 3020 DCHECK(callee->IsProperty());
3039 Property* prop = callee->AsProperty(); 3021 Property* prop = callee->AsProperty();
3040 DCHECK(prop->IsSuperAccess()); 3022 DCHECK(prop->IsSuperAccess());
3041 3023
3042 SetSourcePosition(prop->position()); 3024 SetSourcePosition(prop->position());
3043 // Load the function from the receiver. 3025 // Load the function from the receiver.
3044 const Register scratch = a1; 3026 const Register scratch = a1;
3045 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); 3027 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
3046 VisitForAccumulatorValue(super_ref->home_object_var()); 3028 VisitForAccumulatorValue(super_ref->home_object());
3047 __ Move(scratch, v0); 3029 __ Move(scratch, v0);
3048 VisitForAccumulatorValue(super_ref->this_var()); 3030 VisitForAccumulatorValue(super_ref->this_var());
3049 __ Push(scratch, v0, v0, scratch); 3031 __ Push(scratch, v0, v0, scratch);
3050 VisitForStackValue(prop->key()); 3032 VisitForStackValue(prop->key());
3051 3033
3052 // Stack here: 3034 // Stack here:
3053 // - home_object 3035 // - home_object
3054 // - this (receiver) 3036 // - this (receiver)
3055 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. 3037 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
3056 // - home_object 3038 // - home_object
(...skipping 1870 matching lines...) Expand 10 before | Expand all | Expand 10 after
4927 // Put the object both on the stack and in the register. 4909 // Put the object both on the stack and in the register.
4928 VisitForStackValue(prop->obj()); 4910 VisitForStackValue(prop->obj());
4929 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 4911 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
4930 EmitNamedPropertyLoad(prop); 4912 EmitNamedPropertyLoad(prop);
4931 break; 4913 break;
4932 } 4914 }
4933 4915
4934 case NAMED_SUPER_PROPERTY: { 4916 case NAMED_SUPER_PROPERTY: {
4935 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 4917 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
4936 VisitForAccumulatorValue( 4918 VisitForAccumulatorValue(
4937 prop->obj()->AsSuperPropertyReference()->home_object_var()); 4919 prop->obj()->AsSuperPropertyReference()->home_object());
4938 __ Push(result_register()); 4920 __ Push(result_register());
4939 const Register scratch = a1; 4921 const Register scratch = a1;
4940 __ ld(scratch, MemOperand(sp, kPointerSize)); 4922 __ ld(scratch, MemOperand(sp, kPointerSize));
4941 __ Push(scratch, result_register()); 4923 __ Push(scratch, result_register());
4942 EmitNamedSuperPropertyLoad(prop); 4924 EmitNamedSuperPropertyLoad(prop);
4943 break; 4925 break;
4944 } 4926 }
4945 4927
4946 case KEYED_SUPER_PROPERTY: { 4928 case KEYED_SUPER_PROPERTY: {
4947 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 4929 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
4948 VisitForAccumulatorValue( 4930 VisitForAccumulatorValue(
4949 prop->obj()->AsSuperPropertyReference()->home_object_var()); 4931 prop->obj()->AsSuperPropertyReference()->home_object());
4950 const Register scratch = a1; 4932 const Register scratch = a1;
4951 const Register scratch1 = a4; 4933 const Register scratch1 = a4;
4952 __ Move(scratch, result_register()); 4934 __ Move(scratch, result_register());
4953 VisitForAccumulatorValue(prop->key()); 4935 VisitForAccumulatorValue(prop->key());
4954 __ Push(scratch, result_register()); 4936 __ Push(scratch, result_register());
4955 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize)); 4937 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize));
4956 __ Push(scratch1, scratch, result_register()); 4938 __ Push(scratch1, scratch, result_register());
4957 EmitKeyedSuperPropertyLoad(prop); 4939 EmitKeyedSuperPropertyLoad(prop);
4958 break; 4940 break;
4959 } 4941 }
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
5565 reinterpret_cast<uint64_t>( 5547 reinterpret_cast<uint64_t>(
5566 isolate->builtins()->OsrAfterStackCheck()->entry())); 5548 isolate->builtins()->OsrAfterStackCheck()->entry()));
5567 return OSR_AFTER_STACK_CHECK; 5549 return OSR_AFTER_STACK_CHECK;
5568 } 5550 }
5569 5551
5570 5552
5571 } // namespace internal 5553 } // namespace internal
5572 } // namespace v8 5554 } // namespace v8
5573 5555
5574 #endif // V8_TARGET_ARCH_MIPS64 5556 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698