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 #if V8_TARGET_ARCH_PPC | 5 #if V8_TARGET_ARCH_PPC |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/debug/debug.h" | 10 #include "src/debug/debug.h" |
(...skipping 2071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2082 __ LoadP(load_receiver, MemOperand(sp, kPointerSize)); | 2082 __ LoadP(load_receiver, MemOperand(sp, kPointerSize)); |
2083 __ LoadP(load_name, MemOperand(sp, 2 * kPointerSize)); | 2083 __ LoadP(load_name, MemOperand(sp, 2 * kPointerSize)); |
2084 __ mov(LoadDescriptor::SlotRegister(), | 2084 __ mov(LoadDescriptor::SlotRegister(), |
2085 Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot()))); | 2085 Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot()))); |
2086 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate(), SLOPPY).code(); | 2086 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate(), SLOPPY).code(); |
2087 CallIC(ic, TypeFeedbackId::None()); | 2087 CallIC(ic, TypeFeedbackId::None()); |
2088 __ mr(r4, r3); | 2088 __ mr(r4, r3); |
2089 __ StoreP(r4, MemOperand(sp, 2 * kPointerSize)); | 2089 __ StoreP(r4, MemOperand(sp, 2 * kPointerSize)); |
2090 SetCallPosition(expr, 1); | 2090 SetCallPosition(expr, 1); |
2091 __ li(r3, Operand(1)); | 2091 __ li(r3, Operand(1)); |
2092 __ Call(isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | 2092 __ Call( |
| 2093 isolate()->builtins()->Call(ConvertReceiverMode::kNotNullOrUndefined), |
| 2094 RelocInfo::CODE_TARGET); |
2093 | 2095 |
2094 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2096 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
2095 __ Drop(1); // The function is still on the stack; drop it. | 2097 __ Drop(1); // The function is still on the stack; drop it. |
2096 | 2098 |
2097 // if (!result.done) goto l_try; | 2099 // if (!result.done) goto l_try; |
2098 __ Move(load_receiver, r3); | 2100 __ Move(load_receiver, r3); |
2099 | 2101 |
2100 __ push(load_receiver); // save result | 2102 __ push(load_receiver); // save result |
2101 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" | 2103 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" |
2102 __ mov(LoadDescriptor::SlotRegister(), | 2104 __ mov(LoadDescriptor::SlotRegister(), |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2808 ic_total_count_++; | 2810 ic_total_count_++; |
2809 __ Call(code, RelocInfo::CODE_TARGET, ast_id); | 2811 __ Call(code, RelocInfo::CODE_TARGET, ast_id); |
2810 } | 2812 } |
2811 | 2813 |
2812 | 2814 |
2813 // Code common for calls using the IC. | 2815 // Code common for calls using the IC. |
2814 void FullCodeGenerator::EmitCallWithLoadIC(Call* expr) { | 2816 void FullCodeGenerator::EmitCallWithLoadIC(Call* expr) { |
2815 Expression* callee = expr->expression(); | 2817 Expression* callee = expr->expression(); |
2816 | 2818 |
2817 // Get the target function. | 2819 // Get the target function. |
| 2820 ConvertReceiverMode convert_mode; |
2818 if (callee->IsVariableProxy()) { | 2821 if (callee->IsVariableProxy()) { |
2819 { | 2822 { |
2820 StackValueContext context(this); | 2823 StackValueContext context(this); |
2821 EmitVariableLoad(callee->AsVariableProxy()); | 2824 EmitVariableLoad(callee->AsVariableProxy()); |
2822 PrepareForBailout(callee, NO_REGISTERS); | 2825 PrepareForBailout(callee, NO_REGISTERS); |
2823 } | 2826 } |
2824 // Push undefined as receiver. This is patched in the method prologue if it | 2827 // Push undefined as receiver. This is patched in the method prologue if it |
2825 // is a sloppy mode method. | 2828 // is a sloppy mode method. |
2826 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); | 2829 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); |
2827 __ push(r0); | 2830 __ push(r0); |
| 2831 convert_mode = ConvertReceiverMode::kNullOrUndefined; |
2828 } else { | 2832 } else { |
2829 // Load the function from the receiver. | 2833 // Load the function from the receiver. |
2830 DCHECK(callee->IsProperty()); | 2834 DCHECK(callee->IsProperty()); |
2831 DCHECK(!callee->AsProperty()->IsSuperAccess()); | 2835 DCHECK(!callee->AsProperty()->IsSuperAccess()); |
2832 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 2836 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
2833 EmitNamedPropertyLoad(callee->AsProperty()); | 2837 EmitNamedPropertyLoad(callee->AsProperty()); |
2834 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); | 2838 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); |
2835 // Push the target function under the receiver. | 2839 // Push the target function under the receiver. |
2836 __ LoadP(r0, MemOperand(sp, 0)); | 2840 __ LoadP(r0, MemOperand(sp, 0)); |
2837 __ push(r0); | 2841 __ push(r0); |
2838 __ StoreP(r3, MemOperand(sp, kPointerSize)); | 2842 __ StoreP(r3, MemOperand(sp, kPointerSize)); |
| 2843 convert_mode = ConvertReceiverMode::kNotNullOrUndefined; |
2839 } | 2844 } |
2840 | 2845 |
2841 EmitCall(expr); | 2846 EmitCall(expr, convert_mode); |
2842 } | 2847 } |
2843 | 2848 |
2844 | 2849 |
2845 void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) { | 2850 void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) { |
2846 Expression* callee = expr->expression(); | 2851 Expression* callee = expr->expression(); |
2847 DCHECK(callee->IsProperty()); | 2852 DCHECK(callee->IsProperty()); |
2848 Property* prop = callee->AsProperty(); | 2853 Property* prop = callee->AsProperty(); |
2849 DCHECK(prop->IsSuperAccess()); | 2854 DCHECK(prop->IsSuperAccess()); |
2850 SetExpressionPosition(prop); | 2855 SetExpressionPosition(prop); |
2851 | 2856 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2892 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 2897 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
2893 __ Move(LoadDescriptor::NameRegister(), r3); | 2898 __ Move(LoadDescriptor::NameRegister(), r3); |
2894 EmitKeyedPropertyLoad(callee->AsProperty()); | 2899 EmitKeyedPropertyLoad(callee->AsProperty()); |
2895 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); | 2900 PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG); |
2896 | 2901 |
2897 // Push the target function under the receiver. | 2902 // Push the target function under the receiver. |
2898 __ LoadP(ip, MemOperand(sp, 0)); | 2903 __ LoadP(ip, MemOperand(sp, 0)); |
2899 __ push(ip); | 2904 __ push(ip); |
2900 __ StoreP(r3, MemOperand(sp, kPointerSize)); | 2905 __ StoreP(r3, MemOperand(sp, kPointerSize)); |
2901 | 2906 |
2902 EmitCall(expr); | 2907 EmitCall(expr, ConvertReceiverMode::kNotNullOrUndefined); |
2903 } | 2908 } |
2904 | 2909 |
2905 | 2910 |
2906 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2911 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
2907 Expression* callee = expr->expression(); | 2912 Expression* callee = expr->expression(); |
2908 DCHECK(callee->IsProperty()); | 2913 DCHECK(callee->IsProperty()); |
2909 Property* prop = callee->AsProperty(); | 2914 Property* prop = callee->AsProperty(); |
2910 DCHECK(prop->IsSuperAccess()); | 2915 DCHECK(prop->IsSuperAccess()); |
2911 | 2916 |
2912 SetExpressionPosition(prop); | 2917 SetExpressionPosition(prop); |
(...skipping 19 matching lines...) Expand all Loading... |
2932 // Replace home_object with target function. | 2937 // Replace home_object with target function. |
2933 __ StoreP(r3, MemOperand(sp, kPointerSize)); | 2938 __ StoreP(r3, MemOperand(sp, kPointerSize)); |
2934 | 2939 |
2935 // Stack here: | 2940 // Stack here: |
2936 // - target function | 2941 // - target function |
2937 // - this (receiver) | 2942 // - this (receiver) |
2938 EmitCall(expr); | 2943 EmitCall(expr); |
2939 } | 2944 } |
2940 | 2945 |
2941 | 2946 |
2942 void FullCodeGenerator::EmitCall(Call* expr) { | 2947 void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) { |
2943 // Load the arguments. | 2948 // Load the arguments. |
2944 ZoneList<Expression*>* args = expr->arguments(); | 2949 ZoneList<Expression*>* args = expr->arguments(); |
2945 int arg_count = args->length(); | 2950 int arg_count = args->length(); |
2946 for (int i = 0; i < arg_count; i++) { | 2951 for (int i = 0; i < arg_count; i++) { |
2947 VisitForStackValue(args->at(i)); | 2952 VisitForStackValue(args->at(i)); |
2948 } | 2953 } |
2949 | 2954 |
2950 PrepareForBailoutForId(expr->CallId(), NO_REGISTERS); | 2955 PrepareForBailoutForId(expr->CallId(), NO_REGISTERS); |
2951 SetCallPosition(expr, arg_count); | 2956 SetCallPosition(expr, arg_count); |
2952 Handle<Code> ic = CodeFactory::CallIC(isolate(), arg_count).code(); | 2957 Handle<Code> ic = CodeFactory::CallIC(isolate(), arg_count, mode).code(); |
2953 __ LoadSmiLiteral(r6, SmiFromSlot(expr->CallFeedbackICSlot())); | 2958 __ LoadSmiLiteral(r6, SmiFromSlot(expr->CallFeedbackICSlot())); |
2954 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0); | 2959 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0); |
2955 // Don't assign a type feedback id to the IC, since type feedback is provided | 2960 // Don't assign a type feedback id to the IC, since type feedback is provided |
2956 // by the vector above. | 2961 // by the vector above. |
2957 CallIC(ic); | 2962 CallIC(ic); |
2958 | 2963 |
2959 RecordJSReturnSite(expr); | 2964 RecordJSReturnSite(expr); |
2960 // Restore context register. | 2965 // Restore context register. |
2961 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2966 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
2962 context()->DropAndPlug(1, r3); | 2967 context()->DropAndPlug(1, r3); |
(...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4251 } | 4256 } |
4252 | 4257 |
4253 | 4258 |
4254 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) { | 4259 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) { |
4255 ZoneList<Expression*>* args = expr->arguments(); | 4260 ZoneList<Expression*>* args = expr->arguments(); |
4256 int arg_count = args->length(); | 4261 int arg_count = args->length(); |
4257 | 4262 |
4258 SetCallPosition(expr, arg_count); | 4263 SetCallPosition(expr, arg_count); |
4259 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0); | 4264 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0); |
4260 __ mov(r3, Operand(arg_count)); | 4265 __ mov(r3, Operand(arg_count)); |
4261 __ Call(isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | 4266 __ Call(isolate()->builtins()->Call(ConvertReceiverMode::kNullOrUndefined), |
| 4267 RelocInfo::CODE_TARGET); |
4262 } | 4268 } |
4263 | 4269 |
4264 | 4270 |
4265 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { | 4271 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
4266 ZoneList<Expression*>* args = expr->arguments(); | 4272 ZoneList<Expression*>* args = expr->arguments(); |
4267 int arg_count = args->length(); | 4273 int arg_count = args->length(); |
4268 | 4274 |
4269 if (expr->is_jsruntime()) { | 4275 if (expr->is_jsruntime()) { |
4270 Comment cmnt(masm_, "[ CallRuntime"); | 4276 Comment cmnt(masm_, "[ CallRuntime"); |
4271 EmitLoadJSRuntimeFunction(expr); | 4277 EmitLoadJSRuntimeFunction(expr); |
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5046 return ON_STACK_REPLACEMENT; | 5052 return ON_STACK_REPLACEMENT; |
5047 } | 5053 } |
5048 | 5054 |
5049 DCHECK(interrupt_address == | 5055 DCHECK(interrupt_address == |
5050 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5056 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5051 return OSR_AFTER_STACK_CHECK; | 5057 return OSR_AFTER_STACK_CHECK; |
5052 } | 5058 } |
5053 } // namespace internal | 5059 } // namespace internal |
5054 } // namespace v8 | 5060 } // namespace v8 |
5055 #endif // V8_TARGET_ARCH_PPC | 5061 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |