27#define GET_REGINFO_TARGET_DESC
28#include "AVRGenRegisterInfo.inc"
38 if (STI.hasTinyEncoding())
40 : CSR_NormalTiny_SaveList;
43 : CSR_Normal_SaveList;
50 return STI.hasTinyEncoding() ? CSR_NormalTiny_RegMask : CSR_Normal_RegMask;
71 for (
unsigned Reg = AVR::R2;
Reg <= AVR::R17;
Reg++)
74 for (
unsigned Reg = AVR::R3R2;
Reg <= AVR::R18R17;
Reg++)
98 if (
TRI->isTypeLegalForClass(*RC, MVT::i16)) {
99 return &AVR::DREGSRegClass;
102 if (
TRI->isTypeLegalForClass(*RC, MVT::i8)) {
103 return &AVR::GPR8RegClass;
113 int Opcode =
MI.getOpcode();
116 if ((Opcode != AVR::SUBIWRdK) && (Opcode != AVR::ADIWRdK)) {
122 if (DstReg !=
MI.getOperand(0).getReg()) {
129 Offset += -
MI.getOperand(2).getImm();
132 Offset +=
MI.getOperand(2).getImm();
138 MI.eraseFromParent();
142 int SPAdj,
unsigned FIOperandNum,
144 assert(SPAdj == 0 &&
"Unexpected SPAdj value");
155 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
156 int FrameOffset =
MI.getOperand(FIOperandNum + 1).getImm();
166 if (
MI.getOpcode() == AVR::FRMIDX) {
169 FrameReg =
MI.getOperand(FIOperandNum + 2).getReg();
171 if (DstReg != FrameReg) {
172 TII.copyPhysReg(
MBB,
MI, dl, DstReg, FrameReg,
false,
false,
false);
197 MI.eraseFromParent();
208 int MaxOffset = STI.hasTinyEncoding() ? 0 : 62;
215 unsigned AddOpc = AVR::ADIWRdK, SubOpc = AVR::SBIWRdK;
216 int AddOffset =
Offset - MaxOffset;
219 if ((
Offset - MaxOffset) > 63 || !STI.hasADDSUBIW()) {
220 AddOpc = AVR::SUBIWRdK;
221 SubOpc = AVR::SUBIWRdK;
222 AddOffset = -AddOffset;
236 New->getOperand(3).setIsDead();
254 MI.getOperand(FIOperandNum).ChangeToRegister(AVR::R29R28,
false);
255 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
263 if (TFI->
hasFP(MF)) {
276 return &AVR::PTRDISPREGSRegClass;
283 LoReg = getSubReg(
Reg, AVR::sub_lo);
284 HiReg = getSubReg(
Reg, AVR::sub_hi);
291 if (this->
getRegClass(AVR::PTRDISPREGSRegClassID)->hasSubClassEq(NewRC)) {
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the BitVector class.
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Contains AVR-specific information for each MachineFunction.
bool isInterruptOrSignalHandler() const
Checks if the function is some form of interrupt service routine.
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
Stack Frame Processing Methods.
const uint16_t * getCalleeSavedRegs(const MachineFunction *MF=nullptr) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
bool shouldCoalesce(MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg, const TargetRegisterClass *DstRC, unsigned DstSubReg, const TargetRegisterClass *NewRC, LiveIntervals &LIS) const override
const TargetRegisterClass * getPointerRegClass(unsigned Kind=0) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
Register getFrameRegister(const MachineFunction &MF) const override
void splitReg(Register Reg, Register &LoReg, Register &HiReg) const
Splits a 16-bit DREGS register into the lo/hi register pair.
A specific AVR target MCU.
Register getTmpRegister() const
const TargetFrameLowering * getFrameLowering() const override
const AVRInstrInfo * getInstrInfo() const override
A generic AVR implementation.
const AVRSubtarget * getSubtargetImpl() const
MachineInstrBundleIterator< MachineInstr > iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & setOperandDead(unsigned OpIdx) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Representation of each machine instruction.
Wrapper class representing virtual and physical registers.
static StackOffset getFixed(int64_t Fixed)
Information about stack frame layout on the target.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual bool shouldCoalesce(MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg, const TargetRegisterClass *DstRC, unsigned DstSubReg, const TargetRegisterClass *NewRC, LiveIntervals &LIS) const
Subtarget Hooks.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Kill
The last use of a register.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
static void foldFrameOffset(MachineBasicBlock::iterator &II, int &Offset, Register DstReg)
Fold a frame offset shared between two add instructions into a single one.
MCRegisterClass TargetRegisterClass