1 //===- AArch64RegisterBankInfo -----------------------------------*- C++ -*-==//
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
7 //===----------------------------------------------------------------------===//
9 /// This file declares the targeting of the RegisterBankInfo class for AArch64.
10 /// \todo This should be generated by TableGen.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64REGISTERBANKINFO_H
14 #define LLVM_LIB_TARGET_AARCH64_AARCH64REGISTERBANKINFO_H
16 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
18 #define GET_REGBANK_DECLARATIONS
19 #include "AArch64GenRegisterBank.inc"
23 class TargetRegisterInfo
;
25 class AArch64GenRegisterBankInfo
: public RegisterBankInfo
{
27 enum PartialMappingIdx
{
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
,
44 static RegisterBankInfo::PartialMapping PartMappings
[];
45 static RegisterBankInfo::ValueMapping ValMappings
[];
46 static PartialMappingIdx BankIDToCopyMapIdx
[];
48 enum ValueMappingIdx
{
52 DistanceBetweenRegBanks
= 3,
53 FirstCrossRegCpyIdx
= 25,
54 LastCrossRegCpyIdx
= 39,
55 DistanceBetweenCrossRegCpy
= 2,
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
);
71 static unsigned getRegBankBaseIdxOffset(unsigned RBIdx
, unsigned Size
);
73 /// Get the pointer to the ValueMapping representing the RegisterBank
74 /// at \p RBIdx with a size of \p Size.
76 /// The returned mapping works for instructions with the same kind of
77 /// operands for up to 3 operands.
79 /// \pre \p RBIdx != PartialMappingIdx::None
80 static const RegisterBankInfo::ValueMapping
*
81 getValueMapping(PartialMappingIdx RBIdx
, unsigned Size
);
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
);
89 /// Get the instruction mapping for G_FPEXT.
91 /// \pre (DstSize, SrcSize) pair is one of the following:
92 /// (32, 16), (64, 16), (64, 32), (128, 64)
94 /// \return An InstructionMapping with statically allocated OperandsMapping.
95 static const RegisterBankInfo::ValueMapping
*
96 getFPExtMapping(unsigned DstSize
, unsigned SrcSize
);
98 #define GET_TARGET_REGBANK_CLASS
99 #include "AArch64GenRegisterBank.inc"
102 /// This class provides the information for the target register banks.
103 class AArch64RegisterBankInfo final
: public AArch64GenRegisterBankInfo
{
104 /// See RegisterBankInfo::applyMapping.
105 void applyMappingImpl(const OperandsMapper
&OpdMapper
) const override
;
107 /// Get an instruction mapping where all the operands map to
108 /// the same register bank and have similar size.
110 /// \pre MI.getNumOperands() <= 3
112 /// \return An InstructionMappings with a statically allocated
114 const InstructionMapping
&
115 getSameKindOfOperandsMapping(const MachineInstr
&MI
) const;
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;
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;
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;
130 AArch64RegisterBankInfo(const TargetRegisterInfo
&TRI
);
132 unsigned copyCost(const RegisterBank
&A
, const RegisterBank
&B
,
133 unsigned Size
) const override
;
136 getRegBankFromRegClass(const TargetRegisterClass
&RC
) const override
;
139 getInstrAlternativeMappings(const MachineInstr
&MI
) const override
;
141 const InstructionMapping
&
142 getInstrMapping(const MachineInstr
&MI
) const override
;
144 } // End llvm namespace.