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