FastISel.cpp revision 483f0db2d164142681731eb5dff96442af72c255
1///===-- FastISel.cpp - Implementation of the FastISel class --------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the implementation of the FastISel class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Instructions.h"
15#include "llvm/CodeGen/FastISel.h"
16#include "llvm/CodeGen/MachineInstrBuilder.h"
17#include "llvm/CodeGen/MachineRegisterInfo.h"
18#include "llvm/Target/TargetData.h"
19#include "llvm/Target/TargetInstrInfo.h"
20#include "llvm/Target/TargetLowering.h"
21#include "llvm/Target/TargetMachine.h"
22using namespace llvm;
23
24unsigned FastISel::getRegForValue(Value *V) {
25  // Look up the value to see if we already have a register for it. We
26  // cache values defined by Instructions across blocks, and other values
27  // only locally. This is because Instructions already have the SSA
28  // def-dominatess-use requirement enforced.
29  if (ValueMap.count(V))
30    return ValueMap[V];
31  unsigned Reg = LocalValueMap[V];
32  if (Reg != 0)
33    return Reg;
34
35  MVT::SimpleValueType VT = TLI.getValueType(V->getType()).getSimpleVT();
36  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
37    if (CI->getValue().getActiveBits() > 64)
38      return TargetMaterializeConstant(CI,
39                                       MBB->getParent()->getConstantPool());
40    // Don't cache constant materializations.  To do so would require
41    // tracking what uses they dominate.
42    Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue());
43  } else if (isa<GlobalValue>(V)) {
44    return TargetMaterializeConstant(dyn_cast<Constant>(V),
45                                     MBB->getParent()->getConstantPool());
46  } else if (isa<ConstantPointerNull>(V)) {
47    Reg = FastEmit_i(VT, VT, ISD::Constant, 0);
48  } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
49    Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF);
50
51    if (!Reg) {
52      const APFloat &Flt = CF->getValueAPF();
53      MVT IntVT = TLI.getPointerTy();
54
55      uint64_t x[2];
56      uint32_t IntBitWidth = IntVT.getSizeInBits();
57      if (Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true,
58                               APFloat::rmTowardZero) != APFloat::opOK)
59        return TargetMaterializeConstant(CF,
60                                         MBB->getParent()->getConstantPool());
61      APInt IntVal(IntBitWidth, 2, x);
62
63      unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(),
64                                       ISD::Constant, IntVal.getZExtValue());
65      if (IntegerReg == 0)
66        return TargetMaterializeConstant(CF,
67                                         MBB->getParent()->getConstantPool());
68      Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg);
69      if (Reg == 0)
70        return TargetMaterializeConstant(CF,
71                                         MBB->getParent()->getConstantPool());;
72    }
73  } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
74    if (!SelectOperator(CE, CE->getOpcode())) return 0;
75    Reg = LocalValueMap[CE];
76  } else if (isa<UndefValue>(V)) {
77    Reg = createResultReg(TLI.getRegClassFor(VT));
78    BuildMI(MBB, TII.get(TargetInstrInfo::IMPLICIT_DEF), Reg);
79  } else {
80    return 0;
81  }
82
83  if (!Reg && isa<Constant>(V))
84    return TargetMaterializeConstant(cast<Constant>(V),
85                                     MBB->getParent()->getConstantPool());
86
87  LocalValueMap[V] = Reg;
88  return Reg;
89}
90
91unsigned FastISel::lookUpRegForValue(Value *V) {
92  // Look up the value to see if we already have a register for it. We
93  // cache values defined by Instructions across blocks, and other values
94  // only locally. This is because Instructions already have the SSA
95  // def-dominatess-use requirement enforced.
96  if (ValueMap.count(V))
97    return ValueMap[V];
98  return LocalValueMap[V];
99}
100
101/// UpdateValueMap - Update the value map to include the new mapping for this
102/// instruction, or insert an extra copy to get the result in a previous
103/// determined register.
104/// NOTE: This is only necessary because we might select a block that uses
105/// a value before we select the block that defines the value.  It might be
106/// possible to fix this by selecting blocks in reverse postorder.
107void FastISel::UpdateValueMap(Value* I, unsigned Reg) {
108  if (!isa<Instruction>(I)) {
109    LocalValueMap[I] = Reg;
110    return;
111  }
112  if (!ValueMap.count(I))
113    ValueMap[I] = Reg;
114  else
115    TII.copyRegToReg(*MBB, MBB->end(), ValueMap[I],
116                     Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg));
117}
118
119/// SelectBinaryOp - Select and emit code for a binary operator instruction,
120/// which has an opcode which directly corresponds to the given ISD opcode.
121///
122bool FastISel::SelectBinaryOp(User *I, ISD::NodeType ISDOpcode) {
123  MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true);
124  if (VT == MVT::Other || !VT.isSimple())
125    // Unhandled type. Halt "fast" selection and bail.
126    return false;
127
128  // We only handle legal types. For example, on x86-32 the instruction
129  // selector contains all of the 64-bit instructions from x86-64,
130  // under the assumption that i64 won't be used if the target doesn't
131  // support it.
132  if (!TLI.isTypeLegal(VT)) {
133    // MVT::i1 is special. Allow AND and OR (but not XOR) because they
134    // don't require additional zeroing, which makes them easy.
135    if (VT == MVT::i1 &&
136        (ISDOpcode == ISD::AND || ISDOpcode == ISD::OR))
137      VT = TLI.getTypeToTransformTo(VT);
138    else
139      return false;
140  }
141
142  unsigned Op0 = getRegForValue(I->getOperand(0));
143  if (Op0 == 0)
144    // Unhandled operand. Halt "fast" selection and bail.
145    return false;
146
147  // Check if the second operand is a constant and handle it appropriately.
148  if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) {
149    unsigned ResultReg = FastEmit_ri(VT.getSimpleVT(), VT.getSimpleVT(),
150                                     ISDOpcode, Op0, CI->getZExtValue());
151    if (ResultReg != 0) {
152      // We successfully emitted code for the given LLVM Instruction.
153      UpdateValueMap(I, ResultReg);
154      return true;
155    }
156  }
157
158  // Check if the second operand is a constant float.
159  if (ConstantFP *CF = dyn_cast<ConstantFP>(I->getOperand(1))) {
160    unsigned ResultReg = FastEmit_rf(VT.getSimpleVT(), VT.getSimpleVT(),
161                                     ISDOpcode, Op0, CF);
162    if (ResultReg != 0) {
163      // We successfully emitted code for the given LLVM Instruction.
164      UpdateValueMap(I, ResultReg);
165      return true;
166    }
167  }
168
169  unsigned Op1 = getRegForValue(I->getOperand(1));
170  if (Op1 == 0)
171    // Unhandled operand. Halt "fast" selection and bail.
172    return false;
173
174  // Now we have both operands in registers. Emit the instruction.
175  unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(),
176                                   ISDOpcode, Op0, Op1);
177  if (ResultReg == 0)
178    // Target-specific code wasn't able to find a machine opcode for
179    // the given ISD opcode and type. Halt "fast" selection and bail.
180    return false;
181
182  // We successfully emitted code for the given LLVM Instruction.
183  UpdateValueMap(I, ResultReg);
184  return true;
185}
186
187bool FastISel::SelectGetElementPtr(User *I) {
188  unsigned N = getRegForValue(I->getOperand(0));
189  if (N == 0)
190    // Unhandled operand. Halt "fast" selection and bail.
191    return false;
192
193  const Type *Ty = I->getOperand(0)->getType();
194  MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT();
195  for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end();
196       OI != E; ++OI) {
197    Value *Idx = *OI;
198    if (const StructType *StTy = dyn_cast<StructType>(Ty)) {
199      unsigned Field = cast<ConstantInt>(Idx)->getZExtValue();
200      if (Field) {
201        // N = N + Offset
202        uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field);
203        // FIXME: This can be optimized by combining the add with a
204        // subsequent one.
205        N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT);
206        if (N == 0)
207          // Unhandled operand. Halt "fast" selection and bail.
208          return false;
209      }
210      Ty = StTy->getElementType(Field);
211    } else {
212      Ty = cast<SequentialType>(Ty)->getElementType();
213
214      // If this is a constant subscript, handle it quickly.
215      if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) {
216        if (CI->getZExtValue() == 0) continue;
217        uint64_t Offs =
218          TD.getABITypeSize(Ty)*cast<ConstantInt>(CI)->getSExtValue();
219        N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT);
220        if (N == 0)
221          // Unhandled operand. Halt "fast" selection and bail.
222          return false;
223        continue;
224      }
225
226      // N = N + Idx * ElementSize;
227      uint64_t ElementSize = TD.getABITypeSize(Ty);
228      unsigned IdxN = getRegForValue(Idx);
229      if (IdxN == 0)
230        // Unhandled operand. Halt "fast" selection and bail.
231        return false;
232
233      // If the index is smaller or larger than intptr_t, truncate or extend
234      // it.
235      MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false);
236      if (IdxVT.bitsLT(VT))
237        IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::SIGN_EXTEND, IdxN);
238      else if (IdxVT.bitsGT(VT))
239        IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::TRUNCATE, IdxN);
240      if (IdxN == 0)
241        // Unhandled operand. Halt "fast" selection and bail.
242        return false;
243
244      if (ElementSize != 1) {
245        IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT);
246        if (IdxN == 0)
247          // Unhandled operand. Halt "fast" selection and bail.
248          return false;
249      }
250      N = FastEmit_rr(VT, VT, ISD::ADD, N, IdxN);
251      if (N == 0)
252        // Unhandled operand. Halt "fast" selection and bail.
253        return false;
254    }
255  }
256
257  // We successfully emitted code for the given LLVM Instruction.
258  UpdateValueMap(I, N);
259  return true;
260}
261
262bool FastISel::SelectCast(User *I, ISD::NodeType Opcode) {
263  MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
264  MVT DstVT = TLI.getValueType(I->getType());
265
266  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
267      DstVT == MVT::Other || !DstVT.isSimple() ||
268      !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT))
269    // Unhandled type. Halt "fast" selection and bail.
270    return false;
271
272  unsigned InputReg = getRegForValue(I->getOperand(0));
273  if (!InputReg)
274    // Unhandled operand.  Halt "fast" selection and bail.
275    return false;
276
277  unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(),
278                                  DstVT.getSimpleVT(),
279                                  Opcode,
280                                  InputReg);
281  if (!ResultReg)
282    return false;
283
284  UpdateValueMap(I, ResultReg);
285  return true;
286}
287
288bool FastISel::SelectBitCast(User *I) {
289  // If the bitcast doesn't change the type, just use the operand value.
290  if (I->getType() == I->getOperand(0)->getType()) {
291    unsigned Reg = getRegForValue(I->getOperand(0));
292    if (Reg == 0)
293      return false;
294    UpdateValueMap(I, Reg);
295    return true;
296  }
297
298  // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators.
299  MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
300  MVT DstVT = TLI.getValueType(I->getType());
301
302  if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
303      DstVT == MVT::Other || !DstVT.isSimple() ||
304      !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT))
305    // Unhandled type. Halt "fast" selection and bail.
306    return false;
307
308  unsigned Op0 = getRegForValue(I->getOperand(0));
309  if (Op0 == 0)
310    // Unhandled operand. Halt "fast" selection and bail.
311    return false;
312
313  // First, try to perform the bitcast by inserting a reg-reg copy.
314  unsigned ResultReg = 0;
315  if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) {
316    TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT);
317    TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT);
318    ResultReg = createResultReg(DstClass);
319
320    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
321                                         Op0, DstClass, SrcClass);
322    if (!InsertedCopy)
323      ResultReg = 0;
324  }
325
326  // If the reg-reg copy failed, select a BIT_CONVERT opcode.
327  if (!ResultReg)
328    ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(),
329                           ISD::BIT_CONVERT, Op0);
330
331  if (!ResultReg)
332    return false;
333
334  UpdateValueMap(I, ResultReg);
335  return true;
336}
337
338bool
339FastISel::SelectInstruction(Instruction *I) {
340  return SelectOperator(I, I->getOpcode());
341}
342
343bool
344FastISel::SelectOperator(User *I, unsigned Opcode) {
345  switch (Opcode) {
346  case Instruction::Add: {
347    ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FADD : ISD::ADD;
348    return SelectBinaryOp(I, Opc);
349  }
350  case Instruction::Sub: {
351    ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FSUB : ISD::SUB;
352    return SelectBinaryOp(I, Opc);
353  }
354  case Instruction::Mul: {
355    ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FMUL : ISD::MUL;
356    return SelectBinaryOp(I, Opc);
357  }
358  case Instruction::SDiv:
359    return SelectBinaryOp(I, ISD::SDIV);
360  case Instruction::UDiv:
361    return SelectBinaryOp(I, ISD::UDIV);
362  case Instruction::FDiv:
363    return SelectBinaryOp(I, ISD::FDIV);
364  case Instruction::SRem:
365    return SelectBinaryOp(I, ISD::SREM);
366  case Instruction::URem:
367    return SelectBinaryOp(I, ISD::UREM);
368  case Instruction::FRem:
369    return SelectBinaryOp(I, ISD::FREM);
370  case Instruction::Shl:
371    return SelectBinaryOp(I, ISD::SHL);
372  case Instruction::LShr:
373    return SelectBinaryOp(I, ISD::SRL);
374  case Instruction::AShr:
375    return SelectBinaryOp(I, ISD::SRA);
376  case Instruction::And:
377    return SelectBinaryOp(I, ISD::AND);
378  case Instruction::Or:
379    return SelectBinaryOp(I, ISD::OR);
380  case Instruction::Xor:
381    return SelectBinaryOp(I, ISD::XOR);
382
383  case Instruction::GetElementPtr:
384    return SelectGetElementPtr(I);
385
386  case Instruction::Br: {
387    BranchInst *BI = cast<BranchInst>(I);
388
389    if (BI->isUnconditional()) {
390      MachineFunction::iterator NextMBB =
391         next(MachineFunction::iterator(MBB));
392      BasicBlock *LLVMSucc = BI->getSuccessor(0);
393      MachineBasicBlock *MSucc = MBBMap[LLVMSucc];
394
395      if (NextMBB != MF.end() && MSucc == NextMBB) {
396        // The unconditional fall-through case, which needs no instructions.
397      } else {
398        // The unconditional branch case.
399        TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>());
400      }
401      MBB->addSuccessor(MSucc);
402      return true;
403    }
404
405    // Conditional branches are not handed yet.
406    // Halt "fast" selection and bail.
407    return false;
408  }
409
410  case Instruction::Unreachable:
411    // Nothing to emit.
412    return true;
413
414  case Instruction::PHI:
415    // PHI nodes are already emitted.
416    return true;
417
418  case Instruction::BitCast:
419    return SelectBitCast(I);
420
421  case Instruction::FPToSI:
422    return SelectCast(I, ISD::FP_TO_SINT);
423  case Instruction::ZExt:
424    return SelectCast(I, ISD::ZERO_EXTEND);
425  case Instruction::SExt:
426    return SelectCast(I, ISD::SIGN_EXTEND);
427  case Instruction::Trunc:
428    return SelectCast(I, ISD::TRUNCATE);
429  case Instruction::SIToFP:
430    return SelectCast(I, ISD::SINT_TO_FP);
431
432  case Instruction::IntToPtr: // Deliberate fall-through.
433  case Instruction::PtrToInt: {
434    MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
435    MVT DstVT = TLI.getValueType(I->getType());
436    if (DstVT.bitsGT(SrcVT))
437      return SelectCast(I, ISD::ZERO_EXTEND);
438    if (DstVT.bitsLT(SrcVT))
439      return SelectCast(I, ISD::TRUNCATE);
440    unsigned Reg = getRegForValue(I->getOperand(0));
441    if (Reg == 0) return false;
442    UpdateValueMap(I, Reg);
443    return true;
444  }
445
446  default:
447    // Unhandled instruction. Halt "fast" selection and bail.
448    return false;
449  }
450}
451
452FastISel::FastISel(MachineFunction &mf,
453                   DenseMap<const Value *, unsigned> &vm,
454                   DenseMap<const BasicBlock *, MachineBasicBlock *> &bm)
455  : MBB(0),
456    ValueMap(vm),
457    MBBMap(bm),
458    MF(mf),
459    MRI(MF.getRegInfo()),
460    TM(MF.getTarget()),
461    TD(*TM.getTargetData()),
462    TII(*TM.getInstrInfo()),
463    TLI(*TM.getTargetLowering()) {
464}
465
466FastISel::~FastISel() {}
467
468unsigned FastISel::FastEmit_(MVT::SimpleValueType, MVT::SimpleValueType,
469                             ISD::NodeType) {
470  return 0;
471}
472
473unsigned FastISel::FastEmit_r(MVT::SimpleValueType, MVT::SimpleValueType,
474                              ISD::NodeType, unsigned /*Op0*/) {
475  return 0;
476}
477
478unsigned FastISel::FastEmit_rr(MVT::SimpleValueType, MVT::SimpleValueType,
479                               ISD::NodeType, unsigned /*Op0*/,
480                               unsigned /*Op0*/) {
481  return 0;
482}
483
484unsigned FastISel::FastEmit_i(MVT::SimpleValueType, MVT::SimpleValueType,
485                              ISD::NodeType, uint64_t /*Imm*/) {
486  return 0;
487}
488
489unsigned FastISel::FastEmit_f(MVT::SimpleValueType, MVT::SimpleValueType,
490                              ISD::NodeType, ConstantFP * /*FPImm*/) {
491  return 0;
492}
493
494unsigned FastISel::FastEmit_ri(MVT::SimpleValueType, MVT::SimpleValueType,
495                               ISD::NodeType, unsigned /*Op0*/,
496                               uint64_t /*Imm*/) {
497  return 0;
498}
499
500unsigned FastISel::FastEmit_rf(MVT::SimpleValueType, MVT::SimpleValueType,
501                               ISD::NodeType, unsigned /*Op0*/,
502                               ConstantFP * /*FPImm*/) {
503  return 0;
504}
505
506unsigned FastISel::FastEmit_rri(MVT::SimpleValueType, MVT::SimpleValueType,
507                                ISD::NodeType,
508                                unsigned /*Op0*/, unsigned /*Op1*/,
509                                uint64_t /*Imm*/) {
510  return 0;
511}
512
513/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
514/// to emit an instruction with an immediate operand using FastEmit_ri.
515/// If that fails, it materializes the immediate into a register and try
516/// FastEmit_rr instead.
517unsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode,
518                                unsigned Op0, uint64_t Imm,
519                                MVT::SimpleValueType ImmType) {
520  // First check if immediate type is legal. If not, we can't use the ri form.
521  unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm);
522  if (ResultReg != 0)
523    return ResultReg;
524  unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm);
525  if (MaterialReg == 0)
526    return 0;
527  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
528}
529
530/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries
531/// to emit an instruction with a floating-point immediate operand using
532/// FastEmit_rf. If that fails, it materializes the immediate into a register
533/// and try FastEmit_rr instead.
534unsigned FastISel::FastEmit_rf_(MVT::SimpleValueType VT, ISD::NodeType Opcode,
535                                unsigned Op0, ConstantFP *FPImm,
536                                MVT::SimpleValueType ImmType) {
537  // First check if immediate type is legal. If not, we can't use the rf form.
538  unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm);
539  if (ResultReg != 0)
540    return ResultReg;
541
542  // Materialize the constant in a register.
543  unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm);
544  if (MaterialReg == 0) {
545    // If the target doesn't have a way to directly enter a floating-point
546    // value into a register, use an alternate approach.
547    // TODO: The current approach only supports floating-point constants
548    // that can be constructed by conversion from integer values. This should
549    // be replaced by code that creates a load from a constant-pool entry,
550    // which will require some target-specific work.
551    const APFloat &Flt = FPImm->getValueAPF();
552    MVT IntVT = TLI.getPointerTy();
553
554    uint64_t x[2];
555    uint32_t IntBitWidth = IntVT.getSizeInBits();
556    if (Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true,
557                             APFloat::rmTowardZero) != APFloat::opOK)
558      return 0;
559    APInt IntVal(IntBitWidth, 2, x);
560
561    unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(),
562                                     ISD::Constant, IntVal.getZExtValue());
563    if (IntegerReg == 0)
564      return 0;
565    MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT,
566                             ISD::SINT_TO_FP, IntegerReg);
567    if (MaterialReg == 0)
568      return 0;
569  }
570  return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg);
571}
572
573unsigned FastISel::createResultReg(const TargetRegisterClass* RC) {
574  return MRI.createVirtualRegister(RC);
575}
576
577unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
578                                 const TargetRegisterClass* RC) {
579  unsigned ResultReg = createResultReg(RC);
580  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
581
582  BuildMI(MBB, II, ResultReg);
583  return ResultReg;
584}
585
586unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
587                                  const TargetRegisterClass *RC,
588                                  unsigned Op0) {
589  unsigned ResultReg = createResultReg(RC);
590  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
591
592  if (II.getNumDefs() >= 1)
593    BuildMI(MBB, II, ResultReg).addReg(Op0);
594  else {
595    BuildMI(MBB, II).addReg(Op0);
596    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
597                                         II.ImplicitDefs[0], RC, RC);
598    if (!InsertedCopy)
599      ResultReg = 0;
600  }
601
602  return ResultReg;
603}
604
605unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
606                                   const TargetRegisterClass *RC,
607                                   unsigned Op0, unsigned Op1) {
608  unsigned ResultReg = createResultReg(RC);
609  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
610
611  if (II.getNumDefs() >= 1)
612    BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1);
613  else {
614    BuildMI(MBB, II).addReg(Op0).addReg(Op1);
615    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
616                                         II.ImplicitDefs[0], RC, RC);
617    if (!InsertedCopy)
618      ResultReg = 0;
619  }
620  return ResultReg;
621}
622
623unsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode,
624                                   const TargetRegisterClass *RC,
625                                   unsigned Op0, uint64_t Imm) {
626  unsigned ResultReg = createResultReg(RC);
627  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
628
629  if (II.getNumDefs() >= 1)
630    BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Imm);
631  else {
632    BuildMI(MBB, II).addReg(Op0).addImm(Imm);
633    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
634                                         II.ImplicitDefs[0], RC, RC);
635    if (!InsertedCopy)
636      ResultReg = 0;
637  }
638  return ResultReg;
639}
640
641unsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode,
642                                   const TargetRegisterClass *RC,
643                                   unsigned Op0, ConstantFP *FPImm) {
644  unsigned ResultReg = createResultReg(RC);
645  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
646
647  if (II.getNumDefs() >= 1)
648    BuildMI(MBB, II, ResultReg).addReg(Op0).addFPImm(FPImm);
649  else {
650    BuildMI(MBB, II).addReg(Op0).addFPImm(FPImm);
651    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
652                                         II.ImplicitDefs[0], RC, RC);
653    if (!InsertedCopy)
654      ResultReg = 0;
655  }
656  return ResultReg;
657}
658
659unsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode,
660                                    const TargetRegisterClass *RC,
661                                    unsigned Op0, unsigned Op1, uint64_t Imm) {
662  unsigned ResultReg = createResultReg(RC);
663  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
664
665  if (II.getNumDefs() >= 1)
666    BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm);
667  else {
668    BuildMI(MBB, II).addReg(Op0).addReg(Op1).addImm(Imm);
669    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
670                                         II.ImplicitDefs[0], RC, RC);
671    if (!InsertedCopy)
672      ResultReg = 0;
673  }
674  return ResultReg;
675}
676
677unsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode,
678                                  const TargetRegisterClass *RC,
679                                  uint64_t Imm) {
680  unsigned ResultReg = createResultReg(RC);
681  const TargetInstrDesc &II = TII.get(MachineInstOpcode);
682
683  if (II.getNumDefs() >= 1)
684    BuildMI(MBB, II, ResultReg).addImm(Imm);
685  else {
686    BuildMI(MBB, II).addImm(Imm);
687    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
688                                         II.ImplicitDefs[0], RC, RC);
689    if (!InsertedCopy)
690      ResultReg = 0;
691  }
692  return ResultReg;
693}
694
695unsigned FastISel::FastEmitInst_extractsubreg(unsigned Op0, uint32_t Idx) {
696  const TargetRegisterClass* RC = MRI.getRegClass(Op0);
697  const TargetRegisterClass* SRC = *(RC->subregclasses_begin()+Idx-1);
698
699  unsigned ResultReg = createResultReg(SRC);
700  const TargetInstrDesc &II = TII.get(TargetInstrInfo::EXTRACT_SUBREG);
701
702  if (II.getNumDefs() >= 1)
703    BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Idx);
704  else {
705    BuildMI(MBB, II).addReg(Op0).addImm(Idx);
706    bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg,
707                                         II.ImplicitDefs[0], RC, RC);
708    if (!InsertedCopy)
709      ResultReg = 0;
710  }
711  return ResultReg;
712}
713