| 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/builtins/builtins-constructor.h" | 8 #include "src/builtins/builtins-constructor.h" |
| 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 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 ";;; <@%d,#%d> " | 280 ";;; <@%d,#%d> " |
| 281 "-------------------- Deferred %s --------------------", | 281 "-------------------- Deferred %s --------------------", |
| 282 code->instruction_index(), code->instr()->hydrogen_value()->id(), | 282 code->instruction_index(), code->instr()->hydrogen_value()->id(), |
| 283 code->instr()->Mnemonic()); | 283 code->instr()->Mnemonic()); |
| 284 __ bind(code->entry()); | 284 __ bind(code->entry()); |
| 285 if (NeedsDeferredFrame()) { | 285 if (NeedsDeferredFrame()) { |
| 286 Comment(";;; Build frame"); | 286 Comment(";;; Build frame"); |
| 287 DCHECK(!frame_is_built_); | 287 DCHECK(!frame_is_built_); |
| 288 DCHECK(info()->IsStub()); | 288 DCHECK(info()->IsStub()); |
| 289 frame_is_built_ = true; | 289 frame_is_built_ = true; |
| 290 __ LoadSmiLiteral(scratch0(), Smi::FromInt(StackFrame::STUB)); | 290 __ mov(scratch0(), Operand(StackFrame::TypeToMarker(StackFrame::STUB))); |
| 291 __ PushCommonFrame(scratch0()); | 291 __ PushCommonFrame(scratch0()); |
| 292 Comment(";;; Deferred code"); | 292 Comment(";;; Deferred code"); |
| 293 } | 293 } |
| 294 code->Generate(); | 294 code->Generate(); |
| 295 if (NeedsDeferredFrame()) { | 295 if (NeedsDeferredFrame()) { |
| 296 Comment(";;; Destroy frame"); | 296 Comment(";;; Destroy frame"); |
| 297 DCHECK(frame_is_built_); | 297 DCHECK(frame_is_built_); |
| 298 __ PopCommonFrame(scratch0()); | 298 __ PopCommonFrame(scratch0()); |
| 299 frame_is_built_ = false; | 299 frame_is_built_ = false; |
| 300 } | 300 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 } else { | 349 } else { |
| 350 __ b(&call_deopt_entry, SetLK); | 350 __ b(&call_deopt_entry, SetLK); |
| 351 } | 351 } |
| 352 } | 352 } |
| 353 | 353 |
| 354 if (needs_frame.is_linked()) { | 354 if (needs_frame.is_linked()) { |
| 355 __ bind(&needs_frame); | 355 __ bind(&needs_frame); |
| 356 // This variant of deopt can only be used with stubs. Since we don't | 356 // This variant of deopt can only be used with stubs. Since we don't |
| 357 // have a function pointer to install in the stack frame that we're | 357 // have a function pointer to install in the stack frame that we're |
| 358 // building, install a special marker there instead. | 358 // building, install a special marker there instead. |
| 359 __ LoadSmiLiteral(ip, Smi::FromInt(StackFrame::STUB)); | 359 __ mov(ip, Operand(StackFrame::TypeToMarker(StackFrame::STUB))); |
| 360 __ push(ip); | 360 __ push(ip); |
| 361 DCHECK(info()->IsStub()); | 361 DCHECK(info()->IsStub()); |
| 362 } | 362 } |
| 363 | 363 |
| 364 Comment(";;; call deopt"); | 364 Comment(";;; call deopt"); |
| 365 __ bind(&call_deopt_entry); | 365 __ bind(&call_deopt_entry); |
| 366 | 366 |
| 367 if (info()->saves_caller_doubles()) { | 367 if (info()->saves_caller_doubles()) { |
| 368 DCHECK(info()->IsStub()); | 368 DCHECK(info()->IsStub()); |
| 369 RestoreCallerDoubles(); | 369 RestoreCallerDoubles(); |
| (...skipping 2752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3122 Register result = ToRegister(instr->result()); | 3122 Register result = ToRegister(instr->result()); |
| 3123 | 3123 |
| 3124 if (instr->hydrogen()->from_inlined()) { | 3124 if (instr->hydrogen()->from_inlined()) { |
| 3125 __ subi(result, sp, Operand(2 * kPointerSize)); | 3125 __ subi(result, sp, Operand(2 * kPointerSize)); |
| 3126 } else if (instr->hydrogen()->arguments_adaptor()) { | 3126 } else if (instr->hydrogen()->arguments_adaptor()) { |
| 3127 // Check if the calling frame is an arguments adaptor frame. | 3127 // Check if the calling frame is an arguments adaptor frame. |
| 3128 __ LoadP(scratch, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 3128 __ LoadP(scratch, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 3129 __ LoadP( | 3129 __ LoadP( |
| 3130 result, | 3130 result, |
| 3131 MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset)); | 3131 MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset)); |
| 3132 __ CmpSmiLiteral(result, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 3132 __ cmpi(result, |
| 3133 Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); |
| 3133 | 3134 |
| 3134 // Result is the frame pointer for the frame if not adapted and for the real | 3135 // Result is the frame pointer for the frame if not adapted and for the real |
| 3135 // frame below the adaptor frame if adapted. | 3136 // frame below the adaptor frame if adapted. |
| 3136 if (CpuFeatures::IsSupported(ISELECT)) { | 3137 if (CpuFeatures::IsSupported(ISELECT)) { |
| 3137 __ isel(eq, result, scratch, fp); | 3138 __ isel(eq, result, scratch, fp); |
| 3138 } else { | 3139 } else { |
| 3139 Label done, adapted; | 3140 Label done, adapted; |
| 3140 __ beq(&adapted); | 3141 __ beq(&adapted); |
| 3141 __ mr(result, fp); | 3142 __ mr(result, fp); |
| 3142 __ b(&done); | 3143 __ b(&done); |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3760 Comment(";;; PrepareForTailCall, actual: %d {", actual.immediate()); | 3761 Comment(";;; PrepareForTailCall, actual: %d {", actual.immediate()); |
| 3761 } | 3762 } |
| 3762 } | 3763 } |
| 3763 | 3764 |
| 3764 // Check if next frame is an arguments adaptor frame. | 3765 // Check if next frame is an arguments adaptor frame. |
| 3765 Register caller_args_count_reg = scratch1; | 3766 Register caller_args_count_reg = scratch1; |
| 3766 Label no_arguments_adaptor, formal_parameter_count_loaded; | 3767 Label no_arguments_adaptor, formal_parameter_count_loaded; |
| 3767 __ LoadP(scratch2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 3768 __ LoadP(scratch2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 3768 __ LoadP(scratch3, | 3769 __ LoadP(scratch3, |
| 3769 MemOperand(scratch2, StandardFrameConstants::kContextOffset)); | 3770 MemOperand(scratch2, StandardFrameConstants::kContextOffset)); |
| 3770 __ CmpSmiLiteral(scratch3, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 3771 __ cmpi(scratch3, |
| 3772 Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); |
| 3771 __ bne(&no_arguments_adaptor); | 3773 __ bne(&no_arguments_adaptor); |
| 3772 | 3774 |
| 3773 // Drop current frame and load arguments count from arguments adaptor frame. | 3775 // Drop current frame and load arguments count from arguments adaptor frame. |
| 3774 __ mr(fp, scratch2); | 3776 __ mr(fp, scratch2); |
| 3775 __ LoadP(caller_args_count_reg, | 3777 __ LoadP(caller_args_count_reg, |
| 3776 MemOperand(fp, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 3778 MemOperand(fp, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 3777 __ SmiUntag(caller_args_count_reg); | 3779 __ SmiUntag(caller_args_count_reg); |
| 3778 __ b(&formal_parameter_count_loaded); | 3780 __ b(&formal_parameter_count_loaded); |
| 3779 | 3781 |
| 3780 __ bind(&no_arguments_adaptor); | 3782 __ bind(&no_arguments_adaptor); |
| (...skipping 1898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5679 __ LoadP(result, | 5681 __ LoadP(result, |
| 5680 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5682 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
| 5681 __ bind(deferred->exit()); | 5683 __ bind(deferred->exit()); |
| 5682 __ bind(&done); | 5684 __ bind(&done); |
| 5683 } | 5685 } |
| 5684 | 5686 |
| 5685 #undef __ | 5687 #undef __ |
| 5686 | 5688 |
| 5687 } // namespace internal | 5689 } // namespace internal |
| 5688 } // namespace v8 | 5690 } // namespace v8 |
| OLD | NEW |