| //===-- PPCRegisterBankInfo.h -----------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file declares the targeting of the RegisterBankInfo class for PowerPC. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_PPC_GISEL_PPCREGISTERBANKINFO_H |
| #define LLVM_LIB_TARGET_PPC_GISEL_PPCREGISTERBANKINFO_H |
| |
| #include "llvm/CodeGen/RegisterBank.h" |
| #include "llvm/CodeGen/RegisterBankInfo.h" |
| #include "llvm/CodeGen/TargetRegisterInfo.h" |
| |
| #define GET_REGBANK_DECLARATIONS |
| #include "PPCGenRegisterBank.inc" |
| |
| namespace llvm { |
| class TargetRegisterInfo; |
| |
| class PPCGenRegisterBankInfo : public RegisterBankInfo { |
| protected: |
| enum PartialMappingIdx { |
| PMI_None = -1, |
| PMI_GPR32 = 1, |
| PMI_GPR64 = 2, |
| PMI_FPR32 = 3, |
| PMI_FPR64 = 4, |
| PMI_CR = 5, |
| PMI_Min = PMI_GPR32, |
| }; |
| |
| static RegisterBankInfo::PartialMapping PartMappings[]; |
| static RegisterBankInfo::ValueMapping ValMappings[]; |
| static PartialMappingIdx BankIDToCopyMapIdx[]; |
| |
| /// Get the pointer to the ValueMapping representing the RegisterBank |
| /// at \p RBIdx. |
| /// |
| /// The returned mapping works for instructions with the same kind of |
| /// operands for up to 3 operands. |
| /// |
| /// \pre \p RBIdx != PartialMappingIdx::None |
| static const RegisterBankInfo::ValueMapping * |
| getValueMapping(PartialMappingIdx RBIdx); |
| |
| /// Get the pointer to the ValueMapping of the operands of a copy |
| /// instruction from the \p SrcBankID register bank to the \p DstBankID |
| /// register bank with a size of \p Size. |
| static const RegisterBankInfo::ValueMapping * |
| getCopyMapping(unsigned DstBankID, unsigned SrcBankID, unsigned Size); |
| |
| #define GET_TARGET_REGBANK_CLASS |
| #include "PPCGenRegisterBank.inc" |
| }; |
| |
| class PPCRegisterBankInfo final : public PPCGenRegisterBankInfo { |
| public: |
| PPCRegisterBankInfo(const TargetRegisterInfo &TRI); |
| |
| const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, |
| LLT Ty) const override; |
| const InstructionMapping & |
| getInstrMapping(const MachineInstr &MI) const override; |
| |
| InstructionMappings |
| getInstrAlternativeMappings(const MachineInstr &MI) const override; |
| |
| private: |
| /// Maximum recursion depth for hasFPConstraints. |
| const unsigned MaxFPRSearchDepth = 2; |
| |
| /// \returns true if \p MI only uses and defines FPRs. |
| bool hasFPConstraints(const MachineInstr &MI, const MachineRegisterInfo &MRI, |
| const TargetRegisterInfo &TRI, |
| unsigned Depth = 0) const; |
| |
| /// \returns true if \p MI only uses FPRs. |
| bool onlyUsesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, |
| const TargetRegisterInfo &TRI, unsigned Depth = 0) const; |
| |
| /// \returns true if \p MI only defines FPRs. |
| bool onlyDefinesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, |
| const TargetRegisterInfo &TRI, unsigned Depth = 0) const; |
| }; |
| } // namespace llvm |
| |
| #endif |