AArch64RegisterBankInfo.h revision 360784
1//===- AArch64RegisterBankInfo -----------------------------------*- 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/// \file 9/// This file declares the targeting of the RegisterBankInfo class for AArch64. 10/// \todo This should be generated by TableGen. 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64REGISTERBANKINFO_H 14#define LLVM_LIB_TARGET_AARCH64_AARCH64REGISTERBANKINFO_H 15 16#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" 17 18#define GET_REGBANK_DECLARATIONS 19#include "AArch64GenRegisterBank.inc" 20 21namespace llvm { 22 23class TargetRegisterInfo; 24 25class AArch64GenRegisterBankInfo : public RegisterBankInfo { 26protected: 27 enum PartialMappingIdx { 28 PMI_None = -1, 29 PMI_FPR16 = 1, 30 PMI_FPR32, 31 PMI_FPR64, 32 PMI_FPR128, 33 PMI_FPR256, 34 PMI_FPR512, 35 PMI_GPR32, 36 PMI_GPR64, 37 PMI_FirstGPR = PMI_GPR32, 38 PMI_LastGPR = PMI_GPR64, 39 PMI_FirstFPR = PMI_FPR16, 40 PMI_LastFPR = PMI_FPR512, 41 PMI_Min = PMI_FirstFPR, 42 }; 43 44 static RegisterBankInfo::PartialMapping PartMappings[]; 45 static RegisterBankInfo::ValueMapping ValMappings[]; 46 static PartialMappingIdx BankIDToCopyMapIdx[]; 47 48 enum ValueMappingIdx { 49 InvalidIdx = 0, 50 First3OpsIdx = 1, 51 Last3OpsIdx = 22, 52 DistanceBetweenRegBanks = 3, 53 FirstCrossRegCpyIdx = 25, 54 LastCrossRegCpyIdx = 39, 55 DistanceBetweenCrossRegCpy = 2, 56 FPExt16To32Idx = 41, 57 FPExt16To64Idx = 43, 58 FPExt32To64Idx = 45, 59 FPExt64To128Idx = 47, 60 Shift64Imm = 49 61 }; 62 63 static bool checkPartialMap(unsigned Idx, unsigned ValStartIdx, 64 unsigned ValLength, const RegisterBank &RB); 65 static bool checkValueMapImpl(unsigned Idx, unsigned FirstInBank, 66 unsigned Size, unsigned Offset); 67 static bool checkPartialMappingIdx(PartialMappingIdx FirstAlias, 68 PartialMappingIdx LastAlias, 69 ArrayRef<PartialMappingIdx> Order); 70 71 static unsigned getRegBankBaseIdxOffset(unsigned RBIdx, unsigned Size); 72 73 /// Get the pointer to the ValueMapping representing the RegisterBank 74 /// at \p RBIdx with a size of \p Size. 75 /// 76 /// The returned mapping works for instructions with the same kind of 77 /// operands for up to 3 operands. 78 /// 79 /// \pre \p RBIdx != PartialMappingIdx::None 80 static const RegisterBankInfo::ValueMapping * 81 getValueMapping(PartialMappingIdx RBIdx, unsigned Size); 82 83 /// Get the pointer to the ValueMapping of the operands of a copy 84 /// instruction from the \p SrcBankID register bank to the \p DstBankID 85 /// register bank with a size of \p Size. 86 static const RegisterBankInfo::ValueMapping * 87 getCopyMapping(unsigned DstBankID, unsigned SrcBankID, unsigned Size); 88 89 /// Get the instruction mapping for G_FPEXT. 90 /// 91 /// \pre (DstSize, SrcSize) pair is one of the following: 92 /// (32, 16), (64, 16), (64, 32), (128, 64) 93 /// 94 /// \return An InstructionMapping with statically allocated OperandsMapping. 95 static const RegisterBankInfo::ValueMapping * 96 getFPExtMapping(unsigned DstSize, unsigned SrcSize); 97 98#define GET_TARGET_REGBANK_CLASS 99#include "AArch64GenRegisterBank.inc" 100}; 101 102/// This class provides the information for the target register banks. 103class AArch64RegisterBankInfo final : public AArch64GenRegisterBankInfo { 104 /// See RegisterBankInfo::applyMapping. 105 void applyMappingImpl(const OperandsMapper &OpdMapper) const override; 106 107 /// Get an instruction mapping where all the operands map to 108 /// the same register bank and have similar size. 109 /// 110 /// \pre MI.getNumOperands() <= 3 111 /// 112 /// \return An InstructionMappings with a statically allocated 113 /// OperandsMapping. 114 const InstructionMapping & 115 getSameKindOfOperandsMapping(const MachineInstr &MI) const; 116 117 /// Returns true if the output of \p MI must be stored on a FPR register. 118 bool hasFPConstraints(const MachineInstr &MI, const MachineRegisterInfo &MRI, 119 const TargetRegisterInfo &TRI) const; 120 121 /// Returns true if the source registers of \p MI must all be FPRs. 122 bool onlyUsesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, 123 const TargetRegisterInfo &TRI) const; 124 125 /// Returns true if the destination register of \p MI must be a FPR. 126 bool onlyDefinesFP(const MachineInstr &MI, const MachineRegisterInfo &MRI, 127 const TargetRegisterInfo &TRI) const; 128 129public: 130 AArch64RegisterBankInfo(const TargetRegisterInfo &TRI); 131 132 unsigned copyCost(const RegisterBank &A, const RegisterBank &B, 133 unsigned Size) const override; 134 135 const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, 136 LLT) const override; 137 138 InstructionMappings 139 getInstrAlternativeMappings(const MachineInstr &MI) const override; 140 141 const InstructionMapping & 142 getInstrMapping(const MachineInstr &MI) const override; 143}; 144} // End llvm namespace. 145#endif 146