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