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 #if V8_TARGET_ARCH_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
6 | 6 |
7 #include "src/crankshaft/ia32/lithium-codegen-ia32.h" | 7 #include "src/crankshaft/ia32/lithium-codegen-ia32.h" |
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 4247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4258 // Slow case: Call the runtime system to do the number allocation. | 4258 // Slow case: Call the runtime system to do the number allocation. |
4259 __ bind(&slow); | 4259 __ bind(&slow); |
4260 { | 4260 { |
4261 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4261 // TODO(3095996): Put a valid pointer value in the stack slot where the |
4262 // result register is stored, as this register is in the pointer map, but | 4262 // result register is stored, as this register is in the pointer map, but |
4263 // contains an integer value. | 4263 // contains an integer value. |
4264 __ Move(reg, Immediate(0)); | 4264 __ Move(reg, Immediate(0)); |
4265 | 4265 |
4266 // Preserve the value of all registers. | 4266 // Preserve the value of all registers. |
4267 PushSafepointRegistersScope scope(this); | 4267 PushSafepointRegistersScope scope(this); |
4268 | 4268 // Reset the context register. |
4269 // NumberTagI and NumberTagD use the context from the frame, rather than | 4269 if (!reg.is(esi)) { |
4270 // the environment's HContext or HInlinedContext value. | 4270 __ Move(esi, Immediate(0)); |
4271 // They only call Runtime::kAllocateHeapNumber. | 4271 } |
4272 // The corresponding HChange instructions are added in a phase that does | |
4273 // not have easy access to the local context. | |
4274 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | |
4275 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4272 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4276 RecordSafepointWithRegisters( | 4273 RecordSafepointWithRegisters( |
4277 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4274 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4278 __ StoreToSafepointRegisterSlot(reg, eax); | 4275 __ StoreToSafepointRegisterSlot(reg, eax); |
4279 } | 4276 } |
4280 | 4277 |
4281 // Done. Put the value in xmm_scratch into the value of the allocated heap | 4278 // Done. Put the value in xmm_scratch into the value of the allocated heap |
4282 // number. | 4279 // number. |
4283 __ bind(&done); | 4280 __ bind(&done); |
4284 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), xmm_scratch); | 4281 __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), xmm_scratch); |
(...skipping 29 matching lines...) Expand all Loading... |
4314 | 4311 |
4315 | 4312 |
4316 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4313 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
4317 // TODO(3095996): Get rid of this. For now, we need to make the | 4314 // TODO(3095996): Get rid of this. For now, we need to make the |
4318 // result register contain a valid pointer because it is already | 4315 // result register contain a valid pointer because it is already |
4319 // contained in the register pointer map. | 4316 // contained in the register pointer map. |
4320 Register reg = ToRegister(instr->result()); | 4317 Register reg = ToRegister(instr->result()); |
4321 __ Move(reg, Immediate(0)); | 4318 __ Move(reg, Immediate(0)); |
4322 | 4319 |
4323 PushSafepointRegistersScope scope(this); | 4320 PushSafepointRegistersScope scope(this); |
4324 // NumberTagI and NumberTagD use the context from the frame, rather than | 4321 // Reset the context register. |
4325 // the environment's HContext or HInlinedContext value. | 4322 if (!reg.is(esi)) { |
4326 // They only call Runtime::kAllocateHeapNumber. | 4323 __ Move(esi, Immediate(0)); |
4327 // The corresponding HChange instructions are added in a phase that does | 4324 } |
4328 // not have easy access to the local context. | |
4329 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | |
4330 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4325 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
4331 RecordSafepointWithRegisters( | 4326 RecordSafepointWithRegisters( |
4332 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4327 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
4333 __ StoreToSafepointRegisterSlot(reg, eax); | 4328 __ StoreToSafepointRegisterSlot(reg, eax); |
4334 } | 4329 } |
4335 | 4330 |
4336 | 4331 |
4337 void LCodeGen::DoSmiTag(LSmiTag* instr) { | 4332 void LCodeGen::DoSmiTag(LSmiTag* instr) { |
4338 HChange* hchange = instr->hydrogen(); | 4333 HChange* hchange = instr->hydrogen(); |
4339 Register input = ToRegister(instr->value()); | 4334 Register input = ToRegister(instr->value()); |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5290 __ bind(deferred->exit()); | 5285 __ bind(deferred->exit()); |
5291 __ bind(&done); | 5286 __ bind(&done); |
5292 } | 5287 } |
5293 | 5288 |
5294 #undef __ | 5289 #undef __ |
5295 | 5290 |
5296 } // namespace internal | 5291 } // namespace internal |
5297 } // namespace v8 | 5292 } // namespace v8 |
5298 | 5293 |
5299 #endif // V8_TARGET_ARCH_IA32 | 5294 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |