OLD | NEW |
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 Loading... |
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 // Possibly set up a local binding to the this function which is used in | 250 // Possibly set up a local binding to the this function which is used in |
256 // derived constructors with super calls. | 251 // derived constructors with super calls. |
257 Variable* this_function_var = scope()->this_function_var(); | 252 Variable* this_function_var = scope()->this_function_var(); |
258 if (this_function_var != nullptr) { | 253 if (this_function_var != nullptr) { |
259 Comment cmnt(masm_, "[ This function"); | 254 Comment cmnt(masm_, "[ This function"); |
260 SetVar(this_function_var, r4, r3, r5); | 255 SetVar(this_function_var, r4, r3, r5); |
261 } | 256 } |
262 | 257 |
263 Variable* new_target_var = scope()->new_target_var(); | 258 Variable* new_target_var = scope()->new_target_var(); |
264 if (new_target_var != nullptr) { | 259 if (new_target_var != nullptr) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 323 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
329 } else { | 324 } else { |
330 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 325 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
331 } | 326 } |
332 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 327 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
333 __ CallStub(&stub); | 328 __ CallStub(&stub); |
334 | 329 |
335 SetVar(arguments, r3, r4, r5); | 330 SetVar(arguments, r3, r4, r5); |
336 } | 331 } |
337 | 332 |
338 // Possibly set up a local binding to the [[HomeObject]]. | |
339 if (home_object_var != nullptr) { | |
340 Comment cmnt(masm_, "[ Home object"); | |
341 __ Pop(LoadDescriptor::ReceiverRegister()); | |
342 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
343 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); | |
344 __ mov(LoadDescriptor::SlotRegister(), | |
345 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); | |
346 CallLoadIC(NOT_CONTEXTUAL); | |
347 | |
348 SetVar(home_object_var, r3, r4, r5); | |
349 } | |
350 | |
351 if (FLAG_trace) { | 333 if (FLAG_trace) { |
352 __ CallRuntime(Runtime::kTraceEnter, 0); | 334 __ CallRuntime(Runtime::kTraceEnter, 0); |
353 } | 335 } |
354 | 336 |
355 // Visit the declarations and body unless there is an illegal | 337 // Visit the declarations and body unless there is an illegal |
356 // redeclaration. | 338 // redeclaration. |
357 if (scope()->HasIllegalRedeclaration()) { | 339 if (scope()->HasIllegalRedeclaration()) { |
358 Comment cmnt(masm_, "[ Declarations"); | 340 Comment cmnt(masm_, "[ Declarations"); |
359 scope()->VisitIllegalRedeclaration(this); | 341 scope()->VisitIllegalRedeclaration(this); |
360 | 342 |
(...skipping 1613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1974 VisitForStackValue(property->obj()); | 1956 VisitForStackValue(property->obj()); |
1975 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1957 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
1976 } else { | 1958 } else { |
1977 VisitForStackValue(property->obj()); | 1959 VisitForStackValue(property->obj()); |
1978 } | 1960 } |
1979 break; | 1961 break; |
1980 case NAMED_SUPER_PROPERTY: | 1962 case NAMED_SUPER_PROPERTY: |
1981 VisitForStackValue( | 1963 VisitForStackValue( |
1982 property->obj()->AsSuperPropertyReference()->this_var()); | 1964 property->obj()->AsSuperPropertyReference()->this_var()); |
1983 VisitForAccumulatorValue( | 1965 VisitForAccumulatorValue( |
1984 property->obj()->AsSuperPropertyReference()->home_object_var()); | 1966 property->obj()->AsSuperPropertyReference()->home_object()); |
1985 __ Push(result_register()); | 1967 __ Push(result_register()); |
1986 if (expr->is_compound()) { | 1968 if (expr->is_compound()) { |
1987 const Register scratch = r4; | 1969 const Register scratch = r4; |
1988 __ LoadP(scratch, MemOperand(sp, kPointerSize)); | 1970 __ LoadP(scratch, MemOperand(sp, kPointerSize)); |
1989 __ Push(scratch, result_register()); | 1971 __ Push(scratch, result_register()); |
1990 } | 1972 } |
1991 break; | 1973 break; |
1992 case KEYED_SUPER_PROPERTY: { | 1974 case KEYED_SUPER_PROPERTY: { |
1993 const Register scratch = r4; | 1975 const Register scratch = r4; |
1994 VisitForStackValue( | 1976 VisitForStackValue( |
1995 property->obj()->AsSuperPropertyReference()->this_var()); | 1977 property->obj()->AsSuperPropertyReference()->this_var()); |
1996 VisitForAccumulatorValue( | 1978 VisitForAccumulatorValue( |
1997 property->obj()->AsSuperPropertyReference()->home_object_var()); | 1979 property->obj()->AsSuperPropertyReference()->home_object()); |
1998 __ mr(scratch, result_register()); | 1980 __ mr(scratch, result_register()); |
1999 VisitForAccumulatorValue(property->key()); | 1981 VisitForAccumulatorValue(property->key()); |
2000 __ Push(scratch, result_register()); | 1982 __ Push(scratch, result_register()); |
2001 if (expr->is_compound()) { | 1983 if (expr->is_compound()) { |
2002 const Register scratch1 = r5; | 1984 const Register scratch1 = r5; |
2003 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); | 1985 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); |
2004 __ Push(scratch1, scratch, result_register()); | 1986 __ Push(scratch1, scratch, result_register()); |
2005 } | 1987 } |
2006 break; | 1988 break; |
2007 } | 1989 } |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2672 __ mov(StoreDescriptor::NameRegister(), | 2654 __ mov(StoreDescriptor::NameRegister(), |
2673 Operand(prop->key()->AsLiteral()->value())); | 2655 Operand(prop->key()->AsLiteral()->value())); |
2674 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2656 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
2675 CallStoreIC(); | 2657 CallStoreIC(); |
2676 break; | 2658 break; |
2677 } | 2659 } |
2678 case NAMED_SUPER_PROPERTY: { | 2660 case NAMED_SUPER_PROPERTY: { |
2679 __ Push(r3); | 2661 __ Push(r3); |
2680 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 2662 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
2681 VisitForAccumulatorValue( | 2663 VisitForAccumulatorValue( |
2682 prop->obj()->AsSuperPropertyReference()->home_object_var()); | 2664 prop->obj()->AsSuperPropertyReference()->home_object()); |
2683 // stack: value, this; r3: home_object | 2665 // stack: value, this; r3: home_object |
2684 Register scratch = r5; | 2666 Register scratch = r5; |
2685 Register scratch2 = r6; | 2667 Register scratch2 = r6; |
2686 __ mr(scratch, result_register()); // home_object | 2668 __ mr(scratch, result_register()); // home_object |
2687 __ LoadP(r3, MemOperand(sp, kPointerSize)); // value | 2669 __ LoadP(r3, MemOperand(sp, kPointerSize)); // value |
2688 __ LoadP(scratch2, MemOperand(sp, 0)); // this | 2670 __ LoadP(scratch2, MemOperand(sp, 0)); // this |
2689 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this | 2671 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this |
2690 __ StoreP(scratch, MemOperand(sp, 0)); // home_object | 2672 __ StoreP(scratch, MemOperand(sp, 0)); // home_object |
2691 // stack: this, home_object; r3: value | 2673 // stack: this, home_object; r3: value |
2692 EmitNamedSuperPropertyStore(prop); | 2674 EmitNamedSuperPropertyStore(prop); |
2693 break; | 2675 break; |
2694 } | 2676 } |
2695 case KEYED_SUPER_PROPERTY: { | 2677 case KEYED_SUPER_PROPERTY: { |
2696 __ Push(r3); | 2678 __ Push(r3); |
2697 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 2679 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
2698 VisitForStackValue( | 2680 VisitForStackValue( |
2699 prop->obj()->AsSuperPropertyReference()->home_object_var()); | 2681 prop->obj()->AsSuperPropertyReference()->home_object()); |
2700 VisitForAccumulatorValue(prop->key()); | 2682 VisitForAccumulatorValue(prop->key()); |
2701 Register scratch = r5; | 2683 Register scratch = r5; |
2702 Register scratch2 = r6; | 2684 Register scratch2 = r6; |
2703 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value | 2685 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value |
2704 // stack: value, this, home_object; r3: key, r6: value | 2686 // stack: value, this, home_object; r3: key, r6: value |
2705 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this | 2687 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this |
2706 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize)); | 2688 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize)); |
2707 __ LoadP(scratch, MemOperand(sp, 0)); // home_object | 2689 __ LoadP(scratch, MemOperand(sp, 0)); // home_object |
2708 __ StoreP(scratch, MemOperand(sp, kPointerSize)); | 2690 __ StoreP(scratch, MemOperand(sp, kPointerSize)); |
2709 __ StoreP(r3, MemOperand(sp, 0)); | 2691 __ StoreP(r3, MemOperand(sp, 0)); |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2914 Expression* key = expr->key(); | 2896 Expression* key = expr->key(); |
2915 | 2897 |
2916 if (key->IsPropertyName()) { | 2898 if (key->IsPropertyName()) { |
2917 if (!expr->IsSuperAccess()) { | 2899 if (!expr->IsSuperAccess()) { |
2918 VisitForAccumulatorValue(expr->obj()); | 2900 VisitForAccumulatorValue(expr->obj()); |
2919 __ Move(LoadDescriptor::ReceiverRegister(), r3); | 2901 __ Move(LoadDescriptor::ReceiverRegister(), r3); |
2920 EmitNamedPropertyLoad(expr); | 2902 EmitNamedPropertyLoad(expr); |
2921 } else { | 2903 } else { |
2922 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); | 2904 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
2923 VisitForStackValue( | 2905 VisitForStackValue( |
2924 expr->obj()->AsSuperPropertyReference()->home_object_var()); | 2906 expr->obj()->AsSuperPropertyReference()->home_object()); |
2925 EmitNamedSuperPropertyLoad(expr); | 2907 EmitNamedSuperPropertyLoad(expr); |
2926 } | 2908 } |
2927 } else { | 2909 } else { |
2928 if (!expr->IsSuperAccess()) { | 2910 if (!expr->IsSuperAccess()) { |
2929 VisitForStackValue(expr->obj()); | 2911 VisitForStackValue(expr->obj()); |
2930 VisitForAccumulatorValue(expr->key()); | 2912 VisitForAccumulatorValue(expr->key()); |
2931 __ Move(LoadDescriptor::NameRegister(), r3); | 2913 __ Move(LoadDescriptor::NameRegister(), r3); |
2932 __ pop(LoadDescriptor::ReceiverRegister()); | 2914 __ pop(LoadDescriptor::ReceiverRegister()); |
2933 EmitKeyedPropertyLoad(expr); | 2915 EmitKeyedPropertyLoad(expr); |
2934 } else { | 2916 } else { |
2935 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); | 2917 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); |
2936 VisitForStackValue( | 2918 VisitForStackValue( |
2937 expr->obj()->AsSuperPropertyReference()->home_object_var()); | 2919 expr->obj()->AsSuperPropertyReference()->home_object()); |
2938 VisitForStackValue(expr->key()); | 2920 VisitForStackValue(expr->key()); |
2939 EmitKeyedSuperPropertyLoad(expr); | 2921 EmitKeyedSuperPropertyLoad(expr); |
2940 } | 2922 } |
2941 } | 2923 } |
2942 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2924 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2943 context()->Plug(r3); | 2925 context()->Plug(r3); |
2944 } | 2926 } |
2945 | 2927 |
2946 | 2928 |
2947 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { | 2929 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2990 DCHECK(callee->IsProperty()); | 2972 DCHECK(callee->IsProperty()); |
2991 Property* prop = callee->AsProperty(); | 2973 Property* prop = callee->AsProperty(); |
2992 DCHECK(prop->IsSuperAccess()); | 2974 DCHECK(prop->IsSuperAccess()); |
2993 | 2975 |
2994 SetSourcePosition(prop->position()); | 2976 SetSourcePosition(prop->position()); |
2995 Literal* key = prop->key()->AsLiteral(); | 2977 Literal* key = prop->key()->AsLiteral(); |
2996 DCHECK(!key->value()->IsSmi()); | 2978 DCHECK(!key->value()->IsSmi()); |
2997 // Load the function from the receiver. | 2979 // Load the function from the receiver. |
2998 const Register scratch = r4; | 2980 const Register scratch = r4; |
2999 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); | 2981 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); |
3000 VisitForAccumulatorValue(super_ref->home_object_var()); | 2982 VisitForAccumulatorValue(super_ref->home_object()); |
3001 __ mr(scratch, r3); | 2983 __ mr(scratch, r3); |
3002 VisitForAccumulatorValue(super_ref->this_var()); | 2984 VisitForAccumulatorValue(super_ref->this_var()); |
3003 __ Push(scratch, r3, r3, scratch); | 2985 __ Push(scratch, r3, r3, scratch); |
3004 __ Push(key->value()); | 2986 __ Push(key->value()); |
3005 | 2987 |
3006 // Stack here: | 2988 // Stack here: |
3007 // - home_object | 2989 // - home_object |
3008 // - this (receiver) | 2990 // - this (receiver) |
3009 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2991 // - this (receiver) <-- LoadFromSuper will pop here and below. |
3010 // - home_object | 2992 // - home_object |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3047 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 3029 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
3048 Expression* callee = expr->expression(); | 3030 Expression* callee = expr->expression(); |
3049 DCHECK(callee->IsProperty()); | 3031 DCHECK(callee->IsProperty()); |
3050 Property* prop = callee->AsProperty(); | 3032 Property* prop = callee->AsProperty(); |
3051 DCHECK(prop->IsSuperAccess()); | 3033 DCHECK(prop->IsSuperAccess()); |
3052 | 3034 |
3053 SetSourcePosition(prop->position()); | 3035 SetSourcePosition(prop->position()); |
3054 // Load the function from the receiver. | 3036 // Load the function from the receiver. |
3055 const Register scratch = r4; | 3037 const Register scratch = r4; |
3056 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); | 3038 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); |
3057 VisitForAccumulatorValue(super_ref->home_object_var()); | 3039 VisitForAccumulatorValue(super_ref->home_object()); |
3058 __ mr(scratch, r3); | 3040 __ mr(scratch, r3); |
3059 VisitForAccumulatorValue(super_ref->this_var()); | 3041 VisitForAccumulatorValue(super_ref->this_var()); |
3060 __ Push(scratch, r3, r3, scratch); | 3042 __ Push(scratch, r3, r3, scratch); |
3061 VisitForStackValue(prop->key()); | 3043 VisitForStackValue(prop->key()); |
3062 | 3044 |
3063 // Stack here: | 3045 // Stack here: |
3064 // - home_object | 3046 // - home_object |
3065 // - this (receiver) | 3047 // - this (receiver) |
3066 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 3048 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
3067 // - home_object | 3049 // - home_object |
(...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4935 // Put the object both on the stack and in the register. | 4917 // Put the object both on the stack and in the register. |
4936 VisitForStackValue(prop->obj()); | 4918 VisitForStackValue(prop->obj()); |
4937 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4919 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
4938 EmitNamedPropertyLoad(prop); | 4920 EmitNamedPropertyLoad(prop); |
4939 break; | 4921 break; |
4940 } | 4922 } |
4941 | 4923 |
4942 case NAMED_SUPER_PROPERTY: { | 4924 case NAMED_SUPER_PROPERTY: { |
4943 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 4925 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
4944 VisitForAccumulatorValue( | 4926 VisitForAccumulatorValue( |
4945 prop->obj()->AsSuperPropertyReference()->home_object_var()); | 4927 prop->obj()->AsSuperPropertyReference()->home_object()); |
4946 __ Push(result_register()); | 4928 __ Push(result_register()); |
4947 const Register scratch = r4; | 4929 const Register scratch = r4; |
4948 __ LoadP(scratch, MemOperand(sp, kPointerSize)); | 4930 __ LoadP(scratch, MemOperand(sp, kPointerSize)); |
4949 __ Push(scratch, result_register()); | 4931 __ Push(scratch, result_register()); |
4950 EmitNamedSuperPropertyLoad(prop); | 4932 EmitNamedSuperPropertyLoad(prop); |
4951 break; | 4933 break; |
4952 } | 4934 } |
4953 | 4935 |
4954 case KEYED_SUPER_PROPERTY: { | 4936 case KEYED_SUPER_PROPERTY: { |
4955 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); | 4937 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); |
4956 VisitForAccumulatorValue( | 4938 VisitForAccumulatorValue( |
4957 prop->obj()->AsSuperPropertyReference()->home_object_var()); | 4939 prop->obj()->AsSuperPropertyReference()->home_object()); |
4958 const Register scratch = r4; | 4940 const Register scratch = r4; |
4959 const Register scratch1 = r5; | 4941 const Register scratch1 = r5; |
4960 __ mr(scratch, result_register()); | 4942 __ mr(scratch, result_register()); |
4961 VisitForAccumulatorValue(prop->key()); | 4943 VisitForAccumulatorValue(prop->key()); |
4962 __ Push(scratch, result_register()); | 4944 __ Push(scratch, result_register()); |
4963 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); | 4945 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize)); |
4964 __ Push(scratch1, scratch, result_register()); | 4946 __ Push(scratch1, scratch, result_register()); |
4965 EmitKeyedSuperPropertyLoad(prop); | 4947 EmitKeyedSuperPropertyLoad(prop); |
4966 break; | 4948 break; |
4967 } | 4949 } |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5564 return ON_STACK_REPLACEMENT; | 5546 return ON_STACK_REPLACEMENT; |
5565 } | 5547 } |
5566 | 5548 |
5567 DCHECK(interrupt_address == | 5549 DCHECK(interrupt_address == |
5568 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5550 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5569 return OSR_AFTER_STACK_CHECK; | 5551 return OSR_AFTER_STACK_CHECK; |
5570 } | 5552 } |
5571 } // namespace internal | 5553 } // namespace internal |
5572 } // namespace v8 | 5554 } // namespace v8 |
5573 #endif // V8_TARGET_ARCH_PPC | 5555 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |