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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arm/lithium-codegen-arm.h" | 7 #include "src/arm/lithium-codegen-arm.h" |
8 #include "src/arm/lithium-gap-resolver-arm.h" | 8 #include "src/arm/lithium-gap-resolver-arm.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 2929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2940 AllowDeferredHandleDereference vector_structure_check; | 2940 AllowDeferredHandleDereference vector_structure_check; |
2941 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); | 2941 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); |
2942 __ Move(vector_register, vector); | 2942 __ Move(vector_register, vector); |
2943 // No need to allocate this register. | 2943 // No need to allocate this register. |
2944 FeedbackVectorICSlot slot = instr->hydrogen()->slot(); | 2944 FeedbackVectorICSlot slot = instr->hydrogen()->slot(); |
2945 int index = vector->GetIndex(slot); | 2945 int index = vector->GetIndex(slot); |
2946 __ mov(slot_register, Operand(Smi::FromInt(index))); | 2946 __ mov(slot_register, Operand(Smi::FromInt(index))); |
2947 } | 2947 } |
2948 | 2948 |
2949 | 2949 |
| 2950 template <class T> |
| 2951 void LCodeGen::EmitVectorStoreICRegisters(T* instr) { |
| 2952 Register vector_register = ToRegister(instr->temp_vector()); |
| 2953 Register slot_register = ToRegister(instr->temp_slot()); |
| 2954 |
| 2955 AllowDeferredHandleDereference vector_structure_check; |
| 2956 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); |
| 2957 __ Move(vector_register, vector); |
| 2958 FeedbackVectorICSlot slot = instr->hydrogen()->slot(); |
| 2959 int index = vector->GetIndex(slot); |
| 2960 __ mov(slot_register, Operand(Smi::FromInt(index))); |
| 2961 } |
| 2962 |
| 2963 |
2950 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2964 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
2951 DCHECK(ToRegister(instr->context()).is(cp)); | 2965 DCHECK(ToRegister(instr->context()).is(cp)); |
2952 DCHECK(ToRegister(instr->global_object()) | 2966 DCHECK(ToRegister(instr->global_object()) |
2953 .is(LoadDescriptor::ReceiverRegister())); | 2967 .is(LoadDescriptor::ReceiverRegister())); |
2954 DCHECK(ToRegister(instr->result()).is(r0)); | 2968 DCHECK(ToRegister(instr->result()).is(r0)); |
2955 | 2969 |
2956 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 2970 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
2957 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 2971 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
2958 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; | 2972 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; |
2959 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode, | 2973 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode, |
(...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4185 } | 4199 } |
4186 } | 4200 } |
4187 } | 4201 } |
4188 | 4202 |
4189 | 4203 |
4190 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 4204 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
4191 DCHECK(ToRegister(instr->context()).is(cp)); | 4205 DCHECK(ToRegister(instr->context()).is(cp)); |
4192 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 4206 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
4193 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 4207 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
4194 | 4208 |
| 4209 if (instr->hydrogen()->HasVectorAndSlot()) { |
| 4210 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr); |
| 4211 } |
| 4212 |
4195 __ mov(StoreDescriptor::NameRegister(), Operand(instr->name())); | 4213 __ mov(StoreDescriptor::NameRegister(), Operand(instr->name())); |
4196 Handle<Code> ic = | 4214 Handle<Code> ic = CodeFactory::StoreICInOptimizedCode( |
4197 StoreIC::initialize_stub(isolate(), instr->language_mode(), | 4215 isolate(), instr->language_mode(), |
4198 instr->hydrogen()->initialization_state()); | 4216 instr->hydrogen()->initialization_state()).code(); |
4199 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); | 4217 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); |
4200 } | 4218 } |
4201 | 4219 |
4202 | 4220 |
4203 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 4221 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
4204 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs; | 4222 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs; |
4205 if (instr->index()->IsConstantOperand()) { | 4223 if (instr->index()->IsConstantOperand()) { |
4206 Operand index = ToOperand(instr->index()); | 4224 Operand index = ToOperand(instr->index()); |
4207 Register length = ToRegister(instr->length()); | 4225 Register length = ToRegister(instr->length()); |
4208 __ cmp(length, index); | 4226 __ cmp(length, index); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4409 } | 4427 } |
4410 } | 4428 } |
4411 | 4429 |
4412 | 4430 |
4413 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4431 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
4414 DCHECK(ToRegister(instr->context()).is(cp)); | 4432 DCHECK(ToRegister(instr->context()).is(cp)); |
4415 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); | 4433 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); |
4416 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); | 4434 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); |
4417 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); | 4435 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); |
4418 | 4436 |
| 4437 if (instr->hydrogen()->HasVectorAndSlot()) { |
| 4438 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr); |
| 4439 } |
| 4440 |
4419 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( | 4441 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( |
4420 isolate(), instr->language_mode(), | 4442 isolate(), instr->language_mode(), |
4421 instr->hydrogen()->initialization_state()).code(); | 4443 instr->hydrogen()->initialization_state()).code(); |
4422 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); | 4444 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); |
4423 } | 4445 } |
4424 | 4446 |
4425 | 4447 |
4426 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { | 4448 void LCodeGen::DoMaybeGrowElements(LMaybeGrowElements* instr) { |
4427 class DeferredMaybeGrowElements final : public LDeferredCode { | 4449 class DeferredMaybeGrowElements final : public LDeferredCode { |
4428 public: | 4450 public: |
(...skipping 1535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5964 __ push(ToRegister(instr->function())); | 5986 __ push(ToRegister(instr->function())); |
5965 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5987 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5966 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5988 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5967 } | 5989 } |
5968 | 5990 |
5969 | 5991 |
5970 #undef __ | 5992 #undef __ |
5971 | 5993 |
5972 } // namespace internal | 5994 } // namespace internal |
5973 } // namespace v8 | 5995 } // namespace v8 |
OLD | NEW |