1 //===- AArch64InstrInfo.cpp - AArch64 Instruction Information -------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the AArch64 implementation of the TargetInstrInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "AArch64InstrInfo.h"
15 #include "AArch64Subtarget.h"
16 #include "MCTargetDesc/AArch64AddressingModes.h"
17 #include "llvm/CodeGen/MachineFrameInfo.h"
18 #include "llvm/CodeGen/MachineInstrBuilder.h"
19 #include "llvm/CodeGen/MachineMemOperand.h"
20 #include "llvm/CodeGen/MachineRegisterInfo.h"
21 #include "llvm/CodeGen/PseudoSourceValue.h"
22 #include "llvm/MC/MCInst.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/TargetRegistry.h"
25 #include <algorithm>
26 
27 using namespace llvm;
28 
29 #define GET_INSTRINFO_CTOR_DTOR
30 #include "AArch64GenInstrInfo.inc"
31 
32 static LLVM_CONSTEXPR MachineMemOperand::Flags MOSuppressPair =
33     MachineMemOperand::MOTargetFlag1;
34 
35 static cl::opt<unsigned>
36 TBZDisplacementBits("aarch64-tbz-offset-bits", cl::Hidden, cl::init(14),
37                     cl::desc("Restrict range of TB[N]Z instructions (DEBUG)"));
38 
39 static cl::opt<unsigned>
40 CBZDisplacementBits("aarch64-cbz-offset-bits", cl::Hidden, cl::init(19),
41                     cl::desc("Restrict range of CB[N]Z instructions (DEBUG)"));
42 
43 static cl::opt<unsigned>
44 BCCDisplacementBits("aarch64-bcc-offset-bits", cl::Hidden, cl::init(19),
45                     cl::desc("Restrict range of Bcc instructions (DEBUG)"));
46 
47 AArch64InstrInfo::AArch64InstrInfo(const AArch64Subtarget &STI)
48     : AArch64GenInstrInfo(AArch64::ADJCALLSTACKDOWN, AArch64::ADJCALLSTACKUP),
49       RI(STI.getTargetTriple()), Subtarget(STI) {}
50 
51 /// GetInstSize - Return the number of bytes of code the specified
52 /// instruction may be.  This returns the maximum number of bytes.
53 unsigned AArch64InstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
54   const MachineBasicBlock &MBB = *MI.getParent();
55   const MachineFunction *MF = MBB.getParent();
56   const MCAsmInfo *MAI = MF->getTarget().getMCAsmInfo();
57 
58   if (MI.getOpcode() == AArch64::INLINEASM)
59     return getInlineAsmLength(MI.getOperand(0).getSymbolName(), *MAI);
60 
61   const MCInstrDesc &Desc = MI.getDesc();
62   switch (Desc.getOpcode()) {
63   default:
64     // Anything not explicitly designated otherwise is a normal 4-byte insn.
65     return 4;
66   case TargetOpcode::DBG_VALUE:
67   case TargetOpcode::EH_LABEL:
68   case TargetOpcode::IMPLICIT_DEF:
69   case TargetOpcode::KILL:
70     return 0;
71   case AArch64::TLSDESC_CALLSEQ:
72     // This gets lowered to an instruction sequence which takes 16 bytes
73     return 16;
74   }
75 
76   llvm_unreachable("getInstSizeInBytes()- Unable to determin insn size");
77 }
78 
79 static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target,
80                             SmallVectorImpl<MachineOperand> &Cond) {
81   // Block ends with fall-through condbranch.
82   switch (LastInst->getOpcode()) {
83   default:
84     llvm_unreachable("Unknown branch instruction?");
85   case AArch64::Bcc:
86     Target = LastInst->getOperand(1).getMBB();
87     Cond.push_back(LastInst->getOperand(0));
88     break;
89   case AArch64::CBZW:
90   case AArch64::CBZX:
91   case AArch64::CBNZW:
92   case AArch64::CBNZX:
93     Target = LastInst->getOperand(1).getMBB();
94     Cond.push_back(MachineOperand::CreateImm(-1));
95     Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
96     Cond.push_back(LastInst->getOperand(0));
97     break;
98   case AArch64::TBZW:
99   case AArch64::TBZX:
100   case AArch64::TBNZW:
101   case AArch64::TBNZX:
102     Target = LastInst->getOperand(2).getMBB();
103     Cond.push_back(MachineOperand::CreateImm(-1));
104     Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
105     Cond.push_back(LastInst->getOperand(0));
106     Cond.push_back(LastInst->getOperand(1));
107   }
108 }
109 
110 static unsigned getBranchDisplacementBits(unsigned Opc) {
111   switch (Opc) {
112   default:
113     llvm_unreachable("unexpected opcode!");
114   case AArch64::TBNZW:
115   case AArch64::TBZW:
116   case AArch64::TBNZX:
117   case AArch64::TBZX:
118     return TBZDisplacementBits;
119   case AArch64::CBNZW:
120   case AArch64::CBZW:
121   case AArch64::CBNZX:
122   case AArch64::CBZX:
123     return CBZDisplacementBits;
124   case AArch64::Bcc:
125     return BCCDisplacementBits;
126   }
127 }
128 
129 static unsigned getBranchMaxDisplacementBytes(unsigned Opc) {
130   if (Opc == AArch64::B)
131     return -1;
132 
133   unsigned Bits = getBranchDisplacementBits(Opc);
134   unsigned MaxOffs = ((1 << (Bits - 1)) - 1) << 2;
135 
136   // Verify the displacement bits options have sane values.
137   // XXX: Is there a better place for this?
138   assert(MaxOffs >= 8 &&
139          "max branch displacement must be enough to jump"
140          "over conditional branch expansion");
141 
142   return MaxOffs;
143 }
144 
145 bool AArch64InstrInfo::isBranchInRange(unsigned BranchOp, uint64_t BrOffset,
146                                        uint64_t DestOffset) const {
147   unsigned MaxOffs = getBranchMaxDisplacementBytes(BranchOp);
148 
149   // Branch before the Dest.
150   if (BrOffset <= DestOffset)
151     return (DestOffset - BrOffset <= MaxOffs);
152   return (BrOffset - DestOffset <= MaxOffs);
153 }
154 
155 // Branch analysis.
156 bool AArch64InstrInfo::analyzeBranch(MachineBasicBlock &MBB,
157                                      MachineBasicBlock *&TBB,
158                                      MachineBasicBlock *&FBB,
159                                      SmallVectorImpl<MachineOperand> &Cond,
160                                      bool AllowModify) const {
161   // If the block has no terminators, it just falls into the block after it.
162   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
163   if (I == MBB.end())
164     return false;
165 
166   if (!isUnpredicatedTerminator(*I))
167     return false;
168 
169   // Get the last instruction in the block.
170   MachineInstr *LastInst = &*I;
171 
172   // If there is only one terminator instruction, process it.
173   unsigned LastOpc = LastInst->getOpcode();
174   if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
175     if (isUncondBranchOpcode(LastOpc)) {
176       TBB = LastInst->getOperand(0).getMBB();
177       return false;
178     }
179     if (isCondBranchOpcode(LastOpc)) {
180       // Block ends with fall-through condbranch.
181       parseCondBranch(LastInst, TBB, Cond);
182       return false;
183     }
184     return true; // Can't handle indirect branch.
185   }
186 
187   // Get the instruction before it if it is a terminator.
188   MachineInstr *SecondLastInst = &*I;
189   unsigned SecondLastOpc = SecondLastInst->getOpcode();
190 
191   // If AllowModify is true and the block ends with two or more unconditional
192   // branches, delete all but the first unconditional branch.
193   if (AllowModify && isUncondBranchOpcode(LastOpc)) {
194     while (isUncondBranchOpcode(SecondLastOpc)) {
195       LastInst->eraseFromParent();
196       LastInst = SecondLastInst;
197       LastOpc = LastInst->getOpcode();
198       if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
199         // Return now the only terminator is an unconditional branch.
200         TBB = LastInst->getOperand(0).getMBB();
201         return false;
202       } else {
203         SecondLastInst = &*I;
204         SecondLastOpc = SecondLastInst->getOpcode();
205       }
206     }
207   }
208 
209   // If there are three terminators, we don't know what sort of block this is.
210   if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(*--I))
211     return true;
212 
213   // If the block ends with a B and a Bcc, handle it.
214   if (isCondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
215     parseCondBranch(SecondLastInst, TBB, Cond);
216     FBB = LastInst->getOperand(0).getMBB();
217     return false;
218   }
219 
220   // If the block ends with two unconditional branches, handle it.  The second
221   // one is not executed, so remove it.
222   if (isUncondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
223     TBB = SecondLastInst->getOperand(0).getMBB();
224     I = LastInst;
225     if (AllowModify)
226       I->eraseFromParent();
227     return false;
228   }
229 
230   // ...likewise if it ends with an indirect branch followed by an unconditional
231   // branch.
232   if (isIndirectBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
233     I = LastInst;
234     if (AllowModify)
235       I->eraseFromParent();
236     return true;
237   }
238 
239   // Otherwise, can't handle this.
240   return true;
241 }
242 
243 bool AArch64InstrInfo::ReverseBranchCondition(
244     SmallVectorImpl<MachineOperand> &Cond) const {
245   if (Cond[0].getImm() != -1) {
246     // Regular Bcc
247     AArch64CC::CondCode CC = (AArch64CC::CondCode)(int)Cond[0].getImm();
248     Cond[0].setImm(AArch64CC::getInvertedCondCode(CC));
249   } else {
250     // Folded compare-and-branch
251     switch (Cond[1].getImm()) {
252     default:
253       llvm_unreachable("Unknown conditional branch!");
254     case AArch64::CBZW:
255       Cond[1].setImm(AArch64::CBNZW);
256       break;
257     case AArch64::CBNZW:
258       Cond[1].setImm(AArch64::CBZW);
259       break;
260     case AArch64::CBZX:
261       Cond[1].setImm(AArch64::CBNZX);
262       break;
263     case AArch64::CBNZX:
264       Cond[1].setImm(AArch64::CBZX);
265       break;
266     case AArch64::TBZW:
267       Cond[1].setImm(AArch64::TBNZW);
268       break;
269     case AArch64::TBNZW:
270       Cond[1].setImm(AArch64::TBZW);
271       break;
272     case AArch64::TBZX:
273       Cond[1].setImm(AArch64::TBNZX);
274       break;
275     case AArch64::TBNZX:
276       Cond[1].setImm(AArch64::TBZX);
277       break;
278     }
279   }
280 
281   return false;
282 }
283 
284 unsigned AArch64InstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
285   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
286   if (I == MBB.end())
287     return 0;
288 
289   if (!isUncondBranchOpcode(I->getOpcode()) &&
290       !isCondBranchOpcode(I->getOpcode()))
291     return 0;
292 
293   // Remove the branch.
294   I->eraseFromParent();
295 
296   I = MBB.end();
297 
298   if (I == MBB.begin())
299     return 1;
300   --I;
301   if (!isCondBranchOpcode(I->getOpcode()))
302     return 1;
303 
304   // Remove the branch.
305   I->eraseFromParent();
306   return 2;
307 }
308 
309 void AArch64InstrInfo::instantiateCondBranch(
310     MachineBasicBlock &MBB, const DebugLoc &DL, MachineBasicBlock *TBB,
311     ArrayRef<MachineOperand> Cond) const {
312   if (Cond[0].getImm() != -1) {
313     // Regular Bcc
314     BuildMI(&MBB, DL, get(AArch64::Bcc)).addImm(Cond[0].getImm()).addMBB(TBB);
315   } else {
316     // Folded compare-and-branch
317     // Note that we use addOperand instead of addReg to keep the flags.
318     const MachineInstrBuilder MIB =
319         BuildMI(&MBB, DL, get(Cond[1].getImm())).addOperand(Cond[2]);
320     if (Cond.size() > 3)
321       MIB.addImm(Cond[3].getImm());
322     MIB.addMBB(TBB);
323   }
324 }
325 
326 unsigned AArch64InstrInfo::InsertBranch(MachineBasicBlock &MBB,
327                                         MachineBasicBlock *TBB,
328                                         MachineBasicBlock *FBB,
329                                         ArrayRef<MachineOperand> Cond,
330                                         const DebugLoc &DL) const {
331   // Shouldn't be a fall through.
332   assert(TBB && "InsertBranch must not be told to insert a fallthrough");
333 
334   if (!FBB) {
335     if (Cond.empty()) // Unconditional branch?
336       BuildMI(&MBB, DL, get(AArch64::B)).addMBB(TBB);
337     else
338       instantiateCondBranch(MBB, DL, TBB, Cond);
339     return 1;
340   }
341 
342   // Two-way conditional branch.
343   instantiateCondBranch(MBB, DL, TBB, Cond);
344   BuildMI(&MBB, DL, get(AArch64::B)).addMBB(FBB);
345   return 2;
346 }
347 
348 // Find the original register that VReg is copied from.
349 static unsigned removeCopies(const MachineRegisterInfo &MRI, unsigned VReg) {
350   while (TargetRegisterInfo::isVirtualRegister(VReg)) {
351     const MachineInstr *DefMI = MRI.getVRegDef(VReg);
352     if (!DefMI->isFullCopy())
353       return VReg;
354     VReg = DefMI->getOperand(1).getReg();
355   }
356   return VReg;
357 }
358 
359 // Determine if VReg is defined by an instruction that can be folded into a
360 // csel instruction. If so, return the folded opcode, and the replacement
361 // register.
362 static unsigned canFoldIntoCSel(const MachineRegisterInfo &MRI, unsigned VReg,
363                                 unsigned *NewVReg = nullptr) {
364   VReg = removeCopies(MRI, VReg);
365   if (!TargetRegisterInfo::isVirtualRegister(VReg))
366     return 0;
367 
368   bool Is64Bit = AArch64::GPR64allRegClass.hasSubClassEq(MRI.getRegClass(VReg));
369   const MachineInstr *DefMI = MRI.getVRegDef(VReg);
370   unsigned Opc = 0;
371   unsigned SrcOpNum = 0;
372   switch (DefMI->getOpcode()) {
373   case AArch64::ADDSXri:
374   case AArch64::ADDSWri:
375     // if NZCV is used, do not fold.
376     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) == -1)
377       return 0;
378   // fall-through to ADDXri and ADDWri.
379   case AArch64::ADDXri:
380   case AArch64::ADDWri:
381     // add x, 1 -> csinc.
382     if (!DefMI->getOperand(2).isImm() || DefMI->getOperand(2).getImm() != 1 ||
383         DefMI->getOperand(3).getImm() != 0)
384       return 0;
385     SrcOpNum = 1;
386     Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
387     break;
388 
389   case AArch64::ORNXrr:
390   case AArch64::ORNWrr: {
391     // not x -> csinv, represented as orn dst, xzr, src.
392     unsigned ZReg = removeCopies(MRI, DefMI->getOperand(1).getReg());
393     if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
394       return 0;
395     SrcOpNum = 2;
396     Opc = Is64Bit ? AArch64::CSINVXr : AArch64::CSINVWr;
397     break;
398   }
399 
400   case AArch64::SUBSXrr:
401   case AArch64::SUBSWrr:
402     // if NZCV is used, do not fold.
403     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) == -1)
404       return 0;
405   // fall-through to SUBXrr and SUBWrr.
406   case AArch64::SUBXrr:
407   case AArch64::SUBWrr: {
408     // neg x -> csneg, represented as sub dst, xzr, src.
409     unsigned ZReg = removeCopies(MRI, DefMI->getOperand(1).getReg());
410     if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
411       return 0;
412     SrcOpNum = 2;
413     Opc = Is64Bit ? AArch64::CSNEGXr : AArch64::CSNEGWr;
414     break;
415   }
416   default:
417     return 0;
418   }
419   assert(Opc && SrcOpNum && "Missing parameters");
420 
421   if (NewVReg)
422     *NewVReg = DefMI->getOperand(SrcOpNum).getReg();
423   return Opc;
424 }
425 
426 bool AArch64InstrInfo::canInsertSelect(
427     const MachineBasicBlock &MBB, ArrayRef<MachineOperand> Cond,
428     unsigned TrueReg, unsigned FalseReg, int &CondCycles, int &TrueCycles,
429     int &FalseCycles) const {
430   // Check register classes.
431   const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
432   const TargetRegisterClass *RC =
433       RI.getCommonSubClass(MRI.getRegClass(TrueReg), MRI.getRegClass(FalseReg));
434   if (!RC)
435     return false;
436 
437   // Expanding cbz/tbz requires an extra cycle of latency on the condition.
438   unsigned ExtraCondLat = Cond.size() != 1;
439 
440   // GPRs are handled by csel.
441   // FIXME: Fold in x+1, -x, and ~x when applicable.
442   if (AArch64::GPR64allRegClass.hasSubClassEq(RC) ||
443       AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
444     // Single-cycle csel, csinc, csinv, and csneg.
445     CondCycles = 1 + ExtraCondLat;
446     TrueCycles = FalseCycles = 1;
447     if (canFoldIntoCSel(MRI, TrueReg))
448       TrueCycles = 0;
449     else if (canFoldIntoCSel(MRI, FalseReg))
450       FalseCycles = 0;
451     return true;
452   }
453 
454   // Scalar floating point is handled by fcsel.
455   // FIXME: Form fabs, fmin, and fmax when applicable.
456   if (AArch64::FPR64RegClass.hasSubClassEq(RC) ||
457       AArch64::FPR32RegClass.hasSubClassEq(RC)) {
458     CondCycles = 5 + ExtraCondLat;
459     TrueCycles = FalseCycles = 2;
460     return true;
461   }
462 
463   // Can't do vectors.
464   return false;
465 }
466 
467 void AArch64InstrInfo::insertSelect(MachineBasicBlock &MBB,
468                                     MachineBasicBlock::iterator I,
469                                     const DebugLoc &DL, unsigned DstReg,
470                                     ArrayRef<MachineOperand> Cond,
471                                     unsigned TrueReg, unsigned FalseReg) const {
472   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
473 
474   // Parse the condition code, see parseCondBranch() above.
475   AArch64CC::CondCode CC;
476   switch (Cond.size()) {
477   default:
478     llvm_unreachable("Unknown condition opcode in Cond");
479   case 1: // b.cc
480     CC = AArch64CC::CondCode(Cond[0].getImm());
481     break;
482   case 3: { // cbz/cbnz
483     // We must insert a compare against 0.
484     bool Is64Bit;
485     switch (Cond[1].getImm()) {
486     default:
487       llvm_unreachable("Unknown branch opcode in Cond");
488     case AArch64::CBZW:
489       Is64Bit = 0;
490       CC = AArch64CC::EQ;
491       break;
492     case AArch64::CBZX:
493       Is64Bit = 1;
494       CC = AArch64CC::EQ;
495       break;
496     case AArch64::CBNZW:
497       Is64Bit = 0;
498       CC = AArch64CC::NE;
499       break;
500     case AArch64::CBNZX:
501       Is64Bit = 1;
502       CC = AArch64CC::NE;
503       break;
504     }
505     unsigned SrcReg = Cond[2].getReg();
506     if (Is64Bit) {
507       // cmp reg, #0 is actually subs xzr, reg, #0.
508       MRI.constrainRegClass(SrcReg, &AArch64::GPR64spRegClass);
509       BuildMI(MBB, I, DL, get(AArch64::SUBSXri), AArch64::XZR)
510           .addReg(SrcReg)
511           .addImm(0)
512           .addImm(0);
513     } else {
514       MRI.constrainRegClass(SrcReg, &AArch64::GPR32spRegClass);
515       BuildMI(MBB, I, DL, get(AArch64::SUBSWri), AArch64::WZR)
516           .addReg(SrcReg)
517           .addImm(0)
518           .addImm(0);
519     }
520     break;
521   }
522   case 4: { // tbz/tbnz
523     // We must insert a tst instruction.
524     switch (Cond[1].getImm()) {
525     default:
526       llvm_unreachable("Unknown branch opcode in Cond");
527     case AArch64::TBZW:
528     case AArch64::TBZX:
529       CC = AArch64CC::EQ;
530       break;
531     case AArch64::TBNZW:
532     case AArch64::TBNZX:
533       CC = AArch64CC::NE;
534       break;
535     }
536     // cmp reg, #foo is actually ands xzr, reg, #1<<foo.
537     if (Cond[1].getImm() == AArch64::TBZW || Cond[1].getImm() == AArch64::TBNZW)
538       BuildMI(MBB, I, DL, get(AArch64::ANDSWri), AArch64::WZR)
539           .addReg(Cond[2].getReg())
540           .addImm(
541               AArch64_AM::encodeLogicalImmediate(1ull << Cond[3].getImm(), 32));
542     else
543       BuildMI(MBB, I, DL, get(AArch64::ANDSXri), AArch64::XZR)
544           .addReg(Cond[2].getReg())
545           .addImm(
546               AArch64_AM::encodeLogicalImmediate(1ull << Cond[3].getImm(), 64));
547     break;
548   }
549   }
550 
551   unsigned Opc = 0;
552   const TargetRegisterClass *RC = nullptr;
553   bool TryFold = false;
554   if (MRI.constrainRegClass(DstReg, &AArch64::GPR64RegClass)) {
555     RC = &AArch64::GPR64RegClass;
556     Opc = AArch64::CSELXr;
557     TryFold = true;
558   } else if (MRI.constrainRegClass(DstReg, &AArch64::GPR32RegClass)) {
559     RC = &AArch64::GPR32RegClass;
560     Opc = AArch64::CSELWr;
561     TryFold = true;
562   } else if (MRI.constrainRegClass(DstReg, &AArch64::FPR64RegClass)) {
563     RC = &AArch64::FPR64RegClass;
564     Opc = AArch64::FCSELDrrr;
565   } else if (MRI.constrainRegClass(DstReg, &AArch64::FPR32RegClass)) {
566     RC = &AArch64::FPR32RegClass;
567     Opc = AArch64::FCSELSrrr;
568   }
569   assert(RC && "Unsupported regclass");
570 
571   // Try folding simple instructions into the csel.
572   if (TryFold) {
573     unsigned NewVReg = 0;
574     unsigned FoldedOpc = canFoldIntoCSel(MRI, TrueReg, &NewVReg);
575     if (FoldedOpc) {
576       // The folded opcodes csinc, csinc and csneg apply the operation to
577       // FalseReg, so we need to invert the condition.
578       CC = AArch64CC::getInvertedCondCode(CC);
579       TrueReg = FalseReg;
580     } else
581       FoldedOpc = canFoldIntoCSel(MRI, FalseReg, &NewVReg);
582 
583     // Fold the operation. Leave any dead instructions for DCE to clean up.
584     if (FoldedOpc) {
585       FalseReg = NewVReg;
586       Opc = FoldedOpc;
587       // The extends the live range of NewVReg.
588       MRI.clearKillFlags(NewVReg);
589     }
590   }
591 
592   // Pull all virtual register into the appropriate class.
593   MRI.constrainRegClass(TrueReg, RC);
594   MRI.constrainRegClass(FalseReg, RC);
595 
596   // Insert the csel.
597   BuildMI(MBB, I, DL, get(Opc), DstReg).addReg(TrueReg).addReg(FalseReg).addImm(
598       CC);
599 }
600 
601 /// Returns true if a MOVi32imm or MOVi64imm can be expanded to an  ORRxx.
602 static bool canBeExpandedToORR(const MachineInstr &MI, unsigned BitSize) {
603   uint64_t Imm = MI.getOperand(1).getImm();
604   uint64_t UImm = Imm << (64 - BitSize) >> (64 - BitSize);
605   uint64_t Encoding;
606   return AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding);
607 }
608 
609 // FIXME: this implementation should be micro-architecture dependent, so a
610 // micro-architecture target hook should be introduced here in future.
611 bool AArch64InstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
612   if (!Subtarget.hasCustomCheapAsMoveHandling())
613     return MI.isAsCheapAsAMove();
614 
615   unsigned Imm;
616 
617   switch (MI.getOpcode()) {
618   default:
619     return false;
620 
621   // add/sub on register without shift
622   case AArch64::ADDWri:
623   case AArch64::ADDXri:
624   case AArch64::SUBWri:
625   case AArch64::SUBXri:
626     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 ||
627             MI.getOperand(3).getImm() == 0);
628 
629   // add/sub on register with shift
630   case AArch64::ADDWrs:
631   case AArch64::ADDXrs:
632   case AArch64::SUBWrs:
633   case AArch64::SUBXrs:
634     Imm = MI.getOperand(3).getImm();
635     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 &&
636             AArch64_AM::getArithShiftValue(Imm) < 4);
637 
638   // logical ops on immediate
639   case AArch64::ANDWri:
640   case AArch64::ANDXri:
641   case AArch64::EORWri:
642   case AArch64::EORXri:
643   case AArch64::ORRWri:
644   case AArch64::ORRXri:
645     return true;
646 
647   // logical ops on register without shift
648   case AArch64::ANDWrr:
649   case AArch64::ANDXrr:
650   case AArch64::BICWrr:
651   case AArch64::BICXrr:
652   case AArch64::EONWrr:
653   case AArch64::EONXrr:
654   case AArch64::EORWrr:
655   case AArch64::EORXrr:
656   case AArch64::ORNWrr:
657   case AArch64::ORNXrr:
658   case AArch64::ORRWrr:
659   case AArch64::ORRXrr:
660     return true;
661 
662   // logical ops on register with shift
663   case AArch64::ANDWrs:
664   case AArch64::ANDXrs:
665   case AArch64::BICWrs:
666   case AArch64::BICXrs:
667   case AArch64::EONWrs:
668   case AArch64::EONXrs:
669   case AArch64::EORWrs:
670   case AArch64::EORXrs:
671   case AArch64::ORNWrs:
672   case AArch64::ORNXrs:
673   case AArch64::ORRWrs:
674   case AArch64::ORRXrs:
675     Imm = MI.getOperand(3).getImm();
676     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 &&
677             AArch64_AM::getShiftValue(Imm) < 4 &&
678             AArch64_AM::getShiftType(Imm) == AArch64_AM::LSL);
679 
680   // If MOVi32imm or MOVi64imm can be expanded into ORRWri or
681   // ORRXri, it is as cheap as MOV
682   case AArch64::MOVi32imm:
683     return canBeExpandedToORR(MI, 32);
684   case AArch64::MOVi64imm:
685     return canBeExpandedToORR(MI, 64);
686 
687   // It is cheap to zero out registers if the subtarget has ZeroCycleZeroing
688   // feature.
689   case AArch64::FMOVS0:
690   case AArch64::FMOVD0:
691     return Subtarget.hasZeroCycleZeroing();
692   case TargetOpcode::COPY:
693     return (Subtarget.hasZeroCycleZeroing() &&
694             (MI.getOperand(1).getReg() == AArch64::WZR ||
695              MI.getOperand(1).getReg() == AArch64::XZR));
696   }
697 
698   llvm_unreachable("Unknown opcode to check as cheap as a move!");
699 }
700 
701 bool AArch64InstrInfo::isCoalescableExtInstr(const MachineInstr &MI,
702                                              unsigned &SrcReg, unsigned &DstReg,
703                                              unsigned &SubIdx) const {
704   switch (MI.getOpcode()) {
705   default:
706     return false;
707   case AArch64::SBFMXri: // aka sxtw
708   case AArch64::UBFMXri: // aka uxtw
709     // Check for the 32 -> 64 bit extension case, these instructions can do
710     // much more.
711     if (MI.getOperand(2).getImm() != 0 || MI.getOperand(3).getImm() != 31)
712       return false;
713     // This is a signed or unsigned 32 -> 64 bit extension.
714     SrcReg = MI.getOperand(1).getReg();
715     DstReg = MI.getOperand(0).getReg();
716     SubIdx = AArch64::sub_32;
717     return true;
718   }
719 }
720 
721 bool AArch64InstrInfo::areMemAccessesTriviallyDisjoint(
722     MachineInstr &MIa, MachineInstr &MIb, AliasAnalysis *AA) const {
723   const TargetRegisterInfo *TRI = &getRegisterInfo();
724   unsigned BaseRegA = 0, BaseRegB = 0;
725   int64_t OffsetA = 0, OffsetB = 0;
726   unsigned WidthA = 0, WidthB = 0;
727 
728   assert(MIa.mayLoadOrStore() && "MIa must be a load or store.");
729   assert(MIb.mayLoadOrStore() && "MIb must be a load or store.");
730 
731   if (MIa.hasUnmodeledSideEffects() || MIb.hasUnmodeledSideEffects() ||
732       MIa.hasOrderedMemoryRef() || MIb.hasOrderedMemoryRef())
733     return false;
734 
735   // Retrieve the base register, offset from the base register and width. Width
736   // is the size of memory that is being loaded/stored (e.g. 1, 2, 4, 8).  If
737   // base registers are identical, and the offset of a lower memory access +
738   // the width doesn't overlap the offset of a higher memory access,
739   // then the memory accesses are different.
740   if (getMemOpBaseRegImmOfsWidth(MIa, BaseRegA, OffsetA, WidthA, TRI) &&
741       getMemOpBaseRegImmOfsWidth(MIb, BaseRegB, OffsetB, WidthB, TRI)) {
742     if (BaseRegA == BaseRegB) {
743       int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
744       int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
745       int LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
746       if (LowOffset + LowWidth <= HighOffset)
747         return true;
748     }
749   }
750   return false;
751 }
752 
753 /// analyzeCompare - For a comparison instruction, return the source registers
754 /// in SrcReg and SrcReg2, and the value it compares against in CmpValue.
755 /// Return true if the comparison instruction can be analyzed.
756 bool AArch64InstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
757                                       unsigned &SrcReg2, int &CmpMask,
758                                       int &CmpValue) const {
759   switch (MI.getOpcode()) {
760   default:
761     break;
762   case AArch64::SUBSWrr:
763   case AArch64::SUBSWrs:
764   case AArch64::SUBSWrx:
765   case AArch64::SUBSXrr:
766   case AArch64::SUBSXrs:
767   case AArch64::SUBSXrx:
768   case AArch64::ADDSWrr:
769   case AArch64::ADDSWrs:
770   case AArch64::ADDSWrx:
771   case AArch64::ADDSXrr:
772   case AArch64::ADDSXrs:
773   case AArch64::ADDSXrx:
774     // Replace SUBSWrr with SUBWrr if NZCV is not used.
775     SrcReg = MI.getOperand(1).getReg();
776     SrcReg2 = MI.getOperand(2).getReg();
777     CmpMask = ~0;
778     CmpValue = 0;
779     return true;
780   case AArch64::SUBSWri:
781   case AArch64::ADDSWri:
782   case AArch64::SUBSXri:
783   case AArch64::ADDSXri:
784     SrcReg = MI.getOperand(1).getReg();
785     SrcReg2 = 0;
786     CmpMask = ~0;
787     // FIXME: In order to convert CmpValue to 0 or 1
788     CmpValue = MI.getOperand(2).getImm() != 0;
789     return true;
790   case AArch64::ANDSWri:
791   case AArch64::ANDSXri:
792     // ANDS does not use the same encoding scheme as the others xxxS
793     // instructions.
794     SrcReg = MI.getOperand(1).getReg();
795     SrcReg2 = 0;
796     CmpMask = ~0;
797     // FIXME:The return val type of decodeLogicalImmediate is uint64_t,
798     // while the type of CmpValue is int. When converting uint64_t to int,
799     // the high 32 bits of uint64_t will be lost.
800     // In fact it causes a bug in spec2006-483.xalancbmk
801     // CmpValue is only used to compare with zero in OptimizeCompareInstr
802     CmpValue = AArch64_AM::decodeLogicalImmediate(
803                    MI.getOperand(2).getImm(),
804                    MI.getOpcode() == AArch64::ANDSWri ? 32 : 64) != 0;
805     return true;
806   }
807 
808   return false;
809 }
810 
811 static bool UpdateOperandRegClass(MachineInstr &Instr) {
812   MachineBasicBlock *MBB = Instr.getParent();
813   assert(MBB && "Can't get MachineBasicBlock here");
814   MachineFunction *MF = MBB->getParent();
815   assert(MF && "Can't get MachineFunction here");
816   const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
817   const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
818   MachineRegisterInfo *MRI = &MF->getRegInfo();
819 
820   for (unsigned OpIdx = 0, EndIdx = Instr.getNumOperands(); OpIdx < EndIdx;
821        ++OpIdx) {
822     MachineOperand &MO = Instr.getOperand(OpIdx);
823     const TargetRegisterClass *OpRegCstraints =
824         Instr.getRegClassConstraint(OpIdx, TII, TRI);
825 
826     // If there's no constraint, there's nothing to do.
827     if (!OpRegCstraints)
828       continue;
829     // If the operand is a frame index, there's nothing to do here.
830     // A frame index operand will resolve correctly during PEI.
831     if (MO.isFI())
832       continue;
833 
834     assert(MO.isReg() &&
835            "Operand has register constraints without being a register!");
836 
837     unsigned Reg = MO.getReg();
838     if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
839       if (!OpRegCstraints->contains(Reg))
840         return false;
841     } else if (!OpRegCstraints->hasSubClassEq(MRI->getRegClass(Reg)) &&
842                !MRI->constrainRegClass(Reg, OpRegCstraints))
843       return false;
844   }
845 
846   return true;
847 }
848 
849 /// \brief Return the opcode that does not set flags when possible - otherwise
850 /// return the original opcode. The caller is responsible to do the actual
851 /// substitution and legality checking.
852 static unsigned convertFlagSettingOpcode(const MachineInstr &MI) {
853   // Don't convert all compare instructions, because for some the zero register
854   // encoding becomes the sp register.
855   bool MIDefinesZeroReg = false;
856   if (MI.definesRegister(AArch64::WZR) || MI.definesRegister(AArch64::XZR))
857     MIDefinesZeroReg = true;
858 
859   switch (MI.getOpcode()) {
860   default:
861     return MI.getOpcode();
862   case AArch64::ADDSWrr:
863     return AArch64::ADDWrr;
864   case AArch64::ADDSWri:
865     return MIDefinesZeroReg ? AArch64::ADDSWri : AArch64::ADDWri;
866   case AArch64::ADDSWrs:
867     return MIDefinesZeroReg ? AArch64::ADDSWrs : AArch64::ADDWrs;
868   case AArch64::ADDSWrx:
869     return AArch64::ADDWrx;
870   case AArch64::ADDSXrr:
871     return AArch64::ADDXrr;
872   case AArch64::ADDSXri:
873     return MIDefinesZeroReg ? AArch64::ADDSXri : AArch64::ADDXri;
874   case AArch64::ADDSXrs:
875     return MIDefinesZeroReg ? AArch64::ADDSXrs : AArch64::ADDXrs;
876   case AArch64::ADDSXrx:
877     return AArch64::ADDXrx;
878   case AArch64::SUBSWrr:
879     return AArch64::SUBWrr;
880   case AArch64::SUBSWri:
881     return MIDefinesZeroReg ? AArch64::SUBSWri : AArch64::SUBWri;
882   case AArch64::SUBSWrs:
883     return MIDefinesZeroReg ? AArch64::SUBSWrs : AArch64::SUBWrs;
884   case AArch64::SUBSWrx:
885     return AArch64::SUBWrx;
886   case AArch64::SUBSXrr:
887     return AArch64::SUBXrr;
888   case AArch64::SUBSXri:
889     return MIDefinesZeroReg ? AArch64::SUBSXri : AArch64::SUBXri;
890   case AArch64::SUBSXrs:
891     return MIDefinesZeroReg ? AArch64::SUBSXrs : AArch64::SUBXrs;
892   case AArch64::SUBSXrx:
893     return AArch64::SUBXrx;
894   }
895 }
896 
897 enum AccessKind {
898   AK_Write = 0x01,
899   AK_Read  = 0x10,
900   AK_All   = 0x11
901 };
902 
903 /// True when condition flags are accessed (either by writing or reading)
904 /// on the instruction trace starting at From and ending at To.
905 ///
906 /// Note: If From and To are from different blocks it's assumed CC are accessed
907 ///       on the path.
908 static bool areCFlagsAccessedBetweenInstrs(
909     MachineBasicBlock::iterator From, MachineBasicBlock::iterator To,
910     const TargetRegisterInfo *TRI, const AccessKind AccessToCheck = AK_All) {
911   // Early exit if To is at the beginning of the BB.
912   if (To == To->getParent()->begin())
913     return true;
914 
915   // Check whether the instructions are in the same basic block
916   // If not, assume the condition flags might get modified somewhere.
917   if (To->getParent() != From->getParent())
918     return true;
919 
920   // From must be above To.
921   assert(std::find_if(MachineBasicBlock::reverse_iterator(To),
922                       To->getParent()->rend(), [From](MachineInstr &MI) {
923                         return MachineBasicBlock::iterator(MI) == From;
924                       }) != To->getParent()->rend());
925 
926   // We iterate backward starting \p To until we hit \p From.
927   for (--To; To != From; --To) {
928     const MachineInstr &Instr = *To;
929 
930     if ( ((AccessToCheck & AK_Write) && Instr.modifiesRegister(AArch64::NZCV, TRI)) ||
931          ((AccessToCheck & AK_Read)  && Instr.readsRegister(AArch64::NZCV, TRI)))
932       return true;
933   }
934   return false;
935 }
936 
937 /// Try to optimize a compare instruction. A compare instruction is an
938 /// instruction which produces AArch64::NZCV. It can be truly compare instruction
939 /// when there are no uses of its destination register.
940 ///
941 /// The following steps are tried in order:
942 /// 1. Convert CmpInstr into an unconditional version.
943 /// 2. Remove CmpInstr if above there is an instruction producing a needed
944 ///    condition code or an instruction which can be converted into such an instruction.
945 ///    Only comparison with zero is supported.
946 bool AArch64InstrInfo::optimizeCompareInstr(
947     MachineInstr &CmpInstr, unsigned SrcReg, unsigned SrcReg2, int CmpMask,
948     int CmpValue, const MachineRegisterInfo *MRI) const {
949   assert(CmpInstr.getParent());
950   assert(MRI);
951 
952   // Replace SUBSWrr with SUBWrr if NZCV is not used.
953   int DeadNZCVIdx = CmpInstr.findRegisterDefOperandIdx(AArch64::NZCV, true);
954   if (DeadNZCVIdx != -1) {
955     if (CmpInstr.definesRegister(AArch64::WZR) ||
956         CmpInstr.definesRegister(AArch64::XZR)) {
957       CmpInstr.eraseFromParent();
958       return true;
959     }
960     unsigned Opc = CmpInstr.getOpcode();
961     unsigned NewOpc = convertFlagSettingOpcode(CmpInstr);
962     if (NewOpc == Opc)
963       return false;
964     const MCInstrDesc &MCID = get(NewOpc);
965     CmpInstr.setDesc(MCID);
966     CmpInstr.RemoveOperand(DeadNZCVIdx);
967     bool succeeded = UpdateOperandRegClass(CmpInstr);
968     (void)succeeded;
969     assert(succeeded && "Some operands reg class are incompatible!");
970     return true;
971   }
972 
973   // Continue only if we have a "ri" where immediate is zero.
974   // FIXME:CmpValue has already been converted to 0 or 1 in analyzeCompare
975   // function.
976   assert((CmpValue == 0 || CmpValue == 1) && "CmpValue must be 0 or 1!");
977   if (CmpValue != 0 || SrcReg2 != 0)
978     return false;
979 
980   // CmpInstr is a Compare instruction if destination register is not used.
981   if (!MRI->use_nodbg_empty(CmpInstr.getOperand(0).getReg()))
982     return false;
983 
984   return substituteCmpToZero(CmpInstr, SrcReg, MRI);
985 }
986 
987 /// Get opcode of S version of Instr.
988 /// If Instr is S version its opcode is returned.
989 /// AArch64::INSTRUCTION_LIST_END is returned if Instr does not have S version
990 /// or we are not interested in it.
991 static unsigned sForm(MachineInstr &Instr) {
992   switch (Instr.getOpcode()) {
993   default:
994     return AArch64::INSTRUCTION_LIST_END;
995 
996   case AArch64::ADDSWrr:
997   case AArch64::ADDSWri:
998   case AArch64::ADDSXrr:
999   case AArch64::ADDSXri:
1000   case AArch64::SUBSWrr:
1001   case AArch64::SUBSWri:
1002   case AArch64::SUBSXrr:
1003   case AArch64::SUBSXri:
1004     return Instr.getOpcode();;
1005 
1006   case AArch64::ADDWrr:    return AArch64::ADDSWrr;
1007   case AArch64::ADDWri:    return AArch64::ADDSWri;
1008   case AArch64::ADDXrr:    return AArch64::ADDSXrr;
1009   case AArch64::ADDXri:    return AArch64::ADDSXri;
1010   case AArch64::ADCWr:     return AArch64::ADCSWr;
1011   case AArch64::ADCXr:     return AArch64::ADCSXr;
1012   case AArch64::SUBWrr:    return AArch64::SUBSWrr;
1013   case AArch64::SUBWri:    return AArch64::SUBSWri;
1014   case AArch64::SUBXrr:    return AArch64::SUBSXrr;
1015   case AArch64::SUBXri:    return AArch64::SUBSXri;
1016   case AArch64::SBCWr:     return AArch64::SBCSWr;
1017   case AArch64::SBCXr:     return AArch64::SBCSXr;
1018   case AArch64::ANDWri:    return AArch64::ANDSWri;
1019   case AArch64::ANDXri:    return AArch64::ANDSXri;
1020   }
1021 }
1022 
1023 /// Check if AArch64::NZCV should be alive in successors of MBB.
1024 static bool areCFlagsAliveInSuccessors(MachineBasicBlock *MBB) {
1025   for (auto *BB : MBB->successors())
1026     if (BB->isLiveIn(AArch64::NZCV))
1027       return true;
1028   return false;
1029 }
1030 
1031 namespace {
1032 struct UsedNZCV {
1033   bool N;
1034   bool Z;
1035   bool C;
1036   bool V;
1037   UsedNZCV(): N(false), Z(false), C(false), V(false) {}
1038   UsedNZCV& operator |=(const UsedNZCV& UsedFlags) {
1039     this->N |= UsedFlags.N;
1040     this->Z |= UsedFlags.Z;
1041     this->C |= UsedFlags.C;
1042     this->V |= UsedFlags.V;
1043     return *this;
1044   }
1045 };
1046 } // end anonymous namespace
1047 
1048 /// Find a condition code used by the instruction.
1049 /// Returns AArch64CC::Invalid if either the instruction does not use condition
1050 /// codes or we don't optimize CmpInstr in the presence of such instructions.
1051 static AArch64CC::CondCode findCondCodeUsedByInstr(const MachineInstr &Instr) {
1052   switch (Instr.getOpcode()) {
1053     default:
1054       return AArch64CC::Invalid;
1055 
1056     case AArch64::Bcc: {
1057       int Idx = Instr.findRegisterUseOperandIdx(AArch64::NZCV);
1058       assert(Idx >= 2);
1059       return static_cast<AArch64CC::CondCode>(Instr.getOperand(Idx - 2).getImm());
1060     }
1061 
1062     case AArch64::CSINVWr:
1063     case AArch64::CSINVXr:
1064     case AArch64::CSINCWr:
1065     case AArch64::CSINCXr:
1066     case AArch64::CSELWr:
1067     case AArch64::CSELXr:
1068     case AArch64::CSNEGWr:
1069     case AArch64::CSNEGXr:
1070     case AArch64::FCSELSrrr:
1071     case AArch64::FCSELDrrr: {
1072       int Idx = Instr.findRegisterUseOperandIdx(AArch64::NZCV);
1073       assert(Idx >= 1);
1074       return static_cast<AArch64CC::CondCode>(Instr.getOperand(Idx - 1).getImm());
1075     }
1076   }
1077 }
1078 
1079 static UsedNZCV getUsedNZCV(AArch64CC::CondCode CC) {
1080   assert(CC != AArch64CC::Invalid);
1081   UsedNZCV UsedFlags;
1082   switch (CC) {
1083     default:
1084       break;
1085 
1086     case AArch64CC::EQ: // Z set
1087     case AArch64CC::NE: // Z clear
1088       UsedFlags.Z = true;
1089       break;
1090 
1091     case AArch64CC::HI: // Z clear and C set
1092     case AArch64CC::LS: // Z set   or  C clear
1093       UsedFlags.Z = true;
1094     case AArch64CC::HS: // C set
1095     case AArch64CC::LO: // C clear
1096       UsedFlags.C = true;
1097       break;
1098 
1099     case AArch64CC::MI: // N set
1100     case AArch64CC::PL: // N clear
1101       UsedFlags.N = true;
1102       break;
1103 
1104     case AArch64CC::VS: // V set
1105     case AArch64CC::VC: // V clear
1106       UsedFlags.V = true;
1107       break;
1108 
1109     case AArch64CC::GT: // Z clear, N and V the same
1110     case AArch64CC::LE: // Z set,   N and V differ
1111       UsedFlags.Z = true;
1112     case AArch64CC::GE: // N and V the same
1113     case AArch64CC::LT: // N and V differ
1114       UsedFlags.N = true;
1115       UsedFlags.V = true;
1116       break;
1117   }
1118   return UsedFlags;
1119 }
1120 
1121 static bool isADDSRegImm(unsigned Opcode) {
1122   return Opcode == AArch64::ADDSWri || Opcode == AArch64::ADDSXri;
1123 }
1124 
1125 static bool isSUBSRegImm(unsigned Opcode) {
1126   return Opcode == AArch64::SUBSWri || Opcode == AArch64::SUBSXri;
1127 }
1128 
1129 /// Check if CmpInstr can be substituted by MI.
1130 ///
1131 /// CmpInstr can be substituted:
1132 /// - CmpInstr is either 'ADDS %vreg, 0' or 'SUBS %vreg, 0'
1133 /// - and, MI and CmpInstr are from the same MachineBB
1134 /// - and, condition flags are not alive in successors of the CmpInstr parent
1135 /// - and, if MI opcode is the S form there must be no defs of flags between
1136 ///        MI and CmpInstr
1137 ///        or if MI opcode is not the S form there must be neither defs of flags
1138 ///        nor uses of flags between MI and CmpInstr.
1139 /// - and  C/V flags are not used after CmpInstr
1140 static bool canInstrSubstituteCmpInstr(MachineInstr *MI, MachineInstr *CmpInstr,
1141     const TargetRegisterInfo *TRI) {
1142   assert(MI);
1143   assert(sForm(*MI) != AArch64::INSTRUCTION_LIST_END);
1144   assert(CmpInstr);
1145 
1146   const unsigned CmpOpcode = CmpInstr->getOpcode();
1147   if (!isADDSRegImm(CmpOpcode) && !isSUBSRegImm(CmpOpcode))
1148     return false;
1149 
1150   if (MI->getParent() != CmpInstr->getParent())
1151     return false;
1152 
1153   if (areCFlagsAliveInSuccessors(CmpInstr->getParent()))
1154     return false;
1155 
1156   AccessKind AccessToCheck = AK_Write;
1157   if (sForm(*MI) != MI->getOpcode())
1158     AccessToCheck = AK_All;
1159   if (areCFlagsAccessedBetweenInstrs(MI, CmpInstr, TRI, AccessToCheck))
1160     return false;
1161 
1162   UsedNZCV NZCVUsedAfterCmp;
1163   for (auto I = std::next(CmpInstr->getIterator()), E = CmpInstr->getParent()->instr_end();
1164        I != E; ++I) {
1165     const MachineInstr &Instr = *I;
1166     if (Instr.readsRegister(AArch64::NZCV, TRI)) {
1167       AArch64CC::CondCode CC = findCondCodeUsedByInstr(Instr);
1168       if (CC == AArch64CC::Invalid) // Unsupported conditional instruction
1169         return false;
1170       NZCVUsedAfterCmp |= getUsedNZCV(CC);
1171     }
1172 
1173     if (Instr.modifiesRegister(AArch64::NZCV, TRI))
1174       break;
1175   }
1176 
1177   return !NZCVUsedAfterCmp.C && !NZCVUsedAfterCmp.V;
1178 }
1179 
1180 /// Substitute an instruction comparing to zero with another instruction
1181 /// which produces needed condition flags.
1182 ///
1183 /// Return true on success.
1184 bool AArch64InstrInfo::substituteCmpToZero(
1185     MachineInstr &CmpInstr, unsigned SrcReg,
1186     const MachineRegisterInfo *MRI) const {
1187   assert(MRI);
1188   // Get the unique definition of SrcReg.
1189   MachineInstr *MI = MRI->getUniqueVRegDef(SrcReg);
1190   if (!MI)
1191     return false;
1192 
1193   const TargetRegisterInfo *TRI = &getRegisterInfo();
1194 
1195   unsigned NewOpc = sForm(*MI);
1196   if (NewOpc == AArch64::INSTRUCTION_LIST_END)
1197     return false;
1198 
1199   if (!canInstrSubstituteCmpInstr(MI, &CmpInstr, TRI))
1200     return false;
1201 
1202   // Update the instruction to set NZCV.
1203   MI->setDesc(get(NewOpc));
1204   CmpInstr.eraseFromParent();
1205   bool succeeded = UpdateOperandRegClass(*MI);
1206   (void)succeeded;
1207   assert(succeeded && "Some operands reg class are incompatible!");
1208   MI->addRegisterDefined(AArch64::NZCV, TRI);
1209   return true;
1210 }
1211 
1212 bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
1213   if (MI.getOpcode() != TargetOpcode::LOAD_STACK_GUARD)
1214     return false;
1215 
1216   MachineBasicBlock &MBB = *MI.getParent();
1217   DebugLoc DL = MI.getDebugLoc();
1218   unsigned Reg = MI.getOperand(0).getReg();
1219   const GlobalValue *GV =
1220       cast<GlobalValue>((*MI.memoperands_begin())->getValue());
1221   const TargetMachine &TM = MBB.getParent()->getTarget();
1222   unsigned char OpFlags = Subtarget.ClassifyGlobalReference(GV, TM);
1223   const unsigned char MO_NC = AArch64II::MO_NC;
1224 
1225   if ((OpFlags & AArch64II::MO_GOT) != 0) {
1226     BuildMI(MBB, MI, DL, get(AArch64::LOADgot), Reg)
1227         .addGlobalAddress(GV, 0, AArch64II::MO_GOT);
1228     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1229         .addReg(Reg, RegState::Kill)
1230         .addImm(0)
1231         .addMemOperand(*MI.memoperands_begin());
1232   } else if (TM.getCodeModel() == CodeModel::Large) {
1233     BuildMI(MBB, MI, DL, get(AArch64::MOVZXi), Reg)
1234         .addGlobalAddress(GV, 0, AArch64II::MO_G3).addImm(48);
1235     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1236         .addReg(Reg, RegState::Kill)
1237         .addGlobalAddress(GV, 0, AArch64II::MO_G2 | MO_NC).addImm(32);
1238     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1239         .addReg(Reg, RegState::Kill)
1240         .addGlobalAddress(GV, 0, AArch64II::MO_G1 | MO_NC).addImm(16);
1241     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1242         .addReg(Reg, RegState::Kill)
1243         .addGlobalAddress(GV, 0, AArch64II::MO_G0 | MO_NC).addImm(0);
1244     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1245         .addReg(Reg, RegState::Kill)
1246         .addImm(0)
1247         .addMemOperand(*MI.memoperands_begin());
1248   } else {
1249     BuildMI(MBB, MI, DL, get(AArch64::ADRP), Reg)
1250         .addGlobalAddress(GV, 0, OpFlags | AArch64II::MO_PAGE);
1251     unsigned char LoFlags = OpFlags | AArch64II::MO_PAGEOFF | MO_NC;
1252     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1253         .addReg(Reg, RegState::Kill)
1254         .addGlobalAddress(GV, 0, LoFlags)
1255         .addMemOperand(*MI.memoperands_begin());
1256   }
1257 
1258   MBB.erase(MI);
1259 
1260   return true;
1261 }
1262 
1263 /// Return true if this is this instruction has a non-zero immediate
1264 bool AArch64InstrInfo::hasShiftedReg(const MachineInstr &MI) const {
1265   switch (MI.getOpcode()) {
1266   default:
1267     break;
1268   case AArch64::ADDSWrs:
1269   case AArch64::ADDSXrs:
1270   case AArch64::ADDWrs:
1271   case AArch64::ADDXrs:
1272   case AArch64::ANDSWrs:
1273   case AArch64::ANDSXrs:
1274   case AArch64::ANDWrs:
1275   case AArch64::ANDXrs:
1276   case AArch64::BICSWrs:
1277   case AArch64::BICSXrs:
1278   case AArch64::BICWrs:
1279   case AArch64::BICXrs:
1280   case AArch64::CRC32Brr:
1281   case AArch64::CRC32CBrr:
1282   case AArch64::CRC32CHrr:
1283   case AArch64::CRC32CWrr:
1284   case AArch64::CRC32CXrr:
1285   case AArch64::CRC32Hrr:
1286   case AArch64::CRC32Wrr:
1287   case AArch64::CRC32Xrr:
1288   case AArch64::EONWrs:
1289   case AArch64::EONXrs:
1290   case AArch64::EORWrs:
1291   case AArch64::EORXrs:
1292   case AArch64::ORNWrs:
1293   case AArch64::ORNXrs:
1294   case AArch64::ORRWrs:
1295   case AArch64::ORRXrs:
1296   case AArch64::SUBSWrs:
1297   case AArch64::SUBSXrs:
1298   case AArch64::SUBWrs:
1299   case AArch64::SUBXrs:
1300     if (MI.getOperand(3).isImm()) {
1301       unsigned val = MI.getOperand(3).getImm();
1302       return (val != 0);
1303     }
1304     break;
1305   }
1306   return false;
1307 }
1308 
1309 /// Return true if this is this instruction has a non-zero immediate
1310 bool AArch64InstrInfo::hasExtendedReg(const MachineInstr &MI) const {
1311   switch (MI.getOpcode()) {
1312   default:
1313     break;
1314   case AArch64::ADDSWrx:
1315   case AArch64::ADDSXrx:
1316   case AArch64::ADDSXrx64:
1317   case AArch64::ADDWrx:
1318   case AArch64::ADDXrx:
1319   case AArch64::ADDXrx64:
1320   case AArch64::SUBSWrx:
1321   case AArch64::SUBSXrx:
1322   case AArch64::SUBSXrx64:
1323   case AArch64::SUBWrx:
1324   case AArch64::SUBXrx:
1325   case AArch64::SUBXrx64:
1326     if (MI.getOperand(3).isImm()) {
1327       unsigned val = MI.getOperand(3).getImm();
1328       return (val != 0);
1329     }
1330     break;
1331   }
1332 
1333   return false;
1334 }
1335 
1336 // Return true if this instruction simply sets its single destination register
1337 // to zero. This is equivalent to a register rename of the zero-register.
1338 bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) const {
1339   switch (MI.getOpcode()) {
1340   default:
1341     break;
1342   case AArch64::MOVZWi:
1343   case AArch64::MOVZXi: // movz Rd, #0 (LSL #0)
1344     if (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 0) {
1345       assert(MI.getDesc().getNumOperands() == 3 &&
1346              MI.getOperand(2).getImm() == 0 && "invalid MOVZi operands");
1347       return true;
1348     }
1349     break;
1350   case AArch64::ANDWri: // and Rd, Rzr, #imm
1351     return MI.getOperand(1).getReg() == AArch64::WZR;
1352   case AArch64::ANDXri:
1353     return MI.getOperand(1).getReg() == AArch64::XZR;
1354   case TargetOpcode::COPY:
1355     return MI.getOperand(1).getReg() == AArch64::WZR;
1356   }
1357   return false;
1358 }
1359 
1360 // Return true if this instruction simply renames a general register without
1361 // modifying bits.
1362 bool AArch64InstrInfo::isGPRCopy(const MachineInstr &MI) const {
1363   switch (MI.getOpcode()) {
1364   default:
1365     break;
1366   case TargetOpcode::COPY: {
1367     // GPR32 copies will by lowered to ORRXrs
1368     unsigned DstReg = MI.getOperand(0).getReg();
1369     return (AArch64::GPR32RegClass.contains(DstReg) ||
1370             AArch64::GPR64RegClass.contains(DstReg));
1371   }
1372   case AArch64::ORRXrs: // orr Xd, Xzr, Xm (LSL #0)
1373     if (MI.getOperand(1).getReg() == AArch64::XZR) {
1374       assert(MI.getDesc().getNumOperands() == 4 &&
1375              MI.getOperand(3).getImm() == 0 && "invalid ORRrs operands");
1376       return true;
1377     }
1378     break;
1379   case AArch64::ADDXri: // add Xd, Xn, #0 (LSL #0)
1380     if (MI.getOperand(2).getImm() == 0) {
1381       assert(MI.getDesc().getNumOperands() == 4 &&
1382              MI.getOperand(3).getImm() == 0 && "invalid ADDXri operands");
1383       return true;
1384     }
1385     break;
1386   }
1387   return false;
1388 }
1389 
1390 // Return true if this instruction simply renames a general register without
1391 // modifying bits.
1392 bool AArch64InstrInfo::isFPRCopy(const MachineInstr &MI) const {
1393   switch (MI.getOpcode()) {
1394   default:
1395     break;
1396   case TargetOpcode::COPY: {
1397     // FPR64 copies will by lowered to ORR.16b
1398     unsigned DstReg = MI.getOperand(0).getReg();
1399     return (AArch64::FPR64RegClass.contains(DstReg) ||
1400             AArch64::FPR128RegClass.contains(DstReg));
1401   }
1402   case AArch64::ORRv16i8:
1403     if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
1404       assert(MI.getDesc().getNumOperands() == 3 && MI.getOperand(0).isReg() &&
1405              "invalid ORRv16i8 operands");
1406       return true;
1407     }
1408     break;
1409   }
1410   return false;
1411 }
1412 
1413 unsigned AArch64InstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
1414                                                int &FrameIndex) const {
1415   switch (MI.getOpcode()) {
1416   default:
1417     break;
1418   case AArch64::LDRWui:
1419   case AArch64::LDRXui:
1420   case AArch64::LDRBui:
1421   case AArch64::LDRHui:
1422   case AArch64::LDRSui:
1423   case AArch64::LDRDui:
1424   case AArch64::LDRQui:
1425     if (MI.getOperand(0).getSubReg() == 0 && MI.getOperand(1).isFI() &&
1426         MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) {
1427       FrameIndex = MI.getOperand(1).getIndex();
1428       return MI.getOperand(0).getReg();
1429     }
1430     break;
1431   }
1432 
1433   return 0;
1434 }
1435 
1436 unsigned AArch64InstrInfo::isStoreToStackSlot(const MachineInstr &MI,
1437                                               int &FrameIndex) const {
1438   switch (MI.getOpcode()) {
1439   default:
1440     break;
1441   case AArch64::STRWui:
1442   case AArch64::STRXui:
1443   case AArch64::STRBui:
1444   case AArch64::STRHui:
1445   case AArch64::STRSui:
1446   case AArch64::STRDui:
1447   case AArch64::STRQui:
1448     if (MI.getOperand(0).getSubReg() == 0 && MI.getOperand(1).isFI() &&
1449         MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) {
1450       FrameIndex = MI.getOperand(1).getIndex();
1451       return MI.getOperand(0).getReg();
1452     }
1453     break;
1454   }
1455   return 0;
1456 }
1457 
1458 /// Return true if this is load/store scales or extends its register offset.
1459 /// This refers to scaling a dynamic index as opposed to scaled immediates.
1460 /// MI should be a memory op that allows scaled addressing.
1461 bool AArch64InstrInfo::isScaledAddr(const MachineInstr &MI) const {
1462   switch (MI.getOpcode()) {
1463   default:
1464     break;
1465   case AArch64::LDRBBroW:
1466   case AArch64::LDRBroW:
1467   case AArch64::LDRDroW:
1468   case AArch64::LDRHHroW:
1469   case AArch64::LDRHroW:
1470   case AArch64::LDRQroW:
1471   case AArch64::LDRSBWroW:
1472   case AArch64::LDRSBXroW:
1473   case AArch64::LDRSHWroW:
1474   case AArch64::LDRSHXroW:
1475   case AArch64::LDRSWroW:
1476   case AArch64::LDRSroW:
1477   case AArch64::LDRWroW:
1478   case AArch64::LDRXroW:
1479   case AArch64::STRBBroW:
1480   case AArch64::STRBroW:
1481   case AArch64::STRDroW:
1482   case AArch64::STRHHroW:
1483   case AArch64::STRHroW:
1484   case AArch64::STRQroW:
1485   case AArch64::STRSroW:
1486   case AArch64::STRWroW:
1487   case AArch64::STRXroW:
1488   case AArch64::LDRBBroX:
1489   case AArch64::LDRBroX:
1490   case AArch64::LDRDroX:
1491   case AArch64::LDRHHroX:
1492   case AArch64::LDRHroX:
1493   case AArch64::LDRQroX:
1494   case AArch64::LDRSBWroX:
1495   case AArch64::LDRSBXroX:
1496   case AArch64::LDRSHWroX:
1497   case AArch64::LDRSHXroX:
1498   case AArch64::LDRSWroX:
1499   case AArch64::LDRSroX:
1500   case AArch64::LDRWroX:
1501   case AArch64::LDRXroX:
1502   case AArch64::STRBBroX:
1503   case AArch64::STRBroX:
1504   case AArch64::STRDroX:
1505   case AArch64::STRHHroX:
1506   case AArch64::STRHroX:
1507   case AArch64::STRQroX:
1508   case AArch64::STRSroX:
1509   case AArch64::STRWroX:
1510   case AArch64::STRXroX:
1511 
1512     unsigned Val = MI.getOperand(3).getImm();
1513     AArch64_AM::ShiftExtendType ExtType = AArch64_AM::getMemExtendType(Val);
1514     return (ExtType != AArch64_AM::UXTX) || AArch64_AM::getMemDoShift(Val);
1515   }
1516   return false;
1517 }
1518 
1519 /// Check all MachineMemOperands for a hint to suppress pairing.
1520 bool AArch64InstrInfo::isLdStPairSuppressed(const MachineInstr &MI) const {
1521   return any_of(MI.memoperands(), [](MachineMemOperand *MMO) {
1522     return MMO->getFlags() & MOSuppressPair;
1523   });
1524 }
1525 
1526 /// Set a flag on the first MachineMemOperand to suppress pairing.
1527 void AArch64InstrInfo::suppressLdStPair(MachineInstr &MI) const {
1528   if (MI.memoperands_empty())
1529     return;
1530   (*MI.memoperands_begin())->setFlags(MOSuppressPair);
1531 }
1532 
1533 bool AArch64InstrInfo::isUnscaledLdSt(unsigned Opc) const {
1534   switch (Opc) {
1535   default:
1536     return false;
1537   case AArch64::STURSi:
1538   case AArch64::STURDi:
1539   case AArch64::STURQi:
1540   case AArch64::STURBBi:
1541   case AArch64::STURHHi:
1542   case AArch64::STURWi:
1543   case AArch64::STURXi:
1544   case AArch64::LDURSi:
1545   case AArch64::LDURDi:
1546   case AArch64::LDURQi:
1547   case AArch64::LDURWi:
1548   case AArch64::LDURXi:
1549   case AArch64::LDURSWi:
1550   case AArch64::LDURHHi:
1551   case AArch64::LDURBBi:
1552   case AArch64::LDURSBWi:
1553   case AArch64::LDURSHWi:
1554     return true;
1555   }
1556 }
1557 
1558 bool AArch64InstrInfo::isUnscaledLdSt(MachineInstr &MI) const {
1559   return isUnscaledLdSt(MI.getOpcode());
1560 }
1561 
1562 // Is this a candidate for ld/st merging or pairing?  For example, we don't
1563 // touch volatiles or load/stores that have a hint to avoid pair formation.
1564 bool AArch64InstrInfo::isCandidateToMergeOrPair(MachineInstr &MI) const {
1565   // If this is a volatile load/store, don't mess with it.
1566   if (MI.hasOrderedMemoryRef())
1567     return false;
1568 
1569   // Make sure this is a reg+imm (as opposed to an address reloc).
1570   assert(MI.getOperand(1).isReg() && "Expected a reg operand.");
1571   if (!MI.getOperand(2).isImm())
1572     return false;
1573 
1574   // Can't merge/pair if the instruction modifies the base register.
1575   // e.g., ldr x0, [x0]
1576   unsigned BaseReg = MI.getOperand(1).getReg();
1577   const TargetRegisterInfo *TRI = &getRegisterInfo();
1578   if (MI.modifiesRegister(BaseReg, TRI))
1579     return false;
1580 
1581   // Check if this load/store has a hint to avoid pair formation.
1582   // MachineMemOperands hints are set by the AArch64StorePairSuppress pass.
1583   if (isLdStPairSuppressed(MI))
1584     return false;
1585 
1586   // On some CPUs quad load/store pairs are slower than two single load/stores.
1587   if (Subtarget.avoidQuadLdStPairs()) {
1588     switch (MI.getOpcode()) {
1589     default:
1590       break;
1591 
1592     case AArch64::LDURQi:
1593     case AArch64::STURQi:
1594     case AArch64::LDRQui:
1595     case AArch64::STRQui:
1596       return false;
1597     }
1598   }
1599 
1600   return true;
1601 }
1602 
1603 bool AArch64InstrInfo::getMemOpBaseRegImmOfs(
1604     MachineInstr &LdSt, unsigned &BaseReg, int64_t &Offset,
1605     const TargetRegisterInfo *TRI) const {
1606   unsigned Width;
1607   return getMemOpBaseRegImmOfsWidth(LdSt, BaseReg, Offset, Width, TRI);
1608 }
1609 
1610 bool AArch64InstrInfo::getMemOpBaseRegImmOfsWidth(
1611     MachineInstr &LdSt, unsigned &BaseReg, int64_t &Offset, unsigned &Width,
1612     const TargetRegisterInfo *TRI) const {
1613   assert(LdSt.mayLoadOrStore() && "Expected a memory operation.");
1614   // Handle only loads/stores with base register followed by immediate offset.
1615   if (LdSt.getNumExplicitOperands() == 3) {
1616     // Non-paired instruction (e.g., ldr x1, [x0, #8]).
1617     if (!LdSt.getOperand(1).isReg() || !LdSt.getOperand(2).isImm())
1618       return false;
1619   } else if (LdSt.getNumExplicitOperands() == 4) {
1620     // Paired instruction (e.g., ldp x1, x2, [x0, #8]).
1621     if (!LdSt.getOperand(1).isReg() || !LdSt.getOperand(2).isReg() ||
1622         !LdSt.getOperand(3).isImm())
1623       return false;
1624   } else
1625     return false;
1626 
1627   // Offset is calculated as the immediate operand multiplied by the scaling factor.
1628   // Unscaled instructions have scaling factor set to 1.
1629   unsigned Scale = 0;
1630   switch (LdSt.getOpcode()) {
1631   default:
1632     return false;
1633   case AArch64::LDURQi:
1634   case AArch64::STURQi:
1635     Width = 16;
1636     Scale = 1;
1637     break;
1638   case AArch64::LDURXi:
1639   case AArch64::LDURDi:
1640   case AArch64::STURXi:
1641   case AArch64::STURDi:
1642     Width = 8;
1643     Scale = 1;
1644     break;
1645   case AArch64::LDURWi:
1646   case AArch64::LDURSi:
1647   case AArch64::LDURSWi:
1648   case AArch64::STURWi:
1649   case AArch64::STURSi:
1650     Width = 4;
1651     Scale = 1;
1652     break;
1653   case AArch64::LDURHi:
1654   case AArch64::LDURHHi:
1655   case AArch64::LDURSHXi:
1656   case AArch64::LDURSHWi:
1657   case AArch64::STURHi:
1658   case AArch64::STURHHi:
1659     Width = 2;
1660     Scale = 1;
1661     break;
1662   case AArch64::LDURBi:
1663   case AArch64::LDURBBi:
1664   case AArch64::LDURSBXi:
1665   case AArch64::LDURSBWi:
1666   case AArch64::STURBi:
1667   case AArch64::STURBBi:
1668     Width = 1;
1669     Scale = 1;
1670     break;
1671   case AArch64::LDPQi:
1672   case AArch64::LDNPQi:
1673   case AArch64::STPQi:
1674   case AArch64::STNPQi:
1675     Scale = 16;
1676     Width = 32;
1677     break;
1678   case AArch64::LDRQui:
1679   case AArch64::STRQui:
1680     Scale = Width = 16;
1681     break;
1682   case AArch64::LDPXi:
1683   case AArch64::LDPDi:
1684   case AArch64::LDNPXi:
1685   case AArch64::LDNPDi:
1686   case AArch64::STPXi:
1687   case AArch64::STPDi:
1688   case AArch64::STNPXi:
1689   case AArch64::STNPDi:
1690     Scale = 8;
1691     Width = 16;
1692     break;
1693   case AArch64::LDRXui:
1694   case AArch64::LDRDui:
1695   case AArch64::STRXui:
1696   case AArch64::STRDui:
1697     Scale = Width = 8;
1698     break;
1699   case AArch64::LDPWi:
1700   case AArch64::LDPSi:
1701   case AArch64::LDNPWi:
1702   case AArch64::LDNPSi:
1703   case AArch64::STPWi:
1704   case AArch64::STPSi:
1705   case AArch64::STNPWi:
1706   case AArch64::STNPSi:
1707     Scale = 4;
1708     Width = 8;
1709     break;
1710   case AArch64::LDRWui:
1711   case AArch64::LDRSui:
1712   case AArch64::LDRSWui:
1713   case AArch64::STRWui:
1714   case AArch64::STRSui:
1715     Scale = Width = 4;
1716     break;
1717   case AArch64::LDRHui:
1718   case AArch64::LDRHHui:
1719   case AArch64::STRHui:
1720   case AArch64::STRHHui:
1721     Scale = Width = 2;
1722     break;
1723   case AArch64::LDRBui:
1724   case AArch64::LDRBBui:
1725   case AArch64::STRBui:
1726   case AArch64::STRBBui:
1727     Scale = Width = 1;
1728     break;
1729   }
1730 
1731   if (LdSt.getNumExplicitOperands() == 3) {
1732     BaseReg = LdSt.getOperand(1).getReg();
1733     Offset = LdSt.getOperand(2).getImm() * Scale;
1734   } else {
1735     assert(LdSt.getNumExplicitOperands() == 4 && "invalid number of operands");
1736     BaseReg = LdSt.getOperand(2).getReg();
1737     Offset = LdSt.getOperand(3).getImm() * Scale;
1738   }
1739   return true;
1740 }
1741 
1742 // Scale the unscaled offsets.  Returns false if the unscaled offset can't be
1743 // scaled.
1744 static bool scaleOffset(unsigned Opc, int64_t &Offset) {
1745   unsigned OffsetStride = 1;
1746   switch (Opc) {
1747   default:
1748     return false;
1749   case AArch64::LDURQi:
1750   case AArch64::STURQi:
1751     OffsetStride = 16;
1752     break;
1753   case AArch64::LDURXi:
1754   case AArch64::LDURDi:
1755   case AArch64::STURXi:
1756   case AArch64::STURDi:
1757     OffsetStride = 8;
1758     break;
1759   case AArch64::LDURWi:
1760   case AArch64::LDURSi:
1761   case AArch64::LDURSWi:
1762   case AArch64::STURWi:
1763   case AArch64::STURSi:
1764     OffsetStride = 4;
1765     break;
1766   }
1767   // If the byte-offset isn't a multiple of the stride, we can't scale this
1768   // offset.
1769   if (Offset % OffsetStride != 0)
1770     return false;
1771 
1772   // Convert the byte-offset used by unscaled into an "element" offset used
1773   // by the scaled pair load/store instructions.
1774   Offset /= OffsetStride;
1775   return true;
1776 }
1777 
1778 static bool canPairLdStOpc(unsigned FirstOpc, unsigned SecondOpc) {
1779   if (FirstOpc == SecondOpc)
1780     return true;
1781   // We can also pair sign-ext and zero-ext instructions.
1782   switch (FirstOpc) {
1783   default:
1784     return false;
1785   case AArch64::LDRWui:
1786   case AArch64::LDURWi:
1787     return SecondOpc == AArch64::LDRSWui || SecondOpc == AArch64::LDURSWi;
1788   case AArch64::LDRSWui:
1789   case AArch64::LDURSWi:
1790     return SecondOpc == AArch64::LDRWui || SecondOpc == AArch64::LDURWi;
1791   }
1792   // These instructions can't be paired based on their opcodes.
1793   return false;
1794 }
1795 
1796 /// Detect opportunities for ldp/stp formation.
1797 ///
1798 /// Only called for LdSt for which getMemOpBaseRegImmOfs returns true.
1799 bool AArch64InstrInfo::shouldClusterMemOps(MachineInstr &FirstLdSt,
1800                                            MachineInstr &SecondLdSt,
1801                                            unsigned NumLoads) const {
1802   // Only cluster up to a single pair.
1803   if (NumLoads > 1)
1804     return false;
1805 
1806   if (!isPairableLdStInst(FirstLdSt) || !isPairableLdStInst(SecondLdSt))
1807     return false;
1808 
1809   // Can we pair these instructions based on their opcodes?
1810   unsigned FirstOpc = FirstLdSt.getOpcode();
1811   unsigned SecondOpc = SecondLdSt.getOpcode();
1812   if (!canPairLdStOpc(FirstOpc, SecondOpc))
1813     return false;
1814 
1815   // Can't merge volatiles or load/stores that have a hint to avoid pair
1816   // formation, for example.
1817   if (!isCandidateToMergeOrPair(FirstLdSt) ||
1818       !isCandidateToMergeOrPair(SecondLdSt))
1819     return false;
1820 
1821   // isCandidateToMergeOrPair guarantees that operand 2 is an immediate.
1822   int64_t Offset1 = FirstLdSt.getOperand(2).getImm();
1823   if (isUnscaledLdSt(FirstOpc) && !scaleOffset(FirstOpc, Offset1))
1824     return false;
1825 
1826   int64_t Offset2 = SecondLdSt.getOperand(2).getImm();
1827   if (isUnscaledLdSt(SecondOpc) && !scaleOffset(SecondOpc, Offset2))
1828     return false;
1829 
1830   // Pairwise instructions have a 7-bit signed offset field.
1831   if (Offset1 > 63 || Offset1 < -64)
1832     return false;
1833 
1834   // The caller should already have ordered First/SecondLdSt by offset.
1835   assert(Offset1 <= Offset2 && "Caller should have ordered offsets.");
1836   return Offset1 + 1 == Offset2;
1837 }
1838 
1839 bool AArch64InstrInfo::shouldScheduleAdjacent(MachineInstr &First,
1840                                               MachineInstr &Second) const {
1841   if (Subtarget.hasMacroOpFusion()) {
1842     // Fuse CMN, CMP, TST followed by Bcc.
1843     unsigned SecondOpcode = Second.getOpcode();
1844     if (SecondOpcode == AArch64::Bcc) {
1845       switch (First.getOpcode()) {
1846       default:
1847         return false;
1848       case AArch64::SUBSWri:
1849       case AArch64::ADDSWri:
1850       case AArch64::ANDSWri:
1851       case AArch64::SUBSXri:
1852       case AArch64::ADDSXri:
1853       case AArch64::ANDSXri:
1854         return true;
1855       }
1856     }
1857     // Fuse ALU operations followed by CBZ/CBNZ.
1858     if (SecondOpcode == AArch64::CBNZW || SecondOpcode == AArch64::CBNZX ||
1859         SecondOpcode == AArch64::CBZW || SecondOpcode == AArch64::CBZX) {
1860       switch (First.getOpcode()) {
1861       default:
1862         return false;
1863       case AArch64::ADDWri:
1864       case AArch64::ADDXri:
1865       case AArch64::ANDWri:
1866       case AArch64::ANDXri:
1867       case AArch64::EORWri:
1868       case AArch64::EORXri:
1869       case AArch64::ORRWri:
1870       case AArch64::ORRXri:
1871       case AArch64::SUBWri:
1872       case AArch64::SUBXri:
1873         return true;
1874       }
1875     }
1876   }
1877   return false;
1878 }
1879 
1880 MachineInstr *AArch64InstrInfo::emitFrameIndexDebugValue(
1881     MachineFunction &MF, int FrameIx, uint64_t Offset, const MDNode *Var,
1882     const MDNode *Expr, const DebugLoc &DL) const {
1883   MachineInstrBuilder MIB = BuildMI(MF, DL, get(AArch64::DBG_VALUE))
1884                                 .addFrameIndex(FrameIx)
1885                                 .addImm(0)
1886                                 .addImm(Offset)
1887                                 .addMetadata(Var)
1888                                 .addMetadata(Expr);
1889   return &*MIB;
1890 }
1891 
1892 static const MachineInstrBuilder &AddSubReg(const MachineInstrBuilder &MIB,
1893                                             unsigned Reg, unsigned SubIdx,
1894                                             unsigned State,
1895                                             const TargetRegisterInfo *TRI) {
1896   if (!SubIdx)
1897     return MIB.addReg(Reg, State);
1898 
1899   if (TargetRegisterInfo::isPhysicalRegister(Reg))
1900     return MIB.addReg(TRI->getSubReg(Reg, SubIdx), State);
1901   return MIB.addReg(Reg, State, SubIdx);
1902 }
1903 
1904 static bool forwardCopyWillClobberTuple(unsigned DestReg, unsigned SrcReg,
1905                                         unsigned NumRegs) {
1906   // We really want the positive remainder mod 32 here, that happens to be
1907   // easily obtainable with a mask.
1908   return ((DestReg - SrcReg) & 0x1f) < NumRegs;
1909 }
1910 
1911 void AArch64InstrInfo::copyPhysRegTuple(
1912     MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL,
1913     unsigned DestReg, unsigned SrcReg, bool KillSrc, unsigned Opcode,
1914     llvm::ArrayRef<unsigned> Indices) const {
1915   assert(Subtarget.hasNEON() &&
1916          "Unexpected register copy without NEON");
1917   const TargetRegisterInfo *TRI = &getRegisterInfo();
1918   uint16_t DestEncoding = TRI->getEncodingValue(DestReg);
1919   uint16_t SrcEncoding = TRI->getEncodingValue(SrcReg);
1920   unsigned NumRegs = Indices.size();
1921 
1922   int SubReg = 0, End = NumRegs, Incr = 1;
1923   if (forwardCopyWillClobberTuple(DestEncoding, SrcEncoding, NumRegs)) {
1924     SubReg = NumRegs - 1;
1925     End = -1;
1926     Incr = -1;
1927   }
1928 
1929   for (; SubReg != End; SubReg += Incr) {
1930     const MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(Opcode));
1931     AddSubReg(MIB, DestReg, Indices[SubReg], RegState::Define, TRI);
1932     AddSubReg(MIB, SrcReg, Indices[SubReg], 0, TRI);
1933     AddSubReg(MIB, SrcReg, Indices[SubReg], getKillRegState(KillSrc), TRI);
1934   }
1935 }
1936 
1937 void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
1938                                    MachineBasicBlock::iterator I,
1939                                    const DebugLoc &DL, unsigned DestReg,
1940                                    unsigned SrcReg, bool KillSrc) const {
1941   if (AArch64::GPR32spRegClass.contains(DestReg) &&
1942       (AArch64::GPR32spRegClass.contains(SrcReg) || SrcReg == AArch64::WZR)) {
1943     const TargetRegisterInfo *TRI = &getRegisterInfo();
1944 
1945     if (DestReg == AArch64::WSP || SrcReg == AArch64::WSP) {
1946       // If either operand is WSP, expand to ADD #0.
1947       if (Subtarget.hasZeroCycleRegMove()) {
1948         // Cyclone recognizes "ADD Xd, Xn, #0" as a zero-cycle register move.
1949         unsigned DestRegX = TRI->getMatchingSuperReg(DestReg, AArch64::sub_32,
1950                                                      &AArch64::GPR64spRegClass);
1951         unsigned SrcRegX = TRI->getMatchingSuperReg(SrcReg, AArch64::sub_32,
1952                                                     &AArch64::GPR64spRegClass);
1953         // This instruction is reading and writing X registers.  This may upset
1954         // the register scavenger and machine verifier, so we need to indicate
1955         // that we are reading an undefined value from SrcRegX, but a proper
1956         // value from SrcReg.
1957         BuildMI(MBB, I, DL, get(AArch64::ADDXri), DestRegX)
1958             .addReg(SrcRegX, RegState::Undef)
1959             .addImm(0)
1960             .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0))
1961             .addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
1962       } else {
1963         BuildMI(MBB, I, DL, get(AArch64::ADDWri), DestReg)
1964             .addReg(SrcReg, getKillRegState(KillSrc))
1965             .addImm(0)
1966             .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
1967       }
1968     } else if (SrcReg == AArch64::WZR && Subtarget.hasZeroCycleZeroing()) {
1969       BuildMI(MBB, I, DL, get(AArch64::MOVZWi), DestReg).addImm(0).addImm(
1970           AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
1971     } else {
1972       if (Subtarget.hasZeroCycleRegMove()) {
1973         // Cyclone recognizes "ORR Xd, XZR, Xm" as a zero-cycle register move.
1974         unsigned DestRegX = TRI->getMatchingSuperReg(DestReg, AArch64::sub_32,
1975                                                      &AArch64::GPR64spRegClass);
1976         unsigned SrcRegX = TRI->getMatchingSuperReg(SrcReg, AArch64::sub_32,
1977                                                     &AArch64::GPR64spRegClass);
1978         // This instruction is reading and writing X registers.  This may upset
1979         // the register scavenger and machine verifier, so we need to indicate
1980         // that we are reading an undefined value from SrcRegX, but a proper
1981         // value from SrcReg.
1982         BuildMI(MBB, I, DL, get(AArch64::ORRXrr), DestRegX)
1983             .addReg(AArch64::XZR)
1984             .addReg(SrcRegX, RegState::Undef)
1985             .addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
1986       } else {
1987         // Otherwise, expand to ORR WZR.
1988         BuildMI(MBB, I, DL, get(AArch64::ORRWrr), DestReg)
1989             .addReg(AArch64::WZR)
1990             .addReg(SrcReg, getKillRegState(KillSrc));
1991       }
1992     }
1993     return;
1994   }
1995 
1996   if (AArch64::GPR64spRegClass.contains(DestReg) &&
1997       (AArch64::GPR64spRegClass.contains(SrcReg) || SrcReg == AArch64::XZR)) {
1998     if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
1999       // If either operand is SP, expand to ADD #0.
2000       BuildMI(MBB, I, DL, get(AArch64::ADDXri), DestReg)
2001           .addReg(SrcReg, getKillRegState(KillSrc))
2002           .addImm(0)
2003           .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2004     } else if (SrcReg == AArch64::XZR && Subtarget.hasZeroCycleZeroing()) {
2005       BuildMI(MBB, I, DL, get(AArch64::MOVZXi), DestReg).addImm(0).addImm(
2006           AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2007     } else {
2008       // Otherwise, expand to ORR XZR.
2009       BuildMI(MBB, I, DL, get(AArch64::ORRXrr), DestReg)
2010           .addReg(AArch64::XZR)
2011           .addReg(SrcReg, getKillRegState(KillSrc));
2012     }
2013     return;
2014   }
2015 
2016   // Copy a DDDD register quad by copying the individual sub-registers.
2017   if (AArch64::DDDDRegClass.contains(DestReg) &&
2018       AArch64::DDDDRegClass.contains(SrcReg)) {
2019     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1,
2020                                         AArch64::dsub2, AArch64::dsub3 };
2021     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2022                      Indices);
2023     return;
2024   }
2025 
2026   // Copy a DDD register triple by copying the individual sub-registers.
2027   if (AArch64::DDDRegClass.contains(DestReg) &&
2028       AArch64::DDDRegClass.contains(SrcReg)) {
2029     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1,
2030                                         AArch64::dsub2 };
2031     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2032                      Indices);
2033     return;
2034   }
2035 
2036   // Copy a DD register pair by copying the individual sub-registers.
2037   if (AArch64::DDRegClass.contains(DestReg) &&
2038       AArch64::DDRegClass.contains(SrcReg)) {
2039     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1 };
2040     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2041                      Indices);
2042     return;
2043   }
2044 
2045   // Copy a QQQQ register quad by copying the individual sub-registers.
2046   if (AArch64::QQQQRegClass.contains(DestReg) &&
2047       AArch64::QQQQRegClass.contains(SrcReg)) {
2048     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1,
2049                                         AArch64::qsub2, AArch64::qsub3 };
2050     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2051                      Indices);
2052     return;
2053   }
2054 
2055   // Copy a QQQ register triple by copying the individual sub-registers.
2056   if (AArch64::QQQRegClass.contains(DestReg) &&
2057       AArch64::QQQRegClass.contains(SrcReg)) {
2058     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1,
2059                                         AArch64::qsub2 };
2060     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2061                      Indices);
2062     return;
2063   }
2064 
2065   // Copy a QQ register pair by copying the individual sub-registers.
2066   if (AArch64::QQRegClass.contains(DestReg) &&
2067       AArch64::QQRegClass.contains(SrcReg)) {
2068     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1 };
2069     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2070                      Indices);
2071     return;
2072   }
2073 
2074   if (AArch64::FPR128RegClass.contains(DestReg) &&
2075       AArch64::FPR128RegClass.contains(SrcReg)) {
2076     if(Subtarget.hasNEON()) {
2077       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2078           .addReg(SrcReg)
2079           .addReg(SrcReg, getKillRegState(KillSrc));
2080     } else {
2081       BuildMI(MBB, I, DL, get(AArch64::STRQpre))
2082         .addReg(AArch64::SP, RegState::Define)
2083         .addReg(SrcReg, getKillRegState(KillSrc))
2084         .addReg(AArch64::SP)
2085         .addImm(-16);
2086       BuildMI(MBB, I, DL, get(AArch64::LDRQpre))
2087         .addReg(AArch64::SP, RegState::Define)
2088         .addReg(DestReg, RegState::Define)
2089         .addReg(AArch64::SP)
2090         .addImm(16);
2091     }
2092     return;
2093   }
2094 
2095   if (AArch64::FPR64RegClass.contains(DestReg) &&
2096       AArch64::FPR64RegClass.contains(SrcReg)) {
2097     if(Subtarget.hasNEON()) {
2098       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::dsub,
2099                                        &AArch64::FPR128RegClass);
2100       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::dsub,
2101                                       &AArch64::FPR128RegClass);
2102       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2103           .addReg(SrcReg)
2104           .addReg(SrcReg, getKillRegState(KillSrc));
2105     } else {
2106       BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestReg)
2107           .addReg(SrcReg, getKillRegState(KillSrc));
2108     }
2109     return;
2110   }
2111 
2112   if (AArch64::FPR32RegClass.contains(DestReg) &&
2113       AArch64::FPR32RegClass.contains(SrcReg)) {
2114     if(Subtarget.hasNEON()) {
2115       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
2116                                        &AArch64::FPR128RegClass);
2117       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
2118                                       &AArch64::FPR128RegClass);
2119       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2120           .addReg(SrcReg)
2121           .addReg(SrcReg, getKillRegState(KillSrc));
2122     } else {
2123       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2124           .addReg(SrcReg, getKillRegState(KillSrc));
2125     }
2126     return;
2127   }
2128 
2129   if (AArch64::FPR16RegClass.contains(DestReg) &&
2130       AArch64::FPR16RegClass.contains(SrcReg)) {
2131     if(Subtarget.hasNEON()) {
2132       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
2133                                        &AArch64::FPR128RegClass);
2134       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
2135                                       &AArch64::FPR128RegClass);
2136       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2137           .addReg(SrcReg)
2138           .addReg(SrcReg, getKillRegState(KillSrc));
2139     } else {
2140       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
2141                                        &AArch64::FPR32RegClass);
2142       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
2143                                       &AArch64::FPR32RegClass);
2144       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2145           .addReg(SrcReg, getKillRegState(KillSrc));
2146     }
2147     return;
2148   }
2149 
2150   if (AArch64::FPR8RegClass.contains(DestReg) &&
2151       AArch64::FPR8RegClass.contains(SrcReg)) {
2152     if(Subtarget.hasNEON()) {
2153       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
2154                                        &AArch64::FPR128RegClass);
2155       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
2156                                       &AArch64::FPR128RegClass);
2157       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2158           .addReg(SrcReg)
2159           .addReg(SrcReg, getKillRegState(KillSrc));
2160     } else {
2161       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
2162                                        &AArch64::FPR32RegClass);
2163       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
2164                                       &AArch64::FPR32RegClass);
2165       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2166           .addReg(SrcReg, getKillRegState(KillSrc));
2167     }
2168     return;
2169   }
2170 
2171   // Copies between GPR64 and FPR64.
2172   if (AArch64::FPR64RegClass.contains(DestReg) &&
2173       AArch64::GPR64RegClass.contains(SrcReg)) {
2174     BuildMI(MBB, I, DL, get(AArch64::FMOVXDr), DestReg)
2175         .addReg(SrcReg, getKillRegState(KillSrc));
2176     return;
2177   }
2178   if (AArch64::GPR64RegClass.contains(DestReg) &&
2179       AArch64::FPR64RegClass.contains(SrcReg)) {
2180     BuildMI(MBB, I, DL, get(AArch64::FMOVDXr), DestReg)
2181         .addReg(SrcReg, getKillRegState(KillSrc));
2182     return;
2183   }
2184   // Copies between GPR32 and FPR32.
2185   if (AArch64::FPR32RegClass.contains(DestReg) &&
2186       AArch64::GPR32RegClass.contains(SrcReg)) {
2187     BuildMI(MBB, I, DL, get(AArch64::FMOVWSr), DestReg)
2188         .addReg(SrcReg, getKillRegState(KillSrc));
2189     return;
2190   }
2191   if (AArch64::GPR32RegClass.contains(DestReg) &&
2192       AArch64::FPR32RegClass.contains(SrcReg)) {
2193     BuildMI(MBB, I, DL, get(AArch64::FMOVSWr), DestReg)
2194         .addReg(SrcReg, getKillRegState(KillSrc));
2195     return;
2196   }
2197 
2198   if (DestReg == AArch64::NZCV) {
2199     assert(AArch64::GPR64RegClass.contains(SrcReg) && "Invalid NZCV copy");
2200     BuildMI(MBB, I, DL, get(AArch64::MSR))
2201       .addImm(AArch64SysReg::NZCV)
2202       .addReg(SrcReg, getKillRegState(KillSrc))
2203       .addReg(AArch64::NZCV, RegState::Implicit | RegState::Define);
2204     return;
2205   }
2206 
2207   if (SrcReg == AArch64::NZCV) {
2208     assert(AArch64::GPR64RegClass.contains(DestReg) && "Invalid NZCV copy");
2209     BuildMI(MBB, I, DL, get(AArch64::MRS), DestReg)
2210       .addImm(AArch64SysReg::NZCV)
2211       .addReg(AArch64::NZCV, RegState::Implicit | getKillRegState(KillSrc));
2212     return;
2213   }
2214 
2215   llvm_unreachable("unimplemented reg-to-reg copy");
2216 }
2217 
2218 void AArch64InstrInfo::storeRegToStackSlot(
2219     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg,
2220     bool isKill, int FI, const TargetRegisterClass *RC,
2221     const TargetRegisterInfo *TRI) const {
2222   DebugLoc DL;
2223   if (MBBI != MBB.end())
2224     DL = MBBI->getDebugLoc();
2225   MachineFunction &MF = *MBB.getParent();
2226   MachineFrameInfo &MFI = MF.getFrameInfo();
2227   unsigned Align = MFI.getObjectAlignment(FI);
2228 
2229   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI);
2230   MachineMemOperand *MMO = MF.getMachineMemOperand(
2231       PtrInfo, MachineMemOperand::MOStore, MFI.getObjectSize(FI), Align);
2232   unsigned Opc = 0;
2233   bool Offset = true;
2234   switch (RC->getSize()) {
2235   case 1:
2236     if (AArch64::FPR8RegClass.hasSubClassEq(RC))
2237       Opc = AArch64::STRBui;
2238     break;
2239   case 2:
2240     if (AArch64::FPR16RegClass.hasSubClassEq(RC))
2241       Opc = AArch64::STRHui;
2242     break;
2243   case 4:
2244     if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
2245       Opc = AArch64::STRWui;
2246       if (TargetRegisterInfo::isVirtualRegister(SrcReg))
2247         MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR32RegClass);
2248       else
2249         assert(SrcReg != AArch64::WSP);
2250     } else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
2251       Opc = AArch64::STRSui;
2252     break;
2253   case 8:
2254     if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
2255       Opc = AArch64::STRXui;
2256       if (TargetRegisterInfo::isVirtualRegister(SrcReg))
2257         MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR64RegClass);
2258       else
2259         assert(SrcReg != AArch64::SP);
2260     } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
2261       Opc = AArch64::STRDui;
2262     break;
2263   case 16:
2264     if (AArch64::FPR128RegClass.hasSubClassEq(RC))
2265       Opc = AArch64::STRQui;
2266     else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
2267       assert(Subtarget.hasNEON() &&
2268              "Unexpected register store without NEON");
2269       Opc = AArch64::ST1Twov1d;
2270       Offset = false;
2271     }
2272     break;
2273   case 24:
2274     if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
2275       assert(Subtarget.hasNEON() &&
2276              "Unexpected register store without NEON");
2277       Opc = AArch64::ST1Threev1d;
2278       Offset = false;
2279     }
2280     break;
2281   case 32:
2282     if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
2283       assert(Subtarget.hasNEON() &&
2284              "Unexpected register store without NEON");
2285       Opc = AArch64::ST1Fourv1d;
2286       Offset = false;
2287     } else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
2288       assert(Subtarget.hasNEON() &&
2289              "Unexpected register store without NEON");
2290       Opc = AArch64::ST1Twov2d;
2291       Offset = false;
2292     }
2293     break;
2294   case 48:
2295     if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
2296       assert(Subtarget.hasNEON() &&
2297              "Unexpected register store without NEON");
2298       Opc = AArch64::ST1Threev2d;
2299       Offset = false;
2300     }
2301     break;
2302   case 64:
2303     if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
2304       assert(Subtarget.hasNEON() &&
2305              "Unexpected register store without NEON");
2306       Opc = AArch64::ST1Fourv2d;
2307       Offset = false;
2308     }
2309     break;
2310   }
2311   assert(Opc && "Unknown register class");
2312 
2313   const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DL, get(Opc))
2314                                       .addReg(SrcReg, getKillRegState(isKill))
2315                                       .addFrameIndex(FI);
2316 
2317   if (Offset)
2318     MI.addImm(0);
2319   MI.addMemOperand(MMO);
2320 }
2321 
2322 void AArch64InstrInfo::loadRegFromStackSlot(
2323     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg,
2324     int FI, const TargetRegisterClass *RC,
2325     const TargetRegisterInfo *TRI) const {
2326   DebugLoc DL;
2327   if (MBBI != MBB.end())
2328     DL = MBBI->getDebugLoc();
2329   MachineFunction &MF = *MBB.getParent();
2330   MachineFrameInfo &MFI = MF.getFrameInfo();
2331   unsigned Align = MFI.getObjectAlignment(FI);
2332   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI);
2333   MachineMemOperand *MMO = MF.getMachineMemOperand(
2334       PtrInfo, MachineMemOperand::MOLoad, MFI.getObjectSize(FI), Align);
2335 
2336   unsigned Opc = 0;
2337   bool Offset = true;
2338   switch (RC->getSize()) {
2339   case 1:
2340     if (AArch64::FPR8RegClass.hasSubClassEq(RC))
2341       Opc = AArch64::LDRBui;
2342     break;
2343   case 2:
2344     if (AArch64::FPR16RegClass.hasSubClassEq(RC))
2345       Opc = AArch64::LDRHui;
2346     break;
2347   case 4:
2348     if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
2349       Opc = AArch64::LDRWui;
2350       if (TargetRegisterInfo::isVirtualRegister(DestReg))
2351         MF.getRegInfo().constrainRegClass(DestReg, &AArch64::GPR32RegClass);
2352       else
2353         assert(DestReg != AArch64::WSP);
2354     } else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
2355       Opc = AArch64::LDRSui;
2356     break;
2357   case 8:
2358     if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
2359       Opc = AArch64::LDRXui;
2360       if (TargetRegisterInfo::isVirtualRegister(DestReg))
2361         MF.getRegInfo().constrainRegClass(DestReg, &AArch64::GPR64RegClass);
2362       else
2363         assert(DestReg != AArch64::SP);
2364     } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
2365       Opc = AArch64::LDRDui;
2366     break;
2367   case 16:
2368     if (AArch64::FPR128RegClass.hasSubClassEq(RC))
2369       Opc = AArch64::LDRQui;
2370     else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
2371       assert(Subtarget.hasNEON() &&
2372              "Unexpected register load without NEON");
2373       Opc = AArch64::LD1Twov1d;
2374       Offset = false;
2375     }
2376     break;
2377   case 24:
2378     if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
2379       assert(Subtarget.hasNEON() &&
2380              "Unexpected register load without NEON");
2381       Opc = AArch64::LD1Threev1d;
2382       Offset = false;
2383     }
2384     break;
2385   case 32:
2386     if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
2387       assert(Subtarget.hasNEON() &&
2388              "Unexpected register load without NEON");
2389       Opc = AArch64::LD1Fourv1d;
2390       Offset = false;
2391     } else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
2392       assert(Subtarget.hasNEON() &&
2393              "Unexpected register load without NEON");
2394       Opc = AArch64::LD1Twov2d;
2395       Offset = false;
2396     }
2397     break;
2398   case 48:
2399     if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
2400       assert(Subtarget.hasNEON() &&
2401              "Unexpected register load without NEON");
2402       Opc = AArch64::LD1Threev2d;
2403       Offset = false;
2404     }
2405     break;
2406   case 64:
2407     if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
2408       assert(Subtarget.hasNEON() &&
2409              "Unexpected register load without NEON");
2410       Opc = AArch64::LD1Fourv2d;
2411       Offset = false;
2412     }
2413     break;
2414   }
2415   assert(Opc && "Unknown register class");
2416 
2417   const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DL, get(Opc))
2418                                       .addReg(DestReg, getDefRegState(true))
2419                                       .addFrameIndex(FI);
2420   if (Offset)
2421     MI.addImm(0);
2422   MI.addMemOperand(MMO);
2423 }
2424 
2425 void llvm::emitFrameOffset(MachineBasicBlock &MBB,
2426                            MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
2427                            unsigned DestReg, unsigned SrcReg, int Offset,
2428                            const TargetInstrInfo *TII,
2429                            MachineInstr::MIFlag Flag, bool SetNZCV) {
2430   if (DestReg == SrcReg && Offset == 0)
2431     return;
2432 
2433   assert((DestReg != AArch64::SP || Offset % 16 == 0) &&
2434          "SP increment/decrement not 16-byte aligned");
2435 
2436   bool isSub = Offset < 0;
2437   if (isSub)
2438     Offset = -Offset;
2439 
2440   // FIXME: If the offset won't fit in 24-bits, compute the offset into a
2441   // scratch register.  If DestReg is a virtual register, use it as the
2442   // scratch register; otherwise, create a new virtual register (to be
2443   // replaced by the scavenger at the end of PEI).  That case can be optimized
2444   // slightly if DestReg is SP which is always 16-byte aligned, so the scratch
2445   // register can be loaded with offset%8 and the add/sub can use an extending
2446   // instruction with LSL#3.
2447   // Currently the function handles any offsets but generates a poor sequence
2448   // of code.
2449   //  assert(Offset < (1 << 24) && "unimplemented reg plus immediate");
2450 
2451   unsigned Opc;
2452   if (SetNZCV)
2453     Opc = isSub ? AArch64::SUBSXri : AArch64::ADDSXri;
2454   else
2455     Opc = isSub ? AArch64::SUBXri : AArch64::ADDXri;
2456   const unsigned MaxEncoding = 0xfff;
2457   const unsigned ShiftSize = 12;
2458   const unsigned MaxEncodableValue = MaxEncoding << ShiftSize;
2459   while (((unsigned)Offset) >= (1 << ShiftSize)) {
2460     unsigned ThisVal;
2461     if (((unsigned)Offset) > MaxEncodableValue) {
2462       ThisVal = MaxEncodableValue;
2463     } else {
2464       ThisVal = Offset & MaxEncodableValue;
2465     }
2466     assert((ThisVal >> ShiftSize) <= MaxEncoding &&
2467            "Encoding cannot handle value that big");
2468     BuildMI(MBB, MBBI, DL, TII->get(Opc), DestReg)
2469         .addReg(SrcReg)
2470         .addImm(ThisVal >> ShiftSize)
2471         .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftSize))
2472         .setMIFlag(Flag);
2473 
2474     SrcReg = DestReg;
2475     Offset -= ThisVal;
2476     if (Offset == 0)
2477       return;
2478   }
2479   BuildMI(MBB, MBBI, DL, TII->get(Opc), DestReg)
2480       .addReg(SrcReg)
2481       .addImm(Offset)
2482       .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0))
2483       .setMIFlag(Flag);
2484 }
2485 
2486 MachineInstr *AArch64InstrInfo::foldMemoryOperandImpl(
2487     MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops,
2488     MachineBasicBlock::iterator InsertPt, int FrameIndex,
2489     LiveIntervals *LIS) const {
2490   // This is a bit of a hack. Consider this instruction:
2491   //
2492   //   %vreg0<def> = COPY %SP; GPR64all:%vreg0
2493   //
2494   // We explicitly chose GPR64all for the virtual register so such a copy might
2495   // be eliminated by RegisterCoalescer. However, that may not be possible, and
2496   // %vreg0 may even spill. We can't spill %SP, and since it is in the GPR64all
2497   // register class, TargetInstrInfo::foldMemoryOperand() is going to try.
2498   //
2499   // To prevent that, we are going to constrain the %vreg0 register class here.
2500   //
2501   // <rdar://problem/11522048>
2502   //
2503   if (MI.isCopy()) {
2504     unsigned DstReg = MI.getOperand(0).getReg();
2505     unsigned SrcReg = MI.getOperand(1).getReg();
2506     if (SrcReg == AArch64::SP &&
2507         TargetRegisterInfo::isVirtualRegister(DstReg)) {
2508       MF.getRegInfo().constrainRegClass(DstReg, &AArch64::GPR64RegClass);
2509       return nullptr;
2510     }
2511     if (DstReg == AArch64::SP &&
2512         TargetRegisterInfo::isVirtualRegister(SrcReg)) {
2513       MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR64RegClass);
2514       return nullptr;
2515     }
2516   }
2517 
2518   // Cannot fold.
2519   return nullptr;
2520 }
2521 
2522 int llvm::isAArch64FrameOffsetLegal(const MachineInstr &MI, int &Offset,
2523                                     bool *OutUseUnscaledOp,
2524                                     unsigned *OutUnscaledOp,
2525                                     int *EmittableOffset) {
2526   int Scale = 1;
2527   bool IsSigned = false;
2528   // The ImmIdx should be changed case by case if it is not 2.
2529   unsigned ImmIdx = 2;
2530   unsigned UnscaledOp = 0;
2531   // Set output values in case of early exit.
2532   if (EmittableOffset)
2533     *EmittableOffset = 0;
2534   if (OutUseUnscaledOp)
2535     *OutUseUnscaledOp = false;
2536   if (OutUnscaledOp)
2537     *OutUnscaledOp = 0;
2538   switch (MI.getOpcode()) {
2539   default:
2540     llvm_unreachable("unhandled opcode in rewriteAArch64FrameIndex");
2541   // Vector spills/fills can't take an immediate offset.
2542   case AArch64::LD1Twov2d:
2543   case AArch64::LD1Threev2d:
2544   case AArch64::LD1Fourv2d:
2545   case AArch64::LD1Twov1d:
2546   case AArch64::LD1Threev1d:
2547   case AArch64::LD1Fourv1d:
2548   case AArch64::ST1Twov2d:
2549   case AArch64::ST1Threev2d:
2550   case AArch64::ST1Fourv2d:
2551   case AArch64::ST1Twov1d:
2552   case AArch64::ST1Threev1d:
2553   case AArch64::ST1Fourv1d:
2554     return AArch64FrameOffsetCannotUpdate;
2555   case AArch64::PRFMui:
2556     Scale = 8;
2557     UnscaledOp = AArch64::PRFUMi;
2558     break;
2559   case AArch64::LDRXui:
2560     Scale = 8;
2561     UnscaledOp = AArch64::LDURXi;
2562     break;
2563   case AArch64::LDRWui:
2564     Scale = 4;
2565     UnscaledOp = AArch64::LDURWi;
2566     break;
2567   case AArch64::LDRBui:
2568     Scale = 1;
2569     UnscaledOp = AArch64::LDURBi;
2570     break;
2571   case AArch64::LDRHui:
2572     Scale = 2;
2573     UnscaledOp = AArch64::LDURHi;
2574     break;
2575   case AArch64::LDRSui:
2576     Scale = 4;
2577     UnscaledOp = AArch64::LDURSi;
2578     break;
2579   case AArch64::LDRDui:
2580     Scale = 8;
2581     UnscaledOp = AArch64::LDURDi;
2582     break;
2583   case AArch64::LDRQui:
2584     Scale = 16;
2585     UnscaledOp = AArch64::LDURQi;
2586     break;
2587   case AArch64::LDRBBui:
2588     Scale = 1;
2589     UnscaledOp = AArch64::LDURBBi;
2590     break;
2591   case AArch64::LDRHHui:
2592     Scale = 2;
2593     UnscaledOp = AArch64::LDURHHi;
2594     break;
2595   case AArch64::LDRSBXui:
2596     Scale = 1;
2597     UnscaledOp = AArch64::LDURSBXi;
2598     break;
2599   case AArch64::LDRSBWui:
2600     Scale = 1;
2601     UnscaledOp = AArch64::LDURSBWi;
2602     break;
2603   case AArch64::LDRSHXui:
2604     Scale = 2;
2605     UnscaledOp = AArch64::LDURSHXi;
2606     break;
2607   case AArch64::LDRSHWui:
2608     Scale = 2;
2609     UnscaledOp = AArch64::LDURSHWi;
2610     break;
2611   case AArch64::LDRSWui:
2612     Scale = 4;
2613     UnscaledOp = AArch64::LDURSWi;
2614     break;
2615 
2616   case AArch64::STRXui:
2617     Scale = 8;
2618     UnscaledOp = AArch64::STURXi;
2619     break;
2620   case AArch64::STRWui:
2621     Scale = 4;
2622     UnscaledOp = AArch64::STURWi;
2623     break;
2624   case AArch64::STRBui:
2625     Scale = 1;
2626     UnscaledOp = AArch64::STURBi;
2627     break;
2628   case AArch64::STRHui:
2629     Scale = 2;
2630     UnscaledOp = AArch64::STURHi;
2631     break;
2632   case AArch64::STRSui:
2633     Scale = 4;
2634     UnscaledOp = AArch64::STURSi;
2635     break;
2636   case AArch64::STRDui:
2637     Scale = 8;
2638     UnscaledOp = AArch64::STURDi;
2639     break;
2640   case AArch64::STRQui:
2641     Scale = 16;
2642     UnscaledOp = AArch64::STURQi;
2643     break;
2644   case AArch64::STRBBui:
2645     Scale = 1;
2646     UnscaledOp = AArch64::STURBBi;
2647     break;
2648   case AArch64::STRHHui:
2649     Scale = 2;
2650     UnscaledOp = AArch64::STURHHi;
2651     break;
2652 
2653   case AArch64::LDPXi:
2654   case AArch64::LDPDi:
2655   case AArch64::STPXi:
2656   case AArch64::STPDi:
2657   case AArch64::LDNPXi:
2658   case AArch64::LDNPDi:
2659   case AArch64::STNPXi:
2660   case AArch64::STNPDi:
2661     ImmIdx = 3;
2662     IsSigned = true;
2663     Scale = 8;
2664     break;
2665   case AArch64::LDPQi:
2666   case AArch64::STPQi:
2667   case AArch64::LDNPQi:
2668   case AArch64::STNPQi:
2669     ImmIdx = 3;
2670     IsSigned = true;
2671     Scale = 16;
2672     break;
2673   case AArch64::LDPWi:
2674   case AArch64::LDPSi:
2675   case AArch64::STPWi:
2676   case AArch64::STPSi:
2677   case AArch64::LDNPWi:
2678   case AArch64::LDNPSi:
2679   case AArch64::STNPWi:
2680   case AArch64::STNPSi:
2681     ImmIdx = 3;
2682     IsSigned = true;
2683     Scale = 4;
2684     break;
2685 
2686   case AArch64::LDURXi:
2687   case AArch64::LDURWi:
2688   case AArch64::LDURBi:
2689   case AArch64::LDURHi:
2690   case AArch64::LDURSi:
2691   case AArch64::LDURDi:
2692   case AArch64::LDURQi:
2693   case AArch64::LDURHHi:
2694   case AArch64::LDURBBi:
2695   case AArch64::LDURSBXi:
2696   case AArch64::LDURSBWi:
2697   case AArch64::LDURSHXi:
2698   case AArch64::LDURSHWi:
2699   case AArch64::LDURSWi:
2700   case AArch64::STURXi:
2701   case AArch64::STURWi:
2702   case AArch64::STURBi:
2703   case AArch64::STURHi:
2704   case AArch64::STURSi:
2705   case AArch64::STURDi:
2706   case AArch64::STURQi:
2707   case AArch64::STURBBi:
2708   case AArch64::STURHHi:
2709     Scale = 1;
2710     break;
2711   }
2712 
2713   Offset += MI.getOperand(ImmIdx).getImm() * Scale;
2714 
2715   bool useUnscaledOp = false;
2716   // If the offset doesn't match the scale, we rewrite the instruction to
2717   // use the unscaled instruction instead. Likewise, if we have a negative
2718   // offset (and have an unscaled op to use).
2719   if ((Offset & (Scale - 1)) != 0 || (Offset < 0 && UnscaledOp != 0))
2720     useUnscaledOp = true;
2721 
2722   // Use an unscaled addressing mode if the instruction has a negative offset
2723   // (or if the instruction is already using an unscaled addressing mode).
2724   unsigned MaskBits;
2725   if (IsSigned) {
2726     // ldp/stp instructions.
2727     MaskBits = 7;
2728     Offset /= Scale;
2729   } else if (UnscaledOp == 0 || useUnscaledOp) {
2730     MaskBits = 9;
2731     IsSigned = true;
2732     Scale = 1;
2733   } else {
2734     MaskBits = 12;
2735     IsSigned = false;
2736     Offset /= Scale;
2737   }
2738 
2739   // Attempt to fold address computation.
2740   int MaxOff = (1 << (MaskBits - IsSigned)) - 1;
2741   int MinOff = (IsSigned ? (-MaxOff - 1) : 0);
2742   if (Offset >= MinOff && Offset <= MaxOff) {
2743     if (EmittableOffset)
2744       *EmittableOffset = Offset;
2745     Offset = 0;
2746   } else {
2747     int NewOff = Offset < 0 ? MinOff : MaxOff;
2748     if (EmittableOffset)
2749       *EmittableOffset = NewOff;
2750     Offset = (Offset - NewOff) * Scale;
2751   }
2752   if (OutUseUnscaledOp)
2753     *OutUseUnscaledOp = useUnscaledOp;
2754   if (OutUnscaledOp)
2755     *OutUnscaledOp = UnscaledOp;
2756   return AArch64FrameOffsetCanUpdate |
2757          (Offset == 0 ? AArch64FrameOffsetIsLegal : 0);
2758 }
2759 
2760 bool llvm::rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
2761                                     unsigned FrameReg, int &Offset,
2762                                     const AArch64InstrInfo *TII) {
2763   unsigned Opcode = MI.getOpcode();
2764   unsigned ImmIdx = FrameRegIdx + 1;
2765 
2766   if (Opcode == AArch64::ADDSXri || Opcode == AArch64::ADDXri) {
2767     Offset += MI.getOperand(ImmIdx).getImm();
2768     emitFrameOffset(*MI.getParent(), MI, MI.getDebugLoc(),
2769                     MI.getOperand(0).getReg(), FrameReg, Offset, TII,
2770                     MachineInstr::NoFlags, (Opcode == AArch64::ADDSXri));
2771     MI.eraseFromParent();
2772     Offset = 0;
2773     return true;
2774   }
2775 
2776   int NewOffset;
2777   unsigned UnscaledOp;
2778   bool UseUnscaledOp;
2779   int Status = isAArch64FrameOffsetLegal(MI, Offset, &UseUnscaledOp,
2780                                          &UnscaledOp, &NewOffset);
2781   if (Status & AArch64FrameOffsetCanUpdate) {
2782     if (Status & AArch64FrameOffsetIsLegal)
2783       // Replace the FrameIndex with FrameReg.
2784       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
2785     if (UseUnscaledOp)
2786       MI.setDesc(TII->get(UnscaledOp));
2787 
2788     MI.getOperand(ImmIdx).ChangeToImmediate(NewOffset);
2789     return Offset == 0;
2790   }
2791 
2792   return false;
2793 }
2794 
2795 void AArch64InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
2796   NopInst.setOpcode(AArch64::HINT);
2797   NopInst.addOperand(MCOperand::createImm(0));
2798 }
2799 
2800 // AArch64 supports MachineCombiner.
2801 bool AArch64InstrInfo::useMachineCombiner() const {
2802 
2803   return true;
2804 }
2805 //
2806 // True when Opc sets flag
2807 static bool isCombineInstrSettingFlag(unsigned Opc) {
2808   switch (Opc) {
2809   case AArch64::ADDSWrr:
2810   case AArch64::ADDSWri:
2811   case AArch64::ADDSXrr:
2812   case AArch64::ADDSXri:
2813   case AArch64::SUBSWrr:
2814   case AArch64::SUBSXrr:
2815   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
2816   case AArch64::SUBSWri:
2817   case AArch64::SUBSXri:
2818     return true;
2819   default:
2820     break;
2821   }
2822   return false;
2823 }
2824 //
2825 // 32b Opcodes that can be combined with a MUL
2826 static bool isCombineInstrCandidate32(unsigned Opc) {
2827   switch (Opc) {
2828   case AArch64::ADDWrr:
2829   case AArch64::ADDWri:
2830   case AArch64::SUBWrr:
2831   case AArch64::ADDSWrr:
2832   case AArch64::ADDSWri:
2833   case AArch64::SUBSWrr:
2834   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
2835   case AArch64::SUBWri:
2836   case AArch64::SUBSWri:
2837     return true;
2838   default:
2839     break;
2840   }
2841   return false;
2842 }
2843 //
2844 // 64b Opcodes that can be combined with a MUL
2845 static bool isCombineInstrCandidate64(unsigned Opc) {
2846   switch (Opc) {
2847   case AArch64::ADDXrr:
2848   case AArch64::ADDXri:
2849   case AArch64::SUBXrr:
2850   case AArch64::ADDSXrr:
2851   case AArch64::ADDSXri:
2852   case AArch64::SUBSXrr:
2853   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
2854   case AArch64::SUBXri:
2855   case AArch64::SUBSXri:
2856     return true;
2857   default:
2858     break;
2859   }
2860   return false;
2861 }
2862 //
2863 // FP Opcodes that can be combined with a FMUL
2864 static bool isCombineInstrCandidateFP(const MachineInstr &Inst) {
2865   switch (Inst.getOpcode()) {
2866   case AArch64::FADDSrr:
2867   case AArch64::FADDDrr:
2868   case AArch64::FADDv2f32:
2869   case AArch64::FADDv2f64:
2870   case AArch64::FADDv4f32:
2871   case AArch64::FSUBSrr:
2872   case AArch64::FSUBDrr:
2873   case AArch64::FSUBv2f32:
2874   case AArch64::FSUBv2f64:
2875   case AArch64::FSUBv4f32:
2876     return Inst.getParent()->getParent()->getTarget().Options.UnsafeFPMath;
2877   default:
2878     break;
2879   }
2880   return false;
2881 }
2882 //
2883 // Opcodes that can be combined with a MUL
2884 static bool isCombineInstrCandidate(unsigned Opc) {
2885   return (isCombineInstrCandidate32(Opc) || isCombineInstrCandidate64(Opc));
2886 }
2887 
2888 //
2889 // Utility routine that checks if \param MO is defined by an
2890 // \param CombineOpc instruction in the basic block \param MBB
2891 static bool canCombine(MachineBasicBlock &MBB, MachineOperand &MO,
2892                        unsigned CombineOpc, unsigned ZeroReg = 0,
2893                        bool CheckZeroReg = false) {
2894   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
2895   MachineInstr *MI = nullptr;
2896 
2897   if (MO.isReg() && TargetRegisterInfo::isVirtualRegister(MO.getReg()))
2898     MI = MRI.getUniqueVRegDef(MO.getReg());
2899   // And it needs to be in the trace (otherwise, it won't have a depth).
2900   if (!MI || MI->getParent() != &MBB || (unsigned)MI->getOpcode() != CombineOpc)
2901     return false;
2902   // Must only used by the user we combine with.
2903   if (!MRI.hasOneNonDBGUse(MI->getOperand(0).getReg()))
2904     return false;
2905 
2906   if (CheckZeroReg) {
2907     assert(MI->getNumOperands() >= 4 && MI->getOperand(0).isReg() &&
2908            MI->getOperand(1).isReg() && MI->getOperand(2).isReg() &&
2909            MI->getOperand(3).isReg() && "MAdd/MSub must have a least 4 regs");
2910     // The third input reg must be zero.
2911     if (MI->getOperand(3).getReg() != ZeroReg)
2912       return false;
2913   }
2914 
2915   return true;
2916 }
2917 
2918 //
2919 // Is \param MO defined by an integer multiply and can be combined?
2920 static bool canCombineWithMUL(MachineBasicBlock &MBB, MachineOperand &MO,
2921                               unsigned MulOpc, unsigned ZeroReg) {
2922   return canCombine(MBB, MO, MulOpc, ZeroReg, true);
2923 }
2924 
2925 //
2926 // Is \param MO defined by a floating-point multiply and can be combined?
2927 static bool canCombineWithFMUL(MachineBasicBlock &MBB, MachineOperand &MO,
2928                                unsigned MulOpc) {
2929   return canCombine(MBB, MO, MulOpc);
2930 }
2931 
2932 // TODO: There are many more machine instruction opcodes to match:
2933 //       1. Other data types (integer, vectors)
2934 //       2. Other math / logic operations (xor, or)
2935 //       3. Other forms of the same operation (intrinsics and other variants)
2936 bool AArch64InstrInfo::isAssociativeAndCommutative(const MachineInstr &Inst) const {
2937   switch (Inst.getOpcode()) {
2938   case AArch64::FADDDrr:
2939   case AArch64::FADDSrr:
2940   case AArch64::FADDv2f32:
2941   case AArch64::FADDv2f64:
2942   case AArch64::FADDv4f32:
2943   case AArch64::FMULDrr:
2944   case AArch64::FMULSrr:
2945   case AArch64::FMULX32:
2946   case AArch64::FMULX64:
2947   case AArch64::FMULXv2f32:
2948   case AArch64::FMULXv2f64:
2949   case AArch64::FMULXv4f32:
2950   case AArch64::FMULv2f32:
2951   case AArch64::FMULv2f64:
2952   case AArch64::FMULv4f32:
2953     return Inst.getParent()->getParent()->getTarget().Options.UnsafeFPMath;
2954   default:
2955     return false;
2956   }
2957 }
2958 
2959 /// Find instructions that can be turned into madd.
2960 static bool getMaddPatterns(MachineInstr &Root,
2961                             SmallVectorImpl<MachineCombinerPattern> &Patterns) {
2962   unsigned Opc = Root.getOpcode();
2963   MachineBasicBlock &MBB = *Root.getParent();
2964   bool Found = false;
2965 
2966   if (!isCombineInstrCandidate(Opc))
2967     return false;
2968   if (isCombineInstrSettingFlag(Opc)) {
2969     int Cmp_NZCV = Root.findRegisterDefOperandIdx(AArch64::NZCV, true);
2970     // When NZCV is live bail out.
2971     if (Cmp_NZCV == -1)
2972       return false;
2973     unsigned NewOpc = convertFlagSettingOpcode(Root);
2974     // When opcode can't change bail out.
2975     // CHECKME: do we miss any cases for opcode conversion?
2976     if (NewOpc == Opc)
2977       return false;
2978     Opc = NewOpc;
2979   }
2980 
2981   switch (Opc) {
2982   default:
2983     break;
2984   case AArch64::ADDWrr:
2985     assert(Root.getOperand(1).isReg() && Root.getOperand(2).isReg() &&
2986            "ADDWrr does not have register operands");
2987     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
2988                           AArch64::WZR)) {
2989       Patterns.push_back(MachineCombinerPattern::MULADDW_OP1);
2990       Found = true;
2991     }
2992     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDWrrr,
2993                           AArch64::WZR)) {
2994       Patterns.push_back(MachineCombinerPattern::MULADDW_OP2);
2995       Found = true;
2996     }
2997     break;
2998   case AArch64::ADDXrr:
2999     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3000                           AArch64::XZR)) {
3001       Patterns.push_back(MachineCombinerPattern::MULADDX_OP1);
3002       Found = true;
3003     }
3004     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDXrrr,
3005                           AArch64::XZR)) {
3006       Patterns.push_back(MachineCombinerPattern::MULADDX_OP2);
3007       Found = true;
3008     }
3009     break;
3010   case AArch64::SUBWrr:
3011     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3012                           AArch64::WZR)) {
3013       Patterns.push_back(MachineCombinerPattern::MULSUBW_OP1);
3014       Found = true;
3015     }
3016     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDWrrr,
3017                           AArch64::WZR)) {
3018       Patterns.push_back(MachineCombinerPattern::MULSUBW_OP2);
3019       Found = true;
3020     }
3021     break;
3022   case AArch64::SUBXrr:
3023     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3024                           AArch64::XZR)) {
3025       Patterns.push_back(MachineCombinerPattern::MULSUBX_OP1);
3026       Found = true;
3027     }
3028     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDXrrr,
3029                           AArch64::XZR)) {
3030       Patterns.push_back(MachineCombinerPattern::MULSUBX_OP2);
3031       Found = true;
3032     }
3033     break;
3034   case AArch64::ADDWri:
3035     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3036                           AArch64::WZR)) {
3037       Patterns.push_back(MachineCombinerPattern::MULADDWI_OP1);
3038       Found = true;
3039     }
3040     break;
3041   case AArch64::ADDXri:
3042     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3043                           AArch64::XZR)) {
3044       Patterns.push_back(MachineCombinerPattern::MULADDXI_OP1);
3045       Found = true;
3046     }
3047     break;
3048   case AArch64::SUBWri:
3049     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3050                           AArch64::WZR)) {
3051       Patterns.push_back(MachineCombinerPattern::MULSUBWI_OP1);
3052       Found = true;
3053     }
3054     break;
3055   case AArch64::SUBXri:
3056     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3057                           AArch64::XZR)) {
3058       Patterns.push_back(MachineCombinerPattern::MULSUBXI_OP1);
3059       Found = true;
3060     }
3061     break;
3062   }
3063   return Found;
3064 }
3065 /// Floating-Point Support
3066 
3067 /// Find instructions that can be turned into madd.
3068 static bool getFMAPatterns(MachineInstr &Root,
3069                            SmallVectorImpl<MachineCombinerPattern> &Patterns) {
3070 
3071   if (!isCombineInstrCandidateFP(Root))
3072     return 0;
3073 
3074   MachineBasicBlock &MBB = *Root.getParent();
3075   bool Found = false;
3076 
3077   switch (Root.getOpcode()) {
3078   default:
3079     assert(false && "Unsupported FP instruction in combiner\n");
3080     break;
3081   case AArch64::FADDSrr:
3082     assert(Root.getOperand(1).isReg() && Root.getOperand(2).isReg() &&
3083            "FADDWrr does not have register operands");
3084     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULSrr)) {
3085       Patterns.push_back(MachineCombinerPattern::FMULADDS_OP1);
3086       Found = true;
3087     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3088                                   AArch64::FMULv1i32_indexed)) {
3089       Patterns.push_back(MachineCombinerPattern::FMLAv1i32_indexed_OP1);
3090       Found = true;
3091     }
3092     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULSrr)) {
3093       Patterns.push_back(MachineCombinerPattern::FMULADDS_OP2);
3094       Found = true;
3095     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3096                                   AArch64::FMULv1i32_indexed)) {
3097       Patterns.push_back(MachineCombinerPattern::FMLAv1i32_indexed_OP2);
3098       Found = true;
3099     }
3100     break;
3101   case AArch64::FADDDrr:
3102     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULDrr)) {
3103       Patterns.push_back(MachineCombinerPattern::FMULADDD_OP1);
3104       Found = true;
3105     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3106                                   AArch64::FMULv1i64_indexed)) {
3107       Patterns.push_back(MachineCombinerPattern::FMLAv1i64_indexed_OP1);
3108       Found = true;
3109     }
3110     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULDrr)) {
3111       Patterns.push_back(MachineCombinerPattern::FMULADDD_OP2);
3112       Found = true;
3113     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3114                                   AArch64::FMULv1i64_indexed)) {
3115       Patterns.push_back(MachineCombinerPattern::FMLAv1i64_indexed_OP2);
3116       Found = true;
3117     }
3118     break;
3119   case AArch64::FADDv2f32:
3120     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3121                            AArch64::FMULv2i32_indexed)) {
3122       Patterns.push_back(MachineCombinerPattern::FMLAv2i32_indexed_OP1);
3123       Found = true;
3124     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3125                                   AArch64::FMULv2f32)) {
3126       Patterns.push_back(MachineCombinerPattern::FMLAv2f32_OP1);
3127       Found = true;
3128     }
3129     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3130                            AArch64::FMULv2i32_indexed)) {
3131       Patterns.push_back(MachineCombinerPattern::FMLAv2i32_indexed_OP2);
3132       Found = true;
3133     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3134                                   AArch64::FMULv2f32)) {
3135       Patterns.push_back(MachineCombinerPattern::FMLAv2f32_OP2);
3136       Found = true;
3137     }
3138     break;
3139   case AArch64::FADDv2f64:
3140     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3141                            AArch64::FMULv2i64_indexed)) {
3142       Patterns.push_back(MachineCombinerPattern::FMLAv2i64_indexed_OP1);
3143       Found = true;
3144     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3145                                   AArch64::FMULv2f64)) {
3146       Patterns.push_back(MachineCombinerPattern::FMLAv2f64_OP1);
3147       Found = true;
3148     }
3149     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3150                            AArch64::FMULv2i64_indexed)) {
3151       Patterns.push_back(MachineCombinerPattern::FMLAv2i64_indexed_OP2);
3152       Found = true;
3153     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3154                                   AArch64::FMULv2f64)) {
3155       Patterns.push_back(MachineCombinerPattern::FMLAv2f64_OP2);
3156       Found = true;
3157     }
3158     break;
3159   case AArch64::FADDv4f32:
3160     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3161                            AArch64::FMULv4i32_indexed)) {
3162       Patterns.push_back(MachineCombinerPattern::FMLAv4i32_indexed_OP1);
3163       Found = true;
3164     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3165                                   AArch64::FMULv4f32)) {
3166       Patterns.push_back(MachineCombinerPattern::FMLAv4f32_OP1);
3167       Found = true;
3168     }
3169     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3170                            AArch64::FMULv4i32_indexed)) {
3171       Patterns.push_back(MachineCombinerPattern::FMLAv4i32_indexed_OP2);
3172       Found = true;
3173     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3174                                   AArch64::FMULv4f32)) {
3175       Patterns.push_back(MachineCombinerPattern::FMLAv4f32_OP2);
3176       Found = true;
3177     }
3178     break;
3179 
3180   case AArch64::FSUBSrr:
3181     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULSrr)) {
3182       Patterns.push_back(MachineCombinerPattern::FMULSUBS_OP1);
3183       Found = true;
3184     }
3185     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULSrr)) {
3186       Patterns.push_back(MachineCombinerPattern::FMULSUBS_OP2);
3187       Found = true;
3188     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3189                                   AArch64::FMULv1i32_indexed)) {
3190       Patterns.push_back(MachineCombinerPattern::FMLSv1i32_indexed_OP2);
3191       Found = true;
3192     }
3193     break;
3194   case AArch64::FSUBDrr:
3195     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULDrr)) {
3196       Patterns.push_back(MachineCombinerPattern::FMULSUBD_OP1);
3197       Found = true;
3198     }
3199     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULDrr)) {
3200       Patterns.push_back(MachineCombinerPattern::FMULSUBD_OP2);
3201       Found = true;
3202     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3203                                   AArch64::FMULv1i64_indexed)) {
3204       Patterns.push_back(MachineCombinerPattern::FMLSv1i64_indexed_OP2);
3205       Found = true;
3206     }
3207     break;
3208   case AArch64::FSUBv2f32:
3209     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3210                            AArch64::FMULv2i32_indexed)) {
3211       Patterns.push_back(MachineCombinerPattern::FMLSv2i32_indexed_OP2);
3212       Found = true;
3213     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3214                                   AArch64::FMULv2f32)) {
3215       Patterns.push_back(MachineCombinerPattern::FMLSv2f32_OP2);
3216       Found = true;
3217     }
3218     break;
3219   case AArch64::FSUBv2f64:
3220     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3221                            AArch64::FMULv2i64_indexed)) {
3222       Patterns.push_back(MachineCombinerPattern::FMLSv2i64_indexed_OP2);
3223       Found = true;
3224     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3225                                   AArch64::FMULv2f64)) {
3226       Patterns.push_back(MachineCombinerPattern::FMLSv2f64_OP2);
3227       Found = true;
3228     }
3229     break;
3230   case AArch64::FSUBv4f32:
3231     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3232                            AArch64::FMULv4i32_indexed)) {
3233       Patterns.push_back(MachineCombinerPattern::FMLSv4i32_indexed_OP2);
3234       Found = true;
3235     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3236                                   AArch64::FMULv4f32)) {
3237       Patterns.push_back(MachineCombinerPattern::FMLSv4f32_OP2);
3238       Found = true;
3239     }
3240     break;
3241   }
3242   return Found;
3243 }
3244 
3245 /// Return true when a code sequence can improve throughput. It
3246 /// should be called only for instructions in loops.
3247 /// \param Pattern - combiner pattern
3248 bool
3249 AArch64InstrInfo::isThroughputPattern(MachineCombinerPattern Pattern) const {
3250   switch (Pattern) {
3251   default:
3252     break;
3253   case MachineCombinerPattern::FMULADDS_OP1:
3254   case MachineCombinerPattern::FMULADDS_OP2:
3255   case MachineCombinerPattern::FMULSUBS_OP1:
3256   case MachineCombinerPattern::FMULSUBS_OP2:
3257   case MachineCombinerPattern::FMULADDD_OP1:
3258   case MachineCombinerPattern::FMULADDD_OP2:
3259   case MachineCombinerPattern::FMULSUBD_OP1:
3260   case MachineCombinerPattern::FMULSUBD_OP2:
3261   case MachineCombinerPattern::FMLAv1i32_indexed_OP1:
3262   case MachineCombinerPattern::FMLAv1i32_indexed_OP2:
3263   case MachineCombinerPattern::FMLAv1i64_indexed_OP1:
3264   case MachineCombinerPattern::FMLAv1i64_indexed_OP2:
3265   case MachineCombinerPattern::FMLAv2f32_OP2:
3266   case MachineCombinerPattern::FMLAv2f32_OP1:
3267   case MachineCombinerPattern::FMLAv2f64_OP1:
3268   case MachineCombinerPattern::FMLAv2f64_OP2:
3269   case MachineCombinerPattern::FMLAv2i32_indexed_OP1:
3270   case MachineCombinerPattern::FMLAv2i32_indexed_OP2:
3271   case MachineCombinerPattern::FMLAv2i64_indexed_OP1:
3272   case MachineCombinerPattern::FMLAv2i64_indexed_OP2:
3273   case MachineCombinerPattern::FMLAv4f32_OP1:
3274   case MachineCombinerPattern::FMLAv4f32_OP2:
3275   case MachineCombinerPattern::FMLAv4i32_indexed_OP1:
3276   case MachineCombinerPattern::FMLAv4i32_indexed_OP2:
3277   case MachineCombinerPattern::FMLSv1i32_indexed_OP2:
3278   case MachineCombinerPattern::FMLSv1i64_indexed_OP2:
3279   case MachineCombinerPattern::FMLSv2i32_indexed_OP2:
3280   case MachineCombinerPattern::FMLSv2i64_indexed_OP2:
3281   case MachineCombinerPattern::FMLSv2f32_OP2:
3282   case MachineCombinerPattern::FMLSv2f64_OP2:
3283   case MachineCombinerPattern::FMLSv4i32_indexed_OP2:
3284   case MachineCombinerPattern::FMLSv4f32_OP2:
3285     return true;
3286   } // end switch (Pattern)
3287   return false;
3288 }
3289 /// Return true when there is potentially a faster code sequence for an
3290 /// instruction chain ending in \p Root. All potential patterns are listed in
3291 /// the \p Pattern vector. Pattern should be sorted in priority order since the
3292 /// pattern evaluator stops checking as soon as it finds a faster sequence.
3293 
3294 bool AArch64InstrInfo::getMachineCombinerPatterns(
3295     MachineInstr &Root,
3296     SmallVectorImpl<MachineCombinerPattern> &Patterns) const {
3297   // Integer patterns
3298   if (getMaddPatterns(Root, Patterns))
3299     return true;
3300   // Floating point patterns
3301   if (getFMAPatterns(Root, Patterns))
3302     return true;
3303 
3304   return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns);
3305 }
3306 
3307 enum class FMAInstKind { Default, Indexed, Accumulator };
3308 /// genFusedMultiply - Generate fused multiply instructions.
3309 /// This function supports both integer and floating point instructions.
3310 /// A typical example:
3311 ///  F|MUL I=A,B,0
3312 ///  F|ADD R,I,C
3313 ///  ==> F|MADD R,A,B,C
3314 /// \param Root is the F|ADD instruction
3315 /// \param [out] InsInstrs is a vector of machine instructions and will
3316 /// contain the generated madd instruction
3317 /// \param IdxMulOpd is index of operand in Root that is the result of
3318 /// the F|MUL. In the example above IdxMulOpd is 1.
3319 /// \param MaddOpc the opcode fo the f|madd instruction
3320 static MachineInstr *
3321 genFusedMultiply(MachineFunction &MF, MachineRegisterInfo &MRI,
3322                  const TargetInstrInfo *TII, MachineInstr &Root,
3323                  SmallVectorImpl<MachineInstr *> &InsInstrs, unsigned IdxMulOpd,
3324                  unsigned MaddOpc, const TargetRegisterClass *RC,
3325                  FMAInstKind kind = FMAInstKind::Default) {
3326   assert(IdxMulOpd == 1 || IdxMulOpd == 2);
3327 
3328   unsigned IdxOtherOpd = IdxMulOpd == 1 ? 2 : 1;
3329   MachineInstr *MUL = MRI.getUniqueVRegDef(Root.getOperand(IdxMulOpd).getReg());
3330   unsigned ResultReg = Root.getOperand(0).getReg();
3331   unsigned SrcReg0 = MUL->getOperand(1).getReg();
3332   bool Src0IsKill = MUL->getOperand(1).isKill();
3333   unsigned SrcReg1 = MUL->getOperand(2).getReg();
3334   bool Src1IsKill = MUL->getOperand(2).isKill();
3335   unsigned SrcReg2 = Root.getOperand(IdxOtherOpd).getReg();
3336   bool Src2IsKill = Root.getOperand(IdxOtherOpd).isKill();
3337 
3338   if (TargetRegisterInfo::isVirtualRegister(ResultReg))
3339     MRI.constrainRegClass(ResultReg, RC);
3340   if (TargetRegisterInfo::isVirtualRegister(SrcReg0))
3341     MRI.constrainRegClass(SrcReg0, RC);
3342   if (TargetRegisterInfo::isVirtualRegister(SrcReg1))
3343     MRI.constrainRegClass(SrcReg1, RC);
3344   if (TargetRegisterInfo::isVirtualRegister(SrcReg2))
3345     MRI.constrainRegClass(SrcReg2, RC);
3346 
3347   MachineInstrBuilder MIB;
3348   if (kind == FMAInstKind::Default)
3349     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3350               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3351               .addReg(SrcReg1, getKillRegState(Src1IsKill))
3352               .addReg(SrcReg2, getKillRegState(Src2IsKill));
3353   else if (kind == FMAInstKind::Indexed)
3354     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3355               .addReg(SrcReg2, getKillRegState(Src2IsKill))
3356               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3357               .addReg(SrcReg1, getKillRegState(Src1IsKill))
3358               .addImm(MUL->getOperand(3).getImm());
3359   else if (kind == FMAInstKind::Accumulator)
3360     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3361               .addReg(SrcReg2, getKillRegState(Src2IsKill))
3362               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3363               .addReg(SrcReg1, getKillRegState(Src1IsKill));
3364   else
3365     assert(false && "Invalid FMA instruction kind \n");
3366   // Insert the MADD (MADD, FMA, FMS, FMLA, FMSL)
3367   InsInstrs.push_back(MIB);
3368   return MUL;
3369 }
3370 
3371 /// genMaddR - Generate madd instruction and combine mul and add using
3372 /// an extra virtual register
3373 /// Example - an ADD intermediate needs to be stored in a register:
3374 ///   MUL I=A,B,0
3375 ///   ADD R,I,Imm
3376 ///   ==> ORR  V, ZR, Imm
3377 ///   ==> MADD R,A,B,V
3378 /// \param Root is the ADD instruction
3379 /// \param [out] InsInstrs is a vector of machine instructions and will
3380 /// contain the generated madd instruction
3381 /// \param IdxMulOpd is index of operand in Root that is the result of
3382 /// the MUL. In the example above IdxMulOpd is 1.
3383 /// \param MaddOpc the opcode fo the madd instruction
3384 /// \param VR is a virtual register that holds the value of an ADD operand
3385 /// (V in the example above).
3386 static MachineInstr *genMaddR(MachineFunction &MF, MachineRegisterInfo &MRI,
3387                               const TargetInstrInfo *TII, MachineInstr &Root,
3388                               SmallVectorImpl<MachineInstr *> &InsInstrs,
3389                               unsigned IdxMulOpd, unsigned MaddOpc,
3390                               unsigned VR, const TargetRegisterClass *RC) {
3391   assert(IdxMulOpd == 1 || IdxMulOpd == 2);
3392 
3393   MachineInstr *MUL = MRI.getUniqueVRegDef(Root.getOperand(IdxMulOpd).getReg());
3394   unsigned ResultReg = Root.getOperand(0).getReg();
3395   unsigned SrcReg0 = MUL->getOperand(1).getReg();
3396   bool Src0IsKill = MUL->getOperand(1).isKill();
3397   unsigned SrcReg1 = MUL->getOperand(2).getReg();
3398   bool Src1IsKill = MUL->getOperand(2).isKill();
3399 
3400   if (TargetRegisterInfo::isVirtualRegister(ResultReg))
3401     MRI.constrainRegClass(ResultReg, RC);
3402   if (TargetRegisterInfo::isVirtualRegister(SrcReg0))
3403     MRI.constrainRegClass(SrcReg0, RC);
3404   if (TargetRegisterInfo::isVirtualRegister(SrcReg1))
3405     MRI.constrainRegClass(SrcReg1, RC);
3406   if (TargetRegisterInfo::isVirtualRegister(VR))
3407     MRI.constrainRegClass(VR, RC);
3408 
3409   MachineInstrBuilder MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc),
3410                                     ResultReg)
3411                                 .addReg(SrcReg0, getKillRegState(Src0IsKill))
3412                                 .addReg(SrcReg1, getKillRegState(Src1IsKill))
3413                                 .addReg(VR);
3414   // Insert the MADD
3415   InsInstrs.push_back(MIB);
3416   return MUL;
3417 }
3418 
3419 /// When getMachineCombinerPatterns() finds potential patterns,
3420 /// this function generates the instructions that could replace the
3421 /// original code sequence
3422 void AArch64InstrInfo::genAlternativeCodeSequence(
3423     MachineInstr &Root, MachineCombinerPattern Pattern,
3424     SmallVectorImpl<MachineInstr *> &InsInstrs,
3425     SmallVectorImpl<MachineInstr *> &DelInstrs,
3426     DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) const {
3427   MachineBasicBlock &MBB = *Root.getParent();
3428   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
3429   MachineFunction &MF = *MBB.getParent();
3430   const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
3431 
3432   MachineInstr *MUL;
3433   const TargetRegisterClass *RC;
3434   unsigned Opc;
3435   switch (Pattern) {
3436   default:
3437     // Reassociate instructions.
3438     TargetInstrInfo::genAlternativeCodeSequence(Root, Pattern, InsInstrs,
3439                                                 DelInstrs, InstrIdxForVirtReg);
3440     return;
3441   case MachineCombinerPattern::MULADDW_OP1:
3442   case MachineCombinerPattern::MULADDX_OP1:
3443     // MUL I=A,B,0
3444     // ADD R,I,C
3445     // ==> MADD R,A,B,C
3446     // --- Create(MADD);
3447     if (Pattern == MachineCombinerPattern::MULADDW_OP1) {
3448       Opc = AArch64::MADDWrrr;
3449       RC = &AArch64::GPR32RegClass;
3450     } else {
3451       Opc = AArch64::MADDXrrr;
3452       RC = &AArch64::GPR64RegClass;
3453     }
3454     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
3455     break;
3456   case MachineCombinerPattern::MULADDW_OP2:
3457   case MachineCombinerPattern::MULADDX_OP2:
3458     // MUL I=A,B,0
3459     // ADD R,C,I
3460     // ==> MADD R,A,B,C
3461     // --- Create(MADD);
3462     if (Pattern == MachineCombinerPattern::MULADDW_OP2) {
3463       Opc = AArch64::MADDWrrr;
3464       RC = &AArch64::GPR32RegClass;
3465     } else {
3466       Opc = AArch64::MADDXrrr;
3467       RC = &AArch64::GPR64RegClass;
3468     }
3469     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3470     break;
3471   case MachineCombinerPattern::MULADDWI_OP1:
3472   case MachineCombinerPattern::MULADDXI_OP1: {
3473     // MUL I=A,B,0
3474     // ADD R,I,Imm
3475     // ==> ORR  V, ZR, Imm
3476     // ==> MADD R,A,B,V
3477     // --- Create(MADD);
3478     const TargetRegisterClass *OrrRC;
3479     unsigned BitSize, OrrOpc, ZeroReg;
3480     if (Pattern == MachineCombinerPattern::MULADDWI_OP1) {
3481       OrrOpc = AArch64::ORRWri;
3482       OrrRC = &AArch64::GPR32spRegClass;
3483       BitSize = 32;
3484       ZeroReg = AArch64::WZR;
3485       Opc = AArch64::MADDWrrr;
3486       RC = &AArch64::GPR32RegClass;
3487     } else {
3488       OrrOpc = AArch64::ORRXri;
3489       OrrRC = &AArch64::GPR64spRegClass;
3490       BitSize = 64;
3491       ZeroReg = AArch64::XZR;
3492       Opc = AArch64::MADDXrrr;
3493       RC = &AArch64::GPR64RegClass;
3494     }
3495     unsigned NewVR = MRI.createVirtualRegister(OrrRC);
3496     uint64_t Imm = Root.getOperand(2).getImm();
3497 
3498     if (Root.getOperand(3).isImm()) {
3499       unsigned Val = Root.getOperand(3).getImm();
3500       Imm = Imm << Val;
3501     }
3502     uint64_t UImm = SignExtend64(Imm, BitSize);
3503     uint64_t Encoding;
3504     if (AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
3505       MachineInstrBuilder MIB1 =
3506           BuildMI(MF, Root.getDebugLoc(), TII->get(OrrOpc), NewVR)
3507               .addReg(ZeroReg)
3508               .addImm(Encoding);
3509       InsInstrs.push_back(MIB1);
3510       InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3511       MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3512     }
3513     break;
3514   }
3515   case MachineCombinerPattern::MULSUBW_OP1:
3516   case MachineCombinerPattern::MULSUBX_OP1: {
3517     // MUL I=A,B,0
3518     // SUB R,I, C
3519     // ==> SUB  V, 0, C
3520     // ==> MADD R,A,B,V // = -C + A*B
3521     // --- Create(MADD);
3522     const TargetRegisterClass *SubRC;
3523     unsigned SubOpc, ZeroReg;
3524     if (Pattern == MachineCombinerPattern::MULSUBW_OP1) {
3525       SubOpc = AArch64::SUBWrr;
3526       SubRC = &AArch64::GPR32spRegClass;
3527       ZeroReg = AArch64::WZR;
3528       Opc = AArch64::MADDWrrr;
3529       RC = &AArch64::GPR32RegClass;
3530     } else {
3531       SubOpc = AArch64::SUBXrr;
3532       SubRC = &AArch64::GPR64spRegClass;
3533       ZeroReg = AArch64::XZR;
3534       Opc = AArch64::MADDXrrr;
3535       RC = &AArch64::GPR64RegClass;
3536     }
3537     unsigned NewVR = MRI.createVirtualRegister(SubRC);
3538     // SUB NewVR, 0, C
3539     MachineInstrBuilder MIB1 =
3540         BuildMI(MF, Root.getDebugLoc(), TII->get(SubOpc), NewVR)
3541             .addReg(ZeroReg)
3542             .addOperand(Root.getOperand(2));
3543     InsInstrs.push_back(MIB1);
3544     InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3545     MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3546     break;
3547   }
3548   case MachineCombinerPattern::MULSUBW_OP2:
3549   case MachineCombinerPattern::MULSUBX_OP2:
3550     // MUL I=A,B,0
3551     // SUB R,C,I
3552     // ==> MSUB R,A,B,C (computes C - A*B)
3553     // --- Create(MSUB);
3554     if (Pattern == MachineCombinerPattern::MULSUBW_OP2) {
3555       Opc = AArch64::MSUBWrrr;
3556       RC = &AArch64::GPR32RegClass;
3557     } else {
3558       Opc = AArch64::MSUBXrrr;
3559       RC = &AArch64::GPR64RegClass;
3560     }
3561     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3562     break;
3563   case MachineCombinerPattern::MULSUBWI_OP1:
3564   case MachineCombinerPattern::MULSUBXI_OP1: {
3565     // MUL I=A,B,0
3566     // SUB R,I, Imm
3567     // ==> ORR  V, ZR, -Imm
3568     // ==> MADD R,A,B,V // = -Imm + A*B
3569     // --- Create(MADD);
3570     const TargetRegisterClass *OrrRC;
3571     unsigned BitSize, OrrOpc, ZeroReg;
3572     if (Pattern == MachineCombinerPattern::MULSUBWI_OP1) {
3573       OrrOpc = AArch64::ORRWri;
3574       OrrRC = &AArch64::GPR32spRegClass;
3575       BitSize = 32;
3576       ZeroReg = AArch64::WZR;
3577       Opc = AArch64::MADDWrrr;
3578       RC = &AArch64::GPR32RegClass;
3579     } else {
3580       OrrOpc = AArch64::ORRXri;
3581       OrrRC = &AArch64::GPR64spRegClass;
3582       BitSize = 64;
3583       ZeroReg = AArch64::XZR;
3584       Opc = AArch64::MADDXrrr;
3585       RC = &AArch64::GPR64RegClass;
3586     }
3587     unsigned NewVR = MRI.createVirtualRegister(OrrRC);
3588     uint64_t Imm = Root.getOperand(2).getImm();
3589     if (Root.getOperand(3).isImm()) {
3590       unsigned Val = Root.getOperand(3).getImm();
3591       Imm = Imm << Val;
3592     }
3593     uint64_t UImm = SignExtend64(-Imm, BitSize);
3594     uint64_t Encoding;
3595     if (AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
3596       MachineInstrBuilder MIB1 =
3597           BuildMI(MF, Root.getDebugLoc(), TII->get(OrrOpc), NewVR)
3598               .addReg(ZeroReg)
3599               .addImm(Encoding);
3600       InsInstrs.push_back(MIB1);
3601       InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3602       MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3603     }
3604     break;
3605   }
3606   // Floating Point Support
3607   case MachineCombinerPattern::FMULADDS_OP1:
3608   case MachineCombinerPattern::FMULADDD_OP1:
3609     // MUL I=A,B,0
3610     // ADD R,I,C
3611     // ==> MADD R,A,B,C
3612     // --- Create(MADD);
3613     if (Pattern == MachineCombinerPattern::FMULADDS_OP1) {
3614       Opc = AArch64::FMADDSrrr;
3615       RC = &AArch64::FPR32RegClass;
3616     } else {
3617       Opc = AArch64::FMADDDrrr;
3618       RC = &AArch64::FPR64RegClass;
3619     }
3620     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
3621     break;
3622   case MachineCombinerPattern::FMULADDS_OP2:
3623   case MachineCombinerPattern::FMULADDD_OP2:
3624     // FMUL I=A,B,0
3625     // FADD R,C,I
3626     // ==> FMADD R,A,B,C
3627     // --- Create(FMADD);
3628     if (Pattern == MachineCombinerPattern::FMULADDS_OP2) {
3629       Opc = AArch64::FMADDSrrr;
3630       RC = &AArch64::FPR32RegClass;
3631     } else {
3632       Opc = AArch64::FMADDDrrr;
3633       RC = &AArch64::FPR64RegClass;
3634     }
3635     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3636     break;
3637 
3638   case MachineCombinerPattern::FMLAv1i32_indexed_OP1:
3639     Opc = AArch64::FMLAv1i32_indexed;
3640     RC = &AArch64::FPR32RegClass;
3641     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3642                            FMAInstKind::Indexed);
3643     break;
3644   case MachineCombinerPattern::FMLAv1i32_indexed_OP2:
3645     Opc = AArch64::FMLAv1i32_indexed;
3646     RC = &AArch64::FPR32RegClass;
3647     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3648                            FMAInstKind::Indexed);
3649     break;
3650 
3651   case MachineCombinerPattern::FMLAv1i64_indexed_OP1:
3652     Opc = AArch64::FMLAv1i64_indexed;
3653     RC = &AArch64::FPR64RegClass;
3654     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3655                            FMAInstKind::Indexed);
3656     break;
3657   case MachineCombinerPattern::FMLAv1i64_indexed_OP2:
3658     Opc = AArch64::FMLAv1i64_indexed;
3659     RC = &AArch64::FPR64RegClass;
3660     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3661                            FMAInstKind::Indexed);
3662     break;
3663 
3664   case MachineCombinerPattern::FMLAv2i32_indexed_OP1:
3665   case MachineCombinerPattern::FMLAv2f32_OP1:
3666     RC = &AArch64::FPR64RegClass;
3667     if (Pattern == MachineCombinerPattern::FMLAv2i32_indexed_OP1) {
3668       Opc = AArch64::FMLAv2i32_indexed;
3669       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3670                              FMAInstKind::Indexed);
3671     } else {
3672       Opc = AArch64::FMLAv2f32;
3673       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3674                              FMAInstKind::Accumulator);
3675     }
3676     break;
3677   case MachineCombinerPattern::FMLAv2i32_indexed_OP2:
3678   case MachineCombinerPattern::FMLAv2f32_OP2:
3679     RC = &AArch64::FPR64RegClass;
3680     if (Pattern == MachineCombinerPattern::FMLAv2i32_indexed_OP2) {
3681       Opc = AArch64::FMLAv2i32_indexed;
3682       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3683                              FMAInstKind::Indexed);
3684     } else {
3685       Opc = AArch64::FMLAv2f32;
3686       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3687                              FMAInstKind::Accumulator);
3688     }
3689     break;
3690 
3691   case MachineCombinerPattern::FMLAv2i64_indexed_OP1:
3692   case MachineCombinerPattern::FMLAv2f64_OP1:
3693     RC = &AArch64::FPR128RegClass;
3694     if (Pattern == MachineCombinerPattern::FMLAv2i64_indexed_OP1) {
3695       Opc = AArch64::FMLAv2i64_indexed;
3696       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3697                              FMAInstKind::Indexed);
3698     } else {
3699       Opc = AArch64::FMLAv2f64;
3700       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3701                              FMAInstKind::Accumulator);
3702     }
3703     break;
3704   case MachineCombinerPattern::FMLAv2i64_indexed_OP2:
3705   case MachineCombinerPattern::FMLAv2f64_OP2:
3706     RC = &AArch64::FPR128RegClass;
3707     if (Pattern == MachineCombinerPattern::FMLAv2i64_indexed_OP2) {
3708       Opc = AArch64::FMLAv2i64_indexed;
3709       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3710                              FMAInstKind::Indexed);
3711     } else {
3712       Opc = AArch64::FMLAv2f64;
3713       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3714                              FMAInstKind::Accumulator);
3715     }
3716     break;
3717 
3718   case MachineCombinerPattern::FMLAv4i32_indexed_OP1:
3719   case MachineCombinerPattern::FMLAv4f32_OP1:
3720     RC = &AArch64::FPR128RegClass;
3721     if (Pattern == MachineCombinerPattern::FMLAv4i32_indexed_OP1) {
3722       Opc = AArch64::FMLAv4i32_indexed;
3723       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3724                              FMAInstKind::Indexed);
3725     } else {
3726       Opc = AArch64::FMLAv4f32;
3727       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
3728                              FMAInstKind::Accumulator);
3729     }
3730     break;
3731 
3732   case MachineCombinerPattern::FMLAv4i32_indexed_OP2:
3733   case MachineCombinerPattern::FMLAv4f32_OP2:
3734     RC = &AArch64::FPR128RegClass;
3735     if (Pattern == MachineCombinerPattern::FMLAv4i32_indexed_OP2) {
3736       Opc = AArch64::FMLAv4i32_indexed;
3737       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3738                              FMAInstKind::Indexed);
3739     } else {
3740       Opc = AArch64::FMLAv4f32;
3741       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3742                              FMAInstKind::Accumulator);
3743     }
3744     break;
3745 
3746   case MachineCombinerPattern::FMULSUBS_OP1:
3747   case MachineCombinerPattern::FMULSUBD_OP1: {
3748     // FMUL I=A,B,0
3749     // FSUB R,I,C
3750     // ==> FNMSUB R,A,B,C // = -C + A*B
3751     // --- Create(FNMSUB);
3752     if (Pattern == MachineCombinerPattern::FMULSUBS_OP1) {
3753       Opc = AArch64::FNMSUBSrrr;
3754       RC = &AArch64::FPR32RegClass;
3755     } else {
3756       Opc = AArch64::FNMSUBDrrr;
3757       RC = &AArch64::FPR64RegClass;
3758     }
3759     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
3760     break;
3761   }
3762   case MachineCombinerPattern::FMULSUBS_OP2:
3763   case MachineCombinerPattern::FMULSUBD_OP2: {
3764     // FMUL I=A,B,0
3765     // FSUB R,C,I
3766     // ==> FMSUB R,A,B,C (computes C - A*B)
3767     // --- Create(FMSUB);
3768     if (Pattern == MachineCombinerPattern::FMULSUBS_OP2) {
3769       Opc = AArch64::FMSUBSrrr;
3770       RC = &AArch64::FPR32RegClass;
3771     } else {
3772       Opc = AArch64::FMSUBDrrr;
3773       RC = &AArch64::FPR64RegClass;
3774     }
3775     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3776     break;
3777 
3778   case MachineCombinerPattern::FMLSv1i32_indexed_OP2:
3779     Opc = AArch64::FMLSv1i32_indexed;
3780     RC = &AArch64::FPR32RegClass;
3781     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3782                            FMAInstKind::Indexed);
3783     break;
3784 
3785   case MachineCombinerPattern::FMLSv1i64_indexed_OP2:
3786     Opc = AArch64::FMLSv1i64_indexed;
3787     RC = &AArch64::FPR64RegClass;
3788     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3789                            FMAInstKind::Indexed);
3790     break;
3791 
3792   case MachineCombinerPattern::FMLSv2f32_OP2:
3793   case MachineCombinerPattern::FMLSv2i32_indexed_OP2:
3794     RC = &AArch64::FPR64RegClass;
3795     if (Pattern == MachineCombinerPattern::FMLSv2i32_indexed_OP2) {
3796       Opc = AArch64::FMLSv2i32_indexed;
3797       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3798                              FMAInstKind::Indexed);
3799     } else {
3800       Opc = AArch64::FMLSv2f32;
3801       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3802                              FMAInstKind::Accumulator);
3803     }
3804     break;
3805 
3806   case MachineCombinerPattern::FMLSv2f64_OP2:
3807   case MachineCombinerPattern::FMLSv2i64_indexed_OP2:
3808     RC = &AArch64::FPR128RegClass;
3809     if (Pattern == MachineCombinerPattern::FMLSv2i64_indexed_OP2) {
3810       Opc = AArch64::FMLSv2i64_indexed;
3811       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3812                              FMAInstKind::Indexed);
3813     } else {
3814       Opc = AArch64::FMLSv2f64;
3815       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3816                              FMAInstKind::Accumulator);
3817     }
3818     break;
3819 
3820   case MachineCombinerPattern::FMLSv4f32_OP2:
3821   case MachineCombinerPattern::FMLSv4i32_indexed_OP2:
3822     RC = &AArch64::FPR128RegClass;
3823     if (Pattern == MachineCombinerPattern::FMLSv4i32_indexed_OP2) {
3824       Opc = AArch64::FMLSv4i32_indexed;
3825       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3826                              FMAInstKind::Indexed);
3827     } else {
3828       Opc = AArch64::FMLSv4f32;
3829       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
3830                              FMAInstKind::Accumulator);
3831     }
3832     break;
3833   }
3834   } // end switch (Pattern)
3835   // Record MUL and ADD/SUB for deletion
3836   DelInstrs.push_back(MUL);
3837   DelInstrs.push_back(&Root);
3838 
3839   return;
3840 }
3841 
3842 /// \brief Replace csincr-branch sequence by simple conditional branch
3843 ///
3844 /// Examples:
3845 /// 1.
3846 ///   csinc  w9, wzr, wzr, <condition code>
3847 ///   tbnz   w9, #0, 0x44
3848 /// to
3849 ///   b.<inverted condition code>
3850 ///
3851 /// 2.
3852 ///   csinc w9, wzr, wzr, <condition code>
3853 ///   tbz   w9, #0, 0x44
3854 /// to
3855 ///   b.<condition code>
3856 ///
3857 /// Replace compare and branch sequence by TBZ/TBNZ instruction when the
3858 /// compare's constant operand is power of 2.
3859 ///
3860 /// Examples:
3861 ///   and  w8, w8, #0x400
3862 ///   cbnz w8, L1
3863 /// to
3864 ///   tbnz w8, #10, L1
3865 ///
3866 /// \param  MI Conditional Branch
3867 /// \return True when the simple conditional branch is generated
3868 ///
3869 bool AArch64InstrInfo::optimizeCondBranch(MachineInstr &MI) const {
3870   bool IsNegativeBranch = false;
3871   bool IsTestAndBranch = false;
3872   unsigned TargetBBInMI = 0;
3873   switch (MI.getOpcode()) {
3874   default:
3875     llvm_unreachable("Unknown branch instruction?");
3876   case AArch64::Bcc:
3877     return false;
3878   case AArch64::CBZW:
3879   case AArch64::CBZX:
3880     TargetBBInMI = 1;
3881     break;
3882   case AArch64::CBNZW:
3883   case AArch64::CBNZX:
3884     TargetBBInMI = 1;
3885     IsNegativeBranch = true;
3886     break;
3887   case AArch64::TBZW:
3888   case AArch64::TBZX:
3889     TargetBBInMI = 2;
3890     IsTestAndBranch = true;
3891     break;
3892   case AArch64::TBNZW:
3893   case AArch64::TBNZX:
3894     TargetBBInMI = 2;
3895     IsNegativeBranch = true;
3896     IsTestAndBranch = true;
3897     break;
3898   }
3899   // So we increment a zero register and test for bits other
3900   // than bit 0? Conservatively bail out in case the verifier
3901   // missed this case.
3902   if (IsTestAndBranch && MI.getOperand(1).getImm())
3903     return false;
3904 
3905   // Find Definition.
3906   assert(MI.getParent() && "Incomplete machine instruciton\n");
3907   MachineBasicBlock *MBB = MI.getParent();
3908   MachineFunction *MF = MBB->getParent();
3909   MachineRegisterInfo *MRI = &MF->getRegInfo();
3910   unsigned VReg = MI.getOperand(0).getReg();
3911   if (!TargetRegisterInfo::isVirtualRegister(VReg))
3912     return false;
3913 
3914   MachineInstr *DefMI = MRI->getVRegDef(VReg);
3915 
3916   // Look through COPY instructions to find definition.
3917   while (DefMI->isCopy()) {
3918     unsigned CopyVReg = DefMI->getOperand(1).getReg();
3919     if (!MRI->hasOneNonDBGUse(CopyVReg))
3920       return false;
3921     if (!MRI->hasOneDef(CopyVReg))
3922       return false;
3923     DefMI = MRI->getVRegDef(CopyVReg);
3924   }
3925 
3926   switch (DefMI->getOpcode()) {
3927   default:
3928     return false;
3929   // Fold AND into a TBZ/TBNZ if constant operand is power of 2.
3930   case AArch64::ANDWri:
3931   case AArch64::ANDXri: {
3932     if (IsTestAndBranch)
3933       return false;
3934     if (DefMI->getParent() != MBB)
3935       return false;
3936     if (!MRI->hasOneNonDBGUse(VReg))
3937       return false;
3938 
3939     bool Is32Bit = (DefMI->getOpcode() == AArch64::ANDWri);
3940     uint64_t Mask = AArch64_AM::decodeLogicalImmediate(
3941         DefMI->getOperand(2).getImm(), Is32Bit ? 32 : 64);
3942     if (!isPowerOf2_64(Mask))
3943       return false;
3944 
3945     MachineOperand &MO = DefMI->getOperand(1);
3946     unsigned NewReg = MO.getReg();
3947     if (!TargetRegisterInfo::isVirtualRegister(NewReg))
3948       return false;
3949 
3950     assert(!MRI->def_empty(NewReg) && "Register must be defined.");
3951 
3952     MachineBasicBlock &RefToMBB = *MBB;
3953     MachineBasicBlock *TBB = MI.getOperand(1).getMBB();
3954     DebugLoc DL = MI.getDebugLoc();
3955     unsigned Imm = Log2_64(Mask);
3956     unsigned Opc = (Imm < 32)
3957                        ? (IsNegativeBranch ? AArch64::TBNZW : AArch64::TBZW)
3958                        : (IsNegativeBranch ? AArch64::TBNZX : AArch64::TBZX);
3959     MachineInstr *NewMI = BuildMI(RefToMBB, MI, DL, get(Opc))
3960                               .addReg(NewReg)
3961                               .addImm(Imm)
3962                               .addMBB(TBB);
3963     // Register lives on to the CBZ now.
3964     MO.setIsKill(false);
3965 
3966     // For immediate smaller than 32, we need to use the 32-bit
3967     // variant (W) in all cases. Indeed the 64-bit variant does not
3968     // allow to encode them.
3969     // Therefore, if the input register is 64-bit, we need to take the
3970     // 32-bit sub-part.
3971     if (!Is32Bit && Imm < 32)
3972       NewMI->getOperand(0).setSubReg(AArch64::sub_32);
3973     MI.eraseFromParent();
3974     return true;
3975   }
3976   // Look for CSINC
3977   case AArch64::CSINCWr:
3978   case AArch64::CSINCXr: {
3979     if (!(DefMI->getOperand(1).getReg() == AArch64::WZR &&
3980           DefMI->getOperand(2).getReg() == AArch64::WZR) &&
3981         !(DefMI->getOperand(1).getReg() == AArch64::XZR &&
3982           DefMI->getOperand(2).getReg() == AArch64::XZR))
3983       return false;
3984 
3985     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) != -1)
3986       return false;
3987 
3988     AArch64CC::CondCode CC = (AArch64CC::CondCode)DefMI->getOperand(3).getImm();
3989     // Convert only when the condition code is not modified between
3990     // the CSINC and the branch. The CC may be used by other
3991     // instructions in between.
3992     if (areCFlagsAccessedBetweenInstrs(DefMI, MI, &getRegisterInfo(), AK_Write))
3993       return false;
3994     MachineBasicBlock &RefToMBB = *MBB;
3995     MachineBasicBlock *TBB = MI.getOperand(TargetBBInMI).getMBB();
3996     DebugLoc DL = MI.getDebugLoc();
3997     if (IsNegativeBranch)
3998       CC = AArch64CC::getInvertedCondCode(CC);
3999     BuildMI(RefToMBB, MI, DL, get(AArch64::Bcc)).addImm(CC).addMBB(TBB);
4000     MI.eraseFromParent();
4001     return true;
4002   }
4003   }
4004 }
4005 
4006 std::pair<unsigned, unsigned>
4007 AArch64InstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF) const {
4008   const unsigned Mask = AArch64II::MO_FRAGMENT;
4009   return std::make_pair(TF & Mask, TF & ~Mask);
4010 }
4011 
4012 ArrayRef<std::pair<unsigned, const char *>>
4013 AArch64InstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
4014   using namespace AArch64II;
4015   static const std::pair<unsigned, const char *> TargetFlags[] = {
4016       {MO_PAGE, "aarch64-page"},
4017       {MO_PAGEOFF, "aarch64-pageoff"},
4018       {MO_G3, "aarch64-g3"},
4019       {MO_G2, "aarch64-g2"},
4020       {MO_G1, "aarch64-g1"},
4021       {MO_G0, "aarch64-g0"},
4022       {MO_HI12, "aarch64-hi12"}};
4023   return makeArrayRef(TargetFlags);
4024 }
4025 
4026 ArrayRef<std::pair<unsigned, const char *>>
4027 AArch64InstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {
4028   using namespace AArch64II;
4029   static const std::pair<unsigned, const char *> TargetFlags[] = {
4030       {MO_GOT, "aarch64-got"},
4031       {MO_NC, "aarch64-nc"},
4032       {MO_TLS, "aarch64-tls"}};
4033   return makeArrayRef(TargetFlags);
4034 }
4035