ARM64: Combine shifts and uses from different basic block to bit-extract instruction
[oota-llvm.git] / lib / Target / ARM64 / ARM64ISelDAGToDAG.cpp
1 //===-- ARM64ISelDAGToDAG.cpp - A dag to dag inst selector for ARM64 ------===//
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 defines an instruction selector for the ARM64 target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "arm64-isel"
15 #include "ARM64TargetMachine.h"
16 #include "MCTargetDesc/ARM64AddressingModes.h"
17 #include "llvm/ADT/APSInt.h"
18 #include "llvm/CodeGen/SelectionDAGISel.h"
19 #include "llvm/IR/Function.h" // To access function attributes.
20 #include "llvm/IR/GlobalValue.h"
21 #include "llvm/IR/Intrinsics.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/MathExtras.h"
25 #include "llvm/Support/raw_ostream.h"
26
27 using namespace llvm;
28
29 //===--------------------------------------------------------------------===//
30 /// ARM64DAGToDAGISel - ARM64 specific code to select ARM64 machine
31 /// instructions for SelectionDAG operations.
32 ///
33 namespace {
34
35 class ARM64DAGToDAGISel : public SelectionDAGISel {
36   ARM64TargetMachine &TM;
37
38   /// Subtarget - Keep a pointer to the ARM64Subtarget around so that we can
39   /// make the right decision when generating code for different targets.
40   const ARM64Subtarget *Subtarget;
41
42   bool ForCodeSize;
43
44 public:
45   explicit ARM64DAGToDAGISel(ARM64TargetMachine &tm, CodeGenOpt::Level OptLevel)
46       : SelectionDAGISel(tm, OptLevel), TM(tm),
47         Subtarget(&TM.getSubtarget<ARM64Subtarget>()), ForCodeSize(false) {}
48
49   virtual const char *getPassName() const {
50     return "ARM64 Instruction Selection";
51   }
52
53   virtual bool runOnMachineFunction(MachineFunction &MF) {
54     AttributeSet FnAttrs = MF.getFunction()->getAttributes();
55     ForCodeSize =
56         FnAttrs.hasAttribute(AttributeSet::FunctionIndex,
57                              Attribute::OptimizeForSize) ||
58         FnAttrs.hasAttribute(AttributeSet::FunctionIndex, Attribute::MinSize);
59     return SelectionDAGISel::runOnMachineFunction(MF);
60   }
61
62   SDNode *Select(SDNode *Node);
63
64   /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
65   /// inline asm expressions.
66   virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
67                                             char ConstraintCode,
68                                             std::vector<SDValue> &OutOps);
69
70   SDNode *SelectMLAV64LaneV128(SDNode *N);
71   SDNode *SelectMULLV64LaneV128(unsigned IntNo, SDNode *N);
72   bool SelectArithExtendedRegister(SDValue N, SDValue &Reg, SDValue &Shift);
73   bool SelectArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
74   bool SelectNegArithImmed(SDValue N, SDValue &Val, SDValue &Shift);
75   bool SelectArithShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
76     return SelectShiftedRegister(N, false, Reg, Shift);
77   }
78   bool SelectLogicalShiftedRegister(SDValue N, SDValue &Reg, SDValue &Shift) {
79     return SelectShiftedRegister(N, true, Reg, Shift);
80   }
81   bool SelectAddrModeIndexed8(SDValue N, SDValue &Base, SDValue &OffImm) {
82     return SelectAddrModeIndexed(N, 1, Base, OffImm);
83   }
84   bool SelectAddrModeIndexed16(SDValue N, SDValue &Base, SDValue &OffImm) {
85     return SelectAddrModeIndexed(N, 2, Base, OffImm);
86   }
87   bool SelectAddrModeIndexed32(SDValue N, SDValue &Base, SDValue &OffImm) {
88     return SelectAddrModeIndexed(N, 4, Base, OffImm);
89   }
90   bool SelectAddrModeIndexed64(SDValue N, SDValue &Base, SDValue &OffImm) {
91     return SelectAddrModeIndexed(N, 8, Base, OffImm);
92   }
93   bool SelectAddrModeIndexed128(SDValue N, SDValue &Base, SDValue &OffImm) {
94     return SelectAddrModeIndexed(N, 16, Base, OffImm);
95   }
96   bool SelectAddrModeUnscaled8(SDValue N, SDValue &Base, SDValue &OffImm) {
97     return SelectAddrModeUnscaled(N, 1, Base, OffImm);
98   }
99   bool SelectAddrModeUnscaled16(SDValue N, SDValue &Base, SDValue &OffImm) {
100     return SelectAddrModeUnscaled(N, 2, Base, OffImm);
101   }
102   bool SelectAddrModeUnscaled32(SDValue N, SDValue &Base, SDValue &OffImm) {
103     return SelectAddrModeUnscaled(N, 4, Base, OffImm);
104   }
105   bool SelectAddrModeUnscaled64(SDValue N, SDValue &Base, SDValue &OffImm) {
106     return SelectAddrModeUnscaled(N, 8, Base, OffImm);
107   }
108   bool SelectAddrModeUnscaled128(SDValue N, SDValue &Base, SDValue &OffImm) {
109     return SelectAddrModeUnscaled(N, 16, Base, OffImm);
110   }
111
112   bool SelectAddrModeRO8(SDValue N, SDValue &Base, SDValue &Offset,
113                          SDValue &Imm) {
114     return SelectAddrModeRO(N, 1, Base, Offset, Imm);
115   }
116   bool SelectAddrModeRO16(SDValue N, SDValue &Base, SDValue &Offset,
117                           SDValue &Imm) {
118     return SelectAddrModeRO(N, 2, Base, Offset, Imm);
119   }
120   bool SelectAddrModeRO32(SDValue N, SDValue &Base, SDValue &Offset,
121                           SDValue &Imm) {
122     return SelectAddrModeRO(N, 4, Base, Offset, Imm);
123   }
124   bool SelectAddrModeRO64(SDValue N, SDValue &Base, SDValue &Offset,
125                           SDValue &Imm) {
126     return SelectAddrModeRO(N, 8, Base, Offset, Imm);
127   }
128   bool SelectAddrModeRO128(SDValue N, SDValue &Base, SDValue &Offset,
129                            SDValue &Imm) {
130     return SelectAddrModeRO(N, 16, Base, Offset, Imm);
131   }
132   bool SelectAddrModeNoIndex(SDValue N, SDValue &Val);
133
134   /// Form sequences of consecutive 64/128-bit registers for use in NEON
135   /// instructions making use of a vector-list (e.g. ldN, tbl). Vecs must have
136   /// between 1 and 4 elements. If it contains a single element that is returned
137   /// unchanged; otherwise a REG_SEQUENCE value is returned.
138   SDValue createDTuple(ArrayRef<SDValue> Vecs);
139   SDValue createQTuple(ArrayRef<SDValue> Vecs);
140
141   /// Generic helper for the createDTuple/createQTuple
142   /// functions. Those should almost always be called instead.
143   SDValue createTuple(ArrayRef<SDValue> Vecs, unsigned RegClassIDs[],
144                       unsigned SubRegs[]);
145
146   SDNode *SelectTable(SDNode *N, unsigned NumVecs, unsigned Opc, bool isExt);
147
148   SDNode *SelectIndexedLoad(SDNode *N, bool &Done);
149
150   SDNode *SelectLoad(SDNode *N, unsigned NumVecs, unsigned Opc,
151                      unsigned SubRegIdx);
152   SDNode *SelectLoadLane(SDNode *N, unsigned NumVecs, unsigned Opc);
153
154   SDNode *SelectStore(SDNode *N, unsigned NumVecs, unsigned Opc);
155   SDNode *SelectStoreLane(SDNode *N, unsigned NumVecs, unsigned Opc);
156
157   SDNode *SelectSIMDAddSubNarrowing(unsigned IntNo, SDNode *Node);
158   SDNode *SelectSIMDXtnNarrowing(unsigned IntNo, SDNode *Node);
159
160   SDNode *SelectBitfieldExtractOp(SDNode *N);
161   SDNode *SelectBitfieldInsertOp(SDNode *N);
162
163   SDNode *SelectLIBM(SDNode *N);
164
165 // Include the pieces autogenerated from the target description.
166 #include "ARM64GenDAGISel.inc"
167
168 private:
169   bool SelectShiftedRegister(SDValue N, bool AllowROR, SDValue &Reg,
170                              SDValue &Shift);
171   bool SelectAddrModeIndexed(SDValue N, unsigned Size, SDValue &Base,
172                              SDValue &OffImm);
173   bool SelectAddrModeUnscaled(SDValue N, unsigned Size, SDValue &Base,
174                               SDValue &OffImm);
175   bool SelectAddrModeRO(SDValue N, unsigned Size, SDValue &Base,
176                         SDValue &Offset, SDValue &Imm);
177   bool isWorthFolding(SDValue V) const;
178   bool SelectExtendedSHL(SDValue N, unsigned Size, SDValue &Offset,
179                          SDValue &Imm);
180
181   template<unsigned RegWidth>
182   bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos) {
183     return SelectCVTFixedPosOperand(N, FixedPos, RegWidth);
184   }
185
186   bool SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos, unsigned Width);
187 };
188 } // end anonymous namespace
189
190 /// isIntImmediate - This method tests to see if the node is a constant
191 /// operand. If so Imm will receive the 32-bit value.
192 static bool isIntImmediate(const SDNode *N, uint64_t &Imm) {
193   if (const ConstantSDNode *C = dyn_cast<const ConstantSDNode>(N)) {
194     Imm = C->getZExtValue();
195     return true;
196   }
197   return false;
198 }
199
200 // isIntImmediate - This method tests to see if a constant operand.
201 // If so Imm will receive the value.
202 static bool isIntImmediate(SDValue N, uint64_t &Imm) {
203   return isIntImmediate(N.getNode(), Imm);
204 }
205
206 // isOpcWithIntImmediate - This method tests to see if the node is a specific
207 // opcode and that it has a immediate integer right operand.
208 // If so Imm will receive the 32 bit value.
209 static bool isOpcWithIntImmediate(const SDNode *N, unsigned Opc,
210                                   uint64_t &Imm) {
211   return N->getOpcode() == Opc &&
212          isIntImmediate(N->getOperand(1).getNode(), Imm);
213 }
214
215 bool ARM64DAGToDAGISel::SelectAddrModeNoIndex(SDValue N, SDValue &Val) {
216   EVT ValTy = N.getValueType();
217   if (ValTy != MVT::i64)
218     return false;
219   Val = N;
220   return true;
221 }
222
223 bool ARM64DAGToDAGISel::SelectInlineAsmMemoryOperand(
224     const SDValue &Op, char ConstraintCode, std::vector<SDValue> &OutOps) {
225   assert(ConstraintCode == 'm' && "unexpected asm memory constraint");
226   // Require the address to be in a register.  That is safe for all ARM64
227   // variants and it is hard to do anything much smarter without knowing
228   // how the operand is used.
229   OutOps.push_back(Op);
230   return false;
231 }
232
233 /// SelectArithImmed - Select an immediate value that can be represented as
234 /// a 12-bit value shifted left by either 0 or 12.  If so, return true with
235 /// Val set to the 12-bit value and Shift set to the shifter operand.
236 bool ARM64DAGToDAGISel::SelectArithImmed(SDValue N, SDValue &Val,
237                                          SDValue &Shift) {
238   // This function is called from the addsub_shifted_imm ComplexPattern,
239   // which lists [imm] as the list of opcode it's interested in, however
240   // we still need to check whether the operand is actually an immediate
241   // here because the ComplexPattern opcode list is only used in
242   // root-level opcode matching.
243   if (!isa<ConstantSDNode>(N.getNode()))
244     return false;
245
246   uint64_t Immed = cast<ConstantSDNode>(N.getNode())->getZExtValue();
247   unsigned ShiftAmt;
248
249   if (Immed >> 12 == 0) {
250     ShiftAmt = 0;
251   } else if ((Immed & 0xfff) == 0 && Immed >> 24 == 0) {
252     ShiftAmt = 12;
253     Immed = Immed >> 12;
254   } else
255     return false;
256
257   unsigned ShVal = ARM64_AM::getShifterImm(ARM64_AM::LSL, ShiftAmt);
258   Val = CurDAG->getTargetConstant(Immed, MVT::i32);
259   Shift = CurDAG->getTargetConstant(ShVal, MVT::i32);
260   return true;
261 }
262
263 /// SelectNegArithImmed - As above, but negates the value before trying to
264 /// select it.
265 bool ARM64DAGToDAGISel::SelectNegArithImmed(SDValue N, SDValue &Val,
266                                             SDValue &Shift) {
267   // This function is called from the addsub_shifted_imm ComplexPattern,
268   // which lists [imm] as the list of opcode it's interested in, however
269   // we still need to check whether the operand is actually an immediate
270   // here because the ComplexPattern opcode list is only used in
271   // root-level opcode matching.
272   if (!isa<ConstantSDNode>(N.getNode()))
273     return false;
274
275   // The immediate operand must be a 24-bit zero-extended immediate.
276   uint64_t Immed = cast<ConstantSDNode>(N.getNode())->getZExtValue();
277
278   // This negation is almost always valid, but "cmp wN, #0" and "cmn wN, #0"
279   // have the opposite effect on the C flag, so this pattern mustn't match under
280   // those circumstances.
281   if (Immed == 0)
282     return false;
283
284   if (N.getValueType() == MVT::i32)
285     Immed = ~((uint32_t)Immed) + 1;
286   else
287     Immed = ~Immed + 1ULL;
288   if (Immed & 0xFFFFFFFFFF000000ULL)
289     return false;
290
291   Immed &= 0xFFFFFFULL;
292   return SelectArithImmed(CurDAG->getConstant(Immed, MVT::i32), Val, Shift);
293 }
294
295 /// getShiftTypeForNode - Translate a shift node to the corresponding
296 /// ShiftType value.
297 static ARM64_AM::ShiftType getShiftTypeForNode(SDValue N) {
298   switch (N.getOpcode()) {
299   default:
300     return ARM64_AM::InvalidShift;
301   case ISD::SHL:
302     return ARM64_AM::LSL;
303   case ISD::SRL:
304     return ARM64_AM::LSR;
305   case ISD::SRA:
306     return ARM64_AM::ASR;
307   case ISD::ROTR:
308     return ARM64_AM::ROR;
309   }
310 }
311
312 /// \brief Determine wether it is worth to fold V into an extended register.
313 bool ARM64DAGToDAGISel::isWorthFolding(SDValue V) const {
314   // it hurts if the a value is used at least twice, unless we are optimizing
315   // for code size.
316   if (ForCodeSize || V.hasOneUse())
317     return true;
318   return false;
319 }
320
321 /// SelectShiftedRegister - Select a "shifted register" operand.  If the value
322 /// is not shifted, set the Shift operand to default of "LSL 0".  The logical
323 /// instructions allow the shifted register to be rotated, but the arithmetic
324 /// instructions do not.  The AllowROR parameter specifies whether ROR is
325 /// supported.
326 bool ARM64DAGToDAGISel::SelectShiftedRegister(SDValue N, bool AllowROR,
327                                               SDValue &Reg, SDValue &Shift) {
328   ARM64_AM::ShiftType ShType = getShiftTypeForNode(N);
329   if (ShType == ARM64_AM::InvalidShift)
330     return false;
331   if (!AllowROR && ShType == ARM64_AM::ROR)
332     return false;
333
334   if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
335     unsigned BitSize = N.getValueType().getSizeInBits();
336     unsigned Val = RHS->getZExtValue() & (BitSize - 1);
337     unsigned ShVal = ARM64_AM::getShifterImm(ShType, Val);
338
339     Reg = N.getOperand(0);
340     Shift = CurDAG->getTargetConstant(ShVal, MVT::i32);
341     return isWorthFolding(N);
342   }
343
344   return false;
345 }
346
347 /// getExtendTypeForNode - Translate an extend node to the corresponding
348 /// ExtendType value.
349 static ARM64_AM::ExtendType getExtendTypeForNode(SDValue N,
350                                                  bool IsLoadStore = false) {
351   if (N.getOpcode() == ISD::SIGN_EXTEND ||
352       N.getOpcode() == ISD::SIGN_EXTEND_INREG) {
353     EVT SrcVT;
354     if (N.getOpcode() == ISD::SIGN_EXTEND_INREG)
355       SrcVT = cast<VTSDNode>(N.getOperand(1))->getVT();
356     else
357       SrcVT = N.getOperand(0).getValueType();
358
359     if (!IsLoadStore && SrcVT == MVT::i8)
360       return ARM64_AM::SXTB;
361     else if (!IsLoadStore && SrcVT == MVT::i16)
362       return ARM64_AM::SXTH;
363     else if (SrcVT == MVT::i32)
364       return ARM64_AM::SXTW;
365     else if (SrcVT == MVT::i64)
366       return ARM64_AM::SXTX;
367
368     return ARM64_AM::InvalidExtend;
369   } else if (N.getOpcode() == ISD::ZERO_EXTEND ||
370              N.getOpcode() == ISD::ANY_EXTEND) {
371     EVT SrcVT = N.getOperand(0).getValueType();
372     if (!IsLoadStore && SrcVT == MVT::i8)
373       return ARM64_AM::UXTB;
374     else if (!IsLoadStore && SrcVT == MVT::i16)
375       return ARM64_AM::UXTH;
376     else if (SrcVT == MVT::i32)
377       return ARM64_AM::UXTW;
378     else if (SrcVT == MVT::i64)
379       return ARM64_AM::UXTX;
380
381     return ARM64_AM::InvalidExtend;
382   } else if (N.getOpcode() == ISD::AND) {
383     ConstantSDNode *CSD = dyn_cast<ConstantSDNode>(N.getOperand(1));
384     if (!CSD)
385       return ARM64_AM::InvalidExtend;
386     uint64_t AndMask = CSD->getZExtValue();
387
388     switch (AndMask) {
389     default:
390       return ARM64_AM::InvalidExtend;
391     case 0xFF:
392       return !IsLoadStore ? ARM64_AM::UXTB : ARM64_AM::InvalidExtend;
393     case 0xFFFF:
394       return !IsLoadStore ? ARM64_AM::UXTH : ARM64_AM::InvalidExtend;
395     case 0xFFFFFFFF:
396       return ARM64_AM::UXTW;
397     }
398   }
399
400   return ARM64_AM::InvalidExtend;
401 }
402
403 // Helper for SelectMLAV64LaneV128 - Recognize high lane extracts.
404 static bool checkHighLaneIndex(SDNode *DL, SDValue &LaneOp, int &LaneIdx) {
405   if (DL->getOpcode() != ARM64ISD::DUPLANE16 &&
406       DL->getOpcode() != ARM64ISD::DUPLANE32)
407     return false;
408
409   SDValue SV = DL->getOperand(0);
410   if (SV.getOpcode() != ISD::INSERT_SUBVECTOR)
411     return false;
412
413   SDValue EV = SV.getOperand(1);
414   if (EV.getOpcode() != ISD::EXTRACT_SUBVECTOR)
415     return false;
416
417   ConstantSDNode *DLidx = cast<ConstantSDNode>(DL->getOperand(1).getNode());
418   ConstantSDNode *EVidx = cast<ConstantSDNode>(EV.getOperand(1).getNode());
419   LaneIdx = DLidx->getSExtValue() + EVidx->getSExtValue();
420   LaneOp = EV.getOperand(0);
421
422   return true;
423 }
424
425 // Helper for SelectOpcV64LaneV128 - Recogzine operatinos where one operand is a
426 // high lane extract.
427 static bool checkV64LaneV128(SDValue Op0, SDValue Op1, SDValue &StdOp,
428                              SDValue &LaneOp, int &LaneIdx) {
429
430   if (!checkHighLaneIndex(Op0.getNode(), LaneOp, LaneIdx)) {
431     std::swap(Op0, Op1);
432     if (!checkHighLaneIndex(Op0.getNode(), LaneOp, LaneIdx))
433       return false;
434   }
435   StdOp = Op1;
436   return true;
437 }
438
439 /// SelectMLAV64LaneV128 - ARM64 supports vector MLAs where one multiplicand is
440 /// a lane in the upper half of a 128-bit vector.  Recognize and select this so
441 /// that we don't emit unnecessary lane extracts.
442 SDNode *ARM64DAGToDAGISel::SelectMLAV64LaneV128(SDNode *N) {
443   SDValue Op0 = N->getOperand(0);
444   SDValue Op1 = N->getOperand(1);
445   SDValue MLAOp1;   // Will hold ordinary multiplicand for MLA.
446   SDValue MLAOp2;   // Will hold lane-accessed multiplicand for MLA.
447   int LaneIdx = -1; // Will hold the lane index.
448
449   if (Op1.getOpcode() != ISD::MUL ||
450       !checkV64LaneV128(Op1.getOperand(0), Op1.getOperand(1), MLAOp1, MLAOp2,
451                         LaneIdx)) {
452     std::swap(Op0, Op1);
453     if (Op1.getOpcode() != ISD::MUL ||
454         !checkV64LaneV128(Op1.getOperand(0), Op1.getOperand(1), MLAOp1, MLAOp2,
455                           LaneIdx))
456       return 0;
457   }
458
459   SDValue LaneIdxVal = CurDAG->getTargetConstant(LaneIdx, MVT::i64);
460
461   SDValue Ops[] = { Op0, MLAOp1, MLAOp2, LaneIdxVal };
462
463   unsigned MLAOpc = ~0U;
464
465   switch (N->getSimpleValueType(0).SimpleTy) {
466   default:
467     llvm_unreachable("Unrecognized MLA.");
468   case MVT::v4i16:
469     MLAOpc = ARM64::MLAv4i16_indexed;
470     break;
471   case MVT::v8i16:
472     MLAOpc = ARM64::MLAv8i16_indexed;
473     break;
474   case MVT::v2i32:
475     MLAOpc = ARM64::MLAv2i32_indexed;
476     break;
477   case MVT::v4i32:
478     MLAOpc = ARM64::MLAv4i32_indexed;
479     break;
480   }
481
482   return CurDAG->getMachineNode(MLAOpc, SDLoc(N), N->getValueType(0), Ops);
483 }
484
485 SDNode *ARM64DAGToDAGISel::SelectMULLV64LaneV128(unsigned IntNo, SDNode *N) {
486   SDValue SMULLOp0;
487   SDValue SMULLOp1;
488   int LaneIdx;
489
490   if (!checkV64LaneV128(N->getOperand(1), N->getOperand(2), SMULLOp0, SMULLOp1,
491                         LaneIdx))
492     return 0;
493
494   SDValue LaneIdxVal = CurDAG->getTargetConstant(LaneIdx, MVT::i64);
495
496   SDValue Ops[] = { SMULLOp0, SMULLOp1, LaneIdxVal };
497
498   unsigned SMULLOpc = ~0U;
499
500   if (IntNo == Intrinsic::arm64_neon_smull) {
501     switch (N->getSimpleValueType(0).SimpleTy) {
502     default:
503       llvm_unreachable("Unrecognized SMULL.");
504     case MVT::v4i32:
505       SMULLOpc = ARM64::SMULLv4i16_indexed;
506       break;
507     case MVT::v2i64:
508       SMULLOpc = ARM64::SMULLv2i32_indexed;
509       break;
510     }
511   } else if (IntNo == Intrinsic::arm64_neon_umull) {
512     switch (N->getSimpleValueType(0).SimpleTy) {
513     default:
514       llvm_unreachable("Unrecognized SMULL.");
515     case MVT::v4i32:
516       SMULLOpc = ARM64::UMULLv4i16_indexed;
517       break;
518     case MVT::v2i64:
519       SMULLOpc = ARM64::UMULLv2i32_indexed;
520       break;
521     }
522   } else
523     llvm_unreachable("Unrecognized intrinsic.");
524
525   return CurDAG->getMachineNode(SMULLOpc, SDLoc(N), N->getValueType(0), Ops);
526 }
527
528 /// SelectArithExtendedRegister - Select a "extended register" operand.  This
529 /// operand folds in an extend followed by an optional left shift.
530 bool ARM64DAGToDAGISel::SelectArithExtendedRegister(SDValue N, SDValue &Reg,
531                                                     SDValue &Shift) {
532   unsigned ShiftVal = 0;
533   ARM64_AM::ExtendType Ext;
534
535   if (N.getOpcode() == ISD::SHL) {
536     ConstantSDNode *CSD = dyn_cast<ConstantSDNode>(N.getOperand(1));
537     if (!CSD)
538       return false;
539     ShiftVal = CSD->getZExtValue();
540     if (ShiftVal > 4)
541       return false;
542
543     Ext = getExtendTypeForNode(N.getOperand(0));
544     if (Ext == ARM64_AM::InvalidExtend)
545       return false;
546
547     Reg = N.getOperand(0).getOperand(0);
548   } else {
549     Ext = getExtendTypeForNode(N);
550     if (Ext == ARM64_AM::InvalidExtend)
551       return false;
552
553     Reg = N.getOperand(0);
554   }
555
556   // ARM64 mandates that the RHS of the operation must use the smallest
557   // register classs that could contain the size being extended from.  Thus,
558   // if we're folding a (sext i8), we need the RHS to be a GPR32, even though
559   // there might not be an actual 32-bit value in the program.  We can
560   // (harmlessly) synthesize one by injected an EXTRACT_SUBREG here.
561   if (Reg.getValueType() == MVT::i64 && Ext != ARM64_AM::UXTX &&
562       Ext != ARM64_AM::SXTX) {
563     SDValue SubReg = CurDAG->getTargetConstant(ARM64::sub_32, MVT::i32);
564     MachineSDNode *Node = CurDAG->getMachineNode(
565         TargetOpcode::EXTRACT_SUBREG, SDLoc(N), MVT::i32, Reg, SubReg);
566     Reg = SDValue(Node, 0);
567   }
568
569   Shift = CurDAG->getTargetConstant(getArithExtendImm(Ext, ShiftVal), MVT::i32);
570   return isWorthFolding(N);
571 }
572
573 /// SelectAddrModeIndexed - Select a "register plus scaled unsigned 12-bit
574 /// immediate" address.  The "Size" argument is the size in bytes of the memory
575 /// reference, which determines the scale.
576 bool ARM64DAGToDAGISel::SelectAddrModeIndexed(SDValue N, unsigned Size,
577                                               SDValue &Base, SDValue &OffImm) {
578   const TargetLowering *TLI = getTargetLowering();
579   if (N.getOpcode() == ISD::FrameIndex) {
580     int FI = cast<FrameIndexSDNode>(N)->getIndex();
581     Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
582     OffImm = CurDAG->getTargetConstant(0, MVT::i64);
583     return true;
584   }
585
586   if (N.getOpcode() == ARM64ISD::ADDlow) {
587     GlobalAddressSDNode *GAN =
588         dyn_cast<GlobalAddressSDNode>(N.getOperand(1).getNode());
589     Base = N.getOperand(0);
590     OffImm = N.getOperand(1);
591     if (!GAN)
592       return true;
593
594     const GlobalValue *GV = GAN->getGlobal();
595     unsigned Alignment = GV->getAlignment();
596     const DataLayout *DL = TLI->getDataLayout();
597     if (Alignment == 0 && !Subtarget->isTargetDarwin())
598       Alignment = DL->getABITypeAlignment(GV->getType()->getElementType());
599
600     if (Alignment >= Size)
601       return true;
602   }
603
604   if (CurDAG->isBaseWithConstantOffset(N)) {
605     if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
606       int64_t RHSC = (int64_t)RHS->getZExtValue();
607       unsigned Scale = Log2_32(Size);
608       if ((RHSC & (Size - 1)) == 0 && RHSC >= 0 && RHSC < (0x1000 << Scale)) {
609         Base = N.getOperand(0);
610         if (Base.getOpcode() == ISD::FrameIndex) {
611           int FI = cast<FrameIndexSDNode>(Base)->getIndex();
612           Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
613         }
614         OffImm = CurDAG->getTargetConstant(RHSC >> Scale, MVT::i64);
615         return true;
616       }
617     }
618   }
619
620   // Before falling back to our general case, check if the unscaled
621   // instructions can handle this. If so, that's preferable.
622   if (SelectAddrModeUnscaled(N, Size, Base, OffImm))
623     return false;
624
625   // Base only. The address will be materialized into a register before
626   // the memory is accessed.
627   //    add x0, Xbase, #offset
628   //    ldr x0, [x0]
629   Base = N;
630   OffImm = CurDAG->getTargetConstant(0, MVT::i64);
631   return true;
632 }
633
634 /// SelectAddrModeUnscaled - Select a "register plus unscaled signed 9-bit
635 /// immediate" address.  This should only match when there is an offset that
636 /// is not valid for a scaled immediate addressing mode.  The "Size" argument
637 /// is the size in bytes of the memory reference, which is needed here to know
638 /// what is valid for a scaled immediate.
639 bool ARM64DAGToDAGISel::SelectAddrModeUnscaled(SDValue N, unsigned Size,
640                                                SDValue &Base, SDValue &OffImm) {
641   if (!CurDAG->isBaseWithConstantOffset(N))
642     return false;
643   if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
644     int64_t RHSC = RHS->getSExtValue();
645     // If the offset is valid as a scaled immediate, don't match here.
646     if ((RHSC & (Size - 1)) == 0 && RHSC >= 0 &&
647         RHSC < (0x1000 << Log2_32(Size)))
648       return false;
649     if (RHSC >= -256 && RHSC < 256) {
650       Base = N.getOperand(0);
651       if (Base.getOpcode() == ISD::FrameIndex) {
652         int FI = cast<FrameIndexSDNode>(Base)->getIndex();
653         const TargetLowering *TLI = getTargetLowering();
654         Base = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
655       }
656       OffImm = CurDAG->getTargetConstant(RHSC, MVT::i64);
657       return true;
658     }
659   }
660   return false;
661 }
662
663 static SDValue Widen(SelectionDAG *CurDAG, SDValue N) {
664   SDValue SubReg = CurDAG->getTargetConstant(ARM64::sub_32, MVT::i32);
665   SDValue ImpDef = SDValue(
666       CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, SDLoc(N), MVT::i64),
667       0);
668   MachineSDNode *Node = CurDAG->getMachineNode(
669       TargetOpcode::INSERT_SUBREG, SDLoc(N), MVT::i64, ImpDef, N, SubReg);
670   return SDValue(Node, 0);
671 }
672
673 static SDValue WidenIfNeeded(SelectionDAG *CurDAG, SDValue N) {
674   if (N.getValueType() == MVT::i32) {
675     return Widen(CurDAG, N);
676   }
677
678   return N;
679 }
680
681 /// \brief Check if the given SHL node (\p N), can be used to form an
682 /// extended register for an addressing mode.
683 bool ARM64DAGToDAGISel::SelectExtendedSHL(SDValue N, unsigned Size,
684                                           SDValue &Offset, SDValue &Imm) {
685   assert(N.getOpcode() == ISD::SHL && "Invalid opcode.");
686   ConstantSDNode *CSD = dyn_cast<ConstantSDNode>(N.getOperand(1));
687   if (CSD && (CSD->getZExtValue() & 0x7) == CSD->getZExtValue()) {
688
689     ARM64_AM::ExtendType Ext = getExtendTypeForNode(N.getOperand(0), true);
690     if (Ext == ARM64_AM::InvalidExtend) {
691       Ext = ARM64_AM::UXTX;
692       Offset = WidenIfNeeded(CurDAG, N.getOperand(0));
693     } else {
694       Offset = WidenIfNeeded(CurDAG, N.getOperand(0).getOperand(0));
695     }
696
697     unsigned LegalShiftVal = Log2_32(Size);
698     unsigned ShiftVal = CSD->getZExtValue();
699
700     if (ShiftVal != 0 && ShiftVal != LegalShiftVal)
701       return false;
702
703     Imm = CurDAG->getTargetConstant(
704         ARM64_AM::getMemExtendImm(Ext, ShiftVal != 0), MVT::i32);
705     if (isWorthFolding(N))
706       return true;
707   }
708   return false;
709 }
710
711 bool ARM64DAGToDAGISel::SelectAddrModeRO(SDValue N, unsigned Size,
712                                          SDValue &Base, SDValue &Offset,
713                                          SDValue &Imm) {
714   if (N.getOpcode() != ISD::ADD)
715     return false;
716   SDValue LHS = N.getOperand(0);
717   SDValue RHS = N.getOperand(1);
718
719   // We don't want to match immediate adds here, because they are better lowered
720   // to the register-immediate addressing modes.
721   if (isa<ConstantSDNode>(LHS) || isa<ConstantSDNode>(RHS))
722     return false;
723
724   // Check if this particular node is reused in any non-memory related
725   // operation.  If yes, do not try to fold this node into the address
726   // computation, since the computation will be kept.
727   const SDNode *Node = N.getNode();
728   for (SDNode *UI : Node->uses()) {
729     if (!isa<MemSDNode>(*UI))
730       return false;
731   }
732
733   // Remember if it is worth folding N when it produces extended register.
734   bool IsExtendedRegisterWorthFolding = isWorthFolding(N);
735
736   // Try to match a shifted extend on the RHS.
737   if (IsExtendedRegisterWorthFolding && RHS.getOpcode() == ISD::SHL &&
738       SelectExtendedSHL(RHS, Size, Offset, Imm)) {
739     Base = LHS;
740     return true;
741   }
742
743   // Try to match a shifted extend on the LHS.
744   if (IsExtendedRegisterWorthFolding && LHS.getOpcode() == ISD::SHL &&
745       SelectExtendedSHL(LHS, Size, Offset, Imm)) {
746     Base = RHS;
747     return true;
748   }
749
750   ARM64_AM::ExtendType Ext = ARM64_AM::UXTX;
751   // Try to match an unshifted extend on the LHS.
752   if (IsExtendedRegisterWorthFolding &&
753       (Ext = getExtendTypeForNode(LHS, true)) != ARM64_AM::InvalidExtend) {
754     Base = RHS;
755     Offset = WidenIfNeeded(CurDAG, LHS.getOperand(0));
756     Imm = CurDAG->getTargetConstant(ARM64_AM::getMemExtendImm(Ext, false),
757                                     MVT::i32);
758     if (isWorthFolding(LHS))
759       return true;
760   }
761
762   // Try to match an unshifted extend on the RHS.
763   if (IsExtendedRegisterWorthFolding &&
764       (Ext = getExtendTypeForNode(RHS, true)) != ARM64_AM::InvalidExtend) {
765     Base = LHS;
766     Offset = WidenIfNeeded(CurDAG, RHS.getOperand(0));
767     Imm = CurDAG->getTargetConstant(ARM64_AM::getMemExtendImm(Ext, false),
768                                     MVT::i32);
769     if (isWorthFolding(RHS))
770       return true;
771   }
772
773   // Match any non-shifted, non-extend, non-immediate add expression.
774   Base = LHS;
775   Offset = WidenIfNeeded(CurDAG, RHS);
776   Ext = ARM64_AM::UXTX;
777   Imm = CurDAG->getTargetConstant(ARM64_AM::getMemExtendImm(Ext, false),
778                                   MVT::i32);
779   // Reg1 + Reg2 is free: no check needed.
780   return true;
781 }
782
783 SDValue ARM64DAGToDAGISel::createDTuple(ArrayRef<SDValue> Regs) {
784   static unsigned RegClassIDs[] = { ARM64::DDRegClassID, ARM64::DDDRegClassID,
785                                     ARM64::DDDDRegClassID };
786   static unsigned SubRegs[] = { ARM64::dsub0, ARM64::dsub1,
787                                 ARM64::dsub2, ARM64::dsub3 };
788
789   return createTuple(Regs, RegClassIDs, SubRegs);
790 }
791
792 SDValue ARM64DAGToDAGISel::createQTuple(ArrayRef<SDValue> Regs) {
793   static unsigned RegClassIDs[] = { ARM64::QQRegClassID, ARM64::QQQRegClassID,
794                                     ARM64::QQQQRegClassID };
795   static unsigned SubRegs[] = { ARM64::qsub0, ARM64::qsub1,
796                                 ARM64::qsub2, ARM64::qsub3 };
797
798   return createTuple(Regs, RegClassIDs, SubRegs);
799 }
800
801 SDValue ARM64DAGToDAGISel::createTuple(ArrayRef<SDValue> Regs,
802                                        unsigned RegClassIDs[],
803                                        unsigned SubRegs[]) {
804   // There's no special register-class for a vector-list of 1 element: it's just
805   // a vector.
806   if (Regs.size() == 1)
807     return Regs[0];
808
809   assert(Regs.size() >= 2 && Regs.size() <= 4);
810
811   SDLoc DL(Regs[0].getNode());
812
813   SmallVector<SDValue, 4> Ops;
814
815   // First operand of REG_SEQUENCE is the desired RegClass.
816   Ops.push_back(
817       CurDAG->getTargetConstant(RegClassIDs[Regs.size() - 2], MVT::i32));
818
819   // Then we get pairs of source & subregister-position for the components.
820   for (unsigned i = 0; i < Regs.size(); ++i) {
821     Ops.push_back(Regs[i]);
822     Ops.push_back(CurDAG->getTargetConstant(SubRegs[i], MVT::i32));
823   }
824
825   SDNode *N =
826       CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, DL, MVT::Untyped, Ops);
827   return SDValue(N, 0);
828 }
829
830 SDNode *ARM64DAGToDAGISel::SelectTable(SDNode *N, unsigned NumVecs,
831                                        unsigned Opc, bool isExt) {
832   SDLoc dl(N);
833   EVT VT = N->getValueType(0);
834
835   unsigned ExtOff = isExt;
836
837   // Form a REG_SEQUENCE to force register allocation.
838   unsigned Vec0Off = ExtOff + 1;
839   SmallVector<SDValue, 4> Regs(N->op_begin() + Vec0Off,
840                                N->op_begin() + Vec0Off + NumVecs);
841   SDValue RegSeq = createQTuple(Regs);
842
843   SmallVector<SDValue, 6> Ops;
844   if (isExt)
845     Ops.push_back(N->getOperand(1));
846   Ops.push_back(RegSeq);
847   Ops.push_back(N->getOperand(NumVecs + ExtOff + 1));
848   return CurDAG->getMachineNode(Opc, dl, VT, Ops);
849 }
850
851 SDNode *ARM64DAGToDAGISel::SelectIndexedLoad(SDNode *N, bool &Done) {
852   LoadSDNode *LD = cast<LoadSDNode>(N);
853   if (LD->isUnindexed())
854     return NULL;
855   EVT VT = LD->getMemoryVT();
856   EVT DstVT = N->getValueType(0);
857   ISD::MemIndexedMode AM = LD->getAddressingMode();
858   bool IsPre = AM == ISD::PRE_INC || AM == ISD::PRE_DEC;
859
860   // We're not doing validity checking here. That was done when checking
861   // if we should mark the load as indexed or not. We're just selecting
862   // the right instruction.
863   unsigned Opcode = 0;
864
865   ISD::LoadExtType ExtType = LD->getExtensionType();
866   bool InsertTo64 = false;
867   if (VT == MVT::i64)
868     Opcode = IsPre ? ARM64::LDRXpre_isel : ARM64::LDRXpost_isel;
869   else if (VT == MVT::i32) {
870     if (ExtType == ISD::NON_EXTLOAD)
871       Opcode = IsPre ? ARM64::LDRWpre_isel : ARM64::LDRWpost_isel;
872     else if (ExtType == ISD::SEXTLOAD)
873       Opcode = IsPre ? ARM64::LDRSWpre_isel : ARM64::LDRSWpost_isel;
874     else {
875       Opcode = IsPre ? ARM64::LDRWpre_isel : ARM64::LDRWpost_isel;
876       InsertTo64 = true;
877       // The result of the load is only i32. It's the subreg_to_reg that makes
878       // it into an i64.
879       DstVT = MVT::i32;
880     }
881   } else if (VT == MVT::i16) {
882     if (ExtType == ISD::SEXTLOAD) {
883       if (DstVT == MVT::i64)
884         Opcode = IsPre ? ARM64::LDRSHXpre_isel : ARM64::LDRSHXpost_isel;
885       else
886         Opcode = IsPre ? ARM64::LDRSHWpre_isel : ARM64::LDRSHWpost_isel;
887     } else {
888       Opcode = IsPre ? ARM64::LDRHHpre_isel : ARM64::LDRHHpost_isel;
889       InsertTo64 = DstVT == MVT::i64;
890       // The result of the load is only i32. It's the subreg_to_reg that makes
891       // it into an i64.
892       DstVT = MVT::i32;
893     }
894   } else if (VT == MVT::i8) {
895     if (ExtType == ISD::SEXTLOAD) {
896       if (DstVT == MVT::i64)
897         Opcode = IsPre ? ARM64::LDRSBXpre_isel : ARM64::LDRSBXpost_isel;
898       else
899         Opcode = IsPre ? ARM64::LDRSBWpre_isel : ARM64::LDRSBWpost_isel;
900     } else {
901       Opcode = IsPre ? ARM64::LDRBBpre_isel : ARM64::LDRBBpost_isel;
902       InsertTo64 = DstVT == MVT::i64;
903       // The result of the load is only i32. It's the subreg_to_reg that makes
904       // it into an i64.
905       DstVT = MVT::i32;
906     }
907   } else if (VT == MVT::f32) {
908     Opcode = IsPre ? ARM64::LDRSpre_isel : ARM64::LDRSpost_isel;
909   } else if (VT == MVT::f64) {
910     Opcode = IsPre ? ARM64::LDRDpre_isel : ARM64::LDRDpost_isel;
911   } else
912     return NULL;
913   SDValue Chain = LD->getChain();
914   SDValue Base = LD->getBasePtr();
915   ConstantSDNode *OffsetOp = cast<ConstantSDNode>(LD->getOffset());
916   int OffsetVal = (int)OffsetOp->getZExtValue();
917   SDValue Offset = CurDAG->getTargetConstant(OffsetVal, MVT::i64);
918   SDValue Ops[] = { Base, Offset, Chain };
919   SDNode *Res = CurDAG->getMachineNode(Opcode, SDLoc(N), DstVT, MVT::i64,
920                                        MVT::Other, Ops);
921   // Either way, we're replacing the node, so tell the caller that.
922   Done = true;
923   if (InsertTo64) {
924     SDValue SubReg = CurDAG->getTargetConstant(ARM64::sub_32, MVT::i32);
925     SDNode *Sub = CurDAG->getMachineNode(
926         ARM64::SUBREG_TO_REG, SDLoc(N), MVT::i64,
927         CurDAG->getTargetConstant(0, MVT::i64), SDValue(Res, 0), SubReg);
928     ReplaceUses(SDValue(N, 0), SDValue(Sub, 0));
929     ReplaceUses(SDValue(N, 1), SDValue(Res, 1));
930     ReplaceUses(SDValue(N, 2), SDValue(Res, 2));
931     return 0;
932   }
933   return Res;
934 }
935
936 SDNode *ARM64DAGToDAGISel::SelectLoad(SDNode *N, unsigned NumVecs, unsigned Opc,
937                                       unsigned SubRegIdx) {
938   SDLoc dl(N);
939   EVT VT = N->getValueType(0);
940   SDValue Chain = N->getOperand(0);
941
942   SmallVector<SDValue, 6> Ops;
943   Ops.push_back(N->getOperand(2)); // Mem operand;
944   Ops.push_back(Chain);
945
946   std::vector<EVT> ResTys;
947   ResTys.push_back(MVT::Untyped);
948   ResTys.push_back(MVT::Other);
949
950   SDNode *Ld = CurDAG->getMachineNode(Opc, dl, ResTys, Ops);
951   SDValue SuperReg = SDValue(Ld, 0);
952
953   // MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
954   // MemOp[0] = cast<MemIntrinsicSDNode>(N)->getMemOperand();
955   // cast<MachineSDNode>(Ld)->setMemRefs(MemOp, MemOp + 1);
956
957   switch (NumVecs) {
958   case 4:
959     ReplaceUses(SDValue(N, 3), CurDAG->getTargetExtractSubreg(SubRegIdx + 3, dl,
960                                                               VT, SuperReg));
961   // FALLTHROUGH
962   case 3:
963     ReplaceUses(SDValue(N, 2), CurDAG->getTargetExtractSubreg(SubRegIdx + 2, dl,
964                                                               VT, SuperReg));
965   // FALLTHROUGH
966   case 2:
967     ReplaceUses(SDValue(N, 1), CurDAG->getTargetExtractSubreg(SubRegIdx + 1, dl,
968                                                               VT, SuperReg));
969     ReplaceUses(SDValue(N, 0),
970                 CurDAG->getTargetExtractSubreg(SubRegIdx, dl, VT, SuperReg));
971     break;
972   case 1:
973     ReplaceUses(SDValue(N, 0), SuperReg);
974     break;
975   }
976
977   ReplaceUses(SDValue(N, NumVecs), SDValue(Ld, 1));
978
979   return 0;
980 }
981
982 SDNode *ARM64DAGToDAGISel::SelectStore(SDNode *N, unsigned NumVecs,
983                                        unsigned Opc) {
984   SDLoc dl(N);
985   EVT VT = N->getOperand(2)->getValueType(0);
986
987   // Form a REG_SEQUENCE to force register allocation.
988   bool Is128Bit = VT.getSizeInBits() == 128;
989   SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
990   SDValue RegSeq = Is128Bit ? createQTuple(Regs) : createDTuple(Regs);
991
992   SmallVector<SDValue, 6> Ops;
993   Ops.push_back(RegSeq);
994   Ops.push_back(N->getOperand(NumVecs + 2));
995   Ops.push_back(N->getOperand(0));
996   SDNode *St = CurDAG->getMachineNode(Opc, dl, N->getValueType(0), Ops);
997
998   return St;
999 }
1000
1001 /// WidenVector - Given a value in the V64 register class, produce the
1002 /// equivalent value in the V128 register class.
1003 class WidenVector {
1004   SelectionDAG &DAG;
1005
1006 public:
1007   WidenVector(SelectionDAG &DAG) : DAG(DAG) {}
1008
1009   SDValue operator()(SDValue V64Reg) {
1010     EVT VT = V64Reg.getValueType();
1011     unsigned NarrowSize = VT.getVectorNumElements();
1012     MVT EltTy = VT.getVectorElementType().getSimpleVT();
1013     MVT WideTy = MVT::getVectorVT(EltTy, 2 * NarrowSize);
1014     SDLoc DL(V64Reg);
1015
1016     SDValue Undef =
1017         SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF, DL, WideTy), 0);
1018     return DAG.getTargetInsertSubreg(ARM64::dsub, DL, WideTy, Undef, V64Reg);
1019   }
1020 };
1021
1022 /// NarrowVector - Given a value in the V128 register class, produce the
1023 /// equivalent value in the V64 register class.
1024 static SDValue NarrowVector(SDValue V128Reg, SelectionDAG &DAG) {
1025   EVT VT = V128Reg.getValueType();
1026   unsigned WideSize = VT.getVectorNumElements();
1027   MVT EltTy = VT.getVectorElementType().getSimpleVT();
1028   MVT NarrowTy = MVT::getVectorVT(EltTy, WideSize / 2);
1029
1030   return DAG.getTargetExtractSubreg(ARM64::dsub, SDLoc(V128Reg), NarrowTy,
1031                                     V128Reg);
1032 }
1033
1034 SDNode *ARM64DAGToDAGISel::SelectLoadLane(SDNode *N, unsigned NumVecs,
1035                                           unsigned Opc) {
1036   SDLoc dl(N);
1037   EVT VT = N->getValueType(0);
1038   bool Narrow = VT.getSizeInBits() == 64;
1039
1040   // Form a REG_SEQUENCE to force register allocation.
1041   SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
1042
1043   if (Narrow)
1044     std::transform(Regs.begin(), Regs.end(), Regs.begin(),
1045                    WidenVector(*CurDAG));
1046
1047   SDValue RegSeq = createQTuple(Regs);
1048
1049   std::vector<EVT> ResTys;
1050   ResTys.push_back(MVT::Untyped);
1051   ResTys.push_back(MVT::Other);
1052
1053   unsigned LaneNo =
1054       cast<ConstantSDNode>(N->getOperand(NumVecs + 2))->getZExtValue();
1055
1056   SmallVector<SDValue, 6> Ops;
1057   Ops.push_back(RegSeq);
1058   Ops.push_back(CurDAG->getTargetConstant(LaneNo, MVT::i64));
1059   Ops.push_back(N->getOperand(NumVecs + 3));
1060   Ops.push_back(N->getOperand(0));
1061   SDNode *Ld = CurDAG->getMachineNode(Opc, dl, ResTys, Ops);
1062   SDValue SuperReg = SDValue(Ld, 0);
1063
1064   EVT WideVT = RegSeq.getOperand(1)->getValueType(0);
1065   switch (NumVecs) {
1066   case 4: {
1067     SDValue NV3 =
1068         CurDAG->getTargetExtractSubreg(ARM64::qsub3, dl, WideVT, SuperReg);
1069     if (Narrow)
1070       ReplaceUses(SDValue(N, 3), NarrowVector(NV3, *CurDAG));
1071     else
1072       ReplaceUses(SDValue(N, 3), NV3);
1073   }
1074   // FALLTHROUGH
1075   case 3: {
1076     SDValue NV2 =
1077         CurDAG->getTargetExtractSubreg(ARM64::qsub2, dl, WideVT, SuperReg);
1078     if (Narrow)
1079       ReplaceUses(SDValue(N, 2), NarrowVector(NV2, *CurDAG));
1080     else
1081       ReplaceUses(SDValue(N, 2), NV2);
1082   }
1083   // FALLTHROUGH
1084   case 2: {
1085     SDValue NV1 =
1086         CurDAG->getTargetExtractSubreg(ARM64::qsub1, dl, WideVT, SuperReg);
1087     SDValue NV0 =
1088         CurDAG->getTargetExtractSubreg(ARM64::qsub0, dl, WideVT, SuperReg);
1089     if (Narrow) {
1090       ReplaceUses(SDValue(N, 1), NarrowVector(NV1, *CurDAG));
1091       ReplaceUses(SDValue(N, 0), NarrowVector(NV0, *CurDAG));
1092     } else {
1093       ReplaceUses(SDValue(N, 1), NV1);
1094       ReplaceUses(SDValue(N, 0), NV0);
1095     }
1096     break;
1097   }
1098   }
1099
1100   ReplaceUses(SDValue(N, NumVecs), SDValue(Ld, 1));
1101
1102   return Ld;
1103 }
1104
1105 SDNode *ARM64DAGToDAGISel::SelectStoreLane(SDNode *N, unsigned NumVecs,
1106                                            unsigned Opc) {
1107   SDLoc dl(N);
1108   EVT VT = N->getOperand(2)->getValueType(0);
1109   bool Narrow = VT.getSizeInBits() == 64;
1110
1111   // Form a REG_SEQUENCE to force register allocation.
1112   SmallVector<SDValue, 4> Regs(N->op_begin() + 2, N->op_begin() + 2 + NumVecs);
1113
1114   if (Narrow)
1115     std::transform(Regs.begin(), Regs.end(), Regs.begin(),
1116                    WidenVector(*CurDAG));
1117
1118   SDValue RegSeq = createQTuple(Regs);
1119
1120   unsigned LaneNo =
1121       cast<ConstantSDNode>(N->getOperand(NumVecs + 2))->getZExtValue();
1122
1123   SmallVector<SDValue, 6> Ops;
1124   Ops.push_back(RegSeq);
1125   Ops.push_back(CurDAG->getTargetConstant(LaneNo, MVT::i64));
1126   Ops.push_back(N->getOperand(NumVecs + 3));
1127   Ops.push_back(N->getOperand(0));
1128   SDNode *St = CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops);
1129
1130   // Transfer memoperands.
1131   MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
1132   MemOp[0] = cast<MemIntrinsicSDNode>(N)->getMemOperand();
1133   cast<MachineSDNode>(St)->setMemRefs(MemOp, MemOp + 1);
1134
1135   return St;
1136 }
1137
1138 static bool isBitfieldExtractOpFromAnd(SelectionDAG *CurDAG, SDNode *N,
1139                                        unsigned &Opc, SDValue &Opd0,
1140                                        unsigned &LSB, unsigned &MSB,
1141                                        unsigned NumberOfIgnoredLowBits,
1142                                        bool BiggerPattern) {
1143   assert(N->getOpcode() == ISD::AND &&
1144          "N must be a AND operation to call this function");
1145
1146   EVT VT = N->getValueType(0);
1147
1148   // Here we can test the type of VT and return false when the type does not
1149   // match, but since it is done prior to that call in the current context
1150   // we turned that into an assert to avoid redundant code.
1151   assert((VT == MVT::i32 || VT == MVT::i64) &&
1152          "Type checking must have been done before calling this function");
1153
1154   // FIXME: simplify-demanded-bits in DAGCombine will probably have
1155   // changed the AND node to a 32-bit mask operation. We'll have to
1156   // undo that as part of the transform here if we want to catch all
1157   // the opportunities.
1158   // Currently the NumberOfIgnoredLowBits argument helps to recover
1159   // form these situations when matching bigger pattern (bitfield insert).
1160
1161   // For unsigned extracts, check for a shift right and mask
1162   uint64_t And_imm = 0;
1163   if (!isOpcWithIntImmediate(N, ISD::AND, And_imm))
1164     return false;
1165
1166   const SDNode *Op0 = N->getOperand(0).getNode();
1167
1168   // Because of simplify-demanded-bits in DAGCombine, the mask may have been
1169   // simplified. Try to undo that
1170   And_imm |= (1 << NumberOfIgnoredLowBits) - 1;
1171
1172   // The immediate is a mask of the low bits iff imm & (imm+1) == 0
1173   if (And_imm & (And_imm + 1))
1174     return false;
1175
1176   bool ClampMSB = false;
1177   uint64_t Srl_imm = 0;
1178   // Handle the SRL + ANY_EXTEND case.
1179   if (VT == MVT::i64 && Op0->getOpcode() == ISD::ANY_EXTEND &&
1180       isOpcWithIntImmediate(Op0->getOperand(0).getNode(), ISD::SRL, Srl_imm)) {
1181     // Extend the incoming operand of the SRL to 64-bit.
1182     Opd0 = Widen(CurDAG, Op0->getOperand(0).getOperand(0));
1183     // Make sure to clamp the MSB so that we preserve the semantics of the
1184     // original operations.
1185     ClampMSB = true;
1186   } else if (VT == MVT::i32 && Op0->getOpcode() == ISD::TRUNCATE &&
1187              isOpcWithIntImmediate(Op0->getOperand(0).getNode(), ISD::SRL,
1188                                    Srl_imm)) {
1189     // If the shift result was truncated, we can still combine them.
1190     Opd0 = Op0->getOperand(0).getOperand(0);
1191
1192     // Use the type of SRL node.
1193     VT = Opd0->getValueType(0);
1194   } else if (isOpcWithIntImmediate(Op0, ISD::SRL, Srl_imm)) {
1195     Opd0 = Op0->getOperand(0);
1196   } else if (BiggerPattern) {
1197     // Let's pretend a 0 shift right has been performed.
1198     // The resulting code will be at least as good as the original one
1199     // plus it may expose more opportunities for bitfield insert pattern.
1200     // FIXME: Currently we limit this to the bigger pattern, because
1201     // some optimizations expect AND and not UBFM
1202     Opd0 = N->getOperand(0);
1203   } else
1204     return false;
1205
1206   assert((BiggerPattern || (Srl_imm > 0 && Srl_imm < VT.getSizeInBits())) &&
1207          "bad amount in shift node!");
1208
1209   LSB = Srl_imm;
1210   MSB = Srl_imm + (VT == MVT::i32 ? CountTrailingOnes_32(And_imm)
1211                                   : CountTrailingOnes_64(And_imm)) -
1212         1;
1213   if (ClampMSB)
1214     // Since we're moving the extend before the right shift operation, we need
1215     // to clamp the MSB to make sure we don't shift in undefined bits instead of
1216     // the zeros which would get shifted in with the original right shift
1217     // operation.
1218     MSB = MSB > 31 ? 31 : MSB;
1219
1220   Opc = VT == MVT::i32 ? ARM64::UBFMWri : ARM64::UBFMXri;
1221   return true;
1222 }
1223
1224 static bool isOneBitExtractOpFromShr(SDNode *N, unsigned &Opc, SDValue &Opd0,
1225                                      unsigned &LSB, unsigned &MSB) {
1226   // We are looking for the following pattern which basically extracts a single
1227   // bit from the source value and places it in the LSB of the destination
1228   // value, all other bits of the destination value or set to zero:
1229   //
1230   // Value2 = AND Value, MaskImm
1231   // SRL Value2, ShiftImm
1232   //
1233   // with MaskImm >> ShiftImm == 1.
1234   //
1235   // This gets selected into a single UBFM:
1236   //
1237   // UBFM Value, ShiftImm, ShiftImm
1238   //
1239
1240   if (N->getOpcode() != ISD::SRL)
1241     return false;
1242
1243   uint64_t And_mask = 0;
1244   if (!isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::AND, And_mask))
1245     return false;
1246
1247   Opd0 = N->getOperand(0).getOperand(0);
1248
1249   uint64_t Srl_imm = 0;
1250   if (!isIntImmediate(N->getOperand(1), Srl_imm))
1251     return false;
1252
1253   // Check whether we really have a one bit extract here.
1254   if (And_mask >> Srl_imm == 0x1) {
1255     if (N->getValueType(0) == MVT::i32)
1256       Opc = ARM64::UBFMWri;
1257     else
1258       Opc = ARM64::UBFMXri;
1259
1260     LSB = MSB = Srl_imm;
1261
1262     return true;
1263   }
1264
1265   return false;
1266 }
1267
1268 static bool isBitfieldExtractOpFromShr(SDNode *N, unsigned &Opc, SDValue &Opd0,
1269                                        unsigned &LSB, unsigned &MSB,
1270                                        bool BiggerPattern) {
1271   assert((N->getOpcode() == ISD::SRA || N->getOpcode() == ISD::SRL) &&
1272          "N must be a SHR/SRA operation to call this function");
1273
1274   EVT VT = N->getValueType(0);
1275
1276   // Here we can test the type of VT and return false when the type does not
1277   // match, but since it is done prior to that call in the current context
1278   // we turned that into an assert to avoid redundant code.
1279   assert((VT == MVT::i32 || VT == MVT::i64) &&
1280          "Type checking must have been done before calling this function");
1281
1282   // Check for AND + SRL doing a one bit extract.
1283   if (isOneBitExtractOpFromShr(N, Opc, Opd0, LSB, MSB))
1284     return true;
1285
1286   // we're looking for a shift of a shift
1287   uint64_t Shl_imm = 0;
1288   uint64_t Trunc_bits = 0;
1289   if (isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::SHL, Shl_imm)) {
1290     Opd0 = N->getOperand(0).getOperand(0);
1291   } else if (VT == MVT::i32 && N->getOpcode() == ISD::SRL &&
1292              N->getOperand(0).getNode()->getOpcode() == ISD::TRUNCATE) {
1293     // We are looking for a shift of truncate. Truncate from i64 to i32 could
1294     // be considered as setting high 32 bits as zero. Our strategy here is to
1295     // always generate 64bit UBFM. This consistency will help the CSE pass
1296     // later find more redundancy.
1297     Opd0 = N->getOperand(0).getOperand(0);
1298     Trunc_bits = Opd0->getValueType(0).getSizeInBits() - VT.getSizeInBits();
1299     VT = Opd0->getValueType(0);
1300     assert(VT == MVT::i64 && "the promoted type should be i64");
1301   } else if (BiggerPattern) {
1302     // Let's pretend a 0 shift left has been performed.
1303     // FIXME: Currently we limit this to the bigger pattern case,
1304     // because some optimizations expect AND and not UBFM
1305     Opd0 = N->getOperand(0);
1306   } else
1307     return false;
1308
1309   assert(Shl_imm < VT.getSizeInBits() && "bad amount in shift node!");
1310   uint64_t Srl_imm = 0;
1311   if (!isIntImmediate(N->getOperand(1), Srl_imm))
1312     return false;
1313
1314   assert(Srl_imm > 0 && Srl_imm < VT.getSizeInBits() &&
1315          "bad amount in shift node!");
1316   // Note: The width operand is encoded as width-1.
1317   unsigned Width = VT.getSizeInBits() - Trunc_bits - Srl_imm - 1;
1318   int sLSB = Srl_imm - Shl_imm;
1319   if (sLSB < 0)
1320     return false;
1321   LSB = sLSB;
1322   MSB = LSB + Width;
1323   // SRA requires a signed extraction
1324   if (VT == MVT::i32)
1325     Opc = N->getOpcode() == ISD::SRA ? ARM64::SBFMWri : ARM64::UBFMWri;
1326   else
1327     Opc = N->getOpcode() == ISD::SRA ? ARM64::SBFMXri : ARM64::UBFMXri;
1328   return true;
1329 }
1330
1331 static bool isBitfieldExtractOp(SelectionDAG *CurDAG, SDNode *N, unsigned &Opc,
1332                                 SDValue &Opd0, unsigned &LSB, unsigned &MSB,
1333                                 unsigned NumberOfIgnoredLowBits = 0,
1334                                 bool BiggerPattern = false) {
1335   if (N->getValueType(0) != MVT::i32 && N->getValueType(0) != MVT::i64)
1336     return false;
1337
1338   switch (N->getOpcode()) {
1339   default:
1340     if (!N->isMachineOpcode())
1341       return false;
1342     break;
1343   case ISD::AND:
1344     return isBitfieldExtractOpFromAnd(CurDAG, N, Opc, Opd0, LSB, MSB,
1345                                       NumberOfIgnoredLowBits, BiggerPattern);
1346   case ISD::SRL:
1347   case ISD::SRA:
1348     return isBitfieldExtractOpFromShr(N, Opc, Opd0, LSB, MSB, BiggerPattern);
1349   }
1350
1351   unsigned NOpc = N->getMachineOpcode();
1352   switch (NOpc) {
1353   default:
1354     return false;
1355   case ARM64::SBFMWri:
1356   case ARM64::UBFMWri:
1357   case ARM64::SBFMXri:
1358   case ARM64::UBFMXri:
1359     Opc = NOpc;
1360     Opd0 = N->getOperand(0);
1361     LSB = cast<ConstantSDNode>(N->getOperand(1).getNode())->getZExtValue();
1362     MSB = cast<ConstantSDNode>(N->getOperand(2).getNode())->getZExtValue();
1363     return true;
1364   }
1365   // Unreachable
1366   return false;
1367 }
1368
1369 SDNode *ARM64DAGToDAGISel::SelectBitfieldExtractOp(SDNode *N) {
1370   unsigned Opc, LSB, MSB;
1371   SDValue Opd0;
1372   if (!isBitfieldExtractOp(CurDAG, N, Opc, Opd0, LSB, MSB))
1373     return NULL;
1374
1375   EVT VT = N->getValueType(0);
1376
1377   // If the bit extract operation is 64bit but the original type is 32bit, we
1378   // need to add one EXTRACT_SUBREG.
1379   if ((Opc == ARM64::SBFMXri || Opc == ARM64::UBFMXri) && VT == MVT::i32) {
1380     SDValue Ops64[] = {Opd0, CurDAG->getTargetConstant(LSB, MVT::i64),
1381                        CurDAG->getTargetConstant(MSB, MVT::i64)};
1382
1383     SDNode *BFM = CurDAG->getMachineNode(Opc, SDLoc(N), MVT::i64, Ops64);
1384     SDValue SubReg = CurDAG->getTargetConstant(ARM64::sub_32, MVT::i32);
1385     MachineSDNode *Node =
1386         CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, SDLoc(N), MVT::i32,
1387                                SDValue(BFM, 0), SubReg);
1388     return Node;
1389   }
1390
1391   SDValue Ops[] = {Opd0, CurDAG->getTargetConstant(LSB, VT),
1392                    CurDAG->getTargetConstant(MSB, VT)};
1393   return CurDAG->SelectNodeTo(N, Opc, VT, Ops, 3);
1394 }
1395
1396 // Is mask a i32 or i64 binary sequence 1..10..0 and
1397 // CountTrailingZeros(mask) == ExpectedTrailingZeros
1398 static bool isHighMask(uint64_t Mask, unsigned ExpectedTrailingZeros,
1399                        unsigned NumberOfIgnoredHighBits, EVT VT) {
1400   assert((VT == MVT::i32 || VT == MVT::i64) &&
1401          "i32 or i64 mask type expected!");
1402
1403   uint64_t ExpectedMask;
1404   if (VT == MVT::i32) {
1405     uint32_t ExpectedMaski32 = ~0 << ExpectedTrailingZeros;
1406     ExpectedMask = ExpectedMaski32;
1407     if (NumberOfIgnoredHighBits) {
1408       uint32_t highMask = ~0 << (32 - NumberOfIgnoredHighBits);
1409       Mask |= highMask;
1410     }
1411   } else {
1412     ExpectedMask = ((uint64_t) ~0) << ExpectedTrailingZeros;
1413     if (NumberOfIgnoredHighBits)
1414       Mask |= ((uint64_t) ~0) << (64 - NumberOfIgnoredHighBits);
1415   }
1416
1417   return Mask == ExpectedMask;
1418 }
1419
1420 // Look for bits that will be useful for later uses.
1421 // A bit is consider useless as soon as it is dropped and never used
1422 // before it as been dropped.
1423 // E.g., looking for useful bit of x
1424 // 1. y = x & 0x7
1425 // 2. z = y >> 2
1426 // After #1, x useful bits are 0x7, then the useful bits of x, live through
1427 // y.
1428 // After #2, the useful bits of x are 0x4.
1429 // However, if x is used on an unpredicatable instruction, then all its bits
1430 // are useful.
1431 // E.g.
1432 // 1. y = x & 0x7
1433 // 2. z = y >> 2
1434 // 3. str x, [@x]
1435 static void getUsefulBits(SDValue Op, APInt &UsefulBits, unsigned Depth = 0);
1436
1437 static void getUsefulBitsFromAndWithImmediate(SDValue Op, APInt &UsefulBits,
1438                                               unsigned Depth) {
1439   uint64_t Imm =
1440       cast<const ConstantSDNode>(Op.getOperand(1).getNode())->getZExtValue();
1441   Imm = ARM64_AM::decodeLogicalImmediate(Imm, UsefulBits.getBitWidth());
1442   UsefulBits &= APInt(UsefulBits.getBitWidth(), Imm);
1443   getUsefulBits(Op, UsefulBits, Depth + 1);
1444 }
1445
1446 static void getUsefulBitsFromBitfieldMoveOpd(SDValue Op, APInt &UsefulBits,
1447                                              uint64_t Imm, uint64_t MSB,
1448                                              unsigned Depth) {
1449   // inherit the bitwidth value
1450   APInt OpUsefulBits(UsefulBits);
1451   OpUsefulBits = 1;
1452
1453   if (MSB >= Imm) {
1454     OpUsefulBits = OpUsefulBits.shl(MSB - Imm + 1);
1455     --OpUsefulBits;
1456     // The interesting part will be in the lower part of the result
1457     getUsefulBits(Op, OpUsefulBits, Depth + 1);
1458     // The interesting part was starting at Imm in the argument
1459     OpUsefulBits = OpUsefulBits.shl(Imm);
1460   } else {
1461     OpUsefulBits = OpUsefulBits.shl(MSB + 1);
1462     --OpUsefulBits;
1463     // The interesting part will be shifted in the result
1464     OpUsefulBits = OpUsefulBits.shl(OpUsefulBits.getBitWidth() - Imm);
1465     getUsefulBits(Op, OpUsefulBits, Depth + 1);
1466     // The interesting part was at zero in the argument
1467     OpUsefulBits = OpUsefulBits.lshr(OpUsefulBits.getBitWidth() - Imm);
1468   }
1469
1470   UsefulBits &= OpUsefulBits;
1471 }
1472
1473 static void getUsefulBitsFromUBFM(SDValue Op, APInt &UsefulBits,
1474                                   unsigned Depth) {
1475   uint64_t Imm =
1476       cast<const ConstantSDNode>(Op.getOperand(1).getNode())->getZExtValue();
1477   uint64_t MSB =
1478       cast<const ConstantSDNode>(Op.getOperand(2).getNode())->getZExtValue();
1479
1480   getUsefulBitsFromBitfieldMoveOpd(Op, UsefulBits, Imm, MSB, Depth);
1481 }
1482
1483 static void getUsefulBitsFromOrWithShiftedReg(SDValue Op, APInt &UsefulBits,
1484                                               unsigned Depth) {
1485   uint64_t ShiftTypeAndValue =
1486       cast<const ConstantSDNode>(Op.getOperand(2).getNode())->getZExtValue();
1487   APInt Mask(UsefulBits);
1488   Mask.clearAllBits();
1489   Mask.flipAllBits();
1490
1491   if (ARM64_AM::getShiftType(ShiftTypeAndValue) == ARM64_AM::LSL) {
1492     // Shift Left
1493     uint64_t ShiftAmt = ARM64_AM::getShiftValue(ShiftTypeAndValue);
1494     Mask = Mask.shl(ShiftAmt);
1495     getUsefulBits(Op, Mask, Depth + 1);
1496     Mask = Mask.lshr(ShiftAmt);
1497   } else if (ARM64_AM::getShiftType(ShiftTypeAndValue) == ARM64_AM::LSR) {
1498     // Shift Right
1499     // We do not handle ARM64_AM::ASR, because the sign will change the
1500     // number of useful bits
1501     uint64_t ShiftAmt = ARM64_AM::getShiftValue(ShiftTypeAndValue);
1502     Mask = Mask.lshr(ShiftAmt);
1503     getUsefulBits(Op, Mask, Depth + 1);
1504     Mask = Mask.shl(ShiftAmt);
1505   } else
1506     return;
1507
1508   UsefulBits &= Mask;
1509 }
1510
1511 static void getUsefulBitsFromBFM(SDValue Op, SDValue Orig, APInt &UsefulBits,
1512                                  unsigned Depth) {
1513   uint64_t Imm =
1514       cast<const ConstantSDNode>(Op.getOperand(2).getNode())->getZExtValue();
1515   uint64_t MSB =
1516       cast<const ConstantSDNode>(Op.getOperand(3).getNode())->getZExtValue();
1517
1518   if (Op.getOperand(1) == Orig)
1519     return getUsefulBitsFromBitfieldMoveOpd(Op, UsefulBits, Imm, MSB, Depth);
1520
1521   APInt OpUsefulBits(UsefulBits);
1522   OpUsefulBits = 1;
1523
1524   if (MSB >= Imm) {
1525     OpUsefulBits = OpUsefulBits.shl(MSB - Imm + 1);
1526     --OpUsefulBits;
1527     UsefulBits &= ~OpUsefulBits;
1528     getUsefulBits(Op, UsefulBits, Depth + 1);
1529   } else {
1530     OpUsefulBits = OpUsefulBits.shl(MSB + 1);
1531     --OpUsefulBits;
1532     UsefulBits = ~(OpUsefulBits.shl(OpUsefulBits.getBitWidth() - Imm));
1533     getUsefulBits(Op, UsefulBits, Depth + 1);
1534   }
1535 }
1536
1537 static void getUsefulBitsForUse(SDNode *UserNode, APInt &UsefulBits,
1538                                 SDValue Orig, unsigned Depth) {
1539
1540   // Users of this node should have already been instruction selected
1541   // FIXME: Can we turn that into an assert?
1542   if (!UserNode->isMachineOpcode())
1543     return;
1544
1545   switch (UserNode->getMachineOpcode()) {
1546   default:
1547     return;
1548   case ARM64::ANDSWri:
1549   case ARM64::ANDSXri:
1550   case ARM64::ANDWri:
1551   case ARM64::ANDXri:
1552     // We increment Depth only when we call the getUsefulBits
1553     return getUsefulBitsFromAndWithImmediate(SDValue(UserNode, 0), UsefulBits,
1554                                              Depth);
1555   case ARM64::UBFMWri:
1556   case ARM64::UBFMXri:
1557     return getUsefulBitsFromUBFM(SDValue(UserNode, 0), UsefulBits, Depth);
1558
1559   case ARM64::ORRWrs:
1560   case ARM64::ORRXrs:
1561     if (UserNode->getOperand(1) != Orig)
1562       return;
1563     return getUsefulBitsFromOrWithShiftedReg(SDValue(UserNode, 0), UsefulBits,
1564                                              Depth);
1565   case ARM64::BFMWri:
1566   case ARM64::BFMXri:
1567     return getUsefulBitsFromBFM(SDValue(UserNode, 0), Orig, UsefulBits, Depth);
1568   }
1569 }
1570
1571 static void getUsefulBits(SDValue Op, APInt &UsefulBits, unsigned Depth) {
1572   if (Depth >= 6)
1573     return;
1574   // Initialize UsefulBits
1575   if (!Depth) {
1576     unsigned Bitwidth = Op.getValueType().getScalarType().getSizeInBits();
1577     // At the beginning, assume every produced bits is useful
1578     UsefulBits = APInt(Bitwidth, 0);
1579     UsefulBits.flipAllBits();
1580   }
1581   APInt UsersUsefulBits(UsefulBits.getBitWidth(), 0);
1582
1583   for (SDNode *Node : Op.getNode()->uses()) {
1584     // A use cannot produce useful bits
1585     APInt UsefulBitsForUse = APInt(UsefulBits);
1586     getUsefulBitsForUse(Node, UsefulBitsForUse, Op, Depth);
1587     UsersUsefulBits |= UsefulBitsForUse;
1588   }
1589   // UsefulBits contains the produced bits that are meaningful for the
1590   // current definition, thus a user cannot make a bit meaningful at
1591   // this point
1592   UsefulBits &= UsersUsefulBits;
1593 }
1594
1595 // Given a OR operation, check if we have the following pattern
1596 // ubfm c, b, imm, imm2 (or something that does the same jobs, see
1597 //                       isBitfieldExtractOp)
1598 // d = e & mask2 ; where mask is a binary sequence of 1..10..0 and
1599 //                 countTrailingZeros(mask2) == imm2 - imm + 1
1600 // f = d | c
1601 // if yes, given reference arguments will be update so that one can replace
1602 // the OR instruction with:
1603 // f = Opc Opd0, Opd1, LSB, MSB ; where Opc is a BFM, LSB = imm, and MSB = imm2
1604 static bool isBitfieldInsertOpFromOr(SDNode *N, unsigned &Opc, SDValue &Opd0,
1605                                      SDValue &Opd1, unsigned &LSB,
1606                                      unsigned &MSB, SelectionDAG *CurDAG) {
1607   assert(N->getOpcode() == ISD::OR && "Expect a OR operation");
1608
1609   // Set Opc
1610   EVT VT = N->getValueType(0);
1611   if (VT == MVT::i32)
1612     Opc = ARM64::BFMWri;
1613   else if (VT == MVT::i64)
1614     Opc = ARM64::BFMXri;
1615   else
1616     return false;
1617
1618   // Because of simplify-demanded-bits in DAGCombine, involved masks may not
1619   // have the expected shape. Try to undo that.
1620   APInt UsefulBits;
1621   getUsefulBits(SDValue(N, 0), UsefulBits);
1622
1623   unsigned NumberOfIgnoredLowBits = UsefulBits.countTrailingZeros();
1624   unsigned NumberOfIgnoredHighBits = UsefulBits.countLeadingZeros();
1625
1626   // OR is commutative, check both possibilities (does llvm provide a
1627   // way to do that directely, e.g., via code matcher?)
1628   SDValue OrOpd1Val = N->getOperand(1);
1629   SDNode *OrOpd0 = N->getOperand(0).getNode();
1630   SDNode *OrOpd1 = N->getOperand(1).getNode();
1631   for (int i = 0; i < 2;
1632        ++i, std::swap(OrOpd0, OrOpd1), OrOpd1Val = N->getOperand(0)) {
1633     unsigned BFXOpc;
1634     // Set Opd1, LSB and MSB arguments by looking for
1635     // c = ubfm b, imm, imm2
1636     if (!isBitfieldExtractOp(CurDAG, OrOpd0, BFXOpc, Opd1, LSB, MSB,
1637                              NumberOfIgnoredLowBits, true))
1638       continue;
1639
1640     // Check that the returned opcode is compatible with the pattern,
1641     // i.e., same type and zero extended (U and not S)
1642     if ((BFXOpc != ARM64::UBFMXri && VT == MVT::i64) ||
1643         (BFXOpc != ARM64::UBFMWri && VT == MVT::i32))
1644       continue;
1645
1646     // Compute the width of the bitfield insertion
1647     int sMSB = MSB - LSB + 1;
1648     // FIXME: This constraints is to catch bitfield insertion we may
1649     // want to widen the pattern if we want to grab general bitfied
1650     // move case
1651     if (sMSB <= 0)
1652       continue;
1653
1654     // Check the second part of the pattern
1655     EVT VT = OrOpd1->getValueType(0);
1656     if (VT != MVT::i32 && VT != MVT::i64)
1657       continue;
1658
1659     // Compute the Known Zero for the candidate of the first operand.
1660     // This allows to catch more general case than just looking for
1661     // AND with imm. Indeed, simplify-demanded-bits may have removed
1662     // the AND instruction because it proves it was useless.
1663     APInt KnownZero, KnownOne;
1664     CurDAG->ComputeMaskedBits(OrOpd1Val, KnownZero, KnownOne);
1665
1666     // Check if there is enough room for the second operand to appear
1667     // in the first one
1668     if (KnownZero.countTrailingOnes() < (unsigned)sMSB)
1669       continue;
1670
1671     // Set the first operand
1672     uint64_t Imm;
1673     if (isOpcWithIntImmediate(OrOpd1, ISD::AND, Imm) &&
1674         isHighMask(Imm, sMSB, NumberOfIgnoredHighBits, VT))
1675       // In that case, we can eliminate the AND
1676       Opd0 = OrOpd1->getOperand(0);
1677     else
1678       // Maybe the AND has been removed by simplify-demanded-bits
1679       // or is useful because it discards more bits
1680       Opd0 = OrOpd1Val;
1681
1682     // both parts match
1683     return true;
1684   }
1685
1686   return false;
1687 }
1688
1689 SDNode *ARM64DAGToDAGISel::SelectBitfieldInsertOp(SDNode *N) {
1690   if (N->getOpcode() != ISD::OR)
1691     return NULL;
1692
1693   unsigned Opc;
1694   unsigned LSB, MSB;
1695   SDValue Opd0, Opd1;
1696
1697   if (!isBitfieldInsertOpFromOr(N, Opc, Opd0, Opd1, LSB, MSB, CurDAG))
1698     return NULL;
1699
1700   EVT VT = N->getValueType(0);
1701   SDValue Ops[] = { Opd0,
1702                     Opd1,
1703                     CurDAG->getTargetConstant(LSB, VT),
1704                     CurDAG->getTargetConstant(MSB, VT) };
1705   return CurDAG->SelectNodeTo(N, Opc, VT, Ops, 4);
1706 }
1707
1708 SDNode *ARM64DAGToDAGISel::SelectLIBM(SDNode *N) {
1709   EVT VT = N->getValueType(0);
1710   unsigned Variant;
1711   unsigned Opc;
1712   unsigned FRINTXOpcs[] = { ARM64::FRINTXSr, ARM64::FRINTXDr };
1713
1714   if (VT == MVT::f32) {
1715     Variant = 0;
1716   } else if (VT == MVT::f64) {
1717     Variant = 1;
1718   } else
1719     return 0; // Unrecognized argument type. Fall back on default codegen.
1720
1721   // Pick the FRINTX variant needed to set the flags.
1722   unsigned FRINTXOpc = FRINTXOpcs[Variant];
1723
1724   switch (N->getOpcode()) {
1725   default:
1726     return 0; // Unrecognized libm ISD node. Fall back on default codegen.
1727   case ISD::FCEIL: {
1728     unsigned FRINTPOpcs[] = { ARM64::FRINTPSr, ARM64::FRINTPDr };
1729     Opc = FRINTPOpcs[Variant];
1730     break;
1731   }
1732   case ISD::FFLOOR: {
1733     unsigned FRINTMOpcs[] = { ARM64::FRINTMSr, ARM64::FRINTMDr };
1734     Opc = FRINTMOpcs[Variant];
1735     break;
1736   }
1737   case ISD::FTRUNC: {
1738     unsigned FRINTZOpcs[] = { ARM64::FRINTZSr, ARM64::FRINTZDr };
1739     Opc = FRINTZOpcs[Variant];
1740     break;
1741   }
1742   case ISD::FROUND: {
1743     unsigned FRINTAOpcs[] = { ARM64::FRINTASr, ARM64::FRINTADr };
1744     Opc = FRINTAOpcs[Variant];
1745     break;
1746   }
1747   }
1748
1749   SDLoc dl(N);
1750   SDValue In = N->getOperand(0);
1751   SmallVector<SDValue, 2> Ops;
1752   Ops.push_back(In);
1753
1754   if (!TM.Options.UnsafeFPMath) {
1755     SDNode *FRINTX = CurDAG->getMachineNode(FRINTXOpc, dl, VT, MVT::Glue, In);
1756     Ops.push_back(SDValue(FRINTX, 1));
1757   }
1758
1759   return CurDAG->getMachineNode(Opc, dl, VT, Ops);
1760 }
1761
1762 bool
1763 ARM64DAGToDAGISel::SelectCVTFixedPosOperand(SDValue N, SDValue &FixedPos,
1764                                               unsigned RegWidth) {
1765   APFloat FVal(0.0);
1766   if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N))
1767     FVal = CN->getValueAPF();
1768   else if (LoadSDNode *LN = dyn_cast<LoadSDNode>(N)) {
1769     // Some otherwise illegal constants are allowed in this case.
1770     if (LN->getOperand(1).getOpcode() != ARM64ISD::ADDlow ||
1771         !isa<ConstantPoolSDNode>(LN->getOperand(1)->getOperand(1)))
1772       return false;
1773
1774     ConstantPoolSDNode *CN =
1775         dyn_cast<ConstantPoolSDNode>(LN->getOperand(1)->getOperand(1));
1776     FVal = cast<ConstantFP>(CN->getConstVal())->getValueAPF();
1777   } else
1778     return false;
1779
1780   // An FCVT[SU] instruction performs: convertToInt(Val * 2^fbits) where fbits
1781   // is between 1 and 32 for a destination w-register, or 1 and 64 for an
1782   // x-register.
1783   //
1784   // By this stage, we've detected (fp_to_[su]int (fmul Val, THIS_NODE)) so we
1785   // want THIS_NODE to be 2^fbits. This is much easier to deal with using
1786   // integers.
1787   bool IsExact;
1788
1789   // fbits is between 1 and 64 in the worst-case, which means the fmul
1790   // could have 2^64 as an actual operand. Need 65 bits of precision.
1791   APSInt IntVal(65, true);
1792   FVal.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact);
1793
1794   // N.b. isPowerOf2 also checks for > 0.
1795   if (!IsExact || !IntVal.isPowerOf2()) return false;
1796   unsigned FBits = IntVal.logBase2();
1797
1798   // Checks above should have guaranteed that we haven't lost information in
1799   // finding FBits, but it must still be in range.
1800   if (FBits == 0 || FBits > RegWidth) return false;
1801
1802   FixedPos = CurDAG->getTargetConstant(FBits, MVT::i32);
1803   return true;
1804 }
1805
1806 SDNode *ARM64DAGToDAGISel::Select(SDNode *Node) {
1807   // Dump information about the Node being selected
1808   DEBUG(errs() << "Selecting: ");
1809   DEBUG(Node->dump(CurDAG));
1810   DEBUG(errs() << "\n");
1811
1812   // If we have a custom node, we already have selected!
1813   if (Node->isMachineOpcode()) {
1814     DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
1815     Node->setNodeId(-1);
1816     return NULL;
1817   }
1818
1819   // Few custom selection stuff.
1820   SDNode *ResNode = 0;
1821   EVT VT = Node->getValueType(0);
1822
1823   switch (Node->getOpcode()) {
1824   default:
1825     break;
1826
1827   case ISD::ADD:
1828     if (SDNode *I = SelectMLAV64LaneV128(Node))
1829       return I;
1830     break;
1831
1832   case ISD::LOAD: {
1833     // Try to select as an indexed load. Fall through to normal processing
1834     // if we can't.
1835     bool Done = false;
1836     SDNode *I = SelectIndexedLoad(Node, Done);
1837     if (Done)
1838       return I;
1839     break;
1840   }
1841
1842   case ISD::SRL:
1843   case ISD::AND:
1844   case ISD::SRA:
1845     if (SDNode *I = SelectBitfieldExtractOp(Node))
1846       return I;
1847     break;
1848
1849   case ISD::OR:
1850     if (SDNode *I = SelectBitfieldInsertOp(Node))
1851       return I;
1852     break;
1853
1854   case ISD::EXTRACT_VECTOR_ELT: {
1855     // Extracting lane zero is a special case where we can just use a plain
1856     // EXTRACT_SUBREG instruction, which will become FMOV. This is easier for
1857     // the rest of the compiler, especially the register allocator and copyi
1858     // propagation, to reason about, so is preferred when it's possible to
1859     // use it.
1860     ConstantSDNode *LaneNode = cast<ConstantSDNode>(Node->getOperand(1));
1861     // Bail and use the default Select() for non-zero lanes.
1862     if (LaneNode->getZExtValue() != 0)
1863       break;
1864     // If the element type is not the same as the result type, likewise
1865     // bail and use the default Select(), as there's more to do than just
1866     // a cross-class COPY. This catches extracts of i8 and i16 elements
1867     // since they will need an explicit zext.
1868     if (VT != Node->getOperand(0).getValueType().getVectorElementType())
1869       break;
1870     unsigned SubReg;
1871     switch (Node->getOperand(0)
1872                 .getValueType()
1873                 .getVectorElementType()
1874                 .getSizeInBits()) {
1875     default:
1876       assert(0 && "Unexpected vector element type!");
1877     case 64:
1878       SubReg = ARM64::dsub;
1879       break;
1880     case 32:
1881       SubReg = ARM64::ssub;
1882       break;
1883     case 16: // FALLTHROUGH
1884     case 8:
1885       llvm_unreachable("unexpected zext-requiring extract element!");
1886     }
1887     SDValue Extract = CurDAG->getTargetExtractSubreg(SubReg, SDLoc(Node), VT,
1888                                                      Node->getOperand(0));
1889     DEBUG(dbgs() << "ISEL: Custom selection!\n=> ");
1890     DEBUG(Extract->dumpr(CurDAG));
1891     DEBUG(dbgs() << "\n");
1892     return Extract.getNode();
1893   }
1894   case ISD::Constant: {
1895     // Materialize zero constants as copies from WZR/XZR.  This allows
1896     // the coalescer to propagate these into other instructions.
1897     ConstantSDNode *ConstNode = cast<ConstantSDNode>(Node);
1898     if (ConstNode->isNullValue()) {
1899       if (VT == MVT::i32)
1900         return CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(Node),
1901                                       ARM64::WZR, MVT::i32).getNode();
1902       else if (VT == MVT::i64)
1903         return CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(Node),
1904                                       ARM64::XZR, MVT::i64).getNode();
1905     }
1906     break;
1907   }
1908
1909   case ISD::FrameIndex: {
1910     // Selects to ADDXri FI, 0 which in turn will become ADDXri SP, imm.
1911     int FI = cast<FrameIndexSDNode>(Node)->getIndex();
1912     unsigned Shifter = ARM64_AM::getShifterImm(ARM64_AM::LSL, 0);
1913     const TargetLowering *TLI = getTargetLowering();
1914     SDValue TFI = CurDAG->getTargetFrameIndex(FI, TLI->getPointerTy());
1915     SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, MVT::i32),
1916                       CurDAG->getTargetConstant(Shifter, MVT::i32) };
1917     return CurDAG->SelectNodeTo(Node, ARM64::ADDXri, MVT::i64, Ops, 3);
1918   }
1919   case ISD::INTRINSIC_W_CHAIN: {
1920     unsigned IntNo = cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue();
1921     switch (IntNo) {
1922     default:
1923       break;
1924     case Intrinsic::arm64_ldaxp:
1925     case Intrinsic::arm64_ldxp: {
1926       unsigned Op =
1927           IntNo == Intrinsic::arm64_ldaxp ? ARM64::LDAXPX : ARM64::LDXPX;
1928       SDValue MemAddr = Node->getOperand(2);
1929       SDLoc DL(Node);
1930       SDValue Chain = Node->getOperand(0);
1931
1932       SDNode *Ld = CurDAG->getMachineNode(Op, DL, MVT::i64, MVT::i64,
1933                                           MVT::Other, MemAddr, Chain);
1934
1935       // Transfer memoperands.
1936       MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
1937       MemOp[0] = cast<MemIntrinsicSDNode>(Node)->getMemOperand();
1938       cast<MachineSDNode>(Ld)->setMemRefs(MemOp, MemOp + 1);
1939       return Ld;
1940     }
1941     case Intrinsic::arm64_stlxp:
1942     case Intrinsic::arm64_stxp: {
1943       unsigned Op =
1944           IntNo == Intrinsic::arm64_stlxp ? ARM64::STLXPX : ARM64::STXPX;
1945       SDLoc DL(Node);
1946       SDValue Chain = Node->getOperand(0);
1947       SDValue ValLo = Node->getOperand(2);
1948       SDValue ValHi = Node->getOperand(3);
1949       SDValue MemAddr = Node->getOperand(4);
1950
1951       // Place arguments in the right order.
1952       SmallVector<SDValue, 7> Ops;
1953       Ops.push_back(ValLo);
1954       Ops.push_back(ValHi);
1955       Ops.push_back(MemAddr);
1956       Ops.push_back(Chain);
1957
1958       SDNode *St = CurDAG->getMachineNode(Op, DL, MVT::i32, MVT::Other, Ops);
1959       // Transfer memoperands.
1960       MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
1961       MemOp[0] = cast<MemIntrinsicSDNode>(Node)->getMemOperand();
1962       cast<MachineSDNode>(St)->setMemRefs(MemOp, MemOp + 1);
1963
1964       return St;
1965     }
1966     case Intrinsic::arm64_neon_ld1x2:
1967       if (VT == MVT::v8i8)
1968         return SelectLoad(Node, 2, ARM64::LD1Twov8b, ARM64::dsub0);
1969       else if (VT == MVT::v16i8)
1970         return SelectLoad(Node, 2, ARM64::LD1Twov16b, ARM64::qsub0);
1971       else if (VT == MVT::v4i16)
1972         return SelectLoad(Node, 2, ARM64::LD1Twov4h, ARM64::dsub0);
1973       else if (VT == MVT::v8i16)
1974         return SelectLoad(Node, 2, ARM64::LD1Twov8h, ARM64::qsub0);
1975       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
1976         return SelectLoad(Node, 2, ARM64::LD1Twov2s, ARM64::dsub0);
1977       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
1978         return SelectLoad(Node, 2, ARM64::LD1Twov4s, ARM64::qsub0);
1979       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
1980         return SelectLoad(Node, 2, ARM64::LD1Twov1d, ARM64::dsub0);
1981       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
1982         return SelectLoad(Node, 2, ARM64::LD1Twov2d, ARM64::qsub0);
1983       break;
1984     case Intrinsic::arm64_neon_ld1x3:
1985       if (VT == MVT::v8i8)
1986         return SelectLoad(Node, 3, ARM64::LD1Threev8b, ARM64::dsub0);
1987       else if (VT == MVT::v16i8)
1988         return SelectLoad(Node, 3, ARM64::LD1Threev16b, ARM64::qsub0);
1989       else if (VT == MVT::v4i16)
1990         return SelectLoad(Node, 3, ARM64::LD1Threev4h, ARM64::dsub0);
1991       else if (VT == MVT::v8i16)
1992         return SelectLoad(Node, 3, ARM64::LD1Threev8h, ARM64::qsub0);
1993       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
1994         return SelectLoad(Node, 3, ARM64::LD1Threev2s, ARM64::dsub0);
1995       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
1996         return SelectLoad(Node, 3, ARM64::LD1Threev4s, ARM64::qsub0);
1997       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
1998         return SelectLoad(Node, 3, ARM64::LD1Threev1d, ARM64::dsub0);
1999       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2000         return SelectLoad(Node, 3, ARM64::LD1Threev2d, ARM64::qsub0);
2001       break;
2002     case Intrinsic::arm64_neon_ld1x4:
2003       if (VT == MVT::v8i8)
2004         return SelectLoad(Node, 4, ARM64::LD1Fourv8b, ARM64::dsub0);
2005       else if (VT == MVT::v16i8)
2006         return SelectLoad(Node, 4, ARM64::LD1Fourv16b, ARM64::qsub0);
2007       else if (VT == MVT::v4i16)
2008         return SelectLoad(Node, 4, ARM64::LD1Fourv4h, ARM64::dsub0);
2009       else if (VT == MVT::v8i16)
2010         return SelectLoad(Node, 4, ARM64::LD1Fourv8h, ARM64::qsub0);
2011       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2012         return SelectLoad(Node, 4, ARM64::LD1Fourv2s, ARM64::dsub0);
2013       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2014         return SelectLoad(Node, 4, ARM64::LD1Fourv4s, ARM64::qsub0);
2015       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2016         return SelectLoad(Node, 4, ARM64::LD1Fourv1d, ARM64::dsub0);
2017       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2018         return SelectLoad(Node, 4, ARM64::LD1Fourv2d, ARM64::qsub0);
2019       break;
2020     case Intrinsic::arm64_neon_ld2:
2021       if (VT == MVT::v8i8)
2022         return SelectLoad(Node, 2, ARM64::LD2Twov8b, ARM64::dsub0);
2023       else if (VT == MVT::v16i8)
2024         return SelectLoad(Node, 2, ARM64::LD2Twov16b, ARM64::qsub0);
2025       else if (VT == MVT::v4i16)
2026         return SelectLoad(Node, 2, ARM64::LD2Twov4h, ARM64::dsub0);
2027       else if (VT == MVT::v8i16)
2028         return SelectLoad(Node, 2, ARM64::LD2Twov8h, ARM64::qsub0);
2029       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2030         return SelectLoad(Node, 2, ARM64::LD2Twov2s, ARM64::dsub0);
2031       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2032         return SelectLoad(Node, 2, ARM64::LD2Twov4s, ARM64::qsub0);
2033       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2034         return SelectLoad(Node, 2, ARM64::LD1Twov1d, ARM64::dsub0);
2035       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2036         return SelectLoad(Node, 2, ARM64::LD2Twov2d, ARM64::qsub0);
2037       break;
2038     case Intrinsic::arm64_neon_ld3:
2039       if (VT == MVT::v8i8)
2040         return SelectLoad(Node, 3, ARM64::LD3Threev8b, ARM64::dsub0);
2041       else if (VT == MVT::v16i8)
2042         return SelectLoad(Node, 3, ARM64::LD3Threev16b, ARM64::qsub0);
2043       else if (VT == MVT::v4i16)
2044         return SelectLoad(Node, 3, ARM64::LD3Threev4h, ARM64::dsub0);
2045       else if (VT == MVT::v8i16)
2046         return SelectLoad(Node, 3, ARM64::LD3Threev8h, ARM64::qsub0);
2047       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2048         return SelectLoad(Node, 3, ARM64::LD3Threev2s, ARM64::dsub0);
2049       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2050         return SelectLoad(Node, 3, ARM64::LD3Threev4s, ARM64::qsub0);
2051       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2052         return SelectLoad(Node, 3, ARM64::LD1Threev1d, ARM64::dsub0);
2053       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2054         return SelectLoad(Node, 3, ARM64::LD3Threev2d, ARM64::qsub0);
2055       break;
2056     case Intrinsic::arm64_neon_ld4:
2057       if (VT == MVT::v8i8)
2058         return SelectLoad(Node, 4, ARM64::LD4Fourv8b, ARM64::dsub0);
2059       else if (VT == MVT::v16i8)
2060         return SelectLoad(Node, 4, ARM64::LD4Fourv16b, ARM64::qsub0);
2061       else if (VT == MVT::v4i16)
2062         return SelectLoad(Node, 4, ARM64::LD4Fourv4h, ARM64::dsub0);
2063       else if (VT == MVT::v8i16)
2064         return SelectLoad(Node, 4, ARM64::LD4Fourv8h, ARM64::qsub0);
2065       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2066         return SelectLoad(Node, 4, ARM64::LD4Fourv2s, ARM64::dsub0);
2067       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2068         return SelectLoad(Node, 4, ARM64::LD4Fourv4s, ARM64::qsub0);
2069       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2070         return SelectLoad(Node, 4, ARM64::LD1Fourv1d, ARM64::dsub0);
2071       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2072         return SelectLoad(Node, 4, ARM64::LD4Fourv2d, ARM64::qsub0);
2073       break;
2074     case Intrinsic::arm64_neon_ld2r:
2075       if (VT == MVT::v8i8)
2076         return SelectLoad(Node, 2, ARM64::LD2Rv8b, ARM64::dsub0);
2077       else if (VT == MVT::v16i8)
2078         return SelectLoad(Node, 2, ARM64::LD2Rv16b, ARM64::qsub0);
2079       else if (VT == MVT::v4i16)
2080         return SelectLoad(Node, 2, ARM64::LD2Rv4h, ARM64::dsub0);
2081       else if (VT == MVT::v8i16)
2082         return SelectLoad(Node, 2, ARM64::LD2Rv8h, ARM64::qsub0);
2083       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2084         return SelectLoad(Node, 2, ARM64::LD2Rv2s, ARM64::dsub0);
2085       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2086         return SelectLoad(Node, 2, ARM64::LD2Rv4s, ARM64::qsub0);
2087       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2088         return SelectLoad(Node, 2, ARM64::LD2Rv1d, ARM64::dsub0);
2089       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2090         return SelectLoad(Node, 2, ARM64::LD2Rv2d, ARM64::qsub0);
2091       break;
2092     case Intrinsic::arm64_neon_ld3r:
2093       if (VT == MVT::v8i8)
2094         return SelectLoad(Node, 3, ARM64::LD3Rv8b, ARM64::dsub0);
2095       else if (VT == MVT::v16i8)
2096         return SelectLoad(Node, 3, ARM64::LD3Rv16b, ARM64::qsub0);
2097       else if (VT == MVT::v4i16)
2098         return SelectLoad(Node, 3, ARM64::LD3Rv4h, ARM64::dsub0);
2099       else if (VT == MVT::v8i16)
2100         return SelectLoad(Node, 3, ARM64::LD3Rv8h, ARM64::qsub0);
2101       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2102         return SelectLoad(Node, 3, ARM64::LD3Rv2s, ARM64::dsub0);
2103       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2104         return SelectLoad(Node, 3, ARM64::LD3Rv4s, ARM64::qsub0);
2105       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2106         return SelectLoad(Node, 3, ARM64::LD3Rv1d, ARM64::dsub0);
2107       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2108         return SelectLoad(Node, 3, ARM64::LD3Rv2d, ARM64::qsub0);
2109       break;
2110     case Intrinsic::arm64_neon_ld4r:
2111       if (VT == MVT::v8i8)
2112         return SelectLoad(Node, 4, ARM64::LD4Rv8b, ARM64::dsub0);
2113       else if (VT == MVT::v16i8)
2114         return SelectLoad(Node, 4, ARM64::LD4Rv16b, ARM64::qsub0);
2115       else if (VT == MVT::v4i16)
2116         return SelectLoad(Node, 4, ARM64::LD4Rv4h, ARM64::dsub0);
2117       else if (VT == MVT::v8i16)
2118         return SelectLoad(Node, 4, ARM64::LD4Rv8h, ARM64::qsub0);
2119       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2120         return SelectLoad(Node, 4, ARM64::LD4Rv2s, ARM64::dsub0);
2121       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2122         return SelectLoad(Node, 4, ARM64::LD4Rv4s, ARM64::qsub0);
2123       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2124         return SelectLoad(Node, 4, ARM64::LD4Rv1d, ARM64::dsub0);
2125       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2126         return SelectLoad(Node, 4, ARM64::LD4Rv2d, ARM64::qsub0);
2127       break;
2128     case Intrinsic::arm64_neon_ld2lane:
2129       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2130         return SelectLoadLane(Node, 2, ARM64::LD2i8);
2131       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2132         return SelectLoadLane(Node, 2, ARM64::LD2i16);
2133       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2134                VT == MVT::v2f32)
2135         return SelectLoadLane(Node, 2, ARM64::LD2i32);
2136       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2137                VT == MVT::v1f64)
2138         return SelectLoadLane(Node, 2, ARM64::LD2i64);
2139       break;
2140     case Intrinsic::arm64_neon_ld3lane:
2141       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2142         return SelectLoadLane(Node, 3, ARM64::LD3i8);
2143       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2144         return SelectLoadLane(Node, 3, ARM64::LD3i16);
2145       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2146                VT == MVT::v2f32)
2147         return SelectLoadLane(Node, 3, ARM64::LD3i32);
2148       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2149                VT == MVT::v1f64)
2150         return SelectLoadLane(Node, 3, ARM64::LD3i64);
2151       break;
2152     case Intrinsic::arm64_neon_ld4lane:
2153       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2154         return SelectLoadLane(Node, 4, ARM64::LD4i8);
2155       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2156         return SelectLoadLane(Node, 4, ARM64::LD4i16);
2157       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2158                VT == MVT::v2f32)
2159         return SelectLoadLane(Node, 4, ARM64::LD4i32);
2160       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2161                VT == MVT::v1f64)
2162         return SelectLoadLane(Node, 4, ARM64::LD4i64);
2163       break;
2164     }
2165   } break;
2166   case ISD::INTRINSIC_WO_CHAIN: {
2167     unsigned IntNo = cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue();
2168     switch (IntNo) {
2169     default:
2170       break;
2171     case Intrinsic::arm64_neon_tbl2:
2172       return SelectTable(Node, 2, VT == MVT::v8i8 ? ARM64::TBLv8i8Two
2173                                                   : ARM64::TBLv16i8Two,
2174                          false);
2175     case Intrinsic::arm64_neon_tbl3:
2176       return SelectTable(Node, 3, VT == MVT::v8i8 ? ARM64::TBLv8i8Three
2177                                                   : ARM64::TBLv16i8Three,
2178                          false);
2179     case Intrinsic::arm64_neon_tbl4:
2180       return SelectTable(Node, 4, VT == MVT::v8i8 ? ARM64::TBLv8i8Four
2181                                                   : ARM64::TBLv16i8Four,
2182                          false);
2183     case Intrinsic::arm64_neon_tbx2:
2184       return SelectTable(Node, 2, VT == MVT::v8i8 ? ARM64::TBXv8i8Two
2185                                                   : ARM64::TBXv16i8Two,
2186                          true);
2187     case Intrinsic::arm64_neon_tbx3:
2188       return SelectTable(Node, 3, VT == MVT::v8i8 ? ARM64::TBXv8i8Three
2189                                                   : ARM64::TBXv16i8Three,
2190                          true);
2191     case Intrinsic::arm64_neon_tbx4:
2192       return SelectTable(Node, 4, VT == MVT::v8i8 ? ARM64::TBXv8i8Four
2193                                                   : ARM64::TBXv16i8Four,
2194                          true);
2195     case Intrinsic::arm64_neon_smull:
2196     case Intrinsic::arm64_neon_umull:
2197       if (SDNode *N = SelectMULLV64LaneV128(IntNo, Node))
2198         return N;
2199       break;
2200     }
2201     break;
2202   }
2203   case ISD::INTRINSIC_VOID: {
2204     unsigned IntNo = cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue();
2205     if (Node->getNumOperands() >= 3)
2206       VT = Node->getOperand(2)->getValueType(0);
2207     switch (IntNo) {
2208     default:
2209       break;
2210     case Intrinsic::arm64_neon_st1x2: {
2211       if (VT == MVT::v8i8)
2212         return SelectStore(Node, 2, ARM64::ST1Twov8b);
2213       else if (VT == MVT::v16i8)
2214         return SelectStore(Node, 2, ARM64::ST1Twov16b);
2215       else if (VT == MVT::v4i16)
2216         return SelectStore(Node, 2, ARM64::ST1Twov4h);
2217       else if (VT == MVT::v8i16)
2218         return SelectStore(Node, 2, ARM64::ST1Twov8h);
2219       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2220         return SelectStore(Node, 2, ARM64::ST1Twov2s);
2221       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2222         return SelectStore(Node, 2, ARM64::ST1Twov4s);
2223       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2224         return SelectStore(Node, 2, ARM64::ST1Twov2d);
2225       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2226         return SelectStore(Node, 2, ARM64::ST1Twov1d);
2227       break;
2228     }
2229     case Intrinsic::arm64_neon_st1x3: {
2230       if (VT == MVT::v8i8)
2231         return SelectStore(Node, 3, ARM64::ST1Threev8b);
2232       else if (VT == MVT::v16i8)
2233         return SelectStore(Node, 3, ARM64::ST1Threev16b);
2234       else if (VT == MVT::v4i16)
2235         return SelectStore(Node, 3, ARM64::ST1Threev4h);
2236       else if (VT == MVT::v8i16)
2237         return SelectStore(Node, 3, ARM64::ST1Threev8h);
2238       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2239         return SelectStore(Node, 3, ARM64::ST1Threev2s);
2240       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2241         return SelectStore(Node, 3, ARM64::ST1Threev4s);
2242       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2243         return SelectStore(Node, 3, ARM64::ST1Threev2d);
2244       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2245         return SelectStore(Node, 3, ARM64::ST1Threev1d);
2246       break;
2247     }
2248     case Intrinsic::arm64_neon_st1x4: {
2249       if (VT == MVT::v8i8)
2250         return SelectStore(Node, 4, ARM64::ST1Fourv8b);
2251       else if (VT == MVT::v16i8)
2252         return SelectStore(Node, 4, ARM64::ST1Fourv16b);
2253       else if (VT == MVT::v4i16)
2254         return SelectStore(Node, 4, ARM64::ST1Fourv4h);
2255       else if (VT == MVT::v8i16)
2256         return SelectStore(Node, 4, ARM64::ST1Fourv8h);
2257       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2258         return SelectStore(Node, 4, ARM64::ST1Fourv2s);
2259       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2260         return SelectStore(Node, 4, ARM64::ST1Fourv4s);
2261       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2262         return SelectStore(Node, 4, ARM64::ST1Fourv2d);
2263       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2264         return SelectStore(Node, 4, ARM64::ST1Fourv1d);
2265       break;
2266     }
2267     case Intrinsic::arm64_neon_st2: {
2268       if (VT == MVT::v8i8)
2269         return SelectStore(Node, 2, ARM64::ST2Twov8b);
2270       else if (VT == MVT::v16i8)
2271         return SelectStore(Node, 2, ARM64::ST2Twov16b);
2272       else if (VT == MVT::v4i16)
2273         return SelectStore(Node, 2, ARM64::ST2Twov4h);
2274       else if (VT == MVT::v8i16)
2275         return SelectStore(Node, 2, ARM64::ST2Twov8h);
2276       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2277         return SelectStore(Node, 2, ARM64::ST2Twov2s);
2278       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2279         return SelectStore(Node, 2, ARM64::ST2Twov4s);
2280       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2281         return SelectStore(Node, 2, ARM64::ST2Twov2d);
2282       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2283         return SelectStore(Node, 2, ARM64::ST1Twov1d);
2284       break;
2285     }
2286     case Intrinsic::arm64_neon_st3: {
2287       if (VT == MVT::v8i8)
2288         return SelectStore(Node, 3, ARM64::ST3Threev8b);
2289       else if (VT == MVT::v16i8)
2290         return SelectStore(Node, 3, ARM64::ST3Threev16b);
2291       else if (VT == MVT::v4i16)
2292         return SelectStore(Node, 3, ARM64::ST3Threev4h);
2293       else if (VT == MVT::v8i16)
2294         return SelectStore(Node, 3, ARM64::ST3Threev8h);
2295       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2296         return SelectStore(Node, 3, ARM64::ST3Threev2s);
2297       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2298         return SelectStore(Node, 3, ARM64::ST3Threev4s);
2299       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2300         return SelectStore(Node, 3, ARM64::ST3Threev2d);
2301       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2302         return SelectStore(Node, 3, ARM64::ST1Threev1d);
2303       break;
2304     }
2305     case Intrinsic::arm64_neon_st4: {
2306       if (VT == MVT::v8i8)
2307         return SelectStore(Node, 4, ARM64::ST4Fourv8b);
2308       else if (VT == MVT::v16i8)
2309         return SelectStore(Node, 4, ARM64::ST4Fourv16b);
2310       else if (VT == MVT::v4i16)
2311         return SelectStore(Node, 4, ARM64::ST4Fourv4h);
2312       else if (VT == MVT::v8i16)
2313         return SelectStore(Node, 4, ARM64::ST4Fourv8h);
2314       else if (VT == MVT::v2i32 || VT == MVT::v2f32)
2315         return SelectStore(Node, 4, ARM64::ST4Fourv2s);
2316       else if (VT == MVT::v4i32 || VT == MVT::v4f32)
2317         return SelectStore(Node, 4, ARM64::ST4Fourv4s);
2318       else if (VT == MVT::v2i64 || VT == MVT::v2f64)
2319         return SelectStore(Node, 4, ARM64::ST4Fourv2d);
2320       else if (VT == MVT::v1i64 || VT == MVT::v1f64)
2321         return SelectStore(Node, 4, ARM64::ST1Fourv1d);
2322       break;
2323     }
2324     case Intrinsic::arm64_neon_st2lane: {
2325       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2326         return SelectStoreLane(Node, 2, ARM64::ST2i8);
2327       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2328         return SelectStoreLane(Node, 2, ARM64::ST2i16);
2329       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2330                VT == MVT::v2f32)
2331         return SelectStoreLane(Node, 2, ARM64::ST2i32);
2332       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2333                VT == MVT::v1f64)
2334         return SelectStoreLane(Node, 2, ARM64::ST2i64);
2335       break;
2336     }
2337     case Intrinsic::arm64_neon_st3lane: {
2338       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2339         return SelectStoreLane(Node, 3, ARM64::ST3i8);
2340       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2341         return SelectStoreLane(Node, 3, ARM64::ST3i16);
2342       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2343                VT == MVT::v2f32)
2344         return SelectStoreLane(Node, 3, ARM64::ST3i32);
2345       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2346                VT == MVT::v1f64)
2347         return SelectStoreLane(Node, 3, ARM64::ST3i64);
2348       break;
2349     }
2350     case Intrinsic::arm64_neon_st4lane: {
2351       if (VT == MVT::v16i8 || VT == MVT::v8i8)
2352         return SelectStoreLane(Node, 4, ARM64::ST4i8);
2353       else if (VT == MVT::v8i16 || VT == MVT::v4i16)
2354         return SelectStoreLane(Node, 4, ARM64::ST4i16);
2355       else if (VT == MVT::v4i32 || VT == MVT::v2i32 || VT == MVT::v4f32 ||
2356                VT == MVT::v2f32)
2357         return SelectStoreLane(Node, 4, ARM64::ST4i32);
2358       else if (VT == MVT::v2i64 || VT == MVT::v1i64 || VT == MVT::v2f64 ||
2359                VT == MVT::v1f64)
2360         return SelectStoreLane(Node, 4, ARM64::ST4i64);
2361       break;
2362     }
2363     }
2364   }
2365
2366   case ISD::FCEIL:
2367   case ISD::FFLOOR:
2368   case ISD::FTRUNC:
2369   case ISD::FROUND:
2370     if (SDNode *I = SelectLIBM(Node))
2371       return I;
2372     break;
2373   }
2374
2375   // Select the default instruction
2376   ResNode = SelectCode(Node);
2377
2378   DEBUG(errs() << "=> ");
2379   if (ResNode == NULL || ResNode == Node)
2380     DEBUG(Node->dump(CurDAG));
2381   else
2382     DEBUG(ResNode->dump(CurDAG));
2383   DEBUG(errs() << "\n");
2384
2385   return ResNode;
2386 }
2387
2388 /// createARM64ISelDag - This pass converts a legalized DAG into a
2389 /// ARM64-specific DAG, ready for instruction scheduling.
2390 FunctionPass *llvm::createARM64ISelDag(ARM64TargetMachine &TM,
2391                                        CodeGenOpt::Level OptLevel) {
2392   return new ARM64DAGToDAGISel(TM, OptLevel);
2393 }