1 //===-- PPCRegisterBankInfo.h -----------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file declares the targeting of the RegisterBankInfo class for PowerPC. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_PPC_GISEL_PPCREGISTERBANKINFO_H 15 #define LLVM_LIB_TARGET_PPC_GISEL_PPCREGISTERBANKINFO_H 16 17 #include "llvm/CodeGen/RegisterBank.h" 18 #include "llvm/CodeGen/RegisterBankInfo.h" 19 #include "llvm/CodeGen/TargetRegisterInfo.h" 20 21 #define GET_REGBANK_DECLARATIONS 22 #include "PPCGenRegisterBank.inc" 23 24 namespace llvm { 25 class TargetRegisterInfo; 26 27 class PPCGenRegisterBankInfo : public RegisterBankInfo { 28 protected: 29 enum PartialMappingIdx { 30 PMI_None = -1, 31 PMI_GPR32 = 1, 32 PMI_GPR64 = 2, 33 PMI_FPR32 = 3, 34 PMI_FPR64 = 4, 35 PMI_VEC128 = 5, 36 PMI_CR = 6, 37 PMI_Min = PMI_GPR32, 38 }; 39 40 static const RegisterBankInfo::PartialMapping PartMappings[]; 41 static const RegisterBankInfo::ValueMapping ValMappings[]; 42 static const PartialMappingIdx BankIDToCopyMapIdx[]; 43 44 /// Get the pointer to the ValueMapping representing the RegisterBank 45 /// at \p RBIdx. 46 /// 47 /// The returned mapping works for instructions with the same kind of 48 /// operands for up to 3 operands. 49 /// 50 /// \pre \p RBIdx != PartialMappingIdx::None 51 static const RegisterBankInfo::ValueMapping * 52 getValueMapping(PartialMappingIdx RBIdx); 53 54 /// Get the pointer to the ValueMapping of the operands of a copy 55 /// instruction from the \p SrcBankID register bank to the \p DstBankID 56 /// register bank with a size of \p Size. 57 static const RegisterBankInfo::ValueMapping * 58 getCopyMapping(unsigned DstBankID, unsigned SrcBankID, unsigned Size); 59 60 #define GET_TARGET_REGBANK_CLASS 61 #include "PPCGenRegisterBank.inc" 62 }; 63 64 class PPCRegisterBankInfo final : public PPCGenRegisterBankInfo { 65 public: 66 PPCRegisterBankInfo(const TargetRegisterInfo &TRI); 67 68 const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, 69 LLT Ty) const override; 70 const InstructionMapping & 71 getInstrMapping(const MachineInstr &MI) const override; 72 73 InstructionMappings 74 getInstrAlternativeMappings(const MachineInstr &MI) const override; 75 76 private: 77 /// Maximum recursion depth for hasFPConstraints. 78 const unsigned MaxFPRSearchDepth = 2; 79 80 /// \returns true if \p MI only uses and defines FPRs. 81 bool hasFPConstraints(const MachineInstr &MI, const MachineRegisterInfo &MRI, 82 const TargetRegisterInfo &TRI, 83 unsigned Depth = 0) const; 84 85 /// \returns true if \p MI only uses FPRs. 86 bool onlyUsesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, 87 const TargetRegisterInfo &TRI, unsigned Depth = 0) const; 88 89 /// \returns true if \p MI only defines FPRs. 90 bool onlyDefinesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, 91 const TargetRegisterInfo &TRI, unsigned Depth = 0) const; 92 }; 93 } // namespace llvm 94 95 #endif 96