LLVM API Documentation

PPCInstrInfo.cpp

Go to the documentation of this file.
00001 //===- PPCInstrInfo.cpp - PowerPC32 Instruction Information -----*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file contains the PowerPC implementation of the TargetInstrInfo class.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "PPCInstrInfo.h"
00015 #include "PPCInstrBuilder.h"
00016 #include "PPCMachineFunctionInfo.h"
00017 #include "PPCPredicates.h"
00018 #include "PPCGenInstrInfo.inc"
00019 #include "PPCTargetMachine.h"
00020 #include "llvm/ADT/STLExtras.h"
00021 #include "llvm/CodeGen/MachineInstrBuilder.h"
00022 #include "llvm/Support/CommandLine.h"
00023 #include "llvm/Target/TargetAsmInfo.h"
00024 using namespace llvm;
00025 
00026 extern cl::opt<bool> EnablePPC32RS;  // FIXME (64-bit): See PPCRegisterInfo.cpp.
00027 extern cl::opt<bool> EnablePPC64RS;  // FIXME (64-bit): See PPCRegisterInfo.cpp.
00028 
00029 PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
00030   : TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
00031     RI(*TM.getSubtargetImpl(), *this) {}
00032 
00033 /// getPointerRegClass - Return the register class to use to hold pointers.
00034 /// This is used for addressing modes.
00035 const TargetRegisterClass *PPCInstrInfo::getPointerRegClass() const {
00036   if (TM.getSubtargetImpl()->isPPC64())
00037     return &PPC::G8RCRegClass;
00038   else
00039     return &PPC::GPRCRegClass;
00040 }
00041 
00042 
00043 bool PPCInstrInfo::isMoveInstr(const MachineInstr& MI,
00044                                unsigned& sourceReg,
00045                                unsigned& destReg,
00046                                unsigned& sourceSubIdx,
00047                                unsigned& destSubIdx) const {
00048   sourceSubIdx = destSubIdx = 0; // No sub-registers.
00049 
00050   unsigned oc = MI.getOpcode();
00051   if (oc == PPC::OR || oc == PPC::OR8 || oc == PPC::VOR ||
00052       oc == PPC::OR4To8 || oc == PPC::OR8To4) {                // or r1, r2, r2
00053     assert(MI.getNumOperands() >= 3 &&
00054            MI.getOperand(0).isReg() &&
00055            MI.getOperand(1).isReg() &&
00056            MI.getOperand(2).isReg() &&
00057            "invalid PPC OR instruction!");
00058     if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
00059       sourceReg = MI.getOperand(1).getReg();
00060       destReg = MI.getOperand(0).getReg();
00061       return true;
00062     }
00063   } else if (oc == PPC::ADDI) {             // addi r1, r2, 0
00064     assert(MI.getNumOperands() >= 3 &&
00065            MI.getOperand(0).isReg() &&
00066            MI.getOperand(2).isImm() &&
00067            "invalid PPC ADDI instruction!");
00068     if (MI.getOperand(1).isReg() && MI.getOperand(2).getImm() == 0) {
00069       sourceReg = MI.getOperand(1).getReg();
00070       destReg = MI.getOperand(0).getReg();
00071       return true;
00072     }
00073   } else if (oc == PPC::ORI) {             // ori r1, r2, 0
00074     assert(MI.getNumOperands() >= 3 &&
00075            MI.getOperand(0).isReg() &&
00076            MI.getOperand(1).isReg() &&
00077            MI.getOperand(2).isImm() &&
00078            "invalid PPC ORI instruction!");
00079     if (MI.getOperand(2).getImm() == 0) {
00080       sourceReg = MI.getOperand(1).getReg();
00081       destReg = MI.getOperand(0).getReg();
00082       return true;
00083     }
00084   } else if (oc == PPC::FMRS || oc == PPC::FMRD ||
00085              oc == PPC::FMRSD) {      // fmr r1, r2
00086     assert(MI.getNumOperands() >= 2 &&
00087            MI.getOperand(0).isReg() &&
00088            MI.getOperand(1).isReg() &&
00089            "invalid PPC FMR instruction");
00090     sourceReg = MI.getOperand(1).getReg();
00091     destReg = MI.getOperand(0).getReg();
00092     return true;
00093   } else if (oc == PPC::MCRF) {             // mcrf cr1, cr2
00094     assert(MI.getNumOperands() >= 2 &&
00095            MI.getOperand(0).isReg() &&
00096            MI.getOperand(1).isReg() &&
00097            "invalid PPC MCRF instruction");
00098     sourceReg = MI.getOperand(1).getReg();
00099     destReg = MI.getOperand(0).getReg();
00100     return true;
00101   }
00102   return false;
00103 }
00104 
00105 unsigned PPCInstrInfo::isLoadFromStackSlot(const MachineInstr *MI, 
00106                                            int &FrameIndex) const {
00107   switch (MI->getOpcode()) {
00108   default: break;
00109   case PPC::LD:
00110   case PPC::LWZ:
00111   case PPC::LFS:
00112   case PPC::LFD:
00113     if (MI->getOperand(1).isImm() && !MI->getOperand(1).getImm() &&
00114         MI->getOperand(2).isFI()) {
00115       FrameIndex = MI->getOperand(2).getIndex();
00116       return MI->getOperand(0).getReg();
00117     }
00118     break;
00119   }
00120   return 0;
00121 }
00122 
00123 unsigned PPCInstrInfo::isStoreToStackSlot(const MachineInstr *MI, 
00124                                           int &FrameIndex) const {
00125   switch (MI->getOpcode()) {
00126   default: break;
00127   case PPC::STD:
00128   case PPC::STW:
00129   case PPC::STFS:
00130   case PPC::STFD:
00131     if (MI->getOperand(1).isImm() && !MI->getOperand(1).getImm() &&
00132         MI->getOperand(2).isFI()) {
00133       FrameIndex = MI->getOperand(2).getIndex();
00134       return MI->getOperand(0).getReg();
00135     }
00136     break;
00137   }
00138   return 0;
00139 }
00140 
00141 // commuteInstruction - We can commute rlwimi instructions, but only if the
00142 // rotate amt is zero.  We also have to munge the immediates a bit.
00143 MachineInstr *
00144 PPCInstrInfo::commuteInstruction(MachineInstr *MI, bool NewMI) const {
00145   MachineFunction &MF = *MI->getParent()->getParent();
00146 
00147   // Normal instructions can be commuted the obvious way.
00148   if (MI->getOpcode() != PPC::RLWIMI)
00149     return TargetInstrInfoImpl::commuteInstruction(MI, NewMI);
00150   
00151   // Cannot commute if it has a non-zero rotate count.
00152   if (MI->getOperand(3).getImm() != 0)
00153     return 0;
00154   
00155   // If we have a zero rotate count, we have:
00156   //   M = mask(MB,ME)
00157   //   Op0 = (Op1 & ~M) | (Op2 & M)
00158   // Change this to:
00159   //   M = mask((ME+1)&31, (MB-1)&31)
00160   //   Op0 = (Op2 & ~M) | (Op1 & M)
00161 
00162   // Swap op1/op2
00163   unsigned Reg0 = MI->getOperand(0).getReg();
00164   unsigned Reg1 = MI->getOperand(1).getReg();
00165   unsigned Reg2 = MI->getOperand(2).getReg();
00166   bool Reg1IsKill = MI->getOperand(1).isKill();
00167   bool Reg2IsKill = MI->getOperand(2).isKill();
00168   bool ChangeReg0 = false;
00169   // If machine instrs are no longer in two-address forms, update
00170   // destination register as well.
00171   if (Reg0 == Reg1) {
00172     // Must be two address instruction!
00173     assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
00174            "Expecting a two-address instruction!");
00175     Reg2IsKill = false;
00176     ChangeReg0 = true;
00177   }
00178 
00179   // Masks.
00180   unsigned MB = MI->getOperand(4).getImm();
00181   unsigned ME = MI->getOperand(5).getImm();
00182 
00183   if (NewMI) {
00184     // Create a new instruction.
00185     unsigned Reg0 = ChangeReg0 ? Reg2 : MI->getOperand(0).getReg();
00186     bool Reg0IsDead = MI->getOperand(0).isDead();
00187     return BuildMI(MF, MI->getDesc())
00188       .addReg(Reg0, true, false, false, Reg0IsDead)
00189       .addReg(Reg2, false, false, Reg2IsKill)
00190       .addReg(Reg1, false, false, Reg1IsKill)
00191       .addImm((ME+1) & 31)
00192       .addImm((MB-1) & 31);
00193   }
00194 
00195   if (ChangeReg0)
00196     MI->getOperand(0).setReg(Reg2);
00197   MI->getOperand(2).setReg(Reg1);
00198   MI->getOperand(1).setReg(Reg2);
00199   MI->getOperand(2).setIsKill(Reg1IsKill);
00200   MI->getOperand(1).setIsKill(Reg2IsKill);
00201   
00202   // Swap the mask around.
00203   MI->getOperand(4).setImm((ME+1) & 31);
00204   MI->getOperand(5).setImm((MB-1) & 31);
00205   return MI;
00206 }
00207 
00208 void PPCInstrInfo::insertNoop(MachineBasicBlock &MBB, 
00209                               MachineBasicBlock::iterator MI) const {
00210   BuildMI(MBB, MI, get(PPC::NOP));
00211 }
00212 
00213 
00214 // Branch analysis.
00215 bool PPCInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
00216                                  MachineBasicBlock *&FBB,
00217                                  SmallVectorImpl<MachineOperand> &Cond,
00218                                  bool AllowModify) const {
00219   // If the block has no terminators, it just falls into the block after it.
00220   MachineBasicBlock::iterator I = MBB.end();
00221   if (I == MBB.begin() || !isUnpredicatedTerminator(--I))
00222     return false;
00223 
00224   // Get the last instruction in the block.
00225   MachineInstr *LastInst = I;
00226   
00227   // If there is only one terminator instruction, process it.
00228   if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
00229     if (LastInst->getOpcode() == PPC::B) {
00230       TBB = LastInst->getOperand(0).getMBB();
00231       return false;
00232     } else if (LastInst->getOpcode() == PPC::BCC) {
00233       // Block ends with fall-through condbranch.
00234       TBB = LastInst->getOperand(2).getMBB();
00235       Cond.push_back(LastInst->getOperand(0));
00236       Cond.push_back(LastInst->getOperand(1));
00237       return false;
00238     }
00239     // Otherwise, don't know what this is.
00240     return true;
00241   }
00242   
00243   // Get the instruction before it if it's a terminator.
00244   MachineInstr *SecondLastInst = I;
00245 
00246   // If there are three terminators, we don't know what sort of block this is.
00247   if (SecondLastInst && I != MBB.begin() &&
00248       isUnpredicatedTerminator(--I))
00249     return true;
00250   
00251   // If the block ends with PPC::B and PPC:BCC, handle it.
00252   if (SecondLastInst->getOpcode() == PPC::BCC && 
00253       LastInst->getOpcode() == PPC::B) {
00254     TBB =  SecondLastInst->getOperand(2).getMBB();
00255     Cond.push_back(SecondLastInst->getOperand(0));
00256     Cond.push_back(SecondLastInst->getOperand(1));
00257     FBB = LastInst->getOperand(0).getMBB();
00258     return false;
00259   }
00260   
00261   // If the block ends with two PPC:Bs, handle it.  The second one is not
00262   // executed, so remove it.
00263   if (SecondLastInst->getOpcode() == PPC::B && 
00264       LastInst->getOpcode() == PPC::B) {
00265     TBB = SecondLastInst->getOperand(0).getMBB();
00266     I = LastInst;
00267     if (AllowModify)
00268       I->eraseFromParent();
00269     return false;
00270   }
00271 
00272   // Otherwise, can't handle this.
00273   return true;
00274 }
00275 
00276 unsigned PPCInstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
00277   MachineBasicBlock::iterator I = MBB.end();
00278   if (I == MBB.begin()) return 0;
00279   --I;
00280   if (I->getOpcode() != PPC::B && I->getOpcode() != PPC::BCC)
00281     return 0;
00282   
00283   // Remove the branch.
00284   I->eraseFromParent();
00285   
00286   I = MBB.end();
00287 
00288   if (I == MBB.begin()) return 1;
00289   --I;
00290   if (I->getOpcode() != PPC::BCC)
00291     return 1;
00292   
00293   // Remove the branch.
00294   I->eraseFromParent();
00295   return 2;
00296 }
00297 
00298 unsigned
00299 PPCInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
00300                            MachineBasicBlock *FBB,
00301                            const SmallVectorImpl<MachineOperand> &Cond) const {
00302   // Shouldn't be a fall through.
00303   assert(TBB && "InsertBranch must not be told to insert a fallthrough");
00304   assert((Cond.size() == 2 || Cond.size() == 0) && 
00305          "PPC branch conditions have two components!");
00306   
00307   // One-way branch.
00308   if (FBB == 0) {
00309     if (Cond.empty())   // Unconditional branch
00310       BuildMI(&MBB, get(PPC::B)).addMBB(TBB);
00311     else                // Conditional branch
00312       BuildMI(&MBB, get(PPC::BCC))
00313         .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()).addMBB(TBB);
00314     return 1;
00315   }
00316   
00317   // Two-way Conditional Branch.
00318   BuildMI(&MBB, get(PPC::BCC))
00319     .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()).addMBB(TBB);
00320   BuildMI(&MBB, get(PPC::B)).addMBB(FBB);
00321   return 2;
00322 }
00323 
00324 bool PPCInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
00325                                    MachineBasicBlock::iterator MI,
00326                                    unsigned DestReg, unsigned SrcReg,
00327                                    const TargetRegisterClass *DestRC,
00328                                    const TargetRegisterClass *SrcRC) const {
00329   if (DestRC != SrcRC) {
00330     // Not yet supported!
00331     return false;
00332   }
00333 
00334   if (DestRC == PPC::GPRCRegisterClass) {
00335     BuildMI(MBB, MI, get(PPC::OR), DestReg).addReg(SrcReg).addReg(SrcReg);
00336   } else if (DestRC == PPC::G8RCRegisterClass) {
00337     BuildMI(MBB, MI, get(PPC::OR8), DestReg).addReg(SrcReg).addReg(SrcReg);
00338   } else if (DestRC == PPC::F4RCRegisterClass) {
00339     BuildMI(MBB, MI, get(PPC::FMRS), DestReg).addReg(SrcReg);
00340   } else if (DestRC == PPC::F8RCRegisterClass) {
00341     BuildMI(MBB, MI, get(PPC::FMRD), DestReg).addReg(SrcReg);
00342   } else if (DestRC == PPC::CRRCRegisterClass) {
00343     BuildMI(MBB, MI, get(PPC::MCRF), DestReg).addReg(SrcReg);
00344   } else if (DestRC == PPC::VRRCRegisterClass) {
00345     BuildMI(MBB, MI, get(PPC::VOR), DestReg).addReg(SrcReg).addReg(SrcReg);
00346   } else if (DestRC == PPC::CRBITRCRegisterClass) {
00347     BuildMI(MBB, MI, get(PPC::CROR), DestReg).addReg(SrcReg).addReg(SrcReg);
00348   } else {
00349     // Attempt to copy register that is not GPR or FPR
00350     return false;
00351   }
00352   
00353   return true;
00354 }
00355 
00356 bool
00357 PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
00358                                   unsigned SrcReg, bool isKill,
00359                                   int FrameIdx,
00360                                   const TargetRegisterClass *RC,
00361                                   SmallVectorImpl<MachineInstr*> &NewMIs) const{
00362   if (RC == PPC::GPRCRegisterClass) {
00363     if (SrcReg != PPC::LR) {
00364       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STW))
00365                                          .addReg(SrcReg, false, false, isKill),
00366                                          FrameIdx));
00367     } else {
00368       // FIXME: this spills LR immediately to memory in one step.  To do this,
00369       // we use R11, which we know cannot be used in the prolog/epilog.  This is
00370       // a hack.
00371       NewMIs.push_back(BuildMI(MF, get(PPC::MFLR), PPC::R11));
00372       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STW))
00373                                          .addReg(PPC::R11, false, false, isKill),
00374                                          FrameIdx));
00375     }
00376   } else if (RC == PPC::G8RCRegisterClass) {
00377     if (SrcReg != PPC::LR8) {
00378       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STD))
00379                               .addReg(SrcReg, false, false, isKill), FrameIdx));
00380     } else {
00381       // FIXME: this spills LR immediately to memory in one step.  To do this,
00382       // we use R11, which we know cannot be used in the prolog/epilog.  This is
00383       // a hack.
00384       NewMIs.push_back(BuildMI(MF, get(PPC::MFLR8), PPC::X11));
00385       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STD))
00386                             .addReg(PPC::X11, false, false, isKill), FrameIdx));
00387     }
00388   } else if (RC == PPC::F8RCRegisterClass) {
00389     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STFD))
00390                               .addReg(SrcReg, false, false, isKill), FrameIdx));
00391   } else if (RC == PPC::F4RCRegisterClass) {
00392     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STFS))
00393                               .addReg(SrcReg, false, false, isKill), FrameIdx));
00394   } else if (RC == PPC::CRRCRegisterClass) {
00395     if ((EnablePPC32RS && !TM.getSubtargetImpl()->isPPC64()) ||
00396         (EnablePPC64RS && TM.getSubtargetImpl()->isPPC64())) {
00397       // FIXME (64-bit): Enable
00398       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::SPILL_CR))
00399                                          .addReg(SrcReg, false, false, isKill),
00400                                          FrameIdx));
00401       return true;
00402     } else {
00403       // FIXME: We use R0 here, because it isn't available for RA.  We need to
00404       // store the CR in the low 4-bits of the saved value.  First, issue a MFCR
00405       // to save all of the CRBits.
00406       NewMIs.push_back(BuildMI(MF, get(PPC::MFCR), PPC::R0));
00407     
00408       // If the saved register wasn't CR0, shift the bits left so that they are
00409       // in CR0's slot.
00410       if (SrcReg != PPC::CR0) {
00411         unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4;
00412         // rlwinm r0, r0, ShiftBits, 0, 31.
00413         NewMIs.push_back(BuildMI(MF, get(PPC::RLWINM), PPC::R0)
00414                        .addReg(PPC::R0).addImm(ShiftBits).addImm(0).addImm(31));
00415       }
00416     
00417       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::STW))
00418                                          .addReg(PPC::R0, false, false, isKill),
00419                                          FrameIdx));
00420     }
00421   } else if (RC == PPC::CRBITRCRegisterClass) {
00422     // FIXME: We use CRi here because there is no mtcrf on a bit. Since the
00423     // backend currently only uses CR1EQ as an individual bit, this should
00424     // not cause any bug. If we need other uses of CR bits, the following
00425     // code may be invalid.
00426     unsigned Reg = 0;
00427     if (SrcReg >= PPC::CR0LT || SrcReg <= PPC::CR0UN) 
00428       Reg = PPC::CR0;
00429     else if (SrcReg >= PPC::CR1LT || SrcReg <= PPC::CR1UN) 
00430       Reg = PPC::CR1;
00431     else if (SrcReg >= PPC::CR2LT || SrcReg <= PPC::CR2UN) 
00432       Reg = PPC::CR2;
00433     else if (SrcReg >= PPC::CR3LT || SrcReg <= PPC::CR3UN) 
00434       Reg = PPC::CR3;
00435     else if (SrcReg >= PPC::CR4LT || SrcReg <= PPC::CR4UN) 
00436       Reg = PPC::CR4;
00437     else if (SrcReg >= PPC::CR5LT || SrcReg <= PPC::CR5UN) 
00438       Reg = PPC::CR5;
00439     else if (SrcReg >= PPC::CR6LT || SrcReg <= PPC::CR6UN) 
00440       Reg = PPC::CR6;
00441     else if (SrcReg >= PPC::CR7LT || SrcReg <= PPC::CR7UN) 
00442       Reg = PPC::CR7;
00443 
00444     return StoreRegToStackSlot(MF, Reg, isKill, FrameIdx, 
00445                                PPC::CRRCRegisterClass, NewMIs);
00446 
00447   } else if (RC == PPC::VRRCRegisterClass) {
00448     // We don't have indexed addressing for vector loads.  Emit:
00449     // R0 = ADDI FI#
00450     // STVX VAL, 0, R0
00451     // 
00452     // FIXME: We use R0 here, because it isn't available for RA.
00453     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::ADDI), PPC::R0),
00454                                        FrameIdx, 0, 0));
00455     NewMIs.push_back(BuildMI(MF, get(PPC::STVX))
00456          .addReg(SrcReg, false, false, isKill).addReg(PPC::R0).addReg(PPC::R0));
00457   } else {
00458     assert(0 && "Unknown regclass!");
00459     abort();
00460   }
00461 
00462   return false;
00463 }
00464 
00465 void
00466 PPCInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
00467                                   MachineBasicBlock::iterator MI,
00468                                   unsigned SrcReg, bool isKill, int FrameIdx,
00469                                   const TargetRegisterClass *RC) const {
00470   MachineFunction &MF = *MBB.getParent();
00471   SmallVector<MachineInstr*, 4> NewMIs;
00472 
00473   if (StoreRegToStackSlot(MF, SrcReg, isKill, FrameIdx, RC, NewMIs)) {
00474     PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
00475     FuncInfo->setSpillsCR();
00476   }
00477 
00478   for (unsigned i = 0, e = NewMIs.size(); i != e; ++i)
00479     MBB.insert(MI, NewMIs[i]);
00480 }
00481 
00482 void PPCInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
00483                                   bool isKill,
00484                                   SmallVectorImpl<MachineOperand> &Addr,
00485                                   const TargetRegisterClass *RC,
00486                                   SmallVectorImpl<MachineInstr*> &NewMIs) const{
00487   if (Addr[0].isFI()) {
00488     if (StoreRegToStackSlot(MF, SrcReg, isKill,
00489                             Addr[0].getIndex(), RC, NewMIs)) {
00490       PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
00491       FuncInfo->setSpillsCR();
00492     }
00493 
00494     return;
00495   }
00496 
00497   unsigned Opc = 0;
00498   if (RC == PPC::GPRCRegisterClass) {
00499     Opc = PPC::STW;
00500   } else if (RC == PPC::G8RCRegisterClass) {
00501     Opc = PPC::STD;
00502   } else if (RC == PPC::F8RCRegisterClass) {
00503     Opc = PPC::STFD;
00504   } else if (RC == PPC::F4RCRegisterClass) {
00505     Opc = PPC::STFS;
00506   } else if (RC == PPC::VRRCRegisterClass) {
00507     Opc = PPC::STVX;
00508   } else {
00509     assert(0 && "Unknown regclass!");
00510     abort();
00511   }
00512   MachineInstrBuilder MIB = BuildMI(MF, get(Opc))
00513     .addReg(SrcReg, false, false, isKill);
00514   for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
00515     MachineOperand &MO = Addr[i];
00516     if (MO.isReg())
00517       MIB.addReg(MO.getReg());
00518     else if (MO.isImm())
00519       MIB.addImm(MO.getImm());
00520     else
00521       MIB.addFrameIndex(MO.getIndex());
00522   }
00523   NewMIs.push_back(MIB);
00524   return;
00525 }
00526 
00527 void
00528 PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF,
00529                                    unsigned DestReg, int FrameIdx,
00530                                    const TargetRegisterClass *RC,
00531                                    SmallVectorImpl<MachineInstr*> &NewMIs)const{
00532   if (RC == PPC::GPRCRegisterClass) {
00533     if (DestReg != PPC::LR) {
00534       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LWZ), DestReg),
00535                                          FrameIdx));
00536     } else {
00537       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LWZ), PPC::R11),
00538                                          FrameIdx));
00539       NewMIs.push_back(BuildMI(MF, get(PPC::MTLR)).addReg(PPC::R11));
00540     }
00541   } else if (RC == PPC::G8RCRegisterClass) {
00542     if (DestReg != PPC::LR8) {
00543       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LD), DestReg),
00544                                          FrameIdx));
00545     } else {
00546       NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LD), PPC::R11),
00547                                          FrameIdx));
00548       NewMIs.push_back(BuildMI(MF, get(PPC::MTLR8)).addReg(PPC::R11));
00549     }
00550   } else if (RC == PPC::F8RCRegisterClass) {
00551     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LFD), DestReg),
00552                                        FrameIdx));
00553   } else if (RC == PPC::F4RCRegisterClass) {
00554     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LFS), DestReg),
00555                                        FrameIdx));
00556   } else if (RC == PPC::CRRCRegisterClass) {
00557     // FIXME: We use R0 here, because it isn't available for RA.
00558     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::LWZ), PPC::R0),
00559                                        FrameIdx));
00560     
00561     // If the reloaded register isn't CR0, shift the bits right so that they are
00562     // in the right CR's slot.
00563     if (DestReg != PPC::CR0) {
00564       unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4;
00565       // rlwinm r11, r11, 32-ShiftBits, 0, 31.
00566       NewMIs.push_back(BuildMI(MF, get(PPC::RLWINM), PPC::R0)
00567                     .addReg(PPC::R0).addImm(32-ShiftBits).addImm(0).addImm(31));
00568     }
00569     
00570     NewMIs.push_back(BuildMI(MF, get(PPC::MTCRF), DestReg).addReg(PPC::R0));
00571   } else if (RC == PPC::CRBITRCRegisterClass) {
00572    
00573     unsigned Reg = 0;
00574     if (DestReg >= PPC::CR0LT || DestReg <= PPC::CR0UN) 
00575       Reg = PPC::CR0;
00576     else if (DestReg >= PPC::CR1LT || DestReg <= PPC::CR1UN) 
00577       Reg = PPC::CR1;
00578     else if (DestReg >= PPC::CR2LT || DestReg <= PPC::CR2UN) 
00579       Reg = PPC::CR2;
00580     else if (DestReg >= PPC::CR3LT || DestReg <= PPC::CR3UN) 
00581       Reg = PPC::CR3;
00582     else if (DestReg >= PPC::CR4LT || DestReg <= PPC::CR4UN) 
00583       Reg = PPC::CR4;
00584     else if (DestReg >= PPC::CR5LT || DestReg <= PPC::CR5UN) 
00585       Reg = PPC::CR5;
00586     else if (DestReg >= PPC::CR6LT || DestReg <= PPC::CR6UN) 
00587       Reg = PPC::CR6;
00588     else if (DestReg >= PPC::CR7LT || DestReg <= PPC::CR7UN) 
00589       Reg = PPC::CR7;
00590 
00591     return LoadRegFromStackSlot(MF, Reg, FrameIdx, 
00592                                 PPC::CRRCRegisterClass, NewMIs);
00593 
00594   } else if (RC == PPC::VRRCRegisterClass) {
00595     // We don't have indexed addressing for vector loads.  Emit:
00596     // R0 = ADDI FI#
00597     // Dest = LVX 0, R0
00598     // 
00599     // FIXME: We use R0 here, because it isn't available for RA.
00600     NewMIs.push_back(addFrameReference(BuildMI(MF, get(PPC::ADDI), PPC::R0),
00601                                        FrameIdx, 0, 0));
00602     NewMIs.push_back(BuildMI(MF, get(PPC::LVX),DestReg).addReg(PPC::R0)
00603                      .addReg(PPC::R0));
00604   } else {
00605     assert(0 && "Unknown regclass!");
00606     abort();
00607   }
00608 }
00609 
00610 void
00611 PPCInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
00612                                    MachineBasicBlock::iterator MI,
00613                                    unsigned DestReg, int FrameIdx,
00614                                    const TargetRegisterClass *RC) const {
00615   MachineFunction &MF = *MBB.getParent();
00616   SmallVector<MachineInstr*, 4> NewMIs;
00617   LoadRegFromStackSlot(MF, DestReg, FrameIdx, RC, NewMIs);
00618   for (unsigned i = 0, e = NewMIs.size(); i != e; ++i)
00619     MBB.insert(MI, NewMIs[i]);
00620 }
00621 
00622 void PPCInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
00623                                    SmallVectorImpl<MachineOperand> &Addr,
00624                                    const TargetRegisterClass *RC,
00625                                    SmallVectorImpl<MachineInstr*> &NewMIs)const{
00626   if (Addr[0].isFI()) {
00627     LoadRegFromStackSlot(MF, DestReg, Addr[0].getIndex(), RC, NewMIs);
00628     return;
00629   }
00630 
00631   unsigned Opc = 0;
00632   if (RC == PPC::GPRCRegisterClass) {
00633     assert(DestReg != PPC::LR && "Can't handle this yet!");
00634     Opc = PPC::LWZ;
00635   } else if (RC == PPC::G8RCRegisterClass) {
00636     assert(DestReg != PPC::LR8 && "Can't handle this yet!");
00637     Opc = PPC::LD;
00638   } else if (RC == PPC::F8RCRegisterClass) {
00639     Opc = PPC::LFD;
00640   } else if (RC == PPC::F4RCRegisterClass) {
00641     Opc = PPC::LFS;
00642   } else if (RC == PPC::VRRCRegisterClass) {
00643     Opc = PPC::LVX;
00644   } else {
00645     assert(0 && "Unknown regclass!");
00646     abort();
00647   }
00648   MachineInstrBuilder MIB = BuildMI(MF, get(Opc), DestReg);
00649   for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
00650     MachineOperand &MO = Addr[i];
00651     if (MO.isReg())
00652       MIB.addReg(MO.getReg());
00653     else if (MO.isImm())
00654       MIB.addImm(MO.getImm());
00655     else
00656       MIB.addFrameIndex(MO.getIndex());
00657   }
00658   NewMIs.push_back(MIB);
00659   return;
00660 }
00661 
00662 /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
00663 /// copy instructions, turning them into load/store instructions.
00664 MachineInstr *PPCInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
00665                                                   MachineInstr *MI,
00666                                            const SmallVectorImpl<unsigned> &Ops,
00667                                                   int FrameIndex) const {
00668   if (Ops.size() != 1) return NULL;
00669 
00670   // Make sure this is a reg-reg copy.  Note that we can't handle MCRF, because
00671   // it takes more than one instruction to store it.
00672   unsigned Opc = MI->getOpcode();
00673   unsigned OpNum = Ops[0];
00674 
00675   MachineInstr *NewMI = NULL;
00676   if ((Opc == PPC::OR &&
00677        MI->getOperand(1).getReg() == MI->getOperand(2).getReg())) {
00678     if (OpNum == 0) {  // move -> store
00679       unsigned InReg = MI->getOperand(1).getReg();
00680       bool isKill = MI->getOperand(1).isKill();
00681       NewMI = addFrameReference(BuildMI(MF, get(PPC::STW))
00682                                 .addReg(InReg, false, false, isKill),
00683                                 FrameIndex);
00684     } else {           // move -> load
00685       unsigned OutReg = MI->getOperand(0).getReg();
00686       bool isDead = MI->getOperand(0).isDead();
00687       NewMI = addFrameReference(BuildMI(MF, get(PPC::LWZ))
00688                                 .addReg(OutReg, true, false, false, isDead),
00689                                 FrameIndex);
00690     }
00691   } else if ((Opc == PPC::OR8 &&
00692               MI->getOperand(1).getReg() == MI->getOperand(2).getReg())) {
00693     if (OpNum == 0) {  // move -> store
00694       unsigned InReg = MI->getOperand(1).getReg();
00695       bool isKill = MI->getOperand(1).isKill();
00696       NewMI = addFrameReference(BuildMI(MF, get(PPC::STD))
00697                                 .addReg(InReg, false, false, isKill),
00698                                 FrameIndex);
00699     } else {           // move -> load
00700       unsigned OutReg = MI->getOperand(0).getReg();
00701       bool isDead = MI->getOperand(0).isDead();
00702       NewMI = addFrameReference(BuildMI(MF, get(PPC::LD))
00703                                 .addReg(OutReg, true, false, false, isDead),
00704                                 FrameIndex);
00705     }
00706   } else if (Opc == PPC::FMRD) {
00707     if (OpNum == 0) {  // move -> store
00708       unsigned InReg = MI->getOperand(1).getReg();
00709       bool isKill = MI->getOperand(1).isKill();
00710       NewMI = addFrameReference(BuildMI(MF, get(PPC::STFD))
00711                                 .addReg(InReg, false, false, isKill),
00712                                 FrameIndex);
00713     } else {           // move -> load
00714       unsigned OutReg = MI->getOperand(0).getReg();
00715       bool isDead = MI->getOperand(0).isDead();
00716       NewMI = addFrameReference(BuildMI(MF, get(PPC::LFD))
00717                                 .addReg(OutReg, true, false, false, isDead),
00718                                 FrameIndex);
00719     }
00720   } else if (Opc == PPC::FMRS) {
00721     if (OpNum == 0) {  // move -> store
00722       unsigned InReg = MI->getOperand(1).getReg();
00723       bool isKill = MI->getOperand(1).isKill();
00724       NewMI = addFrameReference(BuildMI(MF, get(PPC::STFS))
00725                                 .addReg(InReg, false, false, isKill),
00726                                 FrameIndex);
00727     } else {           // move -> load
00728       unsigned OutReg = MI->getOperand(0).getReg();
00729       bool isDead = MI->getOperand(0).isDead();
00730       NewMI = addFrameReference(BuildMI(MF, get(PPC::LFS))
00731                                 .addReg(OutReg, true, false, false, isDead),
00732                                 FrameIndex);
00733     }
00734   }
00735 
00736   return NewMI;
00737 }
00738 
00739 bool PPCInstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
00740                                   const SmallVectorImpl<unsigned> &Ops) const {
00741   if (Ops.size() != 1) return false;
00742 
00743   // Make sure this is a reg-reg copy.  Note that we can't handle MCRF, because
00744   // it takes more than one instruction to store it.
00745   unsigned Opc = MI->getOpcode();
00746 
00747   if ((Opc == PPC::OR &&
00748        MI->getOperand(1).getReg() == MI->getOperand(2).getReg()))
00749     return true;
00750   else if ((Opc == PPC::OR8 &&
00751               MI->getOperand(1).getReg() == MI->getOperand(2).getReg()))
00752     return true;
00753   else if (Opc == PPC::FMRD || Opc == PPC::FMRS)
00754     return true;
00755 
00756   return false;
00757 }
00758 
00759 
00760 bool PPCInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
00761   if (MBB.empty()) return false;
00762   
00763   switch (MBB.back().getOpcode()) {
00764   case PPC::BLR:   // Return.
00765   case PPC::B:     // Uncond branch.
00766   case PPC::BCTR:  // Indirect branch.
00767     return true;
00768   default: return false;
00769   }
00770 }
00771 
00772 bool PPCInstrInfo::
00773 ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
00774   assert(Cond.size() == 2 && "Invalid PPC branch opcode!");
00775   // Leave the CR# the same, but invert the condition.
00776   Cond[0].setImm(PPC::InvertPredicate((PPC::Predicate)Cond[0].getImm()));
00777   return false;
00778 }
00779 
00780 /// GetInstSize - Return the number of bytes of code the specified
00781 /// instruction may be.  This returns the maximum number of bytes.
00782 ///
00783 unsigned PPCInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
00784   switch (MI->getOpcode()) {
00785   case PPC::INLINEASM: {       // Inline Asm: Variable size.
00786     const MachineFunction *MF = MI->getParent()->getParent();
00787     const char *AsmStr = MI->getOperand(0).getSymbolName();
00788     return MF->getTarget().getTargetAsmInfo()->getInlineAsmLength(AsmStr);
00789   }
00790   case PPC::DBG_LABEL:
00791   case PPC::EH_LABEL:
00792   case PPC::GC_LABEL:
00793     return 0;
00794   default:
00795     return 4; // PowerPC instructions are all 4 bytes
00796   }
00797 }