FastISel.cpp revision dc9185657593b5c1db86cb95a04a68fc09194993
1b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman///===-- FastISel.cpp - Implementation of the FastISel class --------------===//
2b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
3b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//                     The LLVM Compiler Infrastructure
4b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
5b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file is distributed under the University of Illinois Open Source
6b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// License. See LICENSE.TXT for details.
7b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
8b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===//
9b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
10b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file contains the implementation of the FastISel class.
11b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
125ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// "Fast" instruction selection is designed to emit very poor code quickly.
135ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// Also, it is not designed to be able to do much lowering, so most illegal
1444d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// types (e.g. i64 on 32-bit targets) and operations are not supported.  It is
1544d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// also not intended to be able to do much optimization, except in a few cases
1644d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// where doing optimizations reduces overall compile time.  For example, folding
1744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// constants into immediate fields is often done, because it's cheap and it
1844d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// reduces the number of instructions later phases have to examine.
195ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman//
205ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// "Fast" instruction selection is able to fail gracefully and transfer
215ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// control to the SelectionDAG selector for operations that it doesn't
2244d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// support.  In many cases, this allows us to avoid duplicating a lot of
235ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// the complicated lowering logic that SelectionDAG currently has.
245ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman//
255ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// The intended use for "fast" instruction selection is "-O0" mode
265ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// compilation, where the quality of the generated code is irrelevant when
2744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// weighed against the speed at which the code can be generated.  Also,
285ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// at -O0, the LLVM optimizers are not running, and this makes the
295ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// compile time of codegen a much higher portion of the overall compile
3044d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// time.  Despite its limitations, "fast" instruction selection is able to
315ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// handle enough code on its own to provide noticeable overall speedups
325ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// in -O0 compiles.
335ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman//
345ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// Basic operations are supported in a target-independent way, by reading
355ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// the same instruction descriptions that the SelectionDAG selector reads,
365ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// and identifying simple arithmetic operations that can be directly selected
3744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// from simple operators.  More complicated operations currently require
385ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// target-specific code.
395ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman//
40b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===//
41b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
4233134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/Function.h"
4333134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/GlobalVariable.h"
446f2766d59744bb3d48867f3151643eac7111e773Dan Gohman#include "llvm/Instructions.h"
4533134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/IntrinsicInst.h"
46b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/FastISel.h"
47b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h"
4833134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/CodeGen/MachineModuleInfo.h"
49b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h"
5083489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel#include "llvm/CodeGen/DwarfWriter.h"
5183489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel#include "llvm/Analysis/DebugInfo.h"
5283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetData.h"
53b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/Target/TargetInstrInfo.h"
5483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetLowering.h"
55bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman#include "llvm/Target/TargetMachine.h"
562048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman#include "SelectionDAGBuilder.h"
5766336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman#include "FunctionLoweringInfo.h"
58b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanusing namespace llvm;
59b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
603df24e667f04a7003342b534310919abc9c87418Dan Gohmanunsigned FastISel::getRegForValue(Value *V) {
61e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT RealVT = TLI.getValueType(V->getType(), /*AllowUnknown=*/true);
624fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman  // Don't handle non-simple values in FastISel.
634fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman  if (!RealVT.isSimple())
644fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman    return 0;
65821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman
66c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // Ignore illegal types. We must do this before looking up the value
67c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // in ValueMap because Arguments are given virtual registers regardless
68c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // of whether FastISel can handle them.
69825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  MVT VT = RealVT.getSimpleVT();
70821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman  if (!TLI.isTypeLegal(VT)) {
71825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    // Promote MVT::i1 to a legal type though, because it's common and easy.
72825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i1)
7323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson      VT = TLI.getTypeToTransformTo(V->getContext(), VT).getSimpleVT();
74821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman    else
75821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman      return 0;
76821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman  }
77821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman
78c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // Look up the value to see if we already have a register for it. We
79c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // cache values defined by Instructions across blocks, and other values
80c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // only locally. This is because Instructions already have the SSA
815c9cf19d1e7d044e786f03331bc3f004966a69d2Dan Gohman  // def-dominates-use requirement enforced.
82c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (ValueMap.count(V))
83c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    return ValueMap[V];
84c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  unsigned Reg = LocalValueMap[V];
85c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (Reg != 0)
86c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    return Reg;
87c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
88ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
892ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman    if (CI->getValue().getActiveBits() <= 64)
902ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman      Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue());
910586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  } else if (isa<AllocaInst>(V)) {
922ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman    Reg = TargetMaterializeAlloca(cast<AllocaInst>(V));
93205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman  } else if (isa<ConstantPointerNull>(V)) {
941e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman    // Translate this as an integer zero so that it can be
951e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman    // local-CSE'd with actual integer zeros.
961d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Reg =
971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      getRegForValue(Constant::getNullValue(TD.getIntPtrType(V->getContext())));
98ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
99104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman    Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF);
100ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
101ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (!Reg) {
102ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      const APFloat &Flt = CF->getValueAPF();
103e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson      EVT IntVT = TLI.getPointerTy();
104ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
105ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      uint64_t x[2];
106ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      uint32_t IntBitWidth = IntVT.getSizeInBits();
10723a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen      bool isExact;
10823a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen      (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true,
10923a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen                                APFloat::rmTowardZero, &isExact);
11023a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen      if (isExact) {
1112ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman        APInt IntVal(IntBitWidth, 2, x);
112ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
113e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson        unsigned IntegerReg =
114eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson          getRegForValue(ConstantInt::get(V->getContext(), IntVal));
1152ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman        if (IntegerReg != 0)
1162ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman          Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg);
1172ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman      }
118ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    }
11940b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman  } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
12040b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman    if (!SelectOperator(CE, CE->getOpcode())) return 0;
12140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman    Reg = LocalValueMap[CE];
122205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman  } else if (isa<UndefValue>(V)) {
123104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman    Reg = createResultReg(TLI.getRegClassFor(VT));
1249bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, TII.get(TargetInstrInfo::IMPLICIT_DEF), Reg);
125ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  }
126d5d81a457b5ff758b3fcc527af38827490bc68a5Owen Anderson
127dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman  // If target-independent code couldn't handle the value, give target-specific
128dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman  // code a try.
1296e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson  if (!Reg && isa<Constant>(V))
1302ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman    Reg = TargetMaterializeConstant(cast<Constant>(V));
1316e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson
1322ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman  // Don't cache constant materializations in the general ValueMap.
1332ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman  // To do so would require tracking what uses they dominate.
134dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman  if (Reg != 0)
135dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman    LocalValueMap[V] = Reg;
136104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman  return Reg;
137ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman}
138ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
13959fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Chengunsigned FastISel::lookUpRegForValue(Value *V) {
14059fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  // Look up the value to see if we already have a register for it. We
14159fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  // cache values defined by Instructions across blocks, and other values
14259fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  // only locally. This is because Instructions already have the SSA
14359fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  // def-dominatess-use requirement enforced.
14459fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  if (ValueMap.count(V))
14559fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng    return ValueMap[V];
14659fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng  return LocalValueMap[V];
14759fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng}
14859fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng
149cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// UpdateValueMap - Update the value map to include the new mapping for this
150cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// instruction, or insert an extra copy to get the result in a previous
151cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// determined register.
152cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// NOTE: This is only necessary because we might select a block that uses
153cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// a value before we select the block that defines the value.  It might be
154cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// possible to fix this by selecting blocks in reverse postorder.
155c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattnerunsigned FastISel::UpdateValueMap(Value* I, unsigned Reg) {
15640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman  if (!isa<Instruction>(I)) {
15740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman    LocalValueMap[I] = Reg;
158c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner    return Reg;
159c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner  }
160c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner
161c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner  unsigned &AssignedReg = ValueMap[I];
162c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner  if (AssignedReg == 0)
163c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner    AssignedReg = Reg;
16436e3946ac2f30a0bda66538ef2b974b1c8fbdc97Chris Lattner  else if (Reg != AssignedReg) {
165c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner    const TargetRegisterClass *RegClass = MRI.getRegClass(Reg);
166c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner    TII.copyRegToReg(*MBB, MBB->end(), AssignedReg,
167c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner                     Reg, RegClass, RegClass);
16840b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman  }
169c5040ab6065d5c569a1af0848b6e672b22b174b7Chris Lattner  return AssignedReg;
170cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson}
171cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson
172c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohmanunsigned FastISel::getRegForGEPIndex(Value *Idx) {
173c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  unsigned IdxN = getRegForValue(Idx);
174c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (IdxN == 0)
175c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    // Unhandled operand. Halt "fast" selection and bail.
176c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    return 0;
177c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
178c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // If the index is smaller or larger than intptr_t, truncate or extend it.
179766b5efd99c01e26f00f22d81b57d1385b3d2ab0Owen Anderson  MVT PtrVT = TLI.getPointerTy();
180e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT IdxVT = EVT::getEVT(Idx->getType(), /*HandleUnknown=*/false);
181c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (IdxVT.bitsLT(PtrVT))
182766b5efd99c01e26f00f22d81b57d1385b3d2ab0Owen Anderson    IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::SIGN_EXTEND, IdxN);
183c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  else if (IdxVT.bitsGT(PtrVT))
184766b5efd99c01e26f00f22d81b57d1385b3d2ab0Owen Anderson    IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::TRUNCATE, IdxN);
185c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  return IdxN;
186c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman}
187c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
188bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// SelectBinaryOp - Select and emit code for a binary operator instruction,
189bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// which has an opcode which directly corresponds to the given ISD opcode.
190bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman///
1917c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanbool FastISel::SelectBinaryOp(User *I, unsigned ISDOpcode) {
192e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = EVT::getEVT(I->getType(), /*HandleUnknown=*/true);
193825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::Other || !VT.isSimple())
194d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman    // Unhandled type. Halt "fast" selection and bail.
195d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman    return false;
196638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman
197b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman  // We only handle legal types. For example, on x86-32 the instruction
198b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman  // selector contains all of the 64-bit instructions from x86-64,
199b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman  // under the assumption that i64 won't be used if the target doesn't
200b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman  // support it.
201638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman  if (!TLI.isTypeLegal(VT)) {
202825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    // MVT::i1 is special. Allow AND, OR, or XOR because they
203638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman    // don't require additional zeroing, which makes them easy.
204825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i1 &&
2055dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman        (ISDOpcode == ISD::AND || ISDOpcode == ISD::OR ||
2065dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman         ISDOpcode == ISD::XOR))
20723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson      VT = TLI.getTypeToTransformTo(I->getContext(), VT);
208638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman    else
209638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman      return false;
210638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman  }
211d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
2123df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned Op0 = getRegForValue(I->getOperand(0));
213d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  if (Op0 == 0)
214a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman    // Unhandled operand. Halt "fast" selection and bail.
215a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman    return false;
216a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman
217d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  // Check if the second operand is a constant and handle it appropriately.
218d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) {
219ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    unsigned ResultReg = FastEmit_ri(VT.getSimpleVT(), VT.getSimpleVT(),
220ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                                     ISDOpcode, Op0, CI->getZExtValue());
221ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (ResultReg != 0) {
222ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      // We successfully emitted code for the given LLVM Instruction.
2233df24e667f04a7003342b534310919abc9c87418Dan Gohman      UpdateValueMap(I, ResultReg);
224ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      return true;
225ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    }
226d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  }
227d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
22810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  // Check if the second operand is a constant float.
22910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  if (ConstantFP *CF = dyn_cast<ConstantFP>(I->getOperand(1))) {
230ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    unsigned ResultReg = FastEmit_rf(VT.getSimpleVT(), VT.getSimpleVT(),
231ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                                     ISDOpcode, Op0, CF);
232ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (ResultReg != 0) {
233ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      // We successfully emitted code for the given LLVM Instruction.
2343df24e667f04a7003342b534310919abc9c87418Dan Gohman      UpdateValueMap(I, ResultReg);
235ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      return true;
236ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    }
23710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  }
23810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
2393df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned Op1 = getRegForValue(I->getOperand(1));
240d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  if (Op1 == 0)
241d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman    // Unhandled operand. Halt "fast" selection and bail.
242bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman    return false;
243bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
244ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // Now we have both operands in registers. Emit the instruction.
2450f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson  unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(),
2460f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson                                   ISDOpcode, Op0, Op1);
247bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman  if (ResultReg == 0)
248bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman    // Target-specific code wasn't able to find a machine opcode for
249bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman    // the given ISD opcode and type. Halt "fast" selection and bail.
250bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman    return false;
251bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
2528014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman  // We successfully emitted code for the given LLVM Instruction.
2533df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, ResultReg);
254bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman  return true;
255bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman}
256bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
25740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectGetElementPtr(User *I) {
2583df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned N = getRegForValue(I->getOperand(0));
25983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  if (N == 0)
26083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    // Unhandled operand. Halt "fast" selection and bail.
26183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    return false;
26283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
26383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  const Type *Ty = I->getOperand(0)->getType();
264825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  MVT VT = TLI.getPointerTy();
26583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end();
26683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng       OI != E; ++OI) {
26783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    Value *Idx = *OI;
26883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    if (const StructType *StTy = dyn_cast<StructType>(Ty)) {
26983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      unsigned Field = cast<ConstantInt>(Idx)->getZExtValue();
27083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      if (Field) {
27183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        // N = N + Offset
27283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field);
27383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        // FIXME: This can be optimized by combining the add with a
27483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        // subsequent one.
2757a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman        N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT);
27683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        if (N == 0)
27783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng          // Unhandled operand. Halt "fast" selection and bail.
27883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng          return false;
27983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      }
28083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      Ty = StTy->getElementType(Field);
28183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    } else {
28283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      Ty = cast<SequentialType>(Ty)->getElementType();
28383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
28483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      // If this is a constant subscript, handle it quickly.
28583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) {
28683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        if (CI->getZExtValue() == 0) continue;
28783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        uint64_t Offs =
288777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands          TD.getTypeAllocSize(Ty)*cast<ConstantInt>(CI)->getSExtValue();
2897a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman        N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT);
29083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        if (N == 0)
29183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng          // Unhandled operand. Halt "fast" selection and bail.
29283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng          return false;
29383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        continue;
29483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      }
29583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
29683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      // N = N + Idx * ElementSize;
297777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands      uint64_t ElementSize = TD.getTypeAllocSize(Ty);
298c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman      unsigned IdxN = getRegForGEPIndex(Idx);
29983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      if (IdxN == 0)
30083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        // Unhandled operand. Halt "fast" selection and bail.
30183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        return false;
30283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
30380bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman      if (ElementSize != 1) {
304f93cf79505f07cb97597fbc5955462ad7670ca5cDan Gohman        IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT);
30580bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman        if (IdxN == 0)
30680bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman          // Unhandled operand. Halt "fast" selection and bail.
30780bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman          return false;
30880bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman      }
3090f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson      N = FastEmit_rr(VT, VT, ISD::ADD, N, IdxN);
31083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng      if (N == 0)
31183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        // Unhandled operand. Halt "fast" selection and bail.
31283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng        return false;
31383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    }
31483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  }
31583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
31683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  // We successfully emitted code for the given LLVM Instruction.
3173df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, N);
31883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  return true;
319bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman}
320bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
32133134c4a75558288d663267c8991f6bd37a530afDan Gohmanbool FastISel::SelectCall(User *I) {
32233134c4a75558288d663267c8991f6bd37a530afDan Gohman  Function *F = cast<CallInst>(I)->getCalledFunction();
32333134c4a75558288d663267c8991f6bd37a530afDan Gohman  if (!F) return false;
32433134c4a75558288d663267c8991f6bd37a530afDan Gohman
32533134c4a75558288d663267c8991f6bd37a530afDan Gohman  unsigned IID = F->getIntrinsicID();
32633134c4a75558288d663267c8991f6bd37a530afDan Gohman  switch (IID) {
32733134c4a75558288d663267c8991f6bd37a530afDan Gohman  default: break;
32892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling  case Intrinsic::dbg_declare: {
32992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling    DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
330bf0ca2b477e761e2c81f6c36d6c7bec055933b15Chris Lattner    if (!DIDescriptor::ValidDebugInfo(DI->getVariable(), CodeGenOpt::None)||!DW
3317e1e31f467d87c834d8baf673929865907901313Devang Patel        || !DW->ShouldEmitDwarfDebug())
3327e1e31f467d87c834d8baf673929865907901313Devang Patel      return true;
33392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling
3347e1e31f467d87c834d8baf673929865907901313Devang Patel    Value *Address = DI->getAddress();
335dc9185657593b5c1db86cb95a04a68fc09194993Dale Johannesen    if (!Address)
336dc9185657593b5c1db86cb95a04a68fc09194993Dale Johannesen      return true;
3377e1e31f467d87c834d8baf673929865907901313Devang Patel    AllocaInst *AI = dyn_cast<AllocaInst>(Address);
3387e1e31f467d87c834d8baf673929865907901313Devang Patel    // Don't handle byval struct arguments or VLAs, for example.
3397e1e31f467d87c834d8baf673929865907901313Devang Patel    if (!AI) break;
3407e1e31f467d87c834d8baf673929865907901313Devang Patel    DenseMap<const AllocaInst*, int>::iterator SI =
3417e1e31f467d87c834d8baf673929865907901313Devang Patel      StaticAllocaMap.find(AI);
3427e1e31f467d87c834d8baf673929865907901313Devang Patel    if (SI == StaticAllocaMap.end()) break; // VLAs.
3437e1e31f467d87c834d8baf673929865907901313Devang Patel    int FI = SI->second;
34453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel    if (MMI) {
3453990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner      if (MDNode *Dbg = DI->getMetadata("dbg"))
3460eb419800ae51d6e0e00a656ede0627483755361Chris Lattner        MMI->setVariableDbgInfo(DI->getVariable(), FI, Dbg);
34753bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel    }
3485ed17ae92a9239c2ff7d3ba494bf96651598ee7aDale Johannesen    // Building the map above is target independent.  Generating DEBUG_VALUE
3495ed17ae92a9239c2ff7d3ba494bf96651598ee7aDale Johannesen    // inline is target dependent; do this now.
3505ed17ae92a9239c2ff7d3ba494bf96651598ee7aDale Johannesen    (void)TargetSelectInstruction(cast<Instruction>(I));
35133134c4a75558288d663267c8991f6bd37a530afDan Gohman    return true;
35292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling  }
353dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  case Intrinsic::eh_exception: {
354e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = TLI.getValueType(I->getType());
355dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    switch (TLI.getOperationAction(ISD::EXCEPTIONADDR, VT)) {
356dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    default: break;
357dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    case TargetLowering::Expand: {
358b0f1e1780c736c62fb99e5824825d2a60a53b53bDuncan Sands      assert(MBB->isLandingPad() && "Call to eh.exception not in landing pad!");
359dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      unsigned Reg = TLI.getExceptionAddressRegister();
360dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      const TargetRegisterClass *RC = TLI.getRegClassFor(VT);
361dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      unsigned ResultReg = createResultReg(RC);
362dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
363dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                                           Reg, RC, RC);
364dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      assert(InsertedCopy && "Can't copy address registers!");
36524ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng      InsertedCopy = InsertedCopy;
366dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      UpdateValueMap(I, ResultReg);
367dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      return true;
368dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
369dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
370dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    break;
371dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  }
372b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  case Intrinsic::eh_selector: {
373e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = TLI.getValueType(I->getType());
374dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    switch (TLI.getOperationAction(ISD::EHSELECTION, VT)) {
375dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    default: break;
376dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    case TargetLowering::Expand: {
377dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      if (MMI) {
378dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        if (MBB->isLandingPad())
379dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman          AddCatchInfo(*cast<CallInst>(I), MMI, MBB);
380dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        else {
381dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
382dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman          CatchInfoLost.insert(cast<CallInst>(I));
383dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
384dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman          // FIXME: Mark exception selector register as live in.  Hack for PR1508.
385dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman          unsigned Reg = TLI.getExceptionSelectorRegister();
386dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman          if (Reg) MBB->addLiveIn(Reg);
387dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        }
388dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman
389dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        unsigned Reg = TLI.getExceptionSelectorRegister();
390b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        EVT SrcVT = TLI.getPointerTy();
391b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        const TargetRegisterClass *RC = TLI.getRegClassFor(SrcVT);
392dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        unsigned ResultReg = createResultReg(RC);
393b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, Reg,
394b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                                             RC, RC);
395dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        assert(InsertedCopy && "Can't copy address registers!");
39624ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng        InsertedCopy = InsertedCopy;
397b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands
398b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        // Cast the register to the type of the selector.
399b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        if (SrcVT.bitsGT(MVT::i32))
400b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands          ResultReg = FastEmit_r(SrcVT.getSimpleVT(), MVT::i32, ISD::TRUNCATE,
401b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                                 ResultReg);
402b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        else if (SrcVT.bitsLT(MVT::i32))
403b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands          ResultReg = FastEmit_r(SrcVT.getSimpleVT(), MVT::i32,
404b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                                 ISD::SIGN_EXTEND, ResultReg);
405b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        if (ResultReg == 0)
406b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands          // Unhandled operand. Halt "fast" selection and bail.
407b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands          return false;
408b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands
409dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        UpdateValueMap(I, ResultReg);
410dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      } else {
411dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        unsigned ResultReg =
412a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson          getRegForValue(Constant::getNullValue(I->getType()));
413dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        UpdateValueMap(I, ResultReg);
414dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      }
415dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      return true;
416dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
417dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
418dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    break;
419dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  }
42033134c4a75558288d663267c8991f6bd37a530afDan Gohman  }
42133134c4a75558288d663267c8991f6bd37a530afDan Gohman  return false;
42233134c4a75558288d663267c8991f6bd37a530afDan Gohman}
42333134c4a75558288d663267c8991f6bd37a530afDan Gohman
4247c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanbool FastISel::SelectCast(User *I, unsigned Opcode) {
425e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
426e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = TLI.getValueType(I->getType());
427d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
428825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
429825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      DstVT == MVT::Other || !DstVT.isSimple())
430d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled type. Halt "fast" selection and bail.
431d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
432d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
433474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // Check if the destination type is legal. Or as a special case,
434474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // it may be i1 if we're doing a truncate because that's
435474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // easy and somewhat common.
436474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  if (!TLI.isTypeLegal(DstVT))
437825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (DstVT != MVT::i1 || Opcode != ISD::TRUNCATE)
438474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman      // Unhandled type. Halt "fast" selection and bail.
439474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman      return false;
440474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman
44191b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman  // Check if the source operand is legal. Or as a special case,
44291b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman  // it may be i1 if we're doing zero-extension because that's
443474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // easy and somewhat common.
444474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  if (!TLI.isTypeLegal(SrcVT))
445825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (SrcVT != MVT::i1 || Opcode != ISD::ZERO_EXTEND)
44691b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman      // Unhandled type. Halt "fast" selection and bail.
44791b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman      return false;
448474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman
4493df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned InputReg = getRegForValue(I->getOperand(0));
450d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  if (!InputReg)
451d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled operand.  Halt "fast" selection and bail.
452d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
45314ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
45414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  // If the operand is i1, arrange for the high bits in the register to be zero.
455825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::i1) {
45623b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson   SrcVT = TLI.getTypeToTransformTo(I->getContext(), SrcVT);
45714ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman   InputReg = FastEmitZExtFromI1(SrcVT.getSimpleVT(), InputReg);
45814ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman   if (!InputReg)
45914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman     return false;
46014ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  }
461474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // If the result is i1, truncate to the target's type for i1 first.
462825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (DstVT == MVT::i1)
46323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    DstVT = TLI.getTypeToTransformTo(I->getContext(), DstVT);
46414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
465d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(),
466d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  DstVT.getSimpleVT(),
467d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  Opcode,
468d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  InputReg);
469d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  if (!ResultReg)
470d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
471d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
4723df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, ResultReg);
473d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  return true;
474d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson}
475d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
47640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBitCast(User *I) {
477ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // If the bitcast doesn't change the type, just use the operand value.
478ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (I->getType() == I->getOperand(0)->getType()) {
4793df24e667f04a7003342b534310919abc9c87418Dan Gohman    unsigned Reg = getRegForValue(I->getOperand(0));
480a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman    if (Reg == 0)
481a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman      return false;
4823df24e667f04a7003342b534310919abc9c87418Dan Gohman    UpdateValueMap(I, Reg);
483ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    return true;
484ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  }
485ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
486ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators.
487e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
488e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = TLI.getValueType(I->getType());
489d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
490825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
491825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      DstVT == MVT::Other || !DstVT.isSimple() ||
492d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson      !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT))
493d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled type. Halt "fast" selection and bail.
494d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
495d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
4963df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned Op0 = getRegForValue(I->getOperand(0));
497ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (Op0 == 0)
498ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    // Unhandled operand. Halt "fast" selection and bail.
499d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
500d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
501ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // First, try to perform the bitcast by inserting a reg-reg copy.
502ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  unsigned ResultReg = 0;
503ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) {
504ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT);
505ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT);
506ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    ResultReg = createResultReg(DstClass);
507ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
508ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
509ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                                         Op0, DstClass, SrcClass);
510ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (!InsertedCopy)
511ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      ResultReg = 0;
512ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  }
513ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
514ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // If the reg-reg copy failed, select a BIT_CONVERT opcode.
515ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (!ResultReg)
516ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(),
517ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                           ISD::BIT_CONVERT, Op0);
518ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
519ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (!ResultReg)
520d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
521d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
5223df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, ResultReg);
523d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  return true;
524d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson}
525d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
5263df24e667f04a7003342b534310919abc9c87418Dan Gohmanbool
5273df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::SelectInstruction(Instruction *I) {
5286e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  // First, try doing target-independent selection.
5296e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  if (SelectOperator(I, I->getOpcode()))
5306e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman    return true;
5316e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman
5326e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  // Next, try calling the target to attempt to handle the instruction.
5336e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  if (TargetSelectInstruction(I))
5346e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman    return true;
5356e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman
5366e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  return false;
53740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman}
53840b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman
539d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// FastEmitBranch - Emit an unconditional branch to the given block,
540d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// unless it is the immediate (fall-through) successor, and update
541d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// the CFG.
542d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohmanvoid
543d98d6203e429b2d7208b6687931e9079e85e95ecDan GohmanFastISel::FastEmitBranch(MachineBasicBlock *MSucc) {
544d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  if (MBB->isLayoutSuccessor(MSucc)) {
545d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    // The unconditional fall-through case, which needs no instructions.
546d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  } else {
547d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    // The unconditional branch case.
548d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>());
549d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  }
550d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  MBB->addSuccessor(MSucc);
551d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman}
552d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman
5533d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman/// SelectFNeg - Emit an FNeg operation.
5543d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman///
5553d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohmanbool
5563d45a853db014fdddcdb79424e663dfed5eccbc7Dan GohmanFastISel::SelectFNeg(User *I) {
5573d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  unsigned OpReg = getRegForValue(BinaryOperator::getFNegArgument(I));
5583d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (OpReg == 0) return false;
5593d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
5604a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  // If the target has ISD::FNEG, use it.
5614a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  EVT VT = TLI.getValueType(I->getType());
5624a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  unsigned ResultReg = FastEmit_r(VT.getSimpleVT(), VT.getSimpleVT(),
5634a215a13c3035a8818254b61267be77def4a2a37Dan Gohman                                  ISD::FNEG, OpReg);
5644a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  if (ResultReg != 0) {
5654a215a13c3035a8818254b61267be77def4a2a37Dan Gohman    UpdateValueMap(I, ResultReg);
5664a215a13c3035a8818254b61267be77def4a2a37Dan Gohman    return true;
5674a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  }
5684a215a13c3035a8818254b61267be77def4a2a37Dan Gohman
5695e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  // Bitcast the value to integer, twiddle the sign bit with xor,
5705e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  // and then bitcast it back to floating-point.
5713d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (VT.getSizeInBits() > 64) return false;
5725e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  EVT IntVT = EVT::getIntegerVT(I->getContext(), VT.getSizeInBits());
5735e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (!TLI.isTypeLegal(IntVT))
5745e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
5755e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
5765e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  unsigned IntReg = FastEmit_r(VT.getSimpleVT(), IntVT.getSimpleVT(),
5775e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                               ISD::BIT_CONVERT, OpReg);
5785e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (IntReg == 0)
5795e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
5805e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
5815e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  unsigned IntResultReg = FastEmit_ri_(IntVT.getSimpleVT(), ISD::XOR, IntReg,
5825e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                                       UINT64_C(1) << (VT.getSizeInBits()-1),
5835e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                                       IntVT.getSimpleVT());
5845e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (IntResultReg == 0)
5855e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
5865e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
5875e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  ResultReg = FastEmit_r(IntVT.getSimpleVT(), VT.getSimpleVT(),
5885e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                         ISD::BIT_CONVERT, IntResultReg);
5893d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (ResultReg == 0)
5903d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    return false;
5913d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
5923d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  UpdateValueMap(I, ResultReg);
5933d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  return true;
5943d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman}
5953d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
59640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool
59740b189e4e257924d90aaf63bf2e12bc7bbca961aDan GohmanFastISel::SelectOperator(User *I, unsigned Opcode) {
59840b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman  switch (Opcode) {
599ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Add:
600ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::ADD);
601ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FAdd:
602ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FADD);
603ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Sub:
604ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::SUB);
605ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FSub:
6063d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    // FNeg is currently represented in LLVM IR as a special case of FSub.
6073d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    if (BinaryOperator::isFNeg(I))
6083d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman      return SelectFNeg(I);
609ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FSUB);
610ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Mul:
611ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::MUL);
612ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FMul:
613ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FMUL);
6143df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SDiv:
6153df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SDIV);
6163df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::UDiv:
6173df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::UDIV);
6183df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FDiv:
6193df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::FDIV);
6203df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SRem:
6213df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SREM);
6223df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::URem:
6233df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::UREM);
6243df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FRem:
6253df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::FREM);
6263df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Shl:
6273df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SHL);
6283df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::LShr:
6293df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SRL);
6303df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::AShr:
6313df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SRA);
6323df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::And:
6333df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::AND);
6343df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Or:
6353df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::OR);
6363df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Xor:
6373df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::XOR);
6383df24e667f04a7003342b534310919abc9c87418Dan Gohman
6393df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::GetElementPtr:
6403df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectGetElementPtr(I);
6413df24e667f04a7003342b534310919abc9c87418Dan Gohman
6423df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Br: {
6433df24e667f04a7003342b534310919abc9c87418Dan Gohman    BranchInst *BI = cast<BranchInst>(I);
6443df24e667f04a7003342b534310919abc9c87418Dan Gohman
6453df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (BI->isUnconditional()) {
6463df24e667f04a7003342b534310919abc9c87418Dan Gohman      BasicBlock *LLVMSucc = BI->getSuccessor(0);
6473df24e667f04a7003342b534310919abc9c87418Dan Gohman      MachineBasicBlock *MSucc = MBBMap[LLVMSucc];
648d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman      FastEmitBranch(MSucc);
6493df24e667f04a7003342b534310919abc9c87418Dan Gohman      return true;
6509d5b41624003daf259b33fc953aa471049700353Owen Anderson    }
6513df24e667f04a7003342b534310919abc9c87418Dan Gohman
6523df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Conditional branches are not handed yet.
6533df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Halt "fast" selection and bail.
6543df24e667f04a7003342b534310919abc9c87418Dan Gohman    return false;
655b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  }
656b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
657087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman  case Instruction::Unreachable:
658087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman    // Nothing to emit.
659087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman    return true;
660087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman
6613df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::PHI:
6623df24e667f04a7003342b534310919abc9c87418Dan Gohman    // PHI nodes are already emitted.
6633df24e667f04a7003342b534310919abc9c87418Dan Gohman    return true;
6640586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
6650586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  case Instruction::Alloca:
6660586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    // FunctionLowering has the static-sized case covered.
6670586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    if (StaticAllocaMap.count(cast<AllocaInst>(I)))
6680586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman      return true;
6690586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
6700586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    // Dynamic-sized alloca is not handled yet.
6710586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    return false;
6723df24e667f04a7003342b534310919abc9c87418Dan Gohman
67333134c4a75558288d663267c8991f6bd37a530afDan Gohman  case Instruction::Call:
67433134c4a75558288d663267c8991f6bd37a530afDan Gohman    return SelectCall(I);
67533134c4a75558288d663267c8991f6bd37a530afDan Gohman
6763df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::BitCast:
6773df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBitCast(I);
6783df24e667f04a7003342b534310919abc9c87418Dan Gohman
6793df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FPToSI:
6803df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::FP_TO_SINT);
6813df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::ZExt:
6823df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::ZERO_EXTEND);
6833df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SExt:
6843df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::SIGN_EXTEND);
6853df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Trunc:
6863df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::TRUNCATE);
6873df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SIToFP:
6883df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::SINT_TO_FP);
6893df24e667f04a7003342b534310919abc9c87418Dan Gohman
6903df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::IntToPtr: // Deliberate fall-through.
6913df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::PtrToInt: {
692e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
693e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT DstVT = TLI.getValueType(I->getType());
6943df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (DstVT.bitsGT(SrcVT))
6953df24e667f04a7003342b534310919abc9c87418Dan Gohman      return SelectCast(I, ISD::ZERO_EXTEND);
6963df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (DstVT.bitsLT(SrcVT))
6973df24e667f04a7003342b534310919abc9c87418Dan Gohman      return SelectCast(I, ISD::TRUNCATE);
6983df24e667f04a7003342b534310919abc9c87418Dan Gohman    unsigned Reg = getRegForValue(I->getOperand(0));
6993df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (Reg == 0) return false;
7003df24e667f04a7003342b534310919abc9c87418Dan Gohman    UpdateValueMap(I, Reg);
7013df24e667f04a7003342b534310919abc9c87418Dan Gohman    return true;
7023df24e667f04a7003342b534310919abc9c87418Dan Gohman  }
703d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman
7043df24e667f04a7003342b534310919abc9c87418Dan Gohman  default:
7053df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Unhandled instruction. Halt "fast" selection and bail.
7063df24e667f04a7003342b534310919abc9c87418Dan Gohman    return false;
7073df24e667f04a7003342b534310919abc9c87418Dan Gohman  }
708b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
709b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
7103df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::FastISel(MachineFunction &mf,
711d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman                   MachineModuleInfo *mmi,
71283489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel                   DwarfWriter *dw,
7133df24e667f04a7003342b534310919abc9c87418Dan Gohman                   DenseMap<const Value *, unsigned> &vm,
7140586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman                   DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
715dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   DenseMap<const AllocaInst *, int> &am
716dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
717dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   , SmallSet<Instruction*, 8> &cil
718dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
719dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   )
7203df24e667f04a7003342b534310919abc9c87418Dan Gohman  : MBB(0),
7213df24e667f04a7003342b534310919abc9c87418Dan Gohman    ValueMap(vm),
7223df24e667f04a7003342b534310919abc9c87418Dan Gohman    MBBMap(bm),
7230586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    StaticAllocaMap(am),
724dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
725dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    CatchInfoLost(cil),
726dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
7273df24e667f04a7003342b534310919abc9c87418Dan Gohman    MF(mf),
728d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman    MMI(mmi),
72983489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel    DW(dw),
7303df24e667f04a7003342b534310919abc9c87418Dan Gohman    MRI(MF.getRegInfo()),
7310586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    MFI(*MF.getFrameInfo()),
7320586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    MCP(*MF.getConstantPool()),
7333df24e667f04a7003342b534310919abc9c87418Dan Gohman    TM(MF.getTarget()),
73422bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman    TD(*TM.getTargetData()),
73522bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman    TII(*TM.getInstrInfo()),
736e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson    TLI(*TM.getTargetLowering()) {
737bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman}
738bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman
739e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {}
740e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman
741825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_(MVT, MVT,
7427c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                             unsigned) {
743b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
744b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
745b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
746825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_r(MVT, MVT,
7477c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned, unsigned /*Op0*/) {
748b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
749b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
750b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
751825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rr(MVT, MVT,
7527c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
7530f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson                               unsigned /*Op0*/) {
754b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
755b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
756b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
7577c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_i(MVT, MVT, unsigned, uint64_t /*Imm*/) {
75883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  return 0;
75983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
76083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
761825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_f(MVT, MVT,
7627c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned, ConstantFP * /*FPImm*/) {
76310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return 0;
76410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
76510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
766825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_ri(MVT, MVT,
7677c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
7680f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson                               uint64_t /*Imm*/) {
769d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return 0;
770d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
771d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
772825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rf(MVT, MVT,
7737c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
77410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                               ConstantFP * /*FPImm*/) {
77510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return 0;
77610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
77710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
778825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rri(MVT, MVT,
7797c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                                unsigned,
780d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                unsigned /*Op0*/, unsigned /*Op1*/,
781d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                uint64_t /*Imm*/) {
78283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  return 0;
78383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
78483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
78583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
78683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri.
78783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try
78883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead.
7897c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_ri_(MVT VT, unsigned Opcode,
790d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                unsigned Op0, uint64_t Imm,
791825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                MVT ImmType) {
79283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  // First check if immediate type is legal. If not, we can't use the ri form.
793151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman  unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm);
79483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  if (ResultReg != 0)
79583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    return ResultReg;
7960f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson  unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm);
797d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  if (MaterialReg == 0)
798d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman    return 0;
7990f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
800d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
801d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
80210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries
80310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// to emit an instruction with a floating-point immediate operand using
80410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf. If that fails, it materializes the immediate into a register
80510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// and try FastEmit_rr instead.
8067c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_rf_(MVT VT, unsigned Opcode,
80710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                unsigned Op0, ConstantFP *FPImm,
808825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                MVT ImmType) {
80910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  // First check if immediate type is legal. If not, we can't use the rf form.
810151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman  unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm);
81110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  if (ResultReg != 0)
81210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    return ResultReg;
81310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
81410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  // Materialize the constant in a register.
81510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm);
81610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  if (MaterialReg == 0) {
81796a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // If the target doesn't have a way to directly enter a floating-point
81896a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // value into a register, use an alternate approach.
81996a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // TODO: The current approach only supports floating-point constants
82096a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // that can be constructed by conversion from integer values. This should
82196a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // be replaced by code that creates a load from a constant-pool entry,
82296a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // which will require some target-specific work.
82310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    const APFloat &Flt = FPImm->getValueAPF();
824e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT IntVT = TLI.getPointerTy();
82510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
82610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    uint64_t x[2];
82710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    uint32_t IntBitWidth = IntVT.getSizeInBits();
82823a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    bool isExact;
82923a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true,
83023a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen                             APFloat::rmTowardZero, &isExact);
83123a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    if (!isExact)
83210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
83310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    APInt IntVal(IntBitWidth, 2, x);
83410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
83510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(),
83610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                     ISD::Constant, IntVal.getZExtValue());
83710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    if (IntegerReg == 0)
83810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
83910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT,
84010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                             ISD::SINT_TO_FP, IntegerReg);
84110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    if (MaterialReg == 0)
84210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
84310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  }
84410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
84510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
84610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
847d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) {
848d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return MRI.createVirtualRegister(RC);
84983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
85083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
851b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
85277ad79689d755c49146f534107421cb3d9703fedDan Gohman                                 const TargetRegisterClass* RC) {
853d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
854bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
855b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
8569bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling  BuildMI(MBB, DL, II, ResultReg);
857b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
858b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
859b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
860b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
861b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                  const TargetRegisterClass *RC,
862b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                  unsigned Op0) {
863d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
864bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
865b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
8665960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
8679bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0);
8685960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
8699bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0);
8705960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
8715960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
8725960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
8735960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
8745960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
8755960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng
876b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
877b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
878b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
879b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
880b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                   const TargetRegisterClass *RC,
881b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                   unsigned Op0, unsigned Op1) {
882d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
883bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
884b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
8855960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
8869bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1);
8875960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
8889bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1);
8895960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
8905960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
8915960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
8925960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
8935960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
894b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
895b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
896d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
897d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
898d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                   const TargetRegisterClass *RC,
899d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                   unsigned Op0, uint64_t Imm) {
900d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
901d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
902d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
9035960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9049bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Imm);
9055960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9069bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addImm(Imm);
9075960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9085960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9095960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9105960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9115960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
912d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return ResultReg;
913d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
914d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
91510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
91610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                   const TargetRegisterClass *RC,
91710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                   unsigned Op0, ConstantFP *FPImm) {
91810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  unsigned ResultReg = createResultReg(RC);
91910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
92010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
9215960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9229bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addFPImm(FPImm);
9235960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9249bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addFPImm(FPImm);
9255960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9265960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9275960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9285960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9295960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
93010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return ResultReg;
93110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
93210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
933d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
934d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                    const TargetRegisterClass *RC,
935d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                    unsigned Op0, unsigned Op1, uint64_t Imm) {
936d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
937d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
938d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
9395960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9409bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm);
9415960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9429bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1).addImm(Imm);
9435960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9445960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9455960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9465960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9475960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
948d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return ResultReg;
949d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
9506d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson
9516d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode,
9526d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                                  const TargetRegisterClass *RC,
9536d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                                  uint64_t Imm) {
9546d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  unsigned ResultReg = createResultReg(RC);
9556d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
9566d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson
9575960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9589bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addImm(Imm);
9595960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9609bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addImm(Imm);
9615960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9625960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9635960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9645960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9655960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
9666d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  return ResultReg;
967b41aec54767a825ac54c8822e787700bb08a3460Evan Cheng}
9688970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
969825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmitInst_extractsubreg(MVT RetVT,
970536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng                                              unsigned Op0, uint32_t Idx) {
97140a468f24909792f000e3ccc1dda7a27b9c34b69Owen Anderson  const TargetRegisterClass* RC = MRI.getRegClass(Op0);
9728970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
973536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng  unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT));
9748970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson  const TargetInstrDesc &II = TII.get(TargetInstrInfo::EXTRACT_SUBREG);
9758970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
9765960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9779bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Idx);
9785960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9799bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addImm(Idx);
9805960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9815960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9825960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9835960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9845960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
9858970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson  return ResultReg;
9868970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson}
98714ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
98814ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// FastEmitZExtFromI1 - Emit MachineInstrs to compute the value of Op
98914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// with all but the least significant bit set to zero.
990825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmitZExtFromI1(MVT VT, unsigned Op) {
99114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  return FastEmit_ri(VT, VT, ISD::AND, Op, 1);
99214ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman}
993