Implement vacopy and vanext.
[oota-llvm.git] / lib / Target / SparcV8 / SparcV8ISelSimple.cpp
1 //===-- InstSelectSimple.cpp - A simple instruction selector for SparcV8 --===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines a simple peephole instruction selector for the V8 target
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "SparcV8.h"
15 #include "SparcV8InstrInfo.h"
16 #include "llvm/Support/Debug.h"
17 #include "llvm/Instructions.h"
18 #include "llvm/Pass.h"
19 #include "llvm/Constants.h"
20 #include "llvm/CodeGen/IntrinsicLowering.h"
21 #include "llvm/CodeGen/MachineInstrBuilder.h"
22 #include "llvm/CodeGen/MachineFrameInfo.h"
23 #include "llvm/CodeGen/MachineConstantPool.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/SSARegMap.h"
26 #include "llvm/Target/TargetMachine.h"
27 #include "llvm/Support/GetElementPtrTypeIterator.h"
28 #include "llvm/Support/InstVisitor.h"
29 #include "llvm/Support/CFG.h"
30 using namespace llvm;
31
32 namespace {
33   struct V8ISel : public FunctionPass, public InstVisitor<V8ISel> {
34     TargetMachine &TM;
35     MachineFunction *F;                 // The function we are compiling into
36     MachineBasicBlock *BB;              // The current MBB we are compiling
37     int VarArgsOffset;                  // Offset from fp for start of varargs area
38
39     std::map<Value*, unsigned> RegMap;  // Mapping between Val's and SSA Regs
40
41     // MBBMap - Mapping between LLVM BB -> Machine BB
42     std::map<const BasicBlock*, MachineBasicBlock*> MBBMap;
43
44     V8ISel(TargetMachine &tm) : TM(tm), F(0), BB(0) {}
45
46     /// runOnFunction - Top level implementation of instruction selection for
47     /// the entire function.
48     ///
49     bool runOnFunction(Function &Fn);
50
51     virtual const char *getPassName() const {
52       return "SparcV8 Simple Instruction Selection";
53     }
54
55     /// emitGEPOperation - Common code shared between visitGetElementPtrInst and
56     /// constant expression GEP support.
57     ///
58     void emitGEPOperation(MachineBasicBlock *BB, MachineBasicBlock::iterator IP,
59                           Value *Src, User::op_iterator IdxBegin,
60                           User::op_iterator IdxEnd, unsigned TargetReg);
61
62     /// emitCastOperation - Common code shared between visitCastInst and
63     /// constant expression cast support.
64     ///
65     void emitCastOperation(MachineBasicBlock *BB,MachineBasicBlock::iterator IP,
66                            Value *Src, const Type *DestTy, unsigned TargetReg);
67
68     /// emitIntegerCast, emitFPToIntegerCast - Helper methods for
69     /// emitCastOperation.
70     ///
71     unsigned emitIntegerCast (MachineBasicBlock *BB,
72                               MachineBasicBlock::iterator IP,
73                               const Type *oldTy, unsigned SrcReg,
74                               const Type *newTy, unsigned DestReg);
75     void emitFPToIntegerCast (MachineBasicBlock *BB,
76                               MachineBasicBlock::iterator IP, const Type *oldTy,
77                               unsigned SrcReg, const Type *newTy,
78                               unsigned DestReg);
79
80     /// visitBasicBlock - This method is called when we are visiting a new basic
81     /// block.  This simply creates a new MachineBasicBlock to emit code into
82     /// and adds it to the current MachineFunction.  Subsequent visit* for
83     /// instructions will be invoked for all instructions in the basic block.
84     ///
85     void visitBasicBlock(BasicBlock &LLVM_BB) {
86       BB = MBBMap[&LLVM_BB];
87     }
88
89     void visitBinaryOperator(Instruction &I);
90     void visitShiftInst (ShiftInst &SI) { visitBinaryOperator (SI); }
91     void visitSetCondInst(SetCondInst &I);
92     void visitCallInst(CallInst &I);
93     void visitReturnInst(ReturnInst &I);
94     void visitBranchInst(BranchInst &I);
95     void visitUnreachableInst(UnreachableInst &I) {}
96     void visitCastInst(CastInst &I);
97     void visitVANextInst(VANextInst &I);
98     void visitVAArgInst(VAArgInst &I);
99     void visitLoadInst(LoadInst &I);
100     void visitStoreInst(StoreInst &I);
101     void visitPHINode(PHINode &I) {}      // PHI nodes handled by second pass
102     void visitGetElementPtrInst(GetElementPtrInst &I);
103     void visitAllocaInst(AllocaInst &I);
104
105     void visitInstruction(Instruction &I) {
106       std::cerr << "Unhandled instruction: " << I;
107       abort();
108     }
109
110     /// LowerUnknownIntrinsicFunctionCalls - This performs a prepass over the
111     /// function, lowering any calls to unknown intrinsic functions into the
112     /// equivalent LLVM code.
113     void LowerUnknownIntrinsicFunctionCalls(Function &F);
114     void visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI);
115
116     void LoadArgumentsToVirtualRegs(Function *F);
117
118     /// SelectPHINodes - Insert machine code to generate phis.  This is tricky
119     /// because we have to generate our sources into the source basic blocks,
120     /// not the current one.
121     ///
122     void SelectPHINodes();
123
124     /// copyConstantToRegister - Output the instructions required to put the
125     /// specified constant into the specified register.
126     ///
127     void copyConstantToRegister(MachineBasicBlock *MBB,
128                                 MachineBasicBlock::iterator IP,
129                                 Constant *C, unsigned R);
130
131     /// makeAnotherReg - This method returns the next register number we haven't
132     /// yet used.
133     ///
134     /// Long values are handled somewhat specially.  They are always allocated
135     /// as pairs of 32 bit integer values.  The register number returned is the
136     /// lower 32 bits of the long value, and the regNum+1 is the upper 32 bits
137     /// of the long value.
138     ///
139     unsigned makeAnotherReg(const Type *Ty) {
140       assert(dynamic_cast<const SparcV8RegisterInfo*>(TM.getRegisterInfo()) &&
141              "Current target doesn't have SparcV8 reg info??");
142       const SparcV8RegisterInfo *MRI =
143         static_cast<const SparcV8RegisterInfo*>(TM.getRegisterInfo());
144       if (Ty == Type::LongTy || Ty == Type::ULongTy) {
145         const TargetRegisterClass *RC = MRI->getRegClassForType(Type::IntTy);
146         // Create the lower part
147         F->getSSARegMap()->createVirtualRegister(RC);
148         // Create the upper part.
149         return F->getSSARegMap()->createVirtualRegister(RC)-1;
150       }
151
152       // Add the mapping of regnumber => reg class to MachineFunction
153       const TargetRegisterClass *RC = MRI->getRegClassForType(Ty);
154       return F->getSSARegMap()->createVirtualRegister(RC);
155     }
156
157     unsigned getReg(Value &V) { return getReg (&V); } // allow refs.
158     unsigned getReg(Value *V) {
159       // Just append to the end of the current bb.
160       MachineBasicBlock::iterator It = BB->end();
161       return getReg(V, BB, It);
162     }
163     unsigned getReg(Value *V, MachineBasicBlock *MBB,
164                     MachineBasicBlock::iterator IPt) {
165       unsigned &Reg = RegMap[V];
166       if (Reg == 0) {
167         Reg = makeAnotherReg(V->getType());
168         RegMap[V] = Reg;
169       }
170       // If this operand is a constant, emit the code to copy the constant into
171       // the register here...
172       //
173       if (Constant *C = dyn_cast<Constant>(V)) {
174         copyConstantToRegister(MBB, IPt, C, Reg);
175         RegMap.erase(V);  // Assign a new name to this constant if ref'd again
176       } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
177         // Move the address of the global into the register
178         unsigned TmpReg = makeAnotherReg(V->getType());
179         BuildMI (*MBB, IPt, V8::SETHIi, 1, TmpReg).addGlobalAddress (GV);
180         BuildMI (*MBB, IPt, V8::ORri, 2, Reg).addReg (TmpReg)
181           .addGlobalAddress (GV);
182         RegMap.erase(V);  // Assign a new name to this address if ref'd again
183       }
184
185       return Reg;
186     }
187
188   };
189 }
190
191 FunctionPass *llvm::createSparcV8SimpleInstructionSelector(TargetMachine &TM) {
192   return new V8ISel(TM);
193 }
194
195 enum TypeClass {
196   cByte, cShort, cInt, cLong, cFloat, cDouble
197 };
198
199 static TypeClass getClass (const Type *T) {
200   switch (T->getTypeID()) {
201     case Type::UByteTyID:  case Type::SByteTyID:  return cByte;
202     case Type::UShortTyID: case Type::ShortTyID:  return cShort;
203     case Type::PointerTyID:
204     case Type::UIntTyID:   case Type::IntTyID:    return cInt;
205     case Type::ULongTyID:  case Type::LongTyID:   return cLong;
206     case Type::FloatTyID:                         return cFloat;
207     case Type::DoubleTyID:                        return cDouble;
208     default:
209       assert (0 && "Type of unknown class passed to getClass?");
210       return cByte;
211   }
212 }
213
214 static TypeClass getClassB(const Type *T) {
215   if (T == Type::BoolTy) return cByte;
216   return getClass(T);
217 }
218
219 /// copyConstantToRegister - Output the instructions required to put the
220 /// specified constant into the specified register.
221 ///
222 void V8ISel::copyConstantToRegister(MachineBasicBlock *MBB,
223                                     MachineBasicBlock::iterator IP,
224                                     Constant *C, unsigned R) {
225   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
226     switch (CE->getOpcode()) {
227     case Instruction::GetElementPtr:
228       emitGEPOperation(MBB, IP, CE->getOperand(0),
229                        CE->op_begin()+1, CE->op_end(), R);
230       return;
231     case Instruction::Cast:
232       emitCastOperation(MBB, IP, CE->getOperand(0), CE->getType(), R);
233       return;
234     default:
235       std::cerr << "Copying this constant expr not yet handled: " << *CE;
236       abort();
237     }
238   } else if (isa<UndefValue>(C)) {
239     BuildMI(*MBB, IP, V8::IMPLICIT_DEF, 0, R);
240     if (getClassB (C->getType ()) == cLong)
241       BuildMI(*MBB, IP, V8::IMPLICIT_DEF, 0, R+1);
242     return;
243   }
244
245   if (C->getType()->isIntegral ()) {
246     uint64_t Val;
247     unsigned Class = getClassB (C->getType ());
248     if (Class == cLong) {
249       unsigned TmpReg = makeAnotherReg (Type::IntTy);
250       unsigned TmpReg2 = makeAnotherReg (Type::IntTy);
251       // Copy the value into the register pair.
252       // R = top(more-significant) half, R+1 = bottom(less-significant) half
253       uint64_t Val = cast<ConstantInt>(C)->getRawValue();
254       copyConstantToRegister(MBB, IP, ConstantUInt::get(Type::UIntTy,
255                              Val >> 32), R);
256       copyConstantToRegister(MBB, IP, ConstantUInt::get(Type::UIntTy,
257                              Val & 0xffffffffU), R+1);
258       return;
259     }
260
261     assert(Class <= cInt && "Type not handled yet!");
262
263     if (C->getType() == Type::BoolTy) {
264       Val = (C == ConstantBool::True);
265     } else {
266       ConstantInt *CI = cast<ConstantInt> (C);
267       Val = CI->getRawValue ();
268     }
269     switch (Class) {
270       case cByte:  Val =  (int8_t) Val; break;
271       case cShort: Val = (int16_t) Val; break;
272       case cInt:   Val = (int32_t) Val; break;
273       default:
274         std::cerr << "Offending constant: " << *C << "\n";
275         assert (0 && "Can't copy this kind of constant into register yet");
276         return;
277     }
278     if (Val == 0) {
279       BuildMI (*MBB, IP, V8::ORrr, 2, R).addReg (V8::G0).addReg(V8::G0);
280     } else if (((int64_t)Val >= -4096) && ((int64_t)Val <= 4095)) {
281       BuildMI (*MBB, IP, V8::ORri, 2, R).addReg (V8::G0).addSImm(Val);
282     } else {
283       unsigned TmpReg = makeAnotherReg (C->getType ());
284       BuildMI (*MBB, IP, V8::SETHIi, 1, TmpReg)
285         .addSImm (((uint32_t) Val) >> 10);
286       BuildMI (*MBB, IP, V8::ORri, 2, R).addReg (TmpReg)
287         .addSImm (((uint32_t) Val) & 0x03ff);
288       return;
289     }
290   } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
291     // We need to spill the constant to memory...
292     MachineConstantPool *CP = F->getConstantPool();
293     unsigned CPI = CP->getConstantPoolIndex(CFP);
294     const Type *Ty = CFP->getType();
295     unsigned TmpReg = makeAnotherReg (Type::UIntTy);
296     unsigned AddrReg = makeAnotherReg (Type::UIntTy);
297
298     assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
299     unsigned LoadOpcode = Ty == Type::FloatTy ? V8::LDFri : V8::LDDFri;
300     BuildMI (*MBB, IP, V8::SETHIi, 1, TmpReg).addConstantPoolIndex (CPI);
301     BuildMI (*MBB, IP, V8::ORri, 2, AddrReg).addReg (TmpReg)
302       .addConstantPoolIndex (CPI);
303     BuildMI (*MBB, IP, LoadOpcode, 2, R).addReg (AddrReg).addSImm (0);
304   } else if (isa<ConstantPointerNull>(C)) {
305     // Copy zero (null pointer) to the register.
306     BuildMI (*MBB, IP, V8::ORri, 2, R).addReg (V8::G0).addSImm (0);
307   } else if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) {
308     // Copy it with a SETHI/OR pair; the JIT + asmwriter should recognize
309     // that SETHI %reg,global == SETHI %reg,%hi(global) and 
310     // OR %reg,global,%reg == OR %reg,%lo(global),%reg.
311     unsigned TmpReg = makeAnotherReg (C->getType ());
312     BuildMI (*MBB, IP, V8::SETHIi, 1, TmpReg).addGlobalAddress(GV);
313     BuildMI (*MBB, IP, V8::ORri, 2, R).addReg(TmpReg).addGlobalAddress(GV);
314   } else {
315     std::cerr << "Offending constant: " << *C << "\n";
316     assert (0 && "Can't copy this kind of constant into register yet");
317   }
318 }
319
320 void V8ISel::LoadArgumentsToVirtualRegs (Function *LF) {
321   static const unsigned IncomingArgRegs[] = { V8::I0, V8::I1, V8::I2,
322     V8::I3, V8::I4, V8::I5 };
323
324   // Add IMPLICIT_DEFs of input regs.
325   unsigned ArgNo = 0;
326   for (Function::aiterator I = LF->abegin(), E = LF->aend();
327        I != E && ArgNo < 6; ++I, ++ArgNo) {
328     switch (getClassB(I->getType())) {
329     case cByte:
330     case cShort:
331     case cInt:
332     case cFloat:
333       BuildMI(BB, V8::IMPLICIT_DEF, 0, IncomingArgRegs[ArgNo]);
334       break;
335     case cDouble:
336     case cLong:
337       // Double and Long use register pairs.
338       BuildMI(BB, V8::IMPLICIT_DEF, 0, IncomingArgRegs[ArgNo]);
339       ++ArgNo;
340       if (ArgNo < 6)
341         BuildMI(BB, V8::IMPLICIT_DEF, 0, IncomingArgRegs[ArgNo]);
342       break;
343     default:
344       assert (0 && "type not handled");
345       return;
346     }
347   }
348
349   const unsigned *IAREnd = &IncomingArgRegs[6];
350   const unsigned *IAR = &IncomingArgRegs[0];
351   unsigned ArgOffset = 68;
352
353   // Store registers onto stack if this is a varargs function. 
354   // FIXME: This doesn't really pertain to "loading arguments into
355   // virtual registers", so it's not clear that it really belongs here.
356   // FIXME: We could avoid storing any args onto the stack that don't 
357   // need to be in memory, because they come before the ellipsis in the
358   // parameter list (and thus could never be accessed through va_arg).
359   if (LF->getFunctionType ()->isVarArg ()) {
360     for (unsigned i = 0; i < 6; ++i) {
361       int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
362       assert (IAR != IAREnd
363               && "About to dereference past end of IncomingArgRegs");
364       BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (0).addReg (*IAR++);
365       ArgOffset += 4;
366     }
367     // Reset the pointers now that we're done.
368     ArgOffset = 68;
369     IAR = &IncomingArgRegs[0];
370   }
371
372   // Copy args out of their incoming hard regs or stack slots into virtual regs.
373   for (Function::aiterator I = LF->abegin(), E = LF->aend(); I != E; ++I) {
374     Argument &A = *I;
375     unsigned ArgReg = getReg (A);
376     if (getClassB (A.getType ()) < cLong) {
377       // Get it out of the incoming arg register
378       if (ArgOffset < 92) {
379         assert (IAR != IAREnd
380                 && "About to dereference past end of IncomingArgRegs");
381         BuildMI (BB, V8::ORrr, 2, ArgReg).addReg (V8::G0).addReg (*IAR++);
382       } else {
383         int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
384         BuildMI (BB, V8::LD, 3, ArgReg).addFrameIndex (FI).addSImm (0);
385       }
386       ArgOffset += 4;
387     } else if (getClassB (A.getType ()) == cFloat) {
388       if (ArgOffset < 92) {
389         // Single-fp args are passed in integer registers; go through
390         // memory to get them out of integer registers and back into fp. (Bleh!)
391         unsigned FltAlign = TM.getTargetData().getFloatAlignment();
392         int FI = F->getFrameInfo()->CreateStackObject(4, FltAlign);
393         assert (IAR != IAREnd
394                 && "About to dereference past end of IncomingArgRegs");
395         BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (0).addReg (*IAR++);
396         BuildMI (BB, V8::LDFri, 2, ArgReg).addFrameIndex (FI).addSImm (0);
397       } else {
398         int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
399         BuildMI (BB, V8::LDFri, 3, ArgReg).addFrameIndex (FI).addSImm (0);
400       }
401       ArgOffset += 4;
402     } else if (getClassB (A.getType ()) == cDouble) {
403       // Double-fp args are passed in pairs of integer registers; go through
404       // memory to get them out of integer registers and back into fp. (Bleh!)
405       // We'd like to 'ldd' these right out of the incoming-args area,
406       // but it might not be 8-byte aligned (e.g., call x(int x, double d)).
407       unsigned DblAlign = TM.getTargetData().getDoubleAlignment();
408       int FI = F->getFrameInfo()->CreateStackObject(8, DblAlign);
409       if (ArgOffset < 92 && IAR != IAREnd) {
410         BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (0).addReg (*IAR++);
411       } else {
412         unsigned TempReg = makeAnotherReg (Type::IntTy);
413         BuildMI (BB, V8::LD, 2, TempReg).addFrameIndex (FI).addSImm (0);
414         BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (0).addReg (TempReg);
415       }
416       ArgOffset += 4;
417       if (ArgOffset < 92 && IAR != IAREnd) {
418         BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (4).addReg (*IAR++);
419       } else {
420         unsigned TempReg = makeAnotherReg (Type::IntTy);
421         BuildMI (BB, V8::LD, 2, TempReg).addFrameIndex (FI).addSImm (4);
422         BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (4).addReg (TempReg);
423       }
424       ArgOffset += 4;
425       BuildMI (BB, V8::LDDFri, 2, ArgReg).addFrameIndex (FI).addSImm (0);
426     } else if (getClassB (A.getType ()) == cLong) {
427       // do the first half...
428       if (ArgOffset < 92) {
429         assert (IAR != IAREnd
430                 && "About to dereference past end of IncomingArgRegs");
431         BuildMI (BB, V8::ORrr, 2, ArgReg).addReg (V8::G0).addReg (*IAR++);
432       } else {
433         int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
434         BuildMI (BB, V8::LD, 2, ArgReg).addFrameIndex (FI).addSImm (0);
435       }
436       ArgOffset += 4;
437       // ...then do the second half
438       if (ArgOffset < 92) {
439         assert (IAR != IAREnd
440                 && "About to dereference past end of IncomingArgRegs");
441         BuildMI (BB, V8::ORrr, 2, ArgReg+1).addReg (V8::G0).addReg (*IAR++);
442       } else {
443         int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
444         BuildMI (BB, V8::LD, 2, ArgReg+1).addFrameIndex (FI).addSImm (0);
445       }
446       ArgOffset += 4;
447     } else {
448       assert (0 && "Unknown class?!");
449     }
450   }
451
452   // If the function takes variable number of arguments, remember the fp
453   // offset for the start of the first vararg value... this is used to expand
454   // llvm.va_start.
455   if (LF->getFunctionType ()->isVarArg ())
456     VarArgsOffset = ArgOffset;
457 }
458
459 void V8ISel::SelectPHINodes() {
460   const TargetInstrInfo &TII = *TM.getInstrInfo();
461   const Function &LF = *F->getFunction();  // The LLVM function...
462   for (Function::const_iterator I = LF.begin(), E = LF.end(); I != E; ++I) {
463     const BasicBlock *BB = I;
464     MachineBasicBlock &MBB = *MBBMap[I];
465
466     // Loop over all of the PHI nodes in the LLVM basic block...
467     MachineBasicBlock::iterator PHIInsertPoint = MBB.begin();
468     for (BasicBlock::const_iterator I = BB->begin();
469          PHINode *PN = const_cast<PHINode*>(dyn_cast<PHINode>(I)); ++I) {
470
471       // Create a new machine instr PHI node, and insert it.
472       unsigned PHIReg = getReg(*PN);
473       MachineInstr *PhiMI = BuildMI(MBB, PHIInsertPoint,
474                                     V8::PHI, PN->getNumOperands(), PHIReg);
475
476       MachineInstr *LongPhiMI = 0;
477       if (PN->getType() == Type::LongTy || PN->getType() == Type::ULongTy)
478         LongPhiMI = BuildMI(MBB, PHIInsertPoint,
479                             V8::PHI, PN->getNumOperands(), PHIReg+1);
480
481       // PHIValues - Map of blocks to incoming virtual registers.  We use this
482       // so that we only initialize one incoming value for a particular block,
483       // even if the block has multiple entries in the PHI node.
484       //
485       std::map<MachineBasicBlock*, unsigned> PHIValues;
486
487       for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
488         MachineBasicBlock *PredMBB = 0;
489         for (MachineBasicBlock::pred_iterator PI = MBB.pred_begin (),
490              PE = MBB.pred_end (); PI != PE; ++PI)
491           if (PN->getIncomingBlock(i) == (*PI)->getBasicBlock()) {
492             PredMBB = *PI;
493             break;
494           }
495         assert (PredMBB && "Couldn't find incoming machine-cfg edge for phi");
496         
497         unsigned ValReg;
498         std::map<MachineBasicBlock*, unsigned>::iterator EntryIt =
499           PHIValues.lower_bound(PredMBB);
500
501         if (EntryIt != PHIValues.end() && EntryIt->first == PredMBB) {
502           // We already inserted an initialization of the register for this
503           // predecessor.  Recycle it.
504           ValReg = EntryIt->second;
505
506         } else {        
507           // Get the incoming value into a virtual register.
508           //
509           Value *Val = PN->getIncomingValue(i);
510
511           // If this is a constant or GlobalValue, we may have to insert code
512           // into the basic block to compute it into a virtual register.
513           if ((isa<Constant>(Val) && !isa<ConstantExpr>(Val)) ||
514               isa<GlobalValue>(Val)) {
515             // Simple constants get emitted at the end of the basic block,
516             // before any terminator instructions.  We "know" that the code to
517             // move a constant into a register will never clobber any flags.
518             ValReg = getReg(Val, PredMBB, PredMBB->getFirstTerminator());
519           } else {
520             // Because we don't want to clobber any values which might be in
521             // physical registers with the computation of this constant (which
522             // might be arbitrarily complex if it is a constant expression),
523             // just insert the computation at the top of the basic block.
524             MachineBasicBlock::iterator PI = PredMBB->begin();
525             
526             // Skip over any PHI nodes though!
527             while (PI != PredMBB->end() && PI->getOpcode() == V8::PHI)
528               ++PI;
529             
530             ValReg = getReg(Val, PredMBB, PI);
531           }
532
533           // Remember that we inserted a value for this PHI for this predecessor
534           PHIValues.insert(EntryIt, std::make_pair(PredMBB, ValReg));
535         }
536
537         PhiMI->addRegOperand(ValReg);
538         PhiMI->addMachineBasicBlockOperand(PredMBB);
539         if (LongPhiMI) {
540           LongPhiMI->addRegOperand(ValReg+1);
541           LongPhiMI->addMachineBasicBlockOperand(PredMBB);
542         }
543       }
544
545       // Now that we emitted all of the incoming values for the PHI node, make
546       // sure to reposition the InsertPoint after the PHI that we just added.
547       // This is needed because we might have inserted a constant into this
548       // block, right after the PHI's which is before the old insert point!
549       PHIInsertPoint = LongPhiMI ? LongPhiMI : PhiMI;
550       ++PHIInsertPoint;
551     }
552   }
553 }
554
555 bool V8ISel::runOnFunction(Function &Fn) {
556   // First pass over the function, lower any unknown intrinsic functions
557   // with the IntrinsicLowering class.
558   LowerUnknownIntrinsicFunctionCalls(Fn);
559   
560   F = &MachineFunction::construct(&Fn, TM);
561   
562   // Create all of the machine basic blocks for the function...
563   for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
564     F->getBasicBlockList().push_back(MBBMap[I] = new MachineBasicBlock(I));
565   
566   BB = &F->front();
567   
568   // Set up a frame object for the return address.  This is used by the
569   // llvm.returnaddress & llvm.frameaddress intrinisics.
570   //ReturnAddressIndex = F->getFrameInfo()->CreateFixedObject(4, -4);
571   
572   // Copy incoming arguments off of the stack and out of fixed registers.
573   LoadArgumentsToVirtualRegs(&Fn);
574   
575   // Instruction select everything except PHI nodes
576   visit(Fn);
577   
578   // Select the PHI nodes
579   SelectPHINodes();
580   
581   RegMap.clear();
582   MBBMap.clear();
583   F = 0;
584   // We always build a machine code representation for the function
585   return true;
586 }
587
588 void V8ISel::visitCastInst(CastInst &I) {
589   Value *Op = I.getOperand(0);
590   unsigned DestReg = getReg(I);
591   MachineBasicBlock::iterator MI = BB->end();
592   emitCastOperation(BB, MI, Op, I.getType(), DestReg);
593 }
594
595 unsigned V8ISel::emitIntegerCast (MachineBasicBlock *BB,
596                               MachineBasicBlock::iterator IP, const Type *oldTy,
597                               unsigned SrcReg, const Type *newTy,
598                               unsigned DestReg) {
599   if (oldTy == newTy) {
600     // No-op cast - just emit a copy; assume the reg. allocator will zap it.
601     BuildMI (*BB, IP, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg(SrcReg);
602     return SrcReg;
603   }
604   // Emit left-shift, then right-shift to sign- or zero-extend.
605   unsigned TmpReg = makeAnotherReg (newTy);
606   unsigned shiftWidth = 32 - (8 * TM.getTargetData ().getTypeSize (newTy));
607   BuildMI (*BB, IP, V8::SLLri, 2, TmpReg).addZImm (shiftWidth).addReg(SrcReg);
608   if (newTy->isSigned ()) { // sign-extend with SRA
609     BuildMI(*BB, IP, V8::SRAri, 2, DestReg).addZImm (shiftWidth).addReg(TmpReg);
610   } else { // zero-extend with SRL
611     BuildMI(*BB, IP, V8::SRLri, 2, DestReg).addZImm (shiftWidth).addReg(TmpReg);
612   }
613   // Return the temp reg. in case this is one half of a cast to long.
614   return TmpReg;
615 }
616
617 void V8ISel::emitFPToIntegerCast (MachineBasicBlock *BB,
618                                   MachineBasicBlock::iterator IP,
619                                   const Type *oldTy, unsigned SrcReg,
620                                   const Type *newTy, unsigned DestReg) {
621   unsigned FPCastOpcode, FPStoreOpcode, FPSize, FPAlign;
622   unsigned oldTyClass = getClassB(oldTy);
623   if (oldTyClass == cFloat) { 
624     FPCastOpcode = V8::FSTOI; FPStoreOpcode = V8::STFri; FPSize = 4; 
625     FPAlign = TM.getTargetData().getFloatAlignment();
626   } else { // it's a double
627     FPCastOpcode = V8::FDTOI; FPStoreOpcode = V8::STDFri; FPSize = 8; 
628     FPAlign = TM.getTargetData().getDoubleAlignment();
629   }
630   unsigned TempReg = makeAnotherReg (oldTy);
631   BuildMI (*BB, IP, FPCastOpcode, 1, TempReg).addReg (SrcReg);
632   int FI = F->getFrameInfo()->CreateStackObject(FPSize, FPAlign);
633   BuildMI (*BB, IP, FPStoreOpcode, 3).addFrameIndex (FI).addSImm (0)
634     .addReg (TempReg);
635   unsigned TempReg2 = makeAnotherReg (newTy);
636   BuildMI (*BB, IP, V8::LD, 3, TempReg2).addFrameIndex (FI).addSImm (0);
637   emitIntegerCast (BB, IP, Type::IntTy, TempReg2, newTy, DestReg);
638 }
639
640 /// emitCastOperation - Common code shared between visitCastInst and constant
641 /// expression cast support.
642 ///
643 void V8ISel::emitCastOperation(MachineBasicBlock *BB,
644                                MachineBasicBlock::iterator IP, Value *Src,
645                                const Type *DestTy, unsigned DestReg) {
646   const Type *SrcTy = Src->getType();
647   unsigned SrcClass = getClassB(SrcTy);
648   unsigned DestClass = getClassB(DestTy);
649   unsigned SrcReg = getReg(Src, BB, IP);
650
651   const Type *oldTy = SrcTy;
652   const Type *newTy = DestTy;
653   unsigned oldTyClass = SrcClass;
654   unsigned newTyClass = DestClass;
655
656   if (oldTyClass < cLong && newTyClass < cLong) {
657     emitIntegerCast (BB, IP, oldTy, SrcReg, newTy, DestReg);
658   } else switch (newTyClass) {
659     case cByte:
660     case cShort:
661     case cInt:
662       switch (oldTyClass) {
663       case cLong: 
664         // Treat it like a cast from the lower half of the value.
665         emitIntegerCast (BB, IP, Type::IntTy, SrcReg+1, newTy, DestReg);
666         break;
667       case cFloat: 
668       case cDouble:
669         emitFPToIntegerCast (BB, IP, oldTy, SrcReg, newTy, DestReg);
670         break;
671       default: goto not_yet;
672       }
673       return;
674
675     case cFloat:
676       switch (oldTyClass) {
677       case cLong: goto not_yet;
678       case cFloat:
679         BuildMI (*BB, IP, V8::FMOVS, 1, DestReg).addReg (SrcReg);
680         break;
681       case cDouble:
682         BuildMI (*BB, IP, V8::FDTOS, 1, DestReg).addReg (SrcReg);
683         break;
684       default: {
685         unsigned FltAlign = TM.getTargetData().getFloatAlignment();
686         // cast integer type to float.  Store it to a stack slot and then load
687         // it using ldf into a floating point register. then do fitos.
688         unsigned TmpReg = makeAnotherReg (newTy);
689         int FI = F->getFrameInfo()->CreateStackObject(4, FltAlign);
690         BuildMI (*BB, IP, V8::ST, 3).addFrameIndex (FI).addSImm (0)
691           .addReg (SrcReg);
692         BuildMI (*BB, IP, V8::LDFri, 2, TmpReg).addFrameIndex (FI).addSImm (0);
693         BuildMI (*BB, IP, V8::FITOS, 1, DestReg).addReg(TmpReg);
694         break;
695       }
696       }
697       return;
698
699     case cDouble:
700       switch (oldTyClass) {
701       case cLong: goto not_yet;
702       case cFloat:
703         BuildMI (*BB, IP, V8::FSTOD, 1, DestReg).addReg (SrcReg);
704         break;
705       case cDouble: // use double move pseudo-instr
706         BuildMI (*BB, IP, V8::FpMOVD, 1, DestReg).addReg (SrcReg);
707         break;
708       default: {
709         unsigned DoubleAlignment = TM.getTargetData().getDoubleAlignment();
710         unsigned TmpReg = makeAnotherReg (newTy);
711         int FI = F->getFrameInfo()->CreateStackObject(8, DoubleAlignment);
712         BuildMI (*BB, IP, V8::ST, 3).addFrameIndex (FI).addSImm (0)
713           .addReg (SrcReg);
714         BuildMI (*BB, IP, V8::LDDFri, 2, TmpReg).addFrameIndex (FI).addSImm (0);
715         BuildMI (*BB, IP, V8::FITOD, 1, DestReg).addReg(TmpReg);
716         break;
717       }
718       }
719       return;
720
721     case cLong:
722       switch (oldTyClass) {
723       case cByte:
724       case cShort:
725       case cInt: {
726         // Cast to (u)int in the bottom half, and sign(zero) extend in the top
727         // half.
728         const Type *OldHalfTy = oldTy->isSigned() ? Type::IntTy : Type::UIntTy;
729         const Type *NewHalfTy = newTy->isSigned() ? Type::IntTy : Type::UIntTy;
730         unsigned TempReg = emitIntegerCast (BB, IP, OldHalfTy, SrcReg,
731                                             NewHalfTy, DestReg+1);
732         if (newTy->isSigned ()) {
733           BuildMI (*BB, IP, V8::SRAri, 2, DestReg).addReg (TempReg) 
734             .addZImm (31);
735         } else {
736           BuildMI (*BB, IP, V8::ORrr, 2, DestReg).addReg (V8::G0) 
737             .addReg (V8::G0);
738         }
739         break;
740       }
741       case cLong:
742         // Just copy both halves.
743         BuildMI (*BB, IP, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
744         BuildMI (*BB, IP, V8::ORrr, 2, DestReg+1).addReg (V8::G0)
745           .addReg (SrcReg+1);
746         break;
747       default: goto not_yet;
748       }
749       return;
750
751     default: goto not_yet;
752   }
753   return;
754 not_yet:
755   std::cerr << "Sorry, cast still unsupported: SrcTy = " << *SrcTy
756             << ", DestTy = " << *DestTy << "\n";
757   abort ();
758 }
759
760 void V8ISel::visitLoadInst(LoadInst &I) {
761   unsigned DestReg = getReg (I);
762   unsigned PtrReg = getReg (I.getOperand (0));
763   switch (getClassB (I.getType ())) {
764    case cByte:
765     if (I.getType ()->isSigned ())
766       BuildMI (BB, V8::LDSB, 2, DestReg).addReg (PtrReg).addSImm(0);
767     else
768       BuildMI (BB, V8::LDUB, 2, DestReg).addReg (PtrReg).addSImm(0);
769     return;
770    case cShort:
771     if (I.getType ()->isSigned ())
772       BuildMI (BB, V8::LDSH, 2, DestReg).addReg (PtrReg).addSImm(0);
773     else
774       BuildMI (BB, V8::LDUH, 2, DestReg).addReg (PtrReg).addSImm(0);
775     return;
776    case cInt:
777     BuildMI (BB, V8::LD, 2, DestReg).addReg (PtrReg).addSImm(0);
778     return;
779    case cLong:
780     BuildMI (BB, V8::LD, 2, DestReg).addReg (PtrReg).addSImm(0);
781     BuildMI (BB, V8::LD, 2, DestReg+1).addReg (PtrReg).addSImm(4);
782     return;
783    case cFloat:
784     BuildMI (BB, V8::LDFri, 2, DestReg).addReg (PtrReg).addSImm(0);
785     return;
786    case cDouble:
787     BuildMI (BB, V8::LDDFri, 2, DestReg).addReg (PtrReg).addSImm(0);
788     return;
789    default:
790     std::cerr << "Load instruction not handled: " << I;
791     abort ();
792     return;
793   }
794 }
795
796 void V8ISel::visitStoreInst(StoreInst &I) {
797   Value *SrcVal = I.getOperand (0);
798   unsigned SrcReg = getReg (SrcVal);
799   unsigned PtrReg = getReg (I.getOperand (1));
800   switch (getClassB (SrcVal->getType ())) {
801    case cByte:
802     BuildMI (BB, V8::STB, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
803     return;
804    case cShort:
805     BuildMI (BB, V8::STH, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
806     return;
807    case cInt:
808     BuildMI (BB, V8::ST, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
809     return;
810    case cLong:
811     BuildMI (BB, V8::ST, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
812     BuildMI (BB, V8::ST, 3).addReg (PtrReg).addSImm (4).addReg (SrcReg+1);
813     return;
814    case cFloat:
815     BuildMI (BB, V8::STFri, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
816     return;
817    case cDouble:
818     BuildMI (BB, V8::STDFri, 3).addReg (PtrReg).addSImm (0).addReg (SrcReg);
819     return;
820    default:
821     std::cerr << "Store instruction not handled: " << I;
822     abort ();
823     return;
824   }
825 }
826
827 void V8ISel::visitCallInst(CallInst &I) {
828   MachineInstr *TheCall;
829   // Is it an intrinsic function call?
830   if (Function *F = I.getCalledFunction()) {
831     if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) {
832       visitIntrinsicCall(ID, I);   // Special intrinsics are not handled here
833       return;
834     }
835   }
836
837   unsigned extraStack = 0;
838   // How much extra call stack will we need?
839   for (unsigned i = 7; i < I.getNumOperands (); ++i) {
840     switch (getClassB (I.getOperand (i)->getType ())) {
841       case cLong: extraStack += 8; break;
842       case cFloat: extraStack += 4; break;
843       case cDouble: extraStack += 8; break;
844       default: extraStack += 4; break;
845     }
846   }
847   // Round up extra stack size to the nearest doubleword.
848   if (extraStack) { extraStack = (extraStack + 7) & ~7; }
849
850   // Deal with args
851   static const unsigned OutgoingArgRegs[] = { V8::O0, V8::O1, V8::O2, V8::O3,
852     V8::O4, V8::O5 };
853   const unsigned *OAREnd = &OutgoingArgRegs[6];
854   const unsigned *OAR = &OutgoingArgRegs[0];
855   unsigned ArgOffset = 68;
856   if (extraStack) BuildMI (BB, V8::ADJCALLSTACKDOWN, 1).addImm (extraStack);
857   for (unsigned i = 1; i < I.getNumOperands (); ++i) {
858     unsigned ArgReg = getReg (I.getOperand (i));
859     if (getClassB (I.getOperand (i)->getType ()) < cLong) {
860       // Schlep it over into the incoming arg register
861       if (ArgOffset < 92) {
862         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
863         BuildMI (BB, V8::ORrr, 2, *OAR++).addReg (V8::G0).addReg (ArgReg);
864       } else {
865         BuildMI (BB, V8::ST, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (ArgReg);
866       }
867       ArgOffset += 4;
868     } else if (getClassB (I.getOperand (i)->getType ()) == cFloat) {
869       if (ArgOffset < 92) {
870         // Single-fp args are passed in integer registers; go through
871         // memory to get them out of FP registers. (Bleh!)
872         unsigned FltAlign = TM.getTargetData().getFloatAlignment();
873         int FI = F->getFrameInfo()->CreateStackObject(4, FltAlign);
874         BuildMI (BB, V8::STFri, 3).addFrameIndex (FI).addSImm (0).addReg (ArgReg);
875         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
876         BuildMI (BB, V8::LD, 2, *OAR++).addFrameIndex (FI).addSImm (0);
877       } else {
878         BuildMI (BB, V8::STFri, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (ArgReg);
879       }
880       ArgOffset += 4;
881     } else if (getClassB (I.getOperand (i)->getType ()) == cDouble) {
882       // Double-fp args are passed in pairs of integer registers; go through
883       // memory to get them out of FP registers. (Bleh!)
884       // We'd like to 'std' these right onto the outgoing-args area, but it might
885       // not be 8-byte aligned (e.g., call x(int x, double d)). sigh.
886       unsigned DblAlign = TM.getTargetData().getDoubleAlignment();
887       int FI = F->getFrameInfo()->CreateStackObject(8, DblAlign);
888       BuildMI (BB, V8::STDFri, 3).addFrameIndex (FI).addSImm (0).addReg (ArgReg);
889       if (ArgOffset < 92 && OAR != OAREnd) {
890         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
891         BuildMI (BB, V8::LD, 2, *OAR++).addFrameIndex (FI).addSImm (0);
892       } else {
893         unsigned TempReg = makeAnotherReg (Type::IntTy);
894         BuildMI (BB, V8::LD, 2, TempReg).addFrameIndex (FI).addSImm (0);
895         BuildMI (BB, V8::ST, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (TempReg);
896       }
897       ArgOffset += 4;
898       if (ArgOffset < 92 && OAR != OAREnd) {
899         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
900         BuildMI (BB, V8::LD, 2, *OAR++).addFrameIndex (FI).addSImm (4);
901       } else {
902         unsigned TempReg = makeAnotherReg (Type::IntTy);
903         BuildMI (BB, V8::LD, 2, TempReg).addFrameIndex (FI).addSImm (4);
904         BuildMI (BB, V8::ST, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (TempReg);
905       }
906       ArgOffset += 4;
907     } else if (getClassB (I.getOperand (i)->getType ()) == cLong) {
908       // do the first half...
909       if (ArgOffset < 92) {
910         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
911         BuildMI (BB, V8::ORrr, 2, *OAR++).addReg (V8::G0).addReg (ArgReg);
912       } else {
913         BuildMI (BB, V8::ST, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (ArgReg);
914       }
915       ArgOffset += 4;
916       // ...then do the second half
917       if (ArgOffset < 92) {
918         assert (OAR != OAREnd && "About to dereference past end of OutgoingArgRegs");
919         BuildMI (BB, V8::ORrr, 2, *OAR++).addReg (V8::G0).addReg (ArgReg+1);
920       } else {
921         BuildMI (BB, V8::ST, 3).addReg (V8::SP).addSImm (ArgOffset).addReg (ArgReg+1);
922       }
923       ArgOffset += 4;
924     } else {
925       assert (0 && "Unknown class?!");
926     }
927   }
928
929   // Emit call instruction
930   if (Function *F = I.getCalledFunction ()) {
931     BuildMI (BB, V8::CALL, 1).addGlobalAddress (F, true);
932   } else {  // Emit an indirect call...
933     unsigned Reg = getReg (I.getCalledValue ());
934     BuildMI (BB, V8::JMPLrr, 3, V8::O7).addReg (Reg).addReg (V8::G0);
935   }
936
937   if (extraStack) BuildMI (BB, V8::ADJCALLSTACKUP, 1).addImm (extraStack);
938
939   // Deal w/ return value: schlep it over into the destination register
940   if (I.getType () == Type::VoidTy)
941     return;
942   unsigned DestReg = getReg (I);
943   switch (getClassB (I.getType ())) {
944     case cByte:
945     case cShort:
946     case cInt:
947       BuildMI (BB, V8::ORrr, 2, DestReg).addReg(V8::G0).addReg(V8::O0);
948       break;
949     case cFloat:
950       BuildMI (BB, V8::FMOVS, 2, DestReg).addReg(V8::F0);
951       break;
952     case cDouble:
953       BuildMI (BB, V8::FpMOVD, 2, DestReg).addReg(V8::D0);
954       break;
955     case cLong:
956       BuildMI (BB, V8::ORrr, 2, DestReg).addReg(V8::G0).addReg(V8::O0);
957       BuildMI (BB, V8::ORrr, 2, DestReg+1).addReg(V8::G0).addReg(V8::O1);
958       break;
959     default:
960       std::cerr << "Return type of call instruction not handled: " << I;
961       abort ();
962   }
963 }
964
965 void V8ISel::visitReturnInst(ReturnInst &I) {
966   if (I.getNumOperands () == 1) {
967     unsigned RetValReg = getReg (I.getOperand (0));
968     switch (getClassB (I.getOperand (0)->getType ())) {
969       case cByte:
970       case cShort:
971       case cInt:
972         // Schlep it over into i0 (where it will become o0 after restore).
973         BuildMI (BB, V8::ORrr, 2, V8::I0).addReg(V8::G0).addReg(RetValReg);
974         break;
975       case cFloat:
976         BuildMI (BB, V8::FMOVS, 1, V8::F0).addReg(RetValReg);
977         break;
978       case cDouble:
979         BuildMI (BB, V8::FpMOVD, 1, V8::D0).addReg(RetValReg);
980         break;
981       case cLong:
982         BuildMI (BB, V8::ORrr, 2, V8::I0).addReg(V8::G0).addReg(RetValReg);
983         BuildMI (BB, V8::ORrr, 2, V8::I1).addReg(V8::G0).addReg(RetValReg+1);
984         break;
985       default:
986         std::cerr << "Return instruction of this type not handled: " << I;
987         abort ();
988     }
989   }
990
991   // Just emit a 'retl' instruction to return.
992   BuildMI(BB, V8::RETL, 0);
993   return;
994 }
995
996 static inline BasicBlock *getBlockAfter(BasicBlock *BB) {
997   Function::iterator I = BB; ++I;  // Get iterator to next block
998   return I != BB->getParent()->end() ? &*I : 0;
999 }
1000
1001 /// visitBranchInst - Handles conditional and unconditional branches.
1002 ///
1003 void V8ISel::visitBranchInst(BranchInst &I) {
1004   BasicBlock *takenSucc = I.getSuccessor (0);
1005   MachineBasicBlock *takenSuccMBB = MBBMap[takenSucc];
1006   BB->addSuccessor (takenSuccMBB);
1007   if (I.isConditional()) {  // conditional branch
1008     BasicBlock *notTakenSucc = I.getSuccessor (1);
1009     MachineBasicBlock *notTakenSuccMBB = MBBMap[notTakenSucc];
1010     BB->addSuccessor (notTakenSuccMBB);
1011
1012     // CondReg=(<condition>);
1013     // If (CondReg==0) goto notTakenSuccMBB;
1014     unsigned CondReg = getReg (I.getCondition ());
1015     BuildMI (BB, V8::CMPri, 2).addSImm (0).addReg (CondReg);
1016     BuildMI (BB, V8::BE, 1).addMBB (notTakenSuccMBB);
1017   }
1018   // goto takenSuccMBB;
1019   BuildMI (BB, V8::BA, 1).addMBB (takenSuccMBB);
1020 }
1021
1022 /// emitGEPOperation - Common code shared between visitGetElementPtrInst and
1023 /// constant expression GEP support.
1024 ///
1025 void V8ISel::emitGEPOperation (MachineBasicBlock *MBB,
1026                                MachineBasicBlock::iterator IP,
1027                                Value *Src, User::op_iterator IdxBegin,
1028                                User::op_iterator IdxEnd, unsigned TargetReg) {
1029   const TargetData &TD = TM.getTargetData ();
1030   const Type *Ty = Src->getType ();
1031   unsigned basePtrReg = getReg (Src, MBB, IP);
1032
1033   // GEPs have zero or more indices; we must perform a struct access
1034   // or array access for each one.
1035   for (GetElementPtrInst::op_iterator oi = IdxBegin, oe = IdxEnd; oi != oe;
1036        ++oi) {
1037     Value *idx = *oi;
1038     unsigned nextBasePtrReg = makeAnotherReg (Type::UIntTy);
1039     if (const StructType *StTy = dyn_cast<StructType> (Ty)) {
1040       // It's a struct access.  idx is the index into the structure,
1041       // which names the field. Use the TargetData structure to
1042       // pick out what the layout of the structure is in memory.
1043       // Use the (constant) structure index's value to find the
1044       // right byte offset from the StructLayout class's list of
1045       // structure member offsets.
1046       unsigned fieldIndex = cast<ConstantUInt> (idx)->getValue ();
1047       unsigned memberOffset =
1048         TD.getStructLayout (StTy)->MemberOffsets[fieldIndex];
1049       // Emit an ADD to add memberOffset to the basePtr.
1050       BuildMI (*MBB, IP, V8::ADDri, 2,
1051                nextBasePtrReg).addReg (basePtrReg).addZImm (memberOffset);
1052       // The next type is the member of the structure selected by the
1053       // index.
1054       Ty = StTy->getElementType (fieldIndex);
1055     } else if (const SequentialType *SqTy = dyn_cast<SequentialType> (Ty)) {
1056       // It's an array or pointer access: [ArraySize x ElementType].
1057       // We want to add basePtrReg to (idxReg * sizeof ElementType). First, we
1058       // must find the size of the pointed-to type (Not coincidentally, the next
1059       // type is the type of the elements in the array).
1060       Ty = SqTy->getElementType ();
1061       unsigned elementSize = TD.getTypeSize (Ty);
1062       unsigned idxReg = getReg (idx, MBB, IP);
1063       unsigned OffsetReg = makeAnotherReg (Type::IntTy);
1064       unsigned elementSizeReg = makeAnotherReg (Type::UIntTy);
1065       copyConstantToRegister (MBB, IP,
1066         ConstantUInt::get(Type::UIntTy, elementSize), elementSizeReg);
1067       // Emit a SMUL to multiply the register holding the index by
1068       // elementSize, putting the result in OffsetReg.
1069       BuildMI (*MBB, IP, V8::SMULrr, 2,
1070                OffsetReg).addReg (elementSizeReg).addReg (idxReg);
1071       // Emit an ADD to add OffsetReg to the basePtr.
1072       BuildMI (*MBB, IP, V8::ADDrr, 2,
1073                nextBasePtrReg).addReg (basePtrReg).addReg (OffsetReg);
1074     }
1075     basePtrReg = nextBasePtrReg;
1076   }
1077   // After we have processed all the indices, the result is left in
1078   // basePtrReg.  Move it to the register where we were expected to
1079   // put the answer.
1080   BuildMI (BB, V8::ORrr, 1, TargetReg).addReg (V8::G0).addReg (basePtrReg);
1081 }
1082
1083 void V8ISel::visitGetElementPtrInst (GetElementPtrInst &I) {
1084   unsigned outputReg = getReg (I);
1085   emitGEPOperation (BB, BB->end (), I.getOperand (0),
1086                     I.op_begin ()+1, I.op_end (), outputReg);
1087 }
1088
1089
1090 void V8ISel::visitBinaryOperator (Instruction &I) {
1091   unsigned DestReg = getReg (I);
1092   unsigned Op0Reg = getReg (I.getOperand (0));
1093   unsigned Op1Reg = getReg (I.getOperand (1));
1094
1095   unsigned Class = getClassB (I.getType());
1096   unsigned OpCase = ~0;
1097
1098   if (Class > cLong) {
1099     switch (I.getOpcode ()) {
1100     case Instruction::Add: OpCase = 0; break;
1101     case Instruction::Sub: OpCase = 1; break;
1102     case Instruction::Mul: OpCase = 2; break;
1103     case Instruction::Div: OpCase = 3; break;
1104     default: visitInstruction (I); return;
1105     }
1106     static unsigned Opcodes[] = { V8::FADDS, V8::FADDD,
1107                                   V8::FSUBS, V8::FSUBD,
1108                                   V8::FMULS, V8::FMULD,
1109                                   V8::FDIVS, V8::FDIVD };
1110     BuildMI (BB, Opcodes[2*OpCase + (Class - cFloat)], 2, DestReg)
1111       .addReg (Op0Reg).addReg (Op1Reg);
1112     return;
1113   }
1114
1115   unsigned ResultReg = DestReg;
1116   if (Class != cInt && Class != cLong)
1117     ResultReg = makeAnotherReg (I.getType ());
1118
1119   if (Class == cLong) {
1120     DEBUG (std::cerr << "Class = cLong\n");
1121     DEBUG (std::cerr << "Op0Reg = " << Op0Reg << ", " << Op0Reg+1 << "\n");
1122     DEBUG (std::cerr << "Op1Reg = " << Op1Reg << ", " << Op1Reg+1 << "\n");
1123     DEBUG (std::cerr << "ResultReg = " << ResultReg << ", " << ResultReg+1 << "\n");
1124     DEBUG (std::cerr << "DestReg = " << DestReg << ", " << DestReg+1 <<  "\n");
1125   }
1126
1127   // FIXME: support long, ulong.
1128   switch (I.getOpcode ()) {
1129   case Instruction::Add: OpCase = 0; break;
1130   case Instruction::Sub: OpCase = 1; break;
1131   case Instruction::Mul: OpCase = 2; break;
1132   case Instruction::And: OpCase = 3; break;
1133   case Instruction::Or:  OpCase = 4; break;
1134   case Instruction::Xor: OpCase = 5; break;
1135   case Instruction::Shl: OpCase = 6; break;
1136   case Instruction::Shr: OpCase = 7+I.getType()->isSigned(); break;
1137
1138   case Instruction::Div:
1139   case Instruction::Rem: {
1140     unsigned Dest = ResultReg;
1141     if (I.getOpcode() == Instruction::Rem)
1142       Dest = makeAnotherReg(I.getType());
1143
1144     // FIXME: this is probably only right for 32 bit operands.
1145     if (I.getType ()->isSigned()) {
1146       unsigned Tmp = makeAnotherReg (I.getType ());
1147       // Sign extend into the Y register
1148       BuildMI (BB, V8::SRAri, 2, Tmp).addReg (Op0Reg).addZImm (31);
1149       BuildMI (BB, V8::WRrr, 2, V8::Y).addReg (Tmp).addReg (V8::G0);
1150       BuildMI (BB, V8::SDIVrr, 2, Dest).addReg (Op0Reg).addReg (Op1Reg);
1151     } else {
1152       // Zero extend into the Y register, ie, just set it to zero
1153       BuildMI (BB, V8::WRrr, 2, V8::Y).addReg (V8::G0).addReg (V8::G0);
1154       BuildMI (BB, V8::UDIVrr, 2, Dest).addReg (Op0Reg).addReg (Op1Reg);
1155     }
1156
1157     if (I.getOpcode() == Instruction::Rem) {
1158       unsigned Tmp = makeAnotherReg (I.getType ());
1159       BuildMI (BB, V8::SMULrr, 2, Tmp).addReg(Dest).addReg(Op1Reg);
1160       BuildMI (BB, V8::SUBrr, 2, ResultReg).addReg(Op0Reg).addReg(Tmp);
1161     }
1162     break;
1163   }
1164   default:
1165     visitInstruction (I);
1166     return;
1167   }
1168
1169   static const unsigned Opcodes[] = {
1170     V8::ADDrr, V8::SUBrr, V8::SMULrr, V8::ANDrr, V8::ORrr, V8::XORrr,
1171     V8::SLLrr, V8::SRLrr, V8::SRArr
1172   };
1173   if (OpCase != ~0U) {
1174     BuildMI (BB, Opcodes[OpCase], 2, ResultReg).addReg (Op0Reg).addReg (Op1Reg);
1175   }
1176
1177   switch (getClassB (I.getType ())) {
1178     case cByte: 
1179       if (I.getType ()->isSigned ()) { // add byte
1180         BuildMI (BB, V8::ANDri, 2, DestReg).addReg (ResultReg).addZImm (0xff);
1181       } else { // add ubyte
1182         unsigned TmpReg = makeAnotherReg (I.getType ());
1183         BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (24);
1184         BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (24);
1185       }
1186       break;
1187     case cShort:
1188       if (I.getType ()->isSigned ()) { // add short
1189         unsigned TmpReg = makeAnotherReg (I.getType ());
1190         BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (16);
1191         BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (16);
1192       } else { // add ushort
1193         unsigned TmpReg = makeAnotherReg (I.getType ());
1194         BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (16);
1195         BuildMI (BB, V8::SRLri, 2, DestReg).addReg (TmpReg).addZImm (16);
1196       }
1197       break;
1198     case cInt:
1199       // Nothing to do here.
1200       break;
1201     case cLong:
1202       // Only support and, or, xor.
1203       if (OpCase < 3 || OpCase > 5) {
1204         visitInstruction (I);
1205         return;
1206       }
1207       // Do the other half of the value:
1208       BuildMI (BB, Opcodes[OpCase], 2, ResultReg+1).addReg (Op0Reg+1)
1209         .addReg (Op1Reg+1);
1210       break;
1211     default:
1212       visitInstruction (I);
1213   }
1214 }
1215
1216 void V8ISel::visitSetCondInst(SetCondInst &I) {
1217   unsigned Op0Reg = getReg (I.getOperand (0));
1218   unsigned Op1Reg = getReg (I.getOperand (1));
1219   unsigned DestReg = getReg (I);
1220   const Type *Ty = I.getOperand (0)->getType ();
1221   
1222   // Compare the two values.
1223   assert (getClass (Ty) != cLong && "can't setcc on longs yet");
1224   if (getClass (Ty) < cLong) {
1225     BuildMI(BB, V8::SUBCCrr, 2, V8::G0).addReg(Op0Reg).addReg(Op1Reg);
1226   } else if (getClass (Ty) == cFloat) {
1227     BuildMI(BB, V8::FCMPS, 2).addReg(Op0Reg).addReg(Op1Reg);
1228   } else if (getClass (Ty) == cDouble) {
1229     BuildMI(BB, V8::FCMPD, 2).addReg(Op0Reg).addReg(Op1Reg);
1230   }
1231
1232   unsigned BranchIdx;
1233   switch (I.getOpcode()) {
1234   default: assert(0 && "Unknown setcc instruction!");
1235   case Instruction::SetEQ: BranchIdx = 0; break;
1236   case Instruction::SetNE: BranchIdx = 1; break;
1237   case Instruction::SetLT: BranchIdx = 2; break;
1238   case Instruction::SetGT: BranchIdx = 3; break;
1239   case Instruction::SetLE: BranchIdx = 4; break;
1240   case Instruction::SetGE: BranchIdx = 5; break;
1241   }
1242   unsigned Column = 0;
1243   if (Ty->isSigned() && !Ty->isFloatingPoint()) Column = 1;
1244   if (Ty->isFloatingPoint()) Column = 2;
1245   static unsigned OpcodeTab[3*6] = {
1246                                  // LLVM            SparcV8
1247                                  //        unsigned signed  fp
1248     V8::BE,   V8::BE,  V8::FBE,  // seteq = be      be      fbe
1249     V8::BNE,  V8::BNE, V8::FBNE, // setne = bne     bne     fbne
1250     V8::BCS,  V8::BL,  V8::FBL,  // setlt = bcs     bl      fbl
1251     V8::BGU,  V8::BG,  V8::FBG,  // setgt = bgu     bg      fbg
1252     V8::BLEU, V8::BLE, V8::FBLE, // setle = bleu    ble     fble
1253     V8::BCC,  V8::BGE, V8::FBGE  // setge = bcc     bge     fbge
1254   };
1255   unsigned Opcode = OpcodeTab[3*BranchIdx + Column];
1256
1257   MachineBasicBlock *thisMBB = BB;
1258   const BasicBlock *LLVM_BB = BB->getBasicBlock ();
1259   //  thisMBB:
1260   //  ...
1261   //   subcc %reg0, %reg1, %g0
1262   //   bCC copy1MBB
1263   //   ba copy0MBB
1264
1265   // FIXME: we wouldn't need copy0MBB (we could fold it into thisMBB)
1266   // if we could insert other, non-terminator instructions after the
1267   // bCC. But MBB->getFirstTerminator() can't understand this.
1268   MachineBasicBlock *copy1MBB = new MachineBasicBlock (LLVM_BB);
1269   F->getBasicBlockList ().push_back (copy1MBB);
1270   BuildMI (BB, Opcode, 1).addMBB (copy1MBB);
1271   MachineBasicBlock *copy0MBB = new MachineBasicBlock (LLVM_BB);
1272   F->getBasicBlockList ().push_back (copy0MBB);
1273   BuildMI (BB, V8::BA, 1).addMBB (copy0MBB);
1274   // Update machine-CFG edges
1275   BB->addSuccessor (copy1MBB);
1276   BB->addSuccessor (copy0MBB);
1277
1278   //  copy0MBB:
1279   //   %FalseValue = or %G0, 0
1280   //   ba sinkMBB
1281   BB = copy0MBB;
1282   unsigned FalseValue = makeAnotherReg (I.getType ());
1283   BuildMI (BB, V8::ORri, 2, FalseValue).addReg (V8::G0).addZImm (0);
1284   MachineBasicBlock *sinkMBB = new MachineBasicBlock (LLVM_BB);
1285   F->getBasicBlockList ().push_back (sinkMBB);
1286   BuildMI (BB, V8::BA, 1).addMBB (sinkMBB);
1287   // Update machine-CFG edges
1288   BB->addSuccessor (sinkMBB);
1289
1290   DEBUG (std::cerr << "thisMBB is at " << (void*)thisMBB << "\n");
1291   DEBUG (std::cerr << "copy1MBB is at " << (void*)copy1MBB << "\n");
1292   DEBUG (std::cerr << "copy0MBB is at " << (void*)copy0MBB << "\n");
1293   DEBUG (std::cerr << "sinkMBB is at " << (void*)sinkMBB << "\n");
1294
1295   //  copy1MBB:
1296   //   %TrueValue = or %G0, 1
1297   //   ba sinkMBB
1298   BB = copy1MBB;
1299   unsigned TrueValue = makeAnotherReg (I.getType ());
1300   BuildMI (BB, V8::ORri, 2, TrueValue).addReg (V8::G0).addZImm (1);
1301   BuildMI (BB, V8::BA, 1).addMBB (sinkMBB);
1302   // Update machine-CFG edges
1303   BB->addSuccessor (sinkMBB);
1304
1305   //  sinkMBB:
1306   //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, copy1MBB ]
1307   //  ...
1308   BB = sinkMBB;
1309   BuildMI (BB, V8::PHI, 4, DestReg).addReg (FalseValue)
1310     .addMBB (copy0MBB).addReg (TrueValue).addMBB (copy1MBB);
1311 }
1312
1313 void V8ISel::visitAllocaInst(AllocaInst &I) {
1314   // Find the data size of the alloca inst's getAllocatedType.
1315   const Type *Ty = I.getAllocatedType();
1316   unsigned TySize = TM.getTargetData().getTypeSize(Ty);
1317
1318   unsigned ArraySizeReg = getReg (I.getArraySize ());
1319   unsigned TySizeReg = getReg (ConstantUInt::get (Type::UIntTy, TySize));
1320   unsigned TmpReg1 = makeAnotherReg (Type::UIntTy);
1321   unsigned TmpReg2 = makeAnotherReg (Type::UIntTy);
1322   unsigned StackAdjReg = makeAnotherReg (Type::UIntTy);
1323
1324   // StackAdjReg = (ArraySize * TySize) rounded up to nearest doubleword boundary
1325   BuildMI (BB, V8::UMULrr, 2, TmpReg1).addReg (ArraySizeReg).addReg (TySizeReg);
1326
1327   // Round up TmpReg1 to nearest doubleword boundary:
1328   BuildMI (BB, V8::ADDri, 2, TmpReg2).addReg (TmpReg1).addSImm (7);
1329   BuildMI (BB, V8::ANDri, 2, StackAdjReg).addReg (TmpReg2).addSImm (-8);
1330
1331   // Subtract size from stack pointer, thereby allocating some space.
1332   BuildMI (BB, V8::SUBrr, 2, V8::SP).addReg (V8::SP).addReg (StackAdjReg);
1333
1334   // Put a pointer to the space into the result register, by copying
1335   // the stack pointer.
1336   BuildMI (BB, V8::ADDri, 2, getReg(I)).addReg (V8::SP).addSImm (96);
1337
1338   // Inform the Frame Information that we have just allocated a variable-sized
1339   // object.
1340   F->getFrameInfo()->CreateVariableSizedObject();
1341 }
1342
1343 /// LowerUnknownIntrinsicFunctionCalls - This performs a prepass over the
1344 /// function, lowering any calls to unknown intrinsic functions into the
1345 /// equivalent LLVM code.
1346 void V8ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) {
1347   for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
1348     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; )
1349       if (CallInst *CI = dyn_cast<CallInst>(I++))
1350         if (Function *F = CI->getCalledFunction())
1351           switch (F->getIntrinsicID()) {
1352           case Intrinsic::vastart:
1353           case Intrinsic::vacopy:
1354           case Intrinsic::vaend:
1355             // We directly implement these intrinsics
1356           case Intrinsic::not_intrinsic: break;
1357           default:
1358             // All other intrinsic calls we must lower.
1359             Instruction *Before = CI->getPrev();
1360             TM.getIntrinsicLowering().LowerIntrinsicCall(CI);
1361             if (Before) {        // Move iterator to instruction after call
1362               I = Before;  ++I;
1363             } else {
1364               I = BB->begin();
1365             }
1366           }
1367 }
1368
1369
1370 void V8ISel::visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI) {
1371   switch (ID) {
1372   default:
1373     std::cerr << "Sorry, unknown intrinsic function call:\n" << CI; abort ();
1374
1375   case Intrinsic::vastart: {
1376     // Add the VarArgsOffset to the frame pointer, and copy it to the result.
1377     unsigned DestReg = getReg (CI);
1378     BuildMI (BB, V8::ADDri, 2, DestReg).addReg (V8::FP).addSImm (VarArgsOffset);
1379     return;
1380   }
1381
1382   case Intrinsic::vaend:
1383     // va_end is a no-op on SparcV8.
1384     return;
1385
1386   case Intrinsic::vacopy: {
1387     // Copy the va_list ptr (arg1) to the result.
1388     unsigned DestReg = getReg (CI), SrcReg = getReg (CI.getOperand (1));
1389     BuildMI (BB, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (SrcReg);
1390     return;
1391   }
1392   }
1393 }
1394
1395 void V8ISel::visitVANextInst (VANextInst &I) {
1396   // Add the type size to the vararg pointer (arg0).
1397   unsigned DestReg = getReg (I);
1398   unsigned SrcReg = getReg (I.getOperand (0));
1399   unsigned TySize = TM.getTargetData ().getTypeSize (I.getArgType ());
1400   BuildMI (BB, V8::ADDri, 2, DestReg).addReg (SrcReg).addSImm (TySize);
1401 }
1402
1403 void V8ISel::visitVAArgInst (VAArgInst &I) {
1404   std::cerr << "Sorry, vaarg instruction still unsupported:\n" << I; abort ();
1405 }