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