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