| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include "src/crankshaft/s390/lithium-codegen-s390.h" | 6 #include "src/crankshaft/s390/lithium-codegen-s390.h" |
| 7 | 7 |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 4646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4657 // Slow case: Call the runtime system to do the number allocation. | 4657 // Slow case: Call the runtime system to do the number allocation. |
| 4658 __ bind(&slow); | 4658 __ bind(&slow); |
| 4659 { | 4659 { |
| 4660 // TODO(3095996): Put a valid pointer value in the stack slot where the | 4660 // TODO(3095996): Put a valid pointer value in the stack slot where the |
| 4661 // result register is stored, as this register is in the pointer map, but | 4661 // result register is stored, as this register is in the pointer map, but |
| 4662 // contains an integer value. | 4662 // contains an integer value. |
| 4663 __ LoadImmP(dst, Operand::Zero()); | 4663 __ LoadImmP(dst, Operand::Zero()); |
| 4664 | 4664 |
| 4665 // Preserve the value of all registers. | 4665 // Preserve the value of all registers. |
| 4666 PushSafepointRegistersScope scope(this); | 4666 PushSafepointRegistersScope scope(this); |
| 4667 | 4667 // Reset the context register. |
| 4668 // NumberTagI and NumberTagD use the context from the frame, rather than | 4668 if (!dst.is(cp)) { |
| 4669 // the environment's HContext or HInlinedContext value. | 4669 __ LoadImmP(cp, Operand::Zero()); |
| 4670 // They only call Runtime::kAllocateHeapNumber. | 4670 } |
| 4671 // The corresponding HChange instructions are added in a phase that does | |
| 4672 // not have easy access to the local context. | |
| 4673 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 4674 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4671 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
| 4675 RecordSafepointWithRegisters(instr->pointer_map(), 0, | 4672 RecordSafepointWithRegisters(instr->pointer_map(), 0, |
| 4676 Safepoint::kNoLazyDeopt); | 4673 Safepoint::kNoLazyDeopt); |
| 4677 __ StoreToSafepointRegisterSlot(r2, dst); | 4674 __ StoreToSafepointRegisterSlot(r2, dst); |
| 4678 } | 4675 } |
| 4679 | 4676 |
| 4680 // Done. Put the value in dbl_scratch into the value of the allocated heap | 4677 // Done. Put the value in dbl_scratch into the value of the allocated heap |
| 4681 // number. | 4678 // number. |
| 4682 __ bind(&done); | 4679 __ bind(&done); |
| 4683 __ StoreDouble(dbl_scratch, FieldMemOperand(dst, HeapNumber::kValueOffset)); | 4680 __ StoreDouble(dbl_scratch, FieldMemOperand(dst, HeapNumber::kValueOffset)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 4713 } | 4710 } |
| 4714 | 4711 |
| 4715 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { | 4712 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { |
| 4716 // TODO(3095996): Get rid of this. For now, we need to make the | 4713 // TODO(3095996): Get rid of this. For now, we need to make the |
| 4717 // result register contain a valid pointer because it is already | 4714 // result register contain a valid pointer because it is already |
| 4718 // contained in the register pointer map. | 4715 // contained in the register pointer map. |
| 4719 Register reg = ToRegister(instr->result()); | 4716 Register reg = ToRegister(instr->result()); |
| 4720 __ LoadImmP(reg, Operand::Zero()); | 4717 __ LoadImmP(reg, Operand::Zero()); |
| 4721 | 4718 |
| 4722 PushSafepointRegistersScope scope(this); | 4719 PushSafepointRegistersScope scope(this); |
| 4723 // NumberTagI and NumberTagD use the context from the frame, rather than | 4720 // Reset the context register. |
| 4724 // the environment's HContext or HInlinedContext value. | 4721 if (!reg.is(cp)) { |
| 4725 // They only call Runtime::kAllocateHeapNumber. | 4722 __ LoadImmP(cp, Operand::Zero()); |
| 4726 // The corresponding HChange instructions are added in a phase that does | 4723 } |
| 4727 // not have easy access to the local context. | |
| 4728 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 4729 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | 4724 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); |
| 4730 RecordSafepointWithRegisters(instr->pointer_map(), 0, | 4725 RecordSafepointWithRegisters(instr->pointer_map(), 0, |
| 4731 Safepoint::kNoLazyDeopt); | 4726 Safepoint::kNoLazyDeopt); |
| 4732 __ StoreToSafepointRegisterSlot(r2, reg); | 4727 __ StoreToSafepointRegisterSlot(r2, reg); |
| 4733 } | 4728 } |
| 4734 | 4729 |
| 4735 void LCodeGen::DoSmiTag(LSmiTag* instr) { | 4730 void LCodeGen::DoSmiTag(LSmiTag* instr) { |
| 4736 HChange* hchange = instr->hydrogen(); | 4731 HChange* hchange = instr->hydrogen(); |
| 4737 Register input = ToRegister(instr->value()); | 4732 Register input = ToRegister(instr->value()); |
| 4738 Register output = ToRegister(instr->result()); | 4733 Register output = ToRegister(instr->result()); |
| (...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5673 __ LoadP(result, | 5668 __ LoadP(result, |
| 5674 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); | 5669 FieldMemOperand(scratch, FixedArray::kHeaderSize - kPointerSize)); |
| 5675 __ bind(deferred->exit()); | 5670 __ bind(deferred->exit()); |
| 5676 __ bind(&done); | 5671 __ bind(&done); |
| 5677 } | 5672 } |
| 5678 | 5673 |
| 5679 #undef __ | 5674 #undef __ |
| 5680 | 5675 |
| 5681 } // namespace internal | 5676 } // namespace internal |
| 5682 } // namespace v8 | 5677 } // namespace v8 |
| OLD | NEW |