fix some fp condition codes
[oota-llvm.git] / lib / Target / ARM / ARMISelDAGToDAG.cpp
1 //===-- ARMISelDAGToDAG.cpp - A dag to dag inst selector for ARM ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file 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 ARM target.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "ARM.h"
15 #include "ARMTargetMachine.h"
16 #include "llvm/CallingConv.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Function.h"
19 #include "llvm/Constants.h"
20 #include "llvm/Intrinsics.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/SelectionDAG.h"
25 #include "llvm/CodeGen/SelectionDAGISel.h"
26 #include "llvm/CodeGen/SSARegMap.h"
27 #include "llvm/Target/TargetLowering.h"
28 #include "llvm/Support/Debug.h"
29 #include <iostream>
30 #include <vector>
31 using namespace llvm;
32
33 namespace {
34   class ARMTargetLowering : public TargetLowering {
35     int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
36   public:
37     ARMTargetLowering(TargetMachine &TM);
38     virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
39     virtual const char *getTargetNodeName(unsigned Opcode) const;
40   };
41
42 }
43
44 ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
45   : TargetLowering(TM) {
46   addRegisterClass(MVT::i32, ARM::IntRegsRegisterClass);
47   addRegisterClass(MVT::f32, ARM::FPRegsRegisterClass);
48   addRegisterClass(MVT::f64, ARM::DFPRegsRegisterClass);
49
50   setLoadXAction(ISD::EXTLOAD, MVT::f32, Expand);
51
52   setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom);
53   setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom);
54
55   setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom);
56   setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom);
57
58   setOperationAction(ISD::RET,           MVT::Other, Custom);
59   setOperationAction(ISD::GlobalAddress, MVT::i32,   Custom);
60   setOperationAction(ISD::ConstantPool,  MVT::i32,   Custom);
61
62   setOperationAction(ISD::SELECT, MVT::i32, Expand);
63
64   setOperationAction(ISD::SETCC, MVT::i32, Expand);
65   setOperationAction(ISD::SETCC, MVT::f32, Expand);
66   setOperationAction(ISD::SETCC, MVT::f64, Expand);
67
68   setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);
69   setOperationAction(ISD::BR_CC, MVT::i32, Custom);
70   setOperationAction(ISD::BR_CC, MVT::f32, Custom);
71   setOperationAction(ISD::BR_CC, MVT::f64, Custom);
72
73   setOperationAction(ISD::VASTART,       MVT::Other, Custom);
74   setOperationAction(ISD::VAEND,         MVT::Other, Expand);
75
76   setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
77   setOperationAction(ISD::ConstantFP, MVT::f32, Expand);
78
79   setSchedulingPreference(SchedulingForRegPressure);
80   computeRegisterProperties();
81 }
82
83 namespace llvm {
84   namespace ARMISD {
85     enum NodeType {
86       // Start the numbering where the builting ops and target ops leave off.
87       FIRST_NUMBER = ISD::BUILTIN_OP_END+ARM::INSTRUCTION_LIST_END,
88       /// CALL - A direct function call.
89       CALL,
90
91       /// Return with a flag operand.
92       RET_FLAG,
93
94       CMP,
95
96       SELECT,
97
98       BR,
99
100       FSITOS,
101       FTOSIS,
102
103       FSITOD,
104       FTOSID,
105
106       FUITOS,
107       FTOUIS,
108
109       FUITOD,
110       FTOUID,
111
112       FMRRD,
113
114       FMDRR,
115
116       FMSTAT
117     };
118   }
119 }
120
121 /// DAGFPCCToARMCC - Convert a DAG fp condition code to an ARM CC
122 // Unordered = !N & !Z & C & V = V
123 // Ordered   =  N | Z | !C | !V = N | Z | !V
124 static ARMCC::CondCodes DAGFPCCToARMCC(ISD::CondCode CC) {
125   switch (CC) {
126   default:
127     assert(0 && "Unknown fp condition code!");
128 // SETOEQ = (N | Z | !V) & Z = Z                               = EQ
129   case ISD::SETEQ:
130   case ISD::SETOEQ: return ARMCC::EQ;
131 // SETOGT = (N | Z | !V) & !N & !Z = !V &!N &!Z = (N = V) & !Z = GT
132   case ISD::SETGT:
133   case ISD::SETOGT: return ARMCC::GT;
134 // SETOGE = (N | Z | !V) & !N = (Z | !V) & !N = !V & !N        = GE
135   case ISD::SETGE:
136   case ISD::SETOGE: return ARMCC::GE;
137 // SETOLT = (N | Z | !V) & N = N                               = MI
138   case ISD::SETLT:
139   case ISD::SETOLT: return ARMCC::MI;
140 // SETOLE = (N | Z | !V) & (N | Z) = N | Z = !C | Z            = LS
141   case ISD::SETLE:
142   case ISD::SETOLE: return ARMCC::LS;
143 // SETONE = (N | Z | !V) & !Z = (N | !V) & Z = !V & Z = Z      = NE
144   case ISD::SETNE:
145   case ISD::SETONE: return ARMCC::NE;
146 // SETO   = N | Z | !V = Z | !V = !V                           = VC
147   case ISD::SETO:   return ARMCC::VC;
148 // SETUO  = V                                                  = VS
149   case ISD::SETUO:  return ARMCC::VS;
150 // SETUEQ = V | Z                                              = ??
151 // SETUGT = V | (!Z & !N) = !Z & !N = !Z & C                   = HI
152   case ISD::SETUGT: return ARMCC::HI;
153 // SETUGE = V | !N = !N                                        = PL
154   case ISD::SETUGE: return ARMCC::PL;
155 // SETULT = V | N                                              = ??
156 // SETULE = V | Z | N                                          = ??
157 // SETUNE = V | !Z = !Z                                        = NE
158   case ISD::SETUNE: return ARMCC::NE;
159   }
160 }
161
162 /// DAGIntCCToARMCC - Convert a DAG integer condition code to an ARM CC
163 static ARMCC::CondCodes DAGIntCCToARMCC(ISD::CondCode CC) {
164   switch (CC) {
165   default:
166     assert(0 && "Unknown integer condition code!");
167   case ISD::SETEQ:  return ARMCC::EQ;
168   case ISD::SETNE:  return ARMCC::NE;
169   case ISD::SETLT:  return ARMCC::LT;
170   case ISD::SETLE:  return ARMCC::LE;
171   case ISD::SETGT:  return ARMCC::GT;
172   case ISD::SETGE:  return ARMCC::GE;
173   case ISD::SETULT: return ARMCC::CC;
174   case ISD::SETULE: return ARMCC::LS;
175   case ISD::SETUGT: return ARMCC::HI;
176   case ISD::SETUGE: return ARMCC::CS;
177   }
178 }
179
180 const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
181   switch (Opcode) {
182   default: return 0;
183   case ARMISD::CALL:          return "ARMISD::CALL";
184   case ARMISD::RET_FLAG:      return "ARMISD::RET_FLAG";
185   case ARMISD::SELECT:        return "ARMISD::SELECT";
186   case ARMISD::CMP:           return "ARMISD::CMP";
187   case ARMISD::BR:            return "ARMISD::BR";
188   case ARMISD::FSITOS:        return "ARMISD::FSITOS";
189   case ARMISD::FTOSIS:        return "ARMISD::FTOSIS";
190   case ARMISD::FSITOD:        return "ARMISD::FSITOD";
191   case ARMISD::FTOSID:        return "ARMISD::FTOSID";
192   case ARMISD::FUITOS:        return "ARMISD::FUITOS";
193   case ARMISD::FTOUIS:        return "ARMISD::FTOUIS";
194   case ARMISD::FUITOD:        return "ARMISD::FUITOD";
195   case ARMISD::FTOUID:        return "ARMISD::FTOUID";
196   case ARMISD::FMRRD:         return "ARMISD::FMRRD";
197   case ARMISD::FMDRR:         return "ARMISD::FMDRR";
198   case ARMISD::FMSTAT:        return "ARMISD::FMSTAT";
199   }
200 }
201
202 class ArgumentLayout {
203   std::vector<bool>           is_reg;
204   std::vector<unsigned>       pos;
205   std::vector<MVT::ValueType> types;
206 public:
207   ArgumentLayout(const std::vector<MVT::ValueType> &Types) {
208     types = Types;
209
210     unsigned      RegNum = 0;
211     unsigned StackOffset = 0;
212     for(std::vector<MVT::ValueType>::const_iterator I = Types.begin();
213         I != Types.end();
214         ++I) {
215       MVT::ValueType VT = *I;
216       assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64);
217       unsigned     size = MVT::getSizeInBits(VT)/32;
218
219       RegNum = ((RegNum + size - 1) / size) * size;
220       if (RegNum < 4) {
221         pos.push_back(RegNum);
222         is_reg.push_back(true);
223         RegNum += size;
224       } else {
225         unsigned bytes = size * 32/8;
226         StackOffset = ((StackOffset + bytes - 1) / bytes) * bytes;
227         pos.push_back(StackOffset);
228         is_reg.push_back(false);
229         StackOffset += bytes;
230       }
231     }
232   }
233   unsigned getRegisterNum(unsigned argNum) {
234     assert(isRegister(argNum));
235     return pos[argNum];
236   }
237   unsigned getOffset(unsigned argNum) {
238     assert(isOffset(argNum));
239     return pos[argNum];
240   }
241   unsigned isRegister(unsigned argNum) {
242     assert(argNum < is_reg.size());
243     return is_reg[argNum];
244   }
245   unsigned isOffset(unsigned argNum) {
246     return !isRegister(argNum);
247   }
248   MVT::ValueType getType(unsigned argNum) {
249     assert(argNum < types.size());
250     return types[argNum];
251   }
252   unsigned getStackSize(void) {
253     int last = is_reg.size() - 1;
254     if (last < 0)
255       return 0;
256     if (isRegister(last))
257       return 0;
258     return getOffset(last) + MVT::getSizeInBits(getType(last))/8;
259   }
260   int lastRegArg(void) {
261     int size = is_reg.size();
262     int last = 0;
263     while(last < size && isRegister(last))
264       last++;
265     last--;
266     return last;
267   }
268   int lastRegNum(void) {
269     int            l = lastRegArg();
270     if (l < 0)
271       return -1;
272     unsigned       r = getRegisterNum(l);
273     MVT::ValueType t = getType(l);
274     assert(t == MVT::i32 || t == MVT::f32 || t == MVT::f64);
275     if (t == MVT::f64)
276       return r + 1;
277     return r;
278   }
279 };
280
281 // This transforms a ISD::CALL node into a
282 // callseq_star <- ARMISD:CALL <- callseq_end
283 // chain
284 static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG) {
285   SDOperand Chain    = Op.getOperand(0);
286   unsigned CallConv  = cast<ConstantSDNode>(Op.getOperand(1))->getValue();
287   assert(CallConv == CallingConv::C && "unknown calling convention");
288   bool isVarArg      = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
289   bool isTailCall    = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0;
290   SDOperand Callee   = Op.getOperand(4);
291   unsigned NumOps    = (Op.getNumOperands() - 5) / 2;
292   SDOperand StackPtr = DAG.getRegister(ARM::R13, MVT::i32);
293   static const unsigned regs[] = {
294     ARM::R0, ARM::R1, ARM::R2, ARM::R3
295   };
296
297   std::vector<MVT::ValueType> Types;
298   for (unsigned i = 0; i < NumOps; ++i) {
299     MVT::ValueType VT = Op.getOperand(5+2*i).getValueType();
300     Types.push_back(VT);
301   }
302   ArgumentLayout Layout(Types);
303
304   unsigned NumBytes = Layout.getStackSize();
305
306   Chain = DAG.getCALLSEQ_START(Chain,
307                                DAG.getConstant(NumBytes, MVT::i32));
308
309   //Build a sequence of stores
310   std::vector<SDOperand> MemOpChains;
311   for (unsigned i = Layout.lastRegArg() + 1; i < NumOps; ++i) {
312     SDOperand      Arg = Op.getOperand(5+2*i);
313     unsigned ArgOffset = Layout.getOffset(i);
314     SDOperand   PtrOff = DAG.getConstant(ArgOffset, StackPtr.getValueType());
315     PtrOff             = DAG.getNode(ISD::ADD, MVT::i32, StackPtr, PtrOff);
316     MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
317   }
318   if (!MemOpChains.empty())
319     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
320                         &MemOpChains[0], MemOpChains.size());
321
322   // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
323   // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
324   // node so that legalize doesn't hack it.
325   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
326     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), Callee.getValueType());
327
328   // If this is a direct call, pass the chain and the callee.
329   assert (Callee.Val);
330   std::vector<SDOperand> Ops;
331   Ops.push_back(Chain);
332   Ops.push_back(Callee);
333
334   // Build a sequence of copy-to-reg nodes chained together with token chain
335   // and flag operands which copy the outgoing args into the appropriate regs.
336   SDOperand InFlag;
337   for (int i = 0, e = Layout.lastRegArg(); i <= e; ++i) {
338     SDOperand     Arg = Op.getOperand(5+2*i);
339     unsigned   RegNum = Layout.getRegisterNum(i);
340     unsigned     Reg1 = regs[RegNum];
341     MVT::ValueType VT = Layout.getType(i);
342     assert(VT == Arg.getValueType());
343     assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64);
344
345     // Add argument register to the end of the list so that it is known live
346     // into the call.
347     Ops.push_back(DAG.getRegister(Reg1, MVT::i32));
348     if (VT == MVT::f64) {
349       unsigned    Reg2 = regs[RegNum + 1];
350       SDOperand SDReg1 = DAG.getRegister(Reg1, MVT::i32);
351       SDOperand SDReg2 = DAG.getRegister(Reg2, MVT::i32);
352
353       Ops.push_back(DAG.getRegister(Reg2, MVT::i32));
354       SDVTList    VTs = DAG.getVTList(MVT::Other, MVT::Flag);
355       SDOperand Ops[] = {Chain, SDReg1, SDReg2, Arg, InFlag};
356       Chain = DAG.getNode(ARMISD::FMRRD, VTs, Ops, InFlag.Val ? 5 : 4);
357     } else {
358       if (VT == MVT::f32)
359         Arg = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Arg);
360       Chain = DAG.getCopyToReg(Chain, Reg1, Arg, InFlag);
361     }
362     InFlag = Chain.getValue(1);
363   }
364
365   std::vector<MVT::ValueType> NodeTys;
366   NodeTys.push_back(MVT::Other);   // Returns a chain
367   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
368
369   unsigned CallOpc = ARMISD::CALL;
370   if (InFlag.Val)
371     Ops.push_back(InFlag);
372   Chain = DAG.getNode(CallOpc, NodeTys, &Ops[0], Ops.size());
373   InFlag = Chain.getValue(1);
374
375   std::vector<SDOperand> ResultVals;
376   NodeTys.clear();
377
378   // If the call has results, copy the values out of the ret val registers.
379   MVT::ValueType VT = Op.Val->getValueType(0);
380   if (VT != MVT::Other) {
381     assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64);
382
383     SDOperand Value1 = DAG.getCopyFromReg(Chain, ARM::R0, MVT::i32, InFlag);
384     Chain            = Value1.getValue(1);
385     InFlag           = Value1.getValue(2);
386     NodeTys.push_back(VT);
387     if (VT == MVT::i32) {
388       ResultVals.push_back(Value1);
389       if (Op.Val->getValueType(1) == MVT::i32) {
390         SDOperand Value2 = DAG.getCopyFromReg(Chain, ARM::R1, MVT::i32, InFlag);
391         Chain            = Value2.getValue(1);
392         ResultVals.push_back(Value2);
393         NodeTys.push_back(VT);
394       }
395     }
396     if (VT == MVT::f32) {
397       SDOperand Value = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Value1);
398       ResultVals.push_back(Value);
399     }
400     if (VT == MVT::f64) {
401       SDOperand Value2 = DAG.getCopyFromReg(Chain, ARM::R1, MVT::i32, InFlag);
402       Chain            = Value2.getValue(1);
403       SDOperand Value  = DAG.getNode(ARMISD::FMDRR, MVT::f64, Value1, Value2);
404       ResultVals.push_back(Value);
405     }
406   }
407
408   Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
409                       DAG.getConstant(NumBytes, MVT::i32));
410   NodeTys.push_back(MVT::Other);
411
412   if (ResultVals.empty())
413     return Chain;
414
415   ResultVals.push_back(Chain);
416   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys, &ResultVals[0],
417                               ResultVals.size());
418   return Res.getValue(Op.ResNo);
419 }
420
421 static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) {
422   SDOperand Copy;
423   SDOperand Chain = Op.getOperand(0);
424   SDOperand    R0 = DAG.getRegister(ARM::R0, MVT::i32);
425   SDOperand    R1 = DAG.getRegister(ARM::R1, MVT::i32);
426
427   switch(Op.getNumOperands()) {
428   default:
429     assert(0 && "Do not know how to return this many arguments!");
430     abort();
431   case 1: {
432     SDOperand LR = DAG.getRegister(ARM::R14, MVT::i32);
433     return DAG.getNode(ARMISD::RET_FLAG, MVT::Other, Chain);
434   }
435   case 3: {
436     SDOperand Val = Op.getOperand(1);
437     assert(Val.getValueType() == MVT::i32 ||
438            Val.getValueType() == MVT::f32 ||
439            Val.getValueType() == MVT::f64);
440
441     if (Val.getValueType() == MVT::f64) {
442       SDVTList    VTs = DAG.getVTList(MVT::Other, MVT::Flag);
443       SDOperand Ops[] = {Chain, R0, R1, Val};
444       Copy  = DAG.getNode(ARMISD::FMRRD, VTs, Ops, 4);
445     } else {
446       if (Val.getValueType() == MVT::f32)
447         Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Val);
448       Copy = DAG.getCopyToReg(Chain, R0, Val, SDOperand());
449     }
450
451     if (DAG.getMachineFunction().liveout_empty()) {
452       DAG.getMachineFunction().addLiveOut(ARM::R0);
453       if (Val.getValueType() == MVT::f64)
454         DAG.getMachineFunction().addLiveOut(ARM::R1);
455     }
456     break;
457   }
458   case 5:
459     Copy = DAG.getCopyToReg(Chain, ARM::R1, Op.getOperand(3), SDOperand());
460     Copy = DAG.getCopyToReg(Copy, ARM::R0, Op.getOperand(1), Copy.getValue(1));
461     // If we haven't noted the R0+R1 are live out, do so now.
462     if (DAG.getMachineFunction().liveout_empty()) {
463       DAG.getMachineFunction().addLiveOut(ARM::R0);
464       DAG.getMachineFunction().addLiveOut(ARM::R1);
465     }
466     break;
467   }
468
469   //We must use RET_FLAG instead of BRIND because BRIND doesn't have a flag
470   return DAG.getNode(ARMISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1));
471 }
472
473 static SDOperand LowerConstantPool(SDOperand Op, SelectionDAG &DAG) {
474   MVT::ValueType PtrVT = Op.getValueType();
475   ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
476   Constant *C = CP->getConstVal();
477   SDOperand CPI = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment());
478
479   return CPI;
480 }
481
482 static SDOperand LowerGlobalAddress(SDOperand Op,
483                                     SelectionDAG &DAG) {
484   GlobalValue  *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
485   int alignment = 2;
486   SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, alignment);
487   return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr, NULL, 0);
488 }
489
490 static SDOperand LowerVASTART(SDOperand Op, SelectionDAG &DAG,
491                               unsigned VarArgsFrameIndex) {
492   // vastart just stores the address of the VarArgsFrameIndex slot into the
493   // memory location argument.
494   MVT::ValueType PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
495   SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
496   SrcValueSDNode *SV = cast<SrcValueSDNode>(Op.getOperand(2));
497   return DAG.getStore(Op.getOperand(0), FR, Op.getOperand(1), SV->getValue(),
498                       SV->getOffset());
499 }
500
501 static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG,
502                                        int &VarArgsFrameIndex) {
503   MachineFunction   &MF = DAG.getMachineFunction();
504   MachineFrameInfo *MFI = MF.getFrameInfo();
505   SSARegMap     *RegMap = MF.getSSARegMap();
506   unsigned      NumArgs = Op.Val->getNumValues()-1;
507   SDOperand        Root = Op.getOperand(0);
508   bool         isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
509   static const unsigned REGS[] = {
510     ARM::R0, ARM::R1, ARM::R2, ARM::R3
511   };
512
513   std::vector<MVT::ValueType> Types(Op.Val->value_begin(), Op.Val->value_end() - 1);
514   ArgumentLayout Layout(Types);
515
516   std::vector<SDOperand> ArgValues;
517   for (unsigned ArgNo = 0; ArgNo < NumArgs; ++ArgNo) {
518     MVT::ValueType VT = Types[ArgNo];
519
520     SDOperand Value;
521     if (Layout.isRegister(ArgNo)) {
522       assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64);
523       unsigned  RegNum = Layout.getRegisterNum(ArgNo);
524       unsigned    Reg1 = REGS[RegNum];
525       unsigned   VReg1 = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
526       SDOperand Value1 = DAG.getCopyFromReg(Root, VReg1, MVT::i32);
527       MF.addLiveIn(Reg1, VReg1);
528       if (VT == MVT::f64) {
529         unsigned    Reg2 = REGS[RegNum + 1];
530         unsigned   VReg2 = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
531         SDOperand Value2 = DAG.getCopyFromReg(Root, VReg2, MVT::i32);
532         MF.addLiveIn(Reg2, VReg2);
533         Value            = DAG.getNode(ARMISD::FMDRR, MVT::f64, Value1, Value2);
534       } else {
535         Value = Value1;
536         if (VT == MVT::f32)
537           Value = DAG.getNode(ISD::BIT_CONVERT, VT, Value);
538       }
539     } else {
540       // If the argument is actually used, emit a load from the right stack
541       // slot.
542       if (!Op.Val->hasNUsesOfValue(0, ArgNo)) {
543         unsigned Offset = Layout.getOffset(ArgNo);
544         unsigned   Size = MVT::getSizeInBits(VT)/8;
545         int          FI = MFI->CreateFixedObject(Size, Offset);
546         SDOperand   FIN = DAG.getFrameIndex(FI, VT);
547         Value = DAG.getLoad(VT, Root, FIN, NULL, 0);
548       } else {
549         Value = DAG.getNode(ISD::UNDEF, VT);
550       }
551     }
552     ArgValues.push_back(Value);
553   }
554
555   unsigned NextRegNum = Layout.lastRegNum() + 1;
556
557   if (isVarArg) {
558     //If this function is vararg we must store the remaing
559     //registers so that they can be acessed with va_start
560     VarArgsFrameIndex = MFI->CreateFixedObject(MVT::getSizeInBits(MVT::i32)/8,
561                                                -16 + NextRegNum * 4);
562
563     SmallVector<SDOperand, 4> MemOps;
564     for (unsigned RegNo = NextRegNum; RegNo < 4; ++RegNo) {
565       int RegOffset = - (4 - RegNo) * 4;
566       int FI = MFI->CreateFixedObject(MVT::getSizeInBits(MVT::i32)/8,
567                                       RegOffset);
568       SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32);
569
570       unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
571       MF.addLiveIn(REGS[RegNo], VReg);
572
573       SDOperand Val = DAG.getCopyFromReg(Root, VReg, MVT::i32);
574       SDOperand Store = DAG.getStore(Val.getValue(1), Val, FIN, NULL, 0);
575       MemOps.push_back(Store);
576     }
577     Root = DAG.getNode(ISD::TokenFactor, MVT::Other,&MemOps[0],MemOps.size());
578   }
579
580   ArgValues.push_back(Root);
581
582   // Return the new list of results.
583   std::vector<MVT::ValueType> RetVT(Op.Val->value_begin(),
584                                     Op.Val->value_end());
585   return DAG.getNode(ISD::MERGE_VALUES, RetVT, &ArgValues[0], ArgValues.size());
586 }
587
588 static SDOperand GetCMP(ISD::CondCode CC, SDOperand LHS, SDOperand RHS,
589                         SelectionDAG &DAG) {
590   MVT::ValueType vt = LHS.getValueType();
591   assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64);
592
593   SDOperand Cmp = DAG.getNode(ARMISD::CMP,  MVT::Flag, LHS, RHS);
594
595   if (vt != MVT::i32)
596     Cmp = DAG.getNode(ARMISD::FMSTAT, MVT::Flag, Cmp);
597   return Cmp;
598 }
599
600 static SDOperand GetARMCC(ISD::CondCode CC, MVT::ValueType vt,
601                           SelectionDAG &DAG) {
602   assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64);
603   if (vt == MVT::i32)
604     return DAG.getConstant(DAGIntCCToARMCC(CC), MVT::i32);
605   else
606     return DAG.getConstant(DAGFPCCToARMCC(CC), MVT::i32);
607 }
608
609 static SDOperand LowerSELECT_CC(SDOperand Op, SelectionDAG &DAG) {
610   SDOperand LHS = Op.getOperand(0);
611   SDOperand RHS = Op.getOperand(1);
612   ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
613   SDOperand TrueVal = Op.getOperand(2);
614   SDOperand FalseVal = Op.getOperand(3);
615   SDOperand      Cmp = GetCMP(CC, LHS, RHS, DAG);
616   SDOperand    ARMCC = GetARMCC(CC, LHS.getValueType(), DAG);
617   return DAG.getNode(ARMISD::SELECT, MVT::i32, TrueVal, FalseVal, ARMCC, Cmp);
618 }
619
620 static SDOperand LowerBR_CC(SDOperand Op, SelectionDAG &DAG) {
621   SDOperand  Chain = Op.getOperand(0);
622   ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
623   SDOperand    LHS = Op.getOperand(2);
624   SDOperand    RHS = Op.getOperand(3);
625   SDOperand   Dest = Op.getOperand(4);
626   SDOperand    Cmp = GetCMP(CC, LHS, RHS, DAG);
627   SDOperand  ARMCC = GetARMCC(CC, LHS.getValueType(), DAG);
628   return DAG.getNode(ARMISD::BR, MVT::Other, Chain, Dest, ARMCC, Cmp);
629 }
630
631 static SDOperand LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) {
632   SDOperand IntVal  = Op.getOperand(0);
633   assert(IntVal.getValueType() == MVT::i32);
634   MVT::ValueType vt = Op.getValueType();
635   assert(vt == MVT::f32 ||
636          vt == MVT::f64);
637
638   SDOperand Tmp = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, IntVal);
639   ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FSITOS : ARMISD::FSITOD;
640   return DAG.getNode(op, vt, Tmp);
641 }
642
643 static SDOperand LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
644   assert(Op.getValueType() == MVT::i32);
645   SDOperand FloatVal = Op.getOperand(0);
646   MVT::ValueType  vt = FloatVal.getValueType();
647   assert(vt == MVT::f32 || vt == MVT::f64);
648
649   ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOSIS : ARMISD::FTOSID;
650   SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal);
651   return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp);
652 }
653
654 static SDOperand LowerUINT_TO_FP(SDOperand Op, SelectionDAG &DAG) {
655   SDOperand IntVal  = Op.getOperand(0);
656   assert(IntVal.getValueType() == MVT::i32);
657   MVT::ValueType vt = Op.getValueType();
658   assert(vt == MVT::f32 ||
659          vt == MVT::f64);
660
661   SDOperand Tmp = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, IntVal);
662   ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FUITOS : ARMISD::FUITOD;
663   return DAG.getNode(op, vt, Tmp);
664 }
665
666 static SDOperand LowerFP_TO_UINT(SDOperand Op, SelectionDAG &DAG) {
667   assert(Op.getValueType() == MVT::i32);
668   SDOperand FloatVal = Op.getOperand(0);
669   MVT::ValueType  vt = FloatVal.getValueType();
670   assert(vt == MVT::f32 || vt == MVT::f64);
671
672   ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOUIS : ARMISD::FTOUID;
673   SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal);
674   return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp);
675 }
676
677 SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
678   switch (Op.getOpcode()) {
679   default:
680     assert(0 && "Should not custom lower this!");
681     abort();
682   case ISD::ConstantPool:
683     return LowerConstantPool(Op, DAG);
684   case ISD::GlobalAddress:
685     return LowerGlobalAddress(Op, DAG);
686   case ISD::FP_TO_SINT:
687     return LowerFP_TO_SINT(Op, DAG);
688   case ISD::SINT_TO_FP:
689     return LowerSINT_TO_FP(Op, DAG);
690   case ISD::FP_TO_UINT:
691     return LowerFP_TO_UINT(Op, DAG);
692   case ISD::UINT_TO_FP:
693     return LowerUINT_TO_FP(Op, DAG);
694   case ISD::FORMAL_ARGUMENTS:
695     return LowerFORMAL_ARGUMENTS(Op, DAG, VarArgsFrameIndex);
696   case ISD::CALL:
697     return LowerCALL(Op, DAG);
698   case ISD::RET:
699     return LowerRET(Op, DAG);
700   case ISD::SELECT_CC:
701     return LowerSELECT_CC(Op, DAG);
702   case ISD::BR_CC:
703     return LowerBR_CC(Op, DAG);
704   case ISD::VASTART:
705     return LowerVASTART(Op, DAG, VarArgsFrameIndex);
706   }
707 }
708
709 //===----------------------------------------------------------------------===//
710 // Instruction Selector Implementation
711 //===----------------------------------------------------------------------===//
712
713 //===--------------------------------------------------------------------===//
714 /// ARMDAGToDAGISel - ARM specific code to select ARM machine
715 /// instructions for SelectionDAG operations.
716 ///
717 namespace {
718 class ARMDAGToDAGISel : public SelectionDAGISel {
719   ARMTargetLowering Lowering;
720
721 public:
722   ARMDAGToDAGISel(TargetMachine &TM)
723     : SelectionDAGISel(Lowering), Lowering(TM) {
724   }
725
726   SDNode *Select(SDOperand Op);
727   virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
728   bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base);
729   bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift,
730                        SDOperand &ShiftType);
731
732   // Include the pieces autogenerated from the target description.
733 #include "ARMGenDAGISel.inc"
734 };
735
736 void ARMDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
737   DEBUG(BB->dump());
738
739   DAG.setRoot(SelectRoot(DAG.getRoot()));
740   DAG.RemoveDeadNodes();
741
742   ScheduleAndEmitDAG(DAG);
743 }
744
745 static bool isInt12Immediate(SDNode *N, short &Imm) {
746   if (N->getOpcode() != ISD::Constant)
747     return false;
748
749   int32_t t = cast<ConstantSDNode>(N)->getValue();
750   int max = 1<<12;
751   int min = -max;
752   if (t > min && t < max) {
753     Imm = t;
754     return true;
755   }
756   else
757     return false;
758 }
759
760 static bool isInt12Immediate(SDOperand Op, short &Imm) {
761   return isInt12Immediate(Op.Val, Imm);
762 }
763
764 static uint32_t rotateL(uint32_t x) {
765   uint32_t bit31 = (x & (1 << 31)) >> 31;
766   uint32_t     t = x << 1;
767   return t | bit31;
768 }
769
770 static bool isUInt8Immediate(uint32_t x) {
771   return x < (1 << 8);
772 }
773
774 static bool isRotInt8Immediate(uint32_t x) {
775   int r;
776   for (r = 0; r < 16; r++) {
777     if (isUInt8Immediate(x))
778       return true;
779     x = rotateL(rotateL(x));
780   }
781   return false;
782 }
783
784 bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N,
785                                       SDOperand &Arg,
786                                       SDOperand &Shift,
787                                       SDOperand &ShiftType) {
788   switch(N.getOpcode()) {
789   case ISD::Constant: {
790     uint32_t val = cast<ConstantSDNode>(N)->getValue();
791     if(!isRotInt8Immediate(val)) {
792       const Type  *t =  MVT::getTypeForValueType(MVT::i32);
793       Constant    *C = ConstantUInt::get(t, val);
794       int  alignment = 2;
795       SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment);
796       SDOperand    Z = CurDAG->getTargetConstant(0,     MVT::i32);
797       SDNode      *n = CurDAG->getTargetNode(ARM::ldr,  MVT::i32, Z, Addr);
798       Arg            = SDOperand(n, 0);
799     } else
800       Arg            = CurDAG->getTargetConstant(val,    MVT::i32);
801
802     Shift     = CurDAG->getTargetConstant(0,             MVT::i32);
803     ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32);
804     return true;
805   }
806   case ISD::SRA:
807     Arg       = N.getOperand(0);
808     Shift     = N.getOperand(1);
809     ShiftType = CurDAG->getTargetConstant(ARMShift::ASR, MVT::i32);
810     return true;
811   case ISD::SRL:
812     Arg       = N.getOperand(0);
813     Shift     = N.getOperand(1);
814     ShiftType = CurDAG->getTargetConstant(ARMShift::LSR, MVT::i32);
815     return true;
816   case ISD::SHL:
817     Arg       = N.getOperand(0);
818     Shift     = N.getOperand(1);
819     ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32);
820     return true;
821   }
822
823   Arg       = N;
824   Shift     = CurDAG->getTargetConstant(0, MVT::i32);
825   ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32);
826   return true;
827 }
828
829 //register plus/minus 12 bit offset
830 bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand N, SDOperand &Offset,
831                                     SDOperand &Base) {
832   if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
833     Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
834     Offset = CurDAG->getTargetConstant(0, MVT::i32);
835     return true;
836   }
837   if (N.getOpcode() == ISD::ADD) {
838     short imm = 0;
839     if (isInt12Immediate(N.getOperand(1), imm)) {
840       Offset = CurDAG->getTargetConstant(imm, MVT::i32);
841       if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) {
842         Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
843       } else {
844         Base = N.getOperand(0);
845       }
846       return true; // [r+i]
847     }
848   }
849
850   Offset = CurDAG->getTargetConstant(0, MVT::i32);
851   if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) {
852     Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
853   }
854   else
855     Base = N;
856   return true;      //any address fits in a register
857 }
858
859 SDNode *ARMDAGToDAGISel::Select(SDOperand Op) {
860   SDNode *N = Op.Val;
861
862   switch (N->getOpcode()) {
863   default:
864     return SelectCode(Op);
865     break;
866   }
867   return NULL;
868 }
869
870 }  // end anonymous namespace
871
872 /// createARMISelDag - This pass converts a legalized DAG into a
873 /// ARM-specific DAG, ready for instruction scheduling.
874 ///
875 FunctionPass *llvm::createARMISelDag(TargetMachine &TM) {
876   return new ARMDAGToDAGISel(TM);
877 }