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