Fix a constant lowering bug. Now we can do load and store instructions with funky...
[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) {
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
91 unsigned 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.
107 void 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 ///
122 bool 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
187 bool 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
262 bool 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
288 bool 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
338 bool
339 FastISel::SelectInstruction(Instruction *I) {
340   return SelectOperator(I, I->getOpcode());
341 }
342
343 bool
344 FastISel::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
452 FastISel::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
466 FastISel::~FastISel() {}
467
468 unsigned FastISel::FastEmit_(MVT::SimpleValueType, MVT::SimpleValueType,
469                              ISD::NodeType) {
470   return 0;
471 }
472
473 unsigned FastISel::FastEmit_r(MVT::SimpleValueType, MVT::SimpleValueType,
474                               ISD::NodeType, unsigned /*Op0*/) {
475   return 0;
476 }
477
478 unsigned FastISel::FastEmit_rr(MVT::SimpleValueType, MVT::SimpleValueType, 
479                                ISD::NodeType, unsigned /*Op0*/,
480                                unsigned /*Op0*/) {
481   return 0;
482 }
483
484 unsigned FastISel::FastEmit_i(MVT::SimpleValueType, MVT::SimpleValueType,
485                               ISD::NodeType, uint64_t /*Imm*/) {
486   return 0;
487 }
488
489 unsigned FastISel::FastEmit_f(MVT::SimpleValueType, MVT::SimpleValueType,
490                               ISD::NodeType, ConstantFP * /*FPImm*/) {
491   return 0;
492 }
493
494 unsigned FastISel::FastEmit_ri(MVT::SimpleValueType, MVT::SimpleValueType,
495                                ISD::NodeType, unsigned /*Op0*/,
496                                uint64_t /*Imm*/) {
497   return 0;
498 }
499
500 unsigned FastISel::FastEmit_rf(MVT::SimpleValueType, MVT::SimpleValueType,
501                                ISD::NodeType, unsigned /*Op0*/,
502                                ConstantFP * /*FPImm*/) {
503   return 0;
504 }
505
506 unsigned 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.
517 unsigned 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.
534 unsigned 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
573 unsigned FastISel::createResultReg(const TargetRegisterClass* RC) {
574   return MRI.createVirtualRegister(RC);
575 }
576
577 unsigned 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
586 unsigned 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
605 unsigned 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
623 unsigned 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
641 unsigned 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
659 unsigned 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
677 unsigned 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
695 unsigned 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 }