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/arm/lithium-codegen-arm.h" | 5 #include "src/crankshaft/arm/lithium-codegen-arm.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h" | 10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h" |
(...skipping 2653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2664 | 2664 |
2665 | 2665 |
2666 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2666 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
2667 DCHECK(ToRegister(instr->context()).is(cp)); | 2667 DCHECK(ToRegister(instr->context()).is(cp)); |
2668 DCHECK(ToRegister(instr->global_object()) | 2668 DCHECK(ToRegister(instr->global_object()) |
2669 .is(LoadDescriptor::ReceiverRegister())); | 2669 .is(LoadDescriptor::ReceiverRegister())); |
2670 DCHECK(ToRegister(instr->result()).is(r0)); | 2670 DCHECK(ToRegister(instr->result()).is(r0)); |
2671 | 2671 |
2672 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2672 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
2673 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 2673 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
2674 Handle<Code> ic = | 2674 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( |
2675 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), | 2675 isolate(), instr->typeof_mode(), PREMONOMORPHIC) |
2676 SLOPPY, PREMONOMORPHIC).code(); | 2676 .code(); |
2677 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2677 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2678 } | 2678 } |
2679 | 2679 |
2680 | 2680 |
2681 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 2681 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
2682 Register context = ToRegister(instr->context()); | 2682 Register context = ToRegister(instr->context()); |
2683 Register result = ToRegister(instr->result()); | 2683 Register result = ToRegister(instr->result()); |
2684 __ ldr(result, ContextMemOperand(context, instr->slot_index())); | 2684 __ ldr(result, ContextMemOperand(context, instr->slot_index())); |
2685 if (instr->hydrogen()->RequiresHoleCheck()) { | 2685 if (instr->hydrogen()->RequiresHoleCheck()) { |
2686 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 2686 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2761 | 2761 |
2762 | 2762 |
2763 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 2763 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
2764 DCHECK(ToRegister(instr->context()).is(cp)); | 2764 DCHECK(ToRegister(instr->context()).is(cp)); |
2765 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 2765 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
2766 DCHECK(ToRegister(instr->result()).is(r0)); | 2766 DCHECK(ToRegister(instr->result()).is(r0)); |
2767 | 2767 |
2768 // Name is always in r2. | 2768 // Name is always in r2. |
2769 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2769 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
2770 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); | 2770 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
2771 Handle<Code> ic = | 2771 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( |
2772 CodeFactory::LoadICInOptimizedCode( | 2772 isolate(), NOT_INSIDE_TYPEOF, |
2773 isolate(), NOT_INSIDE_TYPEOF, instr->hydrogen()->language_mode(), | 2773 instr->hydrogen()->initialization_state()) |
2774 instr->hydrogen()->initialization_state()).code(); | 2774 .code(); |
2775 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); | 2775 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); |
2776 } | 2776 } |
2777 | 2777 |
2778 | 2778 |
2779 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 2779 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
2780 Register scratch = scratch0(); | 2780 Register scratch = scratch0(); |
2781 Register function = ToRegister(instr->function()); | 2781 Register function = ToRegister(instr->function()); |
2782 Register result = ToRegister(instr->result()); | 2782 Register result = ToRegister(instr->result()); |
2783 | 2783 |
2784 // Get the prototype or initial map from the function. | 2784 // Get the prototype or initial map from the function. |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3063 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3063 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
3064 DCHECK(ToRegister(instr->context()).is(cp)); | 3064 DCHECK(ToRegister(instr->context()).is(cp)); |
3065 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 3065 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
3066 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); | 3066 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); |
3067 | 3067 |
3068 if (instr->hydrogen()->HasVectorAndSlot()) { | 3068 if (instr->hydrogen()->HasVectorAndSlot()) { |
3069 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); | 3069 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
3070 } | 3070 } |
3071 | 3071 |
3072 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode( | 3072 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode( |
3073 isolate(), instr->hydrogen()->language_mode(), | 3073 isolate(), instr->hydrogen()->initialization_state()) |
3074 instr->hydrogen()->initialization_state()).code(); | 3074 .code(); |
3075 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); | 3075 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); |
3076 } | 3076 } |
3077 | 3077 |
3078 | 3078 |
3079 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3079 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
3080 Register scratch = scratch0(); | 3080 Register scratch = scratch0(); |
3081 Register result = ToRegister(instr->result()); | 3081 Register result = ToRegister(instr->result()); |
3082 | 3082 |
3083 if (instr->hydrogen()->from_inlined()) { | 3083 if (instr->hydrogen()->from_inlined()) { |
3084 __ sub(result, sp, Operand(2 * kPointerSize)); | 3084 __ sub(result, sp, Operand(2 * kPointerSize)); |
(...skipping 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5555 __ push(ToRegister(instr->function())); | 5555 __ push(ToRegister(instr->function())); |
5556 CallRuntime(Runtime::kPushBlockContext, instr); | 5556 CallRuntime(Runtime::kPushBlockContext, instr); |
5557 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5557 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5558 } | 5558 } |
5559 | 5559 |
5560 | 5560 |
5561 #undef __ | 5561 #undef __ |
5562 | 5562 |
5563 } // namespace internal | 5563 } // namespace internal |
5564 } // namespace v8 | 5564 } // namespace v8 |
OLD | NEW |