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

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

Issue 1154103005: Refactor lexical home object binding (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_PPC 7 #if V8_TARGET_ARCH_PPC
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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 } else if (FLAG_debug_code) { 240 } else if (FLAG_debug_code) {
241 Label done; 241 Label done;
242 __ JumpIfInNewSpace(cp, r3, &done); 242 __ JumpIfInNewSpace(cp, r3, &done);
243 __ Abort(kExpectedNewSpaceObject); 243 __ Abort(kExpectedNewSpaceObject);
244 __ bind(&done); 244 __ bind(&done);
245 } 245 }
246 } 246 }
247 } 247 }
248 } 248 }
249 249
250 Variable* home_object_var = scope()->home_object_var();
251 if (home_object_var != nullptr) {
252 __ Push(r4);
253 }
254
255 ArgumentsAccessStub::HasNewTarget has_new_target = 250 ArgumentsAccessStub::HasNewTarget has_new_target =
256 IsSubclassConstructor(info->function()->kind()) 251 IsSubclassConstructor(info->function()->kind())
257 ? ArgumentsAccessStub::HAS_NEW_TARGET 252 ? ArgumentsAccessStub::HAS_NEW_TARGET
258 : ArgumentsAccessStub::NO_NEW_TARGET; 253 : ArgumentsAccessStub::NO_NEW_TARGET;
259 254
260 // Possibly allocate RestParameters 255 // Possibly allocate RestParameters
261 int rest_index; 256 int rest_index;
262 Variable* rest_param = scope()->rest_parameter(&rest_index); 257 Variable* rest_param = scope()->rest_parameter(&rest_index);
263 if (rest_param) { 258 if (rest_param) {
264 Comment cmnt(masm_, "[ Allocate rest parameter array"); 259 Comment cmnt(masm_, "[ Allocate rest parameter array");
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; 305 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW;
311 } else { 306 } else {
312 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; 307 type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
313 } 308 }
314 ArgumentsAccessStub stub(isolate(), type, has_new_target); 309 ArgumentsAccessStub stub(isolate(), type, has_new_target);
315 __ CallStub(&stub); 310 __ CallStub(&stub);
316 311
317 SetVar(arguments, r3, r4, r5); 312 SetVar(arguments, r3, r4, r5);
318 } 313 }
319 314
320 // Possibly set up a local binding to the [[HomeObject]].
321 if (home_object_var != nullptr) {
322 Comment cmnt(masm_, "[ Home object");
323 __ Pop(LoadDescriptor::ReceiverRegister());
324 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
325 __ Move(LoadDescriptor::NameRegister(), home_object_symbol);
326 __ mov(LoadDescriptor::SlotRegister(),
327 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot())));
328 CallLoadIC(NOT_CONTEXTUAL);
329
330 SetVar(home_object_var, r3, r4, r5);
331 }
332
333 if (FLAG_trace) { 315 if (FLAG_trace) {
334 __ CallRuntime(Runtime::kTraceEnter, 0); 316 __ CallRuntime(Runtime::kTraceEnter, 0);
335 } 317 }
336 318
337 // Visit the declarations and body unless there is an illegal 319 // Visit the declarations and body unless there is an illegal
338 // redeclaration. 320 // redeclaration.
339 if (scope()->HasIllegalRedeclaration()) { 321 if (scope()->HasIllegalRedeclaration()) {
340 Comment cmnt(masm_, "[ Declarations"); 322 Comment cmnt(masm_, "[ Declarations");
341 scope()->VisitIllegalRedeclaration(this); 323 scope()->VisitIllegalRedeclaration(this);
342 324
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 // We need the receiver both on the stack and in the register. 1932 // We need the receiver both on the stack and in the register.
1951 VisitForStackValue(property->obj()); 1933 VisitForStackValue(property->obj());
1952 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1934 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1953 } else { 1935 } else {
1954 VisitForStackValue(property->obj()); 1936 VisitForStackValue(property->obj());
1955 } 1937 }
1956 break; 1938 break;
1957 case NAMED_SUPER_PROPERTY: 1939 case NAMED_SUPER_PROPERTY:
1958 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1940 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1959 VisitForAccumulatorValue( 1941 VisitForAccumulatorValue(
1960 property->obj()->AsSuperReference()->home_object_var()); 1942 property->obj()->AsSuperReference()->home_object());
1961 __ Push(result_register()); 1943 __ Push(result_register());
1962 if (expr->is_compound()) { 1944 if (expr->is_compound()) {
1963 const Register scratch = r4; 1945 const Register scratch = r4;
1964 __ LoadP(scratch, MemOperand(sp, kPointerSize)); 1946 __ LoadP(scratch, MemOperand(sp, kPointerSize));
1965 __ Push(scratch, result_register()); 1947 __ Push(scratch, result_register());
1966 } 1948 }
1967 break; 1949 break;
1968 case KEYED_SUPER_PROPERTY: { 1950 case KEYED_SUPER_PROPERTY: {
1969 const Register scratch = r4; 1951 const Register scratch = r4;
1970 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1952 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1971 VisitForAccumulatorValue( 1953 VisitForAccumulatorValue(
1972 property->obj()->AsSuperReference()->home_object_var()); 1954 property->obj()->AsSuperReference()->home_object());
1973 __ mr(scratch, result_register()); 1955 __ mr(scratch, result_register());
1974 VisitForAccumulatorValue(property->key()); 1956 VisitForAccumulatorValue(property->key());
1975 __ Push(scratch, result_register()); 1957 __ Push(scratch, result_register());
1976 if (expr->is_compound()) { 1958 if (expr->is_compound()) {
1977 const Register scratch1 = r5; 1959 const Register scratch1 = r5;
1978 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); 1960 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize));
1979 __ Push(scratch1, scratch, result_register()); 1961 __ Push(scratch1, scratch, result_register());
1980 } 1962 }
1981 break; 1963 break;
1982 } 1964 }
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
2642 __ pop(StoreDescriptor::ValueRegister()); // Restore value. 2624 __ pop(StoreDescriptor::ValueRegister()); // Restore value.
2643 __ mov(StoreDescriptor::NameRegister(), 2625 __ mov(StoreDescriptor::NameRegister(),
2644 Operand(prop->key()->AsLiteral()->value())); 2626 Operand(prop->key()->AsLiteral()->value()));
2645 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); 2627 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2646 CallStoreIC(); 2628 CallStoreIC();
2647 break; 2629 break;
2648 } 2630 }
2649 case NAMED_SUPER_PROPERTY: { 2631 case NAMED_SUPER_PROPERTY: {
2650 __ Push(r3); 2632 __ Push(r3);
2651 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2633 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2652 VisitForAccumulatorValue( 2634 VisitForAccumulatorValue(prop->obj()->AsSuperReference()->home_object());
2653 prop->obj()->AsSuperReference()->home_object_var());
2654 // stack: value, this; r3: home_object 2635 // stack: value, this; r3: home_object
2655 Register scratch = r5; 2636 Register scratch = r5;
2656 Register scratch2 = r6; 2637 Register scratch2 = r6;
2657 __ mr(scratch, result_register()); // home_object 2638 __ mr(scratch, result_register()); // home_object
2658 __ LoadP(r3, MemOperand(sp, kPointerSize)); // value 2639 __ LoadP(r3, MemOperand(sp, kPointerSize)); // value
2659 __ LoadP(scratch2, MemOperand(sp, 0)); // this 2640 __ LoadP(scratch2, MemOperand(sp, 0)); // this
2660 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this 2641 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this
2661 __ StoreP(scratch, MemOperand(sp, 0)); // home_object 2642 __ StoreP(scratch, MemOperand(sp, 0)); // home_object
2662 // stack: this, home_object; r3: value 2643 // stack: this, home_object; r3: value
2663 EmitNamedSuperPropertyStore(prop); 2644 EmitNamedSuperPropertyStore(prop);
2664 break; 2645 break;
2665 } 2646 }
2666 case KEYED_SUPER_PROPERTY: { 2647 case KEYED_SUPER_PROPERTY: {
2667 __ Push(r3); 2648 __ Push(r3);
2668 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2649 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2669 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); 2650 VisitForStackValue(prop->obj()->AsSuperReference()->home_object());
2670 VisitForAccumulatorValue(prop->key()); 2651 VisitForAccumulatorValue(prop->key());
2671 Register scratch = r5; 2652 Register scratch = r5;
2672 Register scratch2 = r6; 2653 Register scratch2 = r6;
2673 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value 2654 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value
2674 // stack: value, this, home_object; r3: key, r6: value 2655 // stack: value, this, home_object; r3: key, r6: value
2675 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this 2656 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this
2676 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize)); 2657 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize));
2677 __ LoadP(scratch, MemOperand(sp, 0)); // home_object 2658 __ LoadP(scratch, MemOperand(sp, 0)); // home_object
2678 __ StoreP(scratch, MemOperand(sp, kPointerSize)); 2659 __ StoreP(scratch, MemOperand(sp, kPointerSize));
2679 __ StoreP(r3, MemOperand(sp, 0)); 2660 __ StoreP(r3, MemOperand(sp, 0));
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2883 Comment cmnt(masm_, "[ Property"); 2864 Comment cmnt(masm_, "[ Property");
2884 Expression* key = expr->key(); 2865 Expression* key = expr->key();
2885 2866
2886 if (key->IsPropertyName()) { 2867 if (key->IsPropertyName()) {
2887 if (!expr->IsSuperAccess()) { 2868 if (!expr->IsSuperAccess()) {
2888 VisitForAccumulatorValue(expr->obj()); 2869 VisitForAccumulatorValue(expr->obj());
2889 __ Move(LoadDescriptor::ReceiverRegister(), r3); 2870 __ Move(LoadDescriptor::ReceiverRegister(), r3);
2890 EmitNamedPropertyLoad(expr); 2871 EmitNamedPropertyLoad(expr);
2891 } else { 2872 } else {
2892 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2873 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2893 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); 2874 VisitForStackValue(expr->obj()->AsSuperReference()->home_object());
2894 EmitNamedSuperPropertyLoad(expr); 2875 EmitNamedSuperPropertyLoad(expr);
2895 } 2876 }
2896 } else { 2877 } else {
2897 if (!expr->IsSuperAccess()) { 2878 if (!expr->IsSuperAccess()) {
2898 VisitForStackValue(expr->obj()); 2879 VisitForStackValue(expr->obj());
2899 VisitForAccumulatorValue(expr->key()); 2880 VisitForAccumulatorValue(expr->key());
2900 __ Move(LoadDescriptor::NameRegister(), r3); 2881 __ Move(LoadDescriptor::NameRegister(), r3);
2901 __ pop(LoadDescriptor::ReceiverRegister()); 2882 __ pop(LoadDescriptor::ReceiverRegister());
2902 EmitKeyedPropertyLoad(expr); 2883 EmitKeyedPropertyLoad(expr);
2903 } else { 2884 } else {
2904 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2885 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2905 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); 2886 VisitForStackValue(expr->obj()->AsSuperReference()->home_object());
2906 VisitForStackValue(expr->key()); 2887 VisitForStackValue(expr->key());
2907 EmitKeyedSuperPropertyLoad(expr); 2888 EmitKeyedSuperPropertyLoad(expr);
2908 } 2889 }
2909 } 2890 }
2910 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2891 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2911 context()->Plug(r3); 2892 context()->Plug(r3);
2912 } 2893 }
2913 2894
2914 2895
2915 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { 2896 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2958 DCHECK(callee->IsProperty()); 2939 DCHECK(callee->IsProperty());
2959 Property* prop = callee->AsProperty(); 2940 Property* prop = callee->AsProperty();
2960 DCHECK(prop->IsSuperAccess()); 2941 DCHECK(prop->IsSuperAccess());
2961 2942
2962 SetSourcePosition(prop->position()); 2943 SetSourcePosition(prop->position());
2963 Literal* key = prop->key()->AsLiteral(); 2944 Literal* key = prop->key()->AsLiteral();
2964 DCHECK(!key->value()->IsSmi()); 2945 DCHECK(!key->value()->IsSmi());
2965 // Load the function from the receiver. 2946 // Load the function from the receiver.
2966 const Register scratch = r4; 2947 const Register scratch = r4;
2967 SuperReference* super_ref = prop->obj()->AsSuperReference(); 2948 SuperReference* super_ref = prop->obj()->AsSuperReference();
2968 VisitForAccumulatorValue(super_ref->home_object_var()); 2949 VisitForAccumulatorValue(super_ref->home_object());
2969 __ mr(scratch, r3); 2950 __ mr(scratch, r3);
2970 VisitForAccumulatorValue(super_ref->this_var()); 2951 VisitForAccumulatorValue(super_ref->this_var());
2971 __ Push(scratch, r3, r3, scratch); 2952 __ Push(scratch, r3, r3, scratch);
2972 __ Push(key->value()); 2953 __ Push(key->value());
2973 2954
2974 // Stack here: 2955 // Stack here:
2975 // - home_object 2956 // - home_object
2976 // - this (receiver) 2957 // - this (receiver)
2977 // - this (receiver) <-- LoadFromSuper will pop here and below. 2958 // - this (receiver) <-- LoadFromSuper will pop here and below.
2978 // - home_object 2959 // - home_object
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3015 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { 2996 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
3016 Expression* callee = expr->expression(); 2997 Expression* callee = expr->expression();
3017 DCHECK(callee->IsProperty()); 2998 DCHECK(callee->IsProperty());
3018 Property* prop = callee->AsProperty(); 2999 Property* prop = callee->AsProperty();
3019 DCHECK(prop->IsSuperAccess()); 3000 DCHECK(prop->IsSuperAccess());
3020 3001
3021 SetSourcePosition(prop->position()); 3002 SetSourcePosition(prop->position());
3022 // Load the function from the receiver. 3003 // Load the function from the receiver.
3023 const Register scratch = r4; 3004 const Register scratch = r4;
3024 SuperReference* super_ref = prop->obj()->AsSuperReference(); 3005 SuperReference* super_ref = prop->obj()->AsSuperReference();
3025 VisitForAccumulatorValue(super_ref->home_object_var()); 3006 VisitForAccumulatorValue(super_ref->home_object());
3026 __ mr(scratch, r3); 3007 __ mr(scratch, r3);
3027 VisitForAccumulatorValue(super_ref->this_var()); 3008 VisitForAccumulatorValue(super_ref->this_var());
3028 __ Push(scratch, r3, r3, scratch); 3009 __ Push(scratch, r3, r3, scratch);
3029 VisitForStackValue(prop->key()); 3010 VisitForStackValue(prop->key());
3030 3011
3031 // Stack here: 3012 // Stack here:
3032 // - home_object 3013 // - home_object
3033 // - this (receiver) 3014 // - this (receiver)
3034 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. 3015 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
3035 // - home_object 3016 // - home_object
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after
4887 // Put the object both on the stack and in the register. 4868 // Put the object both on the stack and in the register.
4888 VisitForStackValue(prop->obj()); 4869 VisitForStackValue(prop->obj());
4889 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 4870 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
4890 EmitNamedPropertyLoad(prop); 4871 EmitNamedPropertyLoad(prop);
4891 break; 4872 break;
4892 } 4873 }
4893 4874
4894 case NAMED_SUPER_PROPERTY: { 4875 case NAMED_SUPER_PROPERTY: {
4895 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4876 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4896 VisitForAccumulatorValue( 4877 VisitForAccumulatorValue(
4897 prop->obj()->AsSuperReference()->home_object_var()); 4878 prop->obj()->AsSuperReference()->home_object());
4898 __ Push(result_register()); 4879 __ Push(result_register());
4899 const Register scratch = r4; 4880 const Register scratch = r4;
4900 __ LoadP(scratch, MemOperand(sp, kPointerSize)); 4881 __ LoadP(scratch, MemOperand(sp, kPointerSize));
4901 __ Push(scratch, result_register()); 4882 __ Push(scratch, result_register());
4902 EmitNamedSuperPropertyLoad(prop); 4883 EmitNamedSuperPropertyLoad(prop);
4903 break; 4884 break;
4904 } 4885 }
4905 4886
4906 case KEYED_SUPER_PROPERTY: { 4887 case KEYED_SUPER_PROPERTY: {
4907 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4888 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4908 VisitForAccumulatorValue( 4889 VisitForAccumulatorValue(
4909 prop->obj()->AsSuperReference()->home_object_var()); 4890 prop->obj()->AsSuperReference()->home_object());
4910 const Register scratch = r4; 4891 const Register scratch = r4;
4911 const Register scratch1 = r5; 4892 const Register scratch1 = r5;
4912 __ mr(scratch, result_register()); 4893 __ mr(scratch, result_register());
4913 VisitForAccumulatorValue(prop->key()); 4894 VisitForAccumulatorValue(prop->key());
4914 __ Push(scratch, result_register()); 4895 __ Push(scratch, result_register());
4915 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); 4896 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize));
4916 __ Push(scratch1, scratch, result_register()); 4897 __ Push(scratch1, scratch, result_register());
4917 EmitKeyedSuperPropertyLoad(prop); 4898 EmitKeyedSuperPropertyLoad(prop);
4918 break; 4899 break;
4919 } 4900 }
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
5516 return ON_STACK_REPLACEMENT; 5497 return ON_STACK_REPLACEMENT;
5517 } 5498 }
5518 5499
5519 DCHECK(interrupt_address == 5500 DCHECK(interrupt_address ==
5520 isolate->builtins()->OsrAfterStackCheck()->entry()); 5501 isolate->builtins()->OsrAfterStackCheck()->entry());
5521 return OSR_AFTER_STACK_CHECK; 5502 return OSR_AFTER_STACK_CHECK;
5522 } 5503 }
5523 } // namespace internal 5504 } // namespace internal
5524 } // namespace v8 5505 } // namespace v8
5525 #endif // V8_TARGET_ARCH_PPC 5506 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« src/ast-value-factory.cc ('K') | « src/parser.cc ('k') | src/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698