OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/hydrogen-osr.h" | 10 #include "src/hydrogen-osr.h" |
(...skipping 3326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3337 Register result = ToRegister(instr->result()); | 3337 Register result = ToRegister(instr->result()); |
3338 __ Mov(result, Operand(Handle<Object>(instr->hydrogen()->cell().handle()))); | 3338 __ Mov(result, Operand(Handle<Object>(instr->hydrogen()->cell().handle()))); |
3339 __ Ldr(result, FieldMemOperand(result, Cell::kValueOffset)); | 3339 __ Ldr(result, FieldMemOperand(result, Cell::kValueOffset)); |
3340 if (instr->hydrogen()->RequiresHoleCheck()) { | 3340 if (instr->hydrogen()->RequiresHoleCheck()) { |
3341 DeoptimizeIfRoot( | 3341 DeoptimizeIfRoot( |
3342 result, Heap::kTheHoleValueRootIndex, instr->environment()); | 3342 result, Heap::kTheHoleValueRootIndex, instr->environment()); |
3343 } | 3343 } |
3344 } | 3344 } |
3345 | 3345 |
3346 | 3346 |
| 3347 template <class T> |
| 3348 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { |
| 3349 DCHECK(FLAG_vector_ics); |
| 3350 Register vector = ToRegister(instr->temp_vector()); |
| 3351 DCHECK(vector.is(LoadIC::VectorRegister())); |
| 3352 __ Mov(vector, instr->hydrogen()->feedback_vector()); |
| 3353 // No need to allocate this register. |
| 3354 DCHECK(LoadIC::SlotRegister().is(x0)); |
| 3355 __ Mov(LoadIC::SlotRegister(), Smi::FromInt(instr->hydrogen()->slot())); |
| 3356 } |
| 3357 |
| 3358 |
3347 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 3359 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
3348 DCHECK(ToRegister(instr->context()).is(cp)); | 3360 DCHECK(ToRegister(instr->context()).is(cp)); |
3349 DCHECK(ToRegister(instr->global_object()).is(LoadIC::ReceiverRegister())); | 3361 DCHECK(ToRegister(instr->global_object()).is(LoadIC::ReceiverRegister())); |
3350 DCHECK(ToRegister(instr->result()).Is(x0)); | 3362 DCHECK(ToRegister(instr->result()).Is(x0)); |
3351 __ Mov(LoadIC::NameRegister(), Operand(instr->name())); | 3363 __ Mov(LoadIC::NameRegister(), Operand(instr->name())); |
3352 if (FLAG_vector_ics) { | 3364 if (FLAG_vector_ics) { |
3353 Register vector = ToRegister(instr->temp_vector()); | 3365 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
3354 DCHECK(vector.is(LoadIC::VectorRegister())); | |
3355 __ Mov(vector, instr->hydrogen()->feedback_vector()); | |
3356 // No need to allocate this register. | |
3357 DCHECK(LoadIC::SlotRegister().is(x0)); | |
3358 __ Mov(LoadIC::SlotRegister(), | |
3359 Smi::FromInt(instr->hydrogen()->slot())); | |
3360 } | 3366 } |
3361 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; | 3367 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; |
3362 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); | 3368 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); |
3363 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3369 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3364 } | 3370 } |
3365 | 3371 |
3366 | 3372 |
3367 MemOperand LCodeGen::PrepareKeyedExternalArrayOperand( | 3373 MemOperand LCodeGen::PrepareKeyedExternalArrayOperand( |
3368 Register key, | 3374 Register key, |
3369 Register base, | 3375 Register base, |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3604 } | 3610 } |
3605 } | 3611 } |
3606 } | 3612 } |
3607 | 3613 |
3608 | 3614 |
3609 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3615 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
3610 DCHECK(ToRegister(instr->context()).is(cp)); | 3616 DCHECK(ToRegister(instr->context()).is(cp)); |
3611 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3617 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); |
3612 DCHECK(ToRegister(instr->key()).is(LoadIC::NameRegister())); | 3618 DCHECK(ToRegister(instr->key()).is(LoadIC::NameRegister())); |
3613 if (FLAG_vector_ics) { | 3619 if (FLAG_vector_ics) { |
3614 Register vector = ToRegister(instr->temp_vector()); | 3620 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
3615 DCHECK(vector.is(LoadIC::VectorRegister())); | |
3616 __ Mov(vector, instr->hydrogen()->feedback_vector()); | |
3617 // No need to allocate this register. | |
3618 DCHECK(LoadIC::SlotRegister().is(x0)); | |
3619 __ Mov(LoadIC::SlotRegister(), | |
3620 Smi::FromInt(instr->hydrogen()->slot())); | |
3621 } | 3621 } |
3622 | 3622 |
3623 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 3623 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
3624 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3624 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3625 | 3625 |
3626 DCHECK(ToRegister(instr->result()).Is(x0)); | 3626 DCHECK(ToRegister(instr->result()).Is(x0)); |
3627 } | 3627 } |
3628 | 3628 |
3629 | 3629 |
3630 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { | 3630 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3666 } | 3666 } |
3667 } | 3667 } |
3668 | 3668 |
3669 | 3669 |
3670 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 3670 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
3671 DCHECK(ToRegister(instr->context()).is(cp)); | 3671 DCHECK(ToRegister(instr->context()).is(cp)); |
3672 // LoadIC expects name and receiver in registers. | 3672 // LoadIC expects name and receiver in registers. |
3673 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3673 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); |
3674 __ Mov(LoadIC::NameRegister(), Operand(instr->name())); | 3674 __ Mov(LoadIC::NameRegister(), Operand(instr->name())); |
3675 if (FLAG_vector_ics) { | 3675 if (FLAG_vector_ics) { |
3676 Register vector = ToRegister(instr->temp_vector()); | 3676 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
3677 DCHECK(vector.is(LoadIC::VectorRegister())); | |
3678 __ Mov(vector, instr->hydrogen()->feedback_vector()); | |
3679 // No need to allocate this register. | |
3680 DCHECK(LoadIC::SlotRegister().is(x0)); | |
3681 __ Mov(LoadIC::SlotRegister(), | |
3682 Smi::FromInt(instr->hydrogen()->slot())); | |
3683 } | 3677 } |
3684 | 3678 |
3685 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); | 3679 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); |
3686 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3680 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3687 | 3681 |
3688 DCHECK(ToRegister(instr->result()).is(x0)); | 3682 DCHECK(ToRegister(instr->result()).is(x0)); |
3689 } | 3683 } |
3690 | 3684 |
3691 | 3685 |
3692 void LCodeGen::DoLoadRoot(LLoadRoot* instr) { | 3686 void LCodeGen::DoLoadRoot(LLoadRoot* instr) { |
(...skipping 2332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6025 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6019 Handle<ScopeInfo> scope_info = instr->scope_info(); |
6026 __ Push(scope_info); | 6020 __ Push(scope_info); |
6027 __ Push(ToRegister(instr->function())); | 6021 __ Push(ToRegister(instr->function())); |
6028 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6022 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
6029 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6023 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6030 } | 6024 } |
6031 | 6025 |
6032 | 6026 |
6033 | 6027 |
6034 } } // namespace v8::internal | 6028 } } // namespace v8::internal |
OLD | NEW |