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/crankshaft/ppc/lithium-codegen-ppc.h" | 5 #include "src/crankshaft/ppc/lithium-codegen-ppc.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/crankshaft/hydrogen-osr.h" | 10 #include "src/crankshaft/hydrogen-osr.h" |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 int num_parameters = scope()->num_parameters(); | 196 int num_parameters = scope()->num_parameters(); |
197 int first_parameter = scope()->has_this_declaration() ? -1 : 0; | 197 int first_parameter = scope()->has_this_declaration() ? -1 : 0; |
198 for (int i = first_parameter; i < num_parameters; i++) { | 198 for (int i = first_parameter; i < num_parameters; i++) { |
199 Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); | 199 Variable* var = (i == -1) ? scope()->receiver() : scope()->parameter(i); |
200 if (var->IsContextSlot()) { | 200 if (var->IsContextSlot()) { |
201 int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 201 int parameter_offset = StandardFrameConstants::kCallerSPOffset + |
202 (num_parameters - 1 - i) * kPointerSize; | 202 (num_parameters - 1 - i) * kPointerSize; |
203 // Load parameter from stack. | 203 // Load parameter from stack. |
204 __ LoadP(r3, MemOperand(fp, parameter_offset)); | 204 __ LoadP(r3, MemOperand(fp, parameter_offset)); |
205 // Store it in the context. | 205 // Store it in the context. |
206 MemOperand target = ContextOperand(cp, var->index()); | 206 MemOperand target = ContextMemOperand(cp, var->index()); |
207 __ StoreP(r3, target, r0); | 207 __ StoreP(r3, target, r0); |
208 // Update the write barrier. This clobbers r6 and r3. | 208 // Update the write barrier. This clobbers r6 and r3. |
209 if (need_write_barrier) { | 209 if (need_write_barrier) { |
210 __ RecordWriteContextSlot(cp, target.offset(), r3, r6, | 210 __ RecordWriteContextSlot(cp, target.offset(), r3, r6, |
211 GetLinkRegisterState(), kSaveFPRegs); | 211 GetLinkRegisterState(), kSaveFPRegs); |
212 } else if (FLAG_debug_code) { | 212 } else if (FLAG_debug_code) { |
213 Label done; | 213 Label done; |
214 __ JumpIfInNewSpace(cp, r3, &done); | 214 __ JumpIfInNewSpace(cp, r3, &done); |
215 __ Abort(kExpectedNewSpaceObject); | 215 __ Abort(kExpectedNewSpaceObject); |
216 __ bind(&done); | 216 __ bind(&done); |
(...skipping 2675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2892 Handle<Code> ic = | 2892 Handle<Code> ic = |
2893 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), | 2893 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), |
2894 SLOPPY, PREMONOMORPHIC).code(); | 2894 SLOPPY, PREMONOMORPHIC).code(); |
2895 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2895 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2896 } | 2896 } |
2897 | 2897 |
2898 | 2898 |
2899 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 2899 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
2900 Register context = ToRegister(instr->context()); | 2900 Register context = ToRegister(instr->context()); |
2901 Register result = ToRegister(instr->result()); | 2901 Register result = ToRegister(instr->result()); |
2902 __ LoadP(result, ContextOperand(context, instr->slot_index())); | 2902 __ LoadP(result, ContextMemOperand(context, instr->slot_index())); |
2903 if (instr->hydrogen()->RequiresHoleCheck()) { | 2903 if (instr->hydrogen()->RequiresHoleCheck()) { |
2904 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 2904 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
2905 if (instr->hydrogen()->DeoptimizesOnHole()) { | 2905 if (instr->hydrogen()->DeoptimizesOnHole()) { |
2906 __ cmp(result, ip); | 2906 __ cmp(result, ip); |
2907 DeoptimizeIf(eq, instr, Deoptimizer::kHole); | 2907 DeoptimizeIf(eq, instr, Deoptimizer::kHole); |
2908 } else { | 2908 } else { |
2909 if (CpuFeatures::IsSupported(ISELECT)) { | 2909 if (CpuFeatures::IsSupported(ISELECT)) { |
2910 Register scratch = scratch0(); | 2910 Register scratch = scratch0(); |
2911 __ mov(scratch, Operand(factory()->undefined_value())); | 2911 __ mov(scratch, Operand(factory()->undefined_value())); |
2912 __ cmp(result, ip); | 2912 __ cmp(result, ip); |
2913 __ isel(eq, result, scratch, result); | 2913 __ isel(eq, result, scratch, result); |
2914 } else { | 2914 } else { |
2915 Label skip; | 2915 Label skip; |
2916 __ cmp(result, ip); | 2916 __ cmp(result, ip); |
2917 __ bne(&skip); | 2917 __ bne(&skip); |
2918 __ mov(result, Operand(factory()->undefined_value())); | 2918 __ mov(result, Operand(factory()->undefined_value())); |
2919 __ bind(&skip); | 2919 __ bind(&skip); |
2920 } | 2920 } |
2921 } | 2921 } |
2922 } | 2922 } |
2923 } | 2923 } |
2924 | 2924 |
2925 | 2925 |
2926 void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) { | 2926 void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) { |
2927 Register context = ToRegister(instr->context()); | 2927 Register context = ToRegister(instr->context()); |
2928 Register value = ToRegister(instr->value()); | 2928 Register value = ToRegister(instr->value()); |
2929 Register scratch = scratch0(); | 2929 Register scratch = scratch0(); |
2930 MemOperand target = ContextOperand(context, instr->slot_index()); | 2930 MemOperand target = ContextMemOperand(context, instr->slot_index()); |
2931 | 2931 |
2932 Label skip_assignment; | 2932 Label skip_assignment; |
2933 | 2933 |
2934 if (instr->hydrogen()->RequiresHoleCheck()) { | 2934 if (instr->hydrogen()->RequiresHoleCheck()) { |
2935 __ LoadP(scratch, target); | 2935 __ LoadP(scratch, target); |
2936 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 2936 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
2937 __ cmp(scratch, ip); | 2937 __ cmp(scratch, ip); |
2938 if (instr->hydrogen()->DeoptimizesOnHole()) { | 2938 if (instr->hydrogen()->DeoptimizesOnHole()) { |
2939 DeoptimizeIf(eq, instr, Deoptimizer::kHole); | 2939 DeoptimizeIf(eq, instr, Deoptimizer::kHole); |
2940 } else { | 2940 } else { |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3462 | 3462 |
3463 // Deoptimize if the receiver is not a JS object. | 3463 // Deoptimize if the receiver is not a JS object. |
3464 __ TestIfSmi(receiver, r0); | 3464 __ TestIfSmi(receiver, r0); |
3465 DeoptimizeIf(eq, instr, Deoptimizer::kSmi, cr0); | 3465 DeoptimizeIf(eq, instr, Deoptimizer::kSmi, cr0); |
3466 __ CompareObjectType(receiver, scratch, scratch, FIRST_JS_RECEIVER_TYPE); | 3466 __ CompareObjectType(receiver, scratch, scratch, FIRST_JS_RECEIVER_TYPE); |
3467 DeoptimizeIf(lt, instr, Deoptimizer::kNotAJavaScriptObject); | 3467 DeoptimizeIf(lt, instr, Deoptimizer::kNotAJavaScriptObject); |
3468 | 3468 |
3469 __ b(&result_in_receiver); | 3469 __ b(&result_in_receiver); |
3470 __ bind(&global_object); | 3470 __ bind(&global_object); |
3471 __ LoadP(result, FieldMemOperand(function, JSFunction::kContextOffset)); | 3471 __ LoadP(result, FieldMemOperand(function, JSFunction::kContextOffset)); |
3472 __ LoadP(result, ContextOperand(result, Context::GLOBAL_OBJECT_INDEX)); | 3472 __ LoadP(result, ContextMemOperand(result, Context::NATIVE_CONTEXT_INDEX)); |
3473 __ LoadP(result, FieldMemOperand(result, JSGlobalObject::kGlobalProxyOffset)); | 3473 __ LoadP(result, ContextMemOperand(result, Context::GLOBAL_PROXY_INDEX)); |
| 3474 |
3474 if (result.is(receiver)) { | 3475 if (result.is(receiver)) { |
3475 __ bind(&result_in_receiver); | 3476 __ bind(&result_in_receiver); |
3476 } else { | 3477 } else { |
3477 Label result_ok; | 3478 Label result_ok; |
3478 __ b(&result_ok); | 3479 __ b(&result_ok); |
3479 __ bind(&result_in_receiver); | 3480 __ bind(&result_in_receiver); |
3480 __ mr(result, receiver); | 3481 __ mr(result, receiver); |
3481 __ bind(&result_ok); | 3482 __ bind(&result_ok); |
3482 } | 3483 } |
3483 } | 3484 } |
(...skipping 2508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5992 __ Push(scope_info); | 5993 __ Push(scope_info); |
5993 __ push(ToRegister(instr->function())); | 5994 __ push(ToRegister(instr->function())); |
5994 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5995 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5995 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5996 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5996 } | 5997 } |
5997 | 5998 |
5998 | 5999 |
5999 #undef __ | 6000 #undef __ |
6000 } // namespace internal | 6001 } // namespace internal |
6001 } // namespace v8 | 6002 } // namespace v8 |
OLD | NEW |