| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include "src/crankshaft/s390/lithium-codegen-s390.h" | 6 #include "src/crankshaft/s390/lithium-codegen-s390.h" |
| 7 | 7 |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/builtins/builtins-constructor.h" | 9 #include "src/builtins/builtins-constructor.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 ";;; <@%d,#%d> " | 268 ";;; <@%d,#%d> " |
| 269 "-------------------- Deferred %s --------------------", | 269 "-------------------- Deferred %s --------------------", |
| 270 code->instruction_index(), code->instr()->hydrogen_value()->id(), | 270 code->instruction_index(), code->instr()->hydrogen_value()->id(), |
| 271 code->instr()->Mnemonic()); | 271 code->instr()->Mnemonic()); |
| 272 __ bind(code->entry()); | 272 __ bind(code->entry()); |
| 273 if (NeedsDeferredFrame()) { | 273 if (NeedsDeferredFrame()) { |
| 274 Comment(";;; Build frame"); | 274 Comment(";;; Build frame"); |
| 275 DCHECK(!frame_is_built_); | 275 DCHECK(!frame_is_built_); |
| 276 DCHECK(info()->IsStub()); | 276 DCHECK(info()->IsStub()); |
| 277 frame_is_built_ = true; | 277 frame_is_built_ = true; |
| 278 __ LoadSmiLiteral(scratch0(), Smi::FromInt(StackFrame::STUB)); | 278 __ Load(scratch0(), |
| 279 Operand(StackFrame::TypeToMarker(StackFrame::STUB))); |
| 279 __ PushCommonFrame(scratch0()); | 280 __ PushCommonFrame(scratch0()); |
| 280 Comment(";;; Deferred code"); | 281 Comment(";;; Deferred code"); |
| 281 } | 282 } |
| 282 code->Generate(); | 283 code->Generate(); |
| 283 if (NeedsDeferredFrame()) { | 284 if (NeedsDeferredFrame()) { |
| 284 Comment(";;; Destroy frame"); | 285 Comment(";;; Destroy frame"); |
| 285 DCHECK(frame_is_built_); | 286 DCHECK(frame_is_built_); |
| 286 __ PopCommonFrame(scratch0()); | 287 __ PopCommonFrame(scratch0()); |
| 287 frame_is_built_ = false; | 288 frame_is_built_ = false; |
| 288 } | 289 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 __ b(r14, &call_deopt_entry); | 338 __ b(r14, &call_deopt_entry); |
| 338 } | 339 } |
| 339 } | 340 } |
| 340 | 341 |
| 341 if (needs_frame.is_linked()) { | 342 if (needs_frame.is_linked()) { |
| 342 __ bind(&needs_frame); | 343 __ bind(&needs_frame); |
| 343 // This variant of deopt can only be used with stubs. Since we don't | 344 // This variant of deopt can only be used with stubs. Since we don't |
| 344 // have a function pointer to install in the stack frame that we're | 345 // have a function pointer to install in the stack frame that we're |
| 345 // building, install a special marker there instead. | 346 // building, install a special marker there instead. |
| 346 DCHECK(info()->IsStub()); | 347 DCHECK(info()->IsStub()); |
| 347 __ LoadSmiLiteral(ip, Smi::FromInt(StackFrame::STUB)); | 348 __ Load(ip, Operand(StackFrame::TypeToMarker(StackFrame::STUB))); |
| 348 __ push(ip); | 349 __ push(ip); |
| 349 DCHECK(info()->IsStub()); | 350 DCHECK(info()->IsStub()); |
| 350 } | 351 } |
| 351 | 352 |
| 352 Comment(";;; call deopt"); | 353 Comment(";;; call deopt"); |
| 353 __ bind(&call_deopt_entry); | 354 __ bind(&call_deopt_entry); |
| 354 | 355 |
| 355 if (info()->saves_caller_doubles()) { | 356 if (info()->saves_caller_doubles()) { |
| 356 DCHECK(info()->IsStub()); | 357 DCHECK(info()->IsStub()); |
| 357 RestoreCallerDoubles(); | 358 RestoreCallerDoubles(); |
| (...skipping 2730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3088 | 3089 |
| 3089 if (instr->hydrogen()->from_inlined()) { | 3090 if (instr->hydrogen()->from_inlined()) { |
| 3090 __ lay(result, MemOperand(sp, -2 * kPointerSize)); | 3091 __ lay(result, MemOperand(sp, -2 * kPointerSize)); |
| 3091 } else if (instr->hydrogen()->arguments_adaptor()) { | 3092 } else if (instr->hydrogen()->arguments_adaptor()) { |
| 3092 // Check if the calling frame is an arguments adaptor frame. | 3093 // Check if the calling frame is an arguments adaptor frame. |
| 3093 Label done, adapted; | 3094 Label done, adapted; |
| 3094 __ LoadP(scratch, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 3095 __ LoadP(scratch, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 3095 __ LoadP( | 3096 __ LoadP( |
| 3096 result, | 3097 result, |
| 3097 MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset)); | 3098 MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset)); |
| 3098 __ LoadSmiLiteral(r0, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 3099 __ CmpP(result, |
| 3099 __ CmpP(result, r0); | 3100 Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); |
| 3100 | 3101 |
| 3101 // Result is the frame pointer for the frame if not adapted and for the real | 3102 // Result is the frame pointer for the frame if not adapted and for the real |
| 3102 // frame below the adaptor frame if adapted. | 3103 // frame below the adaptor frame if adapted. |
| 3103 __ beq(&adapted, Label::kNear); | 3104 __ beq(&adapted, Label::kNear); |
| 3104 __ LoadRR(result, fp); | 3105 __ LoadRR(result, fp); |
| 3105 __ b(&done, Label::kNear); | 3106 __ b(&done, Label::kNear); |
| 3106 | 3107 |
| 3107 __ bind(&adapted); | 3108 __ bind(&adapted); |
| 3108 __ LoadRR(result, scratch); | 3109 __ LoadRR(result, scratch); |
| 3109 __ bind(&done); | 3110 __ bind(&done); |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3666 Comment(";;; PrepareForTailCall, actual: %d {", actual.immediate()); | 3667 Comment(";;; PrepareForTailCall, actual: %d {", actual.immediate()); |
| 3667 } | 3668 } |
| 3668 } | 3669 } |
| 3669 | 3670 |
| 3670 // Check if next frame is an arguments adaptor frame. | 3671 // Check if next frame is an arguments adaptor frame. |
| 3671 Register caller_args_count_reg = scratch1; | 3672 Register caller_args_count_reg = scratch1; |
| 3672 Label no_arguments_adaptor, formal_parameter_count_loaded; | 3673 Label no_arguments_adaptor, formal_parameter_count_loaded; |
| 3673 __ LoadP(scratch2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 3674 __ LoadP(scratch2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 3674 __ LoadP(scratch3, | 3675 __ LoadP(scratch3, |
| 3675 MemOperand(scratch2, StandardFrameConstants::kContextOffset)); | 3676 MemOperand(scratch2, StandardFrameConstants::kContextOffset)); |
| 3676 __ CmpSmiLiteral(scratch3, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 3677 __ CmpP(scratch3, |
| 3678 Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); |
| 3677 __ bne(&no_arguments_adaptor); | 3679 __ bne(&no_arguments_adaptor); |
| 3678 | 3680 |
| 3679 // Drop current frame and load arguments count from arguments adaptor frame. | 3681 // Drop current frame and load arguments count from arguments adaptor frame. |
| 3680 __ LoadRR(fp, scratch2); | 3682 __ LoadRR(fp, scratch2); |
| 3681 __ LoadP(caller_args_count_reg, | 3683 __ LoadP(caller_args_count_reg, |
| 3682 MemOperand(fp, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 3684 MemOperand(fp, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 3683 __ SmiUntag(caller_args_count_reg); | 3685 __ SmiUntag(caller_args_count_reg); |
| 3684 __ b(&formal_parameter_count_loaded); | 3686 __ b(&formal_parameter_count_loaded); |
| 3685 | 3687 |
| 3686 __ bind(&no_arguments_adaptor); | 3688 __ bind(&no_arguments_adaptor); |
| (...skipping 1919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5606 __ LoadP(result, | 5608 __ LoadP(result, |
| 5607 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5609 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
| 5608 __ bind(deferred->exit()); | 5610 __ bind(deferred->exit()); |
| 5609 __ bind(&done); | 5611 __ bind(&done); |
| 5610 } | 5612 } |
| 5611 | 5613 |
| 5612 #undef __ | 5614 #undef __ |
| 5613 | 5615 |
| 5614 } // namespace internal | 5616 } // namespace internal |
| 5615 } // namespace v8 | 5617 } // namespace v8 |
| OLD | NEW |