30 cl::desc(
"Use old-style Thumb2 if-conversion heuristics"),
76 while (Count && MBBI != E) {
77 if (MBBI->isDebugValue()) {
81 if (MBBI->getOpcode() == ARM::t2IT) {
82 unsigned Mask = MBBI->getOperand(1).getImm();
84 MBBI->eraseFromParent();
86 unsigned MaskOn = 1 << Count;
87 unsigned MaskOff = ~(MaskOn - 1);
88 MBBI->getOperand(1).setImm((Mask & MaskOff) | MaskOn);
104 while (MBBI->isDebugValue()) {
106 if (MBBI == MBB.
end())
110 unsigned PredReg = 0;
116 unsigned DestReg,
unsigned SrcReg,
117 bool KillSrc)
const {
119 if (!ARM::GPRRegClass.contains(DestReg, SrcReg))
128 unsigned SrcReg,
bool isKill,
int FI,
132 if (I != MBB.
end()) DL = I->getDebugLoc();
142 if (RC == &ARM::GPRRegClass || RC == &ARM::tGPRRegClass ||
143 RC == &ARM::tcGPRRegClass || RC == &ARM::rGPRRegClass ||
144 RC == &ARM::GPRnopcRegClass) {
147 .addFrameIndex(FI).addImm(0).addMemOperand(MMO));
151 if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
160 AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
171 unsigned DestReg,
int FI,
182 if (I != MBB.
end()) DL = I->getDebugLoc();
184 if (RC == &ARM::GPRRegClass || RC == &ARM::tGPRRegClass ||
185 RC == &ARM::tcGPRRegClass || RC == &ARM::rGPRRegClass ||
186 RC == &ARM::GPRnopcRegClass) {
188 .addFrameIndex(FI).addImm(0).addMemOperand(MMO));
192 if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
215 unsigned DestReg,
unsigned BaseReg,
int NumBytes,
218 if (NumBytes == 0 && DestReg != BaseReg) {
219 BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), DestReg)
225 bool isSub = NumBytes < 0;
226 if (isSub) NumBytes = -NumBytes;
230 if (DestReg != ARM::SP && DestReg != BaseReg &&
234 if (NumBytes < 65536) {
236 BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVi16), DestReg)
240 }
else if ((NumBytes & 0xffff) == 0) {
242 BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVTi16), DestReg)
251 BuildMI(MBB, MBBI, dl, TII.get(ARM::t2SUBrr), DestReg)
257 BuildMI(MBB, MBBI, dl, TII.get(ARM::t2ADDrr), DestReg)
268 unsigned ThisVal = NumBytes;
270 if (DestReg == ARM::SP && BaseReg != ARM::SP) {
278 bool HasCCOut =
true;
279 if (BaseReg == ARM::SP) {
281 if (DestReg == ARM::SP && (ThisVal < ((1 << 7)-1) * 4)) {
282 assert((ThisVal & 3) == 0 &&
"Stack update is not multiple of 4?");
283 Opc = isSub ? ARM::tSUBspi : ARM::tADDspi;
291 Opc = isSub ? ARM::t2SUBri : ARM::t2ADDri;
298 NumBytes &= ~ThisVal;
300 "Bit extraction didn't work?");
303 assert(DestReg != ARM::SP && BaseReg != ARM::SP);
304 Opc = isSub ? ARM::t2SUBri : ARM::t2ADDri;
307 }
else if (ThisVal < 4096) {
308 Opc = isSub ? ARM::t2SUBri12 : ARM::t2ADDri12;
315 NumBytes &= ~ThisVal;
317 "Bit extraction didn't work?");
325 .
addImm(ThisVal)).setMIFlags(MIFlags);
337 case ARM::t2LDRi12:
return ARM::t2LDRi8;
338 case ARM::t2LDRHi12:
return ARM::t2LDRHi8;
339 case ARM::t2LDRBi12:
return ARM::t2LDRBi8;
340 case ARM::t2LDRSHi12:
return ARM::t2LDRSHi8;
341 case ARM::t2LDRSBi12:
return ARM::t2LDRSBi8;
342 case ARM::t2STRi12:
return ARM::t2STRi8;
343 case ARM::t2STRBi12:
return ARM::t2STRBi8;
344 case ARM::t2STRHi12:
return ARM::t2STRHi8;
345 case ARM::t2PLDi12:
return ARM::t2PLDi8;
369 case ARM::t2LDRi8:
return ARM::t2LDRi12;
370 case ARM::t2LDRHi8:
return ARM::t2LDRHi12;
371 case ARM::t2LDRBi8:
return ARM::t2LDRBi12;
372 case ARM::t2LDRSHi8:
return ARM::t2LDRSHi12;
373 case ARM::t2LDRSBi8:
return ARM::t2LDRSBi12;
374 case ARM::t2STRi8:
return ARM::t2STRi12;
375 case ARM::t2STRBi8:
return ARM::t2STRBi12;
376 case ARM::t2STRHi8:
return ARM::t2STRHi12;
377 case ARM::t2PLDi8:
return ARM::t2PLDi12;
382 case ARM::t2LDRSHi12:
383 case ARM::t2LDRSBi12:
401 case ARM::t2LDRs:
return ARM::t2LDRi12;
402 case ARM::t2LDRHs:
return ARM::t2LDRHi12;
403 case ARM::t2LDRBs:
return ARM::t2LDRBi12;
404 case ARM::t2LDRSHs:
return ARM::t2LDRSHi12;
405 case ARM::t2LDRSBs:
return ARM::t2LDRSBi12;
406 case ARM::t2STRs:
return ARM::t2STRi12;
407 case ARM::t2STRBs:
return ARM::t2STRBi12;
408 case ARM::t2STRHs:
return ARM::t2STRHi12;
409 case ARM::t2PLDs:
return ARM::t2PLDi12;
414 case ARM::t2LDRSHi12:
415 case ARM::t2LDRSBi12:
439 unsigned FrameReg,
int &Offset,
450 if (Opcode == ARM::t2ADDri || Opcode == ARM::t2ADDri12) {
456 MI.
setDesc(TII.get(ARM::tMOVr));
466 bool HasCCOut = Opcode != ARM::t2ADDri12;
471 MI.
setDesc(TII.get(ARM::t2SUBri));
473 MI.
setDesc(TII.get(ARM::t2ADDri));
489 unsigned NewOpc = isSub ? ARM::t2SUBri12 : ARM::t2ADDri12;
502 unsigned RotAmt = countLeadingZeros<unsigned>(Offset);
503 unsigned ThisImmVal = Offset &
ARM_AM::rotr32(0xff000000U, RotAmt);
506 Offset &= ~ThisImmVal;
509 "Bit extraction didn't work?");
523 unsigned NewOpc = Opcode;
526 if (OffsetReg != 0) {
537 unsigned NumBits = 0;
561 Offset += InstrOffs * 4;
562 assert((Offset & (Scale-1)) == 0 &&
"Can't encode this offset!");
580 if (NewOpc != Opcode)
587 int ImmedOffset = Offset / Scale;
588 unsigned Mask = (1 << NumBits) - 1;
589 if ((
unsigned)Offset <= Mask * Scale) {
595 ImmedOffset |= 1 << NumBits;
597 ImmedOffset = -ImmedOffset;
605 ImmedOffset = ImmedOffset & Mask;
609 ImmedOffset |= 1 << NumBits;
611 ImmedOffset = -ImmedOffset;
612 if (ImmedOffset == 0)
618 Offset &= ~(Mask*Scale);
621 Offset = (isSub) ? -Offset : Offset;
628 if (Opc == ARM::tBcc || Opc == ARM::t2Bcc)
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
The memory access reads data.
const MachineFunction * getParent() const
The memory access writes data.
static MCOperand CreateReg(unsigned Reg)
void ChangeToRegister(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f, uint64_t s, unsigned base_alignment, const MDNode *TBAAInfo=0, const MDNode *Ranges=0)
void emitT2RegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, ARMCC::CondCodes Pred, unsigned PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
static unsigned negativeOffsetOpcode(unsigned opcode)
const MCInstrDesc & getDesc() const
void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
ARMCC::CondCodes getITInstrPredicate(const MachineInstr *MI, unsigned &PredReg)
static MachinePointerInfo getFixedStack(int FI, int64_t offset=0)
static unsigned rotr32(unsigned Val, unsigned Amt)
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
static cl::opt< bool > OldT2IfCvt("old-thumb2-ifcvt", cl::Hidden, cl::desc("Use old-style Thumb2 if-conversion heuristics"), cl::init(false))
static const MachineInstrBuilder & AddDefaultPred(const MachineInstrBuilder &MIB)
const HexagonInstrInfo * TII
static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false)
#define llvm_unreachable(msg)
bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
Abstract Stack Frame Information.
enable_if_c< std::numeric_limits< T >::is_integer &&!std::numeric_limits< T >::is_signed, std::size_t >::type countLeadingZeros(T Val, ZeroBehavior ZB=ZB_Width)
Count number of 0's from the most significant bit to the least stopping at the first 1...
bool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
void RemoveOperand(unsigned i)
static int getT2SOImmVal(unsigned Arg)
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
unsigned getKillRegState(bool B)
void ChangeToImmediate(int64_t ImmVal)
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
initializer< Ty > init(const Ty &Val)
ARMCC::CondCodes getInstrPredicate(const MachineInstr *MI, unsigned &PredReg)
static unsigned char getAM5Offset(unsigned AM5Opc)
const MachineOperand & getOperand(unsigned i) const
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
Thumb2InstrInfo(const ARMSubtarget &STI)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
static unsigned immediateOffsetOpcode(unsigned opcode)
static const MachineInstrBuilder & AddDefaultCC(const MachineInstrBuilder &MIB)
void setOpcode(unsigned Op)
void setDesc(const MCInstrDesc &tid)
void addOperand(MachineFunction &MF, const MachineOperand &Op)
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
unsigned getObjectAlignment(int ObjectIdx) const
getObjectAlignment - Return the alignment of the specified stack object.
MachineFrameInfo * getFrameInfo()
const MachineInstrBuilder & addFrameIndex(int Idx) const
AddrMode
ARM Addressing Modes.
static bool isPhysicalRegister(unsigned Reg)
MachineRegisterInfo & getRegInfo()
static unsigned positiveOffsetOpcode(unsigned opcode)
static MCOperand CreateImm(int64_t Val)
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
static AddrOpc getAM5Op(unsigned AM5Opc)
void getNoopForMachoTarget(MCInst &NopInst) const
getNoopForMachoTarget - Return the noop instruction to use for a noop.
unsigned getReg() const
getReg - Returns the register number.
void addOperand(const MCOperand &Op)
const MCRegisterInfo & MRI
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
unsigned getUnindexedOpcode(unsigned Opc) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
int64_t getObjectSize(int ObjectIdx) const
const MachineInstrBuilder & AddDReg(MachineInstrBuilder &MIB, unsigned Reg, unsigned SubIdx, unsigned State, const TargetRegisterInfo *TRI) const