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/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/hydrogen-osr.h" | 8 #include "src/hydrogen-osr.h" |
9 #include "src/mips64/lithium-codegen-mips64.h" | 9 #include "src/mips64/lithium-codegen-mips64.h" |
10 #include "src/mips64/lithium-gap-resolver-mips64.h" | 10 #include "src/mips64/lithium-gap-resolver-mips64.h" |
(...skipping 2847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2858 Register result = ToRegister(instr->result()); | 2858 Register result = ToRegister(instr->result()); |
2859 __ li(at, Operand(Handle<Object>(instr->hydrogen()->cell().handle()))); | 2859 __ li(at, Operand(Handle<Object>(instr->hydrogen()->cell().handle()))); |
2860 __ ld(result, FieldMemOperand(at, Cell::kValueOffset)); | 2860 __ ld(result, FieldMemOperand(at, Cell::kValueOffset)); |
2861 if (instr->hydrogen()->RequiresHoleCheck()) { | 2861 if (instr->hydrogen()->RequiresHoleCheck()) { |
2862 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 2862 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
2863 DeoptimizeIf(eq, instr->environment(), result, Operand(at)); | 2863 DeoptimizeIf(eq, instr->environment(), result, Operand(at)); |
2864 } | 2864 } |
2865 } | 2865 } |
2866 | 2866 |
2867 | 2867 |
| 2868 template <class T> |
| 2869 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { |
| 2870 DCHECK(FLAG_vector_ics); |
| 2871 Register vector = ToRegister(instr->temp_vector()); |
| 2872 DCHECK(vector.is(LoadIC::VectorRegister())); |
| 2873 __ li(vector, instr->hydrogen()->feedback_vector()); |
| 2874 // No need to allocate this register. |
| 2875 DCHECK(LoadIC::SlotRegister().is(a0)); |
| 2876 __ li(LoadIC::SlotRegister(), |
| 2877 Operand(Smi::FromInt(instr->hydrogen()->slot()))); |
| 2878 } |
| 2879 |
| 2880 |
2868 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2881 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
2869 DCHECK(ToRegister(instr->context()).is(cp)); | 2882 DCHECK(ToRegister(instr->context()).is(cp)); |
2870 DCHECK(ToRegister(instr->global_object()).is(LoadIC::ReceiverRegister())); | 2883 DCHECK(ToRegister(instr->global_object()).is(LoadIC::ReceiverRegister())); |
2871 DCHECK(ToRegister(instr->result()).is(v0)); | 2884 DCHECK(ToRegister(instr->result()).is(v0)); |
2872 | 2885 |
2873 __ li(LoadIC::NameRegister(), Operand(instr->name())); | 2886 __ li(LoadIC::NameRegister(), Operand(instr->name())); |
2874 if (FLAG_vector_ics) { | 2887 if (FLAG_vector_ics) { |
2875 Register vector = ToRegister(instr->temp_vector()); | 2888 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
2876 DCHECK(vector.is(LoadIC::VectorRegister())); | |
2877 __ li(vector, instr->hydrogen()->feedback_vector()); | |
2878 // No need to allocate this register. | |
2879 DCHECK(LoadIC::SlotRegister().is(a0)); | |
2880 __ li(LoadIC::SlotRegister(), | |
2881 Operand(Smi::FromInt(instr->hydrogen()->slot()))); | |
2882 } | 2889 } |
2883 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; | 2890 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; |
2884 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); | 2891 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); |
2885 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2892 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2886 } | 2893 } |
2887 | 2894 |
2888 | 2895 |
2889 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { | 2896 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { |
2890 Register value = ToRegister(instr->value()); | 2897 Register value = ToRegister(instr->value()); |
2891 Register cell = scratch0(); | 2898 Register cell = scratch0(); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3013 | 3020 |
3014 | 3021 |
3015 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 3022 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
3016 DCHECK(ToRegister(instr->context()).is(cp)); | 3023 DCHECK(ToRegister(instr->context()).is(cp)); |
3017 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3024 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); |
3018 DCHECK(ToRegister(instr->result()).is(v0)); | 3025 DCHECK(ToRegister(instr->result()).is(v0)); |
3019 | 3026 |
3020 // Name is always in a2. | 3027 // Name is always in a2. |
3021 __ li(LoadIC::NameRegister(), Operand(instr->name())); | 3028 __ li(LoadIC::NameRegister(), Operand(instr->name())); |
3022 if (FLAG_vector_ics) { | 3029 if (FLAG_vector_ics) { |
3023 Register vector = ToRegister(instr->temp_vector()); | 3030 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
3024 DCHECK(vector.is(LoadIC::VectorRegister())); | |
3025 __ li(vector, instr->hydrogen()->feedback_vector()); | |
3026 // No need to allocate this register. | |
3027 DCHECK(LoadIC::SlotRegister().is(a0)); | |
3028 __ li(LoadIC::SlotRegister(), | |
3029 Operand(Smi::FromInt(instr->hydrogen()->slot()))); | |
3030 } | 3031 } |
3031 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); | 3032 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); |
3032 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3033 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3033 } | 3034 } |
3034 | 3035 |
3035 | 3036 |
3036 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 3037 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
3037 Register scratch = scratch0(); | 3038 Register scratch = scratch0(); |
3038 Register function = ToRegister(instr->function()); | 3039 Register function = ToRegister(instr->function()); |
3039 Register result = ToRegister(instr->result()); | 3040 Register result = ToRegister(instr->result()); |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3367 } | 3368 } |
3368 } | 3369 } |
3369 | 3370 |
3370 | 3371 |
3371 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3372 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
3372 DCHECK(ToRegister(instr->context()).is(cp)); | 3373 DCHECK(ToRegister(instr->context()).is(cp)); |
3373 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3374 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); |
3374 DCHECK(ToRegister(instr->key()).is(LoadIC::NameRegister())); | 3375 DCHECK(ToRegister(instr->key()).is(LoadIC::NameRegister())); |
3375 | 3376 |
3376 if (FLAG_vector_ics) { | 3377 if (FLAG_vector_ics) { |
3377 Register vector = ToRegister(instr->temp_vector()); | 3378 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
3378 DCHECK(vector.is(LoadIC::VectorRegister())); | |
3379 __ li(vector, instr->hydrogen()->feedback_vector()); | |
3380 // No need to allocate this register. | |
3381 DCHECK(LoadIC::SlotRegister().is(a0)); | |
3382 __ li(LoadIC::SlotRegister(), | |
3383 Operand(Smi::FromInt(instr->hydrogen()->slot()))); | |
3384 } | 3379 } |
3385 | 3380 |
3386 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 3381 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
3387 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3382 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3388 } | 3383 } |
3389 | 3384 |
3390 | 3385 |
3391 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3386 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
3392 Register scratch = scratch0(); | 3387 Register scratch = scratch0(); |
3393 Register temp = scratch1(); | 3388 Register temp = scratch1(); |
(...skipping 2546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5940 __ li(at, scope_info); | 5935 __ li(at, scope_info); |
5941 __ Push(at, ToRegister(instr->function())); | 5936 __ Push(at, ToRegister(instr->function())); |
5942 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5937 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5943 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5938 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5944 } | 5939 } |
5945 | 5940 |
5946 | 5941 |
5947 #undef __ | 5942 #undef __ |
5948 | 5943 |
5949 } } // namespace v8::internal | 5944 } } // namespace v8::internal |
OLD | NEW |