OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/mips64/lithium-codegen-mips64.h" | 5 #include "src/crankshaft/mips64/lithium-codegen-mips64.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/crankshaft/hydrogen-osr.h" | 9 #include "src/crankshaft/hydrogen-osr.h" |
10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" | 10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" |
(...skipping 2623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2634 | 2634 |
2635 | 2635 |
2636 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2636 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
2637 DCHECK(ToRegister(instr->context()).is(cp)); | 2637 DCHECK(ToRegister(instr->context()).is(cp)); |
2638 DCHECK(ToRegister(instr->global_object()) | 2638 DCHECK(ToRegister(instr->global_object()) |
2639 .is(LoadDescriptor::ReceiverRegister())); | 2639 .is(LoadDescriptor::ReceiverRegister())); |
2640 DCHECK(ToRegister(instr->result()).is(v0)); | 2640 DCHECK(ToRegister(instr->result()).is(v0)); |
2641 | 2641 |
2642 __ li(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2642 __ li(LoadDescriptor::NameRegister(), Operand(instr->name())); |
2643 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 2643 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
2644 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( | 2644 Handle<Code> ic = |
2645 isolate(), instr->typeof_mode(), PREMONOMORPHIC) | 2645 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode()) |
2646 .code(); | 2646 .code(); |
2647 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2647 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2648 } | 2648 } |
2649 | 2649 |
2650 | 2650 |
2651 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 2651 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
2652 Register context = ToRegister(instr->context()); | 2652 Register context = ToRegister(instr->context()); |
2653 Register result = ToRegister(instr->result()); | 2653 Register result = ToRegister(instr->result()); |
2654 | 2654 |
2655 __ ld(result, ContextMemOperand(context, instr->slot_index())); | 2655 __ ld(result, ContextMemOperand(context, instr->slot_index())); |
2656 if (instr->hydrogen()->RequiresHoleCheck()) { | 2656 if (instr->hydrogen()->RequiresHoleCheck()) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2750 | 2750 |
2751 | 2751 |
2752 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 2752 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
2753 DCHECK(ToRegister(instr->context()).is(cp)); | 2753 DCHECK(ToRegister(instr->context()).is(cp)); |
2754 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 2754 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
2755 DCHECK(ToRegister(instr->result()).is(v0)); | 2755 DCHECK(ToRegister(instr->result()).is(v0)); |
2756 | 2756 |
2757 // Name is always in a2. | 2757 // Name is always in a2. |
2758 __ li(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2758 __ li(LoadDescriptor::NameRegister(), Operand(instr->name())); |
2759 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); | 2759 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
2760 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( | 2760 Handle<Code> ic = |
2761 isolate(), NOT_INSIDE_TYPEOF, | 2761 CodeFactory::LoadICInOptimizedCode(isolate(), NOT_INSIDE_TYPEOF).code(); |
2762 instr->hydrogen()->initialization_state()) | |
2763 .code(); | |
2764 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2762 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2765 } | 2763 } |
2766 | 2764 |
2767 | 2765 |
2768 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 2766 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
2769 Register scratch = scratch0(); | 2767 Register scratch = scratch0(); |
2770 Register function = ToRegister(instr->function()); | 2768 Register function = ToRegister(instr->function()); |
2771 Register result = ToRegister(instr->result()); | 2769 Register result = ToRegister(instr->result()); |
2772 | 2770 |
2773 // Get the prototype or initial map from the function. | 2771 // Get the prototype or initial map from the function. |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3102 return MemOperand(scratch0(), base_offset); | 3100 return MemOperand(scratch0(), base_offset); |
3103 } | 3101 } |
3104 } | 3102 } |
3105 | 3103 |
3106 | 3104 |
3107 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3105 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
3108 DCHECK(ToRegister(instr->context()).is(cp)); | 3106 DCHECK(ToRegister(instr->context()).is(cp)); |
3109 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 3107 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
3110 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); | 3108 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); |
3111 | 3109 |
3112 if (instr->hydrogen()->HasVectorAndSlot()) { | 3110 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
3113 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); | |
3114 } | |
3115 | 3111 |
3116 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode( | 3112 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode(isolate()).code(); |
3117 isolate(), instr->hydrogen()->initialization_state()) | |
3118 .code(); | |
3119 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3113 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3120 } | 3114 } |
3121 | 3115 |
3122 | 3116 |
3123 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3117 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
3124 Register scratch = scratch0(); | 3118 Register scratch = scratch0(); |
3125 Register temp = scratch1(); | 3119 Register temp = scratch1(); |
3126 Register result = ToRegister(instr->result()); | 3120 Register result = ToRegister(instr->result()); |
3127 | 3121 |
3128 if (instr->hydrogen()->from_inlined()) { | 3122 if (instr->hydrogen()->from_inlined()) { |
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4010 instr->hydrogen()->PointersToHereCheckForValue()); | 4004 instr->hydrogen()->PointersToHereCheckForValue()); |
4011 } | 4005 } |
4012 } | 4006 } |
4013 | 4007 |
4014 | 4008 |
4015 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 4009 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
4016 DCHECK(ToRegister(instr->context()).is(cp)); | 4010 DCHECK(ToRegister(instr->context()).is(cp)); |
4017 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 4011 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
4018 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 4012 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
4019 | 4013 |
4020 if (instr->hydrogen()->HasVectorAndSlot()) { | 4014 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr); |
4021 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr); | |
4022 } | |
4023 | 4015 |
4024 __ li(StoreDescriptor::NameRegister(), Operand(instr->name())); | 4016 __ li(StoreDescriptor::NameRegister(), Operand(instr->name())); |
4025 Handle<Code> ic = CodeFactory::StoreICInOptimizedCode( | 4017 Handle<Code> ic = |
4026 isolate(), instr->language_mode(), | 4018 CodeFactory::StoreICInOptimizedCode(isolate(), instr->language_mode()) |
4027 instr->hydrogen()->initialization_state()).code(); | 4019 .code(); |
4028 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4020 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
4029 } | 4021 } |
4030 | 4022 |
4031 | 4023 |
4032 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 4024 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
4033 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs; | 4025 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs; |
4034 Operand operand((int64_t)0); | 4026 Operand operand((int64_t)0); |
4035 Register reg; | 4027 Register reg; |
4036 if (instr->index()->IsConstantOperand()) { | 4028 if (instr->index()->IsConstantOperand()) { |
4037 operand = ToOperand(instr->index()); | 4029 operand = ToOperand(instr->index()); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4260 } | 4252 } |
4261 } | 4253 } |
4262 | 4254 |
4263 | 4255 |
4264 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4256 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
4265 DCHECK(ToRegister(instr->context()).is(cp)); | 4257 DCHECK(ToRegister(instr->context()).is(cp)); |
4266 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 4258 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
4267 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); | 4259 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); |
4268 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 4260 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
4269 | 4261 |
4270 if (instr->hydrogen()->HasVectorAndSlot()) { | 4262 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr); |
4271 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr); | |
4272 } | |
4273 | 4263 |
4274 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( | 4264 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( |
4275 isolate(), instr->language_mode(), | 4265 isolate(), instr->language_mode()) |
4276 instr->hydrogen()->initialization_state()).code(); | 4266 .code(); |
4277 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4267 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
4278 } | 4268 } |
4279 | 4269 |
4280 | 4270 |
4281 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { | 4271 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { |
4282 class DeferredMaybeGrowElements final : public LDeferredCode { | 4272 class DeferredMaybeGrowElements final : public LDeferredCode { |
4283 public: | 4273 public: |
4284 DeferredMaybeGrowElements(LCodeGen* codegen, LMaybeGrowElements* instr) | 4274 DeferredMaybeGrowElements(LCodeGen* codegen, LMaybeGrowElements* instr) |
4285 : LDeferredCode(codegen), instr_(instr) {} | 4275 : LDeferredCode(codegen), instr_(instr) {} |
4286 void Generate() override { codegen()->DoDeferredMaybeGrowElements(instr_); } | 4276 void Generate() override { codegen()->DoDeferredMaybeGrowElements(instr_); } |
(...skipping 1484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5771 __ ld(result, FieldMemOperand(scratch, | 5761 __ ld(result, FieldMemOperand(scratch, |
5772 FixedArray::kHeaderSize - kPointerSize)); | 5762 FixedArray::kHeaderSize - kPointerSize)); |
5773 __ bind(deferred->exit()); | 5763 __ bind(deferred->exit()); |
5774 __ bind(&done); | 5764 __ bind(&done); |
5775 } | 5765 } |
5776 | 5766 |
5777 #undef __ | 5767 #undef __ |
5778 | 5768 |
5779 } // namespace internal | 5769 } // namespace internal |
5780 } // namespace v8 | 5770 } // namespace v8 |
OLD | NEW |