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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 return RegisterSet::Reg_ax; | 394 return RegisterSet::Reg_ax; |
395 case IceType_i32: | 395 case IceType_i32: |
396 return RegisterSet::Reg_eax; | 396 return RegisterSet::Reg_eax; |
397 case IceType_i64: | 397 case IceType_i64: |
398 return RegisterSet::Reg_rax; | 398 return RegisterSet::Reg_rax; |
399 } | 399 } |
400 } | 400 } |
401 | 401 |
402 public: | 402 public: |
403 static RegNumT getGprForType(Type Ty, RegNumT RegNum) { | 403 static RegNumT getGprForType(Type Ty, RegNumT RegNum) { |
404 assert(RegNum != RegNumT::NoRegister); | 404 assert(RegNum.hasValue()); |
405 | 405 |
406 if (!isScalarIntegerType(Ty)) { | 406 if (!isScalarIntegerType(Ty)) { |
407 return RegNum; | 407 return RegNum; |
408 } | 408 } |
409 | 409 |
410 assert(Ty == IceType_i1 || Ty == IceType_i8 || Ty == IceType_i16 || | 410 assert(Ty == IceType_i1 || Ty == IceType_i8 || Ty == IceType_i16 || |
411 Ty == IceType_i32 || Ty == IceType_i64); | 411 Ty == IceType_i32 || Ty == IceType_i64); |
412 | 412 |
413 if (RegNum == RegisterSet::Reg_ah) { | 413 if (RegNum == RegisterSet::Reg_ah) { |
414 assert(Ty == IceType_i8); | 414 assert(Ty == IceType_i8); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 /// The maximum number of arguments to pass in GPR registers | 723 /// The maximum number of arguments to pass in GPR registers |
724 static constexpr uint32_t X86_MAX_GPR_ARGS = 6; | 724 static constexpr uint32_t X86_MAX_GPR_ARGS = 6; |
725 /// Whether scalar floating point arguments are passed in XMM registers | 725 /// Whether scalar floating point arguments are passed in XMM registers |
726 static constexpr bool X86_PASS_SCALAR_FP_IN_XMM = true; | 726 static constexpr bool X86_PASS_SCALAR_FP_IN_XMM = true; |
727 /// Get the register for a given argument slot in the XMM registers. | 727 /// Get the register for a given argument slot in the XMM registers. |
728 static RegNumT getRegisterForXmmArgNum(uint32_t ArgNum) { | 728 static RegNumT getRegisterForXmmArgNum(uint32_t ArgNum) { |
729 // TODO(sehr): Change to use the CCArg technique used in ARM32. | 729 // TODO(sehr): Change to use the CCArg technique used in ARM32. |
730 static_assert(RegisterSet::Reg_xmm0 + 1 == RegisterSet::Reg_xmm1, | 730 static_assert(RegisterSet::Reg_xmm0 + 1 == RegisterSet::Reg_xmm1, |
731 "Inconsistency between XMM register numbers and ordinals"); | 731 "Inconsistency between XMM register numbers and ordinals"); |
732 if (ArgNum >= X86_MAX_XMM_ARGS) { | 732 if (ArgNum >= X86_MAX_XMM_ARGS) { |
733 return RegNumT::NoRegister; | 733 return RegNumT(); |
734 } | 734 } |
735 return RegNumT::fixme(RegisterSet::Reg_xmm0 + ArgNum); | 735 return RegNumT::fixme(RegisterSet::Reg_xmm0 + ArgNum); |
736 } | 736 } |
737 /// Get the register for a given argument slot in the GPRs. | 737 /// Get the register for a given argument slot in the GPRs. |
738 static RegNumT getRegisterForGprArgNum(Type Ty, uint32_t ArgNum) { | 738 static RegNumT getRegisterForGprArgNum(Type Ty, uint32_t ArgNum) { |
739 if (ArgNum >= X86_MAX_GPR_ARGS) { | 739 if (ArgNum >= X86_MAX_GPR_ARGS) { |
740 return RegNumT::NoRegister; | 740 return RegNumT(); |
741 } | 741 } |
742 static const RegisterSet::AllRegisters GprForArgNum[] = { | 742 static const RegisterSet::AllRegisters GprForArgNum[] = { |
743 RegisterSet::Reg_rdi, RegisterSet::Reg_rsi, RegisterSet::Reg_rdx, | 743 RegisterSet::Reg_rdi, RegisterSet::Reg_rsi, RegisterSet::Reg_rdx, |
744 RegisterSet::Reg_rcx, RegisterSet::Reg_r8, RegisterSet::Reg_r9, | 744 RegisterSet::Reg_rcx, RegisterSet::Reg_r8, RegisterSet::Reg_r9, |
745 }; | 745 }; |
746 static_assert(llvm::array_lengthof(GprForArgNum) == X86_MAX_GPR_ARGS, | 746 static_assert(llvm::array_lengthof(GprForArgNum) == X86_MAX_GPR_ARGS, |
747 "Mismatch between MAX_GPR_ARGS and GprForArgNum."); | 747 "Mismatch between MAX_GPR_ARGS and GprForArgNum."); |
748 assert(Ty == IceType_i64 || Ty == IceType_i32); | 748 assert(Ty == IceType_i64 || Ty == IceType_i32); |
749 return getGprForType(Ty, GprForArgNum[ArgNum]); | 749 return getGprForType(Ty, GprForArgNum[ArgNum]); |
750 } | 750 } |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 const char *FldString; // s, l, or <blank> | 1032 const char *FldString; // s, l, or <blank> |
1033 } TypeAttributes[]; | 1033 } TypeAttributes[]; |
1034 }; | 1034 }; |
1035 | 1035 |
1036 using Traits = ::Ice::X8664::TargetX8664Traits; | 1036 using Traits = ::Ice::X8664::TargetX8664Traits; |
1037 } // end of namespace X8664 | 1037 } // end of namespace X8664 |
1038 | 1038 |
1039 } // end of namespace Ice | 1039 } // end of namespace Ice |
1040 | 1040 |
1041 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 1041 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
OLD | NEW |