Only use blx for external function calls on thumb, these could be fixed
[oota-llvm.git] / lib / Target / ARM / ARMFastISel.cpp
1 //===-- ARMFastISel.cpp - ARM FastISel implementation ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the ARM-specific support for the FastISel class. Some
11 // of the target-specific code is generated by tablegen in the file
12 // ARMGenFastISel.inc, which is #included here.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "ARM.h"
17 #include "ARMBaseInstrInfo.h"
18 #include "ARMCallingConv.h"
19 #include "ARMRegisterInfo.h"
20 #include "ARMTargetMachine.h"
21 #include "ARMSubtarget.h"
22 #include "ARMConstantPoolValue.h"
23 #include "llvm/CallingConv.h"
24 #include "llvm/DerivedTypes.h"
25 #include "llvm/GlobalVariable.h"
26 #include "llvm/Instructions.h"
27 #include "llvm/IntrinsicInst.h"
28 #include "llvm/Module.h"
29 #include "llvm/CodeGen/Analysis.h"
30 #include "llvm/CodeGen/FastISel.h"
31 #include "llvm/CodeGen/FunctionLoweringInfo.h"
32 #include "llvm/CodeGen/MachineInstrBuilder.h"
33 #include "llvm/CodeGen/MachineModuleInfo.h"
34 #include "llvm/CodeGen/MachineConstantPool.h"
35 #include "llvm/CodeGen/MachineFrameInfo.h"
36 #include "llvm/CodeGen/MachineMemOperand.h"
37 #include "llvm/CodeGen/MachineRegisterInfo.h"
38 #include "llvm/CodeGen/PseudoSourceValue.h"
39 #include "llvm/Support/CallSite.h"
40 #include "llvm/Support/CommandLine.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/GetElementPtrTypeIterator.h"
43 #include "llvm/Target/TargetData.h"
44 #include "llvm/Target/TargetInstrInfo.h"
45 #include "llvm/Target/TargetLowering.h"
46 #include "llvm/Target/TargetMachine.h"
47 #include "llvm/Target/TargetOptions.h"
48 using namespace llvm;
49
50 static cl::opt<bool>
51 DisableARMFastISel("disable-arm-fast-isel",
52                     cl::desc("Turn off experimental ARM fast-isel support"),
53                     cl::init(false), cl::Hidden);
54
55 extern cl::opt<bool> EnableARMLongCalls;
56
57 namespace {
58
59   // All possible address modes, plus some.
60   typedef struct Address {
61     enum {
62       RegBase,
63       FrameIndexBase
64     } BaseType;
65
66     union {
67       unsigned Reg;
68       int FI;
69     } Base;
70
71     int Offset;
72     unsigned Scale;
73     unsigned PlusReg;
74
75     // Innocuous defaults for our address.
76     Address()
77      : BaseType(RegBase), Offset(0), Scale(0), PlusReg(0) {
78        Base.Reg = 0;
79      }
80   } Address;
81
82 class ARMFastISel : public FastISel {
83
84   /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
85   /// make the right decision when generating code for different targets.
86   const ARMSubtarget *Subtarget;
87   const TargetMachine &TM;
88   const TargetInstrInfo &TII;
89   const TargetLowering &TLI;
90   ARMFunctionInfo *AFI;
91
92   // Convenience variables to avoid some queries.
93   bool isThumb;
94   LLVMContext *Context;
95
96   public:
97     explicit ARMFastISel(FunctionLoweringInfo &funcInfo)
98     : FastISel(funcInfo),
99       TM(funcInfo.MF->getTarget()),
100       TII(*TM.getInstrInfo()),
101       TLI(*TM.getTargetLowering()) {
102       Subtarget = &TM.getSubtarget<ARMSubtarget>();
103       AFI = funcInfo.MF->getInfo<ARMFunctionInfo>();
104       isThumb = AFI->isThumbFunction();
105       Context = &funcInfo.Fn->getContext();
106     }
107
108     // Code from FastISel.cpp.
109     virtual unsigned FastEmitInst_(unsigned MachineInstOpcode,
110                                    const TargetRegisterClass *RC);
111     virtual unsigned FastEmitInst_r(unsigned MachineInstOpcode,
112                                     const TargetRegisterClass *RC,
113                                     unsigned Op0, bool Op0IsKill);
114     virtual unsigned FastEmitInst_rr(unsigned MachineInstOpcode,
115                                      const TargetRegisterClass *RC,
116                                      unsigned Op0, bool Op0IsKill,
117                                      unsigned Op1, bool Op1IsKill);
118     virtual unsigned FastEmitInst_ri(unsigned MachineInstOpcode,
119                                      const TargetRegisterClass *RC,
120                                      unsigned Op0, bool Op0IsKill,
121                                      uint64_t Imm);
122     virtual unsigned FastEmitInst_rf(unsigned MachineInstOpcode,
123                                      const TargetRegisterClass *RC,
124                                      unsigned Op0, bool Op0IsKill,
125                                      const ConstantFP *FPImm);
126     virtual unsigned FastEmitInst_i(unsigned MachineInstOpcode,
127                                     const TargetRegisterClass *RC,
128                                     uint64_t Imm);
129     virtual unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
130                                       const TargetRegisterClass *RC,
131                                       unsigned Op0, bool Op0IsKill,
132                                       unsigned Op1, bool Op1IsKill,
133                                       uint64_t Imm);
134     virtual unsigned FastEmitInst_extractsubreg(MVT RetVT,
135                                                 unsigned Op0, bool Op0IsKill,
136                                                 uint32_t Idx);
137
138     // Backend specific FastISel code.
139     virtual bool TargetSelectInstruction(const Instruction *I);
140     virtual unsigned TargetMaterializeConstant(const Constant *C);
141     virtual unsigned TargetMaterializeAlloca(const AllocaInst *AI);
142
143   #include "ARMGenFastISel.inc"
144
145     // Instruction selection routines.
146   private:
147     bool SelectLoad(const Instruction *I);
148     bool SelectStore(const Instruction *I);
149     bool SelectBranch(const Instruction *I);
150     bool SelectCmp(const Instruction *I);
151     bool SelectFPExt(const Instruction *I);
152     bool SelectFPTrunc(const Instruction *I);
153     bool SelectBinaryOp(const Instruction *I, unsigned ISDOpcode);
154     bool SelectSIToFP(const Instruction *I);
155     bool SelectFPToSI(const Instruction *I);
156     bool SelectSDiv(const Instruction *I);
157     bool SelectSRem(const Instruction *I);
158     bool SelectCall(const Instruction *I);
159     bool SelectSelect(const Instruction *I);
160     bool SelectRet(const Instruction *I);
161
162     // Utility routines.
163   private:
164     bool isTypeLegal(const Type *Ty, MVT &VT);
165     bool isLoadTypeLegal(const Type *Ty, MVT &VT);
166     bool ARMEmitLoad(EVT VT, unsigned &ResultReg, Address &Addr);
167     bool ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr);
168     bool ARMComputeAddress(const Value *Obj, Address &Addr);
169     void ARMSimplifyAddress(Address &Addr, EVT VT);
170     unsigned ARMMaterializeFP(const ConstantFP *CFP, EVT VT);
171     unsigned ARMMaterializeInt(const Constant *C, EVT VT);
172     unsigned ARMMaterializeGV(const GlobalValue *GV, EVT VT);
173     unsigned ARMMoveToFPReg(EVT VT, unsigned SrcReg);
174     unsigned ARMMoveToIntReg(EVT VT, unsigned SrcReg);
175     unsigned ARMSelectCallOp(const GlobalValue *GV);
176
177     // Call handling routines.
178   private:
179     bool FastEmitExtend(ISD::NodeType Opc, EVT DstVT, unsigned Src, EVT SrcVT,
180                         unsigned &ResultReg);
181     CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool Return);
182     bool ProcessCallArgs(SmallVectorImpl<Value*> &Args,
183                          SmallVectorImpl<unsigned> &ArgRegs,
184                          SmallVectorImpl<MVT> &ArgVTs,
185                          SmallVectorImpl<ISD::ArgFlagsTy> &ArgFlags,
186                          SmallVectorImpl<unsigned> &RegArgs,
187                          CallingConv::ID CC,
188                          unsigned &NumBytes);
189     bool FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
190                     const Instruction *I, CallingConv::ID CC,
191                     unsigned &NumBytes);
192     bool ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call);
193
194     // OptionalDef handling routines.
195   private:
196     bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR);
197     const MachineInstrBuilder &AddOptionalDefs(const MachineInstrBuilder &MIB);
198     void AddLoadStoreOperands(EVT VT, Address &Addr,
199                               const MachineInstrBuilder &MIB);
200 };
201
202 } // end anonymous namespace
203
204 #include "ARMGenCallingConv.inc"
205
206 // DefinesOptionalPredicate - This is different from DefinesPredicate in that
207 // we don't care about implicit defs here, just places we'll need to add a
208 // default CCReg argument. Sets CPSR if we're setting CPSR instead of CCR.
209 bool ARMFastISel::DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR) {
210   const TargetInstrDesc &TID = MI->getDesc();
211   if (!TID.hasOptionalDef())
212     return false;
213
214   // Look to see if our OptionalDef is defining CPSR or CCR.
215   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
216     const MachineOperand &MO = MI->getOperand(i);
217     if (!MO.isReg() || !MO.isDef()) continue;
218     if (MO.getReg() == ARM::CPSR)
219       *CPSR = true;
220   }
221   return true;
222 }
223
224 // If the machine is predicable go ahead and add the predicate operands, if
225 // it needs default CC operands add those.
226 // TODO: If we want to support thumb1 then we'll need to deal with optional
227 // CPSR defs that need to be added before the remaining operands. See s_cc_out
228 // for descriptions why.
229 const MachineInstrBuilder &
230 ARMFastISel::AddOptionalDefs(const MachineInstrBuilder &MIB) {
231   MachineInstr *MI = &*MIB;
232
233   // Do we use a predicate?
234   if (TII.isPredicable(MI))
235     AddDefaultPred(MIB);
236
237   // Do we optionally set a predicate?  Preds is size > 0 iff the predicate
238   // defines CPSR. All other OptionalDefines in ARM are the CCR register.
239   bool CPSR = false;
240   if (DefinesOptionalPredicate(MI, &CPSR)) {
241     if (CPSR)
242       AddDefaultT1CC(MIB);
243     else
244       AddDefaultCC(MIB);
245   }
246   return MIB;
247 }
248
249 unsigned ARMFastISel::FastEmitInst_(unsigned MachineInstOpcode,
250                                     const TargetRegisterClass* RC) {
251   unsigned ResultReg = createResultReg(RC);
252   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
253
254   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg));
255   return ResultReg;
256 }
257
258 unsigned ARMFastISel::FastEmitInst_r(unsigned MachineInstOpcode,
259                                      const TargetRegisterClass *RC,
260                                      unsigned Op0, bool Op0IsKill) {
261   unsigned ResultReg = createResultReg(RC);
262   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
263
264   if (II.getNumDefs() >= 1)
265     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
266                    .addReg(Op0, Op0IsKill * RegState::Kill));
267   else {
268     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
269                    .addReg(Op0, Op0IsKill * RegState::Kill));
270     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
271                    TII.get(TargetOpcode::COPY), ResultReg)
272                    .addReg(II.ImplicitDefs[0]));
273   }
274   return ResultReg;
275 }
276
277 unsigned ARMFastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
278                                       const TargetRegisterClass *RC,
279                                       unsigned Op0, bool Op0IsKill,
280                                       unsigned Op1, bool Op1IsKill) {
281   unsigned ResultReg = createResultReg(RC);
282   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
283
284   if (II.getNumDefs() >= 1)
285     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
286                    .addReg(Op0, Op0IsKill * RegState::Kill)
287                    .addReg(Op1, Op1IsKill * RegState::Kill));
288   else {
289     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
290                    .addReg(Op0, Op0IsKill * RegState::Kill)
291                    .addReg(Op1, Op1IsKill * RegState::Kill));
292     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
293                            TII.get(TargetOpcode::COPY), ResultReg)
294                    .addReg(II.ImplicitDefs[0]));
295   }
296   return ResultReg;
297 }
298
299 unsigned ARMFastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
300                                       const TargetRegisterClass *RC,
301                                       unsigned Op0, bool Op0IsKill,
302                                       uint64_t Imm) {
303   unsigned ResultReg = createResultReg(RC);
304   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
305
306   if (II.getNumDefs() >= 1)
307     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
308                    .addReg(Op0, Op0IsKill * RegState::Kill)
309                    .addImm(Imm));
310   else {
311     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
312                    .addReg(Op0, Op0IsKill * RegState::Kill)
313                    .addImm(Imm));
314     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
315                            TII.get(TargetOpcode::COPY), ResultReg)
316                    .addReg(II.ImplicitDefs[0]));
317   }
318   return ResultReg;
319 }
320
321 unsigned ARMFastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
322                                       const TargetRegisterClass *RC,
323                                       unsigned Op0, bool Op0IsKill,
324                                       const ConstantFP *FPImm) {
325   unsigned ResultReg = createResultReg(RC);
326   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
327
328   if (II.getNumDefs() >= 1)
329     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
330                    .addReg(Op0, Op0IsKill * RegState::Kill)
331                    .addFPImm(FPImm));
332   else {
333     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
334                    .addReg(Op0, Op0IsKill * RegState::Kill)
335                    .addFPImm(FPImm));
336     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
337                            TII.get(TargetOpcode::COPY), ResultReg)
338                    .addReg(II.ImplicitDefs[0]));
339   }
340   return ResultReg;
341 }
342
343 unsigned ARMFastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
344                                        const TargetRegisterClass *RC,
345                                        unsigned Op0, bool Op0IsKill,
346                                        unsigned Op1, bool Op1IsKill,
347                                        uint64_t Imm) {
348   unsigned ResultReg = createResultReg(RC);
349   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
350
351   if (II.getNumDefs() >= 1)
352     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
353                    .addReg(Op0, Op0IsKill * RegState::Kill)
354                    .addReg(Op1, Op1IsKill * RegState::Kill)
355                    .addImm(Imm));
356   else {
357     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
358                    .addReg(Op0, Op0IsKill * RegState::Kill)
359                    .addReg(Op1, Op1IsKill * RegState::Kill)
360                    .addImm(Imm));
361     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
362                            TII.get(TargetOpcode::COPY), ResultReg)
363                    .addReg(II.ImplicitDefs[0]));
364   }
365   return ResultReg;
366 }
367
368 unsigned ARMFastISel::FastEmitInst_i(unsigned MachineInstOpcode,
369                                      const TargetRegisterClass *RC,
370                                      uint64_t Imm) {
371   unsigned ResultReg = createResultReg(RC);
372   const TargetInstrDesc &II = TII.get(MachineInstOpcode);
373
374   if (II.getNumDefs() >= 1)
375     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II, ResultReg)
376                    .addImm(Imm));
377   else {
378     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II)
379                    .addImm(Imm));
380     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
381                            TII.get(TargetOpcode::COPY), ResultReg)
382                    .addReg(II.ImplicitDefs[0]));
383   }
384   return ResultReg;
385 }
386
387 unsigned ARMFastISel::FastEmitInst_extractsubreg(MVT RetVT,
388                                                  unsigned Op0, bool Op0IsKill,
389                                                  uint32_t Idx) {
390   unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT));
391   assert(TargetRegisterInfo::isVirtualRegister(Op0) &&
392          "Cannot yet extract from physregs");
393   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
394                          DL, TII.get(TargetOpcode::COPY), ResultReg)
395                  .addReg(Op0, getKillRegState(Op0IsKill), Idx));
396   return ResultReg;
397 }
398
399 // TODO: Don't worry about 64-bit now, but when this is fixed remove the
400 // checks from the various callers.
401 unsigned ARMFastISel::ARMMoveToFPReg(EVT VT, unsigned SrcReg) {
402   if (VT == MVT::f64) return 0;
403
404   unsigned MoveReg = createResultReg(TLI.getRegClassFor(VT));
405   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
406                           TII.get(ARM::VMOVRS), MoveReg)
407                   .addReg(SrcReg));
408   return MoveReg;
409 }
410
411 unsigned ARMFastISel::ARMMoveToIntReg(EVT VT, unsigned SrcReg) {
412   if (VT == MVT::i64) return 0;
413
414   unsigned MoveReg = createResultReg(TLI.getRegClassFor(VT));
415   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
416                           TII.get(ARM::VMOVSR), MoveReg)
417                   .addReg(SrcReg));
418   return MoveReg;
419 }
420
421 // For double width floating point we need to materialize two constants
422 // (the high and the low) into integer registers then use a move to get
423 // the combined constant into an FP reg.
424 unsigned ARMFastISel::ARMMaterializeFP(const ConstantFP *CFP, EVT VT) {
425   const APFloat Val = CFP->getValueAPF();
426   bool is64bit = VT == MVT::f64;
427
428   // This checks to see if we can use VFP3 instructions to materialize
429   // a constant, otherwise we have to go through the constant pool.
430   if (TLI.isFPImmLegal(Val, VT)) {
431     unsigned Opc = is64bit ? ARM::FCONSTD : ARM::FCONSTS;
432     unsigned DestReg = createResultReg(TLI.getRegClassFor(VT));
433     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc),
434                             DestReg)
435                     .addFPImm(CFP));
436     return DestReg;
437   }
438
439   // Require VFP2 for loading fp constants.
440   if (!Subtarget->hasVFP2()) return false;
441
442   // MachineConstantPool wants an explicit alignment.
443   unsigned Align = TD.getPrefTypeAlignment(CFP->getType());
444   if (Align == 0) {
445     // TODO: Figure out if this is correct.
446     Align = TD.getTypeAllocSize(CFP->getType());
447   }
448   unsigned Idx = MCP.getConstantPoolIndex(cast<Constant>(CFP), Align);
449   unsigned DestReg = createResultReg(TLI.getRegClassFor(VT));
450   unsigned Opc = is64bit ? ARM::VLDRD : ARM::VLDRS;
451
452   // The extra reg is for addrmode5.
453   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc),
454                           DestReg)
455                   .addConstantPoolIndex(Idx)
456                   .addReg(0));
457   return DestReg;
458 }
459
460 unsigned ARMFastISel::ARMMaterializeInt(const Constant *C, EVT VT) {
461
462   // For now 32-bit only.
463   if (VT != MVT::i32) return false;
464
465   unsigned DestReg = createResultReg(TLI.getRegClassFor(VT));
466
467   // If we can do this in a single instruction without a constant pool entry
468   // do so now.
469   const ConstantInt *CI = cast<ConstantInt>(C);
470   if (Subtarget->hasV6T2Ops() && isUInt<16>(CI->getSExtValue())) {
471     unsigned Opc = isThumb ? ARM::t2MOVi16 : ARM::MOVi16;
472     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
473                             TII.get(Opc), DestReg)
474                     .addImm(CI->getSExtValue()));
475     return DestReg;
476   }
477
478   // MachineConstantPool wants an explicit alignment.
479   unsigned Align = TD.getPrefTypeAlignment(C->getType());
480   if (Align == 0) {
481     // TODO: Figure out if this is correct.
482     Align = TD.getTypeAllocSize(C->getType());
483   }
484   unsigned Idx = MCP.getConstantPoolIndex(C, Align);
485
486   if (isThumb)
487     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
488                             TII.get(ARM::t2LDRpci), DestReg)
489                     .addConstantPoolIndex(Idx));
490   else
491     // The extra immediate is for addrmode2.
492     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
493                             TII.get(ARM::LDRcp), DestReg)
494                     .addConstantPoolIndex(Idx)
495                     .addImm(0));
496
497   return DestReg;
498 }
499
500 unsigned ARMFastISel::ARMMaterializeGV(const GlobalValue *GV, EVT VT) {
501   // For now 32-bit only.
502   if (VT != MVT::i32) return 0;
503
504   Reloc::Model RelocM = TM.getRelocationModel();
505
506   // TODO: No external globals for now.
507   if (Subtarget->GVIsIndirectSymbol(GV, RelocM)) return 0;
508
509   // TODO: Need more magic for ARM PIC.
510   if (!isThumb && (RelocM == Reloc::PIC_)) return 0;
511
512   // MachineConstantPool wants an explicit alignment.
513   unsigned Align = TD.getPrefTypeAlignment(GV->getType());
514   if (Align == 0) {
515     // TODO: Figure out if this is correct.
516     Align = TD.getTypeAllocSize(GV->getType());
517   }
518
519   // Grab index.
520   unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb() ? 4 : 8);
521   unsigned Id = AFI->createPICLabelUId();
522   ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, Id,
523                                                        ARMCP::CPValue, PCAdj);
524   unsigned Idx = MCP.getConstantPoolIndex(CPV, Align);
525
526   // Load value.
527   MachineInstrBuilder MIB;
528   unsigned DestReg = createResultReg(TLI.getRegClassFor(VT));
529   if (isThumb) {
530     unsigned Opc = (RelocM != Reloc::PIC_) ? ARM::t2LDRpci : ARM::t2LDRpci_pic;
531     MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), DestReg)
532           .addConstantPoolIndex(Idx);
533     if (RelocM == Reloc::PIC_)
534       MIB.addImm(Id);
535   } else {
536     // The extra immediate is for addrmode2.
537     MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(ARM::LDRcp),
538                   DestReg)
539           .addConstantPoolIndex(Idx)
540           .addImm(0);
541   }
542   AddOptionalDefs(MIB);
543   return DestReg;
544 }
545
546 unsigned ARMFastISel::TargetMaterializeConstant(const Constant *C) {
547   EVT VT = TLI.getValueType(C->getType(), true);
548
549   // Only handle simple types.
550   if (!VT.isSimple()) return 0;
551
552   if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
553     return ARMMaterializeFP(CFP, VT);
554   else if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
555     return ARMMaterializeGV(GV, VT);
556   else if (isa<ConstantInt>(C))
557     return ARMMaterializeInt(C, VT);
558
559   return 0;
560 }
561
562 unsigned ARMFastISel::TargetMaterializeAlloca(const AllocaInst *AI) {
563   // Don't handle dynamic allocas.
564   if (!FuncInfo.StaticAllocaMap.count(AI)) return 0;
565
566   MVT VT;
567   if (!isLoadTypeLegal(AI->getType(), VT)) return false;
568
569   DenseMap<const AllocaInst*, int>::iterator SI =
570     FuncInfo.StaticAllocaMap.find(AI);
571
572   // This will get lowered later into the correct offsets and registers
573   // via rewriteXFrameIndex.
574   if (SI != FuncInfo.StaticAllocaMap.end()) {
575     TargetRegisterClass* RC = TLI.getRegClassFor(VT);
576     unsigned ResultReg = createResultReg(RC);
577     unsigned Opc = isThumb ? ARM::t2ADDri : ARM::ADDri;
578     AddOptionalDefs(BuildMI(*FuncInfo.MBB, *FuncInfo.InsertPt, DL,
579                             TII.get(Opc), ResultReg)
580                             .addFrameIndex(SI->second)
581                             .addImm(0));
582     return ResultReg;
583   }
584
585   return 0;
586 }
587
588 bool ARMFastISel::isTypeLegal(const Type *Ty, MVT &VT) {
589   EVT evt = TLI.getValueType(Ty, true);
590
591   // Only handle simple types.
592   if (evt == MVT::Other || !evt.isSimple()) return false;
593   VT = evt.getSimpleVT();
594
595   // Handle all legal types, i.e. a register that will directly hold this
596   // value.
597   return TLI.isTypeLegal(VT);
598 }
599
600 bool ARMFastISel::isLoadTypeLegal(const Type *Ty, MVT &VT) {
601   if (isTypeLegal(Ty, VT)) return true;
602
603   // If this is a type than can be sign or zero-extended to a basic operation
604   // go ahead and accept it now.
605   if (VT == MVT::i8 || VT == MVT::i16)
606     return true;
607
608   return false;
609 }
610
611 // Computes the address to get to an object.
612 bool ARMFastISel::ARMComputeAddress(const Value *Obj, Address &Addr) {
613   // Some boilerplate from the X86 FastISel.
614   const User *U = NULL;
615   unsigned Opcode = Instruction::UserOp1;
616   if (const Instruction *I = dyn_cast<Instruction>(Obj)) {
617     // Don't walk into other basic blocks unless the object is an alloca from
618     // another block, otherwise it may not have a virtual register assigned.
619     if (FuncInfo.StaticAllocaMap.count(static_cast<const AllocaInst *>(Obj)) ||
620         FuncInfo.MBBMap[I->getParent()] == FuncInfo.MBB) {
621       Opcode = I->getOpcode();
622       U = I;
623     }
624   } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(Obj)) {
625     Opcode = C->getOpcode();
626     U = C;
627   }
628
629   if (const PointerType *Ty = dyn_cast<PointerType>(Obj->getType()))
630     if (Ty->getAddressSpace() > 255)
631       // Fast instruction selection doesn't support the special
632       // address spaces.
633       return false;
634
635   switch (Opcode) {
636     default:
637     break;
638     case Instruction::BitCast: {
639       // Look through bitcasts.
640       return ARMComputeAddress(U->getOperand(0), Addr);
641     }
642     case Instruction::IntToPtr: {
643       // Look past no-op inttoptrs.
644       if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
645         return ARMComputeAddress(U->getOperand(0), Addr);
646       break;
647     }
648     case Instruction::PtrToInt: {
649       // Look past no-op ptrtoints.
650       if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
651         return ARMComputeAddress(U->getOperand(0), Addr);
652       break;
653     }
654     case Instruction::GetElementPtr: {
655       Address SavedAddr = Addr;
656       int TmpOffset = Addr.Offset;
657
658       // Iterate through the GEP folding the constants into offsets where
659       // we can.
660       gep_type_iterator GTI = gep_type_begin(U);
661       for (User::const_op_iterator i = U->op_begin() + 1, e = U->op_end();
662            i != e; ++i, ++GTI) {
663         const Value *Op = *i;
664         if (const StructType *STy = dyn_cast<StructType>(*GTI)) {
665           const StructLayout *SL = TD.getStructLayout(STy);
666           unsigned Idx = cast<ConstantInt>(Op)->getZExtValue();
667           TmpOffset += SL->getElementOffset(Idx);
668         } else {
669           uint64_t S = TD.getTypeAllocSize(GTI.getIndexedType());
670           SmallVector<const Value *, 4> Worklist;
671           Worklist.push_back(Op);
672           do {
673             Op = Worklist.pop_back_val();
674             if (const ConstantInt *CI = dyn_cast<ConstantInt>(Op)) {
675               // Constant-offset addressing.
676               TmpOffset += CI->getSExtValue() * S;
677             } else if (isa<AddOperator>(Op) &&
678                        isa<ConstantInt>(cast<AddOperator>(Op)->getOperand(1))) {
679               // An add with a constant operand. Fold the constant.
680               ConstantInt *CI =
681                 cast<ConstantInt>(cast<AddOperator>(Op)->getOperand(1));
682               TmpOffset += CI->getSExtValue() * S;
683               // Add the other operand back to the work list.
684               Worklist.push_back(cast<AddOperator>(Op)->getOperand(0));
685             } else
686               goto unsupported_gep;
687           } while (!Worklist.empty());
688         }
689       }
690
691       // Try to grab the base operand now.
692       Addr.Offset = TmpOffset;
693       if (ARMComputeAddress(U->getOperand(0), Addr)) return true;
694
695       // We failed, restore everything and try the other options.
696       Addr = SavedAddr;
697
698       unsupported_gep:
699       break;
700     }
701     case Instruction::Alloca: {
702       const AllocaInst *AI = cast<AllocaInst>(Obj);
703       DenseMap<const AllocaInst*, int>::iterator SI =
704         FuncInfo.StaticAllocaMap.find(AI);
705       if (SI != FuncInfo.StaticAllocaMap.end()) {
706         Addr.BaseType = Address::FrameIndexBase;
707         Addr.Base.FI = SI->second;
708         return true;
709       }
710       break;
711     }
712   }
713
714   // Materialize the global variable's address into a reg which can
715   // then be used later to load the variable.
716   if (const GlobalValue *GV = dyn_cast<GlobalValue>(Obj)) {
717     unsigned Tmp = ARMMaterializeGV(GV, TLI.getValueType(Obj->getType()));
718     if (Tmp == 0) return false;
719
720     Addr.Base.Reg = Tmp;
721     return true;
722   }
723
724   // Try to get this in a register if nothing else has worked.
725   if (Addr.Base.Reg == 0) Addr.Base.Reg = getRegForValue(Obj);
726   return Addr.Base.Reg != 0;
727 }
728
729 void ARMFastISel::ARMSimplifyAddress(Address &Addr, EVT VT) {
730
731   assert(VT.isSimple() && "Non-simple types are invalid here!");
732
733   bool needsLowering = false;
734   switch (VT.getSimpleVT().SimpleTy) {
735     default:
736       assert(false && "Unhandled load/store type!");
737     case MVT::i1:
738     case MVT::i8:
739     case MVT::i16:
740     case MVT::i32:
741       // Integer loads/stores handle 12-bit offsets.
742       needsLowering = ((Addr.Offset & 0xfff) != Addr.Offset);
743       break;
744     case MVT::f32:
745     case MVT::f64:
746       // Floating point operands handle 8-bit offsets.
747       needsLowering = ((Addr.Offset & 0xff) != Addr.Offset);
748       break;
749   }
750
751   // If this is a stack pointer and the offset needs to be simplified then
752   // put the alloca address into a register, set the base type back to
753   // register and continue. This should almost never happen.
754   if (needsLowering && Addr.BaseType == Address::FrameIndexBase) {
755     TargetRegisterClass *RC = isThumb ? ARM::tGPRRegisterClass :
756                               ARM::GPRRegisterClass;
757     unsigned ResultReg = createResultReg(RC);
758     unsigned Opc = isThumb ? ARM::t2ADDri : ARM::ADDri;
759     AddOptionalDefs(BuildMI(*FuncInfo.MBB, *FuncInfo.InsertPt, DL,
760                             TII.get(Opc), ResultReg)
761                             .addFrameIndex(Addr.Base.FI)
762                             .addImm(0));
763     Addr.Base.Reg = ResultReg;
764     Addr.BaseType = Address::RegBase;
765   }
766
767   // Since the offset is too large for the load/store instruction
768   // get the reg+offset into a register.
769   if (needsLowering) {
770     ARMCC::CondCodes Pred = ARMCC::AL;
771     unsigned PredReg = 0;
772
773     TargetRegisterClass *RC = isThumb ? ARM::tGPRRegisterClass :
774       ARM::GPRRegisterClass;
775     unsigned BaseReg = createResultReg(RC);
776
777     if (!isThumb)
778       emitARMRegPlusImmediate(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
779                               BaseReg, Addr.Base.Reg, Addr.Offset,
780                               Pred, PredReg,
781                               static_cast<const ARMBaseInstrInfo&>(TII));
782     else {
783       assert(AFI->isThumb2Function());
784       emitT2RegPlusImmediate(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
785                              BaseReg, Addr.Base.Reg, Addr.Offset, Pred, PredReg,
786                              static_cast<const ARMBaseInstrInfo&>(TII));
787     }
788     Addr.Offset = 0;
789     Addr.Base.Reg = BaseReg;
790   }
791 }
792
793 void ARMFastISel::AddLoadStoreOperands(EVT VT, Address &Addr,
794                                        const MachineInstrBuilder &MIB) {
795   // addrmode5 output depends on the selection dag addressing dividing the
796   // offset by 4 that it then later multiplies. Do this here as well.
797   if (VT.getSimpleVT().SimpleTy == MVT::f32 ||
798       VT.getSimpleVT().SimpleTy == MVT::f64)
799     Addr.Offset /= 4;
800     
801   // Frame base works a bit differently. Handle it separately.
802   if (Addr.BaseType == Address::FrameIndexBase) {
803     int FI = Addr.Base.FI;
804     int Offset = Addr.Offset;
805     MachineMemOperand *MMO =
806           FuncInfo.MF->getMachineMemOperand(
807                                   MachinePointerInfo::getFixedStack(FI, Offset),
808                                   MachineMemOperand::MOLoad,
809                                   MFI.getObjectSize(FI),
810                                   MFI.getObjectAlignment(FI));
811     // Now add the rest of the operands.
812     MIB.addFrameIndex(FI);
813
814     // ARM halfword load/stores need an additional operand.
815     if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) MIB.addReg(0);
816
817     MIB.addImm(Addr.Offset);
818     MIB.addMemOperand(MMO);
819   } else {
820     // Now add the rest of the operands.
821     MIB.addReg(Addr.Base.Reg);
822   
823     // ARM halfword load/stores need an additional operand.
824     if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) MIB.addReg(0);
825
826     MIB.addImm(Addr.Offset);
827   }
828   AddOptionalDefs(MIB);
829 }
830
831 bool ARMFastISel::ARMEmitLoad(EVT VT, unsigned &ResultReg, Address &Addr) {
832
833   assert(VT.isSimple() && "Non-simple types are invalid here!");
834   unsigned Opc;
835   TargetRegisterClass *RC;
836   switch (VT.getSimpleVT().SimpleTy) {
837     // This is mostly going to be Neon/vector support.
838     default: return false;
839     case MVT::i16:
840       Opc = isThumb ? ARM::t2LDRHi12 : ARM::LDRH;
841       RC = ARM::GPRRegisterClass;
842       break;
843     case MVT::i8:
844       Opc = isThumb ? ARM::t2LDRBi12 : ARM::LDRBi12;
845       RC = ARM::GPRRegisterClass;
846       break;
847     case MVT::i32:
848       Opc = isThumb ? ARM::t2LDRi12 : ARM::LDRi12;
849       RC = ARM::GPRRegisterClass;
850       break;
851     case MVT::f32:
852       Opc = ARM::VLDRS;
853       RC = TLI.getRegClassFor(VT);
854       break;
855     case MVT::f64:
856       Opc = ARM::VLDRD;
857       RC = TLI.getRegClassFor(VT);
858       break;
859   }
860   // Simplify this down to something we can handle.
861   ARMSimplifyAddress(Addr, VT);
862
863   // Create the base instruction, then add the operands.
864   ResultReg = createResultReg(RC);
865   MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
866                                     TII.get(Opc), ResultReg);
867   AddLoadStoreOperands(VT, Addr, MIB);
868   return true;
869 }
870
871 bool ARMFastISel::SelectLoad(const Instruction *I) {
872   // Verify we have a legal type before going any further.
873   MVT VT;
874   if (!isLoadTypeLegal(I->getType(), VT))
875     return false;
876
877   // See if we can handle this address.
878   Address Addr;
879   if (!ARMComputeAddress(I->getOperand(0), Addr)) return false;
880
881   unsigned ResultReg;
882   if (!ARMEmitLoad(VT, ResultReg, Addr)) return false;
883   UpdateValueMap(I, ResultReg);
884   return true;
885 }
886
887 bool ARMFastISel::ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr) {
888   unsigned StrOpc;
889   switch (VT.getSimpleVT().SimpleTy) {
890     // This is mostly going to be Neon/vector support.
891     default: return false;
892     case MVT::i1: {
893       unsigned Res = createResultReg(isThumb ? ARM::tGPRRegisterClass :
894                                                ARM::GPRRegisterClass);
895       unsigned Opc = isThumb ? ARM::t2ANDri : ARM::ANDri;
896       AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
897                               TII.get(Opc), Res)
898                       .addReg(SrcReg).addImm(1));
899       SrcReg = Res;
900     } // Fallthrough here.
901     case MVT::i8:
902       StrOpc = isThumb ? ARM::t2STRBi12 : ARM::STRBi12;
903       break;
904     case MVT::i16:
905       StrOpc = isThumb ? ARM::t2STRHi12 : ARM::STRH;
906       break;
907     case MVT::i32:
908       StrOpc = isThumb ? ARM::t2STRi12 : ARM::STRi12;
909       break;
910     case MVT::f32:
911       if (!Subtarget->hasVFP2()) return false;
912       StrOpc = ARM::VSTRS;
913       break;
914     case MVT::f64:
915       if (!Subtarget->hasVFP2()) return false;
916       StrOpc = ARM::VSTRD;
917       break;
918   }
919   // Simplify this down to something we can handle.
920   ARMSimplifyAddress(Addr, VT);
921
922   // Create the base instruction, then add the operands.
923   MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
924                                     TII.get(StrOpc))
925                             .addReg(SrcReg, getKillRegState(true));
926   AddLoadStoreOperands(VT, Addr, MIB);
927   return true;
928 }
929
930 bool ARMFastISel::SelectStore(const Instruction *I) {
931   Value *Op0 = I->getOperand(0);
932   unsigned SrcReg = 0;
933
934   // Verify we have a legal type before going any further.
935   MVT VT;
936   if (!isLoadTypeLegal(I->getOperand(0)->getType(), VT))
937     return false;
938
939   // Get the value to be stored into a register.
940   SrcReg = getRegForValue(Op0);
941   if (SrcReg == 0) return false;
942
943   // See if we can handle this address.
944   Address Addr;
945   if (!ARMComputeAddress(I->getOperand(1), Addr))
946     return false;
947
948   if (!ARMEmitStore(VT, SrcReg, Addr)) return false;
949   return true;
950 }
951
952 static ARMCC::CondCodes getComparePred(CmpInst::Predicate Pred) {
953   switch (Pred) {
954     // Needs two compares...
955     case CmpInst::FCMP_ONE:
956     case CmpInst::FCMP_UEQ:
957     default:
958       // AL is our "false" for now. The other two need more compares.
959       return ARMCC::AL;
960     case CmpInst::ICMP_EQ:
961     case CmpInst::FCMP_OEQ:
962       return ARMCC::EQ;
963     case CmpInst::ICMP_SGT:
964     case CmpInst::FCMP_OGT:
965       return ARMCC::GT;
966     case CmpInst::ICMP_SGE:
967     case CmpInst::FCMP_OGE:
968       return ARMCC::GE;
969     case CmpInst::ICMP_UGT:
970     case CmpInst::FCMP_UGT:
971       return ARMCC::HI;
972     case CmpInst::FCMP_OLT:
973       return ARMCC::MI;
974     case CmpInst::ICMP_ULE:
975     case CmpInst::FCMP_OLE:
976       return ARMCC::LS;
977     case CmpInst::FCMP_ORD:
978       return ARMCC::VC;
979     case CmpInst::FCMP_UNO:
980       return ARMCC::VS;
981     case CmpInst::FCMP_UGE:
982       return ARMCC::PL;
983     case CmpInst::ICMP_SLT:
984     case CmpInst::FCMP_ULT:
985       return ARMCC::LT;
986     case CmpInst::ICMP_SLE:
987     case CmpInst::FCMP_ULE:
988       return ARMCC::LE;
989     case CmpInst::FCMP_UNE:
990     case CmpInst::ICMP_NE:
991       return ARMCC::NE;
992     case CmpInst::ICMP_UGE:
993       return ARMCC::HS;
994     case CmpInst::ICMP_ULT:
995       return ARMCC::LO;
996   }
997 }
998
999 bool ARMFastISel::SelectBranch(const Instruction *I) {
1000   const BranchInst *BI = cast<BranchInst>(I);
1001   MachineBasicBlock *TBB = FuncInfo.MBBMap[BI->getSuccessor(0)];
1002   MachineBasicBlock *FBB = FuncInfo.MBBMap[BI->getSuccessor(1)];
1003
1004   // Simple branch support.
1005
1006   // If we can, avoid recomputing the compare - redoing it could lead to wonky
1007   // behavior.
1008   // TODO: Factor this out.
1009   if (const CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition())) {
1010     if (CI->hasOneUse() && (CI->getParent() == I->getParent())) {
1011       MVT VT;
1012       const Type *Ty = CI->getOperand(0)->getType();
1013       if (!isTypeLegal(Ty, VT))
1014         return false;
1015
1016       bool isFloat = (Ty->isDoubleTy() || Ty->isFloatTy());
1017       if (isFloat && !Subtarget->hasVFP2())
1018         return false;
1019
1020       unsigned CmpOpc;
1021       switch (VT.SimpleTy) {
1022         default: return false;
1023         // TODO: Verify compares.
1024         case MVT::f32:
1025           CmpOpc = ARM::VCMPES;
1026           break;
1027         case MVT::f64:
1028           CmpOpc = ARM::VCMPED;
1029           break;
1030         case MVT::i32:
1031           CmpOpc = isThumb ? ARM::t2CMPrr : ARM::CMPrr;
1032           break;
1033       }
1034
1035       // Get the compare predicate.
1036       ARMCC::CondCodes ARMPred = getComparePred(CI->getPredicate());
1037
1038       // We may not handle every CC for now.
1039       if (ARMPred == ARMCC::AL) return false;
1040
1041       unsigned Arg1 = getRegForValue(CI->getOperand(0));
1042       if (Arg1 == 0) return false;
1043
1044       unsigned Arg2 = getRegForValue(CI->getOperand(1));
1045       if (Arg2 == 0) return false;
1046
1047       AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1048                               TII.get(CmpOpc))
1049                       .addReg(Arg1).addReg(Arg2));
1050
1051       // For floating point we need to move the result to a comparison register
1052       // that we can then use for branches.
1053       if (isFloat)
1054         AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1055                                 TII.get(ARM::FMSTAT)));
1056
1057       unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc;
1058       BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc))
1059       .addMBB(TBB).addImm(ARMPred).addReg(ARM::CPSR);
1060       FastEmitBranch(FBB, DL);
1061       FuncInfo.MBB->addSuccessor(TBB);
1062       return true;
1063     }
1064   }
1065
1066   unsigned CmpReg = getRegForValue(BI->getCondition());
1067   if (CmpReg == 0) return false;
1068
1069   // Re-set the flags just in case.
1070   unsigned CmpOpc = isThumb ? ARM::t2CMPri : ARM::CMPri;
1071   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CmpOpc))
1072                   .addReg(CmpReg).addImm(0));
1073
1074   unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc;
1075   BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc))
1076                   .addMBB(TBB).addImm(ARMCC::NE).addReg(ARM::CPSR);
1077   FastEmitBranch(FBB, DL);
1078   FuncInfo.MBB->addSuccessor(TBB);
1079   return true;
1080 }
1081
1082 bool ARMFastISel::SelectCmp(const Instruction *I) {
1083   const CmpInst *CI = cast<CmpInst>(I);
1084
1085   MVT VT;
1086   const Type *Ty = CI->getOperand(0)->getType();
1087   if (!isTypeLegal(Ty, VT))
1088     return false;
1089
1090   bool isFloat = (Ty->isDoubleTy() || Ty->isFloatTy());
1091   if (isFloat && !Subtarget->hasVFP2())
1092     return false;
1093
1094   unsigned CmpOpc;
1095   unsigned CondReg;
1096   switch (VT.SimpleTy) {
1097     default: return false;
1098     // TODO: Verify compares.
1099     case MVT::f32:
1100       CmpOpc = ARM::VCMPES;
1101       CondReg = ARM::FPSCR;
1102       break;
1103     case MVT::f64:
1104       CmpOpc = ARM::VCMPED;
1105       CondReg = ARM::FPSCR;
1106       break;
1107     case MVT::i32:
1108       CmpOpc = isThumb ? ARM::t2CMPrr : ARM::CMPrr;
1109       CondReg = ARM::CPSR;
1110       break;
1111   }
1112
1113   // Get the compare predicate.
1114   ARMCC::CondCodes ARMPred = getComparePred(CI->getPredicate());
1115
1116   // We may not handle every CC for now.
1117   if (ARMPred == ARMCC::AL) return false;
1118
1119   unsigned Arg1 = getRegForValue(CI->getOperand(0));
1120   if (Arg1 == 0) return false;
1121
1122   unsigned Arg2 = getRegForValue(CI->getOperand(1));
1123   if (Arg2 == 0) return false;
1124
1125   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CmpOpc))
1126                   .addReg(Arg1).addReg(Arg2));
1127
1128   // For floating point we need to move the result to a comparison register
1129   // that we can then use for branches.
1130   if (isFloat)
1131     AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1132                             TII.get(ARM::FMSTAT)));
1133
1134   // Now set a register based on the comparison. Explicitly set the predicates
1135   // here.
1136   unsigned MovCCOpc = isThumb ? ARM::t2MOVCCi : ARM::MOVCCi;
1137   TargetRegisterClass *RC = isThumb ? ARM::rGPRRegisterClass
1138                                     : ARM::GPRRegisterClass;
1139   unsigned DestReg = createResultReg(RC);
1140   Constant *Zero
1141     = ConstantInt::get(Type::getInt32Ty(*Context), 0);
1142   unsigned ZeroReg = TargetMaterializeConstant(Zero);
1143   BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(MovCCOpc), DestReg)
1144           .addReg(ZeroReg).addImm(1)
1145           .addImm(ARMPred).addReg(CondReg);
1146
1147   UpdateValueMap(I, DestReg);
1148   return true;
1149 }
1150
1151 bool ARMFastISel::SelectFPExt(const Instruction *I) {
1152   // Make sure we have VFP and that we're extending float to double.
1153   if (!Subtarget->hasVFP2()) return false;
1154
1155   Value *V = I->getOperand(0);
1156   if (!I->getType()->isDoubleTy() ||
1157       !V->getType()->isFloatTy()) return false;
1158
1159   unsigned Op = getRegForValue(V);
1160   if (Op == 0) return false;
1161
1162   unsigned Result = createResultReg(ARM::DPRRegisterClass);
1163   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1164                           TII.get(ARM::VCVTDS), Result)
1165                   .addReg(Op));
1166   UpdateValueMap(I, Result);
1167   return true;
1168 }
1169
1170 bool ARMFastISel::SelectFPTrunc(const Instruction *I) {
1171   // Make sure we have VFP and that we're truncating double to float.
1172   if (!Subtarget->hasVFP2()) return false;
1173
1174   Value *V = I->getOperand(0);
1175   if (!(I->getType()->isFloatTy() &&
1176         V->getType()->isDoubleTy())) return false;
1177
1178   unsigned Op = getRegForValue(V);
1179   if (Op == 0) return false;
1180
1181   unsigned Result = createResultReg(ARM::SPRRegisterClass);
1182   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1183                           TII.get(ARM::VCVTSD), Result)
1184                   .addReg(Op));
1185   UpdateValueMap(I, Result);
1186   return true;
1187 }
1188
1189 bool ARMFastISel::SelectSIToFP(const Instruction *I) {
1190   // Make sure we have VFP.
1191   if (!Subtarget->hasVFP2()) return false;
1192
1193   MVT DstVT;
1194   const Type *Ty = I->getType();
1195   if (!isTypeLegal(Ty, DstVT))
1196     return false;
1197
1198   unsigned Op = getRegForValue(I->getOperand(0));
1199   if (Op == 0) return false;
1200
1201   // The conversion routine works on fp-reg to fp-reg and the operand above
1202   // was an integer, move it to the fp registers if possible.
1203   unsigned FP = ARMMoveToFPReg(MVT::f32, Op);
1204   if (FP == 0) return false;
1205
1206   unsigned Opc;
1207   if (Ty->isFloatTy()) Opc = ARM::VSITOS;
1208   else if (Ty->isDoubleTy()) Opc = ARM::VSITOD;
1209   else return 0;
1210
1211   unsigned ResultReg = createResultReg(TLI.getRegClassFor(DstVT));
1212   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc),
1213                           ResultReg)
1214                   .addReg(FP));
1215   UpdateValueMap(I, ResultReg);
1216   return true;
1217 }
1218
1219 bool ARMFastISel::SelectFPToSI(const Instruction *I) {
1220   // Make sure we have VFP.
1221   if (!Subtarget->hasVFP2()) return false;
1222
1223   MVT DstVT;
1224   const Type *RetTy = I->getType();
1225   if (!isTypeLegal(RetTy, DstVT))
1226     return false;
1227
1228   unsigned Op = getRegForValue(I->getOperand(0));
1229   if (Op == 0) return false;
1230
1231   unsigned Opc;
1232   const Type *OpTy = I->getOperand(0)->getType();
1233   if (OpTy->isFloatTy()) Opc = ARM::VTOSIZS;
1234   else if (OpTy->isDoubleTy()) Opc = ARM::VTOSIZD;
1235   else return 0;
1236
1237   // f64->s32 or f32->s32 both need an intermediate f32 reg.
1238   unsigned ResultReg = createResultReg(TLI.getRegClassFor(MVT::f32));
1239   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc),
1240                           ResultReg)
1241                   .addReg(Op));
1242
1243   // This result needs to be in an integer register, but the conversion only
1244   // takes place in fp-regs.
1245   unsigned IntReg = ARMMoveToIntReg(DstVT, ResultReg);
1246   if (IntReg == 0) return false;
1247
1248   UpdateValueMap(I, IntReg);
1249   return true;
1250 }
1251
1252 bool ARMFastISel::SelectSelect(const Instruction *I) {
1253   MVT VT;
1254   if (!isTypeLegal(I->getType(), VT))
1255     return false;
1256
1257   // Things need to be register sized for register moves.
1258   if (VT != MVT::i32) return false;
1259   const TargetRegisterClass *RC = TLI.getRegClassFor(VT);
1260
1261   unsigned CondReg = getRegForValue(I->getOperand(0));
1262   if (CondReg == 0) return false;
1263   unsigned Op1Reg = getRegForValue(I->getOperand(1));
1264   if (Op1Reg == 0) return false;
1265   unsigned Op2Reg = getRegForValue(I->getOperand(2));
1266   if (Op2Reg == 0) return false;
1267
1268   unsigned CmpOpc = isThumb ? ARM::t2TSTri : ARM::TSTri;
1269   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CmpOpc))
1270                   .addReg(CondReg).addImm(1));
1271   unsigned ResultReg = createResultReg(RC);
1272   unsigned MovCCOpc = isThumb ? ARM::t2MOVCCr : ARM::MOVCCr;
1273   BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(MovCCOpc), ResultReg)
1274     .addReg(Op1Reg).addReg(Op2Reg)
1275     .addImm(ARMCC::EQ).addReg(ARM::CPSR);
1276   UpdateValueMap(I, ResultReg);
1277   return true;
1278 }
1279
1280 bool ARMFastISel::SelectSDiv(const Instruction *I) {
1281   MVT VT;
1282   const Type *Ty = I->getType();
1283   if (!isTypeLegal(Ty, VT))
1284     return false;
1285
1286   // If we have integer div support we should have selected this automagically.
1287   // In case we have a real miss go ahead and return false and we'll pick
1288   // it up later.
1289   if (Subtarget->hasDivide()) return false;
1290
1291   // Otherwise emit a libcall.
1292   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1293   if (VT == MVT::i8)
1294     LC = RTLIB::SDIV_I8;
1295   else if (VT == MVT::i16)
1296     LC = RTLIB::SDIV_I16;
1297   else if (VT == MVT::i32)
1298     LC = RTLIB::SDIV_I32;
1299   else if (VT == MVT::i64)
1300     LC = RTLIB::SDIV_I64;
1301   else if (VT == MVT::i128)
1302     LC = RTLIB::SDIV_I128;
1303   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
1304
1305   return ARMEmitLibcall(I, LC);
1306 }
1307
1308 bool ARMFastISel::SelectSRem(const Instruction *I) {
1309   MVT VT;
1310   const Type *Ty = I->getType();
1311   if (!isTypeLegal(Ty, VT))
1312     return false;
1313
1314   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1315   if (VT == MVT::i8)
1316     LC = RTLIB::SREM_I8;
1317   else if (VT == MVT::i16)
1318     LC = RTLIB::SREM_I16;
1319   else if (VT == MVT::i32)
1320     LC = RTLIB::SREM_I32;
1321   else if (VT == MVT::i64)
1322     LC = RTLIB::SREM_I64;
1323   else if (VT == MVT::i128)
1324     LC = RTLIB::SREM_I128;
1325   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
1326
1327   return ARMEmitLibcall(I, LC);
1328 }
1329
1330 bool ARMFastISel::SelectBinaryOp(const Instruction *I, unsigned ISDOpcode) {
1331   EVT VT  = TLI.getValueType(I->getType(), true);
1332
1333   // We can get here in the case when we want to use NEON for our fp
1334   // operations, but can't figure out how to. Just use the vfp instructions
1335   // if we have them.
1336   // FIXME: It'd be nice to use NEON instructions.
1337   const Type *Ty = I->getType();
1338   bool isFloat = (Ty->isDoubleTy() || Ty->isFloatTy());
1339   if (isFloat && !Subtarget->hasVFP2())
1340     return false;
1341
1342   unsigned Op1 = getRegForValue(I->getOperand(0));
1343   if (Op1 == 0) return false;
1344
1345   unsigned Op2 = getRegForValue(I->getOperand(1));
1346   if (Op2 == 0) return false;
1347
1348   unsigned Opc;
1349   bool is64bit = VT == MVT::f64 || VT == MVT::i64;
1350   switch (ISDOpcode) {
1351     default: return false;
1352     case ISD::FADD:
1353       Opc = is64bit ? ARM::VADDD : ARM::VADDS;
1354       break;
1355     case ISD::FSUB:
1356       Opc = is64bit ? ARM::VSUBD : ARM::VSUBS;
1357       break;
1358     case ISD::FMUL:
1359       Opc = is64bit ? ARM::VMULD : ARM::VMULS;
1360       break;
1361   }
1362   unsigned ResultReg = createResultReg(TLI.getRegClassFor(VT));
1363   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1364                           TII.get(Opc), ResultReg)
1365                   .addReg(Op1).addReg(Op2));
1366   UpdateValueMap(I, ResultReg);
1367   return true;
1368 }
1369
1370 // Call Handling Code
1371
1372 bool ARMFastISel::FastEmitExtend(ISD::NodeType Opc, EVT DstVT, unsigned Src,
1373                                  EVT SrcVT, unsigned &ResultReg) {
1374   unsigned RR = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Opc,
1375                            Src, /*TODO: Kill=*/false);
1376
1377   if (RR != 0) {
1378     ResultReg = RR;
1379     return true;
1380   } else
1381     return false;
1382 }
1383
1384 // This is largely taken directly from CCAssignFnForNode - we don't support
1385 // varargs in FastISel so that part has been removed.
1386 // TODO: We may not support all of this.
1387 CCAssignFn *ARMFastISel::CCAssignFnForCall(CallingConv::ID CC, bool Return) {
1388   switch (CC) {
1389   default:
1390     llvm_unreachable("Unsupported calling convention");
1391   case CallingConv::Fast:
1392     // Ignore fastcc. Silence compiler warnings.
1393     (void)RetFastCC_ARM_APCS;
1394     (void)FastCC_ARM_APCS;
1395     // Fallthrough
1396   case CallingConv::C:
1397     // Use target triple & subtarget features to do actual dispatch.
1398     if (Subtarget->isAAPCS_ABI()) {
1399       if (Subtarget->hasVFP2() &&
1400           FloatABIType == FloatABI::Hard)
1401         return (Return ? RetCC_ARM_AAPCS_VFP: CC_ARM_AAPCS_VFP);
1402       else
1403         return (Return ? RetCC_ARM_AAPCS: CC_ARM_AAPCS);
1404     } else
1405         return (Return ? RetCC_ARM_APCS: CC_ARM_APCS);
1406   case CallingConv::ARM_AAPCS_VFP:
1407     return (Return ? RetCC_ARM_AAPCS_VFP: CC_ARM_AAPCS_VFP);
1408   case CallingConv::ARM_AAPCS:
1409     return (Return ? RetCC_ARM_AAPCS: CC_ARM_AAPCS);
1410   case CallingConv::ARM_APCS:
1411     return (Return ? RetCC_ARM_APCS: CC_ARM_APCS);
1412   }
1413 }
1414
1415 bool ARMFastISel::ProcessCallArgs(SmallVectorImpl<Value*> &Args,
1416                                   SmallVectorImpl<unsigned> &ArgRegs,
1417                                   SmallVectorImpl<MVT> &ArgVTs,
1418                                   SmallVectorImpl<ISD::ArgFlagsTy> &ArgFlags,
1419                                   SmallVectorImpl<unsigned> &RegArgs,
1420                                   CallingConv::ID CC,
1421                                   unsigned &NumBytes) {
1422   SmallVector<CCValAssign, 16> ArgLocs;
1423   CCState CCInfo(CC, false, TM, ArgLocs, *Context);
1424   CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, CCAssignFnForCall(CC, false));
1425
1426   // Get a count of how many bytes are to be pushed on the stack.
1427   NumBytes = CCInfo.getNextStackOffset();
1428
1429   // Issue CALLSEQ_START
1430   unsigned AdjStackDown = TM.getRegisterInfo()->getCallFrameSetupOpcode();
1431   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1432                           TII.get(AdjStackDown))
1433                   .addImm(NumBytes));
1434
1435   // Process the args.
1436   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1437     CCValAssign &VA = ArgLocs[i];
1438     unsigned Arg = ArgRegs[VA.getValNo()];
1439     MVT ArgVT = ArgVTs[VA.getValNo()];
1440
1441     // We don't handle NEON/vector parameters yet.
1442     if (ArgVT.isVector() || ArgVT.getSizeInBits() > 64)
1443       return false;
1444
1445     // Handle arg promotion, etc.
1446     switch (VA.getLocInfo()) {
1447       case CCValAssign::Full: break;
1448       case CCValAssign::SExt: {
1449         bool Emitted = FastEmitExtend(ISD::SIGN_EXTEND, VA.getLocVT(),
1450                                          Arg, ArgVT, Arg);
1451         assert(Emitted && "Failed to emit a sext!"); (void)Emitted;
1452         Emitted = true;
1453         ArgVT = VA.getLocVT();
1454         break;
1455       }
1456       case CCValAssign::ZExt: {
1457         bool Emitted = FastEmitExtend(ISD::ZERO_EXTEND, VA.getLocVT(),
1458                                          Arg, ArgVT, Arg);
1459         assert(Emitted && "Failed to emit a zext!"); (void)Emitted;
1460         Emitted = true;
1461         ArgVT = VA.getLocVT();
1462         break;
1463       }
1464       case CCValAssign::AExt: {
1465         bool Emitted = FastEmitExtend(ISD::ANY_EXTEND, VA.getLocVT(),
1466                                          Arg, ArgVT, Arg);
1467         if (!Emitted)
1468           Emitted = FastEmitExtend(ISD::ZERO_EXTEND, VA.getLocVT(),
1469                                       Arg, ArgVT, Arg);
1470         if (!Emitted)
1471           Emitted = FastEmitExtend(ISD::SIGN_EXTEND, VA.getLocVT(),
1472                                       Arg, ArgVT, Arg);
1473
1474         assert(Emitted && "Failed to emit a aext!"); (void)Emitted;
1475         ArgVT = VA.getLocVT();
1476         break;
1477       }
1478       case CCValAssign::BCvt: {
1479         unsigned BC = FastEmit_r(ArgVT, VA.getLocVT(), ISD::BITCAST, Arg,
1480                                  /*TODO: Kill=*/false);
1481         assert(BC != 0 && "Failed to emit a bitcast!");
1482         Arg = BC;
1483         ArgVT = VA.getLocVT();
1484         break;
1485       }
1486       default: llvm_unreachable("Unknown arg promotion!");
1487     }
1488
1489     // Now copy/store arg to correct locations.
1490     if (VA.isRegLoc() && !VA.needsCustom()) {
1491       BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
1492               VA.getLocReg())
1493       .addReg(Arg);
1494       RegArgs.push_back(VA.getLocReg());
1495     } else if (VA.needsCustom()) {
1496       // TODO: We need custom lowering for vector (v2f64) args.
1497       if (VA.getLocVT() != MVT::f64) return false;
1498
1499       CCValAssign &NextVA = ArgLocs[++i];
1500
1501       // TODO: Only handle register args for now.
1502       if(!(VA.isRegLoc() && NextVA.isRegLoc())) return false;
1503
1504       AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1505                               TII.get(ARM::VMOVRRD), VA.getLocReg())
1506                       .addReg(NextVA.getLocReg(), RegState::Define)
1507                       .addReg(Arg));
1508       RegArgs.push_back(VA.getLocReg());
1509       RegArgs.push_back(NextVA.getLocReg());
1510     } else {
1511       assert(VA.isMemLoc());
1512       // Need to store on the stack.
1513       Address Addr;
1514       Addr.BaseType = Address::RegBase;
1515       Addr.Base.Reg = ARM::SP;
1516       Addr.Offset = VA.getLocMemOffset();
1517
1518       if (!ARMEmitStore(ArgVT, Arg, Addr)) return false;
1519     }
1520   }
1521   return true;
1522 }
1523
1524 bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
1525                              const Instruction *I, CallingConv::ID CC,
1526                              unsigned &NumBytes) {
1527   // Issue CALLSEQ_END
1528   unsigned AdjStackUp = TM.getRegisterInfo()->getCallFrameDestroyOpcode();
1529   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1530                           TII.get(AdjStackUp))
1531                   .addImm(NumBytes).addImm(0));
1532
1533   // Now the return value.
1534   if (RetVT != MVT::isVoid) {
1535     SmallVector<CCValAssign, 16> RVLocs;
1536     CCState CCInfo(CC, false, TM, RVLocs, *Context);
1537     CCInfo.AnalyzeCallResult(RetVT, CCAssignFnForCall(CC, true));
1538
1539     // Copy all of the result registers out of their specified physreg.
1540     if (RVLocs.size() == 2 && RetVT == MVT::f64) {
1541       // For this move we copy into two registers and then move into the
1542       // double fp reg we want.
1543       EVT DestVT = RVLocs[0].getValVT();
1544       TargetRegisterClass* DstRC = TLI.getRegClassFor(DestVT);
1545       unsigned ResultReg = createResultReg(DstRC);
1546       AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1547                               TII.get(ARM::VMOVDRR), ResultReg)
1548                       .addReg(RVLocs[0].getLocReg())
1549                       .addReg(RVLocs[1].getLocReg()));
1550
1551       UsedRegs.push_back(RVLocs[0].getLocReg());
1552       UsedRegs.push_back(RVLocs[1].getLocReg());
1553
1554       // Finally update the result.
1555       UpdateValueMap(I, ResultReg);
1556     } else {
1557       assert(RVLocs.size() == 1 &&"Can't handle non-double multi-reg retvals!");
1558       EVT CopyVT = RVLocs[0].getValVT();
1559       TargetRegisterClass* DstRC = TLI.getRegClassFor(CopyVT);
1560
1561       unsigned ResultReg = createResultReg(DstRC);
1562       BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
1563               ResultReg).addReg(RVLocs[0].getLocReg());
1564       UsedRegs.push_back(RVLocs[0].getLocReg());
1565
1566       // Finally update the result.
1567       UpdateValueMap(I, ResultReg);
1568     }
1569   }
1570
1571   return true;
1572 }
1573
1574 bool ARMFastISel::SelectRet(const Instruction *I) {
1575   const ReturnInst *Ret = cast<ReturnInst>(I);
1576   const Function &F = *I->getParent()->getParent();
1577
1578   if (!FuncInfo.CanLowerReturn)
1579     return false;
1580
1581   if (F.isVarArg())
1582     return false;
1583
1584   CallingConv::ID CC = F.getCallingConv();
1585   if (Ret->getNumOperands() > 0) {
1586     SmallVector<ISD::OutputArg, 4> Outs;
1587     GetReturnInfo(F.getReturnType(), F.getAttributes().getRetAttributes(),
1588                   Outs, TLI);
1589
1590     // Analyze operands of the call, assigning locations to each operand.
1591     SmallVector<CCValAssign, 16> ValLocs;
1592     CCState CCInfo(CC, F.isVarArg(), TM, ValLocs, I->getContext());
1593     CCInfo.AnalyzeReturn(Outs, CCAssignFnForCall(CC, true /* is Ret */));
1594
1595     const Value *RV = Ret->getOperand(0);
1596     unsigned Reg = getRegForValue(RV);
1597     if (Reg == 0)
1598       return false;
1599
1600     // Only handle a single return value for now.
1601     if (ValLocs.size() != 1)
1602       return false;
1603
1604     CCValAssign &VA = ValLocs[0];
1605
1606     // Don't bother handling odd stuff for now.
1607     if (VA.getLocInfo() != CCValAssign::Full)
1608       return false;
1609     // Only handle register returns for now.
1610     if (!VA.isRegLoc())
1611       return false;
1612     // TODO: For now, don't try to handle cases where getLocInfo()
1613     // says Full but the types don't match.
1614     if (TLI.getValueType(RV->getType()) != VA.getValVT())
1615       return false;
1616
1617     // Make the copy.
1618     unsigned SrcReg = Reg + VA.getValNo();
1619     unsigned DstReg = VA.getLocReg();
1620     const TargetRegisterClass* SrcRC = MRI.getRegClass(SrcReg);
1621     // Avoid a cross-class copy. This is very unlikely.
1622     if (!SrcRC->contains(DstReg))
1623       return false;
1624     BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
1625             DstReg).addReg(SrcReg);
1626
1627     // Mark the register as live out of the function.
1628     MRI.addLiveOut(VA.getLocReg());
1629   }
1630
1631   unsigned RetOpc = isThumb ? ARM::tBX_RET : ARM::BX_RET;
1632   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1633                           TII.get(RetOpc)));
1634   return true;
1635 }
1636
1637 unsigned ARMFastISel::ARMSelectCallOp(const GlobalValue *GV) {
1638
1639   // Depend our opcode for thumb on whether or not we're targeting an
1640   // externally callable function. For libcalls we'll just pass a NULL GV
1641   // in here.
1642   bool isExternal = false;
1643   if (!GV || GV->hasExternalLinkage()) isExternal = true;
1644   
1645   // Darwin needs the r9 versions of the opcodes.
1646   bool isDarwin = Subtarget->isTargetDarwin();
1647   if (isThumb && isExternal) {
1648     return isDarwin ? ARM::tBLXi_r9 : ARM::tBLXi;
1649   } else if (isThumb) {
1650     return isDarwin ? ARM::tBLr9 : ARM::tBL;
1651   } else  {
1652     return isDarwin ? ARM::BLr9 : ARM::BL;
1653   }
1654 }
1655
1656 // A quick function that will emit a call for a named libcall in F with the
1657 // vector of passed arguments for the Instruction in I. We can assume that we
1658 // can emit a call for any libcall we can produce. This is an abridged version
1659 // of the full call infrastructure since we won't need to worry about things
1660 // like computed function pointers or strange arguments at call sites.
1661 // TODO: Try to unify this and the normal call bits for ARM, then try to unify
1662 // with X86.
1663 bool ARMFastISel::ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call) {
1664   CallingConv::ID CC = TLI.getLibcallCallingConv(Call);
1665
1666   // Handle *simple* calls for now.
1667   const Type *RetTy = I->getType();
1668   MVT RetVT;
1669   if (RetTy->isVoidTy())
1670     RetVT = MVT::isVoid;
1671   else if (!isTypeLegal(RetTy, RetVT))
1672     return false;
1673
1674   // For now we're using BLX etc on the assumption that we have v5t ops.
1675   if (!Subtarget->hasV5TOps()) return false;
1676
1677   // TODO: For now if we have long calls specified we don't handle the call.
1678   if (EnableARMLongCalls) return false;
1679
1680   // Set up the argument vectors.
1681   SmallVector<Value*, 8> Args;
1682   SmallVector<unsigned, 8> ArgRegs;
1683   SmallVector<MVT, 8> ArgVTs;
1684   SmallVector<ISD::ArgFlagsTy, 8> ArgFlags;
1685   Args.reserve(I->getNumOperands());
1686   ArgRegs.reserve(I->getNumOperands());
1687   ArgVTs.reserve(I->getNumOperands());
1688   ArgFlags.reserve(I->getNumOperands());
1689   for (unsigned i = 0; i < I->getNumOperands(); ++i) {
1690     Value *Op = I->getOperand(i);
1691     unsigned Arg = getRegForValue(Op);
1692     if (Arg == 0) return false;
1693
1694     const Type *ArgTy = Op->getType();
1695     MVT ArgVT;
1696     if (!isTypeLegal(ArgTy, ArgVT)) return false;
1697
1698     ISD::ArgFlagsTy Flags;
1699     unsigned OriginalAlignment = TD.getABITypeAlignment(ArgTy);
1700     Flags.setOrigAlign(OriginalAlignment);
1701
1702     Args.push_back(Op);
1703     ArgRegs.push_back(Arg);
1704     ArgVTs.push_back(ArgVT);
1705     ArgFlags.push_back(Flags);
1706   }
1707
1708   // Handle the arguments now that we've gotten them.
1709   SmallVector<unsigned, 4> RegArgs;
1710   unsigned NumBytes;
1711   if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags, RegArgs, CC, NumBytes))
1712     return false;
1713
1714   // Issue the call, BLXr9 for darwin, BLX otherwise. This uses V5 ops.
1715   // TODO: Turn this into the table of arm call ops.
1716   MachineInstrBuilder MIB;
1717   unsigned CallOpc = ARMSelectCallOp(NULL);
1718   if(isThumb)
1719     // Explicitly adding the predicate here.
1720     MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1721                          TII.get(CallOpc)))
1722                          .addExternalSymbol(TLI.getLibcallName(Call));
1723   else
1724     // Explicitly adding the predicate here.
1725     MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1726                          TII.get(CallOpc))
1727           .addExternalSymbol(TLI.getLibcallName(Call)));
1728
1729   // Add implicit physical register uses to the call.
1730   for (unsigned i = 0, e = RegArgs.size(); i != e; ++i)
1731     MIB.addReg(RegArgs[i]);
1732
1733   // Finish off the call including any return values.
1734   SmallVector<unsigned, 4> UsedRegs;
1735   if (!FinishCall(RetVT, UsedRegs, I, CC, NumBytes)) return false;
1736
1737   // Set all unused physreg defs as dead.
1738   static_cast<MachineInstr *>(MIB)->setPhysRegsDeadExcept(UsedRegs, TRI);
1739
1740   return true;
1741 }
1742
1743 bool ARMFastISel::SelectCall(const Instruction *I) {
1744   const CallInst *CI = cast<CallInst>(I);
1745   const Value *Callee = CI->getCalledValue();
1746
1747   // Can't handle inline asm or worry about intrinsics yet.
1748   if (isa<InlineAsm>(Callee) || isa<IntrinsicInst>(CI)) return false;
1749
1750   // Only handle global variable Callees that are direct calls.
1751   const GlobalValue *GV = dyn_cast<GlobalValue>(Callee);
1752   if (!GV || Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel()))
1753     return false;
1754
1755   // Check the calling convention.
1756   ImmutableCallSite CS(CI);
1757   CallingConv::ID CC = CS.getCallingConv();
1758
1759   // TODO: Avoid some calling conventions?
1760
1761   // Let SDISel handle vararg functions.
1762   const PointerType *PT = cast<PointerType>(CS.getCalledValue()->getType());
1763   const FunctionType *FTy = cast<FunctionType>(PT->getElementType());
1764   if (FTy->isVarArg())
1765     return false;
1766
1767   // Handle *simple* calls for now.
1768   const Type *RetTy = I->getType();
1769   MVT RetVT;
1770   if (RetTy->isVoidTy())
1771     RetVT = MVT::isVoid;
1772   else if (!isTypeLegal(RetTy, RetVT))
1773     return false;
1774
1775   // For now we're using BLX etc on the assumption that we have v5t ops.
1776   // TODO: Maybe?
1777   if (!Subtarget->hasV5TOps()) return false;
1778
1779   // TODO: For now if we have long calls specified we don't handle the call.
1780   if (EnableARMLongCalls) return false;
1781   
1782   // Set up the argument vectors.
1783   SmallVector<Value*, 8> Args;
1784   SmallVector<unsigned, 8> ArgRegs;
1785   SmallVector<MVT, 8> ArgVTs;
1786   SmallVector<ISD::ArgFlagsTy, 8> ArgFlags;
1787   Args.reserve(CS.arg_size());
1788   ArgRegs.reserve(CS.arg_size());
1789   ArgVTs.reserve(CS.arg_size());
1790   ArgFlags.reserve(CS.arg_size());
1791   for (ImmutableCallSite::arg_iterator i = CS.arg_begin(), e = CS.arg_end();
1792        i != e; ++i) {
1793     unsigned Arg = getRegForValue(*i);
1794
1795     if (Arg == 0)
1796       return false;
1797     ISD::ArgFlagsTy Flags;
1798     unsigned AttrInd = i - CS.arg_begin() + 1;
1799     if (CS.paramHasAttr(AttrInd, Attribute::SExt))
1800       Flags.setSExt();
1801     if (CS.paramHasAttr(AttrInd, Attribute::ZExt))
1802       Flags.setZExt();
1803
1804          // FIXME: Only handle *easy* calls for now.
1805     if (CS.paramHasAttr(AttrInd, Attribute::InReg) ||
1806         CS.paramHasAttr(AttrInd, Attribute::StructRet) ||
1807         CS.paramHasAttr(AttrInd, Attribute::Nest) ||
1808         CS.paramHasAttr(AttrInd, Attribute::ByVal))
1809       return false;
1810
1811     const Type *ArgTy = (*i)->getType();
1812     MVT ArgVT;
1813     if (!isTypeLegal(ArgTy, ArgVT))
1814       return false;
1815     unsigned OriginalAlignment = TD.getABITypeAlignment(ArgTy);
1816     Flags.setOrigAlign(OriginalAlignment);
1817
1818     Args.push_back(*i);
1819     ArgRegs.push_back(Arg);
1820     ArgVTs.push_back(ArgVT);
1821     ArgFlags.push_back(Flags);
1822   }
1823
1824   // Handle the arguments now that we've gotten them.
1825   SmallVector<unsigned, 4> RegArgs;
1826   unsigned NumBytes;
1827   if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags, RegArgs, CC, NumBytes))
1828     return false;
1829
1830   // Issue the call, BLXr9 for darwin, BLX otherwise. This uses V5 ops.
1831   // TODO: Turn this into the table of arm call ops.
1832   MachineInstrBuilder MIB;
1833   unsigned CallOpc = ARMSelectCallOp(GV);
1834   // Explicitly adding the predicate here.
1835   if(isThumb)
1836     // Explicitly adding the predicate here.
1837     MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1838                          TII.get(CallOpc)))
1839           .addGlobalAddress(GV, 0, 0);
1840   else
1841     // Explicitly adding the predicate here.
1842     MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
1843                          TII.get(CallOpc))
1844           .addGlobalAddress(GV, 0, 0));
1845   
1846   // Add implicit physical register uses to the call.
1847   for (unsigned i = 0, e = RegArgs.size(); i != e; ++i)
1848     MIB.addReg(RegArgs[i]);
1849
1850   // Finish off the call including any return values.
1851   SmallVector<unsigned, 4> UsedRegs;
1852   if (!FinishCall(RetVT, UsedRegs, I, CC, NumBytes)) return false;
1853
1854   // Set all unused physreg defs as dead.
1855   static_cast<MachineInstr *>(MIB)->setPhysRegsDeadExcept(UsedRegs, TRI);
1856
1857   return true;
1858
1859 }
1860
1861 // TODO: SoftFP support.
1862 bool ARMFastISel::TargetSelectInstruction(const Instruction *I) {
1863
1864   switch (I->getOpcode()) {
1865     case Instruction::Load:
1866       return SelectLoad(I);
1867     case Instruction::Store:
1868       return SelectStore(I);
1869     case Instruction::Br:
1870       return SelectBranch(I);
1871     case Instruction::ICmp:
1872     case Instruction::FCmp:
1873       return SelectCmp(I);
1874     case Instruction::FPExt:
1875       return SelectFPExt(I);
1876     case Instruction::FPTrunc:
1877       return SelectFPTrunc(I);
1878     case Instruction::SIToFP:
1879       return SelectSIToFP(I);
1880     case Instruction::FPToSI:
1881       return SelectFPToSI(I);
1882     case Instruction::FAdd:
1883       return SelectBinaryOp(I, ISD::FADD);
1884     case Instruction::FSub:
1885       return SelectBinaryOp(I, ISD::FSUB);
1886     case Instruction::FMul:
1887       return SelectBinaryOp(I, ISD::FMUL);
1888     case Instruction::SDiv:
1889       return SelectSDiv(I);
1890     case Instruction::SRem:
1891       return SelectSRem(I);
1892     case Instruction::Call:
1893       return SelectCall(I);
1894     case Instruction::Select:
1895       return SelectSelect(I);
1896     case Instruction::Ret:
1897       return SelectRet(I);
1898     default: break;
1899   }
1900   return false;
1901 }
1902
1903 namespace llvm {
1904   llvm::FastISel *ARM::createFastISel(FunctionLoweringInfo &funcInfo) {
1905     // Completely untested on non-darwin.
1906     const TargetMachine &TM = funcInfo.MF->getTarget();
1907
1908     // Darwin and thumb1 only for now.
1909     const ARMSubtarget *Subtarget = &TM.getSubtarget<ARMSubtarget>();
1910     if (Subtarget->isTargetDarwin() && !Subtarget->isThumb1Only() &&
1911         !DisableARMFastISel)
1912       return new ARMFastISel(funcInfo);
1913     return 0;
1914   }
1915 }