OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/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/cpu-profiler.h" | 10 #include "src/cpu-profiler.h" |
(...skipping 3021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3032 | 3032 |
3033 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 3033 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
3034 DCHECK(ToRegister(instr->context()).is(cp)); | 3034 DCHECK(ToRegister(instr->context()).is(cp)); |
3035 DCHECK(ToRegister(instr->global_object()) | 3035 DCHECK(ToRegister(instr->global_object()) |
3036 .is(LoadDescriptor::ReceiverRegister())); | 3036 .is(LoadDescriptor::ReceiverRegister())); |
3037 DCHECK(ToRegister(instr->result()).is(r3)); | 3037 DCHECK(ToRegister(instr->result()).is(r3)); |
3038 | 3038 |
3039 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 3039 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
3040 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 3040 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
3041 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; | 3041 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; |
3042 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode, | 3042 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode, SLOPPY, |
3043 PREMONOMORPHIC).code(); | 3043 PREMONOMORPHIC).code(); |
3044 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3044 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3045 } | 3045 } |
3046 | 3046 |
3047 | 3047 |
3048 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 3048 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
3049 Register context = ToRegister(instr->context()); | 3049 Register context = ToRegister(instr->context()); |
3050 Register result = ToRegister(instr->result()); | 3050 Register result = ToRegister(instr->result()); |
3051 __ LoadP(result, ContextOperand(context, instr->slot_index())); | 3051 __ LoadP(result, ContextOperand(context, instr->slot_index())); |
3052 if (instr->hydrogen()->RequiresHoleCheck()) { | 3052 if (instr->hydrogen()->RequiresHoleCheck()) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3148 | 3148 |
3149 | 3149 |
3150 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 3150 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
3151 DCHECK(ToRegister(instr->context()).is(cp)); | 3151 DCHECK(ToRegister(instr->context()).is(cp)); |
3152 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 3152 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
3153 DCHECK(ToRegister(instr->result()).is(r3)); | 3153 DCHECK(ToRegister(instr->result()).is(r3)); |
3154 | 3154 |
3155 // Name is always in r5. | 3155 // Name is always in r5. |
3156 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); | 3156 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name())); |
3157 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); | 3157 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
3158 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode( | 3158 Handle<Code> ic = |
3159 isolate(), NOT_CONTEXTUAL, | 3159 CodeFactory::LoadICInOptimizedCode( |
3160 instr->hydrogen()->initialization_state()).code(); | 3160 isolate(), NOT_CONTEXTUAL, instr->hydrogen()->language_mode(), |
| 3161 instr->hydrogen()->initialization_state()).code(); |
3161 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3162 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3162 } | 3163 } |
3163 | 3164 |
3164 | 3165 |
3165 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 3166 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
3166 Register scratch = scratch0(); | 3167 Register scratch = scratch0(); |
3167 Register function = ToRegister(instr->function()); | 3168 Register function = ToRegister(instr->function()); |
3168 Register result = ToRegister(instr->result()); | 3169 Register result = ToRegister(instr->result()); |
3169 | 3170 |
3170 // Get the prototype or initial map from the function. | 3171 // Get the prototype or initial map from the function. |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3522 | 3523 |
3523 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3524 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
3524 DCHECK(ToRegister(instr->context()).is(cp)); | 3525 DCHECK(ToRegister(instr->context()).is(cp)); |
3525 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); | 3526 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister())); |
3526 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); | 3527 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister())); |
3527 | 3528 |
3528 if (instr->hydrogen()->HasVectorAndSlot()) { | 3529 if (instr->hydrogen()->HasVectorAndSlot()) { |
3529 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); | 3530 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
3530 } | 3531 } |
3531 | 3532 |
3532 Handle<Code> ic = | 3533 Handle<Code> ic = CodeFactory::KeyedLoadICInOptimizedCode( |
3533 CodeFactory::KeyedLoadICInOptimizedCode( | 3534 isolate(), instr->hydrogen()->language_mode(), |
3534 isolate(), instr->hydrogen()->initialization_state()).code(); | 3535 instr->hydrogen()->initialization_state()).code(); |
3535 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3536 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3536 } | 3537 } |
3537 | 3538 |
3538 | 3539 |
3539 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 3540 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
3540 Register scratch = scratch0(); | 3541 Register scratch = scratch0(); |
3541 Register result = ToRegister(instr->result()); | 3542 Register result = ToRegister(instr->result()); |
3542 | 3543 |
3543 if (instr->hydrogen()->from_inlined()) { | 3544 if (instr->hydrogen()->from_inlined()) { |
3544 __ subi(result, sp, Operand(2 * kPointerSize)); | 3545 __ subi(result, sp, Operand(2 * kPointerSize)); |
(...skipping 2710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6255 __ Push(scope_info); | 6256 __ Push(scope_info); |
6256 __ push(ToRegister(instr->function())); | 6257 __ push(ToRegister(instr->function())); |
6257 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6258 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
6258 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6259 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6259 } | 6260 } |
6260 | 6261 |
6261 | 6262 |
6262 #undef __ | 6263 #undef __ |
6263 } // namespace internal | 6264 } // namespace internal |
6264 } // namespace v8 | 6265 } // namespace v8 |
OLD | NEW |