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 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 2880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2891 Handle<Code> ic = | 2891 Handle<Code> ic = |
2892 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), | 2892 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), |
2893 SLOPPY, PREMONOMORPHIC).code(); | 2893 SLOPPY, PREMONOMORPHIC).code(); |
2894 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2894 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
2895 } | 2895 } |
2896 | 2896 |
2897 | 2897 |
2898 void LCodeGen::DoLoadGlobalViaContext(LLoadGlobalViaContext* instr) { | 2898 void LCodeGen::DoLoadGlobalViaContext(LLoadGlobalViaContext* instr) { |
2899 DCHECK(ToRegister(instr->context()).is(rsi)); | 2899 DCHECK(ToRegister(instr->context()).is(rsi)); |
2900 DCHECK(ToRegister(instr->result()).is(rax)); | 2900 DCHECK(ToRegister(instr->result()).is(rax)); |
2901 | 2901 int const slot = instr->slot_index(); |
2902 __ Move(LoadGlobalViaContextDescriptor::DepthRegister(), | 2902 int const depth = instr->depth(); |
2903 Smi::FromInt(instr->depth())); | 2903 if (depth <= LoadGlobalViaContextStub::kMaximumDepth) { |
2904 __ Move(LoadGlobalViaContextDescriptor::SlotRegister(), | 2904 __ Set(LoadGlobalViaContextDescriptor::SlotRegister(), slot); |
2905 Smi::FromInt(instr->slot_index())); | 2905 __ Move(LoadGlobalViaContextDescriptor::NameRegister(), instr->name()); |
2906 __ Move(LoadGlobalViaContextDescriptor::NameRegister(), instr->name()); | 2906 Handle<Code> stub = |
2907 | 2907 CodeFactory::LoadGlobalViaContext(isolate(), depth).code(); |
2908 Handle<Code> stub = | 2908 CallCode(stub, RelocInfo::CODE_TARGET, instr); |
2909 CodeFactory::LoadGlobalViaContext(isolate(), instr->depth()).code(); | 2909 } else { |
2910 CallCode(stub, RelocInfo::CODE_TARGET, instr); | 2910 __ Push(Smi::FromInt(slot)); |
| 2911 __ Push(instr->name()); |
| 2912 __ CallRuntime(Runtime::kLoadGlobalViaContext, 2); |
| 2913 } |
2911 } | 2914 } |
2912 | 2915 |
2913 | 2916 |
2914 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 2917 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
2915 Register context = ToRegister(instr->context()); | 2918 Register context = ToRegister(instr->context()); |
2916 Register result = ToRegister(instr->result()); | 2919 Register result = ToRegister(instr->result()); |
2917 __ movp(result, ContextOperand(context, instr->slot_index())); | 2920 __ movp(result, ContextOperand(context, instr->slot_index())); |
2918 if (instr->hydrogen()->RequiresHoleCheck()) { | 2921 if (instr->hydrogen()->RequiresHoleCheck()) { |
2919 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); | 2922 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
2920 if (instr->hydrogen()->DeoptimizesOnHole()) { | 2923 if (instr->hydrogen()->DeoptimizesOnHole()) { |
(...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4265 isolate(), instr->language_mode(), | 4268 isolate(), instr->language_mode(), |
4266 instr->hydrogen()->initialization_state()).code(); | 4269 instr->hydrogen()->initialization_state()).code(); |
4267 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4270 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
4268 } | 4271 } |
4269 | 4272 |
4270 | 4273 |
4271 void LCodeGen::DoStoreGlobalViaContext(LStoreGlobalViaContext* instr) { | 4274 void LCodeGen::DoStoreGlobalViaContext(LStoreGlobalViaContext* instr) { |
4272 DCHECK(ToRegister(instr->context()).is(rsi)); | 4275 DCHECK(ToRegister(instr->context()).is(rsi)); |
4273 DCHECK(ToRegister(instr->value()) | 4276 DCHECK(ToRegister(instr->value()) |
4274 .is(StoreGlobalViaContextDescriptor::ValueRegister())); | 4277 .is(StoreGlobalViaContextDescriptor::ValueRegister())); |
4275 | 4278 int const slot = instr->slot_index(); |
4276 __ Move(StoreGlobalViaContextDescriptor::DepthRegister(), | 4279 int const depth = instr->depth(); |
4277 Smi::FromInt(instr->depth())); | 4280 if (depth <= StoreGlobalViaContextStub::kMaximumDepth) { |
4278 __ Move(StoreGlobalViaContextDescriptor::SlotRegister(), | 4281 __ Set(StoreGlobalViaContextDescriptor::SlotRegister(), slot); |
4279 Smi::FromInt(instr->slot_index())); | 4282 __ Move(StoreGlobalViaContextDescriptor::NameRegister(), instr->name()); |
4280 __ Move(StoreGlobalViaContextDescriptor::NameRegister(), instr->name()); | 4283 Handle<Code> stub = CodeFactory::StoreGlobalViaContext( |
4281 | 4284 isolate(), depth, instr->language_mode()) |
4282 Handle<Code> stub = | 4285 .code(); |
4283 CodeFactory::StoreGlobalViaContext(isolate(), instr->depth(), | 4286 CallCode(stub, RelocInfo::CODE_TARGET, instr); |
4284 instr->language_mode()).code(); | 4287 } else { |
4285 CallCode(stub, RelocInfo::CODE_TARGET, instr); | 4288 __ Push(Smi::FromInt(slot)); |
| 4289 __ Push(instr->name()); |
| 4290 __ Push(StoreGlobalViaContextDescriptor::ValueRegister()); |
| 4291 __ CallRuntime(is_strict(instr->language_mode()) |
| 4292 ? Runtime::kStoreGlobalViaContext_Strict |
| 4293 : Runtime::kStoreGlobalViaContext_Sloppy, |
| 4294 3); |
| 4295 } |
4286 } | 4296 } |
4287 | 4297 |
4288 | 4298 |
4289 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 4299 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
4290 Representation representation = instr->hydrogen()->length()->representation(); | 4300 Representation representation = instr->hydrogen()->length()->representation(); |
4291 DCHECK(representation.Equals(instr->hydrogen()->index()->representation())); | 4301 DCHECK(representation.Equals(instr->hydrogen()->index()->representation())); |
4292 DCHECK(representation.IsSmiOrInteger32()); | 4302 DCHECK(representation.IsSmiOrInteger32()); |
4293 | 4303 |
4294 Condition cc = instr->hydrogen()->allow_equality() ? below : below_equal; | 4304 Condition cc = instr->hydrogen()->allow_equality() ? below : below_equal; |
4295 if (instr->length()->IsConstantOperand()) { | 4305 if (instr->length()->IsConstantOperand()) { |
(...skipping 1767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6063 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6073 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6064 } | 6074 } |
6065 | 6075 |
6066 | 6076 |
6067 #undef __ | 6077 #undef __ |
6068 | 6078 |
6069 } // namespace internal | 6079 } // namespace internal |
6070 } // namespace v8 | 6080 } // namespace v8 |
6071 | 6081 |
6072 #endif // V8_TARGET_ARCH_X64 | 6082 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |