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