| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 traits -*- C++ -*-=// | 1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 traits -*- C++ -*-=// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 enum ScaleFactor { TIMES_1 = 0, TIMES_2 = 1, TIMES_4 = 2, TIMES_8 = 3 }; | 62 enum ScaleFactor { TIMES_1 = 0, TIMES_2 = 1, TIMES_4 = 2, TIMES_8 = 3 }; |
| 63 | 63 |
| 64 using GPRRegister = ::Ice::RegX8664::GPRRegister; | 64 using GPRRegister = ::Ice::RegX8664::GPRRegister; |
| 65 using ByteRegister = ::Ice::RegX8664::ByteRegister; | 65 using ByteRegister = ::Ice::RegX8664::ByteRegister; |
| 66 using XmmRegister = ::Ice::RegX8664::XmmRegister; | 66 using XmmRegister = ::Ice::RegX8664::XmmRegister; |
| 67 | 67 |
| 68 using Cond = ::Ice::CondX8664; | 68 using Cond = ::Ice::CondX8664; |
| 69 | 69 |
| 70 using RegisterSet = ::Ice::RegX8664; | 70 using RegisterSet = ::Ice::RegX8664; |
| 71 static const SizeT StackPtr = RegX8664::Reg_rsp; | 71 static constexpr SizeT StackPtr = RegX8664::Reg_rsp; |
| 72 static const SizeT FramePtr = RegX8664::Reg_rbp; | 72 static constexpr SizeT FramePtr = RegX8664::Reg_rbp; |
| 73 static const GPRRegister Encoded_Reg_Accumulator = RegX8664::Encoded_Reg_eax; | 73 static constexpr GPRRegister Encoded_Reg_Accumulator = |
| 74 static const GPRRegister Encoded_Reg_Counter = RegX8664::Encoded_Reg_ecx; | 74 RegX8664::Encoded_Reg_eax; |
| 75 static constexpr GPRRegister Encoded_Reg_Counter = RegX8664::Encoded_Reg_ecx; |
| 75 static constexpr FixupKind FK_PcRel = llvm::ELF::R_X86_64_PC32; | 76 static constexpr FixupKind FK_PcRel = llvm::ELF::R_X86_64_PC32; |
| 76 static constexpr FixupKind FK_Abs = llvm::ELF::R_X86_64_32; | 77 static constexpr FixupKind FK_Abs = llvm::ELF::R_X86_64_32; |
| 77 static constexpr FixupKind FK_Gotoff = llvm::ELF::R_X86_64_GOTOFF64; | 78 static constexpr FixupKind FK_Gotoff = llvm::ELF::R_X86_64_GOTOFF64; |
| 78 static constexpr FixupKind FK_GotPC = llvm::ELF::R_X86_64_GOTPC32; | 79 static constexpr FixupKind FK_GotPC = llvm::ELF::R_X86_64_GOTPC32; |
| 79 | 80 |
| 80 class Operand { | 81 class Operand { |
| 81 public: | 82 public: |
| 82 enum RexBits { | 83 enum RexBits { |
| 83 RexNone = 0x00, | 84 RexNone = 0x00, |
| 84 RexBase = 0x40, | 85 RexBase = 0x40, |
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 } | 709 } |
| 709 Str << "}\n"; | 710 Str << "}\n"; |
| 710 } | 711 } |
| 711 } | 712 } |
| 712 } | 713 } |
| 713 | 714 |
| 714 static int32_t getRaxOrDie() { return RegisterSet::Reg_rax; } | 715 static int32_t getRaxOrDie() { return RegisterSet::Reg_rax; } |
| 715 | 716 |
| 716 static int32_t getRdxOrDie() { return RegisterSet::Reg_rdx; } | 717 static int32_t getRdxOrDie() { return RegisterSet::Reg_rdx; } |
| 717 | 718 |
| 719 // x86-64 calling convention: |
| 720 // |
| 721 // * The first eight arguments of vector/fp type, regardless of their |
| 722 // position relative to the other arguments in the argument list, are placed |
| 723 // in registers %xmm0 - %xmm7. |
| 724 // |
| 725 // * The first six arguments of integer types, regardless of their position |
| 726 // relative to the other arguments in the argument list, are placed in |
| 727 // registers %rdi, %rsi, %rdx, %rcx, %r8, and %r9. |
| 728 // |
| 729 // This intends to match the section "Function Calling Sequence" of the |
| 730 // document "System V Application Binary Interface." |
| 731 |
| 718 /// The maximum number of arguments to pass in XMM registers | 732 /// The maximum number of arguments to pass in XMM registers |
| 719 static const uint32_t X86_MAX_XMM_ARGS = 8; | 733 static constexpr uint32_t X86_MAX_XMM_ARGS = 8; |
| 720 /// The maximum number of arguments to pass in GPR registers | 734 /// The maximum number of arguments to pass in GPR registers |
| 721 static const uint32_t X86_MAX_GPR_ARGS = 6; | 735 static constexpr uint32_t X86_MAX_GPR_ARGS = 6; |
| 736 /// Whether scalar floating point arguments are passed in XMM registers |
| 737 static constexpr bool X86_PASS_SCALAR_FP_IN_XMM = true; |
| 738 /// Get the register for a given argument slot in the XMM registers. |
| 739 static int32_t getRegisterForXmmArgNum(uint32_t ArgNum) { |
| 740 // TODO(sehr): Change to use the CCArg technique used in ARM32. |
| 741 static_assert(RegisterSet::Reg_xmm0 + 1 == RegisterSet::Reg_xmm1, |
| 742 "Inconsistency between XMM register numbers and ordinals"); |
| 743 if (ArgNum >= X86_MAX_XMM_ARGS) { |
| 744 return Variable::NoRegister; |
| 745 } |
| 746 return static_cast<int32_t>(RegisterSet::Reg_xmm0 + ArgNum); |
| 747 } |
| 748 /// Get the register for a given argument slot in the GPRs. |
| 749 static int32_t getRegisterForGprArgNum(Type Ty, uint32_t ArgNum) { |
| 750 if (ArgNum >= X86_MAX_GPR_ARGS) { |
| 751 return Variable::NoRegister; |
| 752 } |
| 753 static const RegisterSet::AllRegisters GprForArgNum[] = { |
| 754 RegisterSet::Reg_rdi, RegisterSet::Reg_rsi, RegisterSet::Reg_rdx, |
| 755 RegisterSet::Reg_rcx, RegisterSet::Reg_r8, RegisterSet::Reg_r9, |
| 756 }; |
| 757 static_assert(llvm::array_lengthof(GprForArgNum) == X86_MAX_GPR_ARGS, |
| 758 "Mismatch between MAX_GPR_ARGS and GprForArgNum."); |
| 759 assert(Ty == IceType_i64 || Ty == IceType_i32); |
| 760 return static_cast<int32_t>(getGprForType(Ty, GprForArgNum[ArgNum])); |
| 761 } |
| 762 |
| 722 /// The number of bits in a byte | 763 /// The number of bits in a byte |
| 723 static const uint32_t X86_CHAR_BIT = 8; | 764 static constexpr uint32_t X86_CHAR_BIT = 8; |
| 724 /// Stack alignment. This is defined in IceTargetLoweringX8664.cpp because it | 765 /// Stack alignment. This is defined in IceTargetLoweringX8664.cpp because it |
| 725 /// is used as an argument to std::max(), and the default std::less<T> has an | 766 /// is used as an argument to std::max(), and the default std::less<T> has an |
| 726 /// operator(T const&, T const&) which requires this member to have an | 767 /// operator(T const&, T const&) which requires this member to have an |
| 727 /// address. | 768 /// address. |
| 728 static const uint32_t X86_STACK_ALIGNMENT_BYTES; | 769 static const uint32_t X86_STACK_ALIGNMENT_BYTES; |
| 729 /// Size of the return address on the stack | 770 /// Size of the return address on the stack |
| 730 static const uint32_t X86_RET_IP_SIZE_BYTES = 8; | 771 static constexpr uint32_t X86_RET_IP_SIZE_BYTES = 8; |
| 731 /// The number of different NOP instructions | 772 /// The number of different NOP instructions |
| 732 static const uint32_t X86_NUM_NOP_VARIANTS = 5; | 773 static constexpr uint32_t X86_NUM_NOP_VARIANTS = 5; |
| 733 | 774 |
| 734 /// \name Limits for unrolling memory intrinsics. | 775 /// \name Limits for unrolling memory intrinsics. |
| 735 /// @{ | 776 /// @{ |
| 736 static constexpr uint32_t MEMCPY_UNROLL_LIMIT = 8; | 777 static constexpr uint32_t MEMCPY_UNROLL_LIMIT = 8; |
| 737 static constexpr uint32_t MEMMOVE_UNROLL_LIMIT = 8; | 778 static constexpr uint32_t MEMMOVE_UNROLL_LIMIT = 8; |
| 738 static constexpr uint32_t MEMSET_UNROLL_LIMIT = 16; | 779 static constexpr uint32_t MEMSET_UNROLL_LIMIT = 16; |
| 739 /// @} | 780 /// @} |
| 740 | 781 |
| 741 /// Value is in bytes. Return Value adjusted to the next highest multiple of | 782 /// Value is in bytes. Return Value adjusted to the next highest multiple of |
| 742 /// the stack alignment. | 783 /// the stack alignment. |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1005 const char *FldString; // s, l, or <blank> | 1046 const char *FldString; // s, l, or <blank> |
| 1006 } TypeAttributes[]; | 1047 } TypeAttributes[]; |
| 1007 }; | 1048 }; |
| 1008 | 1049 |
| 1009 using Traits = ::Ice::X8664::TargetX8664Traits; | 1050 using Traits = ::Ice::X8664::TargetX8664Traits; |
| 1010 } // end of namespace X8664 | 1051 } // end of namespace X8664 |
| 1011 | 1052 |
| 1012 } // end of namespace Ice | 1053 } // end of namespace Ice |
| 1013 | 1054 |
| 1014 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 1055 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
| OLD | NEW |