| 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 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
| 8 | 8 |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 2949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2960 __ cmp(result, factory()->the_hole_value()); | 2960 __ cmp(result, factory()->the_hole_value()); |
| 2961 DeoptimizeIf(equal, instr->environment()); | 2961 DeoptimizeIf(equal, instr->environment()); |
| 2962 } | 2962 } |
| 2963 } | 2963 } |
| 2964 | 2964 |
| 2965 | 2965 |
| 2966 template <class T> | 2966 template <class T> |
| 2967 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { | 2967 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { |
| 2968 DCHECK(FLAG_vector_ics); | 2968 DCHECK(FLAG_vector_ics); |
| 2969 Register vector = ToRegister(instr->temp_vector()); | 2969 Register vector = ToRegister(instr->temp_vector()); |
| 2970 DCHECK(vector.is(LoadIC::VectorRegister())); | 2970 DCHECK(vector.is(FullVectorLoadConvention::VectorRegister())); |
| 2971 __ mov(vector, instr->hydrogen()->feedback_vector()); | 2971 __ mov(vector, instr->hydrogen()->feedback_vector()); |
| 2972 // No need to allocate this register. | 2972 // No need to allocate this register. |
| 2973 DCHECK(LoadIC::SlotRegister().is(eax)); | 2973 DCHECK(FullVectorLoadConvention::SlotRegister().is(eax)); |
| 2974 __ mov(LoadIC::SlotRegister(), | 2974 __ mov(FullVectorLoadConvention::SlotRegister(), |
| 2975 Immediate(Smi::FromInt(instr->hydrogen()->slot()))); | 2975 Immediate(Smi::FromInt(instr->hydrogen()->slot()))); |
| 2976 } | 2976 } |
| 2977 | 2977 |
| 2978 | 2978 |
| 2979 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { | 2979 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { |
| 2980 DCHECK(ToRegister(instr->context()).is(esi)); | 2980 DCHECK(ToRegister(instr->context()).is(esi)); |
| 2981 DCHECK(ToRegister(instr->global_object()).is(LoadIC::ReceiverRegister())); | 2981 DCHECK(ToRegister(instr->global_object()) |
| 2982 .is(LoadConvention::ReceiverRegister())); |
| 2982 DCHECK(ToRegister(instr->result()).is(eax)); | 2983 DCHECK(ToRegister(instr->result()).is(eax)); |
| 2983 | 2984 |
| 2984 __ mov(LoadIC::NameRegister(), instr->name()); | 2985 __ mov(LoadConvention::NameRegister(), instr->name()); |
| 2985 if (FLAG_vector_ics) { | 2986 if (FLAG_vector_ics) { |
| 2986 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); | 2987 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); |
| 2987 } | 2988 } |
| 2988 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; | 2989 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; |
| 2989 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); | 2990 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); |
| 2990 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2991 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2991 } | 2992 } |
| 2992 | 2993 |
| 2993 | 2994 |
| 2994 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { | 2995 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3106 } else if (operand->IsRegister()) { | 3107 } else if (operand->IsRegister()) { |
| 3107 __ push(ToRegister(operand)); | 3108 __ push(ToRegister(operand)); |
| 3108 } else { | 3109 } else { |
| 3109 __ push(ToOperand(operand)); | 3110 __ push(ToOperand(operand)); |
| 3110 } | 3111 } |
| 3111 } | 3112 } |
| 3112 | 3113 |
| 3113 | 3114 |
| 3114 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 3115 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
| 3115 DCHECK(ToRegister(instr->context()).is(esi)); | 3116 DCHECK(ToRegister(instr->context()).is(esi)); |
| 3116 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3117 DCHECK(ToRegister(instr->object()).is(LoadConvention::ReceiverRegister())); |
| 3117 DCHECK(ToRegister(instr->result()).is(eax)); | 3118 DCHECK(ToRegister(instr->result()).is(eax)); |
| 3118 | 3119 |
| 3119 __ mov(LoadIC::NameRegister(), instr->name()); | 3120 __ mov(LoadConvention::NameRegister(), instr->name()); |
| 3120 if (FLAG_vector_ics) { | 3121 if (FLAG_vector_ics) { |
| 3121 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); | 3122 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); |
| 3122 } | 3123 } |
| 3123 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); | 3124 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); |
| 3124 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3125 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 3125 } | 3126 } |
| 3126 | 3127 |
| 3127 | 3128 |
| 3128 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 3129 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
| 3129 Register function = ToRegister(instr->function()); | 3130 Register function = ToRegister(instr->function()); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3331 return Operand(elements_pointer_reg, | 3332 return Operand(elements_pointer_reg, |
| 3332 ToRegister(key), | 3333 ToRegister(key), |
| 3333 scale_factor, | 3334 scale_factor, |
| 3334 base_offset); | 3335 base_offset); |
| 3335 } | 3336 } |
| 3336 } | 3337 } |
| 3337 | 3338 |
| 3338 | 3339 |
| 3339 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 3340 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
| 3340 DCHECK(ToRegister(instr->context()).is(esi)); | 3341 DCHECK(ToRegister(instr->context()).is(esi)); |
| 3341 DCHECK(ToRegister(instr->object()).is(LoadIC::ReceiverRegister())); | 3342 DCHECK(ToRegister(instr->object()).is(LoadConvention::ReceiverRegister())); |
| 3342 DCHECK(ToRegister(instr->key()).is(LoadIC::NameRegister())); | 3343 DCHECK(ToRegister(instr->key()).is(LoadConvention::NameRegister())); |
| 3343 | 3344 |
| 3344 if (FLAG_vector_ics) { | 3345 if (FLAG_vector_ics) { |
| 3345 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); | 3346 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); |
| 3346 } | 3347 } |
| 3347 | 3348 |
| 3348 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 3349 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
| 3349 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3350 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 3350 } | 3351 } |
| 3351 | 3352 |
| 3352 | 3353 |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3967 temp, | 3968 temp, |
| 3968 EMIT_REMEMBERED_SET, | 3969 EMIT_REMEMBERED_SET, |
| 3969 instr->hydrogen()->SmiCheckForWriteBarrier(), | 3970 instr->hydrogen()->SmiCheckForWriteBarrier(), |
| 3970 instr->hydrogen()->PointersToHereCheckForValue()); | 3971 instr->hydrogen()->PointersToHereCheckForValue()); |
| 3971 } | 3972 } |
| 3972 } | 3973 } |
| 3973 | 3974 |
| 3974 | 3975 |
| 3975 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 3976 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 3976 DCHECK(ToRegister(instr->context()).is(esi)); | 3977 DCHECK(ToRegister(instr->context()).is(esi)); |
| 3977 DCHECK(ToRegister(instr->object()).is(StoreIC::ReceiverRegister())); | 3978 DCHECK(ToRegister(instr->object()).is(StoreConvention::ReceiverRegister())); |
| 3978 DCHECK(ToRegister(instr->value()).is(StoreIC::ValueRegister())); | 3979 DCHECK(ToRegister(instr->value()).is(StoreConvention::ValueRegister())); |
| 3979 | 3980 |
| 3980 __ mov(StoreIC::NameRegister(), instr->name()); | 3981 __ mov(StoreConvention::NameRegister(), instr->name()); |
| 3981 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode()); | 3982 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode()); |
| 3982 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3983 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 3983 } | 3984 } |
| 3984 | 3985 |
| 3985 | 3986 |
| 3986 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 3987 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
| 3987 Condition cc = instr->hydrogen()->allow_equality() ? above : above_equal; | 3988 Condition cc = instr->hydrogen()->allow_equality() ? above : above_equal; |
| 3988 if (instr->index()->IsConstantOperand()) { | 3989 if (instr->index()->IsConstantOperand()) { |
| 3989 __ cmp(ToOperand(instr->length()), | 3990 __ cmp(ToOperand(instr->length()), |
| 3990 ToImmediate(LConstantOperand::cast(instr->index()), | 3991 ToImmediate(LConstantOperand::cast(instr->index()), |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4178 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4179 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
| 4179 DoStoreKeyedFixedDoubleArray(instr); | 4180 DoStoreKeyedFixedDoubleArray(instr); |
| 4180 } else { | 4181 } else { |
| 4181 DoStoreKeyedFixedArray(instr); | 4182 DoStoreKeyedFixedArray(instr); |
| 4182 } | 4183 } |
| 4183 } | 4184 } |
| 4184 | 4185 |
| 4185 | 4186 |
| 4186 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4187 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 4187 DCHECK(ToRegister(instr->context()).is(esi)); | 4188 DCHECK(ToRegister(instr->context()).is(esi)); |
| 4188 DCHECK(ToRegister(instr->object()).is(KeyedStoreIC::ReceiverRegister())); | 4189 DCHECK(ToRegister(instr->object()).is(StoreConvention::ReceiverRegister())); |
| 4189 DCHECK(ToRegister(instr->key()).is(KeyedStoreIC::NameRegister())); | 4190 DCHECK(ToRegister(instr->key()).is(StoreConvention::NameRegister())); |
| 4190 DCHECK(ToRegister(instr->value()).is(KeyedStoreIC::ValueRegister())); | 4191 DCHECK(ToRegister(instr->value()).is(StoreConvention::ValueRegister())); |
| 4191 | 4192 |
| 4192 Handle<Code> ic = instr->strict_mode() == STRICT | 4193 Handle<Code> ic = instr->strict_mode() == STRICT |
| 4193 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() | 4194 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() |
| 4194 : isolate()->builtins()->KeyedStoreIC_Initialize(); | 4195 : isolate()->builtins()->KeyedStoreIC_Initialize(); |
| 4195 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4196 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 4196 } | 4197 } |
| 4197 | 4198 |
| 4198 | 4199 |
| 4199 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { | 4200 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { |
| 4200 Register object = ToRegister(instr->object()); | 4201 Register object = ToRegister(instr->object()); |
| (...skipping 1500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5701 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5702 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 5702 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5703 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 5703 } | 5704 } |
| 5704 | 5705 |
| 5705 | 5706 |
| 5706 #undef __ | 5707 #undef __ |
| 5707 | 5708 |
| 5708 } } // namespace v8::internal | 5709 } } // namespace v8::internal |
| 5709 | 5710 |
| 5710 #endif // V8_TARGET_ARCH_X87 | 5711 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |