| 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/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 2658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2669 } | 2669 } |
| 2670 | 2670 |
| 2671 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2671 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
| 2672 DCHECK(ToRegister(instr->context()).is(cp)); | 2672 DCHECK(ToRegister(instr->context()).is(cp)); |
| 2673 DCHECK(ToRegister(instr->global_object()) | 2673 DCHECK(ToRegister(instr->global_object()) |
| 2674 .is(LoadDescriptor::ReceiverRegister())); | 2674 .is(LoadDescriptor::ReceiverRegister())); |
| 2675 DCHECK(ToRegister(instr->result()).is(r2)); | 2675 DCHECK(ToRegister(instr->result()).is(r2)); |
| 2676 | 2676 |
| 2677 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2677 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
| 2678 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 2678 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
| 2679 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( | 2679 Handle<Code> ic = |
| 2680 isolate(), instr->typeof_mode(), PREMONOMORPHIC) | 2680 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode()) |
| 2681 .code(); | 2681 .code(); |
| 2682 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2682 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2683 } | 2683 } |
| 2684 | 2684 |
| 2685 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 2685 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
| 2686 Register context = ToRegister(instr->context()); | 2686 Register context = ToRegister(instr->context()); |
| 2687 Register result = ToRegister(instr->result()); | 2687 Register result = ToRegister(instr->result()); |
| 2688 __ LoadP(result, ContextMemOperand(context, instr->slot_index())); | 2688 __ LoadP(result, ContextMemOperand(context, instr->slot_index())); |
| 2689 if (instr->hydrogen()->RequiresHoleCheck()) { | 2689 if (instr->hydrogen()->RequiresHoleCheck()) { |
| 2690 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); | 2690 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
| 2691 if (instr->hydrogen()->DeoptimizesOnHole()) { | 2691 if (instr->hydrogen()->DeoptimizesOnHole()) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2772 } | 2772 } |
| 2773 | 2773 |
| 2774 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 2774 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
| 2775 DCHECK(ToRegister(instr->context()).is(cp)); | 2775 DCHECK(ToRegister(instr->context()).is(cp)); |
| 2776 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 2776 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
| 2777 DCHECK(ToRegister(instr->result()).is(r2)); | 2777 DCHECK(ToRegister(instr->result()).is(r2)); |
| 2778 | 2778 |
| 2779 // Name is always in r4. | 2779 // Name is always in r4. |
| 2780 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2780 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
| 2781 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); | 2781 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
| 2782 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( | 2782 Handle<Code> ic = |
| 2783 isolate(), NOT_INSIDE_TYPEOF, | 2783 CodeFactory::LoadICInOptimizedCode(isolate(), NOT_INSIDE_TYPEOF).code(); |
| 2784 instr->hydrogen()->initialization_state()) | |
| 2785 .code(); | |
| 2786 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2784 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2787 } | 2785 } |
| 2788 | 2786 |
| 2789 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 2787 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
| 2790 Register scratch = scratch0(); | 2788 Register scratch = scratch0(); |
| 2791 Register function = ToRegister(instr->function()); | 2789 Register function = ToRegister(instr->function()); |
| 2792 Register result = ToRegister(instr->result()); | 2790 Register result = ToRegister(instr->result()); |
| 2793 | 2791 |
| 2794 // Get the prototype or initial map from the function. | 2792 // Get the prototype or initial map from the function. |
| 2795 __ LoadP(result, | 2793 __ LoadP(result, |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3122 __ AddP(scratch, Operand(base_offset)); | 3120 __ AddP(scratch, Operand(base_offset)); |
| 3123 base_offset = 0; | 3121 base_offset = 0; |
| 3124 } | 3122 } |
| 3125 return MemOperand(scratch, base, base_offset); | 3123 return MemOperand(scratch, base, base_offset); |
| 3126 } | 3124 } |
| 3127 | 3125 |
| 3128 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3126 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
| 3129 DCHECK(ToRegister(instr->context()).is(cp)); | 3127 DCHECK(ToRegister(instr->context()).is(cp)); |
| 3130 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 3128 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
| 3131 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); | 3129 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); |
| 3130 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
| 3132 | 3131 |
| 3133 if (instr->hydrogen()->HasVectorAndSlot()) { | 3132 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate()).code(); |
| 3134 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); | |
| 3135 } | |
| 3136 | |
| 3137 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode( | |
| 3138 isolate(), instr->hydrogen()->initialization_state()) | |
| 3139 .code(); | |
| 3140 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3133 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 3141 } | 3134 } |
| 3142 | 3135 |
| 3143 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3136 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
| 3144 Register scratch = scratch0(); | 3137 Register scratch = scratch0(); |
| 3145 Register result = ToRegister(instr->result()); | 3138 Register result = ToRegister(instr->result()); |
| 3146 | 3139 |
| 3147 if (instr->hydrogen()->from_inlined()) { | 3140 if (instr->hydrogen()->from_inlined()) { |
| 3148 __ lay(result, MemOperand(sp, -2 * kPointerSize)); | 3141 __ lay(result, MemOperand(sp, -2 * kPointerSize)); |
| 3149 } else if (instr->hydrogen()->arguments_adaptor()) { | 3142 } else if (instr->hydrogen()->arguments_adaptor()) { |
| (...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3983 EMIT_REMEMBERED_SET, hinstr->SmiCheckForWriteBarrier(), | 3976 EMIT_REMEMBERED_SET, hinstr->SmiCheckForWriteBarrier(), |
| 3984 hinstr->PointersToHereCheckForValue()); | 3977 hinstr->PointersToHereCheckForValue()); |
| 3985 } | 3978 } |
| 3986 } | 3979 } |
| 3987 | 3980 |
| 3988 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 3981 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 3989 DCHECK(ToRegister(instr->context()).is(cp)); | 3982 DCHECK(ToRegister(instr->context()).is(cp)); |
| 3990 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 3983 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
| 3991 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 3984 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
| 3992 | 3985 |
| 3993 if (instr->hydrogen()->HasVectorAndSlot()) { | 3986 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr); |
| 3994 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr); | |
| 3995 } | |
| 3996 | 3987 |
| 3997 __ mov(StoreDescriptor::NameRegister(), Operand(instr->name())); | 3988 __ mov(StoreDescriptor::NameRegister(), Operand(instr->name())); |
| 3998 Handle<Code> ic = CodeFactory::StoreICInOptimizedCode( | 3989 Handle<Code> ic = |
| 3999 isolate(), instr->language_mode(), | 3990 CodeFactory::StoreICInOptimizedCode(isolate(), instr->language_mode()) |
| 4000 instr->hydrogen()->initialization_state()) | 3991 .code(); |
| 4001 .code(); | |
| 4002 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3992 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 4003 } | 3993 } |
| 4004 | 3994 |
| 4005 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 3995 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
| 4006 Representation representation = instr->hydrogen()->length()->representation(); | 3996 Representation representation = instr->hydrogen()->length()->representation(); |
| 4007 DCHECK(representation.Equals(instr->hydrogen()->index()->representation())); | 3997 DCHECK(representation.Equals(instr->hydrogen()->index()->representation())); |
| 4008 DCHECK(representation.IsSmiOrInteger32()); | 3998 DCHECK(representation.IsSmiOrInteger32()); |
| 4009 | 3999 |
| 4010 Condition cc = instr->hydrogen()->allow_equality() ? lt : le; | 4000 Condition cc = instr->hydrogen()->allow_equality() ? lt : le; |
| 4011 if (instr->length()->IsConstantOperand()) { | 4001 if (instr->length()->IsConstantOperand()) { |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4284 DoStoreKeyedFixedArray(instr); | 4274 DoStoreKeyedFixedArray(instr); |
| 4285 } | 4275 } |
| 4286 } | 4276 } |
| 4287 | 4277 |
| 4288 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4278 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 4289 DCHECK(ToRegister(instr->context()).is(cp)); | 4279 DCHECK(ToRegister(instr->context()).is(cp)); |
| 4290 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 4280 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
| 4291 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); | 4281 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); |
| 4292 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 4282 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
| 4293 | 4283 |
| 4294 if (instr->hydrogen()->HasVectorAndSlot()) { | 4284 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr); |
| 4295 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr); | |
| 4296 } | |
| 4297 | 4285 |
| 4298 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( | 4286 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( |
| 4299 isolate(), instr->language_mode(), | 4287 isolate(), instr->language_mode()) |
| 4300 instr->hydrogen()->initialization_state()) | |
| 4301 .code(); | 4288 .code(); |
| 4302 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4289 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 4303 } | 4290 } |
| 4304 | 4291 |
| 4305 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { | 4292 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { |
| 4306 class DeferredMaybeGrowElements final : public LDeferredCode { | 4293 class DeferredMaybeGrowElements final : public LDeferredCode { |
| 4307 public: | 4294 public: |
| 4308 DeferredMaybeGrowElements(LCodeGen* codegen, LMaybeGrowElements* instr) | 4295 DeferredMaybeGrowElements(LCodeGen* codegen, LMaybeGrowElements* instr) |
| 4309 : LDeferredCode(codegen), instr_(instr) {} | 4296 : LDeferredCode(codegen), instr_(instr) {} |
| 4310 void Generate() override { codegen()->DoDeferredMaybeGrowElements(instr_); } | 4297 void Generate() override { codegen()->DoDeferredMaybeGrowElements(instr_); } |
| (...skipping 1393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5704 __ LoadP(result, | 5691 __ LoadP(result, |
| 5705 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5692 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
| 5706 __ bind(deferred->exit()); | 5693 __ bind(deferred->exit()); |
| 5707 __ bind(&done); | 5694 __ bind(&done); |
| 5708 } | 5695 } |
| 5709 | 5696 |
| 5710 #undef __ | 5697 #undef __ |
| 5711 | 5698 |
| 5712 } // namespace internal | 5699 } // namespace internal |
| 5713 } // namespace v8 | 5700 } // namespace v8 |
| OLD | NEW |