ARMISelDAGToDAG.cpp revision 7f687195175f01d820eea70e8a647a61d5b99fce
1//===-- ARMISelDAGToDAG.cpp - A dag to dag inst selector for ARM ----------===//
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 ARM target.
11//
12//===----------------------------------------------------------------------===//
13
14#include "ARM.h"
15#include "ARMAddressingModes.h"
16#include "ARMTargetMachine.h"
17#include "llvm/CallingConv.h"
18#include "llvm/Constants.h"
19#include "llvm/DerivedTypes.h"
20#include "llvm/Function.h"
21#include "llvm/Intrinsics.h"
22#include "llvm/LLVMContext.h"
23#include "llvm/CodeGen/MachineFrameInfo.h"
24#include "llvm/CodeGen/MachineFunction.h"
25#include "llvm/CodeGen/MachineInstrBuilder.h"
26#include "llvm/CodeGen/SelectionDAG.h"
27#include "llvm/CodeGen/SelectionDAGISel.h"
28#include "llvm/Target/TargetLowering.h"
29#include "llvm/Target/TargetOptions.h"
30#include "llvm/Support/CommandLine.h"
31#include "llvm/Support/Compiler.h"
32#include "llvm/Support/Debug.h"
33#include "llvm/Support/ErrorHandling.h"
34#include "llvm/Support/raw_ostream.h"
35
36using namespace llvm;
37
38static cl::opt<bool>
39UseRegSeq("neon-reg-sequence", cl::Hidden,
40          cl::desc("Use reg_sequence to model ld / st of multiple neon regs"));
41
42//===--------------------------------------------------------------------===//
43/// ARMDAGToDAGISel - ARM specific code to select ARM machine
44/// instructions for SelectionDAG operations.
45///
46namespace {
47class ARMDAGToDAGISel : public SelectionDAGISel {
48  ARMBaseTargetMachine &TM;
49
50  /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
51  /// make the right decision when generating code for different targets.
52  const ARMSubtarget *Subtarget;
53
54public:
55  explicit ARMDAGToDAGISel(ARMBaseTargetMachine &tm,
56                           CodeGenOpt::Level OptLevel)
57    : SelectionDAGISel(tm, OptLevel), TM(tm),
58    Subtarget(&TM.getSubtarget<ARMSubtarget>()) {
59  }
60
61  virtual const char *getPassName() const {
62    return "ARM Instruction Selection";
63  }
64
65  /// getI32Imm - Return a target constant of type i32 with the specified
66  /// value.
67  inline SDValue getI32Imm(unsigned Imm) {
68    return CurDAG->getTargetConstant(Imm, MVT::i32);
69  }
70
71  SDNode *Select(SDNode *N);
72
73  bool SelectShifterOperandReg(SDNode *Op, SDValue N, SDValue &A,
74                               SDValue &B, SDValue &C);
75  bool SelectAddrMode2(SDNode *Op, SDValue N, SDValue &Base,
76                       SDValue &Offset, SDValue &Opc);
77  bool SelectAddrMode2Offset(SDNode *Op, SDValue N,
78                             SDValue &Offset, SDValue &Opc);
79  bool SelectAddrMode3(SDNode *Op, SDValue N, SDValue &Base,
80                       SDValue &Offset, SDValue &Opc);
81  bool SelectAddrMode3Offset(SDNode *Op, SDValue N,
82                             SDValue &Offset, SDValue &Opc);
83  bool SelectAddrMode4(SDNode *Op, SDValue N, SDValue &Addr,
84                       SDValue &Mode);
85  bool SelectAddrMode5(SDNode *Op, SDValue N, SDValue &Base,
86                       SDValue &Offset);
87  bool SelectAddrMode6(SDNode *Op, SDValue N, SDValue &Addr, SDValue &Align);
88
89  bool SelectAddrModePC(SDNode *Op, SDValue N, SDValue &Offset,
90                        SDValue &Label);
91
92  bool SelectThumbAddrModeRR(SDNode *Op, SDValue N, SDValue &Base,
93                             SDValue &Offset);
94  bool SelectThumbAddrModeRI5(SDNode *Op, SDValue N, unsigned Scale,
95                              SDValue &Base, SDValue &OffImm,
96                              SDValue &Offset);
97  bool SelectThumbAddrModeS1(SDNode *Op, SDValue N, SDValue &Base,
98                             SDValue &OffImm, SDValue &Offset);
99  bool SelectThumbAddrModeS2(SDNode *Op, SDValue N, SDValue &Base,
100                             SDValue &OffImm, SDValue &Offset);
101  bool SelectThumbAddrModeS4(SDNode *Op, SDValue N, SDValue &Base,
102                             SDValue &OffImm, SDValue &Offset);
103  bool SelectThumbAddrModeSP(SDNode *Op, SDValue N, SDValue &Base,
104                             SDValue &OffImm);
105
106  bool SelectT2ShifterOperandReg(SDNode *Op, SDValue N,
107                                 SDValue &BaseReg, SDValue &Opc);
108  bool SelectT2AddrModeImm12(SDNode *Op, SDValue N, SDValue &Base,
109                             SDValue &OffImm);
110  bool SelectT2AddrModeImm8(SDNode *Op, SDValue N, SDValue &Base,
111                            SDValue &OffImm);
112  bool SelectT2AddrModeImm8Offset(SDNode *Op, SDValue N,
113                                 SDValue &OffImm);
114  bool SelectT2AddrModeImm8s4(SDNode *Op, SDValue N, SDValue &Base,
115                              SDValue &OffImm);
116  bool SelectT2AddrModeSoReg(SDNode *Op, SDValue N, SDValue &Base,
117                             SDValue &OffReg, SDValue &ShImm);
118
119  // Include the pieces autogenerated from the target description.
120#include "ARMGenDAGISel.inc"
121
122private:
123  /// SelectARMIndexedLoad - Indexed (pre/post inc/dec) load matching code for
124  /// ARM.
125  SDNode *SelectARMIndexedLoad(SDNode *N);
126  SDNode *SelectT2IndexedLoad(SDNode *N);
127
128  /// SelectVLD - Select NEON load intrinsics.  NumVecs should be
129  /// 1, 2, 3 or 4.  The opcode arrays specify the instructions used for
130  /// loads of D registers and even subregs and odd subregs of Q registers.
131  /// For NumVecs <= 2, QOpcodes1 is not used.
132  SDNode *SelectVLD(SDNode *N, unsigned NumVecs, unsigned *DOpcodes,
133                    unsigned *QOpcodes0, unsigned *QOpcodes1);
134
135  /// SelectVST - Select NEON store intrinsics.  NumVecs should
136  /// be 1, 2, 3 or 4.  The opcode arrays specify the instructions used for
137  /// stores of D registers and even subregs and odd subregs of Q registers.
138  /// For NumVecs <= 2, QOpcodes1 is not used.
139  SDNode *SelectVST(SDNode *N, unsigned NumVecs, unsigned *DOpcodes,
140                    unsigned *QOpcodes0, unsigned *QOpcodes1);
141
142  /// SelectVLDSTLane - Select NEON load/store lane intrinsics.  NumVecs should
143  /// be 2, 3 or 4.  The opcode arrays specify the instructions used for
144  /// load/store of D registers and even subregs and odd subregs of Q registers.
145  SDNode *SelectVLDSTLane(SDNode *N, bool IsLoad, unsigned NumVecs,
146                          unsigned *DOpcodes, unsigned *QOpcodes0,
147                          unsigned *QOpcodes1);
148
149  /// SelectV6T2BitfieldExtractOp - Select SBFX/UBFX instructions for ARM.
150  SDNode *SelectV6T2BitfieldExtractOp(SDNode *N, bool isSigned);
151
152  /// SelectCMOVOp - Select CMOV instructions for ARM.
153  SDNode *SelectCMOVOp(SDNode *N);
154  SDNode *SelectT2CMOVShiftOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
155                              ARMCC::CondCodes CCVal, SDValue CCR,
156                              SDValue InFlag);
157  SDNode *SelectARMCMOVShiftOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
158                               ARMCC::CondCodes CCVal, SDValue CCR,
159                               SDValue InFlag);
160  SDNode *SelectT2CMOVSoImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
161                              ARMCC::CondCodes CCVal, SDValue CCR,
162                              SDValue InFlag);
163  SDNode *SelectARMCMOVSoImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
164                               ARMCC::CondCodes CCVal, SDValue CCR,
165                               SDValue InFlag);
166
167  SDNode *SelectConcatVector(SDNode *N);
168
169  /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
170  /// inline asm expressions.
171  virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
172                                            char ConstraintCode,
173                                            std::vector<SDValue> &OutOps);
174
175  /// PairDRegs - Form a quad register from a pair of D registers.
176  ///
177  SDNode *PairDRegs(EVT VT, SDValue V0, SDValue V1);
178
179  /// PairDRegs - Form a quad register pair from a pair of Q registers.
180  ///
181  SDNode *PairQRegs(EVT VT, SDValue V0, SDValue V1);
182
183  /// QuadDRegs - Form a quad register pair from a quad of D registers.
184  ///
185  SDNode *QuadDRegs(EVT VT, SDValue V0, SDValue V1, SDValue V2, SDValue V3);
186};
187}
188
189/// isInt32Immediate - This method tests to see if the node is a 32-bit constant
190/// operand. If so Imm will receive the 32-bit value.
191static bool isInt32Immediate(SDNode *N, unsigned &Imm) {
192  if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i32) {
193    Imm = cast<ConstantSDNode>(N)->getZExtValue();
194    return true;
195  }
196  return false;
197}
198
199// isInt32Immediate - This method tests to see if a constant operand.
200// If so Imm will receive the 32 bit value.
201static bool isInt32Immediate(SDValue N, unsigned &Imm) {
202  return isInt32Immediate(N.getNode(), Imm);
203}
204
205// isOpcWithIntImmediate - This method tests to see if the node is a specific
206// opcode and that it has a immediate integer right operand.
207// If so Imm will receive the 32 bit value.
208static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) {
209  return N->getOpcode() == Opc &&
210         isInt32Immediate(N->getOperand(1).getNode(), Imm);
211}
212
213
214bool ARMDAGToDAGISel::SelectShifterOperandReg(SDNode *Op,
215                                              SDValue N,
216                                              SDValue &BaseReg,
217                                              SDValue &ShReg,
218                                              SDValue &Opc) {
219  ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N);
220
221  // Don't match base register only case. That is matched to a separate
222  // lower complexity pattern with explicit register operand.
223  if (ShOpcVal == ARM_AM::no_shift) return false;
224
225  BaseReg = N.getOperand(0);
226  unsigned ShImmVal = 0;
227  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
228    ShReg = CurDAG->getRegister(0, MVT::i32);
229    ShImmVal = RHS->getZExtValue() & 31;
230  } else {
231    ShReg = N.getOperand(1);
232  }
233  Opc = CurDAG->getTargetConstant(ARM_AM::getSORegOpc(ShOpcVal, ShImmVal),
234                                  MVT::i32);
235  return true;
236}
237
238bool ARMDAGToDAGISel::SelectAddrMode2(SDNode *Op, SDValue N,
239                                      SDValue &Base, SDValue &Offset,
240                                      SDValue &Opc) {
241  if (N.getOpcode() == ISD::MUL) {
242    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
243      // X * [3,5,9] -> X + X * [2,4,8] etc.
244      int RHSC = (int)RHS->getZExtValue();
245      if (RHSC & 1) {
246        RHSC = RHSC & ~1;
247        ARM_AM::AddrOpc AddSub = ARM_AM::add;
248        if (RHSC < 0) {
249          AddSub = ARM_AM::sub;
250          RHSC = - RHSC;
251        }
252        if (isPowerOf2_32(RHSC)) {
253          unsigned ShAmt = Log2_32(RHSC);
254          Base = Offset = N.getOperand(0);
255          Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt,
256                                                            ARM_AM::lsl),
257                                          MVT::i32);
258          return true;
259        }
260      }
261    }
262  }
263
264  if (N.getOpcode() != ISD::ADD && N.getOpcode() != ISD::SUB) {
265    Base = N;
266    if (N.getOpcode() == ISD::FrameIndex) {
267      int FI = cast<FrameIndexSDNode>(N)->getIndex();
268      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
269    } else if (N.getOpcode() == ARMISD::Wrapper &&
270               !(Subtarget->useMovt() &&
271                 N.getOperand(0).getOpcode() == ISD::TargetGlobalAddress)) {
272      Base = N.getOperand(0);
273    }
274    Offset = CurDAG->getRegister(0, MVT::i32);
275    Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(ARM_AM::add, 0,
276                                                      ARM_AM::no_shift),
277                                    MVT::i32);
278    return true;
279  }
280
281  // Match simple R +/- imm12 operands.
282  if (N.getOpcode() == ISD::ADD)
283    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
284      int RHSC = (int)RHS->getZExtValue();
285      if ((RHSC >= 0 && RHSC < 0x1000) ||
286          (RHSC < 0 && RHSC > -0x1000)) { // 12 bits.
287        Base = N.getOperand(0);
288        if (Base.getOpcode() == ISD::FrameIndex) {
289          int FI = cast<FrameIndexSDNode>(Base)->getIndex();
290          Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
291        }
292        Offset = CurDAG->getRegister(0, MVT::i32);
293
294        ARM_AM::AddrOpc AddSub = ARM_AM::add;
295        if (RHSC < 0) {
296          AddSub = ARM_AM::sub;
297          RHSC = - RHSC;
298        }
299        Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, RHSC,
300                                                          ARM_AM::no_shift),
301                                        MVT::i32);
302        return true;
303      }
304    }
305
306  // Otherwise this is R +/- [possibly shifted] R.
307  ARM_AM::AddrOpc AddSub = N.getOpcode() == ISD::ADD ? ARM_AM::add:ARM_AM::sub;
308  ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N.getOperand(1));
309  unsigned ShAmt = 0;
310
311  Base   = N.getOperand(0);
312  Offset = N.getOperand(1);
313
314  if (ShOpcVal != ARM_AM::no_shift) {
315    // Check to see if the RHS of the shift is a constant, if not, we can't fold
316    // it.
317    if (ConstantSDNode *Sh =
318           dyn_cast<ConstantSDNode>(N.getOperand(1).getOperand(1))) {
319      ShAmt = Sh->getZExtValue();
320      Offset = N.getOperand(1).getOperand(0);
321    } else {
322      ShOpcVal = ARM_AM::no_shift;
323    }
324  }
325
326  // Try matching (R shl C) + (R).
327  if (N.getOpcode() == ISD::ADD && ShOpcVal == ARM_AM::no_shift) {
328    ShOpcVal = ARM_AM::getShiftOpcForNode(N.getOperand(0));
329    if (ShOpcVal != ARM_AM::no_shift) {
330      // Check to see if the RHS of the shift is a constant, if not, we can't
331      // fold it.
332      if (ConstantSDNode *Sh =
333          dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(1))) {
334        ShAmt = Sh->getZExtValue();
335        Offset = N.getOperand(0).getOperand(0);
336        Base = N.getOperand(1);
337      } else {
338        ShOpcVal = ARM_AM::no_shift;
339      }
340    }
341  }
342
343  Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt, ShOpcVal),
344                                  MVT::i32);
345  return true;
346}
347
348bool ARMDAGToDAGISel::SelectAddrMode2Offset(SDNode *Op, SDValue N,
349                                            SDValue &Offset, SDValue &Opc) {
350  unsigned Opcode = Op->getOpcode();
351  ISD::MemIndexedMode AM = (Opcode == ISD::LOAD)
352    ? cast<LoadSDNode>(Op)->getAddressingMode()
353    : cast<StoreSDNode>(Op)->getAddressingMode();
354  ARM_AM::AddrOpc AddSub = (AM == ISD::PRE_INC || AM == ISD::POST_INC)
355    ? ARM_AM::add : ARM_AM::sub;
356  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N)) {
357    int Val = (int)C->getZExtValue();
358    if (Val >= 0 && Val < 0x1000) { // 12 bits.
359      Offset = CurDAG->getRegister(0, MVT::i32);
360      Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, Val,
361                                                        ARM_AM::no_shift),
362                                      MVT::i32);
363      return true;
364    }
365  }
366
367  Offset = N;
368  ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N);
369  unsigned ShAmt = 0;
370  if (ShOpcVal != ARM_AM::no_shift) {
371    // Check to see if the RHS of the shift is a constant, if not, we can't fold
372    // it.
373    if (ConstantSDNode *Sh = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
374      ShAmt = Sh->getZExtValue();
375      Offset = N.getOperand(0);
376    } else {
377      ShOpcVal = ARM_AM::no_shift;
378    }
379  }
380
381  Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt, ShOpcVal),
382                                  MVT::i32);
383  return true;
384}
385
386
387bool ARMDAGToDAGISel::SelectAddrMode3(SDNode *Op, SDValue N,
388                                      SDValue &Base, SDValue &Offset,
389                                      SDValue &Opc) {
390  if (N.getOpcode() == ISD::SUB) {
391    // X - C  is canonicalize to X + -C, no need to handle it here.
392    Base = N.getOperand(0);
393    Offset = N.getOperand(1);
394    Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::sub, 0),MVT::i32);
395    return true;
396  }
397
398  if (N.getOpcode() != ISD::ADD) {
399    Base = N;
400    if (N.getOpcode() == ISD::FrameIndex) {
401      int FI = cast<FrameIndexSDNode>(N)->getIndex();
402      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
403    }
404    Offset = CurDAG->getRegister(0, MVT::i32);
405    Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::add, 0),MVT::i32);
406    return true;
407  }
408
409  // If the RHS is +/- imm8, fold into addr mode.
410  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
411    int RHSC = (int)RHS->getZExtValue();
412    if ((RHSC >= 0 && RHSC < 256) ||
413        (RHSC < 0 && RHSC > -256)) { // note -256 itself isn't allowed.
414      Base = N.getOperand(0);
415      if (Base.getOpcode() == ISD::FrameIndex) {
416        int FI = cast<FrameIndexSDNode>(Base)->getIndex();
417        Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
418      }
419      Offset = CurDAG->getRegister(0, MVT::i32);
420
421      ARM_AM::AddrOpc AddSub = ARM_AM::add;
422      if (RHSC < 0) {
423        AddSub = ARM_AM::sub;
424        RHSC = - RHSC;
425      }
426      Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, RHSC),MVT::i32);
427      return true;
428    }
429  }
430
431  Base = N.getOperand(0);
432  Offset = N.getOperand(1);
433  Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::add, 0), MVT::i32);
434  return true;
435}
436
437bool ARMDAGToDAGISel::SelectAddrMode3Offset(SDNode *Op, SDValue N,
438                                            SDValue &Offset, SDValue &Opc) {
439  unsigned Opcode = Op->getOpcode();
440  ISD::MemIndexedMode AM = (Opcode == ISD::LOAD)
441    ? cast<LoadSDNode>(Op)->getAddressingMode()
442    : cast<StoreSDNode>(Op)->getAddressingMode();
443  ARM_AM::AddrOpc AddSub = (AM == ISD::PRE_INC || AM == ISD::POST_INC)
444    ? ARM_AM::add : ARM_AM::sub;
445  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N)) {
446    int Val = (int)C->getZExtValue();
447    if (Val >= 0 && Val < 256) {
448      Offset = CurDAG->getRegister(0, MVT::i32);
449      Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, Val), MVT::i32);
450      return true;
451    }
452  }
453
454  Offset = N;
455  Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, 0), MVT::i32);
456  return true;
457}
458
459bool ARMDAGToDAGISel::SelectAddrMode4(SDNode *Op, SDValue N,
460                                      SDValue &Addr, SDValue &Mode) {
461  Addr = N;
462  Mode = CurDAG->getTargetConstant(0, MVT::i32);
463  return true;
464}
465
466bool ARMDAGToDAGISel::SelectAddrMode5(SDNode *Op, SDValue N,
467                                      SDValue &Base, SDValue &Offset) {
468  if (N.getOpcode() != ISD::ADD) {
469    Base = N;
470    if (N.getOpcode() == ISD::FrameIndex) {
471      int FI = cast<FrameIndexSDNode>(N)->getIndex();
472      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
473    } else if (N.getOpcode() == ARMISD::Wrapper &&
474               !(Subtarget->useMovt() &&
475                 N.getOperand(0).getOpcode() == ISD::TargetGlobalAddress)) {
476      Base = N.getOperand(0);
477    }
478    Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::add, 0),
479                                       MVT::i32);
480    return true;
481  }
482
483  // If the RHS is +/- imm8, fold into addr mode.
484  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
485    int RHSC = (int)RHS->getZExtValue();
486    if ((RHSC & 3) == 0) {  // The constant is implicitly multiplied by 4.
487      RHSC >>= 2;
488      if ((RHSC >= 0 && RHSC < 256) ||
489          (RHSC < 0 && RHSC > -256)) { // note -256 itself isn't allowed.
490        Base = N.getOperand(0);
491        if (Base.getOpcode() == ISD::FrameIndex) {
492          int FI = cast<FrameIndexSDNode>(Base)->getIndex();
493          Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
494        }
495
496        ARM_AM::AddrOpc AddSub = ARM_AM::add;
497        if (RHSC < 0) {
498          AddSub = ARM_AM::sub;
499          RHSC = - RHSC;
500        }
501        Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(AddSub, RHSC),
502                                           MVT::i32);
503        return true;
504      }
505    }
506  }
507
508  Base = N;
509  Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::add, 0),
510                                     MVT::i32);
511  return true;
512}
513
514bool ARMDAGToDAGISel::SelectAddrMode6(SDNode *Op, SDValue N,
515                                      SDValue &Addr, SDValue &Align) {
516  Addr = N;
517  // Default to no alignment.
518  Align = CurDAG->getTargetConstant(0, MVT::i32);
519  return true;
520}
521
522bool ARMDAGToDAGISel::SelectAddrModePC(SDNode *Op, SDValue N,
523                                       SDValue &Offset, SDValue &Label) {
524  if (N.getOpcode() == ARMISD::PIC_ADD && N.hasOneUse()) {
525    Offset = N.getOperand(0);
526    SDValue N1 = N.getOperand(1);
527    Label  = CurDAG->getTargetConstant(cast<ConstantSDNode>(N1)->getZExtValue(),
528                                       MVT::i32);
529    return true;
530  }
531  return false;
532}
533
534bool ARMDAGToDAGISel::SelectThumbAddrModeRR(SDNode *Op, SDValue N,
535                                            SDValue &Base, SDValue &Offset){
536  // FIXME dl should come from the parent load or store, not the address
537  DebugLoc dl = Op->getDebugLoc();
538  if (N.getOpcode() != ISD::ADD) {
539    ConstantSDNode *NC = dyn_cast<ConstantSDNode>(N);
540    if (!NC || NC->getZExtValue() != 0)
541      return false;
542
543    Base = Offset = N;
544    return true;
545  }
546
547  Base = N.getOperand(0);
548  Offset = N.getOperand(1);
549  return true;
550}
551
552bool
553ARMDAGToDAGISel::SelectThumbAddrModeRI5(SDNode *Op, SDValue N,
554                                        unsigned Scale, SDValue &Base,
555                                        SDValue &OffImm, SDValue &Offset) {
556  if (Scale == 4) {
557    SDValue TmpBase, TmpOffImm;
558    if (SelectThumbAddrModeSP(Op, N, TmpBase, TmpOffImm))
559      return false;  // We want to select tLDRspi / tSTRspi instead.
560    if (N.getOpcode() == ARMISD::Wrapper &&
561        N.getOperand(0).getOpcode() == ISD::TargetConstantPool)
562      return false;  // We want to select tLDRpci instead.
563  }
564
565  if (N.getOpcode() != ISD::ADD) {
566    if (N.getOpcode() == ARMISD::Wrapper &&
567        !(Subtarget->useMovt() &&
568          N.getOperand(0).getOpcode() == ISD::TargetGlobalAddress)) {
569      Base = N.getOperand(0);
570    } else
571      Base = N;
572
573    Offset = CurDAG->getRegister(0, MVT::i32);
574    OffImm = CurDAG->getTargetConstant(0, MVT::i32);
575    return true;
576  }
577
578  // Thumb does not have [sp, r] address mode.
579  RegisterSDNode *LHSR = dyn_cast<RegisterSDNode>(N.getOperand(0));
580  RegisterSDNode *RHSR = dyn_cast<RegisterSDNode>(N.getOperand(1));
581  if ((LHSR && LHSR->getReg() == ARM::SP) ||
582      (RHSR && RHSR->getReg() == ARM::SP)) {
583    Base = N;
584    Offset = CurDAG->getRegister(0, MVT::i32);
585    OffImm = CurDAG->getTargetConstant(0, MVT::i32);
586    return true;
587  }
588
589  // If the RHS is + imm5 * scale, fold into addr mode.
590  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
591    int RHSC = (int)RHS->getZExtValue();
592    if ((RHSC & (Scale-1)) == 0) {  // The constant is implicitly multiplied.
593      RHSC /= Scale;
594      if (RHSC >= 0 && RHSC < 32) {
595        Base = N.getOperand(0);
596        Offset = CurDAG->getRegister(0, MVT::i32);
597        OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
598        return true;
599      }
600    }
601  }
602
603  Base = N.getOperand(0);
604  Offset = N.getOperand(1);
605  OffImm = CurDAG->getTargetConstant(0, MVT::i32);
606  return true;
607}
608
609bool ARMDAGToDAGISel::SelectThumbAddrModeS1(SDNode *Op, SDValue N,
610                                            SDValue &Base, SDValue &OffImm,
611                                            SDValue &Offset) {
612  return SelectThumbAddrModeRI5(Op, N, 1, Base, OffImm, Offset);
613}
614
615bool ARMDAGToDAGISel::SelectThumbAddrModeS2(SDNode *Op, SDValue N,
616                                            SDValue &Base, SDValue &OffImm,
617                                            SDValue &Offset) {
618  return SelectThumbAddrModeRI5(Op, N, 2, Base, OffImm, Offset);
619}
620
621bool ARMDAGToDAGISel::SelectThumbAddrModeS4(SDNode *Op, SDValue N,
622                                            SDValue &Base, SDValue &OffImm,
623                                            SDValue &Offset) {
624  return SelectThumbAddrModeRI5(Op, N, 4, Base, OffImm, Offset);
625}
626
627bool ARMDAGToDAGISel::SelectThumbAddrModeSP(SDNode *Op, SDValue N,
628                                           SDValue &Base, SDValue &OffImm) {
629  if (N.getOpcode() == ISD::FrameIndex) {
630    int FI = cast<FrameIndexSDNode>(N)->getIndex();
631    Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
632    OffImm = CurDAG->getTargetConstant(0, MVT::i32);
633    return true;
634  }
635
636  if (N.getOpcode() != ISD::ADD)
637    return false;
638
639  RegisterSDNode *LHSR = dyn_cast<RegisterSDNode>(N.getOperand(0));
640  if (N.getOperand(0).getOpcode() == ISD::FrameIndex ||
641      (LHSR && LHSR->getReg() == ARM::SP)) {
642    // If the RHS is + imm8 * scale, fold into addr mode.
643    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
644      int RHSC = (int)RHS->getZExtValue();
645      if ((RHSC & 3) == 0) {  // The constant is implicitly multiplied.
646        RHSC >>= 2;
647        if (RHSC >= 0 && RHSC < 256) {
648          Base = N.getOperand(0);
649          if (Base.getOpcode() == ISD::FrameIndex) {
650            int FI = cast<FrameIndexSDNode>(Base)->getIndex();
651            Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
652          }
653          OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
654          return true;
655        }
656      }
657    }
658  }
659
660  return false;
661}
662
663bool ARMDAGToDAGISel::SelectT2ShifterOperandReg(SDNode *Op, SDValue N,
664                                                SDValue &BaseReg,
665                                                SDValue &Opc) {
666  ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N);
667
668  // Don't match base register only case. That is matched to a separate
669  // lower complexity pattern with explicit register operand.
670  if (ShOpcVal == ARM_AM::no_shift) return false;
671
672  BaseReg = N.getOperand(0);
673  unsigned ShImmVal = 0;
674  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
675    ShImmVal = RHS->getZExtValue() & 31;
676    Opc = getI32Imm(ARM_AM::getSORegOpc(ShOpcVal, ShImmVal));
677    return true;
678  }
679
680  return false;
681}
682
683bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDNode *Op, SDValue N,
684                                            SDValue &Base, SDValue &OffImm) {
685  // Match simple R + imm12 operands.
686
687  // Base only.
688  if (N.getOpcode() != ISD::ADD && N.getOpcode() != ISD::SUB) {
689    if (N.getOpcode() == ISD::FrameIndex) {
690      // Match frame index...
691      int FI = cast<FrameIndexSDNode>(N)->getIndex();
692      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
693      OffImm  = CurDAG->getTargetConstant(0, MVT::i32);
694      return true;
695    } else if (N.getOpcode() == ARMISD::Wrapper &&
696               !(Subtarget->useMovt() &&
697                 N.getOperand(0).getOpcode() == ISD::TargetGlobalAddress)) {
698      Base = N.getOperand(0);
699      if (Base.getOpcode() == ISD::TargetConstantPool)
700        return false;  // We want to select t2LDRpci instead.
701    } else
702      Base = N;
703    OffImm  = CurDAG->getTargetConstant(0, MVT::i32);
704    return true;
705  }
706
707  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
708    if (SelectT2AddrModeImm8(Op, N, Base, OffImm))
709      // Let t2LDRi8 handle (R - imm8).
710      return false;
711
712    int RHSC = (int)RHS->getZExtValue();
713    if (N.getOpcode() == ISD::SUB)
714      RHSC = -RHSC;
715
716    if (RHSC >= 0 && RHSC < 0x1000) { // 12 bits (unsigned)
717      Base   = N.getOperand(0);
718      if (Base.getOpcode() == ISD::FrameIndex) {
719        int FI = cast<FrameIndexSDNode>(Base)->getIndex();
720        Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
721      }
722      OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
723      return true;
724    }
725  }
726
727  // Base only.
728  Base = N;
729  OffImm  = CurDAG->getTargetConstant(0, MVT::i32);
730  return true;
731}
732
733bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDNode *Op, SDValue N,
734                                           SDValue &Base, SDValue &OffImm) {
735  // Match simple R - imm8 operands.
736  if (N.getOpcode() == ISD::ADD || N.getOpcode() == ISD::SUB) {
737    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
738      int RHSC = (int)RHS->getSExtValue();
739      if (N.getOpcode() == ISD::SUB)
740        RHSC = -RHSC;
741
742      if ((RHSC >= -255) && (RHSC < 0)) { // 8 bits (always negative)
743        Base = N.getOperand(0);
744        if (Base.getOpcode() == ISD::FrameIndex) {
745          int FI = cast<FrameIndexSDNode>(Base)->getIndex();
746          Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
747        }
748        OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
749        return true;
750      }
751    }
752  }
753
754  return false;
755}
756
757bool ARMDAGToDAGISel::SelectT2AddrModeImm8Offset(SDNode *Op, SDValue N,
758                                                 SDValue &OffImm){
759  unsigned Opcode = Op->getOpcode();
760  ISD::MemIndexedMode AM = (Opcode == ISD::LOAD)
761    ? cast<LoadSDNode>(Op)->getAddressingMode()
762    : cast<StoreSDNode>(Op)->getAddressingMode();
763  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N)) {
764    int RHSC = (int)RHS->getZExtValue();
765    if (RHSC >= 0 && RHSC < 0x100) { // 8 bits.
766      OffImm = ((AM == ISD::PRE_INC) || (AM == ISD::POST_INC))
767        ? CurDAG->getTargetConstant(RHSC, MVT::i32)
768        : CurDAG->getTargetConstant(-RHSC, MVT::i32);
769      return true;
770    }
771  }
772
773  return false;
774}
775
776bool ARMDAGToDAGISel::SelectT2AddrModeImm8s4(SDNode *Op, SDValue N,
777                                             SDValue &Base, SDValue &OffImm) {
778  if (N.getOpcode() == ISD::ADD) {
779    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
780      int RHSC = (int)RHS->getZExtValue();
781      if (((RHSC & 0x3) == 0) &&
782          ((RHSC >= 0 && RHSC < 0x400) || (RHSC < 0 && RHSC > -0x400))) { // 8 bits.
783        Base   = N.getOperand(0);
784        OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
785        return true;
786      }
787    }
788  } else if (N.getOpcode() == ISD::SUB) {
789    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
790      int RHSC = (int)RHS->getZExtValue();
791      if (((RHSC & 0x3) == 0) && (RHSC >= 0 && RHSC < 0x400)) { // 8 bits.
792        Base   = N.getOperand(0);
793        OffImm = CurDAG->getTargetConstant(-RHSC, MVT::i32);
794        return true;
795      }
796    }
797  }
798
799  return false;
800}
801
802bool ARMDAGToDAGISel::SelectT2AddrModeSoReg(SDNode *Op, SDValue N,
803                                            SDValue &Base,
804                                            SDValue &OffReg, SDValue &ShImm) {
805  // (R - imm8) should be handled by t2LDRi8. The rest are handled by t2LDRi12.
806  if (N.getOpcode() != ISD::ADD)
807    return false;
808
809  // Leave (R + imm12) for t2LDRi12, (R - imm8) for t2LDRi8.
810  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
811    int RHSC = (int)RHS->getZExtValue();
812    if (RHSC >= 0 && RHSC < 0x1000) // 12 bits (unsigned)
813      return false;
814    else if (RHSC < 0 && RHSC >= -255) // 8 bits
815      return false;
816  }
817
818  // Look for (R + R) or (R + (R << [1,2,3])).
819  unsigned ShAmt = 0;
820  Base   = N.getOperand(0);
821  OffReg = N.getOperand(1);
822
823  // Swap if it is ((R << c) + R).
824  ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(OffReg);
825  if (ShOpcVal != ARM_AM::lsl) {
826    ShOpcVal = ARM_AM::getShiftOpcForNode(Base);
827    if (ShOpcVal == ARM_AM::lsl)
828      std::swap(Base, OffReg);
829  }
830
831  if (ShOpcVal == ARM_AM::lsl) {
832    // Check to see if the RHS of the shift is a constant, if not, we can't fold
833    // it.
834    if (ConstantSDNode *Sh = dyn_cast<ConstantSDNode>(OffReg.getOperand(1))) {
835      ShAmt = Sh->getZExtValue();
836      if (ShAmt >= 4) {
837        ShAmt = 0;
838        ShOpcVal = ARM_AM::no_shift;
839      } else
840        OffReg = OffReg.getOperand(0);
841    } else {
842      ShOpcVal = ARM_AM::no_shift;
843    }
844  }
845
846  ShImm = CurDAG->getTargetConstant(ShAmt, MVT::i32);
847
848  return true;
849}
850
851//===--------------------------------------------------------------------===//
852
853/// getAL - Returns a ARMCC::AL immediate node.
854static inline SDValue getAL(SelectionDAG *CurDAG) {
855  return CurDAG->getTargetConstant((uint64_t)ARMCC::AL, MVT::i32);
856}
857
858SDNode *ARMDAGToDAGISel::SelectARMIndexedLoad(SDNode *N) {
859  LoadSDNode *LD = cast<LoadSDNode>(N);
860  ISD::MemIndexedMode AM = LD->getAddressingMode();
861  if (AM == ISD::UNINDEXED)
862    return NULL;
863
864  EVT LoadedVT = LD->getMemoryVT();
865  SDValue Offset, AMOpc;
866  bool isPre = (AM == ISD::PRE_INC) || (AM == ISD::PRE_DEC);
867  unsigned Opcode = 0;
868  bool Match = false;
869  if (LoadedVT == MVT::i32 &&
870      SelectAddrMode2Offset(N, LD->getOffset(), Offset, AMOpc)) {
871    Opcode = isPre ? ARM::LDR_PRE : ARM::LDR_POST;
872    Match = true;
873  } else if (LoadedVT == MVT::i16 &&
874             SelectAddrMode3Offset(N, LD->getOffset(), Offset, AMOpc)) {
875    Match = true;
876    Opcode = (LD->getExtensionType() == ISD::SEXTLOAD)
877      ? (isPre ? ARM::LDRSH_PRE : ARM::LDRSH_POST)
878      : (isPre ? ARM::LDRH_PRE : ARM::LDRH_POST);
879  } else if (LoadedVT == MVT::i8 || LoadedVT == MVT::i1) {
880    if (LD->getExtensionType() == ISD::SEXTLOAD) {
881      if (SelectAddrMode3Offset(N, LD->getOffset(), Offset, AMOpc)) {
882        Match = true;
883        Opcode = isPre ? ARM::LDRSB_PRE : ARM::LDRSB_POST;
884      }
885    } else {
886      if (SelectAddrMode2Offset(N, LD->getOffset(), Offset, AMOpc)) {
887        Match = true;
888        Opcode = isPre ? ARM::LDRB_PRE : ARM::LDRB_POST;
889      }
890    }
891  }
892
893  if (Match) {
894    SDValue Chain = LD->getChain();
895    SDValue Base = LD->getBasePtr();
896    SDValue Ops[]= { Base, Offset, AMOpc, getAL(CurDAG),
897                     CurDAG->getRegister(0, MVT::i32), Chain };
898    return CurDAG->getMachineNode(Opcode, N->getDebugLoc(), MVT::i32, MVT::i32,
899                                  MVT::Other, Ops, 6);
900  }
901
902  return NULL;
903}
904
905SDNode *ARMDAGToDAGISel::SelectT2IndexedLoad(SDNode *N) {
906  LoadSDNode *LD = cast<LoadSDNode>(N);
907  ISD::MemIndexedMode AM = LD->getAddressingMode();
908  if (AM == ISD::UNINDEXED)
909    return NULL;
910
911  EVT LoadedVT = LD->getMemoryVT();
912  bool isSExtLd = LD->getExtensionType() == ISD::SEXTLOAD;
913  SDValue Offset;
914  bool isPre = (AM == ISD::PRE_INC) || (AM == ISD::PRE_DEC);
915  unsigned Opcode = 0;
916  bool Match = false;
917  if (SelectT2AddrModeImm8Offset(N, LD->getOffset(), Offset)) {
918    switch (LoadedVT.getSimpleVT().SimpleTy) {
919    case MVT::i32:
920      Opcode = isPre ? ARM::t2LDR_PRE : ARM::t2LDR_POST;
921      break;
922    case MVT::i16:
923      if (isSExtLd)
924        Opcode = isPre ? ARM::t2LDRSH_PRE : ARM::t2LDRSH_POST;
925      else
926        Opcode = isPre ? ARM::t2LDRH_PRE : ARM::t2LDRH_POST;
927      break;
928    case MVT::i8:
929    case MVT::i1:
930      if (isSExtLd)
931        Opcode = isPre ? ARM::t2LDRSB_PRE : ARM::t2LDRSB_POST;
932      else
933        Opcode = isPre ? ARM::t2LDRB_PRE : ARM::t2LDRB_POST;
934      break;
935    default:
936      return NULL;
937    }
938    Match = true;
939  }
940
941  if (Match) {
942    SDValue Chain = LD->getChain();
943    SDValue Base = LD->getBasePtr();
944    SDValue Ops[]= { Base, Offset, getAL(CurDAG),
945                     CurDAG->getRegister(0, MVT::i32), Chain };
946    return CurDAG->getMachineNode(Opcode, N->getDebugLoc(), MVT::i32, MVT::i32,
947                                  MVT::Other, Ops, 5);
948  }
949
950  return NULL;
951}
952
953/// PairDRegs - Form a quad register from a pair of D registers.
954///
955SDNode *ARMDAGToDAGISel::PairDRegs(EVT VT, SDValue V0, SDValue V1) {
956  DebugLoc dl = V0.getNode()->getDebugLoc();
957  SDValue SubReg0 = CurDAG->getTargetConstant(ARM::DSUBREG_0, MVT::i32);
958  SDValue SubReg1 = CurDAG->getTargetConstant(ARM::DSUBREG_1, MVT::i32);
959  if (llvm::ModelWithRegSequence()) {
960    const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
961    return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
962  }
963  SDValue Undef =
964    SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, dl, VT), 0);
965  SDNode *Pair = CurDAG->getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
966                                        VT, Undef, V0, SubReg0);
967  return CurDAG->getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
968                                VT, SDValue(Pair, 0), V1, SubReg1);
969}
970
971/// PairQRegs - Form 4 consecutive D registers from a pair of Q registers.
972///
973SDNode *ARMDAGToDAGISel::PairQRegs(EVT VT, SDValue V0, SDValue V1) {
974  DebugLoc dl = V0.getNode()->getDebugLoc();
975  SDValue SubReg0 = CurDAG->getTargetConstant(ARM::QSUBREG_0, MVT::i32);
976  SDValue SubReg1 = CurDAG->getTargetConstant(ARM::QSUBREG_1, MVT::i32);
977  const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
978  return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
979}
980
981/// QuadDRegs - Form 4 consecutive D registers.
982///
983SDNode *ARMDAGToDAGISel::QuadDRegs(EVT VT, SDValue V0, SDValue V1,
984                                   SDValue V2, SDValue V3) {
985  DebugLoc dl = V0.getNode()->getDebugLoc();
986  SDValue SubReg0 = CurDAG->getTargetConstant(ARM::DSUBREG_0, MVT::i32);
987  SDValue SubReg1 = CurDAG->getTargetConstant(ARM::DSUBREG_1, MVT::i32);
988  SDValue SubReg2 = CurDAG->getTargetConstant(ARM::DSUBREG_2, MVT::i32);
989  SDValue SubReg3 = CurDAG->getTargetConstant(ARM::DSUBREG_3, MVT::i32);
990  const SDValue Ops[] = { V0, SubReg0, V1, SubReg1, V2, SubReg2, V3, SubReg3 };
991  return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 8);
992}
993
994/// GetNEONSubregVT - Given a type for a 128-bit NEON vector, return the type
995/// for a 64-bit subregister of the vector.
996static EVT GetNEONSubregVT(EVT VT) {
997  switch (VT.getSimpleVT().SimpleTy) {
998  default: llvm_unreachable("unhandled NEON type");
999  case MVT::v16i8: return MVT::v8i8;
1000  case MVT::v8i16: return MVT::v4i16;
1001  case MVT::v4f32: return MVT::v2f32;
1002  case MVT::v4i32: return MVT::v2i32;
1003  case MVT::v2i64: return MVT::v1i64;
1004  }
1005}
1006
1007SDNode *ARMDAGToDAGISel::SelectVLD(SDNode *N, unsigned NumVecs,
1008                                   unsigned *DOpcodes, unsigned *QOpcodes0,
1009                                   unsigned *QOpcodes1) {
1010  assert(NumVecs >= 1 && NumVecs <= 4 && "VLD NumVecs out-of-range");
1011  DebugLoc dl = N->getDebugLoc();
1012
1013  SDValue MemAddr, Align;
1014  if (!SelectAddrMode6(N, N->getOperand(2), MemAddr, Align))
1015    return NULL;
1016
1017  SDValue Chain = N->getOperand(0);
1018  EVT VT = N->getValueType(0);
1019  bool is64BitVector = VT.is64BitVector();
1020
1021  unsigned OpcodeIndex;
1022  switch (VT.getSimpleVT().SimpleTy) {
1023  default: llvm_unreachable("unhandled vld type");
1024    // Double-register operations:
1025  case MVT::v8i8:  OpcodeIndex = 0; break;
1026  case MVT::v4i16: OpcodeIndex = 1; break;
1027  case MVT::v2f32:
1028  case MVT::v2i32: OpcodeIndex = 2; break;
1029  case MVT::v1i64: OpcodeIndex = 3; break;
1030    // Quad-register operations:
1031  case MVT::v16i8: OpcodeIndex = 0; break;
1032  case MVT::v8i16: OpcodeIndex = 1; break;
1033  case MVT::v4f32:
1034  case MVT::v4i32: OpcodeIndex = 2; break;
1035  case MVT::v2i64: OpcodeIndex = 3;
1036    assert(NumVecs == 1 && "v2i64 type only supported for VLD1");
1037    break;
1038  }
1039
1040  SDValue Pred = getAL(CurDAG);
1041  SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1042  if (is64BitVector) {
1043    unsigned Opc = DOpcodes[OpcodeIndex];
1044    const SDValue Ops[] = { MemAddr, Align, Pred, Reg0, Chain };
1045    std::vector<EVT> ResTys(NumVecs, VT);
1046    ResTys.push_back(MVT::Other);
1047    SDNode *VLd = CurDAG->getMachineNode(Opc, dl, ResTys, Ops, 5);
1048    if (!llvm::ModelWithRegSequence() || NumVecs < 2)
1049      return VLd;
1050
1051    assert(NumVecs <= 4);
1052    SDValue RegSeq;
1053    SDValue V0 = SDValue(VLd, 0);
1054    SDValue V1 = SDValue(VLd, 1);
1055
1056    // Form a REG_SEQUENCE to force register allocation.
1057    if (NumVecs == 2)
1058      RegSeq = SDValue(PairDRegs(MVT::v2i64, V0, V1), 0);
1059    else {
1060      SDValue V2 = SDValue(VLd, 2);
1061      // If it's a vld3, form a quad D-register but discard the last part.
1062      SDValue V3 = (NumVecs == 3)
1063          ? SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,dl,VT), 0)
1064          : SDValue(VLd, 3);
1065      RegSeq = SDValue(QuadDRegs(MVT::v4i64, V0, V1, V2, V3), 0);
1066    }
1067
1068    SDValue D0 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, VT, RegSeq);
1069    ReplaceUses(SDValue(N, 0), D0);
1070    SDValue D1 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, VT, RegSeq);
1071    ReplaceUses(SDValue(N, 1), D1);
1072
1073    if (NumVecs > 2) {
1074      SDValue D2 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_2, dl, VT, RegSeq);
1075      ReplaceUses(SDValue(N, 2), D2);
1076    }
1077    if (NumVecs > 3) {
1078      SDValue D3 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_3, dl, VT, RegSeq);
1079      ReplaceUses(SDValue(N, 3), D3);
1080    }
1081    ReplaceUses(SDValue(N, NumVecs), SDValue(VLd, NumVecs));
1082    return NULL;
1083  }
1084
1085  EVT RegVT = GetNEONSubregVT(VT);
1086  if (NumVecs <= 2) {
1087    // Quad registers are directly supported for VLD1 and VLD2,
1088    // loading pairs of D regs.
1089    unsigned Opc = QOpcodes0[OpcodeIndex];
1090    const SDValue Ops[] = { MemAddr, Align, Pred, Reg0, Chain };
1091    std::vector<EVT> ResTys(2 * NumVecs, RegVT);
1092    ResTys.push_back(MVT::Other);
1093    SDNode *VLd = CurDAG->getMachineNode(Opc, dl, ResTys, Ops, 5);
1094    Chain = SDValue(VLd, 2 * NumVecs);
1095
1096    // Combine the even and odd subregs to produce the result.
1097    if (llvm::ModelWithRegSequence()) {
1098      if (NumVecs == 1) {
1099        SDNode *Q = PairDRegs(VT, SDValue(VLd, 0), SDValue(VLd, 1));
1100        ReplaceUses(SDValue(N, 0), SDValue(Q, 0));
1101      } else {
1102        SDValue QQ = SDValue(QuadDRegs(MVT::v4i64,
1103                                       SDValue(VLd, 0), SDValue(VLd, 1),
1104                                       SDValue(VLd, 2), SDValue(VLd, 3)), 0);
1105        SDValue Q0 = CurDAG->getTargetExtractSubreg(ARM::QSUBREG_0, dl, VT, QQ);
1106        SDValue Q1 = CurDAG->getTargetExtractSubreg(ARM::QSUBREG_1, dl, VT, QQ);
1107        ReplaceUses(SDValue(N, 0), Q0);
1108        ReplaceUses(SDValue(N, 1), Q1);
1109      }
1110    } else {
1111      for (unsigned Vec = 0; Vec < NumVecs; ++Vec) {
1112        SDNode *Q = PairDRegs(VT, SDValue(VLd, 2*Vec), SDValue(VLd, 2*Vec+1));
1113        ReplaceUses(SDValue(N, Vec), SDValue(Q, 0));
1114      }
1115    }
1116  } else {
1117    // Otherwise, quad registers are loaded with two separate instructions,
1118    // where one loads the even registers and the other loads the odd registers.
1119
1120    std::vector<EVT> ResTys(NumVecs, RegVT);
1121    ResTys.push_back(MemAddr.getValueType());
1122    ResTys.push_back(MVT::Other);
1123
1124    // Load the even subregs.
1125    unsigned Opc = QOpcodes0[OpcodeIndex];
1126    const SDValue OpsA[] = { MemAddr, Align, Reg0, Pred, Reg0, Chain };
1127    SDNode *VLdA = CurDAG->getMachineNode(Opc, dl, ResTys, OpsA, 6);
1128    Chain = SDValue(VLdA, NumVecs+1);
1129
1130    // Load the odd subregs.
1131    Opc = QOpcodes1[OpcodeIndex];
1132    const SDValue OpsB[] = { SDValue(VLdA, NumVecs),
1133                             Align, Reg0, Pred, Reg0, Chain };
1134    SDNode *VLdB = CurDAG->getMachineNode(Opc, dl, ResTys, OpsB, 6);
1135    Chain = SDValue(VLdB, NumVecs+1);
1136
1137    // Combine the even and odd subregs to produce the result.
1138    for (unsigned Vec = 0; Vec < NumVecs; ++Vec) {
1139      SDNode *Q = PairDRegs(VT, SDValue(VLdA, Vec), SDValue(VLdB, Vec));
1140      ReplaceUses(SDValue(N, Vec), SDValue(Q, 0));
1141    }
1142  }
1143  ReplaceUses(SDValue(N, NumVecs), Chain);
1144  return NULL;
1145}
1146
1147SDNode *ARMDAGToDAGISel::SelectVST(SDNode *N, unsigned NumVecs,
1148                                   unsigned *DOpcodes, unsigned *QOpcodes0,
1149                                   unsigned *QOpcodes1) {
1150  assert(NumVecs >=1 && NumVecs <= 4 && "VST NumVecs out-of-range");
1151  DebugLoc dl = N->getDebugLoc();
1152
1153  SDValue MemAddr, Align;
1154  if (!SelectAddrMode6(N, N->getOperand(2), MemAddr, Align))
1155    return NULL;
1156
1157  SDValue Chain = N->getOperand(0);
1158  EVT VT = N->getOperand(3).getValueType();
1159  bool is64BitVector = VT.is64BitVector();
1160
1161  unsigned OpcodeIndex;
1162  switch (VT.getSimpleVT().SimpleTy) {
1163  default: llvm_unreachable("unhandled vst type");
1164    // Double-register operations:
1165  case MVT::v8i8:  OpcodeIndex = 0; break;
1166  case MVT::v4i16: OpcodeIndex = 1; break;
1167  case MVT::v2f32:
1168  case MVT::v2i32: OpcodeIndex = 2; break;
1169  case MVT::v1i64: OpcodeIndex = 3; break;
1170    // Quad-register operations:
1171  case MVT::v16i8: OpcodeIndex = 0; break;
1172  case MVT::v8i16: OpcodeIndex = 1; break;
1173  case MVT::v4f32:
1174  case MVT::v4i32: OpcodeIndex = 2; break;
1175  case MVT::v2i64: OpcodeIndex = 3;
1176    assert(NumVecs == 1 && "v2i64 type only supported for VST1");
1177    break;
1178  }
1179
1180  SDValue Pred = getAL(CurDAG);
1181  SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1182
1183  SmallVector<SDValue, 10> Ops;
1184  Ops.push_back(MemAddr);
1185  Ops.push_back(Align);
1186
1187  if (is64BitVector) {
1188    if (llvm::ModelWithRegSequence() && NumVecs >= 2) {
1189      assert(NumVecs <= 4);
1190      SDValue RegSeq;
1191      SDValue V0 = N->getOperand(0+3);
1192      SDValue V1 = N->getOperand(1+3);
1193
1194      // Form a REG_SEQUENCE to force register allocation.
1195      if (NumVecs == 2)
1196        RegSeq = SDValue(PairDRegs(MVT::v2i64, V0, V1), 0);
1197      else {
1198        SDValue V2 = N->getOperand(2+3);
1199        // If it's a vld3, form a quad D-register and leave the last part as
1200        // an undef.
1201        SDValue V3 = (NumVecs == 3)
1202          ? SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,dl,VT), 0)
1203          : N->getOperand(3+3);
1204        RegSeq = SDValue(QuadDRegs(MVT::v4i64, V0, V1, V2, V3), 0);
1205      }
1206
1207      // Now extract the D registers back out.
1208      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, VT,
1209                                                   RegSeq));
1210      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, VT,
1211                                                   RegSeq));
1212      if (NumVecs > 2)
1213        Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_2, dl, VT,
1214                                                     RegSeq));
1215      if (NumVecs > 3)
1216        Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_3, dl, VT,
1217                                                     RegSeq));
1218    } else {
1219      for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
1220        Ops.push_back(N->getOperand(Vec+3));
1221    }
1222    Ops.push_back(Pred);
1223    Ops.push_back(Reg0); // predicate register
1224    Ops.push_back(Chain);
1225    unsigned Opc = DOpcodes[OpcodeIndex];
1226    return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops.data(), NumVecs+5);
1227  }
1228
1229  EVT RegVT = GetNEONSubregVT(VT);
1230  if (NumVecs <= 2) {
1231    // Quad registers are directly supported for VST1 and VST2,
1232    // storing pairs of D regs.
1233    unsigned Opc = QOpcodes0[OpcodeIndex];
1234    if (llvm::ModelWithRegSequence() && NumVecs == 2) {
1235      // First extract the pair of Q registers.
1236      SDValue Q0 = N->getOperand(3);
1237      SDValue Q1 = N->getOperand(4);
1238
1239      // Form a QQ register.
1240      SDValue QQ = SDValue(PairQRegs(MVT::v4i64, Q0, Q1), 0);
1241
1242      // Now extract the D registers back out.
1243      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT,
1244                                                   QQ));
1245      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT,
1246                                                   QQ));
1247      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_2, dl, RegVT,
1248                                                   QQ));
1249      Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_3, dl, RegVT,
1250                                                   QQ));
1251      Ops.push_back(Pred);
1252      Ops.push_back(Reg0); // predicate register
1253      Ops.push_back(Chain);
1254      return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops.data(), 5 + 4);
1255    } else {
1256      for (unsigned Vec = 0; Vec < NumVecs; ++Vec) {
1257        Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT,
1258                                                     N->getOperand(Vec+3)));
1259        Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT,
1260                                                     N->getOperand(Vec+3)));
1261      }
1262      Ops.push_back(Pred);
1263      Ops.push_back(Reg0); // predicate register
1264      Ops.push_back(Chain);
1265      return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops.data(),
1266                                    5 + 2 * NumVecs);
1267    }
1268  }
1269
1270  // Otherwise, quad registers are stored with two separate instructions,
1271  // where one stores the even registers and the other stores the odd registers.
1272
1273  Ops.push_back(Reg0); // post-access address offset
1274
1275  // Store the even subregs.
1276  for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
1277    Ops.push_back(CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT,
1278                                                 N->getOperand(Vec+3)));
1279  Ops.push_back(Pred);
1280  Ops.push_back(Reg0); // predicate register
1281  Ops.push_back(Chain);
1282  unsigned Opc = QOpcodes0[OpcodeIndex];
1283  SDNode *VStA = CurDAG->getMachineNode(Opc, dl, MemAddr.getValueType(),
1284                                        MVT::Other, Ops.data(), NumVecs+6);
1285  Chain = SDValue(VStA, 1);
1286
1287  // Store the odd subregs.
1288  Ops[0] = SDValue(VStA, 0); // MemAddr
1289  for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
1290    Ops[Vec+3] = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT,
1291                                                N->getOperand(Vec+3));
1292  Ops[NumVecs+5] = Chain;
1293  Opc = QOpcodes1[OpcodeIndex];
1294  SDNode *VStB = CurDAG->getMachineNode(Opc, dl, MemAddr.getValueType(),
1295                                        MVT::Other, Ops.data(), NumVecs+6);
1296  Chain = SDValue(VStB, 1);
1297  ReplaceUses(SDValue(N, 0), Chain);
1298  return NULL;
1299}
1300
1301SDNode *ARMDAGToDAGISel::SelectVLDSTLane(SDNode *N, bool IsLoad,
1302                                         unsigned NumVecs, unsigned *DOpcodes,
1303                                         unsigned *QOpcodes0,
1304                                         unsigned *QOpcodes1) {
1305  assert(NumVecs >=2 && NumVecs <= 4 && "VLDSTLane NumVecs out-of-range");
1306  DebugLoc dl = N->getDebugLoc();
1307
1308  SDValue MemAddr, Align;
1309  if (!SelectAddrMode6(N, N->getOperand(2), MemAddr, Align))
1310    return NULL;
1311
1312  SDValue Chain = N->getOperand(0);
1313  unsigned Lane =
1314    cast<ConstantSDNode>(N->getOperand(NumVecs+3))->getZExtValue();
1315  EVT VT = IsLoad ? N->getValueType(0) : N->getOperand(3).getValueType();
1316  bool is64BitVector = VT.is64BitVector();
1317
1318  // Quad registers are handled by load/store of subregs. Find the subreg info.
1319  unsigned NumElts = 0;
1320  int SubregIdx = 0;
1321  EVT RegVT = VT;
1322  if (!is64BitVector) {
1323    RegVT = GetNEONSubregVT(VT);
1324    NumElts = RegVT.getVectorNumElements();
1325    SubregIdx = (Lane < NumElts) ? ARM::DSUBREG_0 : ARM::DSUBREG_1;
1326  }
1327
1328  unsigned OpcodeIndex;
1329  switch (VT.getSimpleVT().SimpleTy) {
1330  default: llvm_unreachable("unhandled vld/vst lane type");
1331    // Double-register operations:
1332  case MVT::v8i8:  OpcodeIndex = 0; break;
1333  case MVT::v4i16: OpcodeIndex = 1; break;
1334  case MVT::v2f32:
1335  case MVT::v2i32: OpcodeIndex = 2; break;
1336    // Quad-register operations:
1337  case MVT::v8i16: OpcodeIndex = 0; break;
1338  case MVT::v4f32:
1339  case MVT::v4i32: OpcodeIndex = 1; break;
1340  }
1341
1342  SDValue Pred = getAL(CurDAG);
1343  SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1344
1345  SmallVector<SDValue, 10> Ops;
1346  Ops.push_back(MemAddr);
1347  Ops.push_back(Align);
1348
1349  unsigned Opc = 0;
1350  if (is64BitVector) {
1351    Opc = DOpcodes[OpcodeIndex];
1352    for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
1353      Ops.push_back(N->getOperand(Vec+3));
1354  } else {
1355    // Check if this is loading the even or odd subreg of a Q register.
1356    if (Lane < NumElts) {
1357      Opc = QOpcodes0[OpcodeIndex];
1358    } else {
1359      Lane -= NumElts;
1360      Opc = QOpcodes1[OpcodeIndex];
1361    }
1362    // Extract the subregs of the input vector.
1363    for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
1364      Ops.push_back(CurDAG->getTargetExtractSubreg(SubregIdx, dl, RegVT,
1365                                                   N->getOperand(Vec+3)));
1366  }
1367  Ops.push_back(getI32Imm(Lane));
1368  Ops.push_back(Pred);
1369  Ops.push_back(Reg0);
1370  Ops.push_back(Chain);
1371
1372  if (!IsLoad)
1373    return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops.data(), NumVecs+6);
1374
1375  std::vector<EVT> ResTys(NumVecs, RegVT);
1376  ResTys.push_back(MVT::Other);
1377  SDNode *VLdLn =
1378    CurDAG->getMachineNode(Opc, dl, ResTys, Ops.data(), NumVecs+6);
1379  // For a 64-bit vector load to D registers, nothing more needs to be done.
1380  if (is64BitVector)
1381    return VLdLn;
1382
1383  // For 128-bit vectors, take the 64-bit results of the load and insert them
1384  // as subregs into the result.
1385  for (unsigned Vec = 0; Vec < NumVecs; ++Vec) {
1386    SDValue QuadVec = CurDAG->getTargetInsertSubreg(SubregIdx, dl, VT,
1387                                                    N->getOperand(Vec+3),
1388                                                    SDValue(VLdLn, Vec));
1389    ReplaceUses(SDValue(N, Vec), QuadVec);
1390  }
1391
1392  Chain = SDValue(VLdLn, NumVecs);
1393  ReplaceUses(SDValue(N, NumVecs), Chain);
1394  return NULL;
1395}
1396
1397SDNode *ARMDAGToDAGISel::SelectV6T2BitfieldExtractOp(SDNode *N,
1398                                                     bool isSigned) {
1399  if (!Subtarget->hasV6T2Ops())
1400    return NULL;
1401
1402  unsigned Opc = isSigned ? (Subtarget->isThumb() ? ARM::t2SBFX : ARM::SBFX)
1403    : (Subtarget->isThumb() ? ARM::t2UBFX : ARM::UBFX);
1404
1405
1406  // For unsigned extracts, check for a shift right and mask
1407  unsigned And_imm = 0;
1408  if (N->getOpcode() == ISD::AND) {
1409    if (isOpcWithIntImmediate(N, ISD::AND, And_imm)) {
1410
1411      // The immediate is a mask of the low bits iff imm & (imm+1) == 0
1412      if (And_imm & (And_imm + 1))
1413        return NULL;
1414
1415      unsigned Srl_imm = 0;
1416      if (isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::SRL,
1417                                Srl_imm)) {
1418        assert(Srl_imm > 0 && Srl_imm < 32 && "bad amount in shift node!");
1419
1420        unsigned Width = CountTrailingOnes_32(And_imm);
1421        unsigned LSB = Srl_imm;
1422        SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1423        SDValue Ops[] = { N->getOperand(0).getOperand(0),
1424                          CurDAG->getTargetConstant(LSB, MVT::i32),
1425                          CurDAG->getTargetConstant(Width, MVT::i32),
1426          getAL(CurDAG), Reg0 };
1427        return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5);
1428      }
1429    }
1430    return NULL;
1431  }
1432
1433  // Otherwise, we're looking for a shift of a shift
1434  unsigned Shl_imm = 0;
1435  if (isOpcWithIntImmediate(N->getOperand(0).getNode(), ISD::SHL, Shl_imm)) {
1436    assert(Shl_imm > 0 && Shl_imm < 32 && "bad amount in shift node!");
1437    unsigned Srl_imm = 0;
1438    if (isInt32Immediate(N->getOperand(1), Srl_imm)) {
1439      assert(Srl_imm > 0 && Srl_imm < 32 && "bad amount in shift node!");
1440      unsigned Width = 32 - Srl_imm;
1441      int LSB = Srl_imm - Shl_imm;
1442      if (LSB < 0)
1443        return NULL;
1444      SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1445      SDValue Ops[] = { N->getOperand(0).getOperand(0),
1446                        CurDAG->getTargetConstant(LSB, MVT::i32),
1447                        CurDAG->getTargetConstant(Width, MVT::i32),
1448                        getAL(CurDAG), Reg0 };
1449      return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5);
1450    }
1451  }
1452  return NULL;
1453}
1454
1455SDNode *ARMDAGToDAGISel::
1456SelectT2CMOVShiftOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
1457                    ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
1458  SDValue CPTmp0;
1459  SDValue CPTmp1;
1460  if (SelectT2ShifterOperandReg(N, TrueVal, CPTmp0, CPTmp1)) {
1461    unsigned SOVal = cast<ConstantSDNode>(CPTmp1)->getZExtValue();
1462    unsigned SOShOp = ARM_AM::getSORegShOp(SOVal);
1463    unsigned Opc = 0;
1464    switch (SOShOp) {
1465    case ARM_AM::lsl: Opc = ARM::t2MOVCClsl; break;
1466    case ARM_AM::lsr: Opc = ARM::t2MOVCClsr; break;
1467    case ARM_AM::asr: Opc = ARM::t2MOVCCasr; break;
1468    case ARM_AM::ror: Opc = ARM::t2MOVCCror; break;
1469    default:
1470      llvm_unreachable("Unknown so_reg opcode!");
1471      break;
1472    }
1473    SDValue SOShImm =
1474      CurDAG->getTargetConstant(ARM_AM::getSORegOffset(SOVal), MVT::i32);
1475    SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
1476    SDValue Ops[] = { FalseVal, CPTmp0, SOShImm, CC, CCR, InFlag };
1477    return CurDAG->SelectNodeTo(N, Opc, MVT::i32,Ops, 6);
1478  }
1479  return 0;
1480}
1481
1482SDNode *ARMDAGToDAGISel::
1483SelectARMCMOVShiftOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
1484                     ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
1485  SDValue CPTmp0;
1486  SDValue CPTmp1;
1487  SDValue CPTmp2;
1488  if (SelectShifterOperandReg(N, TrueVal, CPTmp0, CPTmp1, CPTmp2)) {
1489    SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
1490    SDValue Ops[] = { FalseVal, CPTmp0, CPTmp1, CPTmp2, CC, CCR, InFlag };
1491    return CurDAG->SelectNodeTo(N, ARM::MOVCCs, MVT::i32, Ops, 7);
1492  }
1493  return 0;
1494}
1495
1496SDNode *ARMDAGToDAGISel::
1497SelectT2CMOVSoImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
1498                    ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
1499  ConstantSDNode *T = dyn_cast<ConstantSDNode>(TrueVal);
1500  if (!T)
1501    return 0;
1502
1503  if (Predicate_t2_so_imm(TrueVal.getNode())) {
1504    SDValue True = CurDAG->getTargetConstant(T->getZExtValue(), MVT::i32);
1505    SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
1506    SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
1507    return CurDAG->SelectNodeTo(N,
1508                                ARM::t2MOVCCi, MVT::i32, Ops, 5);
1509  }
1510  return 0;
1511}
1512
1513SDNode *ARMDAGToDAGISel::
1514SelectARMCMOVSoImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
1515                     ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
1516  ConstantSDNode *T = dyn_cast<ConstantSDNode>(TrueVal);
1517  if (!T)
1518    return 0;
1519
1520  if (Predicate_so_imm(TrueVal.getNode())) {
1521    SDValue True = CurDAG->getTargetConstant(T->getZExtValue(), MVT::i32);
1522    SDValue CC = CurDAG->getTargetConstant(CCVal, MVT::i32);
1523    SDValue Ops[] = { FalseVal, True, CC, CCR, InFlag };
1524    return CurDAG->SelectNodeTo(N,
1525                                ARM::MOVCCi, MVT::i32, Ops, 5);
1526  }
1527  return 0;
1528}
1529
1530SDNode *ARMDAGToDAGISel::SelectCMOVOp(SDNode *N) {
1531  EVT VT = N->getValueType(0);
1532  SDValue FalseVal = N->getOperand(0);
1533  SDValue TrueVal  = N->getOperand(1);
1534  SDValue CC = N->getOperand(2);
1535  SDValue CCR = N->getOperand(3);
1536  SDValue InFlag = N->getOperand(4);
1537  assert(CC.getOpcode() == ISD::Constant);
1538  assert(CCR.getOpcode() == ISD::Register);
1539  ARMCC::CondCodes CCVal =
1540    (ARMCC::CondCodes)cast<ConstantSDNode>(CC)->getZExtValue();
1541
1542  if (!Subtarget->isThumb1Only() && VT == MVT::i32) {
1543    // Pattern: (ARMcmov:i32 GPR:i32:$false, so_reg:i32:$true, (imm:i32):$cc)
1544    // Emits: (MOVCCs:i32 GPR:i32:$false, so_reg:i32:$true, (imm:i32):$cc)
1545    // Pattern complexity = 18  cost = 1  size = 0
1546    SDValue CPTmp0;
1547    SDValue CPTmp1;
1548    SDValue CPTmp2;
1549    if (Subtarget->isThumb()) {
1550      SDNode *Res = SelectT2CMOVShiftOp(N, FalseVal, TrueVal,
1551                                        CCVal, CCR, InFlag);
1552      if (!Res)
1553        Res = SelectT2CMOVShiftOp(N, TrueVal, FalseVal,
1554                               ARMCC::getOppositeCondition(CCVal), CCR, InFlag);
1555      if (Res)
1556        return Res;
1557    } else {
1558      SDNode *Res = SelectARMCMOVShiftOp(N, FalseVal, TrueVal,
1559                                         CCVal, CCR, InFlag);
1560      if (!Res)
1561        Res = SelectARMCMOVShiftOp(N, TrueVal, FalseVal,
1562                               ARMCC::getOppositeCondition(CCVal), CCR, InFlag);
1563      if (Res)
1564        return Res;
1565    }
1566
1567    // Pattern: (ARMcmov:i32 GPR:i32:$false,
1568    //             (imm:i32)<<P:Predicate_so_imm>>:$true,
1569    //             (imm:i32):$cc)
1570    // Emits: (MOVCCi:i32 GPR:i32:$false,
1571    //           (so_imm:i32 (imm:i32):$true), (imm:i32):$cc)
1572    // Pattern complexity = 10  cost = 1  size = 0
1573    if (Subtarget->isThumb()) {
1574      SDNode *Res = SelectT2CMOVSoImmOp(N, FalseVal, TrueVal,
1575                                        CCVal, CCR, InFlag);
1576      if (!Res)
1577        Res = SelectT2CMOVSoImmOp(N, TrueVal, FalseVal,
1578                               ARMCC::getOppositeCondition(CCVal), CCR, InFlag);
1579      if (Res)
1580        return Res;
1581    } else {
1582      SDNode *Res = SelectARMCMOVSoImmOp(N, FalseVal, TrueVal,
1583                                         CCVal, CCR, InFlag);
1584      if (!Res)
1585        Res = SelectARMCMOVSoImmOp(N, TrueVal, FalseVal,
1586                               ARMCC::getOppositeCondition(CCVal), CCR, InFlag);
1587      if (Res)
1588        return Res;
1589    }
1590  }
1591
1592  // Pattern: (ARMcmov:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc)
1593  // Emits: (MOVCCr:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc)
1594  // Pattern complexity = 6  cost = 1  size = 0
1595  //
1596  // Pattern: (ARMcmov:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc)
1597  // Emits: (tMOVCCr:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc)
1598  // Pattern complexity = 6  cost = 11  size = 0
1599  //
1600  // Also FCPYScc and FCPYDcc.
1601  SDValue Tmp2 = CurDAG->getTargetConstant(CCVal, MVT::i32);
1602  SDValue Ops[] = { FalseVal, TrueVal, Tmp2, CCR, InFlag };
1603  unsigned Opc = 0;
1604  switch (VT.getSimpleVT().SimpleTy) {
1605  default: assert(false && "Illegal conditional move type!");
1606    break;
1607  case MVT::i32:
1608    Opc = Subtarget->isThumb()
1609      ? (Subtarget->hasThumb2() ? ARM::t2MOVCCr : ARM::tMOVCCr_pseudo)
1610      : ARM::MOVCCr;
1611    break;
1612  case MVT::f32:
1613    Opc = ARM::VMOVScc;
1614    break;
1615  case MVT::f64:
1616    Opc = ARM::VMOVDcc;
1617    break;
1618  }
1619  return CurDAG->SelectNodeTo(N, Opc, VT, Ops, 5);
1620}
1621
1622SDNode *ARMDAGToDAGISel::SelectConcatVector(SDNode *N) {
1623  // The only time a CONCAT_VECTORS operation can have legal types is when
1624  // two 64-bit vectors are concatenated to a 128-bit vector.
1625  EVT VT = N->getValueType(0);
1626  if (!VT.is128BitVector() || N->getNumOperands() != 2)
1627    llvm_unreachable("unexpected CONCAT_VECTORS");
1628  DebugLoc dl = N->getDebugLoc();
1629  SDValue V0 = N->getOperand(0);
1630  SDValue V1 = N->getOperand(1);
1631  SDValue SubReg0 = CurDAG->getTargetConstant(ARM::DSUBREG_0, MVT::i32);
1632  SDValue SubReg1 = CurDAG->getTargetConstant(ARM::DSUBREG_1, MVT::i32);
1633  const SDValue Ops[] = { V0, SubReg0, V1, SubReg1 };
1634  return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, dl, VT, Ops, 4);
1635}
1636
1637SDNode *ARMDAGToDAGISel::Select(SDNode *N) {
1638  DebugLoc dl = N->getDebugLoc();
1639
1640  if (N->isMachineOpcode())
1641    return NULL;   // Already selected.
1642
1643  switch (N->getOpcode()) {
1644  default: break;
1645  case ISD::Constant: {
1646    unsigned Val = cast<ConstantSDNode>(N)->getZExtValue();
1647    bool UseCP = true;
1648    if (Subtarget->hasThumb2())
1649      // Thumb2-aware targets have the MOVT instruction, so all immediates can
1650      // be done with MOV + MOVT, at worst.
1651      UseCP = 0;
1652    else {
1653      if (Subtarget->isThumb()) {
1654        UseCP = (Val > 255 &&                          // MOV
1655                 ~Val > 255 &&                         // MOV + MVN
1656                 !ARM_AM::isThumbImmShiftedVal(Val));  // MOV + LSL
1657      } else
1658        UseCP = (ARM_AM::getSOImmVal(Val) == -1 &&     // MOV
1659                 ARM_AM::getSOImmVal(~Val) == -1 &&    // MVN
1660                 !ARM_AM::isSOImmTwoPartVal(Val));     // two instrs.
1661    }
1662
1663    if (UseCP) {
1664      SDValue CPIdx =
1665        CurDAG->getTargetConstantPool(ConstantInt::get(
1666                                  Type::getInt32Ty(*CurDAG->getContext()), Val),
1667                                      TLI.getPointerTy());
1668
1669      SDNode *ResNode;
1670      if (Subtarget->isThumb1Only()) {
1671        SDValue Pred = getAL(CurDAG);
1672        SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1673        SDValue Ops[] = { CPIdx, Pred, PredReg, CurDAG->getEntryNode() };
1674        ResNode = CurDAG->getMachineNode(ARM::tLDRcp, dl, MVT::i32, MVT::Other,
1675                                         Ops, 4);
1676      } else {
1677        SDValue Ops[] = {
1678          CPIdx,
1679          CurDAG->getRegister(0, MVT::i32),
1680          CurDAG->getTargetConstant(0, MVT::i32),
1681          getAL(CurDAG),
1682          CurDAG->getRegister(0, MVT::i32),
1683          CurDAG->getEntryNode()
1684        };
1685        ResNode=CurDAG->getMachineNode(ARM::LDRcp, dl, MVT::i32, MVT::Other,
1686                                       Ops, 6);
1687      }
1688      ReplaceUses(SDValue(N, 0), SDValue(ResNode, 0));
1689      return NULL;
1690    }
1691
1692    // Other cases are autogenerated.
1693    break;
1694  }
1695  case ISD::FrameIndex: {
1696    // Selects to ADDri FI, 0 which in turn will become ADDri SP, imm.
1697    int FI = cast<FrameIndexSDNode>(N)->getIndex();
1698    SDValue TFI = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
1699    if (Subtarget->isThumb1Only()) {
1700      return CurDAG->SelectNodeTo(N, ARM::tADDrSPi, MVT::i32, TFI,
1701                                  CurDAG->getTargetConstant(0, MVT::i32));
1702    } else {
1703      unsigned Opc = ((Subtarget->isThumb() && Subtarget->hasThumb2()) ?
1704                      ARM::t2ADDri : ARM::ADDri);
1705      SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, MVT::i32),
1706                        getAL(CurDAG), CurDAG->getRegister(0, MVT::i32),
1707                        CurDAG->getRegister(0, MVT::i32) };
1708      return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5);
1709    }
1710  }
1711  case ISD::SRL:
1712    if (SDNode *I = SelectV6T2BitfieldExtractOp(N, false))
1713      return I;
1714    break;
1715  case ISD::SRA:
1716    if (SDNode *I = SelectV6T2BitfieldExtractOp(N, true))
1717      return I;
1718    break;
1719  case ISD::MUL:
1720    if (Subtarget->isThumb1Only())
1721      break;
1722    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
1723      unsigned RHSV = C->getZExtValue();
1724      if (!RHSV) break;
1725      if (isPowerOf2_32(RHSV-1)) {  // 2^n+1?
1726        unsigned ShImm = Log2_32(RHSV-1);
1727        if (ShImm >= 32)
1728          break;
1729        SDValue V = N->getOperand(0);
1730        ShImm = ARM_AM::getSORegOpc(ARM_AM::lsl, ShImm);
1731        SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, MVT::i32);
1732        SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1733        if (Subtarget->isThumb()) {
1734          SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG), Reg0, Reg0 };
1735          return CurDAG->SelectNodeTo(N, ARM::t2ADDrs, MVT::i32, Ops, 6);
1736        } else {
1737          SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG), Reg0, Reg0 };
1738          return CurDAG->SelectNodeTo(N, ARM::ADDrs, MVT::i32, Ops, 7);
1739        }
1740      }
1741      if (isPowerOf2_32(RHSV+1)) {  // 2^n-1?
1742        unsigned ShImm = Log2_32(RHSV+1);
1743        if (ShImm >= 32)
1744          break;
1745        SDValue V = N->getOperand(0);
1746        ShImm = ARM_AM::getSORegOpc(ARM_AM::lsl, ShImm);
1747        SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, MVT::i32);
1748        SDValue Reg0 = CurDAG->getRegister(0, MVT::i32);
1749        if (Subtarget->isThumb()) {
1750          SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG), Reg0 };
1751          return CurDAG->SelectNodeTo(N, ARM::t2RSBrs, MVT::i32, Ops, 5);
1752        } else {
1753          SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG), Reg0, Reg0 };
1754          return CurDAG->SelectNodeTo(N, ARM::RSBrs, MVT::i32, Ops, 7);
1755        }
1756      }
1757    }
1758    break;
1759  case ISD::AND: {
1760    // Check for unsigned bitfield extract
1761    if (SDNode *I = SelectV6T2BitfieldExtractOp(N, false))
1762      return I;
1763
1764    // (and (or x, c2), c1) and top 16-bits of c1 and c2 match, lower 16-bits
1765    // of c1 are 0xffff, and lower 16-bit of c2 are 0. That is, the top 16-bits
1766    // are entirely contributed by c2 and lower 16-bits are entirely contributed
1767    // by x. That's equal to (or (and x, 0xffff), (and c1, 0xffff0000)).
1768    // Select it to: "movt x, ((c1 & 0xffff) >> 16)
1769    EVT VT = N->getValueType(0);
1770    if (VT != MVT::i32)
1771      break;
1772    unsigned Opc = (Subtarget->isThumb() && Subtarget->hasThumb2())
1773      ? ARM::t2MOVTi16
1774      : (Subtarget->hasV6T2Ops() ? ARM::MOVTi16 : 0);
1775    if (!Opc)
1776      break;
1777    SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);
1778    ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1);
1779    if (!N1C)
1780      break;
1781    if (N0.getOpcode() == ISD::OR && N0.getNode()->hasOneUse()) {
1782      SDValue N2 = N0.getOperand(1);
1783      ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2);
1784      if (!N2C)
1785        break;
1786      unsigned N1CVal = N1C->getZExtValue();
1787      unsigned N2CVal = N2C->getZExtValue();
1788      if ((N1CVal & 0xffff0000U) == (N2CVal & 0xffff0000U) &&
1789          (N1CVal & 0xffffU) == 0xffffU &&
1790          (N2CVal & 0xffffU) == 0x0U) {
1791        SDValue Imm16 = CurDAG->getTargetConstant((N2CVal & 0xFFFF0000U) >> 16,
1792                                                  MVT::i32);
1793        SDValue Ops[] = { N0.getOperand(0), Imm16,
1794                          getAL(CurDAG), CurDAG->getRegister(0, MVT::i32) };
1795        return CurDAG->getMachineNode(Opc, dl, VT, Ops, 4);
1796      }
1797    }
1798    break;
1799  }
1800  case ARMISD::VMOVRRD:
1801    return CurDAG->getMachineNode(ARM::VMOVRRD, dl, MVT::i32, MVT::i32,
1802                                  N->getOperand(0), getAL(CurDAG),
1803                                  CurDAG->getRegister(0, MVT::i32));
1804  case ISD::UMUL_LOHI: {
1805    if (Subtarget->isThumb1Only())
1806      break;
1807    if (Subtarget->isThumb()) {
1808      SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
1809                        getAL(CurDAG), CurDAG->getRegister(0, MVT::i32),
1810                        CurDAG->getRegister(0, MVT::i32) };
1811      return CurDAG->getMachineNode(ARM::t2UMULL, dl, MVT::i32, MVT::i32, Ops,4);
1812    } else {
1813      SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
1814                        getAL(CurDAG), CurDAG->getRegister(0, MVT::i32),
1815                        CurDAG->getRegister(0, MVT::i32) };
1816      return CurDAG->getMachineNode(ARM::UMULL, dl, MVT::i32, MVT::i32, Ops, 5);
1817    }
1818  }
1819  case ISD::SMUL_LOHI: {
1820    if (Subtarget->isThumb1Only())
1821      break;
1822    if (Subtarget->isThumb()) {
1823      SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
1824                        getAL(CurDAG), CurDAG->getRegister(0, MVT::i32) };
1825      return CurDAG->getMachineNode(ARM::t2SMULL, dl, MVT::i32, MVT::i32, Ops,4);
1826    } else {
1827      SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
1828                        getAL(CurDAG), CurDAG->getRegister(0, MVT::i32),
1829                        CurDAG->getRegister(0, MVT::i32) };
1830      return CurDAG->getMachineNode(ARM::SMULL, dl, MVT::i32, MVT::i32, Ops, 5);
1831    }
1832  }
1833  case ISD::LOAD: {
1834    SDNode *ResNode = 0;
1835    if (Subtarget->isThumb() && Subtarget->hasThumb2())
1836      ResNode = SelectT2IndexedLoad(N);
1837    else
1838      ResNode = SelectARMIndexedLoad(N);
1839    if (ResNode)
1840      return ResNode;
1841
1842    // VLDMQ must be custom-selected for "v2f64 load" to set the AM5Opc value.
1843    if (Subtarget->hasVFP2() &&
1844        N->getValueType(0).getSimpleVT().SimpleTy == MVT::v2f64) {
1845      SDValue Chain = N->getOperand(0);
1846      SDValue AM5Opc =
1847        CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::ia, 4), MVT::i32);
1848      SDValue Pred = getAL(CurDAG);
1849      SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1850      SDValue Ops[] = { N->getOperand(1), AM5Opc, Pred, PredReg, Chain };
1851      return CurDAG->getMachineNode(ARM::VLDMQ, dl, MVT::v2f64, MVT::Other,
1852                                    Ops, 5);
1853    }
1854    // Other cases are autogenerated.
1855    break;
1856  }
1857  case ISD::STORE: {
1858    // VSTMQ must be custom-selected for "v2f64 store" to set the AM5Opc value.
1859    if (Subtarget->hasVFP2() &&
1860        N->getOperand(1).getValueType().getSimpleVT().SimpleTy == MVT::v2f64) {
1861      SDValue Chain = N->getOperand(0);
1862      SDValue AM5Opc =
1863        CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::ia, 4), MVT::i32);
1864      SDValue Pred = getAL(CurDAG);
1865      SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1866      SDValue Ops[] = { N->getOperand(1), N->getOperand(2),
1867                        AM5Opc, Pred, PredReg, Chain };
1868      return CurDAG->getMachineNode(ARM::VSTMQ, dl, MVT::Other, Ops, 6);
1869    }
1870    // Other cases are autogenerated.
1871    break;
1872  }
1873  case ARMISD::BRCOND: {
1874    // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc)
1875    // Emits: (Bcc:void (bb:Other):$dst, (imm:i32):$cc)
1876    // Pattern complexity = 6  cost = 1  size = 0
1877
1878    // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc)
1879    // Emits: (tBcc:void (bb:Other):$dst, (imm:i32):$cc)
1880    // Pattern complexity = 6  cost = 1  size = 0
1881
1882    // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc)
1883    // Emits: (t2Bcc:void (bb:Other):$dst, (imm:i32):$cc)
1884    // Pattern complexity = 6  cost = 1  size = 0
1885
1886    unsigned Opc = Subtarget->isThumb() ?
1887      ((Subtarget->hasThumb2()) ? ARM::t2Bcc : ARM::tBcc) : ARM::Bcc;
1888    SDValue Chain = N->getOperand(0);
1889    SDValue N1 = N->getOperand(1);
1890    SDValue N2 = N->getOperand(2);
1891    SDValue N3 = N->getOperand(3);
1892    SDValue InFlag = N->getOperand(4);
1893    assert(N1.getOpcode() == ISD::BasicBlock);
1894    assert(N2.getOpcode() == ISD::Constant);
1895    assert(N3.getOpcode() == ISD::Register);
1896
1897    SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned)
1898                               cast<ConstantSDNode>(N2)->getZExtValue()),
1899                               MVT::i32);
1900    SDValue Ops[] = { N1, Tmp2, N3, Chain, InFlag };
1901    SDNode *ResNode = CurDAG->getMachineNode(Opc, dl, MVT::Other,
1902                                             MVT::Flag, Ops, 5);
1903    Chain = SDValue(ResNode, 0);
1904    if (N->getNumValues() == 2) {
1905      InFlag = SDValue(ResNode, 1);
1906      ReplaceUses(SDValue(N, 1), InFlag);
1907    }
1908    ReplaceUses(SDValue(N, 0),
1909                SDValue(Chain.getNode(), Chain.getResNo()));
1910    return NULL;
1911  }
1912  case ARMISD::CMOV:
1913    return SelectCMOVOp(N);
1914  case ARMISD::CNEG: {
1915    EVT VT = N->getValueType(0);
1916    SDValue N0 = N->getOperand(0);
1917    SDValue N1 = N->getOperand(1);
1918    SDValue N2 = N->getOperand(2);
1919    SDValue N3 = N->getOperand(3);
1920    SDValue InFlag = N->getOperand(4);
1921    assert(N2.getOpcode() == ISD::Constant);
1922    assert(N3.getOpcode() == ISD::Register);
1923
1924    SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned)
1925                               cast<ConstantSDNode>(N2)->getZExtValue()),
1926                               MVT::i32);
1927    SDValue Ops[] = { N0, N1, Tmp2, N3, InFlag };
1928    unsigned Opc = 0;
1929    switch (VT.getSimpleVT().SimpleTy) {
1930    default: assert(false && "Illegal conditional move type!");
1931      break;
1932    case MVT::f32:
1933      Opc = ARM::VNEGScc;
1934      break;
1935    case MVT::f64:
1936      Opc = ARM::VNEGDcc;
1937      break;
1938    }
1939    return CurDAG->SelectNodeTo(N, Opc, VT, Ops, 5);
1940  }
1941
1942  case ARMISD::VZIP: {
1943    unsigned Opc = 0;
1944    EVT VT = N->getValueType(0);
1945    switch (VT.getSimpleVT().SimpleTy) {
1946    default: return NULL;
1947    case MVT::v8i8:  Opc = ARM::VZIPd8; break;
1948    case MVT::v4i16: Opc = ARM::VZIPd16; break;
1949    case MVT::v2f32:
1950    case MVT::v2i32: Opc = ARM::VZIPd32; break;
1951    case MVT::v16i8: Opc = ARM::VZIPq8; break;
1952    case MVT::v8i16: Opc = ARM::VZIPq16; break;
1953    case MVT::v4f32:
1954    case MVT::v4i32: Opc = ARM::VZIPq32; break;
1955    }
1956    SDValue Pred = getAL(CurDAG);
1957    SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1958    SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
1959    return CurDAG->getMachineNode(Opc, dl, VT, VT, Ops, 4);
1960  }
1961  case ARMISD::VUZP: {
1962    unsigned Opc = 0;
1963    EVT VT = N->getValueType(0);
1964    switch (VT.getSimpleVT().SimpleTy) {
1965    default: return NULL;
1966    case MVT::v8i8:  Opc = ARM::VUZPd8; break;
1967    case MVT::v4i16: Opc = ARM::VUZPd16; break;
1968    case MVT::v2f32:
1969    case MVT::v2i32: Opc = ARM::VUZPd32; break;
1970    case MVT::v16i8: Opc = ARM::VUZPq8; break;
1971    case MVT::v8i16: Opc = ARM::VUZPq16; break;
1972    case MVT::v4f32:
1973    case MVT::v4i32: Opc = ARM::VUZPq32; break;
1974    }
1975    SDValue Pred = getAL(CurDAG);
1976    SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1977    SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
1978    return CurDAG->getMachineNode(Opc, dl, VT, VT, Ops, 4);
1979  }
1980  case ARMISD::VTRN: {
1981    unsigned Opc = 0;
1982    EVT VT = N->getValueType(0);
1983    switch (VT.getSimpleVT().SimpleTy) {
1984    default: return NULL;
1985    case MVT::v8i8:  Opc = ARM::VTRNd8; break;
1986    case MVT::v4i16: Opc = ARM::VTRNd16; break;
1987    case MVT::v2f32:
1988    case MVT::v2i32: Opc = ARM::VTRNd32; break;
1989    case MVT::v16i8: Opc = ARM::VTRNq8; break;
1990    case MVT::v8i16: Opc = ARM::VTRNq16; break;
1991    case MVT::v4f32:
1992    case MVT::v4i32: Opc = ARM::VTRNq32; break;
1993    }
1994    SDValue Pred = getAL(CurDAG);
1995    SDValue PredReg = CurDAG->getRegister(0, MVT::i32);
1996    SDValue Ops[] = { N->getOperand(0), N->getOperand(1), Pred, PredReg };
1997    return CurDAG->getMachineNode(Opc, dl, VT, VT, Ops, 4);
1998  }
1999
2000  case ISD::INTRINSIC_VOID:
2001  case ISD::INTRINSIC_W_CHAIN: {
2002    unsigned IntNo = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
2003    switch (IntNo) {
2004    default:
2005      break;
2006
2007    case Intrinsic::arm_neon_vld1: {
2008      unsigned DOpcodes[] = { ARM::VLD1d8, ARM::VLD1d16,
2009                              ARM::VLD1d32, ARM::VLD1d64 };
2010      unsigned QOpcodes[] = { ARM::VLD1q8, ARM::VLD1q16,
2011                              ARM::VLD1q32, ARM::VLD1q64 };
2012      return SelectVLD(N, 1, DOpcodes, QOpcodes, 0);
2013    }
2014
2015    case Intrinsic::arm_neon_vld2: {
2016      unsigned DOpcodes[] = { ARM::VLD2d8, ARM::VLD2d16,
2017                              ARM::VLD2d32, ARM::VLD1q64 };
2018      unsigned QOpcodes[] = { ARM::VLD2q8, ARM::VLD2q16, ARM::VLD2q32 };
2019      return SelectVLD(N, 2, DOpcodes, QOpcodes, 0);
2020    }
2021
2022    case Intrinsic::arm_neon_vld3: {
2023      unsigned DOpcodes[] = { ARM::VLD3d8, ARM::VLD3d16,
2024                              ARM::VLD3d32, ARM::VLD1d64T };
2025      unsigned QOpcodes0[] = { ARM::VLD3q8_UPD,
2026                               ARM::VLD3q16_UPD,
2027                               ARM::VLD3q32_UPD };
2028      unsigned QOpcodes1[] = { ARM::VLD3q8odd_UPD,
2029                               ARM::VLD3q16odd_UPD,
2030                               ARM::VLD3q32odd_UPD };
2031      return SelectVLD(N, 3, DOpcodes, QOpcodes0, QOpcodes1);
2032    }
2033
2034    case Intrinsic::arm_neon_vld4: {
2035      unsigned DOpcodes[] = { ARM::VLD4d8, ARM::VLD4d16,
2036                              ARM::VLD4d32, ARM::VLD1d64Q };
2037      unsigned QOpcodes0[] = { ARM::VLD4q8_UPD,
2038                               ARM::VLD4q16_UPD,
2039                               ARM::VLD4q32_UPD };
2040      unsigned QOpcodes1[] = { ARM::VLD4q8odd_UPD,
2041                               ARM::VLD4q16odd_UPD,
2042                               ARM::VLD4q32odd_UPD };
2043      return SelectVLD(N, 4, DOpcodes, QOpcodes0, QOpcodes1);
2044    }
2045
2046    case Intrinsic::arm_neon_vld2lane: {
2047      unsigned DOpcodes[] = { ARM::VLD2LNd8, ARM::VLD2LNd16, ARM::VLD2LNd32 };
2048      unsigned QOpcodes0[] = { ARM::VLD2LNq16, ARM::VLD2LNq32 };
2049      unsigned QOpcodes1[] = { ARM::VLD2LNq16odd, ARM::VLD2LNq32odd };
2050      return SelectVLDSTLane(N, true, 2, DOpcodes, QOpcodes0, QOpcodes1);
2051    }
2052
2053    case Intrinsic::arm_neon_vld3lane: {
2054      unsigned DOpcodes[] = { ARM::VLD3LNd8, ARM::VLD3LNd16, ARM::VLD3LNd32 };
2055      unsigned QOpcodes0[] = { ARM::VLD3LNq16, ARM::VLD3LNq32 };
2056      unsigned QOpcodes1[] = { ARM::VLD3LNq16odd, ARM::VLD3LNq32odd };
2057      return SelectVLDSTLane(N, true, 3, DOpcodes, QOpcodes0, QOpcodes1);
2058    }
2059
2060    case Intrinsic::arm_neon_vld4lane: {
2061      unsigned DOpcodes[] = { ARM::VLD4LNd8, ARM::VLD4LNd16, ARM::VLD4LNd32 };
2062      unsigned QOpcodes0[] = { ARM::VLD4LNq16, ARM::VLD4LNq32 };
2063      unsigned QOpcodes1[] = { ARM::VLD4LNq16odd, ARM::VLD4LNq32odd };
2064      return SelectVLDSTLane(N, true, 4, DOpcodes, QOpcodes0, QOpcodes1);
2065    }
2066
2067    case Intrinsic::arm_neon_vst1: {
2068      unsigned DOpcodes[] = { ARM::VST1d8, ARM::VST1d16,
2069                              ARM::VST1d32, ARM::VST1d64 };
2070      unsigned QOpcodes[] = { ARM::VST1q8, ARM::VST1q16,
2071                              ARM::VST1q32, ARM::VST1q64 };
2072      return SelectVST(N, 1, DOpcodes, QOpcodes, 0);
2073    }
2074
2075    case Intrinsic::arm_neon_vst2: {
2076      unsigned DOpcodes[] = { ARM::VST2d8, ARM::VST2d16,
2077                              ARM::VST2d32, ARM::VST1q64 };
2078      unsigned QOpcodes[] = { ARM::VST2q8, ARM::VST2q16, ARM::VST2q32 };
2079      return SelectVST(N, 2, DOpcodes, QOpcodes, 0);
2080    }
2081
2082    case Intrinsic::arm_neon_vst3: {
2083      unsigned DOpcodes[] = { ARM::VST3d8, ARM::VST3d16,
2084                              ARM::VST3d32, ARM::VST1d64T };
2085      unsigned QOpcodes0[] = { ARM::VST3q8_UPD,
2086                               ARM::VST3q16_UPD,
2087                               ARM::VST3q32_UPD };
2088      unsigned QOpcodes1[] = { ARM::VST3q8odd_UPD,
2089                               ARM::VST3q16odd_UPD,
2090                               ARM::VST3q32odd_UPD };
2091      return SelectVST(N, 3, DOpcodes, QOpcodes0, QOpcodes1);
2092    }
2093
2094    case Intrinsic::arm_neon_vst4: {
2095      unsigned DOpcodes[] = { ARM::VST4d8, ARM::VST4d16,
2096                              ARM::VST4d32, ARM::VST1d64Q };
2097      unsigned QOpcodes0[] = { ARM::VST4q8_UPD,
2098                               ARM::VST4q16_UPD,
2099                               ARM::VST4q32_UPD };
2100      unsigned QOpcodes1[] = { ARM::VST4q8odd_UPD,
2101                               ARM::VST4q16odd_UPD,
2102                               ARM::VST4q32odd_UPD };
2103      return SelectVST(N, 4, DOpcodes, QOpcodes0, QOpcodes1);
2104    }
2105
2106    case Intrinsic::arm_neon_vst2lane: {
2107      unsigned DOpcodes[] = { ARM::VST2LNd8, ARM::VST2LNd16, ARM::VST2LNd32 };
2108      unsigned QOpcodes0[] = { ARM::VST2LNq16, ARM::VST2LNq32 };
2109      unsigned QOpcodes1[] = { ARM::VST2LNq16odd, ARM::VST2LNq32odd };
2110      return SelectVLDSTLane(N, false, 2, DOpcodes, QOpcodes0, QOpcodes1);
2111    }
2112
2113    case Intrinsic::arm_neon_vst3lane: {
2114      unsigned DOpcodes[] = { ARM::VST3LNd8, ARM::VST3LNd16, ARM::VST3LNd32 };
2115      unsigned QOpcodes0[] = { ARM::VST3LNq16, ARM::VST3LNq32 };
2116      unsigned QOpcodes1[] = { ARM::VST3LNq16odd, ARM::VST3LNq32odd };
2117      return SelectVLDSTLane(N, false, 3, DOpcodes, QOpcodes0, QOpcodes1);
2118    }
2119
2120    case Intrinsic::arm_neon_vst4lane: {
2121      unsigned DOpcodes[] = { ARM::VST4LNd8, ARM::VST4LNd16, ARM::VST4LNd32 };
2122      unsigned QOpcodes0[] = { ARM::VST4LNq16, ARM::VST4LNq32 };
2123      unsigned QOpcodes1[] = { ARM::VST4LNq16odd, ARM::VST4LNq32odd };
2124      return SelectVLDSTLane(N, false, 4, DOpcodes, QOpcodes0, QOpcodes1);
2125    }
2126    }
2127    break;
2128  }
2129
2130  case ISD::CONCAT_VECTORS:
2131    return SelectConcatVector(N);
2132  }
2133
2134  return SelectCode(N);
2135}
2136
2137bool ARMDAGToDAGISel::
2138SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode,
2139                             std::vector<SDValue> &OutOps) {
2140  assert(ConstraintCode == 'm' && "unexpected asm memory constraint");
2141  // Require the address to be in a register.  That is safe for all ARM
2142  // variants and it is hard to do anything much smarter without knowing
2143  // how the operand is used.
2144  OutOps.push_back(Op);
2145  return false;
2146}
2147
2148/// createARMISelDag - This pass converts a legalized DAG into a
2149/// ARM-specific DAG, ready for instruction scheduling.
2150///
2151FunctionPass *llvm::createARMISelDag(ARMBaseTargetMachine &TM,
2152                                     CodeGenOpt::Level OptLevel) {
2153  return new ARMDAGToDAGISel(TM, OptLevel);
2154}
2155
2156/// ModelWithRegSequence - Return true if isel should use REG_SEQUENCE to model
2157/// operations involving sub-registers.
2158bool llvm::ModelWithRegSequence() {
2159  return UseRegSeq;
2160}
2161