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