| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 4404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4415 // Slow case: Call the runtime system to do the number allocation. | 4415 // Slow case: Call the runtime system to do the number allocation. |
| 4416 __ bind(&slow); | 4416 __ bind(&slow); |
| 4417 { | 4417 { |
| 4418 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4418 // TODO(3095996): Put a valid pointer value in the stack slot where the |
| 4419 // result register is stored, as this register is in the pointer map, but | 4419 // result register is stored, as this register is in the pointer map, but |
| 4420 // contains an integer value. | 4420 // contains an integer value. |
| 4421 __ mov(dst, zero_reg); | 4421 __ mov(dst, zero_reg); |
| 4422 | 4422 |
| 4423 // Preserve the value of all registers. | 4423 // Preserve the value of all registers. |
| 4424 PushSafepointRegistersScope scope(this); | 4424 PushSafepointRegistersScope scope(this); |
| 4425 | 4425 // Reset the context register. |
| 4426 // NumberTagI and NumberTagD use the context from the frame, rather than | 4426 if (!dst.is(cp)) { |
| 4427 // the environment's HContext or HInlinedContext value. | 4427 __ mov(cp, zero_reg); |
| 4428 // They only call Runtime::kAllocateHeapNumber. | 4428 } |
| 4429 // The corresponding HChange instructions are added in a phase that does | |
| 4430 // not have easy access to the local context. | |
| 4431 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 4432 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4429 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
| 4433 RecordSafepointWithRegisters( | 4430 RecordSafepointWithRegisters( |
| 4434 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4431 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
| 4435 __ StoreToSafepointRegisterSlot(v0, dst); | 4432 __ StoreToSafepointRegisterSlot(v0, dst); |
| 4436 } | 4433 } |
| 4437 | 4434 |
| 4438 // Done. Put the value in dbl_scratch into the value of the allocated heap | 4435 // Done. Put the value in dbl_scratch into the value of the allocated heap |
| 4439 // number. | 4436 // number. |
| 4440 __ bind(&done); | 4437 __ bind(&done); |
| 4441 __ sdc1(dbl_scratch, FieldMemOperand(dst, HeapNumber::kValueOffset)); | 4438 __ sdc1(dbl_scratch, FieldMemOperand(dst, HeapNumber::kValueOffset)); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4474 | 4471 |
| 4475 | 4472 |
| 4476 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4473 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
| 4477 // TODO(3095996): Get rid of this. For now, we need to make the | 4474 // TODO(3095996): Get rid of this. For now, we need to make the |
| 4478 // result register contain a valid pointer because it is already | 4475 // result register contain a valid pointer because it is already |
| 4479 // contained in the register pointer map. | 4476 // contained in the register pointer map. |
| 4480 Register reg = ToRegister(instr->result()); | 4477 Register reg = ToRegister(instr->result()); |
| 4481 __ mov(reg, zero_reg); | 4478 __ mov(reg, zero_reg); |
| 4482 | 4479 |
| 4483 PushSafepointRegistersScope scope(this); | 4480 PushSafepointRegistersScope scope(this); |
| 4484 // NumberTagI and NumberTagD use the context from the frame, rather than | 4481 // Reset the context register. |
| 4485 // the environment's HContext or HInlinedContext value. | 4482 if (!dst.is(cp)) { |
| 4486 // They only call Runtime::kAllocateHeapNumber. | 4483 __ mov(cp, zero_reg); |
| 4487 // The corresponding HChange instructions are added in a phase that does | 4484 } |
| 4488 // not have easy access to the local context. | |
| 4489 __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 4490 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4485 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
| 4491 RecordSafepointWithRegisters( | 4486 RecordSafepointWithRegisters( |
| 4492 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4487 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
| 4493 __ StoreToSafepointRegisterSlot(v0, reg); | 4488 __ StoreToSafepointRegisterSlot(v0, reg); |
| 4494 } | 4489 } |
| 4495 | 4490 |
| 4496 | 4491 |
| 4497 void LCodeGen::DoSmiTag(LSmiTag* instr) { | 4492 void LCodeGen::DoSmiTag(LSmiTag* instr) { |
| 4498 HChange* hchange = instr->hydrogen(); | 4493 HChange* hchange = instr->hydrogen(); |
| 4499 Register input = ToRegister(instr->value()); | 4494 Register input = ToRegister(instr->value()); |
| (...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5530 __ lw(result, FieldMemOperand(scratch, | 5525 __ lw(result, FieldMemOperand(scratch, |
| 5531 FixedArray::kHeaderSize - kPointerSize)); | 5526 FixedArray::kHeaderSize - kPointerSize)); |
| 5532 __ bind(deferred->exit()); | 5527 __ bind(deferred->exit()); |
| 5533 __ bind(&done); | 5528 __ bind(&done); |
| 5534 } | 5529 } |
| 5535 | 5530 |
| 5536 #undef __ | 5531 #undef __ |
| 5537 | 5532 |
| 5538 } // namespace internal | 5533 } // namespace internal |
| 5539 } // namespace v8 | 5534 } // namespace v8 |
| OLD | NEW |