Thumb2InstrInfo.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. //===- Thumb2InstrInfo.cpp - Thumb-2 Instruction Information --------------===//
  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. //
  9. // This file contains the Thumb-2 implementation of the TargetInstrInfo class.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "Thumb2InstrInfo.h"
  13. #include "ARMMachineFunctionInfo.h"
  14. #include "ARMSubtarget.h"
  15. #include "MCTargetDesc/ARMAddressingModes.h"
  16. #include "llvm/CodeGen/MachineBasicBlock.h"
  17. #include "llvm/CodeGen/MachineFrameInfo.h"
  18. #include "llvm/CodeGen/MachineFunction.h"
  19. #include "llvm/CodeGen/MachineInstr.h"
  20. #include "llvm/CodeGen/MachineInstrBuilder.h"
  21. #include "llvm/CodeGen/MachineMemOperand.h"
  22. #include "llvm/CodeGen/MachineOperand.h"
  23. #include "llvm/CodeGen/MachineRegisterInfo.h"
  24. #include "llvm/CodeGen/TargetRegisterInfo.h"
  25. #include "llvm/IR/DebugLoc.h"
  26. #include "llvm/MC/MCInst.h"
  27. #include "llvm/MC/MCInstrDesc.h"
  28. #include "llvm/Support/CommandLine.h"
  29. #include "llvm/Support/ErrorHandling.h"
  30. #include "llvm/Support/MathExtras.h"
  31. #include "llvm/Target/TargetMachine.h"
  32. #include <cassert>
  33. using namespace llvm;
  34. static cl::opt<bool>
  35. OldT2IfCvt("old-thumb2-ifcvt", cl::Hidden,
  36. cl::desc("Use old-style Thumb2 if-conversion heuristics"),
  37. cl::init(false));
  38. static cl::opt<bool>
  39. PreferNoCSEL("prefer-no-csel", cl::Hidden,
  40. cl::desc("Prefer predicated Move to CSEL"),
  41. cl::init(false));
  42. Thumb2InstrInfo::Thumb2InstrInfo(const ARMSubtarget &STI)
  43. : ARMBaseInstrInfo(STI) {}
  44. /// Return the noop instruction to use for a noop.
  45. void Thumb2InstrInfo::getNoop(MCInst &NopInst) const {
  46. NopInst.setOpcode(ARM::tHINT);
  47. NopInst.addOperand(MCOperand::createImm(0));
  48. NopInst.addOperand(MCOperand::createImm(ARMCC::AL));
  49. NopInst.addOperand(MCOperand::createReg(0));
  50. }
  51. unsigned Thumb2InstrInfo::getUnindexedOpcode(unsigned Opc) const {
  52. // FIXME
  53. return 0;
  54. }
  55. void
  56. Thumb2InstrInfo::ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
  57. MachineBasicBlock *NewDest) const {
  58. MachineBasicBlock *MBB = Tail->getParent();
  59. ARMFunctionInfo *AFI = MBB->getParent()->getInfo<ARMFunctionInfo>();
  60. if (!AFI->hasITBlocks() || Tail->isBranch()) {
  61. TargetInstrInfo::ReplaceTailWithBranchTo(Tail, NewDest);
  62. return;
  63. }
  64. // If the first instruction of Tail is predicated, we may have to update
  65. // the IT instruction.
  66. Register PredReg;
  67. ARMCC::CondCodes CC = getInstrPredicate(*Tail, PredReg);
  68. MachineBasicBlock::iterator MBBI = Tail;
  69. if (CC != ARMCC::AL)
  70. // Expecting at least the t2IT instruction before it.
  71. --MBBI;
  72. // Actually replace the tail.
  73. TargetInstrInfo::ReplaceTailWithBranchTo(Tail, NewDest);
  74. // Fix up IT.
  75. if (CC != ARMCC::AL) {
  76. MachineBasicBlock::iterator E = MBB->begin();
  77. unsigned Count = 4; // At most 4 instructions in an IT block.
  78. while (Count && MBBI != E) {
  79. if (MBBI->isDebugInstr()) {
  80. --MBBI;
  81. continue;
  82. }
  83. if (MBBI->getOpcode() == ARM::t2IT) {
  84. unsigned Mask = MBBI->getOperand(1).getImm();
  85. if (Count == 4)
  86. MBBI->eraseFromParent();
  87. else {
  88. unsigned MaskOn = 1 << Count;
  89. unsigned MaskOff = ~(MaskOn - 1);
  90. MBBI->getOperand(1).setImm((Mask & MaskOff) | MaskOn);
  91. }
  92. return;
  93. }
  94. --MBBI;
  95. --Count;
  96. }
  97. // Ctrl flow can reach here if branch folding is run before IT block
  98. // formation pass.
  99. }
  100. }
  101. bool
  102. Thumb2InstrInfo::isLegalToSplitMBBAt(MachineBasicBlock &MBB,
  103. MachineBasicBlock::iterator MBBI) const {
  104. while (MBBI->isDebugInstr()) {
  105. ++MBBI;
  106. if (MBBI == MBB.end())
  107. return false;
  108. }
  109. Register PredReg;
  110. return getITInstrPredicate(*MBBI, PredReg) == ARMCC::AL;
  111. }
  112. MachineInstr *
  113. Thumb2InstrInfo::optimizeSelect(MachineInstr &MI,
  114. SmallPtrSetImpl<MachineInstr *> &SeenMIs,
  115. bool PreferFalse) const {
  116. // Try to use the base optimizeSelect, which uses canFoldIntoMOVCC to fold the
  117. // MOVCC into another instruction. If that fails on 8.1-M fall back to using a
  118. // CSEL.
  119. MachineInstr *RV = ARMBaseInstrInfo::optimizeSelect(MI, SeenMIs, PreferFalse);
  120. if (!RV && getSubtarget().hasV8_1MMainlineOps() && !PreferNoCSEL) {
  121. Register DestReg = MI.getOperand(0).getReg();
  122. if (!DestReg.isVirtual())
  123. return nullptr;
  124. MachineInstrBuilder NewMI = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
  125. get(ARM::t2CSEL), DestReg)
  126. .add(MI.getOperand(2))
  127. .add(MI.getOperand(1))
  128. .add(MI.getOperand(3));
  129. SeenMIs.insert(NewMI);
  130. return NewMI;
  131. }
  132. return RV;
  133. }
  134. void Thumb2InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
  135. MachineBasicBlock::iterator I,
  136. const DebugLoc &DL, MCRegister DestReg,
  137. MCRegister SrcReg, bool KillSrc) const {
  138. // Handle SPR, DPR, and QPR copies.
  139. if (!ARM::GPRRegClass.contains(DestReg, SrcReg))
  140. return ARMBaseInstrInfo::copyPhysReg(MBB, I, DL, DestReg, SrcReg, KillSrc);
  141. BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
  142. .addReg(SrcReg, getKillRegState(KillSrc))
  143. .add(predOps(ARMCC::AL));
  144. }
  145. void Thumb2InstrInfo::
  146. storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
  147. Register SrcReg, bool isKill, int FI,
  148. const TargetRegisterClass *RC,
  149. const TargetRegisterInfo *TRI) const {
  150. DebugLoc DL;
  151. if (I != MBB.end()) DL = I->getDebugLoc();
  152. MachineFunction &MF = *MBB.getParent();
  153. MachineFrameInfo &MFI = MF.getFrameInfo();
  154. MachineMemOperand *MMO = MF.getMachineMemOperand(
  155. MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,
  156. MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
  157. if (ARM::GPRRegClass.hasSubClassEq(RC)) {
  158. BuildMI(MBB, I, DL, get(ARM::t2STRi12))
  159. .addReg(SrcReg, getKillRegState(isKill))
  160. .addFrameIndex(FI)
  161. .addImm(0)
  162. .addMemOperand(MMO)
  163. .add(predOps(ARMCC::AL));
  164. return;
  165. }
  166. if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
  167. // Thumb2 STRD expects its dest-registers to be in rGPR. Not a problem for
  168. // gsub_0, but needs an extra constraint for gsub_1 (which could be sp
  169. // otherwise).
  170. if (Register::isVirtualRegister(SrcReg)) {
  171. MachineRegisterInfo *MRI = &MF.getRegInfo();
  172. MRI->constrainRegClass(SrcReg, &ARM::GPRPairnospRegClass);
  173. }
  174. MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::t2STRDi8));
  175. AddDReg(MIB, SrcReg, ARM::gsub_0, getKillRegState(isKill), TRI);
  176. AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
  177. MIB.addFrameIndex(FI).addImm(0).addMemOperand(MMO).add(predOps(ARMCC::AL));
  178. return;
  179. }
  180. ARMBaseInstrInfo::storeRegToStackSlot(MBB, I, SrcReg, isKill, FI, RC, TRI);
  181. }
  182. void Thumb2InstrInfo::
  183. loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
  184. Register DestReg, int FI,
  185. const TargetRegisterClass *RC,
  186. const TargetRegisterInfo *TRI) const {
  187. MachineFunction &MF = *MBB.getParent();
  188. MachineFrameInfo &MFI = MF.getFrameInfo();
  189. MachineMemOperand *MMO = MF.getMachineMemOperand(
  190. MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,
  191. MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
  192. DebugLoc DL;
  193. if (I != MBB.end()) DL = I->getDebugLoc();
  194. if (ARM::GPRRegClass.hasSubClassEq(RC)) {
  195. BuildMI(MBB, I, DL, get(ARM::t2LDRi12), DestReg)
  196. .addFrameIndex(FI)
  197. .addImm(0)
  198. .addMemOperand(MMO)
  199. .add(predOps(ARMCC::AL));
  200. return;
  201. }
  202. if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
  203. // Thumb2 LDRD expects its dest-registers to be in rGPR. Not a problem for
  204. // gsub_0, but needs an extra constraint for gsub_1 (which could be sp
  205. // otherwise).
  206. if (Register::isVirtualRegister(DestReg)) {
  207. MachineRegisterInfo *MRI = &MF.getRegInfo();
  208. MRI->constrainRegClass(DestReg, &ARM::GPRPairnospRegClass);
  209. }
  210. MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::t2LDRDi8));
  211. AddDReg(MIB, DestReg, ARM::gsub_0, RegState::DefineNoRead, TRI);
  212. AddDReg(MIB, DestReg, ARM::gsub_1, RegState::DefineNoRead, TRI);
  213. MIB.addFrameIndex(FI).addImm(0).addMemOperand(MMO).add(predOps(ARMCC::AL));
  214. if (Register::isPhysicalRegister(DestReg))
  215. MIB.addReg(DestReg, RegState::ImplicitDefine);
  216. return;
  217. }
  218. ARMBaseInstrInfo::loadRegFromStackSlot(MBB, I, DestReg, FI, RC, TRI);
  219. }
  220. void Thumb2InstrInfo::expandLoadStackGuard(
  221. MachineBasicBlock::iterator MI) const {
  222. MachineFunction &MF = *MI->getParent()->getParent();
  223. if (MF.getTarget().isPositionIndependent())
  224. expandLoadStackGuardBase(MI, ARM::t2MOV_ga_pcrel, ARM::t2LDRi12);
  225. else
  226. expandLoadStackGuardBase(MI, ARM::t2MOVi32imm, ARM::t2LDRi12);
  227. }
  228. MachineInstr *Thumb2InstrInfo::commuteInstructionImpl(MachineInstr &MI,
  229. bool NewMI,
  230. unsigned OpIdx1,
  231. unsigned OpIdx2) const {
  232. switch (MI.getOpcode()) {
  233. case ARM::MVE_VMAXNMAf16:
  234. case ARM::MVE_VMAXNMAf32:
  235. case ARM::MVE_VMINNMAf16:
  236. case ARM::MVE_VMINNMAf32:
  237. // Don't allow predicated instructions to be commuted.
  238. if (getVPTInstrPredicate(MI) != ARMVCC::None)
  239. return nullptr;
  240. }
  241. return ARMBaseInstrInfo::commuteInstructionImpl(MI, NewMI, OpIdx1, OpIdx2);
  242. }
  243. void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
  244. MachineBasicBlock::iterator &MBBI,
  245. const DebugLoc &dl, Register DestReg,
  246. Register BaseReg, int NumBytes,
  247. ARMCC::CondCodes Pred, Register PredReg,
  248. const ARMBaseInstrInfo &TII,
  249. unsigned MIFlags) {
  250. if (NumBytes == 0 && DestReg != BaseReg) {
  251. BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), DestReg)
  252. .addReg(BaseReg, RegState::Kill)
  253. .addImm((unsigned)Pred).addReg(PredReg).setMIFlags(MIFlags);
  254. return;
  255. }
  256. bool isSub = NumBytes < 0;
  257. if (isSub) NumBytes = -NumBytes;
  258. // If profitable, use a movw or movt to materialize the offset.
  259. // FIXME: Use the scavenger to grab a scratch register.
  260. if (DestReg != ARM::SP && DestReg != BaseReg &&
  261. NumBytes >= 4096 &&
  262. ARM_AM::getT2SOImmVal(NumBytes) == -1) {
  263. bool Fits = false;
  264. if (NumBytes < 65536) {
  265. // Use a movw to materialize the 16-bit constant.
  266. BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVi16), DestReg)
  267. .addImm(NumBytes)
  268. .addImm((unsigned)Pred).addReg(PredReg).setMIFlags(MIFlags);
  269. Fits = true;
  270. } else if ((NumBytes & 0xffff) == 0) {
  271. // Use a movt to materialize the 32-bit constant.
  272. BuildMI(MBB, MBBI, dl, TII.get(ARM::t2MOVTi16), DestReg)
  273. .addReg(DestReg)
  274. .addImm(NumBytes >> 16)
  275. .addImm((unsigned)Pred).addReg(PredReg).setMIFlags(MIFlags);
  276. Fits = true;
  277. }
  278. if (Fits) {
  279. if (isSub) {
  280. BuildMI(MBB, MBBI, dl, TII.get(ARM::t2SUBrr), DestReg)
  281. .addReg(BaseReg)
  282. .addReg(DestReg, RegState::Kill)
  283. .add(predOps(Pred, PredReg))
  284. .add(condCodeOp())
  285. .setMIFlags(MIFlags);
  286. } else {
  287. // Here we know that DestReg is not SP but we do not
  288. // know anything about BaseReg. t2ADDrr is an invalid
  289. // instruction is SP is used as the second argument, but
  290. // is fine if SP is the first argument. To be sure we
  291. // do not generate invalid encoding, put BaseReg first.
  292. BuildMI(MBB, MBBI, dl, TII.get(ARM::t2ADDrr), DestReg)
  293. .addReg(BaseReg)
  294. .addReg(DestReg, RegState::Kill)
  295. .add(predOps(Pred, PredReg))
  296. .add(condCodeOp())
  297. .setMIFlags(MIFlags);
  298. }
  299. return;
  300. }
  301. }
  302. while (NumBytes) {
  303. unsigned ThisVal = NumBytes;
  304. unsigned Opc = 0;
  305. if (DestReg == ARM::SP && BaseReg != ARM::SP) {
  306. // mov sp, rn. Note t2MOVr cannot be used.
  307. BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), DestReg)
  308. .addReg(BaseReg)
  309. .setMIFlags(MIFlags)
  310. .add(predOps(ARMCC::AL));
  311. BaseReg = ARM::SP;
  312. continue;
  313. }
  314. assert((DestReg != ARM::SP || BaseReg == ARM::SP) &&
  315. "Writing to SP, from other register.");
  316. // Try to use T1, as it smaller
  317. if ((DestReg == ARM::SP) && (ThisVal < ((1 << 7) - 1) * 4)) {
  318. assert((ThisVal & 3) == 0 && "Stack update is not multiple of 4?");
  319. Opc = isSub ? ARM::tSUBspi : ARM::tADDspi;
  320. BuildMI(MBB, MBBI, dl, TII.get(Opc), DestReg)
  321. .addReg(BaseReg)
  322. .addImm(ThisVal / 4)
  323. .setMIFlags(MIFlags)
  324. .add(predOps(ARMCC::AL));
  325. break;
  326. }
  327. bool HasCCOut = true;
  328. int ImmIsT2SO = ARM_AM::getT2SOImmVal(ThisVal);
  329. bool ToSP = DestReg == ARM::SP;
  330. unsigned t2SUB = ToSP ? ARM::t2SUBspImm : ARM::t2SUBri;
  331. unsigned t2ADD = ToSP ? ARM::t2ADDspImm : ARM::t2ADDri;
  332. unsigned t2SUBi12 = ToSP ? ARM::t2SUBspImm12 : ARM::t2SUBri12;
  333. unsigned t2ADDi12 = ToSP ? ARM::t2ADDspImm12 : ARM::t2ADDri12;
  334. Opc = isSub ? t2SUB : t2ADD;
  335. // Prefer T2: sub rd, rn, so_imm | sub sp, sp, so_imm
  336. if (ImmIsT2SO != -1) {
  337. NumBytes = 0;
  338. } else if (ThisVal < 4096) {
  339. // Prefer T3 if can make it in a single go: subw rd, rn, imm12 | subw sp,
  340. // sp, imm12
  341. Opc = isSub ? t2SUBi12 : t2ADDi12;
  342. HasCCOut = false;
  343. NumBytes = 0;
  344. } else {
  345. // Use one T2 instruction to reduce NumBytes
  346. // FIXME: Move this to ARMAddressingModes.h?
  347. unsigned RotAmt = countLeadingZeros(ThisVal);
  348. ThisVal = ThisVal & ARM_AM::rotr32(0xff000000U, RotAmt);
  349. NumBytes &= ~ThisVal;
  350. assert(ARM_AM::getT2SOImmVal(ThisVal) != -1 &&
  351. "Bit extraction didn't work?");
  352. }
  353. // Build the new ADD / SUB.
  354. MachineInstrBuilder MIB = BuildMI(MBB, MBBI, dl, TII.get(Opc), DestReg)
  355. .addReg(BaseReg, RegState::Kill)
  356. .addImm(ThisVal)
  357. .add(predOps(ARMCC::AL))
  358. .setMIFlags(MIFlags);
  359. if (HasCCOut)
  360. MIB.add(condCodeOp());
  361. BaseReg = DestReg;
  362. }
  363. }
  364. static unsigned
  365. negativeOffsetOpcode(unsigned opcode)
  366. {
  367. switch (opcode) {
  368. case ARM::t2LDRi12: return ARM::t2LDRi8;
  369. case ARM::t2LDRHi12: return ARM::t2LDRHi8;
  370. case ARM::t2LDRBi12: return ARM::t2LDRBi8;
  371. case ARM::t2LDRSHi12: return ARM::t2LDRSHi8;
  372. case ARM::t2LDRSBi12: return ARM::t2LDRSBi8;
  373. case ARM::t2STRi12: return ARM::t2STRi8;
  374. case ARM::t2STRBi12: return ARM::t2STRBi8;
  375. case ARM::t2STRHi12: return ARM::t2STRHi8;
  376. case ARM::t2PLDi12: return ARM::t2PLDi8;
  377. case ARM::t2PLDWi12: return ARM::t2PLDWi8;
  378. case ARM::t2PLIi12: return ARM::t2PLIi8;
  379. case ARM::t2LDRi8:
  380. case ARM::t2LDRHi8:
  381. case ARM::t2LDRBi8:
  382. case ARM::t2LDRSHi8:
  383. case ARM::t2LDRSBi8:
  384. case ARM::t2STRi8:
  385. case ARM::t2STRBi8:
  386. case ARM::t2STRHi8:
  387. case ARM::t2PLDi8:
  388. case ARM::t2PLDWi8:
  389. case ARM::t2PLIi8:
  390. return opcode;
  391. default:
  392. llvm_unreachable("unknown thumb2 opcode.");
  393. }
  394. }
  395. static unsigned
  396. positiveOffsetOpcode(unsigned opcode)
  397. {
  398. switch (opcode) {
  399. case ARM::t2LDRi8: return ARM::t2LDRi12;
  400. case ARM::t2LDRHi8: return ARM::t2LDRHi12;
  401. case ARM::t2LDRBi8: return ARM::t2LDRBi12;
  402. case ARM::t2LDRSHi8: return ARM::t2LDRSHi12;
  403. case ARM::t2LDRSBi8: return ARM::t2LDRSBi12;
  404. case ARM::t2STRi8: return ARM::t2STRi12;
  405. case ARM::t2STRBi8: return ARM::t2STRBi12;
  406. case ARM::t2STRHi8: return ARM::t2STRHi12;
  407. case ARM::t2PLDi8: return ARM::t2PLDi12;
  408. case ARM::t2PLDWi8: return ARM::t2PLDWi12;
  409. case ARM::t2PLIi8: return ARM::t2PLIi12;
  410. case ARM::t2LDRi12:
  411. case ARM::t2LDRHi12:
  412. case ARM::t2LDRBi12:
  413. case ARM::t2LDRSHi12:
  414. case ARM::t2LDRSBi12:
  415. case ARM::t2STRi12:
  416. case ARM::t2STRBi12:
  417. case ARM::t2STRHi12:
  418. case ARM::t2PLDi12:
  419. case ARM::t2PLDWi12:
  420. case ARM::t2PLIi12:
  421. return opcode;
  422. default:
  423. llvm_unreachable("unknown thumb2 opcode.");
  424. }
  425. }
  426. static unsigned
  427. immediateOffsetOpcode(unsigned opcode)
  428. {
  429. switch (opcode) {
  430. case ARM::t2LDRs: return ARM::t2LDRi12;
  431. case ARM::t2LDRHs: return ARM::t2LDRHi12;
  432. case ARM::t2LDRBs: return ARM::t2LDRBi12;
  433. case ARM::t2LDRSHs: return ARM::t2LDRSHi12;
  434. case ARM::t2LDRSBs: return ARM::t2LDRSBi12;
  435. case ARM::t2STRs: return ARM::t2STRi12;
  436. case ARM::t2STRBs: return ARM::t2STRBi12;
  437. case ARM::t2STRHs: return ARM::t2STRHi12;
  438. case ARM::t2PLDs: return ARM::t2PLDi12;
  439. case ARM::t2PLDWs: return ARM::t2PLDWi12;
  440. case ARM::t2PLIs: return ARM::t2PLIi12;
  441. case ARM::t2LDRi12:
  442. case ARM::t2LDRHi12:
  443. case ARM::t2LDRBi12:
  444. case ARM::t2LDRSHi12:
  445. case ARM::t2LDRSBi12:
  446. case ARM::t2STRi12:
  447. case ARM::t2STRBi12:
  448. case ARM::t2STRHi12:
  449. case ARM::t2PLDi12:
  450. case ARM::t2PLDWi12:
  451. case ARM::t2PLIi12:
  452. case ARM::t2LDRi8:
  453. case ARM::t2LDRHi8:
  454. case ARM::t2LDRBi8:
  455. case ARM::t2LDRSHi8:
  456. case ARM::t2LDRSBi8:
  457. case ARM::t2STRi8:
  458. case ARM::t2STRBi8:
  459. case ARM::t2STRHi8:
  460. case ARM::t2PLDi8:
  461. case ARM::t2PLDWi8:
  462. case ARM::t2PLIi8:
  463. return opcode;
  464. default:
  465. llvm_unreachable("unknown thumb2 opcode.");
  466. }
  467. }
  468. bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
  469. Register FrameReg, int &Offset,
  470. const ARMBaseInstrInfo &TII,
  471. const TargetRegisterInfo *TRI) {
  472. unsigned Opcode = MI.getOpcode();
  473. const MCInstrDesc &Desc = MI.getDesc();
  474. unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
  475. bool isSub = false;
  476. MachineFunction &MF = *MI.getParent()->getParent();
  477. const TargetRegisterClass *RegClass =
  478. TII.getRegClass(Desc, FrameRegIdx, TRI, MF);
  479. // Memory operands in inline assembly always use AddrModeT2_i12.
  480. if (Opcode == ARM::INLINEASM || Opcode == ARM::INLINEASM_BR)
  481. AddrMode = ARMII::AddrModeT2_i12; // FIXME. mode for thumb2?
  482. const bool IsSP = Opcode == ARM::t2ADDspImm12 || Opcode == ARM::t2ADDspImm;
  483. if (IsSP || Opcode == ARM::t2ADDri || Opcode == ARM::t2ADDri12) {
  484. Offset += MI.getOperand(FrameRegIdx+1).getImm();
  485. Register PredReg;
  486. if (Offset == 0 && getInstrPredicate(MI, PredReg) == ARMCC::AL &&
  487. !MI.definesRegister(ARM::CPSR)) {
  488. // Turn it into a move.
  489. MI.setDesc(TII.get(ARM::tMOVr));
  490. MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
  491. // Remove offset and remaining explicit predicate operands.
  492. do MI.RemoveOperand(FrameRegIdx+1);
  493. while (MI.getNumOperands() > FrameRegIdx+1);
  494. MachineInstrBuilder MIB(*MI.getParent()->getParent(), &MI);
  495. MIB.add(predOps(ARMCC::AL));
  496. return true;
  497. }
  498. bool HasCCOut = (Opcode != ARM::t2ADDspImm12 && Opcode != ARM::t2ADDri12);
  499. if (Offset < 0) {
  500. Offset = -Offset;
  501. isSub = true;
  502. MI.setDesc(IsSP ? TII.get(ARM::t2SUBspImm) : TII.get(ARM::t2SUBri));
  503. } else {
  504. MI.setDesc(IsSP ? TII.get(ARM::t2ADDspImm) : TII.get(ARM::t2ADDri));
  505. }
  506. // Common case: small offset, fits into instruction.
  507. if (ARM_AM::getT2SOImmVal(Offset) != -1) {
  508. MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
  509. MI.getOperand(FrameRegIdx+1).ChangeToImmediate(Offset);
  510. // Add cc_out operand if the original instruction did not have one.
  511. if (!HasCCOut)
  512. MI.addOperand(MachineOperand::CreateReg(0, false));
  513. Offset = 0;
  514. return true;
  515. }
  516. // Another common case: imm12.
  517. if (Offset < 4096 &&
  518. (!HasCCOut || MI.getOperand(MI.getNumOperands()-1).getReg() == 0)) {
  519. unsigned NewOpc = isSub ? IsSP ? ARM::t2SUBspImm12 : ARM::t2SUBri12
  520. : IsSP ? ARM::t2ADDspImm12 : ARM::t2ADDri12;
  521. MI.setDesc(TII.get(NewOpc));
  522. MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
  523. MI.getOperand(FrameRegIdx+1).ChangeToImmediate(Offset);
  524. // Remove the cc_out operand.
  525. if (HasCCOut)
  526. MI.RemoveOperand(MI.getNumOperands()-1);
  527. Offset = 0;
  528. return true;
  529. }
  530. // Otherwise, extract 8 adjacent bits from the immediate into this
  531. // t2ADDri/t2SUBri.
  532. unsigned RotAmt = countLeadingZeros<unsigned>(Offset);
  533. unsigned ThisImmVal = Offset & ARM_AM::rotr32(0xff000000U, RotAmt);
  534. // We will handle these bits from offset, clear them.
  535. Offset &= ~ThisImmVal;
  536. assert(ARM_AM::getT2SOImmVal(ThisImmVal) != -1 &&
  537. "Bit extraction didn't work?");
  538. MI.getOperand(FrameRegIdx+1).ChangeToImmediate(ThisImmVal);
  539. // Add cc_out operand if the original instruction did not have one.
  540. if (!HasCCOut)
  541. MI.addOperand(MachineOperand::CreateReg(0, false));
  542. } else {
  543. // AddrMode4 and AddrMode6 cannot handle any offset.
  544. if (AddrMode == ARMII::AddrMode4 || AddrMode == ARMII::AddrMode6)
  545. return false;
  546. // AddrModeT2_so cannot handle any offset. If there is no offset
  547. // register then we change to an immediate version.
  548. unsigned NewOpc = Opcode;
  549. if (AddrMode == ARMII::AddrModeT2_so) {
  550. Register OffsetReg = MI.getOperand(FrameRegIdx + 1).getReg();
  551. if (OffsetReg != 0) {
  552. MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
  553. return Offset == 0;
  554. }
  555. MI.RemoveOperand(FrameRegIdx+1);
  556. MI.getOperand(FrameRegIdx+1).ChangeToImmediate(0);
  557. NewOpc = immediateOffsetOpcode(Opcode);
  558. AddrMode = ARMII::AddrModeT2_i12;
  559. }
  560. unsigned NumBits = 0;
  561. unsigned Scale = 1;
  562. if (AddrMode == ARMII::AddrModeT2_i8 || AddrMode == ARMII::AddrModeT2_i12) {
  563. // i8 supports only negative, and i12 supports only positive, so
  564. // based on Offset sign convert Opcode to the appropriate
  565. // instruction
  566. Offset += MI.getOperand(FrameRegIdx+1).getImm();
  567. if (Offset < 0) {
  568. NewOpc = negativeOffsetOpcode(Opcode);
  569. NumBits = 8;
  570. isSub = true;
  571. Offset = -Offset;
  572. } else {
  573. NewOpc = positiveOffsetOpcode(Opcode);
  574. NumBits = 12;
  575. }
  576. } else if (AddrMode == ARMII::AddrMode5) {
  577. // VFP address mode.
  578. const MachineOperand &OffOp = MI.getOperand(FrameRegIdx+1);
  579. int InstrOffs = ARM_AM::getAM5Offset(OffOp.getImm());
  580. if (ARM_AM::getAM5Op(OffOp.getImm()) == ARM_AM::sub)
  581. InstrOffs *= -1;
  582. NumBits = 8;
  583. Scale = 4;
  584. Offset += InstrOffs * 4;
  585. assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!");
  586. if (Offset < 0) {
  587. Offset = -Offset;
  588. isSub = true;
  589. }
  590. } else if (AddrMode == ARMII::AddrMode5FP16) {
  591. // VFP address mode.
  592. const MachineOperand &OffOp = MI.getOperand(FrameRegIdx+1);
  593. int InstrOffs = ARM_AM::getAM5FP16Offset(OffOp.getImm());
  594. if (ARM_AM::getAM5FP16Op(OffOp.getImm()) == ARM_AM::sub)
  595. InstrOffs *= -1;
  596. NumBits = 8;
  597. Scale = 2;
  598. Offset += InstrOffs * 2;
  599. assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!");
  600. if (Offset < 0) {
  601. Offset = -Offset;
  602. isSub = true;
  603. }
  604. } else if (AddrMode == ARMII::AddrModeT2_i7s4 ||
  605. AddrMode == ARMII::AddrModeT2_i7s2 ||
  606. AddrMode == ARMII::AddrModeT2_i7) {
  607. Offset += MI.getOperand(FrameRegIdx + 1).getImm();
  608. unsigned OffsetMask;
  609. switch (AddrMode) {
  610. case ARMII::AddrModeT2_i7s4: NumBits = 9; OffsetMask = 0x3; break;
  611. case ARMII::AddrModeT2_i7s2: NumBits = 8; OffsetMask = 0x1; break;
  612. default: NumBits = 7; OffsetMask = 0x0; break;
  613. }
  614. // MCInst operand expects already scaled value.
  615. Scale = 1;
  616. assert((Offset & OffsetMask) == 0 && "Can't encode this offset!");
  617. (void)OffsetMask; // squash unused-variable warning at -NDEBUG
  618. } else if (AddrMode == ARMII::AddrModeT2_i8s4) {
  619. Offset += MI.getOperand(FrameRegIdx + 1).getImm();
  620. NumBits = 8 + 2;
  621. // MCInst operand expects already scaled value.
  622. Scale = 1;
  623. assert((Offset & 3) == 0 && "Can't encode this offset!");
  624. } else if (AddrMode == ARMII::AddrModeT2_ldrex) {
  625. Offset += MI.getOperand(FrameRegIdx + 1).getImm() * 4;
  626. NumBits = 8; // 8 bits scaled by 4
  627. Scale = 4;
  628. assert((Offset & 3) == 0 && "Can't encode this offset!");
  629. } else {
  630. llvm_unreachable("Unsupported addressing mode!");
  631. }
  632. if (NewOpc != Opcode)
  633. MI.setDesc(TII.get(NewOpc));
  634. MachineOperand &ImmOp = MI.getOperand(FrameRegIdx+1);
  635. // Attempt to fold address computation
  636. // Common case: small offset, fits into instruction. We need to make sure
  637. // the register class is correct too, for instructions like the MVE
  638. // VLDRH.32, which only accepts low tGPR registers.
  639. int ImmedOffset = Offset / Scale;
  640. unsigned Mask = (1 << NumBits) - 1;
  641. if ((unsigned)Offset <= Mask * Scale &&
  642. (Register::isVirtualRegister(FrameReg) ||
  643. RegClass->contains(FrameReg))) {
  644. if (Register::isVirtualRegister(FrameReg)) {
  645. // Make sure the register class for the virtual register is correct
  646. MachineRegisterInfo *MRI = &MF.getRegInfo();
  647. if (!MRI->constrainRegClass(FrameReg, RegClass))
  648. llvm_unreachable("Unable to constrain virtual register class.");
  649. }
  650. // Replace the FrameIndex with fp/sp
  651. MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
  652. if (isSub) {
  653. if (AddrMode == ARMII::AddrMode5 || AddrMode == ARMII::AddrMode5FP16)
  654. // FIXME: Not consistent.
  655. ImmedOffset |= 1 << NumBits;
  656. else
  657. ImmedOffset = -ImmedOffset;
  658. }
  659. ImmOp.ChangeToImmediate(ImmedOffset);
  660. Offset = 0;
  661. return true;
  662. }
  663. // Otherwise, offset doesn't fit. Pull in what we can to simplify
  664. ImmedOffset = ImmedOffset & Mask;
  665. if (isSub) {
  666. if (AddrMode == ARMII::AddrMode5 || AddrMode == ARMII::AddrMode5FP16)
  667. // FIXME: Not consistent.
  668. ImmedOffset |= 1 << NumBits;
  669. else {
  670. ImmedOffset = -ImmedOffset;
  671. if (ImmedOffset == 0)
  672. // Change the opcode back if the encoded offset is zero.
  673. MI.setDesc(TII.get(positiveOffsetOpcode(NewOpc)));
  674. }
  675. }
  676. ImmOp.ChangeToImmediate(ImmedOffset);
  677. Offset &= ~(Mask*Scale);
  678. }
  679. Offset = (isSub) ? -Offset : Offset;
  680. return Offset == 0 && (Register::isVirtualRegister(FrameReg) ||
  681. RegClass->contains(FrameReg));
  682. }
  683. ARMCC::CondCodes llvm::getITInstrPredicate(const MachineInstr &MI,
  684. Register &PredReg) {
  685. unsigned Opc = MI.getOpcode();
  686. if (Opc == ARM::tBcc || Opc == ARM::t2Bcc)
  687. return ARMCC::AL;
  688. return getInstrPredicate(MI, PredReg);
  689. }
  690. int llvm::findFirstVPTPredOperandIdx(const MachineInstr &MI) {
  691. const MCInstrDesc &MCID = MI.getDesc();
  692. if (!MCID.OpInfo)
  693. return -1;
  694. for (unsigned i = 0, e = MCID.getNumOperands(); i != e; ++i)
  695. if (ARM::isVpred(MCID.OpInfo[i].OperandType))
  696. return i;
  697. return -1;
  698. }
  699. ARMVCC::VPTCodes llvm::getVPTInstrPredicate(const MachineInstr &MI,
  700. Register &PredReg) {
  701. int PIdx = findFirstVPTPredOperandIdx(MI);
  702. if (PIdx == -1) {
  703. PredReg = 0;
  704. return ARMVCC::None;
  705. }
  706. PredReg = MI.getOperand(PIdx+1).getReg();
  707. return (ARMVCC::VPTCodes)MI.getOperand(PIdx).getImm();
  708. }
  709. void llvm::recomputeVPTBlockMask(MachineInstr &Instr) {
  710. assert(isVPTOpcode(Instr.getOpcode()) && "Not a VPST or VPT Instruction!");
  711. MachineOperand &MaskOp = Instr.getOperand(0);
  712. assert(MaskOp.isImm() && "Operand 0 is not the block mask of the VPT/VPST?!");
  713. MachineBasicBlock::iterator Iter = ++Instr.getIterator(),
  714. End = Instr.getParent()->end();
  715. // Verify that the instruction after the VPT/VPST is predicated (it should
  716. // be), and skip it.
  717. assert(
  718. getVPTInstrPredicate(*Iter) == ARMVCC::Then &&
  719. "VPT/VPST should be followed by an instruction with a 'then' predicate!");
  720. ++Iter;
  721. // Iterate over the predicated instructions, updating the BlockMask as we go.
  722. ARM::PredBlockMask BlockMask = ARM::PredBlockMask::T;
  723. while (Iter != End) {
  724. ARMVCC::VPTCodes Pred = getVPTInstrPredicate(*Iter);
  725. if (Pred == ARMVCC::None)
  726. break;
  727. BlockMask = expandPredBlockMask(BlockMask, Pred);
  728. ++Iter;
  729. }
  730. // Rewrite the BlockMask.
  731. MaskOp.setImm((int64_t)(BlockMask));
  732. }