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