21 #define GET_TARGET_REGBANK_IMPL 22 #include "X86GenRegisterBank.inc" 26 #define GET_TARGET_REGBANK_INFO_IMPL 27 #include "X86GenRegisterBankInfo.def" 35 assert(&X86::GPRRegBank == &RBGPR &&
"Incorrect RegBanks inizalization.");
40 "Subclass not added?");
41 assert(RBGPR.
getSize() == 64 &&
"GPRs should hold up to 64-bit");
47 if (X86::GR8RegClass.hasSubClassEq(&RC) ||
48 X86::GR16RegClass.hasSubClassEq(&RC) ||
49 X86::GR32RegClass.hasSubClassEq(&RC) ||
50 X86::GR64RegClass.hasSubClassEq(&RC))
53 if (X86::FR32XRegClass.hasSubClassEq(&RC) ||
54 X86::FR64XRegClass.hasSubClassEq(&RC) ||
55 X86::VR128XRegClass.hasSubClassEq(&RC) ||
56 X86::VR256XRegClass.hasSubClassEq(&RC) ||
57 X86::VR512RegClass.hasSubClassEq(&RC))
109 void X86RegisterBankInfo::getInstrPartialMappingIdxs(
114 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
123 bool X86RegisterBankInfo::getInstrValueMapping(
129 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
134 if (!Mapping->isValid())
137 OpdsMapping[Idx] = Mapping;
143 X86RegisterBankInfo::getSameOperandsMapping(
const MachineInstr &MI,
174 case TargetOpcode::G_ADD:
175 case TargetOpcode::G_SUB:
176 case TargetOpcode::G_MUL:
177 case TargetOpcode::G_SHL:
178 case TargetOpcode::G_LSHR:
179 case TargetOpcode::G_ASHR:
180 return getSameOperandsMapping(MI,
false);
182 case TargetOpcode::G_FADD:
183 case TargetOpcode::G_FSUB:
184 case TargetOpcode::G_FMUL:
185 case TargetOpcode::G_FDIV:
186 return getSameOperandsMapping(MI,
true);
196 case TargetOpcode::G_FPEXT:
197 case TargetOpcode::G_FPTRUNC:
198 case TargetOpcode::G_FCONSTANT:
200 getInstrPartialMappingIdxs(MI, MRI,
true, OpRegBankIdx);
202 case TargetOpcode::G_SITOFP:
203 case TargetOpcode::G_FPTOSI: {
211 bool FirstArgIsFP = Opc == TargetOpcode::G_SITOFP;
212 bool SecondArgIsFP = Opc == TargetOpcode::G_FPTOSI;
217 case TargetOpcode::G_FCMP: {
222 "Mismatched operand sizes for G_FCMP");
226 assert((Size == 32 || Size == 64) &&
"Unsupported size for G_FCMP");
233 case TargetOpcode::G_TRUNC:
234 case TargetOpcode::G_ANYEXT: {
245 Opc == TargetOpcode::G_ANYEXT;
247 getInstrPartialMappingIdxs(MI, MRI, isFPTrunc || isFPAnyExt,
252 getInstrPartialMappingIdxs(MI, MRI,
false, OpRegBankIdx);
258 if (!getInstrValueMapping(MI, OpRegBankIdx, OpdsMapping))
279 case TargetOpcode::G_LOAD:
280 case TargetOpcode::G_STORE:
281 case TargetOpcode::G_IMPLICIT_DEF: {
284 if (Size != 32 && Size != 64)
291 getInstrPartialMappingIdxs(MI, MRI,
true, OpRegBankIdx);
295 if (!getInstrValueMapping(MI, OpRegBankIdx, OpdsMapping))
InstructionMappings getInstrAlternativeMappings(const MachineInstr &MI) const override
Get the alternative mappings for MI.
const ValueMapping * getOperandsMapping(Iterator Begin, Iterator End) const
Get the uniquely generated array of ValueMapping for the elements of between Begin and End...
This class represents lattice values for constants.
const InstructionMapping & getInstructionMapping(unsigned ID, unsigned Cost, const ValueMapping *OperandsMapping, unsigned NumOperands) const
Method to get a uniquely generated InstructionMapping.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
Helper class that represents how the value of an instruction may be mapped and what is the related co...
void push_back(const T &Elt)
unsigned getReg() const
getReg - Returns the register number.
X86RegisterBankInfo(const TargetRegisterInfo &TRI)
LLT getType(unsigned Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register...
Helper class used to get/create the virtual registers that will be used to replace the MachineOperand...
unsigned const TargetRegisterInfo * TRI
const RegisterBank & getRegBankFromRegClass(const TargetRegisterClass &RC) const override
Get a register bank that covers RC.
const TargetRegisterClass * getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
bool covers(const TargetRegisterClass &RC) const
Check whether this register bank covers RC.
unsigned getNumOperands() const
Retuns the total number of operands.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
static PartialMappingIdx getPartialMappingIdx(const LLT &Ty, bool isFP)
static const RegisterBankInfo::ValueMapping * getValueMapping(PartialMappingIdx Idx, unsigned NumOperands)
unsigned const MachineRegisterInfo * MRI
const InstructionMapping & getInvalidInstructionMapping() const
Method to get a uniquely generated invalid InstructionMapping.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
static const unsigned DefaultMappingID
Identifier used when the related instruction mapping instance is generated by target independent code...
void applyMappingImpl(const OperandsMapper &OpdMapper) const override
See RegisterBankInfo::applyMapping.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This file declares the targeting of the RegisterBankInfo class for X86.
bool isValid() const
Check whether this object is valid.
RegisterBank & getRegBank(unsigned ID)
Get the register bank identified by ID.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
static void applyDefaultMapping(const OperandsMapper &OpdMapper)
Helper method to apply something that is like the default mapping.
unsigned getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
This class implements the register bank concept.
const InstructionMapping & getInstrMapping(const MachineInstr &MI) const override
Get the mapping of the different operands of MI on the register bank.
const MachineBasicBlock * getParent() const
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
TargetSubtargetInfo - Generic base class for all target subtargets.
Representation of each machine instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
virtual InstructionMappings getInstrAlternativeMappings(const MachineInstr &MI) const
Get the alternative mappings for MI.
const InstructionMapping & getInstrMappingImpl(const MachineInstr &MI) const
Try to get the mapping of MI.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned getSize() const
Get the maximal size in bits that fits in this register bank.
bool isPreISelGenericOpcode(unsigned Opcode)
Check whether the given Opcode is a generic opcode that is not supposed to appear after ISel...
unsigned getSizeInBits(unsigned Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI) const
Get the size in bits of Reg.
const MachineOperand & getOperand(unsigned i) const