FastISel.cpp revision 4183e31978146ea529a87a2fc47b96aeb6cbe000
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/Analysis/DebugInfo.h"
5183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetData.h"
52b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/Target/TargetInstrInfo.h"
5383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetLowering.h"
54bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman#include "llvm/Target/TargetMachine.h"
5566336edf823f8d64d77dc5ab2bbefc21ef82f6ecDan Gohman#include "FunctionLoweringInfo.h"
56b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanusing namespace llvm;
57b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
583df24e667f04a7003342b534310919abc9c87418Dan Gohmanunsigned FastISel::getRegForValue(Value *V) {
59e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT RealVT = TLI.getValueType(V->getType(), /*AllowUnknown=*/true);
604fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman  // Don't handle non-simple values in FastISel.
614fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman  if (!RealVT.isSimple())
624fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman    return 0;
63821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman
64c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // Ignore illegal types. We must do this before looking up the value
65c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // in ValueMap because Arguments are given virtual registers regardless
66c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // of whether FastISel can handle them.
67825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  MVT VT = RealVT.getSimpleVT();
68821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman  if (!TLI.isTypeLegal(VT)) {
69825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    // Promote MVT::i1 to a legal type though, because it's common and easy.
70825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i1)
7123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson      VT = TLI.getTypeToTransformTo(V->getContext(), VT).getSimpleVT();
72821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman    else
73821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman      return 0;
74821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman  }
75821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman
76c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // Look up the value to see if we already have a register for it. We
77c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // cache values defined by Instructions across blocks, and other values
78c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  // only locally. This is because Instructions already have the SSA
795c9cf19d1e7d044e786f03331bc3f004966a69d2Dan Gohman  // def-dominates-use requirement enforced.
80c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (ValueMap.count(V))
81c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    return ValueMap[V];
82c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  unsigned Reg = LocalValueMap[V];
83c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman  if (Reg != 0)
84c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman    return Reg;
85c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
86ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
872ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman    if (CI->getValue().getActiveBits() <= 64)
882ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman      Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue());
890586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  } else if (isa<AllocaInst>(V)) {
902ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman    Reg = TargetMaterializeAlloca(cast<AllocaInst>(V));
91205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman  } else if (isa<ConstantPointerNull>(V)) {
921e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman    // Translate this as an integer zero so that it can be
931e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman    // local-CSE'd with actual integer zeros.
941d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Reg =
951d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      getRegForValue(Constant::getNullValue(TD.getIntPtrType(V->getContext())));
96ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
974183e31978146ea529a87a2fc47b96aeb6cbe000Dan Gohman    // Try to emit the constant directly.
98104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman    Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF);
99ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
100ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (!Reg) {
1014183e31978146ea529a87a2fc47b96aeb6cbe000Dan Gohman      // Try to emit the constant by using an integer constant with a cast.
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));
124518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner    BuildMI(MBB, DL, TII.get(TargetOpcode::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
3254183e31978146ea529a87a2fc47b96aeb6cbe000Dan Gohman  // Handle selected intrinsic function calls.
32633134c4a75558288d663267c8991f6bd37a530afDan Gohman  unsigned IID = F->getIntrinsicID();
32733134c4a75558288d663267c8991f6bd37a530afDan Gohman  switch (IID) {
32833134c4a75558288d663267c8991f6bd37a530afDan Gohman  default: break;
32992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling  case Intrinsic::dbg_declare: {
33092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling    DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
331d850ac79b57e6e0bf68ee93a94d0b3dcd9f6ca35Chris Lattner    if (!DIDescriptor::ValidDebugInfo(DI->getVariable(), CodeGenOpt::None) ||
332ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        !MF.getMMI().hasDebugInfo())
3337e1e31f467d87c834d8baf673929865907901313Devang Patel      return true;
33492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling
3357e1e31f467d87c834d8baf673929865907901313Devang Patel    Value *Address = DI->getAddress();
336dc9185657593b5c1db86cb95a04a68fc09194993Dale Johannesen    if (!Address)
337dc9185657593b5c1db86cb95a04a68fc09194993Dale Johannesen      return true;
338343b42e428079363ab09828734b2debfd7dbdc9eDale Johannesen    if (isa<UndefValue>(Address))
339343b42e428079363ab09828734b2debfd7dbdc9eDale Johannesen      return true;
3407e1e31f467d87c834d8baf673929865907901313Devang Patel    AllocaInst *AI = dyn_cast<AllocaInst>(Address);
3417e1e31f467d87c834d8baf673929865907901313Devang Patel    // Don't handle byval struct arguments or VLAs, for example.
3427e1e31f467d87c834d8baf673929865907901313Devang Patel    if (!AI) break;
3437e1e31f467d87c834d8baf673929865907901313Devang Patel    DenseMap<const AllocaInst*, int>::iterator SI =
3447e1e31f467d87c834d8baf673929865907901313Devang Patel      StaticAllocaMap.find(AI);
3457e1e31f467d87c834d8baf673929865907901313Devang Patel    if (SI == StaticAllocaMap.end()) break; // VLAs.
3467e1e31f467d87c834d8baf673929865907901313Devang Patel    int FI = SI->second;
347de4845c163a5847c82d7ce10ed0c320098bce6e0Chris Lattner    if (!DI->getDebugLoc().isUnknown())
348ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      MF.getMMI().setVariableDbgInfo(DI->getVariable(), FI, DI->getDebugLoc());
349870cfcf9a6189b65a8ee805b93a2c737c0183e62Chris Lattner
35010fedd21d3d5e9527b13e38addd7002da2c1dc61Dale Johannesen    // Building the map above is target independent.  Generating DBG_VALUE
3515ed17ae92a9239c2ff7d3ba494bf96651598ee7aDale Johannesen    // inline is target dependent; do this now.
3525ed17ae92a9239c2ff7d3ba494bf96651598ee7aDale Johannesen    (void)TargetSelectInstruction(cast<Instruction>(I));
35333134c4a75558288d663267c8991f6bd37a530afDan Gohman    return true;
35492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling  }
35545df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen  case Intrinsic::dbg_value: {
356343b42e428079363ab09828734b2debfd7dbdc9eDale Johannesen    // This form of DBG_VALUE is target-independent.
35745df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    DbgValueInst *DI = cast<DbgValueInst>(I);
35845df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    const TargetInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
35945df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    Value *V = DI->getValue();
36045df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    if (!V) {
36145df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      // Currently the optimizer can produce this; insert an undef to
36245df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      // help debugging.  Probably the optimizer should not do this.
36345df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      BuildMI(MBB, DL, II).addReg(0U).addImm(DI->getOffset()).
36445df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen                                     addMetadata(DI->getVariable());
36545df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    } else if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
36645df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      BuildMI(MBB, DL, II).addImm(CI->getZExtValue()).addImm(DI->getOffset()).
36745df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen                                     addMetadata(DI->getVariable());
36845df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
36945df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      BuildMI(MBB, DL, II).addFPImm(CF).addImm(DI->getOffset()).
37045df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen                                     addMetadata(DI->getVariable());
37145df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    } else if (unsigned Reg = lookUpRegForValue(V)) {
37245df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      BuildMI(MBB, DL, II).addReg(Reg, RegState::Debug).addImm(DI->getOffset()).
37345df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen                                     addMetadata(DI->getVariable());
37445df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    } else {
37545df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      // We can't yet handle anything else here because it would require
37645df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      // generating code, thus altering codegen because of debug info.
37745df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      // Insert an undef so we can see what we dropped.
37845df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen      BuildMI(MBB, DL, II).addReg(0U).addImm(DI->getOffset()).
37945df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen                                     addMetadata(DI->getVariable());
38045df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    }
38145df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen    return true;
38245df7616528e3d101c5b2938bd4d865321205d33Dale Johannesen  }
383dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  case Intrinsic::eh_exception: {
384e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = TLI.getValueType(I->getType());
385dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    switch (TLI.getOperationAction(ISD::EXCEPTIONADDR, VT)) {
386dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    default: break;
387dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    case TargetLowering::Expand: {
388b0f1e1780c736c62fb99e5824825d2a60a53b53bDuncan Sands      assert(MBB->isLandingPad() && "Call to eh.exception not in landing pad!");
389dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      unsigned Reg = TLI.getExceptionAddressRegister();
390dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      const TargetRegisterClass *RC = TLI.getRegClassFor(VT);
391dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      unsigned ResultReg = createResultReg(RC);
392dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
393dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                                           Reg, RC, RC);
394dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      assert(InsertedCopy && "Can't copy address registers!");
39524ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng      InsertedCopy = InsertedCopy;
396dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      UpdateValueMap(I, ResultReg);
397dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      return true;
398dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
399dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
400dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    break;
401dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  }
402b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  case Intrinsic::eh_selector: {
403e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = TLI.getValueType(I->getType());
404dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    switch (TLI.getOperationAction(ISD::EHSELECTION, VT)) {
405dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    default: break;
406dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    case TargetLowering::Expand: {
407ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      if (MBB->isLandingPad())
408ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        AddCatchInfo(*cast<CallInst>(I), &MF.getMMI(), MBB);
409ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      else {
410dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
411ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        CatchInfoLost.insert(cast<CallInst>(I));
412dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
413ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        // FIXME: Mark exception selector register as live in.  Hack for PR1508.
414dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman        unsigned Reg = TLI.getExceptionSelectorRegister();
415ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        if (Reg) MBB->addLiveIn(Reg);
416dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      }
417ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner
418ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      unsigned Reg = TLI.getExceptionSelectorRegister();
419ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      EVT SrcVT = TLI.getPointerTy();
420ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      const TargetRegisterClass *RC = TLI.getRegClassFor(SrcVT);
421ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      unsigned ResultReg = createResultReg(RC);
422ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, Reg,
423ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner                                           RC, RC);
424ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      assert(InsertedCopy && "Can't copy address registers!");
425ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      InsertedCopy = InsertedCopy;
426ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner
427ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      // Cast the register to the type of the selector.
428ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      if (SrcVT.bitsGT(MVT::i32))
429ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        ResultReg = FastEmit_r(SrcVT.getSimpleVT(), MVT::i32, ISD::TRUNCATE,
430ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner                               ResultReg);
431ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      else if (SrcVT.bitsLT(MVT::i32))
432ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        ResultReg = FastEmit_r(SrcVT.getSimpleVT(), MVT::i32,
433ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner                               ISD::SIGN_EXTEND, ResultReg);
434ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      if (ResultReg == 0)
435ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        // Unhandled operand. Halt "fast" selection and bail.
436ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner        return false;
437ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner
438ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner      UpdateValueMap(I, ResultReg);
439ed3a8067a60ecf2c215e77327a57904c3ebc3355Chris Lattner
440dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman      return true;
441dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
442dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    }
443dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    break;
444dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman  }
44533134c4a75558288d663267c8991f6bd37a530afDan Gohman  }
4464183e31978146ea529a87a2fc47b96aeb6cbe000Dan Gohman
4474183e31978146ea529a87a2fc47b96aeb6cbe000Dan Gohman  // An arbitrary call. Bail.
44833134c4a75558288d663267c8991f6bd37a530afDan Gohman  return false;
44933134c4a75558288d663267c8991f6bd37a530afDan Gohman}
45033134c4a75558288d663267c8991f6bd37a530afDan Gohman
4517c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanbool FastISel::SelectCast(User *I, unsigned Opcode) {
452e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
453e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = TLI.getValueType(I->getType());
454d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
455825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
456825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      DstVT == MVT::Other || !DstVT.isSimple())
457d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled type. Halt "fast" selection and bail.
458d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
459d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
460474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // Check if the destination type is legal. Or as a special case,
461474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // it may be i1 if we're doing a truncate because that's
462474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // easy and somewhat common.
463474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  if (!TLI.isTypeLegal(DstVT))
464825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (DstVT != MVT::i1 || Opcode != ISD::TRUNCATE)
465474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman      // Unhandled type. Halt "fast" selection and bail.
466474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman      return false;
467474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman
46891b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman  // Check if the source operand is legal. Or as a special case,
46991b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman  // it may be i1 if we're doing zero-extension because that's
470474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // easy and somewhat common.
471474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  if (!TLI.isTypeLegal(SrcVT))
472825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (SrcVT != MVT::i1 || Opcode != ISD::ZERO_EXTEND)
47391b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman      // Unhandled type. Halt "fast" selection and bail.
47491b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman      return false;
475474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman
4763df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned InputReg = getRegForValue(I->getOperand(0));
477d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  if (!InputReg)
478d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled operand.  Halt "fast" selection and bail.
479d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
48014ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
48114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  // If the operand is i1, arrange for the high bits in the register to be zero.
482825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::i1) {
48323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson   SrcVT = TLI.getTypeToTransformTo(I->getContext(), SrcVT);
48414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman   InputReg = FastEmitZExtFromI1(SrcVT.getSimpleVT(), InputReg);
48514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman   if (!InputReg)
48614ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman     return false;
48714ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  }
488474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman  // If the result is i1, truncate to the target's type for i1 first.
489825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (DstVT == MVT::i1)
49023b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    DstVT = TLI.getTypeToTransformTo(I->getContext(), DstVT);
49114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
492d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(),
493d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  DstVT.getSimpleVT(),
494d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  Opcode,
495d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson                                  InputReg);
496d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  if (!ResultReg)
497d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
498d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
4993df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, ResultReg);
500d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  return true;
501d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson}
502d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
50340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBitCast(User *I) {
504ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // If the bitcast doesn't change the type, just use the operand value.
505ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (I->getType() == I->getOperand(0)->getType()) {
5063df24e667f04a7003342b534310919abc9c87418Dan Gohman    unsigned Reg = getRegForValue(I->getOperand(0));
507a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman    if (Reg == 0)
508a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman      return false;
5093df24e667f04a7003342b534310919abc9c87418Dan Gohman    UpdateValueMap(I, Reg);
510ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    return true;
511ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  }
512ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
513ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators.
514e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
515e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = TLI.getValueType(I->getType());
516d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
517825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
518825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      DstVT == MVT::Other || !DstVT.isSimple() ||
519d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson      !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT))
520d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    // Unhandled type. Halt "fast" selection and bail.
521d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
522d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
5233df24e667f04a7003342b534310919abc9c87418Dan Gohman  unsigned Op0 = getRegForValue(I->getOperand(0));
524ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (Op0 == 0)
525ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    // Unhandled operand. Halt "fast" selection and bail.
526d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
527d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
528ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // First, try to perform the bitcast by inserting a reg-reg copy.
529ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  unsigned ResultReg = 0;
530ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) {
531ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT);
532ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT);
533ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    ResultReg = createResultReg(DstClass);
534ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
535ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
536ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                                         Op0, DstClass, SrcClass);
537ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    if (!InsertedCopy)
538ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman      ResultReg = 0;
539ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  }
540ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
541ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  // If the reg-reg copy failed, select a BIT_CONVERT opcode.
542ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (!ResultReg)
543ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman    ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(),
544ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman                           ISD::BIT_CONVERT, Op0);
545ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman
546ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman  if (!ResultReg)
547d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson    return false;
548d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
5493df24e667f04a7003342b534310919abc9c87418Dan Gohman  UpdateValueMap(I, ResultReg);
550d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson  return true;
551d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson}
552d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson
5533df24e667f04a7003342b534310919abc9c87418Dan Gohmanbool
5543df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::SelectInstruction(Instruction *I) {
5556e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  // First, try doing target-independent selection.
5566e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  if (SelectOperator(I, I->getOpcode()))
5576e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman    return true;
5586e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman
5596e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  // Next, try calling the target to attempt to handle the instruction.
5606e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  if (TargetSelectInstruction(I))
5616e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman    return true;
5626e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman
5636e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  return false;
56440b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman}
56540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman
566d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// FastEmitBranch - Emit an unconditional branch to the given block,
567d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// unless it is the immediate (fall-through) successor, and update
568d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// the CFG.
569d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohmanvoid
570d98d6203e429b2d7208b6687931e9079e85e95ecDan GohmanFastISel::FastEmitBranch(MachineBasicBlock *MSucc) {
571d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  if (MBB->isLayoutSuccessor(MSucc)) {
572d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    // The unconditional fall-through case, which needs no instructions.
573d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  } else {
574d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    // The unconditional branch case.
575d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman    TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>());
576d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  }
577d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman  MBB->addSuccessor(MSucc);
578d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman}
579d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman
5803d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman/// SelectFNeg - Emit an FNeg operation.
5813d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman///
5823d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohmanbool
5833d45a853db014fdddcdb79424e663dfed5eccbc7Dan GohmanFastISel::SelectFNeg(User *I) {
5843d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  unsigned OpReg = getRegForValue(BinaryOperator::getFNegArgument(I));
5853d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (OpReg == 0) return false;
5863d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
5874a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  // If the target has ISD::FNEG, use it.
5884a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  EVT VT = TLI.getValueType(I->getType());
5894a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  unsigned ResultReg = FastEmit_r(VT.getSimpleVT(), VT.getSimpleVT(),
5904a215a13c3035a8818254b61267be77def4a2a37Dan Gohman                                  ISD::FNEG, OpReg);
5914a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  if (ResultReg != 0) {
5924a215a13c3035a8818254b61267be77def4a2a37Dan Gohman    UpdateValueMap(I, ResultReg);
5934a215a13c3035a8818254b61267be77def4a2a37Dan Gohman    return true;
5944a215a13c3035a8818254b61267be77def4a2a37Dan Gohman  }
5954a215a13c3035a8818254b61267be77def4a2a37Dan Gohman
5965e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  // Bitcast the value to integer, twiddle the sign bit with xor,
5975e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  // and then bitcast it back to floating-point.
5983d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (VT.getSizeInBits() > 64) return false;
5995e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  EVT IntVT = EVT::getIntegerVT(I->getContext(), VT.getSizeInBits());
6005e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (!TLI.isTypeLegal(IntVT))
6015e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
6025e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
6035e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  unsigned IntReg = FastEmit_r(VT.getSimpleVT(), IntVT.getSimpleVT(),
6045e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                               ISD::BIT_CONVERT, OpReg);
6055e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (IntReg == 0)
6065e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
6075e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
6085e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  unsigned IntResultReg = FastEmit_ri_(IntVT.getSimpleVT(), ISD::XOR, IntReg,
6095e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                                       UINT64_C(1) << (VT.getSizeInBits()-1),
6105e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                                       IntVT.getSimpleVT());
6115e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  if (IntResultReg == 0)
6125e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman    return false;
6135e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman
6145e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman  ResultReg = FastEmit_r(IntVT.getSimpleVT(), VT.getSimpleVT(),
6155e5abb77fe9eeb92a55f119fdb721bca4508094aDan Gohman                         ISD::BIT_CONVERT, IntResultReg);
6163d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  if (ResultReg == 0)
6173d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    return false;
6183d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
6193d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  UpdateValueMap(I, ResultReg);
6203d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman  return true;
6213d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman}
6223d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
62340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool
62440b189e4e257924d90aaf63bf2e12bc7bbca961aDan GohmanFastISel::SelectOperator(User *I, unsigned Opcode) {
62540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman  switch (Opcode) {
626ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Add:
627ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::ADD);
628ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FAdd:
629ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FADD);
630ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Sub:
631ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::SUB);
632ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FSub:
6333d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    // FNeg is currently represented in LLVM IR as a special case of FSub.
6343d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman    if (BinaryOperator::isFNeg(I))
6353d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman      return SelectFNeg(I);
636ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FSUB);
637ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::Mul:
638ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::MUL);
639ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  case Instruction::FMul:
640ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    return SelectBinaryOp(I, ISD::FMUL);
6413df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SDiv:
6423df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SDIV);
6433df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::UDiv:
6443df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::UDIV);
6453df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FDiv:
6463df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::FDIV);
6473df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SRem:
6483df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SREM);
6493df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::URem:
6503df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::UREM);
6513df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FRem:
6523df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::FREM);
6533df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Shl:
6543df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SHL);
6553df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::LShr:
6563df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SRL);
6573df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::AShr:
6583df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::SRA);
6593df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::And:
6603df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::AND);
6613df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Or:
6623df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::OR);
6633df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Xor:
6643df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBinaryOp(I, ISD::XOR);
6653df24e667f04a7003342b534310919abc9c87418Dan Gohman
6663df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::GetElementPtr:
6673df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectGetElementPtr(I);
6683df24e667f04a7003342b534310919abc9c87418Dan Gohman
6693df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Br: {
6703df24e667f04a7003342b534310919abc9c87418Dan Gohman    BranchInst *BI = cast<BranchInst>(I);
6713df24e667f04a7003342b534310919abc9c87418Dan Gohman
6723df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (BI->isUnconditional()) {
6733df24e667f04a7003342b534310919abc9c87418Dan Gohman      BasicBlock *LLVMSucc = BI->getSuccessor(0);
6743df24e667f04a7003342b534310919abc9c87418Dan Gohman      MachineBasicBlock *MSucc = MBBMap[LLVMSucc];
675d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman      FastEmitBranch(MSucc);
6763df24e667f04a7003342b534310919abc9c87418Dan Gohman      return true;
6779d5b41624003daf259b33fc953aa471049700353Owen Anderson    }
6783df24e667f04a7003342b534310919abc9c87418Dan Gohman
6793df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Conditional branches are not handed yet.
6803df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Halt "fast" selection and bail.
6813df24e667f04a7003342b534310919abc9c87418Dan Gohman    return false;
682b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  }
683b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
684087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman  case Instruction::Unreachable:
685087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman    // Nothing to emit.
686087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman    return true;
687087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman
6883df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::PHI:
6893df24e667f04a7003342b534310919abc9c87418Dan Gohman    // PHI nodes are already emitted.
6903df24e667f04a7003342b534310919abc9c87418Dan Gohman    return true;
6910586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
6920586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  case Instruction::Alloca:
6930586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    // FunctionLowering has the static-sized case covered.
6940586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    if (StaticAllocaMap.count(cast<AllocaInst>(I)))
6950586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman      return true;
6960586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
6970586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    // Dynamic-sized alloca is not handled yet.
6980586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    return false;
6993df24e667f04a7003342b534310919abc9c87418Dan Gohman
70033134c4a75558288d663267c8991f6bd37a530afDan Gohman  case Instruction::Call:
70133134c4a75558288d663267c8991f6bd37a530afDan Gohman    return SelectCall(I);
70233134c4a75558288d663267c8991f6bd37a530afDan Gohman
7033df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::BitCast:
7043df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectBitCast(I);
7053df24e667f04a7003342b534310919abc9c87418Dan Gohman
7063df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::FPToSI:
7073df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::FP_TO_SINT);
7083df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::ZExt:
7093df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::ZERO_EXTEND);
7103df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SExt:
7113df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::SIGN_EXTEND);
7123df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::Trunc:
7133df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::TRUNCATE);
7143df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::SIToFP:
7153df24e667f04a7003342b534310919abc9c87418Dan Gohman    return SelectCast(I, ISD::SINT_TO_FP);
7163df24e667f04a7003342b534310919abc9c87418Dan Gohman
7173df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::IntToPtr: // Deliberate fall-through.
7183df24e667f04a7003342b534310919abc9c87418Dan Gohman  case Instruction::PtrToInt: {
719e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
720e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT DstVT = TLI.getValueType(I->getType());
7213df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (DstVT.bitsGT(SrcVT))
7223df24e667f04a7003342b534310919abc9c87418Dan Gohman      return SelectCast(I, ISD::ZERO_EXTEND);
7233df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (DstVT.bitsLT(SrcVT))
7243df24e667f04a7003342b534310919abc9c87418Dan Gohman      return SelectCast(I, ISD::TRUNCATE);
7253df24e667f04a7003342b534310919abc9c87418Dan Gohman    unsigned Reg = getRegForValue(I->getOperand(0));
7263df24e667f04a7003342b534310919abc9c87418Dan Gohman    if (Reg == 0) return false;
7273df24e667f04a7003342b534310919abc9c87418Dan Gohman    UpdateValueMap(I, Reg);
7283df24e667f04a7003342b534310919abc9c87418Dan Gohman    return true;
7293df24e667f04a7003342b534310919abc9c87418Dan Gohman  }
730d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman
7313df24e667f04a7003342b534310919abc9c87418Dan Gohman  default:
7323df24e667f04a7003342b534310919abc9c87418Dan Gohman    // Unhandled instruction. Halt "fast" selection and bail.
7333df24e667f04a7003342b534310919abc9c87418Dan Gohman    return false;
7343df24e667f04a7003342b534310919abc9c87418Dan Gohman  }
735b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
736b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
7373df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::FastISel(MachineFunction &mf,
7383df24e667f04a7003342b534310919abc9c87418Dan Gohman                   DenseMap<const Value *, unsigned> &vm,
7390586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman                   DenseMap<const BasicBlock *, MachineBasicBlock *> &bm,
740dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   DenseMap<const AllocaInst *, int> &am
741dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
742dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   , SmallSet<Instruction*, 8> &cil
743dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
744dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman                   )
7453df24e667f04a7003342b534310919abc9c87418Dan Gohman  : MBB(0),
7463df24e667f04a7003342b534310919abc9c87418Dan Gohman    ValueMap(vm),
7473df24e667f04a7003342b534310919abc9c87418Dan Gohman    MBBMap(bm),
7480586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    StaticAllocaMap(am),
749dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG
750dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman    CatchInfoLost(cil),
751dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif
7523df24e667f04a7003342b534310919abc9c87418Dan Gohman    MF(mf),
7533df24e667f04a7003342b534310919abc9c87418Dan Gohman    MRI(MF.getRegInfo()),
7540586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    MFI(*MF.getFrameInfo()),
7550586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    MCP(*MF.getConstantPool()),
7563df24e667f04a7003342b534310919abc9c87418Dan Gohman    TM(MF.getTarget()),
75722bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman    TD(*TM.getTargetData()),
75822bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman    TII(*TM.getInstrInfo()),
759e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson    TLI(*TM.getTargetLowering()) {
760bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman}
761bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman
762e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {}
763e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman
764825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_(MVT, MVT,
7657c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                             unsigned) {
766b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
767b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
768b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
769825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_r(MVT, MVT,
7707c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned, unsigned /*Op0*/) {
771b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
772b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
773b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
774825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rr(MVT, MVT,
7757c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
7760f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson                               unsigned /*Op0*/) {
777b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return 0;
778b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
779b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
7807c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_i(MVT, MVT, unsigned, uint64_t /*Imm*/) {
78183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  return 0;
78283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
78383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
784825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_f(MVT, MVT,
7857c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned, ConstantFP * /*FPImm*/) {
78610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return 0;
78710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
78810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
789825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_ri(MVT, MVT,
7907c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
7910f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson                               uint64_t /*Imm*/) {
792d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return 0;
793d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
794d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
795825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rf(MVT, MVT,
7967c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned, unsigned /*Op0*/,
79710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                               ConstantFP * /*FPImm*/) {
79810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return 0;
79910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
80010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
801825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmit_rri(MVT, MVT,
8027c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                                unsigned,
803d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                unsigned /*Op0*/, unsigned /*Op1*/,
804d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                uint64_t /*Imm*/) {
80583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  return 0;
80683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
80783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
80883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
80983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri.
81083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try
81183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead.
8127c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_ri_(MVT VT, unsigned Opcode,
813d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                unsigned Op0, uint64_t Imm,
814825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                MVT ImmType) {
81583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  // First check if immediate type is legal. If not, we can't use the ri form.
816151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman  unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm);
81783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng  if (ResultReg != 0)
81883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng    return ResultReg;
8190f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson  unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm);
820d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  if (MaterialReg == 0)
821d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman    return 0;
8220f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
823d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
824d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
82510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries
82610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// to emit an instruction with a floating-point immediate operand using
82710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf. If that fails, it materializes the immediate into a register
82810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// and try FastEmit_rr instead.
8297c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohmanunsigned FastISel::FastEmit_rf_(MVT VT, unsigned Opcode,
83010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                unsigned Op0, ConstantFP *FPImm,
831825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                MVT ImmType) {
83210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  // First check if immediate type is legal. If not, we can't use the rf form.
833151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman  unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm);
83410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  if (ResultReg != 0)
83510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    return ResultReg;
83610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
83710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  // Materialize the constant in a register.
83810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm);
83910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  if (MaterialReg == 0) {
84096a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // If the target doesn't have a way to directly enter a floating-point
84196a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // value into a register, use an alternate approach.
84296a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // TODO: The current approach only supports floating-point constants
84396a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // that can be constructed by conversion from integer values. This should
84496a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // be replaced by code that creates a load from a constant-pool entry,
84596a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman    // which will require some target-specific work.
84610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    const APFloat &Flt = FPImm->getValueAPF();
847e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT IntVT = TLI.getPointerTy();
84810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
84910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    uint64_t x[2];
85010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    uint32_t IntBitWidth = IntVT.getSizeInBits();
85123a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    bool isExact;
85223a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true,
85323a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen                             APFloat::rmTowardZero, &isExact);
85423a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen    if (!isExact)
85510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
85610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    APInt IntVal(IntBitWidth, 2, x);
85710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
85810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(),
85910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                     ISD::Constant, IntVal.getZExtValue());
86010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    if (IntegerReg == 0)
86110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
86210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT,
86310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                             ISD::SINT_TO_FP, IntegerReg);
86410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman    if (MaterialReg == 0)
86510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman      return 0;
86610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  }
86710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
86810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
86910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
870d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) {
871d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return MRI.createVirtualRegister(RC);
87283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng}
87383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
874b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
87577ad79689d755c49146f534107421cb3d9703fedDan Gohman                                 const TargetRegisterClass* RC) {
876d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
877bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
878b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
8799bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling  BuildMI(MBB, DL, II, ResultReg);
880b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
881b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
882b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
883b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
884b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                  const TargetRegisterClass *RC,
885b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                  unsigned Op0) {
886d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
887bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
888b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
8895960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
8909bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0);
8915960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
8929bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0);
8935960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
8945960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
8955960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
8965960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
8975960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
8985960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng
899b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
900b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
901b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
902b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
903b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                   const TargetRegisterClass *RC,
904b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                                   unsigned Op0, unsigned Op1) {
905d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
906bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
907b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
9085960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9099bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1);
9105960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9119bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1);
9125960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9135960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9145960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9155960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9165960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
917b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  return ResultReg;
918b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
919d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
920d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
921d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                   const TargetRegisterClass *RC,
922d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                   unsigned Op0, uint64_t Imm) {
923d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
924d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
925d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
9265960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Imm);
9285960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9299bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addImm(Imm);
9305960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9315960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9325960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9335960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9345960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
935d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return ResultReg;
936d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
937d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
93810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
93910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                   const TargetRegisterClass *RC,
94010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                                   unsigned Op0, ConstantFP *FPImm) {
94110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  unsigned ResultReg = createResultReg(RC);
94210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
94310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
9445960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9459bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addFPImm(FPImm);
9465960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9479bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addFPImm(FPImm);
9485960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9495960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9505960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9515960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9525960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
95310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  return ResultReg;
95410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman}
95510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
956d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
957d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                    const TargetRegisterClass *RC,
958d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                                    unsigned Op0, unsigned Op1, uint64_t Imm) {
959d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned ResultReg = createResultReg(RC);
960d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
961d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
9625960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9639bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm);
9645960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9659bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1).addImm(Imm);
9665960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9675960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9685960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9695960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9705960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
971d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  return ResultReg;
972d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman}
9736d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson
9746d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode,
9756d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                                  const TargetRegisterClass *RC,
9766d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                                  uint64_t Imm) {
9776d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  unsigned ResultReg = createResultReg(RC);
9786d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
9796d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson
9805960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
9819bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addImm(Imm);
9825960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
9839bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addImm(Imm);
9845960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
9855960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
9865960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
9875960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
9885960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
9896d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  return ResultReg;
990b41aec54767a825ac54c8822e787700bb08a3460Evan Cheng}
9918970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
992825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmitInst_extractsubreg(MVT RetVT,
993536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng                                              unsigned Op0, uint32_t Idx) {
99440a468f24909792f000e3ccc1dda7a27b9c34b69Owen Anderson  const TargetRegisterClass* RC = MRI.getRegClass(Op0);
9958970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
996536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng  unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT));
997518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner  const TargetInstrDesc &II = TII.get(TargetOpcode::EXTRACT_SUBREG);
9988970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
9995960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  if (II.getNumDefs() >= 1)
10009bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Idx);
10015960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  else {
10029bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    BuildMI(MBB, DL, II).addReg(Op0).addImm(Idx);
10035960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
10045960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng                                         II.ImplicitDefs[0], RC, RC);
10055960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng    if (!InsertedCopy)
10065960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng      ResultReg = 0;
10075960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng  }
10088970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson  return ResultReg;
10098970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson}
101014ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
101114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// FastEmitZExtFromI1 - Emit MachineInstrs to compute the value of Op
101214ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// with all but the least significant bit set to zero.
1013825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Andersonunsigned FastISel::FastEmitZExtFromI1(MVT VT, unsigned Op) {
101414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman  return FastEmit_ri(VT, VT, ISD::AND, Op, 1);
101514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman}
1016