| 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 |