| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #ifndef V8_S390_MACRO_ASSEMBLER_S390_H_ | 5 #ifndef V8_S390_MACRO_ASSEMBLER_S390_H_ |
| 6 #define V8_S390_MACRO_ASSEMBLER_S390_H_ | 6 #define V8_S390_MACRO_ASSEMBLER_S390_H_ |
| 7 | 7 |
| 8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/frames.h" | 10 #include "src/frames.h" |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 void FlushICache(Register address, size_t size, Register scratch); | 728 void FlushICache(Register address, size_t size, Register scratch); |
| 729 | 729 |
| 730 // If the value is a NaN, canonicalize the value else, do nothing. | 730 // If the value is a NaN, canonicalize the value else, do nothing. |
| 731 void CanonicalizeNaN(const DoubleRegister dst, const DoubleRegister src); | 731 void CanonicalizeNaN(const DoubleRegister dst, const DoubleRegister src); |
| 732 void CanonicalizeNaN(const DoubleRegister value) { | 732 void CanonicalizeNaN(const DoubleRegister value) { |
| 733 CanonicalizeNaN(value, value); | 733 CanonicalizeNaN(value, value); |
| 734 } | 734 } |
| 735 | 735 |
| 736 // Converts the integer (untagged smi) in |src| to a double, storing | 736 // Converts the integer (untagged smi) in |src| to a double, storing |
| 737 // the result to |dst| | 737 // the result to |dst| |
| 738 void ConvertIntToDouble(Register src, DoubleRegister dst); | 738 void ConvertIntToDouble(DoubleRegister dst, Register src); |
| 739 | 739 |
| 740 // Converts the unsigned integer (untagged smi) in |src| to | 740 // Converts the unsigned integer (untagged smi) in |src| to |
| 741 // a double, storing the result to |dst| | 741 // a double, storing the result to |dst| |
| 742 void ConvertUnsignedIntToDouble(Register src, DoubleRegister dst); | 742 void ConvertUnsignedIntToDouble(DoubleRegister dst, Register src); |
| 743 | 743 |
| 744 // Converts the integer (untagged smi) in |src| to | 744 // Converts the integer (untagged smi) in |src| to |
| 745 // a float, storing the result in |dst| | 745 // a float, storing the result in |dst| |
| 746 void ConvertIntToFloat(Register src, DoubleRegister dst); | 746 void ConvertIntToFloat(DoubleRegister dst, Register src); |
| 747 | 747 |
| 748 // Converts the unsigned integer (untagged smi) in |src| to | 748 // Converts the unsigned integer (untagged smi) in |src| to |
| 749 // a float, storing the result in |dst| | 749 // a float, storing the result in |dst| |
| 750 void ConvertUnsignedIntToFloat(Register src, DoubleRegister dst); | 750 void ConvertUnsignedIntToFloat(DoubleRegister dst, Register src); |
| 751 | 751 |
| 752 #if V8_TARGET_ARCH_S390X | 752 void ConvertInt64ToFloat(DoubleRegister double_dst, Register src); |
| 753 void ConvertInt64ToFloat(Register src, DoubleRegister double_dst); | 753 void ConvertInt64ToDouble(DoubleRegister double_dst, Register src); |
| 754 void ConvertInt64ToDouble(Register src, DoubleRegister double_dst); | 754 void ConvertUnsignedInt64ToFloat(DoubleRegister double_dst, Register src); |
| 755 void ConvertUnsignedInt64ToFloat(Register src, DoubleRegister double_dst); | 755 void ConvertUnsignedInt64ToDouble(DoubleRegister double_dst, Register src); |
| 756 void ConvertUnsignedInt64ToDouble(Register src, DoubleRegister double_dst); | |
| 757 #endif | |
| 758 | 756 |
| 759 void MovIntToFloat(DoubleRegister dst, Register src); | 757 void MovIntToFloat(DoubleRegister dst, Register src); |
| 760 void MovFloatToInt(Register dst, DoubleRegister src); | 758 void MovFloatToInt(Register dst, DoubleRegister src); |
| 761 void MovDoubleToInt64(Register dst, DoubleRegister src); | 759 void MovDoubleToInt64(Register dst, DoubleRegister src); |
| 762 void MovInt64ToDouble(DoubleRegister dst, Register src); | 760 void MovInt64ToDouble(DoubleRegister dst, Register src); |
| 763 // Converts the double_input to an integer. Note that, upon return, | 761 // Converts the double_input to an integer. Note that, upon return, |
| 764 // the contents of double_dst will also hold the fixed point representation. | 762 // the contents of double_dst will also hold the fixed point representation. |
| 765 void ConvertFloat32ToInt64(const DoubleRegister double_input, | 763 void ConvertFloat32ToInt64(const Register dst, |
| 766 #if !V8_TARGET_ARCH_S390X | 764 const DoubleRegister double_input, |
| 767 const Register dst_hi, | |
| 768 #endif | |
| 769 const Register dst, | |
| 770 const DoubleRegister double_dst, | |
| 771 FPRoundingMode rounding_mode = kRoundToZero); | 765 FPRoundingMode rounding_mode = kRoundToZero); |
| 772 | 766 |
| 773 // Converts the double_input to an integer. Note that, upon return, | 767 // Converts the double_input to an integer. Note that, upon return, |
| 774 // the contents of double_dst will also hold the fixed point representation. | 768 // the contents of double_dst will also hold the fixed point representation. |
| 775 void ConvertDoubleToInt64(const DoubleRegister double_input, | 769 void ConvertDoubleToInt64(const Register dst, |
| 776 #if !V8_TARGET_ARCH_S390X | 770 const DoubleRegister double_input, |
| 777 const Register dst_hi, | 771 FPRoundingMode rounding_mode = kRoundToZero); |
| 778 #endif | 772 void ConvertDoubleToInt32(const Register dst, |
| 779 const Register dst, const DoubleRegister double_dst, | 773 const DoubleRegister double_input, |
| 780 FPRoundingMode rounding_mode = kRoundToZero); | 774 FPRoundingMode rounding_mode = kRoundToZero); |
| 781 | 775 |
| 782 void ConvertFloat32ToInt32(const DoubleRegister double_input, | 776 void ConvertFloat32ToInt32(const Register result, |
| 783 const Register dst, | 777 const DoubleRegister double_input, |
| 784 const DoubleRegister double_dst, | |
| 785 FPRoundingMode rounding_mode); | 778 FPRoundingMode rounding_mode); |
| 786 void ConvertFloat32ToUnsignedInt32( | 779 void ConvertFloat32ToUnsignedInt32( |
| 787 const DoubleRegister double_input, const Register dst, | 780 const Register result, const DoubleRegister double_input, |
| 788 const DoubleRegister double_dst, | |
| 789 FPRoundingMode rounding_mode = kRoundToZero); | 781 FPRoundingMode rounding_mode = kRoundToZero); |
| 790 #if V8_TARGET_ARCH_S390X | |
| 791 // Converts the double_input to an unsigned integer. Note that, upon return, | 782 // Converts the double_input to an unsigned integer. Note that, upon return, |
| 792 // the contents of double_dst will also hold the fixed point representation. | 783 // the contents of double_dst will also hold the fixed point representation. |
| 793 void ConvertDoubleToUnsignedInt64( | 784 void ConvertDoubleToUnsignedInt64( |
| 794 const DoubleRegister double_input, const Register dst, | 785 const Register dst, const DoubleRegister double_input, |
| 795 const DoubleRegister double_dst, | 786 FPRoundingMode rounding_mode = kRoundToZero); |
| 787 void ConvertDoubleToUnsignedInt32( |
| 788 const Register dst, const DoubleRegister double_input, |
| 796 FPRoundingMode rounding_mode = kRoundToZero); | 789 FPRoundingMode rounding_mode = kRoundToZero); |
| 797 void ConvertFloat32ToUnsignedInt64( | 790 void ConvertFloat32ToUnsignedInt64( |
| 798 const DoubleRegister double_input, const Register dst, | 791 const Register result, const DoubleRegister double_input, |
| 799 const DoubleRegister double_dst, | |
| 800 FPRoundingMode rounding_mode = kRoundToZero); | 792 FPRoundingMode rounding_mode = kRoundToZero); |
| 801 #endif | |
| 802 | 793 |
| 803 #if !V8_TARGET_ARCH_S390X | 794 #if !V8_TARGET_ARCH_S390X |
| 804 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, | 795 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, |
| 805 Register src_high, Register scratch, Register shift); | 796 Register src_high, Register scratch, Register shift); |
| 806 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, | 797 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, |
| 807 Register src_high, uint32_t shift); | 798 Register src_high, uint32_t shift); |
| 808 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, | 799 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, |
| 809 Register src_high, Register scratch, Register shift); | 800 Register src_high, Register scratch, Register shift); |
| 810 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, | 801 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, |
| 811 Register src_high, uint32_t shift); | 802 Register src_high, uint32_t shift); |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 // Jump if either of the registers contain a smi. | 1609 // Jump if either of the registers contain a smi. |
| 1619 void JumpIfEitherSmi(Register reg1, Register reg2, Label* on_either_smi); | 1610 void JumpIfEitherSmi(Register reg1, Register reg2, Label* on_either_smi); |
| 1620 | 1611 |
| 1621 // Abort execution if argument is a number, enabled via --debug-code. | 1612 // Abort execution if argument is a number, enabled via --debug-code. |
| 1622 void AssertNotNumber(Register object); | 1613 void AssertNotNumber(Register object); |
| 1623 | 1614 |
| 1624 // Abort execution if argument is a smi, enabled via --debug-code. | 1615 // Abort execution if argument is a smi, enabled via --debug-code. |
| 1625 void AssertNotSmi(Register object); | 1616 void AssertNotSmi(Register object); |
| 1626 void AssertSmi(Register object); | 1617 void AssertSmi(Register object); |
| 1627 | 1618 |
| 1628 #if V8_TARGET_ARCH_S390X | 1619 inline void TestIfInt32(Register value) { |
| 1629 inline void TestIfInt32(Register value, Register scratch) { | |
| 1630 // High bits must be identical to fit into an 32-bit integer | 1620 // High bits must be identical to fit into an 32-bit integer |
| 1631 lgfr(scratch, value); | 1621 cgfr(value, value); |
| 1632 CmpP(scratch, value); | |
| 1633 } | 1622 } |
| 1634 #else | |
| 1635 inline void TestIfInt32(Register hi_word, Register lo_word, | |
| 1636 Register scratch) { | |
| 1637 // High bits must be identical to fit into an 32-bit integer | |
| 1638 ShiftRightArith(scratch, lo_word, Operand(31)); | |
| 1639 CmpP(scratch, hi_word); | |
| 1640 } | |
| 1641 #endif | |
| 1642 | 1623 |
| 1643 #if V8_TARGET_ARCH_S390X | 1624 #if V8_TARGET_ARCH_S390X |
| 1644 // Ensure it is permissable to read/write int value directly from | 1625 // Ensure it is permissable to read/write int value directly from |
| 1645 // upper half of the smi. | 1626 // upper half of the smi. |
| 1646 STATIC_ASSERT(kSmiTag == 0); | 1627 STATIC_ASSERT(kSmiTag == 0); |
| 1647 STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 32); | 1628 STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 32); |
| 1648 #endif | 1629 #endif |
| 1649 #if V8_TARGET_LITTLE_ENDIAN | 1630 #if V8_TARGET_LITTLE_ENDIAN |
| 1650 #define SmiWordOffset(offset) (offset + kPointerSize / 2) | 1631 #define SmiWordOffset(offset) (offset + kPointerSize / 2) |
| 1651 #else | 1632 #else |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1859 inline MemOperand NativeContextMemOperand() { | 1840 inline MemOperand NativeContextMemOperand() { |
| 1860 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); | 1841 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); |
| 1861 } | 1842 } |
| 1862 | 1843 |
| 1863 #define ACCESS_MASM(masm) masm-> | 1844 #define ACCESS_MASM(masm) masm-> |
| 1864 | 1845 |
| 1865 } // namespace internal | 1846 } // namespace internal |
| 1866 } // namespace v8 | 1847 } // namespace v8 |
| 1867 | 1848 |
| 1868 #endif // V8_S390_MACRO_ASSEMBLER_S390_H_ | 1849 #endif // V8_S390_MACRO_ASSEMBLER_S390_H_ |
| OLD | NEW |