Handle loading from/storing to undef pointers on SPU by inserting a
[oota-llvm.git] / lib / Target / CellSPU / SPUISelDAGToDAG.cpp
1 //===-- SPUISelDAGToDAG.cpp - CellSPU pattern matching inst selector ------===//
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 a pattern matching instruction selector for the Cell SPU,
11 // converting from a legalized dag to a SPU-target dag.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "SPU.h"
16 #include "SPUTargetMachine.h"
17 #include "SPUHazardRecognizers.h"
18 #include "SPUFrameInfo.h"
19 #include "SPURegisterNames.h"
20 #include "SPUTargetMachine.h"
21 #include "llvm/CodeGen/MachineConstantPool.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/MachineFunction.h"
24 #include "llvm/CodeGen/SelectionDAG.h"
25 #include "llvm/CodeGen/SelectionDAGISel.h"
26 #include "llvm/CodeGen/PseudoSourceValue.h"
27 #include "llvm/Target/TargetOptions.h"
28 #include "llvm/ADT/Statistic.h"
29 #include "llvm/Constants.h"
30 #include "llvm/GlobalValue.h"
31 #include "llvm/Intrinsics.h"
32 #include "llvm/LLVMContext.h"
33 #include "llvm/Support/Debug.h"
34 #include "llvm/Support/ErrorHandling.h"
35 #include "llvm/Support/MathExtras.h"
36 #include "llvm/Support/Compiler.h"
37 #include "llvm/Support/raw_ostream.h"
38
39 using namespace llvm;
40
41 namespace {
42   //! ConstantSDNode predicate for i32 sign-extended, 10-bit immediates
43   bool
44   isI64IntS10Immediate(ConstantSDNode *CN)
45   {
46     return isInt<10>(CN->getSExtValue());
47   }
48
49   //! ConstantSDNode predicate for i32 sign-extended, 10-bit immediates
50   bool
51   isI32IntS10Immediate(ConstantSDNode *CN)
52   {
53     return isInt<10>(CN->getSExtValue());
54   }
55
56   //! ConstantSDNode predicate for i32 unsigned 10-bit immediate values
57   bool
58   isI32IntU10Immediate(ConstantSDNode *CN)
59   {
60     return isUInt<10>(CN->getSExtValue());
61   }
62
63   //! ConstantSDNode predicate for i16 sign-extended, 10-bit immediate values
64   bool
65   isI16IntS10Immediate(ConstantSDNode *CN)
66   {
67     return isInt<10>(CN->getSExtValue());
68   }
69
70   //! SDNode predicate for i16 sign-extended, 10-bit immediate values
71   bool
72   isI16IntS10Immediate(SDNode *N)
73   {
74     ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N);
75     return (CN != 0 && isI16IntS10Immediate(CN));
76   }
77
78   //! ConstantSDNode predicate for i16 unsigned 10-bit immediate values
79   bool
80   isI16IntU10Immediate(ConstantSDNode *CN)
81   {
82     return isUInt<10>((short) CN->getZExtValue());
83   }
84
85   //! SDNode predicate for i16 sign-extended, 10-bit immediate values
86   bool
87   isI16IntU10Immediate(SDNode *N)
88   {
89     return (N->getOpcode() == ISD::Constant
90             && isI16IntU10Immediate(cast<ConstantSDNode>(N)));
91   }
92
93   //! ConstantSDNode predicate for signed 16-bit values
94   /*!
95     \arg CN The constant SelectionDAG node holding the value
96     \arg Imm The returned 16-bit value, if returning true
97
98     This predicate tests the value in \a CN to see whether it can be
99     represented as a 16-bit, sign-extended quantity. Returns true if
100     this is the case.
101    */
102   bool
103   isIntS16Immediate(ConstantSDNode *CN, short &Imm)
104   {
105     EVT vt = CN->getValueType(0);
106     Imm = (short) CN->getZExtValue();
107     if (vt.getSimpleVT() >= MVT::i1 && vt.getSimpleVT() <= MVT::i16) {
108       return true;
109     } else if (vt == MVT::i32) {
110       int32_t i_val = (int32_t) CN->getZExtValue();
111       short s_val = (short) i_val;
112       return i_val == s_val;
113     } else {
114       int64_t i_val = (int64_t) CN->getZExtValue();
115       short s_val = (short) i_val;
116       return i_val == s_val;
117     }
118
119     return false;
120   }
121
122   //! SDNode predicate for signed 16-bit values.
123   bool
124   isIntS16Immediate(SDNode *N, short &Imm)
125   {
126     return (N->getOpcode() == ISD::Constant
127             && isIntS16Immediate(cast<ConstantSDNode>(N), Imm));
128   }
129
130   //! ConstantFPSDNode predicate for representing floats as 16-bit sign ext.
131   static bool
132   isFPS16Immediate(ConstantFPSDNode *FPN, short &Imm)
133   {
134     EVT vt = FPN->getValueType(0);
135     if (vt == MVT::f32) {
136       int val = FloatToBits(FPN->getValueAPF().convertToFloat());
137       int sval = (int) ((val << 16) >> 16);
138       Imm = (short) val;
139       return val == sval;
140     }
141
142     return false;
143   }
144
145   bool
146   isHighLow(const SDValue &Op)
147   {
148     return (Op.getOpcode() == SPUISD::IndirectAddr
149             && ((Op.getOperand(0).getOpcode() == SPUISD::Hi
150                  && Op.getOperand(1).getOpcode() == SPUISD::Lo)
151                 || (Op.getOperand(0).getOpcode() == SPUISD::Lo
152                     && Op.getOperand(1).getOpcode() == SPUISD::Hi)));
153   }
154
155   //===------------------------------------------------------------------===//
156   //! EVT to "useful stuff" mapping structure:
157
158   struct valtype_map_s {
159     EVT VT;
160     unsigned ldresult_ins;      /// LDRESULT instruction (0 = undefined)
161     bool ldresult_imm;          /// LDRESULT instruction requires immediate?
162     unsigned lrinst;            /// LR instruction
163   };
164
165   const valtype_map_s valtype_map[] = {
166     { MVT::i8,    SPU::ORBIr8,  true,  SPU::LRr8 },
167     { MVT::i16,   SPU::ORHIr16, true,  SPU::LRr16 },
168     { MVT::i32,   SPU::ORIr32,  true,  SPU::LRr32 },
169     { MVT::i64,   SPU::ORr64,   false, SPU::LRr64 },
170     { MVT::f32,   SPU::ORf32,   false, SPU::LRf32 },
171     { MVT::f64,   SPU::ORf64,   false, SPU::LRf64 },
172     // vector types... (sigh!)
173     { MVT::v16i8, 0,            false, SPU::LRv16i8 },
174     { MVT::v8i16, 0,            false, SPU::LRv8i16 },
175     { MVT::v4i32, 0,            false, SPU::LRv4i32 },
176     { MVT::v2i64, 0,            false, SPU::LRv2i64 },
177     { MVT::v4f32, 0,            false, SPU::LRv4f32 },
178     { MVT::v2f64, 0,            false, SPU::LRv2f64 }
179   };
180
181   const size_t n_valtype_map = sizeof(valtype_map) / sizeof(valtype_map[0]);
182
183   const valtype_map_s *getValueTypeMapEntry(EVT VT)
184   {
185     const valtype_map_s *retval = 0;
186     for (size_t i = 0; i < n_valtype_map; ++i) {
187       if (valtype_map[i].VT == VT) {
188         retval = valtype_map + i;
189         break;
190       }
191     }
192
193
194 #ifndef NDEBUG
195     if (retval == 0) {
196       report_fatal_error("SPUISelDAGToDAG.cpp: getValueTypeMapEntry returns"
197                          "NULL for " + Twine(VT.getEVTString()));
198     }
199 #endif
200
201     return retval;
202   }
203
204   //! Generate the carry-generate shuffle mask.
205   SDValue getCarryGenerateShufMask(SelectionDAG &DAG, DebugLoc dl) {
206     SmallVector<SDValue, 16 > ShufBytes;
207
208     // Create the shuffle mask for "rotating" the borrow up one register slot
209     // once the borrow is generated.
210     ShufBytes.push_back(DAG.getConstant(0x04050607, MVT::i32));
211     ShufBytes.push_back(DAG.getConstant(0x80808080, MVT::i32));
212     ShufBytes.push_back(DAG.getConstant(0x0c0d0e0f, MVT::i32));
213     ShufBytes.push_back(DAG.getConstant(0x80808080, MVT::i32));
214
215     return DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
216                        &ShufBytes[0], ShufBytes.size());
217   }
218
219   //! Generate the borrow-generate shuffle mask
220   SDValue getBorrowGenerateShufMask(SelectionDAG &DAG, DebugLoc dl) {
221     SmallVector<SDValue, 16 > ShufBytes;
222
223     // Create the shuffle mask for "rotating" the borrow up one register slot
224     // once the borrow is generated.
225     ShufBytes.push_back(DAG.getConstant(0x04050607, MVT::i32));
226     ShufBytes.push_back(DAG.getConstant(0xc0c0c0c0, MVT::i32));
227     ShufBytes.push_back(DAG.getConstant(0x0c0d0e0f, MVT::i32));
228     ShufBytes.push_back(DAG.getConstant(0xc0c0c0c0, MVT::i32));
229
230     return DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
231                        &ShufBytes[0], ShufBytes.size());
232   }
233
234   //===------------------------------------------------------------------===//
235   /// SPUDAGToDAGISel - Cell SPU-specific code to select SPU machine
236   /// instructions for SelectionDAG operations.
237   ///
238   class SPUDAGToDAGISel :
239     public SelectionDAGISel
240   {
241     const SPUTargetMachine &TM;
242     const SPUTargetLowering &SPUtli;
243     unsigned GlobalBaseReg;
244
245   public:
246     explicit SPUDAGToDAGISel(SPUTargetMachine &tm) :
247       SelectionDAGISel(tm),
248       TM(tm),
249       SPUtli(*tm.getTargetLowering())
250     { }
251
252     virtual bool runOnMachineFunction(MachineFunction &MF) {
253       // Make sure we re-emit a set of the global base reg if necessary
254       GlobalBaseReg = 0;
255       SelectionDAGISel::runOnMachineFunction(MF);
256       return true;
257     }
258
259     /// getI32Imm - Return a target constant with the specified value, of type
260     /// i32.
261     inline SDValue getI32Imm(uint32_t Imm) {
262       return CurDAG->getTargetConstant(Imm, MVT::i32);
263     }
264
265     /// getI64Imm - Return a target constant with the specified value, of type
266     /// i64.
267     inline SDValue getI64Imm(uint64_t Imm) {
268       return CurDAG->getTargetConstant(Imm, MVT::i64);
269     }
270
271     /// getSmallIPtrImm - Return a target constant of pointer type.
272     inline SDValue getSmallIPtrImm(unsigned Imm) {
273       return CurDAG->getTargetConstant(Imm, SPUtli.getPointerTy());
274       }
275
276     SDNode *emitBuildVector(SDNode *bvNode) {
277       EVT vecVT = bvNode->getValueType(0);
278       EVT eltVT = vecVT.getVectorElementType();
279       DebugLoc dl = bvNode->getDebugLoc();
280
281       // Check to see if this vector can be represented as a CellSPU immediate
282       // constant by invoking all of the instruction selection predicates:
283       if (((vecVT == MVT::v8i16) &&
284            (SPU::get_vec_i16imm(bvNode, *CurDAG, MVT::i16).getNode() != 0)) ||
285           ((vecVT == MVT::v4i32) &&
286            ((SPU::get_vec_i16imm(bvNode, *CurDAG, MVT::i32).getNode() != 0) ||
287             (SPU::get_ILHUvec_imm(bvNode, *CurDAG, MVT::i32).getNode() != 0) ||
288             (SPU::get_vec_u18imm(bvNode, *CurDAG, MVT::i32).getNode() != 0) ||
289             (SPU::get_v4i32_imm(bvNode, *CurDAG).getNode() != 0))) ||
290           ((vecVT == MVT::v2i64) &&
291            ((SPU::get_vec_i16imm(bvNode, *CurDAG, MVT::i64).getNode() != 0) ||
292             (SPU::get_ILHUvec_imm(bvNode, *CurDAG, MVT::i64).getNode() != 0) ||
293             (SPU::get_vec_u18imm(bvNode, *CurDAG, MVT::i64).getNode() != 0)))) {
294         HandleSDNode Dummy(SDValue(bvNode, 0));
295         if (SDNode *N = Select(bvNode))
296           return N;
297         return Dummy.getValue().getNode();
298       }
299
300       // No, need to emit a constant pool spill:
301       std::vector<Constant*> CV;
302
303       for (size_t i = 0; i < bvNode->getNumOperands(); ++i) {
304         ConstantSDNode *V = cast<ConstantSDNode > (bvNode->getOperand(i));
305         CV.push_back(const_cast<ConstantInt *>(V->getConstantIntValue()));
306       }
307
308       const Constant *CP = ConstantVector::get(CV);
309       SDValue CPIdx = CurDAG->getConstantPool(CP, SPUtli.getPointerTy());
310       unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();
311       SDValue CGPoolOffset =
312               SPU::LowerConstantPool(CPIdx, *CurDAG, TM);
313       
314       HandleSDNode Dummy(CurDAG->getLoad(vecVT, dl,
315                                          CurDAG->getEntryNode(), CGPoolOffset,
316                                          PseudoSourceValue::getConstantPool(),0,
317                                          false, false, Alignment));
318       CurDAG->ReplaceAllUsesWith(SDValue(bvNode, 0), Dummy.getValue());
319       if (SDNode *N = SelectCode(Dummy.getValue().getNode()))
320         return N;
321       return Dummy.getValue().getNode();
322     }
323
324     /// Select - Convert the specified operand from a target-independent to a
325     /// target-specific node if it hasn't already been changed.
326     SDNode *Select(SDNode *N);
327
328     //! Emit the instruction sequence for i64 shl
329     SDNode *SelectSHLi64(SDNode *N, EVT OpVT);
330
331     //! Emit the instruction sequence for i64 srl
332     SDNode *SelectSRLi64(SDNode *N, EVT OpVT);
333
334     //! Emit the instruction sequence for i64 sra
335     SDNode *SelectSRAi64(SDNode *N, EVT OpVT);
336
337     //! Emit the necessary sequence for loading i64 constants:
338     SDNode *SelectI64Constant(SDNode *N, EVT OpVT, DebugLoc dl);
339
340     //! Alternate instruction emit sequence for loading i64 constants
341     SDNode *SelectI64Constant(uint64_t i64const, EVT OpVT, DebugLoc dl);
342
343     //! Returns true if the address N is an A-form (local store) address
344     bool SelectAFormAddr(SDNode *Op, SDValue N, SDValue &Base,
345                          SDValue &Index);
346
347     //! D-form address predicate
348     bool SelectDFormAddr(SDNode *Op, SDValue N, SDValue &Base,
349                          SDValue &Index);
350
351     /// Alternate D-form address using i7 offset predicate
352     bool SelectDForm2Addr(SDNode *Op, SDValue N, SDValue &Disp,
353                           SDValue &Base);
354
355     /// D-form address selection workhorse
356     bool DFormAddressPredicate(SDNode *Op, SDValue N, SDValue &Disp,
357                                SDValue &Base, int minOffset, int maxOffset);
358
359     //! Address predicate if N can be expressed as an indexed [r+r] operation.
360     bool SelectXFormAddr(SDNode *Op, SDValue N, SDValue &Base,
361                          SDValue &Index);
362
363     /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
364     /// inline asm expressions.
365     virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
366                                               char ConstraintCode,
367                                               std::vector<SDValue> &OutOps) {
368       SDValue Op0, Op1;
369       switch (ConstraintCode) {
370       default: return true;
371       case 'm':   // memory
372         if (!SelectDFormAddr(Op.getNode(), Op, Op0, Op1)
373             && !SelectAFormAddr(Op.getNode(), Op, Op0, Op1))
374           SelectXFormAddr(Op.getNode(), Op, Op0, Op1);
375         break;
376       case 'o':   // offsetable
377         if (!SelectDFormAddr(Op.getNode(), Op, Op0, Op1)
378             && !SelectAFormAddr(Op.getNode(), Op, Op0, Op1)) {
379           Op0 = Op;
380           Op1 = getSmallIPtrImm(0);
381         }
382         break;
383       case 'v':   // not offsetable
384 #if 1
385         llvm_unreachable("InlineAsmMemoryOperand 'v' constraint not handled.");
386 #else
387         SelectAddrIdxOnly(Op, Op, Op0, Op1);
388 #endif
389         break;
390       }
391
392       OutOps.push_back(Op0);
393       OutOps.push_back(Op1);
394       return false;
395     }
396
397     virtual const char *getPassName() const {
398       return "Cell SPU DAG->DAG Pattern Instruction Selection";
399     }
400
401     /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
402     /// this target when scheduling the DAG.
403     virtual ScheduleHazardRecognizer *CreateTargetHazardRecognizer() {
404       const TargetInstrInfo *II = TM.getInstrInfo();
405       assert(II && "No InstrInfo?");
406       return new SPUHazardRecognizer(*II);
407     }
408
409     // Include the pieces autogenerated from the target description.
410 #include "SPUGenDAGISel.inc"
411   };
412 }
413
414 /*!
415  \arg Op The ISD instruction operand
416  \arg N The address to be tested
417  \arg Base The base address
418  \arg Index The base address index
419  */
420 bool
421 SPUDAGToDAGISel::SelectAFormAddr(SDNode *Op, SDValue N, SDValue &Base,
422                     SDValue &Index) {
423   // These match the addr256k operand type:
424   EVT OffsVT = MVT::i16;
425   SDValue Zero = CurDAG->getTargetConstant(0, OffsVT);
426
427   switch (N.getOpcode()) {
428   case ISD::Constant:
429   case ISD::ConstantPool:
430   case ISD::GlobalAddress:
431     report_fatal_error("SPU SelectAFormAddr: Constant/Pool/Global not lowered.");
432     /*NOTREACHED*/
433
434   case ISD::TargetConstant:
435   case ISD::TargetGlobalAddress:
436   case ISD::TargetJumpTable:
437     report_fatal_error("SPUSelectAFormAddr: Target Constant/Pool/Global "
438                       "not wrapped as A-form address.");
439     /*NOTREACHED*/
440
441   case SPUISD::AFormAddr:
442     // Just load from memory if there's only a single use of the location,
443     // otherwise, this will get handled below with D-form offset addresses
444     if (N.hasOneUse()) {
445       SDValue Op0 = N.getOperand(0);
446       switch (Op0.getOpcode()) {
447       case ISD::TargetConstantPool:
448       case ISD::TargetJumpTable:
449         Base = Op0;
450         Index = Zero;
451         return true;
452
453       case ISD::TargetGlobalAddress: {
454         GlobalAddressSDNode *GSDN = cast<GlobalAddressSDNode>(Op0);
455         const GlobalValue *GV = GSDN->getGlobal();
456         if (GV->getAlignment() == 16) {
457           Base = Op0;
458           Index = Zero;
459           return true;
460         }
461         break;
462       }
463       }
464     }
465     break;
466   }
467   return false;
468 }
469
470 bool
471 SPUDAGToDAGISel::SelectDForm2Addr(SDNode *Op, SDValue N, SDValue &Disp,
472                                   SDValue &Base) {
473   const int minDForm2Offset = -(1 << 7);
474   const int maxDForm2Offset = (1 << 7) - 1;
475   return DFormAddressPredicate(Op, N, Disp, Base, minDForm2Offset,
476                                maxDForm2Offset);
477 }
478
479 /*!
480   \arg Op The ISD instruction (ignored)
481   \arg N The address to be tested
482   \arg Base Base address register/pointer
483   \arg Index Base address index
484
485   Examine the input address by a base register plus a signed 10-bit
486   displacement, [r+I10] (D-form address).
487
488   \return true if \a N is a D-form address with \a Base and \a Index set
489   to non-empty SDValue instances.
490 */
491 bool
492 SPUDAGToDAGISel::SelectDFormAddr(SDNode *Op, SDValue N, SDValue &Base,
493                                  SDValue &Index) {
494   return DFormAddressPredicate(Op, N, Base, Index,
495                                SPUFrameInfo::minFrameOffset(),
496                                SPUFrameInfo::maxFrameOffset());
497 }
498
499 bool
500 SPUDAGToDAGISel::DFormAddressPredicate(SDNode *Op, SDValue N, SDValue &Base,
501                                       SDValue &Index, int minOffset,
502                                       int maxOffset) {
503   unsigned Opc = N.getOpcode();
504   EVT PtrTy = SPUtli.getPointerTy();
505
506   if (Opc == ISD::FrameIndex) {
507     // Stack frame index must be less than 512 (divided by 16):
508     FrameIndexSDNode *FIN = cast<FrameIndexSDNode>(N);
509     int FI = int(FIN->getIndex());
510     DEBUG(errs() << "SelectDFormAddr: ISD::FrameIndex = "
511                << FI << "\n");
512     if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {
513       Base = CurDAG->getTargetConstant(0, PtrTy);
514       Index = CurDAG->getTargetFrameIndex(FI, PtrTy);
515       return true;
516     }
517   } else if (Opc == ISD::ADD) {
518     // Generated by getelementptr
519     const SDValue Op0 = N.getOperand(0);
520     const SDValue Op1 = N.getOperand(1);
521
522     if ((Op0.getOpcode() == SPUISD::Hi && Op1.getOpcode() == SPUISD::Lo)
523         || (Op1.getOpcode() == SPUISD::Hi && Op0.getOpcode() == SPUISD::Lo)) {
524       Base = CurDAG->getTargetConstant(0, PtrTy);
525       Index = N;
526       return true;
527     } else if (Op1.getOpcode() == ISD::Constant
528                || Op1.getOpcode() == ISD::TargetConstant) {
529       ConstantSDNode *CN = cast<ConstantSDNode>(Op1);
530       int32_t offset = int32_t(CN->getSExtValue());
531
532       if (Op0.getOpcode() == ISD::FrameIndex) {
533         FrameIndexSDNode *FIN = cast<FrameIndexSDNode>(Op0);
534         int FI = int(FIN->getIndex());
535         DEBUG(errs() << "SelectDFormAddr: ISD::ADD offset = " << offset
536                    << " frame index = " << FI << "\n");
537
538         if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {
539           Base = CurDAG->getTargetConstant(offset, PtrTy);
540           Index = CurDAG->getTargetFrameIndex(FI, PtrTy);
541           return true;
542         }
543       } else if (offset > minOffset && offset < maxOffset) {
544         Base = CurDAG->getTargetConstant(offset, PtrTy);
545         Index = Op0;
546         return true;
547       }
548     } else if (Op0.getOpcode() == ISD::Constant
549                || Op0.getOpcode() == ISD::TargetConstant) {
550       ConstantSDNode *CN = cast<ConstantSDNode>(Op0);
551       int32_t offset = int32_t(CN->getSExtValue());
552
553       if (Op1.getOpcode() == ISD::FrameIndex) {
554         FrameIndexSDNode *FIN = cast<FrameIndexSDNode>(Op1);
555         int FI = int(FIN->getIndex());
556         DEBUG(errs() << "SelectDFormAddr: ISD::ADD offset = " << offset
557                    << " frame index = " << FI << "\n");
558
559         if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {
560           Base = CurDAG->getTargetConstant(offset, PtrTy);
561           Index = CurDAG->getTargetFrameIndex(FI, PtrTy);
562           return true;
563         }
564       } else if (offset > minOffset && offset < maxOffset) {
565         Base = CurDAG->getTargetConstant(offset, PtrTy);
566         Index = Op1;
567         return true;
568       }
569     }
570   } else if (Opc == SPUISD::IndirectAddr) {
571     // Indirect with constant offset -> D-Form address
572     const SDValue Op0 = N.getOperand(0);
573     const SDValue Op1 = N.getOperand(1);
574
575     if (Op0.getOpcode() == SPUISD::Hi
576         && Op1.getOpcode() == SPUISD::Lo) {
577       // (SPUindirect (SPUhi <arg>, 0), (SPUlo <arg>, 0))
578       Base = CurDAG->getTargetConstant(0, PtrTy);
579       Index = N;
580       return true;
581     } else if (isa<ConstantSDNode>(Op0) || isa<ConstantSDNode>(Op1)) {
582       int32_t offset = 0;
583       SDValue idxOp;
584
585       if (isa<ConstantSDNode>(Op1)) {
586         ConstantSDNode *CN = cast<ConstantSDNode>(Op1);
587         offset = int32_t(CN->getSExtValue());
588         idxOp = Op0;
589       } else if (isa<ConstantSDNode>(Op0)) {
590         ConstantSDNode *CN = cast<ConstantSDNode>(Op0);
591         offset = int32_t(CN->getSExtValue());
592         idxOp = Op1;
593       }
594
595       if (offset >= minOffset && offset <= maxOffset) {
596         Base = CurDAG->getTargetConstant(offset, PtrTy);
597         Index = idxOp;
598         return true;
599       }
600     }
601   } else if (Opc == SPUISD::AFormAddr) {
602     Base = CurDAG->getTargetConstant(0, N.getValueType());
603     Index = N;
604     return true;
605   } else if (Opc == SPUISD::LDRESULT) {
606     Base = CurDAG->getTargetConstant(0, N.getValueType());
607     Index = N;
608     return true;
609   } else if (Opc == ISD::Register 
610            ||Opc == ISD::CopyFromReg 
611            ||Opc == ISD::UNDEF) {
612     unsigned OpOpc = Op->getOpcode();
613
614     if (OpOpc == ISD::STORE || OpOpc == ISD::LOAD) {
615       // Direct load/store without getelementptr
616       SDValue Offs;
617
618       Offs = ((OpOpc == ISD::STORE) ? Op->getOperand(3) : Op->getOperand(2));
619
620       if (Offs.getOpcode() == ISD::Constant || Offs.getOpcode() == ISD::UNDEF) {
621         if (Offs.getOpcode() == ISD::UNDEF)
622           Offs = CurDAG->getTargetConstant(0, Offs.getValueType());
623
624         Base = Offs;
625         Index = N;
626         return true;
627       }
628     } else {
629       /* If otherwise unadorned, default to D-form address with 0 offset: */
630       if (Opc == ISD::CopyFromReg) {
631         Index = N.getOperand(1);
632       } else {
633         Index = N;
634       }
635
636       Base = CurDAG->getTargetConstant(0, Index.getValueType());
637       return true;
638     }
639   }
640
641   return false;
642 }
643
644 /*!
645   \arg Op The ISD instruction operand
646   \arg N The address operand
647   \arg Base The base pointer operand
648   \arg Index The offset/index operand
649
650   If the address \a N can be expressed as an A-form or D-form address, returns
651   false.  Otherwise, creates two operands, Base and Index that will become the
652   (r)(r) X-form address.
653 */
654 bool
655 SPUDAGToDAGISel::SelectXFormAddr(SDNode *Op, SDValue N, SDValue &Base,
656                                  SDValue &Index) {
657   if (!SelectAFormAddr(Op, N, Base, Index)
658       && !SelectDFormAddr(Op, N, Base, Index)) {
659     // If the address is neither A-form or D-form, punt and use an X-form
660     // address:
661     Base = N.getOperand(1);
662     Index = N.getOperand(0);
663     return true;
664   }
665
666   return false;
667 }
668
669 //! Convert the operand from a target-independent to a target-specific node
670 /*!
671  */
672 SDNode *
673 SPUDAGToDAGISel::Select(SDNode *N) {
674   unsigned Opc = N->getOpcode();
675   int n_ops = -1;
676   unsigned NewOpc;
677   EVT OpVT = N->getValueType(0);
678   SDValue Ops[8];
679   DebugLoc dl = N->getDebugLoc();
680
681   if (N->isMachineOpcode())
682     return NULL;   // Already selected.
683
684   if (Opc == ISD::FrameIndex) {
685     int FI = cast<FrameIndexSDNode>(N)->getIndex();
686     SDValue TFI = CurDAG->getTargetFrameIndex(FI, N->getValueType(0));
687     SDValue Imm0 = CurDAG->getTargetConstant(0, N->getValueType(0));
688
689     if (FI < 128) {
690       NewOpc = SPU::AIr32;
691       Ops[0] = TFI;
692       Ops[1] = Imm0;
693       n_ops = 2;
694     } else {
695       NewOpc = SPU::Ar32;
696       Ops[0] = CurDAG->getRegister(SPU::R1, N->getValueType(0));
697       Ops[1] = SDValue(CurDAG->getMachineNode(SPU::ILAr32, dl,
698                                               N->getValueType(0), TFI, Imm0),
699                        0);
700       n_ops = 2;
701     }
702   } else if (Opc == ISD::Constant && OpVT == MVT::i64) {
703     // Catch the i64 constants that end up here. Note: The backend doesn't
704     // attempt to legalize the constant (it's useless because DAGCombiner
705     // will insert 64-bit constants and we can't stop it).
706     return SelectI64Constant(N, OpVT, N->getDebugLoc());
707   } else if ((Opc == ISD::ZERO_EXTEND || Opc == ISD::ANY_EXTEND)
708              && OpVT == MVT::i64) {
709     SDValue Op0 = N->getOperand(0);
710     EVT Op0VT = Op0.getValueType();
711     EVT Op0VecVT = EVT::getVectorVT(*CurDAG->getContext(),
712                                     Op0VT, (128 / Op0VT.getSizeInBits()));
713     EVT OpVecVT = EVT::getVectorVT(*CurDAG->getContext(), 
714                                    OpVT, (128 / OpVT.getSizeInBits()));
715     SDValue shufMask;
716
717     switch (Op0VT.getSimpleVT().SimpleTy) {
718     default:
719       report_fatal_error("CellSPU Select: Unhandled zero/any extend EVT");
720       /*NOTREACHED*/
721     case MVT::i32:
722       shufMask = CurDAG->getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
723                                  CurDAG->getConstant(0x80808080, MVT::i32),
724                                  CurDAG->getConstant(0x00010203, MVT::i32),
725                                  CurDAG->getConstant(0x80808080, MVT::i32),
726                                  CurDAG->getConstant(0x08090a0b, MVT::i32));
727       break;
728
729     case MVT::i16:
730       shufMask = CurDAG->getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
731                                  CurDAG->getConstant(0x80808080, MVT::i32),
732                                  CurDAG->getConstant(0x80800203, MVT::i32),
733                                  CurDAG->getConstant(0x80808080, MVT::i32),
734                                  CurDAG->getConstant(0x80800a0b, MVT::i32));
735       break;
736
737     case MVT::i8:
738       shufMask = CurDAG->getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
739                                  CurDAG->getConstant(0x80808080, MVT::i32),
740                                  CurDAG->getConstant(0x80808003, MVT::i32),
741                                  CurDAG->getConstant(0x80808080, MVT::i32),
742                                  CurDAG->getConstant(0x8080800b, MVT::i32));
743       break;
744     }
745
746     SDNode *shufMaskLoad = emitBuildVector(shufMask.getNode());
747     
748     HandleSDNode PromoteScalar(CurDAG->getNode(SPUISD::PREFSLOT2VEC, dl,
749                                                Op0VecVT, Op0));
750     
751     SDValue PromScalar;
752     if (SDNode *N = SelectCode(PromoteScalar.getValue().getNode()))
753       PromScalar = SDValue(N, 0);
754     else
755       PromScalar = PromoteScalar.getValue();
756     
757     SDValue zextShuffle =
758             CurDAG->getNode(SPUISD::SHUFB, dl, OpVecVT,
759                             PromScalar, PromScalar, 
760                             SDValue(shufMaskLoad, 0));
761
762     HandleSDNode Dummy2(zextShuffle);
763     if (SDNode *N = SelectCode(Dummy2.getValue().getNode()))
764       zextShuffle = SDValue(N, 0);
765     else
766       zextShuffle = Dummy2.getValue();
767     HandleSDNode Dummy(CurDAG->getNode(SPUISD::VEC2PREFSLOT, dl, OpVT,
768                                        zextShuffle));
769     
770     CurDAG->ReplaceAllUsesWith(N, Dummy.getValue().getNode());
771     SelectCode(Dummy.getValue().getNode());
772     return Dummy.getValue().getNode();
773   } else if (Opc == ISD::ADD && (OpVT == MVT::i64 || OpVT == MVT::v2i64)) {
774     SDNode *CGLoad =
775             emitBuildVector(getCarryGenerateShufMask(*CurDAG, dl).getNode());
776
777     HandleSDNode Dummy(CurDAG->getNode(SPUISD::ADD64_MARKER, dl, OpVT,
778                                        N->getOperand(0), N->getOperand(1),
779                                        SDValue(CGLoad, 0)));
780     
781     CurDAG->ReplaceAllUsesWith(N, Dummy.getValue().getNode());
782     if (SDNode *N = SelectCode(Dummy.getValue().getNode()))
783       return N;
784     return Dummy.getValue().getNode();
785   } else if (Opc == ISD::SUB && (OpVT == MVT::i64 || OpVT == MVT::v2i64)) {
786     SDNode *CGLoad =
787             emitBuildVector(getBorrowGenerateShufMask(*CurDAG, dl).getNode());
788
789     HandleSDNode Dummy(CurDAG->getNode(SPUISD::SUB64_MARKER, dl, OpVT,
790                                        N->getOperand(0), N->getOperand(1),
791                                        SDValue(CGLoad, 0)));
792     
793     CurDAG->ReplaceAllUsesWith(N, Dummy.getValue().getNode());
794     if (SDNode *N = SelectCode(Dummy.getValue().getNode()))
795       return N;
796     return Dummy.getValue().getNode();
797   } else if (Opc == ISD::MUL && (OpVT == MVT::i64 || OpVT == MVT::v2i64)) {
798     SDNode *CGLoad =
799             emitBuildVector(getCarryGenerateShufMask(*CurDAG, dl).getNode());
800
801     HandleSDNode Dummy(CurDAG->getNode(SPUISD::MUL64_MARKER, dl, OpVT,
802                                        N->getOperand(0), N->getOperand(1),
803                                        SDValue(CGLoad, 0)));
804     CurDAG->ReplaceAllUsesWith(N, Dummy.getValue().getNode());
805     if (SDNode *N = SelectCode(Dummy.getValue().getNode()))
806       return N;
807     return Dummy.getValue().getNode();
808   } else if (Opc == ISD::TRUNCATE) {
809     SDValue Op0 = N->getOperand(0);
810     if ((Op0.getOpcode() == ISD::SRA || Op0.getOpcode() == ISD::SRL)
811         && OpVT == MVT::i32
812         && Op0.getValueType() == MVT::i64) {
813       // Catch (truncate:i32 ([sra|srl]:i64 arg, c), where c >= 32
814       //
815       // Take advantage of the fact that the upper 32 bits are in the
816       // i32 preferred slot and avoid shuffle gymnastics:
817       ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Op0.getOperand(1));
818       if (CN != 0) {
819         unsigned shift_amt = unsigned(CN->getZExtValue());
820
821         if (shift_amt >= 32) {
822           SDNode *hi32 =
823                   CurDAG->getMachineNode(SPU::ORr32_r64, dl, OpVT,
824                                          Op0.getOperand(0));
825
826           shift_amt -= 32;
827           if (shift_amt > 0) {
828             // Take care of the additional shift, if present:
829             SDValue shift = CurDAG->getTargetConstant(shift_amt, MVT::i32);
830             unsigned Opc = SPU::ROTMAIr32_i32;
831
832             if (Op0.getOpcode() == ISD::SRL)
833               Opc = SPU::ROTMr32;
834
835             hi32 = CurDAG->getMachineNode(Opc, dl, OpVT, SDValue(hi32, 0),
836                                           shift);
837           }
838
839           return hi32;
840         }
841       }
842     }
843   } else if (Opc == ISD::SHL) {
844     if (OpVT == MVT::i64)
845       return SelectSHLi64(N, OpVT);
846   } else if (Opc == ISD::SRL) {
847     if (OpVT == MVT::i64)
848       return SelectSRLi64(N, OpVT);
849   } else if (Opc == ISD::SRA) {
850     if (OpVT == MVT::i64)
851       return SelectSRAi64(N, OpVT);
852   } else if (Opc == ISD::FNEG
853              && (OpVT == MVT::f64 || OpVT == MVT::v2f64)) {
854     DebugLoc dl = N->getDebugLoc();
855     // Check if the pattern is a special form of DFNMS:
856     // (fneg (fsub (fmul R64FP:$rA, R64FP:$rB), R64FP:$rC))
857     SDValue Op0 = N->getOperand(0);
858     if (Op0.getOpcode() == ISD::FSUB) {
859       SDValue Op00 = Op0.getOperand(0);
860       if (Op00.getOpcode() == ISD::FMUL) {
861         unsigned Opc = SPU::DFNMSf64;
862         if (OpVT == MVT::v2f64)
863           Opc = SPU::DFNMSv2f64;
864
865         return CurDAG->getMachineNode(Opc, dl, OpVT,
866                                       Op00.getOperand(0),
867                                       Op00.getOperand(1),
868                                       Op0.getOperand(1));
869       }
870     }
871
872     SDValue negConst = CurDAG->getConstant(0x8000000000000000ULL, MVT::i64);
873     SDNode *signMask = 0;
874     unsigned Opc = SPU::XORfneg64;
875
876     if (OpVT == MVT::f64) {
877       signMask = SelectI64Constant(negConst.getNode(), MVT::i64, dl);
878     } else if (OpVT == MVT::v2f64) {
879       Opc = SPU::XORfnegvec;
880       signMask = emitBuildVector(CurDAG->getNode(ISD::BUILD_VECTOR, dl,
881                                                  MVT::v2i64,
882                                                  negConst, negConst).getNode());
883     }
884
885     return CurDAG->getMachineNode(Opc, dl, OpVT,
886                                   N->getOperand(0), SDValue(signMask, 0));
887   } else if (Opc == ISD::FABS) {
888     if (OpVT == MVT::f64) {
889       SDNode *signMask = SelectI64Constant(0x7fffffffffffffffULL, MVT::i64, dl);
890       return CurDAG->getMachineNode(SPU::ANDfabs64, dl, OpVT,
891                                     N->getOperand(0), SDValue(signMask, 0));
892     } else if (OpVT == MVT::v2f64) {
893       SDValue absConst = CurDAG->getConstant(0x7fffffffffffffffULL, MVT::i64);
894       SDValue absVec = CurDAG->getNode(ISD::BUILD_VECTOR, dl, MVT::v2i64,
895                                        absConst, absConst);
896       SDNode *signMask = emitBuildVector(absVec.getNode());
897       return CurDAG->getMachineNode(SPU::ANDfabsvec, dl, OpVT,
898                                     N->getOperand(0), SDValue(signMask, 0));
899     }
900   } else if (Opc == SPUISD::LDRESULT) {
901     // Custom select instructions for LDRESULT
902     EVT VT = N->getValueType(0);
903     SDValue Arg = N->getOperand(0);
904     SDValue Chain = N->getOperand(1);
905     SDNode *Result;
906     const valtype_map_s *vtm = getValueTypeMapEntry(VT);
907
908     if (vtm->ldresult_ins == 0) {
909       report_fatal_error("LDRESULT for unsupported type: " +
910                          Twine(VT.getEVTString()));
911     }
912
913     Opc = vtm->ldresult_ins;
914     if (vtm->ldresult_imm) {
915       SDValue Zero = CurDAG->getTargetConstant(0, VT);
916
917       Result = CurDAG->getMachineNode(Opc, dl, VT, MVT::Other, Arg, Zero, Chain);
918     } else {
919       Result = CurDAG->getMachineNode(Opc, dl, VT, MVT::Other, Arg, Arg, Chain);
920     }
921
922     return Result;
923   } else if (Opc == SPUISD::IndirectAddr) {
924     // Look at the operands: SelectCode() will catch the cases that aren't
925     // specifically handled here.
926     //
927     // SPUInstrInfo catches the following patterns:
928     // (SPUindirect (SPUhi ...), (SPUlo ...))
929     // (SPUindirect $sp, imm)
930     EVT VT = N->getValueType(0);
931     SDValue Op0 = N->getOperand(0);
932     SDValue Op1 = N->getOperand(1);
933     RegisterSDNode *RN;
934
935     if ((Op0.getOpcode() != SPUISD::Hi && Op1.getOpcode() != SPUISD::Lo)
936         || (Op0.getOpcode() == ISD::Register
937             && ((RN = dyn_cast<RegisterSDNode>(Op0.getNode())) != 0
938                 && RN->getReg() != SPU::R1))) {
939       NewOpc = SPU::Ar32;
940       Ops[1] = Op1;
941       if (Op1.getOpcode() == ISD::Constant) {
942         ConstantSDNode *CN = cast<ConstantSDNode>(Op1);
943         Op1 = CurDAG->getTargetConstant(CN->getSExtValue(), VT);
944         if (isInt<10>(CN->getSExtValue())) {
945           NewOpc = SPU::AIr32;
946           Ops[1] = Op1;
947         } else {
948           Ops[1] = SDValue(CurDAG->getMachineNode(SPU::ILr32, dl, 
949                                                   N->getValueType(0), 
950                                                   Op1),
951                            0); 
952         }
953       }
954       Ops[0] = Op0;
955       n_ops = 2;
956     }
957   }
958
959   if (n_ops > 0) {
960     if (N->hasOneUse())
961       return CurDAG->SelectNodeTo(N, NewOpc, OpVT, Ops, n_ops);
962     else
963       return CurDAG->getMachineNode(NewOpc, dl, OpVT, Ops, n_ops);
964   } else
965     return SelectCode(N);
966 }
967
968 /*!
969  * Emit the instruction sequence for i64 left shifts. The basic algorithm
970  * is to fill the bottom two word slots with zeros so that zeros are shifted
971  * in as the entire quadword is shifted left.
972  *
973  * \note This code could also be used to implement v2i64 shl.
974  *
975  * @param Op The shl operand
976  * @param OpVT Op's machine value value type (doesn't need to be passed, but
977  * makes life easier.)
978  * @return The SDNode with the entire instruction sequence
979  */
980 SDNode *
981 SPUDAGToDAGISel::SelectSHLi64(SDNode *N, EVT OpVT) {
982   SDValue Op0 = N->getOperand(0);
983   EVT VecVT = EVT::getVectorVT(*CurDAG->getContext(), 
984                                OpVT, (128 / OpVT.getSizeInBits()));
985   SDValue ShiftAmt = N->getOperand(1);
986   EVT ShiftAmtVT = ShiftAmt.getValueType();
987   SDNode *VecOp0, *SelMask, *ZeroFill, *Shift = 0;
988   SDValue SelMaskVal;
989   DebugLoc dl = N->getDebugLoc();
990
991   VecOp0 = CurDAG->getMachineNode(SPU::ORv2i64_i64, dl, VecVT, Op0);
992   SelMaskVal = CurDAG->getTargetConstant(0xff00ULL, MVT::i16);
993   SelMask = CurDAG->getMachineNode(SPU::FSMBIv2i64, dl, VecVT, SelMaskVal);
994   ZeroFill = CurDAG->getMachineNode(SPU::ILv2i64, dl, VecVT,
995                                     CurDAG->getTargetConstant(0, OpVT));
996   VecOp0 = CurDAG->getMachineNode(SPU::SELBv2i64, dl, VecVT,
997                                   SDValue(ZeroFill, 0),
998                                   SDValue(VecOp0, 0),
999                                   SDValue(SelMask, 0));
1000
1001   if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(ShiftAmt)) {
1002     unsigned bytes = unsigned(CN->getZExtValue()) >> 3;
1003     unsigned bits = unsigned(CN->getZExtValue()) & 7;
1004
1005     if (bytes > 0) {
1006       Shift =
1007         CurDAG->getMachineNode(SPU::SHLQBYIv2i64, dl, VecVT,
1008                                SDValue(VecOp0, 0),
1009                                CurDAG->getTargetConstant(bytes, ShiftAmtVT));
1010     }
1011
1012     if (bits > 0) {
1013       Shift =
1014         CurDAG->getMachineNode(SPU::SHLQBIIv2i64, dl, VecVT,
1015                                SDValue((Shift != 0 ? Shift : VecOp0), 0),
1016                                CurDAG->getTargetConstant(bits, ShiftAmtVT));
1017     }
1018   } else {
1019     SDNode *Bytes =
1020       CurDAG->getMachineNode(SPU::ROTMIr32, dl, ShiftAmtVT,
1021                              ShiftAmt,
1022                              CurDAG->getTargetConstant(3, ShiftAmtVT));
1023     SDNode *Bits =
1024       CurDAG->getMachineNode(SPU::ANDIr32, dl, ShiftAmtVT,
1025                              ShiftAmt,
1026                              CurDAG->getTargetConstant(7, ShiftAmtVT));
1027     Shift =
1028       CurDAG->getMachineNode(SPU::SHLQBYv2i64, dl, VecVT,
1029                              SDValue(VecOp0, 0), SDValue(Bytes, 0));
1030     Shift =
1031       CurDAG->getMachineNode(SPU::SHLQBIv2i64, dl, VecVT,
1032                              SDValue(Shift, 0), SDValue(Bits, 0));
1033   }
1034
1035   return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT, SDValue(Shift, 0));
1036 }
1037
1038 /*!
1039  * Emit the instruction sequence for i64 logical right shifts.
1040  *
1041  * @param Op The shl operand
1042  * @param OpVT Op's machine value value type (doesn't need to be passed, but
1043  * makes life easier.)
1044  * @return The SDNode with the entire instruction sequence
1045  */
1046 SDNode *
1047 SPUDAGToDAGISel::SelectSRLi64(SDNode *N, EVT OpVT) {
1048   SDValue Op0 = N->getOperand(0);
1049   EVT VecVT = EVT::getVectorVT(*CurDAG->getContext(),
1050                                OpVT, (128 / OpVT.getSizeInBits()));
1051   SDValue ShiftAmt = N->getOperand(1);
1052   EVT ShiftAmtVT = ShiftAmt.getValueType();
1053   SDNode *VecOp0, *Shift = 0;
1054   DebugLoc dl = N->getDebugLoc();
1055
1056   VecOp0 = CurDAG->getMachineNode(SPU::ORv2i64_i64, dl, VecVT, Op0);
1057
1058   if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(ShiftAmt)) {
1059     unsigned bytes = unsigned(CN->getZExtValue()) >> 3;
1060     unsigned bits = unsigned(CN->getZExtValue()) & 7;
1061
1062     if (bytes > 0) {
1063       Shift =
1064         CurDAG->getMachineNode(SPU::ROTQMBYIv2i64, dl, VecVT,
1065                                SDValue(VecOp0, 0),
1066                                CurDAG->getTargetConstant(bytes, ShiftAmtVT));
1067     }
1068
1069     if (bits > 0) {
1070       Shift =
1071         CurDAG->getMachineNode(SPU::ROTQMBIIv2i64, dl, VecVT,
1072                                SDValue((Shift != 0 ? Shift : VecOp0), 0),
1073                                CurDAG->getTargetConstant(bits, ShiftAmtVT));
1074     }
1075   } else {
1076     SDNode *Bytes =
1077       CurDAG->getMachineNode(SPU::ROTMIr32, dl, ShiftAmtVT,
1078                              ShiftAmt,
1079                              CurDAG->getTargetConstant(3, ShiftAmtVT));
1080     SDNode *Bits =
1081       CurDAG->getMachineNode(SPU::ANDIr32, dl, ShiftAmtVT,
1082                              ShiftAmt,
1083                              CurDAG->getTargetConstant(7, ShiftAmtVT));
1084
1085     // Ensure that the shift amounts are negated!
1086     Bytes = CurDAG->getMachineNode(SPU::SFIr32, dl, ShiftAmtVT,
1087                                    SDValue(Bytes, 0),
1088                                    CurDAG->getTargetConstant(0, ShiftAmtVT));
1089
1090     Bits = CurDAG->getMachineNode(SPU::SFIr32, dl, ShiftAmtVT,
1091                                   SDValue(Bits, 0),
1092                                   CurDAG->getTargetConstant(0, ShiftAmtVT));
1093
1094     Shift =
1095       CurDAG->getMachineNode(SPU::ROTQMBYv2i64, dl, VecVT,
1096                              SDValue(VecOp0, 0), SDValue(Bytes, 0));
1097     Shift =
1098       CurDAG->getMachineNode(SPU::ROTQMBIv2i64, dl, VecVT,
1099                              SDValue(Shift, 0), SDValue(Bits, 0));
1100   }
1101
1102   return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT, SDValue(Shift, 0));
1103 }
1104
1105 /*!
1106  * Emit the instruction sequence for i64 arithmetic right shifts.
1107  *
1108  * @param Op The shl operand
1109  * @param OpVT Op's machine value value type (doesn't need to be passed, but
1110  * makes life easier.)
1111  * @return The SDNode with the entire instruction sequence
1112  */
1113 SDNode *
1114 SPUDAGToDAGISel::SelectSRAi64(SDNode *N, EVT OpVT) {
1115   // Promote Op0 to vector
1116   EVT VecVT = EVT::getVectorVT(*CurDAG->getContext(), 
1117                                OpVT, (128 / OpVT.getSizeInBits()));
1118   SDValue ShiftAmt = N->getOperand(1);
1119   EVT ShiftAmtVT = ShiftAmt.getValueType();
1120   DebugLoc dl = N->getDebugLoc();
1121
1122   SDNode *VecOp0 =
1123     CurDAG->getMachineNode(SPU::ORv2i64_i64, dl, VecVT, N->getOperand(0));
1124
1125   SDValue SignRotAmt = CurDAG->getTargetConstant(31, ShiftAmtVT);
1126   SDNode *SignRot =
1127     CurDAG->getMachineNode(SPU::ROTMAIv2i64_i32, dl, MVT::v2i64,
1128                            SDValue(VecOp0, 0), SignRotAmt);
1129   SDNode *UpperHalfSign =
1130     CurDAG->getMachineNode(SPU::ORi32_v4i32, dl, MVT::i32, SDValue(SignRot, 0));
1131
1132   SDNode *UpperHalfSignMask =
1133     CurDAG->getMachineNode(SPU::FSM64r32, dl, VecVT, SDValue(UpperHalfSign, 0));
1134   SDNode *UpperLowerMask =
1135     CurDAG->getMachineNode(SPU::FSMBIv2i64, dl, VecVT,
1136                            CurDAG->getTargetConstant(0xff00ULL, MVT::i16));
1137   SDNode *UpperLowerSelect =
1138     CurDAG->getMachineNode(SPU::SELBv2i64, dl, VecVT,
1139                            SDValue(UpperHalfSignMask, 0),
1140                            SDValue(VecOp0, 0),
1141                            SDValue(UpperLowerMask, 0));
1142
1143   SDNode *Shift = 0;
1144
1145   if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(ShiftAmt)) {
1146     unsigned bytes = unsigned(CN->getZExtValue()) >> 3;
1147     unsigned bits = unsigned(CN->getZExtValue()) & 7;
1148
1149     if (bytes > 0) {
1150       bytes = 31 - bytes;
1151       Shift =
1152         CurDAG->getMachineNode(SPU::ROTQBYIv2i64, dl, VecVT,
1153                                SDValue(UpperLowerSelect, 0),
1154                                CurDAG->getTargetConstant(bytes, ShiftAmtVT));
1155     }
1156
1157     if (bits > 0) {
1158       bits = 8 - bits;
1159       Shift =
1160         CurDAG->getMachineNode(SPU::ROTQBIIv2i64, dl, VecVT,
1161                                SDValue((Shift != 0 ? Shift : UpperLowerSelect), 0),
1162                                CurDAG->getTargetConstant(bits, ShiftAmtVT));
1163     }
1164   } else {
1165     SDNode *NegShift =
1166       CurDAG->getMachineNode(SPU::SFIr32, dl, ShiftAmtVT,
1167                              ShiftAmt, CurDAG->getTargetConstant(0, ShiftAmtVT));
1168
1169     Shift =
1170       CurDAG->getMachineNode(SPU::ROTQBYBIv2i64_r32, dl, VecVT,
1171                              SDValue(UpperLowerSelect, 0), SDValue(NegShift, 0));
1172     Shift =
1173       CurDAG->getMachineNode(SPU::ROTQBIv2i64, dl, VecVT,
1174                              SDValue(Shift, 0), SDValue(NegShift, 0));
1175   }
1176
1177   return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT, SDValue(Shift, 0));
1178 }
1179
1180 /*!
1181  Do the necessary magic necessary to load a i64 constant
1182  */
1183 SDNode *SPUDAGToDAGISel::SelectI64Constant(SDNode *N, EVT OpVT,
1184                                            DebugLoc dl) {
1185   ConstantSDNode *CN = cast<ConstantSDNode>(N);
1186   return SelectI64Constant(CN->getZExtValue(), OpVT, dl);
1187 }
1188
1189 SDNode *SPUDAGToDAGISel::SelectI64Constant(uint64_t Value64, EVT OpVT,
1190                                            DebugLoc dl) {
1191   EVT OpVecVT = EVT::getVectorVT(*CurDAG->getContext(), OpVT, 2);
1192   SDValue i64vec =
1193           SPU::LowerV2I64Splat(OpVecVT, *CurDAG, Value64, dl);
1194
1195   // Here's where it gets interesting, because we have to parse out the
1196   // subtree handed back in i64vec:
1197
1198   if (i64vec.getOpcode() == ISD::BIT_CONVERT) {
1199     // The degenerate case where the upper and lower bits in the splat are
1200     // identical:
1201     SDValue Op0 = i64vec.getOperand(0);
1202
1203     ReplaceUses(i64vec, Op0);
1204     return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT,
1205                                   SDValue(emitBuildVector(Op0.getNode()), 0));
1206   } else if (i64vec.getOpcode() == SPUISD::SHUFB) {
1207     SDValue lhs = i64vec.getOperand(0);
1208     SDValue rhs = i64vec.getOperand(1);
1209     SDValue shufmask = i64vec.getOperand(2);
1210
1211     if (lhs.getOpcode() == ISD::BIT_CONVERT) {
1212       ReplaceUses(lhs, lhs.getOperand(0));
1213       lhs = lhs.getOperand(0);
1214     }
1215
1216     SDNode *lhsNode = (lhs.getNode()->isMachineOpcode()
1217                        ? lhs.getNode()
1218                        : emitBuildVector(lhs.getNode()));
1219
1220     if (rhs.getOpcode() == ISD::BIT_CONVERT) {
1221       ReplaceUses(rhs, rhs.getOperand(0));
1222       rhs = rhs.getOperand(0);
1223     }
1224
1225     SDNode *rhsNode = (rhs.getNode()->isMachineOpcode()
1226                        ? rhs.getNode()
1227                        : emitBuildVector(rhs.getNode()));
1228
1229     if (shufmask.getOpcode() == ISD::BIT_CONVERT) {
1230       ReplaceUses(shufmask, shufmask.getOperand(0));
1231       shufmask = shufmask.getOperand(0);
1232     }
1233
1234     SDNode *shufMaskNode = (shufmask.getNode()->isMachineOpcode()
1235                             ? shufmask.getNode()
1236                             : emitBuildVector(shufmask.getNode()));
1237
1238    SDValue shufNode =
1239             CurDAG->getNode(SPUISD::SHUFB, dl, OpVecVT,
1240                                    SDValue(lhsNode, 0), SDValue(rhsNode, 0),
1241                                    SDValue(shufMaskNode, 0));
1242     HandleSDNode Dummy(shufNode);
1243     SDNode *SN = SelectCode(Dummy.getValue().getNode());
1244     if (SN == 0) SN = Dummy.getValue().getNode();
1245     
1246     return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT, SDValue(SN, 0));
1247   } else if (i64vec.getOpcode() == ISD::BUILD_VECTOR) {
1248     return CurDAG->getMachineNode(SPU::ORi64_v2i64, dl, OpVT,
1249                                   SDValue(emitBuildVector(i64vec.getNode()), 0));
1250   } else {
1251     report_fatal_error("SPUDAGToDAGISel::SelectI64Constant: Unhandled i64vec"
1252                       "condition");
1253   }
1254 }
1255
1256 /// createSPUISelDag - This pass converts a legalized DAG into a
1257 /// SPU-specific DAG, ready for instruction scheduling.
1258 ///
1259 FunctionPass *llvm::createSPUISelDag(SPUTargetMachine &TM) {
1260   return new SPUDAGToDAGISel(TM);
1261 }