JumpTable support! What this represents is working asm and jit support for
[oota-llvm.git] / lib / Target / Sparc / SparcISelDAGToDAG.cpp
1 //===-- SparcISelDAGToDAG.cpp - A dag to dag inst selector for Sparc ------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines an instruction selector for the SPARC target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "Sparc.h"
15 #include "SparcTargetMachine.h"
16 #include "llvm/DerivedTypes.h"
17 #include "llvm/Function.h"
18 #include "llvm/Intrinsics.h"
19 #include "llvm/CodeGen/MachineFrameInfo.h"
20 #include "llvm/CodeGen/MachineFunction.h"
21 #include "llvm/CodeGen/MachineInstrBuilder.h"
22 #include "llvm/CodeGen/SelectionDAG.h"
23 #include "llvm/CodeGen/SelectionDAGISel.h"
24 #include "llvm/CodeGen/SSARegMap.h"
25 #include "llvm/Target/TargetLowering.h"
26 #include "llvm/Support/Debug.h"
27 #include <iostream>
28 #include <set>
29 using namespace llvm;
30
31 //===----------------------------------------------------------------------===//
32 // TargetLowering Implementation
33 //===----------------------------------------------------------------------===//
34
35 namespace SPISD {
36   enum {
37     FIRST_NUMBER = ISD::BUILTIN_OP_END+SP::INSTRUCTION_LIST_END,
38     CMPICC,      // Compare two GPR operands, set icc.
39     CMPFCC,      // Compare two FP operands, set fcc.
40     BRICC,       // Branch to dest on icc condition
41     BRFCC,       // Branch to dest on fcc condition
42     SELECT_ICC,  // Select between two values using the current ICC flags.
43     SELECT_FCC,  // Select between two values using the current FCC flags.
44     
45     Hi, Lo,      // Hi/Lo operations, typically on a global address.
46     
47     FTOI,        // FP to Int within a FP register.
48     ITOF,        // Int to FP within a FP register.
49
50     CALL,        // A call instruction.
51     RET_FLAG,    // Return with a flag operand.
52   };
53 }
54
55 /// IntCondCCodeToICC - Convert a DAG integer condition code to a SPARC ICC
56 /// condition.
57 static SPCC::CondCodes IntCondCCodeToICC(ISD::CondCode CC) {
58   switch (CC) {
59   default: assert(0 && "Unknown integer condition code!");
60   case ISD::SETEQ:  return SPCC::ICC_E;
61   case ISD::SETNE:  return SPCC::ICC_NE;
62   case ISD::SETLT:  return SPCC::ICC_L;
63   case ISD::SETGT:  return SPCC::ICC_G;
64   case ISD::SETLE:  return SPCC::ICC_LE;
65   case ISD::SETGE:  return SPCC::ICC_GE;
66   case ISD::SETULT: return SPCC::ICC_CS;
67   case ISD::SETULE: return SPCC::ICC_LEU;
68   case ISD::SETUGT: return SPCC::ICC_GU;
69   case ISD::SETUGE: return SPCC::ICC_CC;
70   }
71 }
72
73 /// FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC
74 /// FCC condition.
75 static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) {
76   switch (CC) {
77   default: assert(0 && "Unknown fp condition code!");
78   case ISD::SETEQ:  return SPCC::FCC_E;
79   case ISD::SETNE:  return SPCC::FCC_NE;
80   case ISD::SETLT:  return SPCC::FCC_L;
81   case ISD::SETGT:  return SPCC::FCC_G;
82   case ISD::SETLE:  return SPCC::FCC_LE;
83   case ISD::SETGE:  return SPCC::FCC_GE;
84   case ISD::SETULT: return SPCC::FCC_UL;
85   case ISD::SETULE: return SPCC::FCC_ULE;
86   case ISD::SETUGT: return SPCC::FCC_UG;
87   case ISD::SETUGE: return SPCC::FCC_UGE;
88   case ISD::SETUO:  return SPCC::FCC_U;
89   case ISD::SETO:   return SPCC::FCC_O;
90   case ISD::SETONE: return SPCC::FCC_LG;
91   case ISD::SETUEQ: return SPCC::FCC_UE;
92   }
93 }
94
95 namespace {
96   class SparcTargetLowering : public TargetLowering {
97     int VarArgsFrameOffset;   // Frame offset to start of varargs area.
98   public:
99     SparcTargetLowering(TargetMachine &TM);
100     virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
101     
102     /// computeMaskedBitsForTargetNode - Determine which of the bits specified 
103     /// in Mask are known to be either zero or one and return them in the 
104     /// KnownZero/KnownOne bitsets.
105     virtual void computeMaskedBitsForTargetNode(const SDOperand Op,
106                                                 uint64_t Mask,
107                                                 uint64_t &KnownZero, 
108                                                 uint64_t &KnownOne,
109                                                 unsigned Depth = 0) const;
110     
111     virtual std::vector<SDOperand>
112       LowerArguments(Function &F, SelectionDAG &DAG);
113     virtual std::pair<SDOperand, SDOperand>
114       LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg,
115                   unsigned CC,
116                   bool isTailCall, SDOperand Callee, ArgListTy &Args,
117                   SelectionDAG &DAG);
118     virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI,
119                                                        MachineBasicBlock *MBB);
120     
121     virtual const char *getTargetNodeName(unsigned Opcode) const;
122   };
123 }
124
125 SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
126   : TargetLowering(TM) {
127   
128   // Set up the register classes.
129   addRegisterClass(MVT::i32, SP::IntRegsRegisterClass);
130   addRegisterClass(MVT::f32, SP::FPRegsRegisterClass);
131   addRegisterClass(MVT::f64, SP::DFPRegsRegisterClass);
132
133   // Custom legalize GlobalAddress nodes into LO/HI parts.
134   setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
135   setOperationAction(ISD::ConstantPool , MVT::i32, Custom);
136   
137   // Sparc doesn't have sext_inreg, replace them with shl/sra
138   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand);
139   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8 , Expand);
140   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1 , Expand);
141
142   // Sparc has no REM operation.
143   setOperationAction(ISD::UREM, MVT::i32, Expand);
144   setOperationAction(ISD::SREM, MVT::i32, Expand);
145
146   // Custom expand fp<->sint
147   setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
148   setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom);
149
150   // Expand fp<->uint
151   setOperationAction(ISD::FP_TO_UINT, MVT::i32, Expand);
152   setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
153   
154   setOperationAction(ISD::BIT_CONVERT, MVT::f32, Expand);
155   setOperationAction(ISD::BIT_CONVERT, MVT::i32, Expand);
156   
157   // Turn FP extload into load/fextend
158   setOperationAction(ISD::EXTLOAD, MVT::f32, Expand);
159   
160   // Sparc has no select or setcc: expand to SELECT_CC.
161   setOperationAction(ISD::SELECT, MVT::i32, Expand);
162   setOperationAction(ISD::SELECT, MVT::f32, Expand);
163   setOperationAction(ISD::SELECT, MVT::f64, Expand);
164   setOperationAction(ISD::SETCC, MVT::i32, Expand);
165   setOperationAction(ISD::SETCC, MVT::f32, Expand);
166   setOperationAction(ISD::SETCC, MVT::f64, Expand);
167   
168   // Sparc doesn't have BRCOND either, it has BR_CC.
169   setOperationAction(ISD::BRCOND, MVT::Other, Expand);
170   setOperationAction(ISD::BRIND, MVT::i32, Expand);
171   setOperationAction(ISD::BR_CC, MVT::i32, Custom);
172   setOperationAction(ISD::BR_CC, MVT::f32, Custom);
173   setOperationAction(ISD::BR_CC, MVT::f64, Custom);
174   
175   setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
176   setOperationAction(ISD::SELECT_CC, MVT::f32, Custom);
177   setOperationAction(ISD::SELECT_CC, MVT::f64, Custom);
178   
179   // SPARC has no intrinsics for these particular operations.
180   setOperationAction(ISD::MEMMOVE, MVT::Other, Expand);
181   setOperationAction(ISD::MEMSET, MVT::Other, Expand);
182   setOperationAction(ISD::MEMCPY, MVT::Other, Expand);
183   
184   setOperationAction(ISD::FSIN , MVT::f64, Expand);
185   setOperationAction(ISD::FCOS , MVT::f64, Expand);
186   setOperationAction(ISD::FSIN , MVT::f32, Expand);
187   setOperationAction(ISD::FCOS , MVT::f32, Expand);
188   setOperationAction(ISD::CTPOP, MVT::i32, Expand);
189   setOperationAction(ISD::CTTZ , MVT::i32, Expand);
190   setOperationAction(ISD::CTLZ , MVT::i32, Expand);
191   setOperationAction(ISD::ROTL , MVT::i32, Expand);
192   setOperationAction(ISD::ROTR , MVT::i32, Expand);
193   setOperationAction(ISD::BSWAP, MVT::i32, Expand);
194   setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
195   setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand);
196
197   setOperationAction(ISD::SHL_PARTS, MVT::i32, Expand);
198   setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand);
199   setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand);
200
201   // We don't have line number support yet.
202   setOperationAction(ISD::LOCATION, MVT::Other, Expand);
203   setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
204   setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
205
206   // RET must be custom lowered, to meet ABI requirements
207   setOperationAction(ISD::RET               , MVT::Other, Custom);
208   
209   // VASTART needs to be custom lowered to use the VarArgsFrameIndex.
210   setOperationAction(ISD::VASTART           , MVT::Other, Custom);
211   // VAARG needs to be lowered to not do unaligned accesses for doubles.
212   setOperationAction(ISD::VAARG             , MVT::Other, Custom);
213   
214   // Use the default implementation.
215   setOperationAction(ISD::VACOPY            , MVT::Other, Expand);
216   setOperationAction(ISD::VAEND             , MVT::Other, Expand);
217   setOperationAction(ISD::STACKSAVE         , MVT::Other, Expand); 
218   setOperationAction(ISD::STACKRESTORE      , MVT::Other, Expand);
219   setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32  , Custom);
220
221   setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
222   setOperationAction(ISD::ConstantFP, MVT::f32, Expand);
223   
224   setStackPointerRegisterToSaveRestore(SP::O6);
225
226   if (TM.getSubtarget<SparcSubtarget>().isV9()) {
227     setOperationAction(ISD::CTPOP, MVT::i32, Legal);
228   }
229   
230   computeRegisterProperties();
231 }
232
233 const char *SparcTargetLowering::getTargetNodeName(unsigned Opcode) const {
234   switch (Opcode) {
235   default: return 0;
236   case SPISD::CMPICC:     return "SPISD::CMPICC";
237   case SPISD::CMPFCC:     return "SPISD::CMPFCC";
238   case SPISD::BRICC:      return "SPISD::BRICC";
239   case SPISD::BRFCC:      return "SPISD::BRFCC";
240   case SPISD::SELECT_ICC: return "SPISD::SELECT_ICC";
241   case SPISD::SELECT_FCC: return "SPISD::SELECT_FCC";
242   case SPISD::Hi:         return "SPISD::Hi";
243   case SPISD::Lo:         return "SPISD::Lo";
244   case SPISD::FTOI:       return "SPISD::FTOI";
245   case SPISD::ITOF:       return "SPISD::ITOF";
246   case SPISD::CALL:       return "SPISD::CALL";
247   case SPISD::RET_FLAG:   return "SPISD::RET_FLAG";
248   }
249 }
250
251 /// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
252 /// be zero. Op is expected to be a target specific node. Used by DAG
253 /// combiner.
254 void SparcTargetLowering::computeMaskedBitsForTargetNode(const SDOperand Op,
255                                                          uint64_t Mask,
256                                                          uint64_t &KnownZero, 
257                                                          uint64_t &KnownOne,
258                                                          unsigned Depth) const {
259   uint64_t KnownZero2, KnownOne2;
260   KnownZero = KnownOne = 0;   // Don't know anything.
261   
262   switch (Op.getOpcode()) {
263   default: break;
264   case SPISD::SELECT_ICC:
265   case SPISD::SELECT_FCC:
266     ComputeMaskedBits(Op.getOperand(1), Mask, KnownZero, KnownOne, Depth+1);
267     ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero2, KnownOne2, Depth+1);
268     assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); 
269     assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?"); 
270     
271     // Only known if known in both the LHS and RHS.
272     KnownOne &= KnownOne2;
273     KnownZero &= KnownZero2;
274     break;
275   }
276 }
277
278 /// LowerArguments - V8 uses a very simple ABI, where all values are passed in
279 /// either one or two GPRs, including FP values.  TODO: we should pass FP values
280 /// in FP registers for fastcc functions.
281 std::vector<SDOperand>
282 SparcTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
283   MachineFunction &MF = DAG.getMachineFunction();
284   SSARegMap *RegMap = MF.getSSARegMap();
285   std::vector<SDOperand> ArgValues;
286   
287   static const unsigned ArgRegs[] = {
288     SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5
289   };
290   
291   const unsigned *CurArgReg = ArgRegs, *ArgRegEnd = ArgRegs+6;
292   unsigned ArgOffset = 68;
293   
294   SDOperand Root = DAG.getRoot();
295   std::vector<SDOperand> OutChains;
296
297   for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
298     MVT::ValueType ObjectVT = getValueType(I->getType());
299     
300     switch (ObjectVT) {
301     default: assert(0 && "Unhandled argument type!");
302     case MVT::i1:
303     case MVT::i8:
304     case MVT::i16:
305     case MVT::i32:
306       if (I->use_empty()) {                // Argument is dead.
307         if (CurArgReg < ArgRegEnd) ++CurArgReg;
308         ArgValues.push_back(DAG.getNode(ISD::UNDEF, ObjectVT));
309       } else if (CurArgReg < ArgRegEnd) {  // Lives in an incoming GPR
310         unsigned VReg = RegMap->createVirtualRegister(&SP::IntRegsRegClass);
311         MF.addLiveIn(*CurArgReg++, VReg);
312         SDOperand Arg = DAG.getCopyFromReg(Root, VReg, MVT::i32);
313         if (ObjectVT != MVT::i32) {
314           unsigned AssertOp = I->getType()->isSigned() ? ISD::AssertSext 
315                                                        : ISD::AssertZext;
316           Arg = DAG.getNode(AssertOp, MVT::i32, Arg, 
317                             DAG.getValueType(ObjectVT));
318           Arg = DAG.getNode(ISD::TRUNCATE, ObjectVT, Arg);
319         }
320         ArgValues.push_back(Arg);
321       } else {
322         int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset);
323         SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
324         SDOperand Load;
325         if (ObjectVT == MVT::i32) {
326           Load = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0));
327         } else {
328           unsigned LoadOp =
329             I->getType()->isSigned() ? ISD::SEXTLOAD : ISD::ZEXTLOAD;
330
331           // Sparc is big endian, so add an offset based on the ObjectVT.
332           unsigned Offset = 4-std::max(1U, MVT::getSizeInBits(ObjectVT)/8);
333           FIPtr = DAG.getNode(ISD::ADD, MVT::i32, FIPtr,
334                               DAG.getConstant(Offset, MVT::i32));
335           Load = DAG.getExtLoad(LoadOp, MVT::i32, Root, FIPtr,
336                                 DAG.getSrcValue(0), ObjectVT);
337           Load = DAG.getNode(ISD::TRUNCATE, ObjectVT, Load);
338         }
339         ArgValues.push_back(Load);
340       }
341       
342       ArgOffset += 4;
343       break;
344     case MVT::f32:
345       if (I->use_empty()) {                // Argument is dead.
346         if (CurArgReg < ArgRegEnd) ++CurArgReg;
347         ArgValues.push_back(DAG.getNode(ISD::UNDEF, ObjectVT));
348       } else if (CurArgReg < ArgRegEnd) {  // Lives in an incoming GPR
349         // FP value is passed in an integer register.
350         unsigned VReg = RegMap->createVirtualRegister(&SP::IntRegsRegClass);
351         MF.addLiveIn(*CurArgReg++, VReg);
352         SDOperand Arg = DAG.getCopyFromReg(Root, VReg, MVT::i32);
353
354         Arg = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Arg);
355         ArgValues.push_back(Arg);
356       } else {
357         int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset);
358         SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
359         SDOperand Load = DAG.getLoad(MVT::f32, Root, FIPtr, DAG.getSrcValue(0));
360         ArgValues.push_back(Load);
361       }
362       ArgOffset += 4;
363       break;
364
365     case MVT::i64:
366     case MVT::f64:
367       if (I->use_empty()) {                // Argument is dead.
368         if (CurArgReg < ArgRegEnd) ++CurArgReg;
369         if (CurArgReg < ArgRegEnd) ++CurArgReg;
370         ArgValues.push_back(DAG.getNode(ISD::UNDEF, ObjectVT));
371       } else if (/* FIXME: Apparently this isn't safe?? */
372                  0 && CurArgReg == ArgRegEnd && ObjectVT == MVT::f64 &&
373                  ((CurArgReg-ArgRegs) & 1) == 0) {
374         // If this is a double argument and the whole thing lives on the stack,
375         // and the argument is aligned, load the double straight from the stack.
376         // We can't do a load in cases like void foo([6ints], int,double),
377         // because the double wouldn't be aligned!
378         int FrameIdx = MF.getFrameInfo()->CreateFixedObject(8, ArgOffset);
379         SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
380         ArgValues.push_back(DAG.getLoad(MVT::f64, Root, FIPtr, 
381                                         DAG.getSrcValue(0)));
382       } else {
383         SDOperand HiVal;
384         if (CurArgReg < ArgRegEnd) {  // Lives in an incoming GPR
385           unsigned VRegHi = RegMap->createVirtualRegister(&SP::IntRegsRegClass);
386           MF.addLiveIn(*CurArgReg++, VRegHi);
387           HiVal = DAG.getCopyFromReg(Root, VRegHi, MVT::i32);
388         } else {
389           int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset);
390           SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
391           HiVal = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0));
392         }
393         
394         SDOperand LoVal;
395         if (CurArgReg < ArgRegEnd) {  // Lives in an incoming GPR
396           unsigned VRegLo = RegMap->createVirtualRegister(&SP::IntRegsRegClass);
397           MF.addLiveIn(*CurArgReg++, VRegLo);
398           LoVal = DAG.getCopyFromReg(Root, VRegLo, MVT::i32);
399         } else {
400           int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset+4);
401           SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
402           LoVal = DAG.getLoad(MVT::i32, Root, FIPtr, DAG.getSrcValue(0));
403         }
404         
405         // Compose the two halves together into an i64 unit.
406         SDOperand WholeValue = 
407           DAG.getNode(ISD::BUILD_PAIR, MVT::i64, LoVal, HiVal);
408         
409         // If we want a double, do a bit convert.
410         if (ObjectVT == MVT::f64)
411           WholeValue = DAG.getNode(ISD::BIT_CONVERT, MVT::f64, WholeValue);
412         
413         ArgValues.push_back(WholeValue);
414       }
415       ArgOffset += 8;
416       break;
417     }
418   }
419   
420   // Store remaining ArgRegs to the stack if this is a varargs function.
421   if (F.getFunctionType()->isVarArg()) {
422     // Remember the vararg offset for the va_start implementation.
423     VarArgsFrameOffset = ArgOffset;
424     
425     for (; CurArgReg != ArgRegEnd; ++CurArgReg) {
426       unsigned VReg = RegMap->createVirtualRegister(&SP::IntRegsRegClass);
427       MF.addLiveIn(*CurArgReg, VReg);
428       SDOperand Arg = DAG.getCopyFromReg(DAG.getRoot(), VReg, MVT::i32);
429
430       int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset);
431       SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
432
433       OutChains.push_back(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(),
434                                       Arg, FIPtr, DAG.getSrcValue(0)));
435       ArgOffset += 4;
436     }
437   }
438   
439   if (!OutChains.empty())
440     DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, OutChains));
441   
442   // Finally, inform the code generator which regs we return values in.
443   switch (getValueType(F.getReturnType())) {
444   default: assert(0 && "Unknown type!");
445   case MVT::isVoid: break;
446   case MVT::i1:
447   case MVT::i8:
448   case MVT::i16:
449   case MVT::i32:
450     MF.addLiveOut(SP::I0);
451     break;
452   case MVT::i64:
453     MF.addLiveOut(SP::I0);
454     MF.addLiveOut(SP::I1);
455     break;
456   case MVT::f32:
457     MF.addLiveOut(SP::F0);
458     break;
459   case MVT::f64:
460     MF.addLiveOut(SP::D0);
461     break;
462   }
463   
464   return ArgValues;
465 }
466
467 std::pair<SDOperand, SDOperand>
468 SparcTargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
469                                  bool isVarArg, unsigned CC,
470                                  bool isTailCall, SDOperand Callee, 
471                                  ArgListTy &Args, SelectionDAG &DAG) {
472   MachineFunction &MF = DAG.getMachineFunction();
473   // Count the size of the outgoing arguments.
474   unsigned ArgsSize = 0;
475   for (unsigned i = 0, e = Args.size(); i != e; ++i) {
476     switch (getValueType(Args[i].second)) {
477     default: assert(0 && "Unknown value type!");
478     case MVT::i1:
479     case MVT::i8:
480     case MVT::i16:
481     case MVT::i32:
482     case MVT::f32:
483       ArgsSize += 4;
484       break;
485     case MVT::i64:
486     case MVT::f64:
487       ArgsSize += 8;
488       break;
489     }
490   }
491   if (ArgsSize > 4*6)
492     ArgsSize -= 4*6;    // Space for first 6 arguments is prereserved.
493   else
494     ArgsSize = 0;
495
496   // Keep stack frames 8-byte aligned.
497   ArgsSize = (ArgsSize+7) & ~7;
498
499   Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(ArgsSize, getPointerTy()));
500   
501   SDOperand StackPtr, NullSV;
502   std::vector<SDOperand> Stores;
503   std::vector<SDOperand> RegValuesToPass;
504   unsigned ArgOffset = 68;
505   for (unsigned i = 0, e = Args.size(); i != e; ++i) {
506     SDOperand Val = Args[i].first;
507     MVT::ValueType ObjectVT = Val.getValueType();
508     SDOperand ValToStore(0, 0);
509     unsigned ObjSize;
510     switch (ObjectVT) {
511     default: assert(0 && "Unhandled argument type!");
512     case MVT::i1:
513     case MVT::i8:
514     case MVT::i16:
515       // Promote the integer to 32-bits.  If the input type is signed, use a
516       // sign extend, otherwise use a zero extend.
517       if (Args[i].second->isSigned())
518         Val = DAG.getNode(ISD::SIGN_EXTEND, MVT::i32, Val);
519       else
520         Val = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Val);
521       // FALL THROUGH
522     case MVT::i32:
523       ObjSize = 4;
524
525       if (RegValuesToPass.size() >= 6) {
526         ValToStore = Val;
527       } else {
528         RegValuesToPass.push_back(Val);
529       }
530       break;
531     case MVT::f32:
532       ObjSize = 4;
533       if (RegValuesToPass.size() >= 6) {
534         ValToStore = Val;
535       } else {
536         // Convert this to a FP value in an int reg.
537         Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Val);
538         RegValuesToPass.push_back(Val);
539       }
540       break;
541     case MVT::f64:
542       ObjSize = 8;
543       // If we can store this directly into the outgoing slot, do so.  We can
544       // do this when all ArgRegs are used and if the outgoing slot is aligned.
545       // FIXME: McGill/misr fails with this.
546       if (0 && RegValuesToPass.size() >= 6 && ((ArgOffset-68) & 7) == 0) {
547         ValToStore = Val;
548         break;
549       }
550       
551       // Otherwise, convert this to a FP value in int regs.
552       Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i64, Val);
553       // FALL THROUGH
554     case MVT::i64:
555       ObjSize = 8;
556       if (RegValuesToPass.size() >= 6) {
557         ValToStore = Val;    // Whole thing is passed in memory.
558         break;
559       }
560       
561       // Split the value into top and bottom part.  Top part goes in a reg.
562       SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Val, 
563                                  DAG.getConstant(1, MVT::i32));
564       SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Val,
565                                  DAG.getConstant(0, MVT::i32));
566       RegValuesToPass.push_back(Hi);
567       
568       if (RegValuesToPass.size() >= 6) {
569         ValToStore = Lo;
570         ArgOffset += 4;
571         ObjSize = 4;
572       } else {
573         RegValuesToPass.push_back(Lo);
574       }
575       break;
576     }
577     
578     if (ValToStore.Val) {
579       if (!StackPtr.Val) {
580         StackPtr = DAG.getRegister(SP::O6, MVT::i32);
581         NullSV = DAG.getSrcValue(NULL);
582       }
583       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
584       PtrOff = DAG.getNode(ISD::ADD, MVT::i32, StackPtr, PtrOff);
585       Stores.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain,
586                                    ValToStore, PtrOff, NullSV));
587     }
588     ArgOffset += ObjSize;
589   }
590   
591   // Emit all stores, make sure the occur before any copies into physregs.
592   if (!Stores.empty())
593     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, Stores);
594   
595   static const unsigned ArgRegs[] = {
596     SP::O0, SP::O1, SP::O2, SP::O3, SP::O4, SP::O5
597   };
598   
599   // Build a sequence of copy-to-reg nodes chained together with token chain
600   // and flag operands which copy the outgoing args into O[0-5].
601   SDOperand InFlag;
602   for (unsigned i = 0, e = RegValuesToPass.size(); i != e; ++i) {
603     Chain = DAG.getCopyToReg(Chain, ArgRegs[i], RegValuesToPass[i], InFlag);
604     InFlag = Chain.getValue(1);
605   }
606
607   // If the callee is a GlobalAddress node (quite common, every direct call is)
608   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
609   // Likewise ExternalSymbol -> TargetExternalSymbol.
610   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
611     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), MVT::i32);
612   else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee))
613     Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32);
614
615   std::vector<MVT::ValueType> NodeTys;
616   NodeTys.push_back(MVT::Other);   // Returns a chain
617   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
618   std::vector<SDOperand> Ops;
619   Ops.push_back(Chain);
620   Ops.push_back(Callee);
621   if (InFlag.Val)
622     Ops.push_back(InFlag);
623   Chain = DAG.getNode(SPISD::CALL, NodeTys, Ops);
624   InFlag = Chain.getValue(1);
625   
626   MVT::ValueType RetTyVT = getValueType(RetTy);
627   SDOperand RetVal;
628   if (RetTyVT != MVT::isVoid) {
629     switch (RetTyVT) {
630     default: assert(0 && "Unknown value type to return!");
631     case MVT::i1:
632     case MVT::i8:
633     case MVT::i16:
634       RetVal = DAG.getCopyFromReg(Chain, SP::O0, MVT::i32, InFlag);
635       Chain = RetVal.getValue(1);
636       
637       // Add a note to keep track of whether it is sign or zero extended.
638       RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext,
639                            MVT::i32, RetVal, DAG.getValueType(RetTyVT));
640       RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal);
641       break;
642     case MVT::i32:
643       RetVal = DAG.getCopyFromReg(Chain, SP::O0, MVT::i32, InFlag);
644       Chain = RetVal.getValue(1);
645       break;
646     case MVT::f32:
647       RetVal = DAG.getCopyFromReg(Chain, SP::F0, MVT::f32, InFlag);
648       Chain = RetVal.getValue(1);
649       break;
650     case MVT::f64:
651       RetVal = DAG.getCopyFromReg(Chain, SP::D0, MVT::f64, InFlag);
652       Chain = RetVal.getValue(1);
653       break;
654     case MVT::i64:
655       SDOperand Lo = DAG.getCopyFromReg(Chain, SP::O1, MVT::i32, InFlag);
656       SDOperand Hi = DAG.getCopyFromReg(Lo.getValue(1), SP::O0, MVT::i32, 
657                                         Lo.getValue(2));
658       RetVal = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, Lo, Hi);
659       Chain = Hi.getValue(1);
660       break;
661     }
662   }
663   
664   Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
665                       DAG.getConstant(ArgsSize, getPointerTy()));
666   
667   return std::make_pair(RetVal, Chain);
668 }
669
670 // Look at LHS/RHS/CC and see if they are a lowered setcc instruction.  If so
671 // set LHS/RHS and SPCC to the LHS/RHS of the setcc and SPCC to the condition.
672 static void LookThroughSetCC(SDOperand &LHS, SDOperand &RHS,
673                              ISD::CondCode CC, unsigned &SPCC) {
674   if (isa<ConstantSDNode>(RHS) && cast<ConstantSDNode>(RHS)->getValue() == 0 &&
675       CC == ISD::SETNE && 
676       ((LHS.getOpcode() == SPISD::SELECT_ICC &&
677         LHS.getOperand(3).getOpcode() == SPISD::CMPICC) ||
678        (LHS.getOpcode() == SPISD::SELECT_FCC &&
679         LHS.getOperand(3).getOpcode() == SPISD::CMPFCC)) &&
680       isa<ConstantSDNode>(LHS.getOperand(0)) &&
681       isa<ConstantSDNode>(LHS.getOperand(1)) &&
682       cast<ConstantSDNode>(LHS.getOperand(0))->getValue() == 1 &&
683       cast<ConstantSDNode>(LHS.getOperand(1))->getValue() == 0) {
684     SDOperand CMPCC = LHS.getOperand(3);
685     SPCC = cast<ConstantSDNode>(LHS.getOperand(2))->getValue();
686     LHS = CMPCC.getOperand(0);
687     RHS = CMPCC.getOperand(1);
688   }
689 }
690
691
692 SDOperand SparcTargetLowering::
693 LowerOperation(SDOperand Op, SelectionDAG &DAG) {
694   switch (Op.getOpcode()) {
695   default: assert(0 && "Should not custom lower this!");
696   case ISD::GlobalAddress: {
697     GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
698     SDOperand GA = DAG.getTargetGlobalAddress(GV, MVT::i32);
699     SDOperand Hi = DAG.getNode(SPISD::Hi, MVT::i32, GA);
700     SDOperand Lo = DAG.getNode(SPISD::Lo, MVT::i32, GA);
701     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
702   }
703   case ISD::ConstantPool: {
704     Constant *C = cast<ConstantPoolSDNode>(Op)->get();
705     SDOperand CP = DAG.getTargetConstantPool(C, MVT::i32,
706                                   cast<ConstantPoolSDNode>(Op)->getAlignment());
707     SDOperand Hi = DAG.getNode(SPISD::Hi, MVT::i32, CP);
708     SDOperand Lo = DAG.getNode(SPISD::Lo, MVT::i32, CP);
709     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
710   }
711   case ISD::FP_TO_SINT:
712     // Convert the fp value to integer in an FP register.
713     assert(Op.getValueType() == MVT::i32);
714     Op = DAG.getNode(SPISD::FTOI, MVT::f32, Op.getOperand(0));
715     return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Op);
716   case ISD::SINT_TO_FP: {
717     assert(Op.getOperand(0).getValueType() == MVT::i32);
718     SDOperand Tmp = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Op.getOperand(0));
719     // Convert the int value to FP in an FP register.
720     return DAG.getNode(SPISD::ITOF, Op.getValueType(), Tmp);
721   }
722   case ISD::BR_CC: {
723     SDOperand Chain = Op.getOperand(0);
724     ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
725     SDOperand LHS = Op.getOperand(2);
726     SDOperand RHS = Op.getOperand(3);
727     SDOperand Dest = Op.getOperand(4);
728     unsigned Opc, SPCC = ~0U;
729     
730     // If this is a br_cc of a "setcc", and if the setcc got lowered into
731     // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
732     LookThroughSetCC(LHS, RHS, CC, SPCC);
733     
734     // Get the condition flag.
735     SDOperand CompareFlag;
736     if (LHS.getValueType() == MVT::i32) {
737       std::vector<MVT::ValueType> VTs;
738       VTs.push_back(MVT::i32);
739       VTs.push_back(MVT::Flag);
740       std::vector<SDOperand> Ops;
741       Ops.push_back(LHS);
742       Ops.push_back(RHS);
743       CompareFlag = DAG.getNode(SPISD::CMPICC, VTs, Ops).getValue(1);
744       if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
745       Opc = SPISD::BRICC;
746     } else {
747       CompareFlag = DAG.getNode(SPISD::CMPFCC, MVT::Flag, LHS, RHS);
748       if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
749       Opc = SPISD::BRFCC;
750     }
751     return DAG.getNode(Opc, MVT::Other, Chain, Dest,
752                        DAG.getConstant(SPCC, MVT::i32), CompareFlag);
753   }
754   case ISD::SELECT_CC: {
755     SDOperand LHS = Op.getOperand(0);
756     SDOperand RHS = Op.getOperand(1);
757     ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
758     SDOperand TrueVal = Op.getOperand(2);
759     SDOperand FalseVal = Op.getOperand(3);
760     unsigned Opc, SPCC = ~0U;
761
762     // If this is a select_cc of a "setcc", and if the setcc got lowered into
763     // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
764     LookThroughSetCC(LHS, RHS, CC, SPCC);
765     
766     SDOperand CompareFlag;
767     if (LHS.getValueType() == MVT::i32) {
768       std::vector<MVT::ValueType> VTs;
769       VTs.push_back(LHS.getValueType());   // subcc returns a value
770       VTs.push_back(MVT::Flag);
771       std::vector<SDOperand> Ops;
772       Ops.push_back(LHS);
773       Ops.push_back(RHS);
774       CompareFlag = DAG.getNode(SPISD::CMPICC, VTs, Ops).getValue(1);
775       Opc = SPISD::SELECT_ICC;
776       if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
777     } else {
778       CompareFlag = DAG.getNode(SPISD::CMPFCC, MVT::Flag, LHS, RHS);
779       Opc = SPISD::SELECT_FCC;
780       if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
781     }
782     return DAG.getNode(Opc, TrueVal.getValueType(), TrueVal, FalseVal, 
783                        DAG.getConstant(SPCC, MVT::i32), CompareFlag);
784   }
785   case ISD::VASTART: {
786     // vastart just stores the address of the VarArgsFrameIndex slot into the
787     // memory location argument.
788     SDOperand Offset = DAG.getNode(ISD::ADD, MVT::i32,
789                                    DAG.getRegister(SP::I6, MVT::i32),
790                                 DAG.getConstant(VarArgsFrameOffset, MVT::i32));
791     return DAG.getNode(ISD::STORE, MVT::Other, Op.getOperand(0), Offset, 
792                        Op.getOperand(1), Op.getOperand(2));
793   }
794   case ISD::VAARG: {
795     SDNode *Node = Op.Val;
796     MVT::ValueType VT = Node->getValueType(0);
797     SDOperand InChain = Node->getOperand(0);
798     SDOperand VAListPtr = Node->getOperand(1);
799     SDOperand VAList = DAG.getLoad(getPointerTy(), InChain, VAListPtr,
800                                    Node->getOperand(2));
801     // Increment the pointer, VAList, to the next vaarg
802     SDOperand NextPtr = DAG.getNode(ISD::ADD, getPointerTy(), VAList, 
803                                     DAG.getConstant(MVT::getSizeInBits(VT)/8, 
804                                                     getPointerTy()));
805     // Store the incremented VAList to the legalized pointer
806     InChain = DAG.getNode(ISD::STORE, MVT::Other, VAList.getValue(1), NextPtr,
807                           VAListPtr, Node->getOperand(2));
808     // Load the actual argument out of the pointer VAList, unless this is an
809     // f64 load.
810     if (VT != MVT::f64) {
811       return DAG.getLoad(VT, InChain, VAList, DAG.getSrcValue(0));
812     } else {
813       // Otherwise, load it as i64, then do a bitconvert.
814       SDOperand V = DAG.getLoad(MVT::i64, InChain, VAList, DAG.getSrcValue(0));
815       std::vector<MVT::ValueType> Tys;
816       Tys.push_back(MVT::f64);
817       Tys.push_back(MVT::Other);
818       std::vector<SDOperand> Ops;
819       // Bit-Convert the value to f64.
820       Ops.push_back(DAG.getNode(ISD::BIT_CONVERT, MVT::f64, V));
821       Ops.push_back(V.getValue(1));
822       return DAG.getNode(ISD::MERGE_VALUES, Tys, Ops);
823     }
824   }
825   case ISD::DYNAMIC_STACKALLOC: {
826     SDOperand Chain = Op.getOperand(0);  // Legalize the chain.
827     SDOperand Size  = Op.getOperand(1);  // Legalize the size.
828     
829     unsigned SPReg = SP::O6;
830     SDOperand SP = DAG.getCopyFromReg(Chain, SPReg, MVT::i32);
831     SDOperand NewSP = DAG.getNode(ISD::SUB, MVT::i32, SP, Size);    // Value
832     Chain = DAG.getCopyToReg(SP.getValue(1), SPReg, NewSP);      // Output chain
833
834     // The resultant pointer is actually 16 words from the bottom of the stack,
835     // to provide a register spill area.
836     SDOperand NewVal = DAG.getNode(ISD::ADD, MVT::i32, NewSP,
837                                    DAG.getConstant(96, MVT::i32));
838     std::vector<MVT::ValueType> Tys;
839     Tys.push_back(MVT::i32);
840     Tys.push_back(MVT::Other);
841     std::vector<SDOperand> Ops;
842     Ops.push_back(NewVal);
843     Ops.push_back(Chain);
844     return DAG.getNode(ISD::MERGE_VALUES, Tys, Ops);
845   }
846   case ISD::RET: {
847     SDOperand Copy;
848     
849     switch(Op.getNumOperands()) {
850     default:
851       assert(0 && "Do not know how to return this many arguments!");
852       abort();
853     case 1: 
854       return SDOperand(); // ret void is legal
855     case 2: {
856       unsigned ArgReg;
857       switch(Op.getOperand(1).getValueType()) {
858       default: assert(0 && "Unknown type to return!");
859       case MVT::i32: ArgReg = SP::I0; break;
860       case MVT::f32: ArgReg = SP::F0; break;
861       case MVT::f64: ArgReg = SP::D0; break;
862       }
863       Copy = DAG.getCopyToReg(Op.getOperand(0), ArgReg, Op.getOperand(1),
864                               SDOperand());
865       break;
866     }
867     case 3:
868       Copy = DAG.getCopyToReg(Op.getOperand(0), SP::I0, Op.getOperand(2), 
869                               SDOperand());
870       Copy = DAG.getCopyToReg(Copy, SP::I1, Op.getOperand(1), Copy.getValue(1));
871       break;
872     }
873     return DAG.getNode(SPISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1));
874   }
875   }
876 }
877
878 MachineBasicBlock *
879 SparcTargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI,
880                                              MachineBasicBlock *BB) {
881   unsigned BROpcode;
882   unsigned CC;
883   // Figure out the conditional branch opcode to use for this select_cc.
884   switch (MI->getOpcode()) {
885   default: assert(0 && "Unknown SELECT_CC!");
886   case SP::SELECT_CC_Int_ICC:
887   case SP::SELECT_CC_FP_ICC:
888   case SP::SELECT_CC_DFP_ICC:
889     BROpcode = SP::BCOND;
890     break;
891   case SP::SELECT_CC_Int_FCC:
892   case SP::SELECT_CC_FP_FCC:
893   case SP::SELECT_CC_DFP_FCC:
894     BROpcode = SP::FBCOND;
895     break;
896   }
897
898   CC = (SPCC::CondCodes)MI->getOperand(3).getImmedValue();
899   
900   // To "insert" a SELECT_CC instruction, we actually have to insert the diamond
901   // control-flow pattern.  The incoming instruction knows the destination vreg
902   // to set, the condition code register to branch on, the true/false values to
903   // select between, and a branch opcode to use.
904   const BasicBlock *LLVM_BB = BB->getBasicBlock();
905   ilist<MachineBasicBlock>::iterator It = BB;
906   ++It;
907   
908   //  thisMBB:
909   //  ...
910   //   TrueVal = ...
911   //   [f]bCC copy1MBB
912   //   fallthrough --> copy0MBB
913   MachineBasicBlock *thisMBB = BB;
914   MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
915   MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
916   BuildMI(BB, BROpcode, 2).addMBB(sinkMBB).addImm(CC);
917   MachineFunction *F = BB->getParent();
918   F->getBasicBlockList().insert(It, copy0MBB);
919   F->getBasicBlockList().insert(It, sinkMBB);
920   // Update machine-CFG edges by first adding all successors of the current
921   // block to the new block which will contain the Phi node for the select.
922   for(MachineBasicBlock::succ_iterator i = BB->succ_begin(), 
923       e = BB->succ_end(); i != e; ++i)
924     sinkMBB->addSuccessor(*i);
925   // Next, remove all successors of the current block, and add the true
926   // and fallthrough blocks as its successors.
927   while(!BB->succ_empty())
928     BB->removeSuccessor(BB->succ_begin());
929   BB->addSuccessor(copy0MBB);
930   BB->addSuccessor(sinkMBB);
931   
932   //  copy0MBB:
933   //   %FalseValue = ...
934   //   # fallthrough to sinkMBB
935   BB = copy0MBB;
936   
937   // Update machine-CFG edges
938   BB->addSuccessor(sinkMBB);
939   
940   //  sinkMBB:
941   //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
942   //  ...
943   BB = sinkMBB;
944   BuildMI(BB, SP::PHI, 4, MI->getOperand(0).getReg())
945     .addReg(MI->getOperand(2).getReg()).addMBB(copy0MBB)
946     .addReg(MI->getOperand(1).getReg()).addMBB(thisMBB);
947   
948   delete MI;   // The pseudo instruction is gone now.
949   return BB;
950 }
951   
952 //===----------------------------------------------------------------------===//
953 // Instruction Selector Implementation
954 //===----------------------------------------------------------------------===//
955
956 //===--------------------------------------------------------------------===//
957 /// SparcDAGToDAGISel - SPARC specific code to select SPARC machine
958 /// instructions for SelectionDAG operations.
959 ///
960 namespace {
961 class SparcDAGToDAGISel : public SelectionDAGISel {
962   SparcTargetLowering Lowering;
963
964   /// Subtarget - Keep a pointer to the Sparc Subtarget around so that we can
965   /// make the right decision when generating code for different targets.
966   const SparcSubtarget &Subtarget;
967 public:
968   SparcDAGToDAGISel(TargetMachine &TM)
969     : SelectionDAGISel(Lowering), Lowering(TM),
970       Subtarget(TM.getSubtarget<SparcSubtarget>()) {
971   }
972
973   void Select(SDOperand &Result, SDOperand Op);
974
975   // Complex Pattern Selectors.
976   bool SelectADDRrr(SDOperand N, SDOperand &R1, SDOperand &R2);
977   bool SelectADDRri(SDOperand N, SDOperand &Base, SDOperand &Offset);
978   
979   /// InstructionSelectBasicBlock - This callback is invoked by
980   /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
981   virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
982   
983   virtual const char *getPassName() const {
984     return "SPARC DAG->DAG Pattern Instruction Selection";
985   } 
986   
987   // Include the pieces autogenerated from the target description.
988 #include "SparcGenDAGISel.inc"
989 };
990 }  // end anonymous namespace
991
992 /// InstructionSelectBasicBlock - This callback is invoked by
993 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
994 void SparcDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
995   DEBUG(BB->dump());
996   
997   // Select target instructions for the DAG.
998   DAG.setRoot(SelectRoot(DAG.getRoot()));
999   CodeGenMap.clear();
1000   DAG.RemoveDeadNodes();
1001   
1002   // Emit machine code to BB. 
1003   ScheduleAndEmitDAG(DAG);
1004 }
1005
1006 bool SparcDAGToDAGISel::SelectADDRri(SDOperand Addr, SDOperand &Base,
1007                                      SDOperand &Offset) {
1008   if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
1009     Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
1010     Offset = CurDAG->getTargetConstant(0, MVT::i32);
1011     return true;
1012   }
1013   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
1014       Addr.getOpcode() == ISD::TargetGlobalAddress)
1015     return false;  // direct calls.
1016   
1017   if (Addr.getOpcode() == ISD::ADD) {
1018     if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
1019       if (Predicate_simm13(CN)) {
1020         if (FrameIndexSDNode *FIN = 
1021                 dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) {
1022           // Constant offset from frame ref.
1023           Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
1024         } else {
1025           Base = Addr.getOperand(0);
1026         }
1027         Offset = CurDAG->getTargetConstant(CN->getValue(), MVT::i32);
1028         return true;
1029       }
1030     }
1031     if (Addr.getOperand(0).getOpcode() == SPISD::Lo) {
1032       Base = Addr.getOperand(1);
1033       Offset = Addr.getOperand(0).getOperand(0);
1034       return true;
1035     }
1036     if (Addr.getOperand(1).getOpcode() == SPISD::Lo) {
1037       Base = Addr.getOperand(0);
1038       Offset = Addr.getOperand(1).getOperand(0);
1039       return true;
1040     }
1041   }
1042   Base = Addr;
1043   Offset = CurDAG->getTargetConstant(0, MVT::i32);
1044   return true;
1045 }
1046
1047 bool SparcDAGToDAGISel::SelectADDRrr(SDOperand Addr, SDOperand &R1, 
1048                                      SDOperand &R2) {
1049   if (Addr.getOpcode() == ISD::FrameIndex) return false;
1050   if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
1051       Addr.getOpcode() == ISD::TargetGlobalAddress)
1052     return false;  // direct calls.
1053   
1054   if (Addr.getOpcode() == ISD::ADD) {
1055     if (isa<ConstantSDNode>(Addr.getOperand(1)) &&
1056         Predicate_simm13(Addr.getOperand(1).Val))
1057       return false;  // Let the reg+imm pattern catch this!
1058     if (Addr.getOperand(0).getOpcode() == SPISD::Lo ||
1059         Addr.getOperand(1).getOpcode() == SPISD::Lo)
1060       return false;  // Let the reg+imm pattern catch this!
1061     R1 = Addr.getOperand(0);
1062     R2 = Addr.getOperand(1);
1063     return true;
1064   }
1065
1066   R1 = Addr;
1067   R2 = CurDAG->getRegister(SP::G0, MVT::i32);
1068   return true;
1069 }
1070
1071 void SparcDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) {
1072   SDNode *N = Op.Val;
1073   if (N->getOpcode() >= ISD::BUILTIN_OP_END &&
1074       N->getOpcode() < SPISD::FIRST_NUMBER) {
1075     Result = Op;
1076     return;   // Already selected.
1077   }
1078
1079                  // If this has already been converted, use it.
1080   std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(Op);
1081   if (CGMI != CodeGenMap.end()) {
1082     Result = CGMI->second;
1083     return;
1084   }
1085   
1086   switch (N->getOpcode()) {
1087   default: break;
1088   case ISD::SDIV:
1089   case ISD::UDIV: {
1090     // FIXME: should use a custom expander to expose the SRA to the dag.
1091     SDOperand DivLHS, DivRHS;
1092     Select(DivLHS, N->getOperand(0));
1093     Select(DivRHS, N->getOperand(1));
1094     
1095     // Set the Y register to the high-part.
1096     SDOperand TopPart;
1097     if (N->getOpcode() == ISD::SDIV) {
1098       TopPart = SDOperand(CurDAG->getTargetNode(SP::SRAri, MVT::i32, DivLHS,
1099                                    CurDAG->getTargetConstant(31, MVT::i32)), 0);
1100     } else {
1101       TopPart = CurDAG->getRegister(SP::G0, MVT::i32);
1102     }
1103     TopPart = SDOperand(CurDAG->getTargetNode(SP::WRYrr, MVT::Flag, TopPart,
1104                                      CurDAG->getRegister(SP::G0, MVT::i32)), 0);
1105
1106     // FIXME: Handle div by immediate.
1107     unsigned Opcode = N->getOpcode() == ISD::SDIV ? SP::SDIVrr : SP::UDIVrr;
1108     Result = CurDAG->SelectNodeTo(N, Opcode, MVT::i32, DivLHS, DivRHS, TopPart);
1109     return;
1110   }    
1111   case ISD::MULHU:
1112   case ISD::MULHS: {
1113     // FIXME: Handle mul by immediate.
1114     SDOperand MulLHS, MulRHS;
1115     Select(MulLHS, N->getOperand(0));
1116     Select(MulRHS, N->getOperand(1));
1117     unsigned Opcode = N->getOpcode() == ISD::MULHU ? SP::UMULrr : SP::SMULrr;
1118     SDNode *Mul = CurDAG->getTargetNode(Opcode, MVT::i32, MVT::Flag,
1119                                         MulLHS, MulRHS);
1120     // The high part is in the Y register.
1121     Result = CurDAG->SelectNodeTo(N, SP::RDY, MVT::i32, SDOperand(Mul, 1));
1122     return;
1123   }
1124   }
1125   
1126   SelectCode(Result, Op);
1127 }
1128
1129
1130 /// createSparcISelDag - This pass converts a legalized DAG into a 
1131 /// SPARC-specific DAG, ready for instruction scheduling.
1132 ///
1133 FunctionPass *llvm::createSparcISelDag(TargetMachine &TM) {
1134   return new SparcDAGToDAGISel(TM);
1135 }