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