PPCInstrInfo.cpp revision 71a2cb25ebc818383dd0f80475bc166f834e8d99
1//===- PPCInstrInfo.cpp - PowerPC32 Instruction Information -----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the PowerPC implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "PPCInstrInfo.h"
15#include "PPCInstrBuilder.h"
16#include "PPCMachineFunctionInfo.h"
17#include "PPCPredicates.h"
18#include "PPCGenInstrInfo.inc"
19#include "PPCTargetMachine.h"
20#include "llvm/ADT/STLExtras.h"
21#include "llvm/CodeGen/MachineInstrBuilder.h"
22#include "llvm/Support/CommandLine.h"
23using namespace llvm;
24
25extern cl::opt<bool> EnablePPC32RS;  // FIXME (64-bit): See PPCRegisterInfo.cpp.
26extern cl::opt<bool> EnablePPC64RS;  // FIXME (64-bit): See PPCRegisterInfo.cpp.
27
28PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
29  : TargetInstrInfoImpl(PPCInsts, array_lengthof(PPCInsts)), TM(tm),
30    RI(*TM.getSubtargetImpl(), *this) {}
31
32/// getPointerRegClass - Return the register class to use to hold pointers.
33/// This is used for addressing modes.
34const TargetRegisterClass *PPCInstrInfo::getPointerRegClass() const {
35  if (TM.getSubtargetImpl()->isPPC64())
36    return &PPC::G8RCRegClass;
37  else
38    return &PPC::GPRCRegClass;
39}
40
41
42bool PPCInstrInfo::isMoveInstr(const MachineInstr& MI,
43                               unsigned& sourceReg,
44                               unsigned& destReg) const {
45  unsigned oc = MI.getOpcode();
46  if (oc == PPC::OR || oc == PPC::OR8 || oc == PPC::VOR ||
47      oc == PPC::OR4To8 || oc == PPC::OR8To4) {                // or r1, r2, r2
48    assert(MI.getNumOperands() >= 3 &&
49           MI.getOperand(0).isRegister() &&
50           MI.getOperand(1).isRegister() &&
51           MI.getOperand(2).isRegister() &&
52           "invalid PPC OR instruction!");
53    if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
54      sourceReg = MI.getOperand(1).getReg();
55      destReg = MI.getOperand(0).getReg();
56      return true;
57    }
58  } else if (oc == PPC::ADDI) {             // addi r1, r2, 0
59    assert(MI.getNumOperands() >= 3 &&
60           MI.getOperand(0).isRegister() &&
61           MI.getOperand(2).isImmediate() &&
62           "invalid PPC ADDI instruction!");
63    if (MI.getOperand(1).isRegister() && MI.getOperand(2).getImm() == 0) {
64      sourceReg = MI.getOperand(1).getReg();
65      destReg = MI.getOperand(0).getReg();
66      return true;
67    }
68  } else if (oc == PPC::ORI) {             // ori r1, r2, 0
69    assert(MI.getNumOperands() >= 3 &&
70           MI.getOperand(0).isRegister() &&
71           MI.getOperand(1).isRegister() &&
72           MI.getOperand(2).isImmediate() &&
73           "invalid PPC ORI instruction!");
74    if (MI.getOperand(2).getImm() == 0) {
75      sourceReg = MI.getOperand(1).getReg();
76      destReg = MI.getOperand(0).getReg();
77      return true;
78    }
79  } else if (oc == PPC::FMRS || oc == PPC::FMRD ||
80             oc == PPC::FMRSD) {      // fmr r1, r2
81    assert(MI.getNumOperands() >= 2 &&
82           MI.getOperand(0).isRegister() &&
83           MI.getOperand(1).isRegister() &&
84           "invalid PPC FMR instruction");
85    sourceReg = MI.getOperand(1).getReg();
86    destReg = MI.getOperand(0).getReg();
87    return true;
88  } else if (oc == PPC::MCRF) {             // mcrf cr1, cr2
89    assert(MI.getNumOperands() >= 2 &&
90           MI.getOperand(0).isRegister() &&
91           MI.getOperand(1).isRegister() &&
92           "invalid PPC MCRF instruction");
93    sourceReg = MI.getOperand(1).getReg();
94    destReg = MI.getOperand(0).getReg();
95    return true;
96  }
97  return false;
98}
99
100unsigned PPCInstrInfo::isLoadFromStackSlot(MachineInstr *MI,
101                                           int &FrameIndex) const {
102  switch (MI->getOpcode()) {
103  default: break;
104  case PPC::LD:
105  case PPC::LWZ:
106  case PPC::LFS:
107  case PPC::LFD:
108    if (MI->getOperand(1).isImm() && !MI->getOperand(1).getImm() &&
109        MI->getOperand(2).isFI()) {
110      FrameIndex = MI->getOperand(2).getIndex();
111      return MI->getOperand(0).getReg();
112    }
113    break;
114  }
115  return 0;
116}
117
118unsigned PPCInstrInfo::isStoreToStackSlot(MachineInstr *MI,
119                                          int &FrameIndex) const {
120  switch (MI->getOpcode()) {
121  default: break;
122  case PPC::STD:
123  case PPC::STW:
124  case PPC::STFS:
125  case PPC::STFD:
126    if (MI->getOperand(1).isImm() && !MI->getOperand(1).getImm() &&
127        MI->getOperand(2).isFI()) {
128      FrameIndex = MI->getOperand(2).getIndex();
129      return MI->getOperand(0).getReg();
130    }
131    break;
132  }
133  return 0;
134}
135
136// commuteInstruction - We can commute rlwimi instructions, but only if the
137// rotate amt is zero.  We also have to munge the immediates a bit.
138MachineInstr *PPCInstrInfo::commuteInstruction(MachineInstr *MI) const {
139  // Normal instructions can be commuted the obvious way.
140  if (MI->getOpcode() != PPC::RLWIMI)
141    return TargetInstrInfoImpl::commuteInstruction(MI);
142
143  // Cannot commute if it has a non-zero rotate count.
144  if (MI->getOperand(3).getImm() != 0)
145    return 0;
146
147  // If we have a zero rotate count, we have:
148  //   M = mask(MB,ME)
149  //   Op0 = (Op1 & ~M) | (Op2 & M)
150  // Change this to:
151  //   M = mask((ME+1)&31, (MB-1)&31)
152  //   Op0 = (Op2 & ~M) | (Op1 & M)
153
154  // Swap op1/op2
155  unsigned Reg0 = MI->getOperand(0).getReg();
156  unsigned Reg1 = MI->getOperand(1).getReg();
157  unsigned Reg2 = MI->getOperand(2).getReg();
158  bool Reg1IsKill = MI->getOperand(1).isKill();
159  bool Reg2IsKill = MI->getOperand(2).isKill();
160  // If machine instrs are no longer in two-address forms, update
161  // destination register as well.
162  if (Reg0 == Reg1) {
163    // Must be two address instruction!
164    assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
165           "Expecting a two-address instruction!");
166    MI->getOperand(0).setReg(Reg2);
167    Reg2IsKill = false;
168  }
169  MI->getOperand(2).setReg(Reg1);
170  MI->getOperand(1).setReg(Reg2);
171  MI->getOperand(2).setIsKill(Reg1IsKill);
172  MI->getOperand(1).setIsKill(Reg2IsKill);
173
174  // Swap the mask around.
175  unsigned MB = MI->getOperand(4).getImm();
176  unsigned ME = MI->getOperand(5).getImm();
177  MI->getOperand(4).setImm((ME+1) & 31);
178  MI->getOperand(5).setImm((MB-1) & 31);
179  return MI;
180}
181
182void PPCInstrInfo::insertNoop(MachineBasicBlock &MBB,
183                              MachineBasicBlock::iterator MI) const {
184  BuildMI(MBB, MI, get(PPC::NOP));
185}
186
187
188// Branch analysis.
189bool PPCInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
190                                 MachineBasicBlock *&FBB,
191                                 std::vector<MachineOperand> &Cond) const {
192  // If the block has no terminators, it just falls into the block after it.
193  MachineBasicBlock::iterator I = MBB.end();
194  if (I == MBB.begin() || !isUnpredicatedTerminator(--I))
195    return false;
196
197  // Get the last instruction in the block.
198  MachineInstr *LastInst = I;
199
200  // If there is only one terminator instruction, process it.
201  if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
202    if (LastInst->getOpcode() == PPC::B) {
203      TBB = LastInst->getOperand(0).getMBB();
204      return false;
205    } else if (LastInst->getOpcode() == PPC::BCC) {
206      // Block ends with fall-through condbranch.
207      TBB = LastInst->getOperand(2).getMBB();
208      Cond.push_back(LastInst->getOperand(0));
209      Cond.push_back(LastInst->getOperand(1));
210      return false;
211    }
212    // Otherwise, don't know what this is.
213    return true;
214  }
215
216  // Get the instruction before it if it's a terminator.
217  MachineInstr *SecondLastInst = I;
218
219  // If there are three terminators, we don't know what sort of block this is.
220  if (SecondLastInst && I != MBB.begin() &&
221      isUnpredicatedTerminator(--I))
222    return true;
223
224  // If the block ends with PPC::B and PPC:BCC, handle it.
225  if (SecondLastInst->getOpcode() == PPC::BCC &&
226      LastInst->getOpcode() == PPC::B) {
227    TBB =  SecondLastInst->getOperand(2).getMBB();
228    Cond.push_back(SecondLastInst->getOperand(0));
229    Cond.push_back(SecondLastInst->getOperand(1));
230    FBB = LastInst->getOperand(0).getMBB();
231    return false;
232  }
233
234  // If the block ends with two PPC:Bs, handle it.  The second one is not
235  // executed, so remove it.
236  if (SecondLastInst->getOpcode() == PPC::B &&
237      LastInst->getOpcode() == PPC::B) {
238    TBB = SecondLastInst->getOperand(0).getMBB();
239    I = LastInst;
240    I->eraseFromParent();
241    return false;
242  }
243
244  // Otherwise, can't handle this.
245  return true;
246}
247
248unsigned PPCInstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
249  MachineBasicBlock::iterator I = MBB.end();
250  if (I == MBB.begin()) return 0;
251  --I;
252  if (I->getOpcode() != PPC::B && I->getOpcode() != PPC::BCC)
253    return 0;
254
255  // Remove the branch.
256  I->eraseFromParent();
257
258  I = MBB.end();
259
260  if (I == MBB.begin()) return 1;
261  --I;
262  if (I->getOpcode() != PPC::BCC)
263    return 1;
264
265  // Remove the branch.
266  I->eraseFromParent();
267  return 2;
268}
269
270unsigned
271PPCInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
272                           MachineBasicBlock *FBB,
273                           const std::vector<MachineOperand> &Cond) const {
274  // Shouldn't be a fall through.
275  assert(TBB && "InsertBranch must not be told to insert a fallthrough");
276  assert((Cond.size() == 2 || Cond.size() == 0) &&
277         "PPC branch conditions have two components!");
278
279  // One-way branch.
280  if (FBB == 0) {
281    if (Cond.empty())   // Unconditional branch
282      BuildMI(&MBB, get(PPC::B)).addMBB(TBB);
283    else                // Conditional branch
284      BuildMI(&MBB, get(PPC::BCC))
285        .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()).addMBB(TBB);
286    return 1;
287  }
288
289  // Two-way Conditional Branch.
290  BuildMI(&MBB, get(PPC::BCC))
291    .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()).addMBB(TBB);
292  BuildMI(&MBB, get(PPC::B)).addMBB(FBB);
293  return 2;
294}
295
296void PPCInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
297                                   MachineBasicBlock::iterator MI,
298                                   unsigned DestReg, unsigned SrcReg,
299                                   const TargetRegisterClass *DestRC,
300                                   const TargetRegisterClass *SrcRC) const {
301  if (DestRC != SrcRC) {
302    cerr << "Not yet supported!";
303    abort();
304  }
305
306  if (DestRC == PPC::GPRCRegisterClass) {
307    BuildMI(MBB, MI, get(PPC::OR), DestReg).addReg(SrcReg).addReg(SrcReg);
308  } else if (DestRC == PPC::G8RCRegisterClass) {
309    BuildMI(MBB, MI, get(PPC::OR8), DestReg).addReg(SrcReg).addReg(SrcReg);
310  } else if (DestRC == PPC::F4RCRegisterClass) {
311    BuildMI(MBB, MI, get(PPC::FMRS), DestReg).addReg(SrcReg);
312  } else if (DestRC == PPC::F8RCRegisterClass) {
313    BuildMI(MBB, MI, get(PPC::FMRD), DestReg).addReg(SrcReg);
314  } else if (DestRC == PPC::CRRCRegisterClass) {
315    BuildMI(MBB, MI, get(PPC::MCRF), DestReg).addReg(SrcReg);
316  } else if (DestRC == PPC::VRRCRegisterClass) {
317    BuildMI(MBB, MI, get(PPC::VOR), DestReg).addReg(SrcReg).addReg(SrcReg);
318  } else if (DestRC == PPC::CRBITRCRegisterClass) {
319    BuildMI(MBB, MI, get(PPC::CROR), DestReg).addReg(SrcReg).addReg(SrcReg);
320  } else {
321    cerr << "Attempt to copy register that is not GPR or FPR";
322    abort();
323  }
324}
325
326bool
327PPCInstrInfo::StoreRegToStackSlot(unsigned SrcReg, bool isKill,
328                                  int FrameIdx,
329                                  const TargetRegisterClass *RC,
330                                  SmallVectorImpl<MachineInstr*> &NewMIs) const{
331  if (RC == PPC::GPRCRegisterClass) {
332    if (SrcReg != PPC::LR) {
333      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STW))
334                                         .addReg(SrcReg, false, false, isKill),
335                                         FrameIdx));
336    } else {
337      // FIXME: this spills LR immediately to memory in one step.  To do this,
338      // we use R11, which we know cannot be used in the prolog/epilog.  This is
339      // a hack.
340      NewMIs.push_back(BuildMI(get(PPC::MFLR), PPC::R11));
341      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STW))
342                                         .addReg(PPC::R11, false, false, isKill),
343                                         FrameIdx));
344    }
345  } else if (RC == PPC::G8RCRegisterClass) {
346    if (SrcReg != PPC::LR8) {
347      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STD))
348                              .addReg(SrcReg, false, false, isKill), FrameIdx));
349    } else {
350      // FIXME: this spills LR immediately to memory in one step.  To do this,
351      // we use R11, which we know cannot be used in the prolog/epilog.  This is
352      // a hack.
353      NewMIs.push_back(BuildMI(get(PPC::MFLR8), PPC::X11));
354      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STD))
355                            .addReg(PPC::X11, false, false, isKill), FrameIdx));
356    }
357  } else if (RC == PPC::F8RCRegisterClass) {
358    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STFD))
359                              .addReg(SrcReg, false, false, isKill), FrameIdx));
360  } else if (RC == PPC::F4RCRegisterClass) {
361    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STFS))
362                              .addReg(SrcReg, false, false, isKill), FrameIdx));
363  } else if (RC == PPC::CRRCRegisterClass) {
364    if ((EnablePPC32RS && !TM.getSubtargetImpl()->isPPC64()) ||
365        (EnablePPC64RS && TM.getSubtargetImpl()->isPPC64())) {
366      // FIXME (64-bit): Enable
367      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::SPILL_CR))
368                                         .addReg(SrcReg, false, false, isKill),
369                                         FrameIdx));
370      return true;
371    } else {
372      // FIXME: We use R0 here, because it isn't available for RA.  We need to
373      // store the CR in the low 4-bits of the saved value.  First, issue a MFCR
374      // to save all of the CRBits.
375      NewMIs.push_back(BuildMI(get(PPC::MFCR), PPC::R0));
376
377      // If the saved register wasn't CR0, shift the bits left so that they are
378      // in CR0's slot.
379      if (SrcReg != PPC::CR0) {
380        unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4;
381        // rlwinm r0, r0, ShiftBits, 0, 31.
382        NewMIs.push_back(BuildMI(get(PPC::RLWINM), PPC::R0)
383                       .addReg(PPC::R0).addImm(ShiftBits).addImm(0).addImm(31));
384      }
385
386      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::STW))
387                                         .addReg(PPC::R0, false, false, isKill),
388                                         FrameIdx));
389    }
390  } else if (RC == PPC::CRBITRCRegisterClass) {
391    // FIXME: We use CRi here because there is no mtcrf on a bit. Since the
392    // backend currently only uses CR1EQ as an individual bit, this should
393    // not cause any bug. If we need other uses of CR bits, the following
394    // code may be invalid.
395    unsigned Reg = 0;
396    if (SrcReg >= PPC::CR0LT || SrcReg <= PPC::CR0UN)
397      Reg = PPC::CR0;
398    else if (SrcReg >= PPC::CR1LT || SrcReg <= PPC::CR1UN)
399      Reg = PPC::CR1;
400    else if (SrcReg >= PPC::CR2LT || SrcReg <= PPC::CR2UN)
401      Reg = PPC::CR2;
402    else if (SrcReg >= PPC::CR3LT || SrcReg <= PPC::CR3UN)
403      Reg = PPC::CR3;
404    else if (SrcReg >= PPC::CR4LT || SrcReg <= PPC::CR4UN)
405      Reg = PPC::CR4;
406    else if (SrcReg >= PPC::CR5LT || SrcReg <= PPC::CR5UN)
407      Reg = PPC::CR5;
408    else if (SrcReg >= PPC::CR6LT || SrcReg <= PPC::CR6UN)
409      Reg = PPC::CR6;
410    else if (SrcReg >= PPC::CR7LT || SrcReg <= PPC::CR7UN)
411      Reg = PPC::CR7;
412
413    return StoreRegToStackSlot(Reg, isKill, FrameIdx,
414                               PPC::CRRCRegisterClass, NewMIs);
415
416  } else if (RC == PPC::VRRCRegisterClass) {
417    // We don't have indexed addressing for vector loads.  Emit:
418    // R0 = ADDI FI#
419    // STVX VAL, 0, R0
420    //
421    // FIXME: We use R0 here, because it isn't available for RA.
422    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::ADDI), PPC::R0),
423                                       FrameIdx, 0, 0));
424    NewMIs.push_back(BuildMI(get(PPC::STVX))
425         .addReg(SrcReg, false, false, isKill).addReg(PPC::R0).addReg(PPC::R0));
426  } else {
427    assert(0 && "Unknown regclass!");
428    abort();
429  }
430
431  return false;
432}
433
434void
435PPCInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
436                                  MachineBasicBlock::iterator MI,
437                                  unsigned SrcReg, bool isKill, int FrameIdx,
438                                  const TargetRegisterClass *RC) const {
439  SmallVector<MachineInstr*, 4> NewMIs;
440
441  if (StoreRegToStackSlot(SrcReg, isKill, FrameIdx, RC, NewMIs)) {
442    PPCFunctionInfo *FuncInfo = MBB.getParent()->getInfo<PPCFunctionInfo>();
443    FuncInfo->setSpillsCR();
444  }
445
446  for (unsigned i = 0, e = NewMIs.size(); i != e; ++i)
447    MBB.insert(MI, NewMIs[i]);
448}
449
450void PPCInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
451                                  bool isKill,
452                                  SmallVectorImpl<MachineOperand> &Addr,
453                                  const TargetRegisterClass *RC,
454                                  SmallVectorImpl<MachineInstr*> &NewMIs) const{
455  if (Addr[0].isFrameIndex()) {
456    if (StoreRegToStackSlot(SrcReg, isKill, Addr[0].getIndex(), RC, NewMIs)) {
457      PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
458      FuncInfo->setSpillsCR();
459    }
460
461    return;
462  }
463
464  unsigned Opc = 0;
465  if (RC == PPC::GPRCRegisterClass) {
466    Opc = PPC::STW;
467  } else if (RC == PPC::G8RCRegisterClass) {
468    Opc = PPC::STD;
469  } else if (RC == PPC::F8RCRegisterClass) {
470    Opc = PPC::STFD;
471  } else if (RC == PPC::F4RCRegisterClass) {
472    Opc = PPC::STFS;
473  } else if (RC == PPC::VRRCRegisterClass) {
474    Opc = PPC::STVX;
475  } else {
476    assert(0 && "Unknown regclass!");
477    abort();
478  }
479  MachineInstrBuilder MIB = BuildMI(get(Opc))
480    .addReg(SrcReg, false, false, isKill);
481  for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
482    MachineOperand &MO = Addr[i];
483    if (MO.isRegister())
484      MIB.addReg(MO.getReg());
485    else if (MO.isImmediate())
486      MIB.addImm(MO.getImm());
487    else
488      MIB.addFrameIndex(MO.getIndex());
489  }
490  NewMIs.push_back(MIB);
491  return;
492}
493
494void
495PPCInstrInfo::LoadRegFromStackSlot(unsigned DestReg, int FrameIdx,
496                                   const TargetRegisterClass *RC,
497                                   SmallVectorImpl<MachineInstr*> &NewMIs)const{
498  if (RC == PPC::GPRCRegisterClass) {
499    if (DestReg != PPC::LR) {
500      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LWZ), DestReg),
501                                         FrameIdx));
502    } else {
503      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LWZ), PPC::R11),
504                                         FrameIdx));
505      NewMIs.push_back(BuildMI(get(PPC::MTLR)).addReg(PPC::R11));
506    }
507  } else if (RC == PPC::G8RCRegisterClass) {
508    if (DestReg != PPC::LR8) {
509      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LD), DestReg),
510                                         FrameIdx));
511    } else {
512      NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LD), PPC::R11),
513                                         FrameIdx));
514      NewMIs.push_back(BuildMI(get(PPC::MTLR8)).addReg(PPC::R11));
515    }
516  } else if (RC == PPC::F8RCRegisterClass) {
517    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LFD), DestReg),
518                                       FrameIdx));
519  } else if (RC == PPC::F4RCRegisterClass) {
520    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LFS), DestReg),
521                                       FrameIdx));
522  } else if (RC == PPC::CRRCRegisterClass) {
523    // FIXME: We use R0 here, because it isn't available for RA.
524    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::LWZ), PPC::R0),
525                                       FrameIdx));
526
527    // If the reloaded register isn't CR0, shift the bits right so that they are
528    // in the right CR's slot.
529    if (DestReg != PPC::CR0) {
530      unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4;
531      // rlwinm r11, r11, 32-ShiftBits, 0, 31.
532      NewMIs.push_back(BuildMI(get(PPC::RLWINM), PPC::R0)
533                    .addReg(PPC::R0).addImm(32-ShiftBits).addImm(0).addImm(31));
534    }
535
536    NewMIs.push_back(BuildMI(get(PPC::MTCRF), DestReg).addReg(PPC::R0));
537  } else if (RC == PPC::CRBITRCRegisterClass) {
538
539    unsigned Reg = 0;
540    if (DestReg >= PPC::CR0LT || DestReg <= PPC::CR0UN)
541      Reg = PPC::CR0;
542    else if (DestReg >= PPC::CR1LT || DestReg <= PPC::CR1UN)
543      Reg = PPC::CR1;
544    else if (DestReg >= PPC::CR2LT || DestReg <= PPC::CR2UN)
545      Reg = PPC::CR2;
546    else if (DestReg >= PPC::CR3LT || DestReg <= PPC::CR3UN)
547      Reg = PPC::CR3;
548    else if (DestReg >= PPC::CR4LT || DestReg <= PPC::CR4UN)
549      Reg = PPC::CR4;
550    else if (DestReg >= PPC::CR5LT || DestReg <= PPC::CR5UN)
551      Reg = PPC::CR5;
552    else if (DestReg >= PPC::CR6LT || DestReg <= PPC::CR6UN)
553      Reg = PPC::CR6;
554    else if (DestReg >= PPC::CR7LT || DestReg <= PPC::CR7UN)
555      Reg = PPC::CR7;
556
557    return LoadRegFromStackSlot(Reg, FrameIdx,
558                                PPC::CRRCRegisterClass, NewMIs);
559
560  } else if (RC == PPC::VRRCRegisterClass) {
561    // We don't have indexed addressing for vector loads.  Emit:
562    // R0 = ADDI FI#
563    // Dest = LVX 0, R0
564    //
565    // FIXME: We use R0 here, because it isn't available for RA.
566    NewMIs.push_back(addFrameReference(BuildMI(get(PPC::ADDI), PPC::R0),
567                                       FrameIdx, 0, 0));
568    NewMIs.push_back(BuildMI(get(PPC::LVX),DestReg).addReg(PPC::R0)
569                     .addReg(PPC::R0));
570  } else {
571    assert(0 && "Unknown regclass!");
572    abort();
573  }
574}
575
576void
577PPCInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
578                                   MachineBasicBlock::iterator MI,
579                                   unsigned DestReg, int FrameIdx,
580                                   const TargetRegisterClass *RC) const {
581  SmallVector<MachineInstr*, 4> NewMIs;
582  LoadRegFromStackSlot(DestReg, FrameIdx, RC, NewMIs);
583  for (unsigned i = 0, e = NewMIs.size(); i != e; ++i)
584    MBB.insert(MI, NewMIs[i]);
585}
586
587void PPCInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
588                                   SmallVectorImpl<MachineOperand> &Addr,
589                                   const TargetRegisterClass *RC,
590                                   SmallVectorImpl<MachineInstr*> &NewMIs)const{
591  if (Addr[0].isFrameIndex()) {
592    LoadRegFromStackSlot(DestReg, Addr[0].getIndex(), RC, NewMIs);
593    return;
594  }
595
596  unsigned Opc = 0;
597  if (RC == PPC::GPRCRegisterClass) {
598    assert(DestReg != PPC::LR && "Can't handle this yet!");
599    Opc = PPC::LWZ;
600  } else if (RC == PPC::G8RCRegisterClass) {
601    assert(DestReg != PPC::LR8 && "Can't handle this yet!");
602    Opc = PPC::LD;
603  } else if (RC == PPC::F8RCRegisterClass) {
604    Opc = PPC::LFD;
605  } else if (RC == PPC::F4RCRegisterClass) {
606    Opc = PPC::LFS;
607  } else if (RC == PPC::VRRCRegisterClass) {
608    Opc = PPC::LVX;
609  } else {
610    assert(0 && "Unknown regclass!");
611    abort();
612  }
613  MachineInstrBuilder MIB = BuildMI(get(Opc), DestReg);
614  for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
615    MachineOperand &MO = Addr[i];
616    if (MO.isRegister())
617      MIB.addReg(MO.getReg());
618    else if (MO.isImmediate())
619      MIB.addImm(MO.getImm());
620    else
621      MIB.addFrameIndex(MO.getIndex());
622  }
623  NewMIs.push_back(MIB);
624  return;
625}
626
627/// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
628/// copy instructions, turning them into load/store instructions.
629MachineInstr *PPCInstrInfo::foldMemoryOperand(MachineFunction &MF,
630                                              MachineInstr *MI,
631                                              SmallVectorImpl<unsigned> &Ops,
632                                              int FrameIndex) const {
633  if (Ops.size() != 1) return NULL;
634
635  // Make sure this is a reg-reg copy.  Note that we can't handle MCRF, because
636  // it takes more than one instruction to store it.
637  unsigned Opc = MI->getOpcode();
638  unsigned OpNum = Ops[0];
639
640  MachineInstr *NewMI = NULL;
641  if ((Opc == PPC::OR &&
642       MI->getOperand(1).getReg() == MI->getOperand(2).getReg())) {
643    if (OpNum == 0) {  // move -> store
644      unsigned InReg = MI->getOperand(1).getReg();
645      NewMI = addFrameReference(BuildMI(get(PPC::STW)).addReg(InReg),
646                                FrameIndex);
647    } else {           // move -> load
648      unsigned OutReg = MI->getOperand(0).getReg();
649      NewMI = addFrameReference(BuildMI(get(PPC::LWZ), OutReg),
650                                FrameIndex);
651    }
652  } else if ((Opc == PPC::OR8 &&
653              MI->getOperand(1).getReg() == MI->getOperand(2).getReg())) {
654    if (OpNum == 0) {  // move -> store
655      unsigned InReg = MI->getOperand(1).getReg();
656      NewMI = addFrameReference(BuildMI(get(PPC::STD)).addReg(InReg),
657                                FrameIndex);
658    } else {           // move -> load
659      unsigned OutReg = MI->getOperand(0).getReg();
660      NewMI = addFrameReference(BuildMI(get(PPC::LD), OutReg), FrameIndex);
661    }
662  } else if (Opc == PPC::FMRD) {
663    if (OpNum == 0) {  // move -> store
664      unsigned InReg = MI->getOperand(1).getReg();
665      NewMI = addFrameReference(BuildMI(get(PPC::STFD)).addReg(InReg),
666                                FrameIndex);
667    } else {           // move -> load
668      unsigned OutReg = MI->getOperand(0).getReg();
669      NewMI = addFrameReference(BuildMI(get(PPC::LFD), OutReg), FrameIndex);
670    }
671  } else if (Opc == PPC::FMRS) {
672    if (OpNum == 0) {  // move -> store
673      unsigned InReg = MI->getOperand(1).getReg();
674      NewMI = addFrameReference(BuildMI(get(PPC::STFS)).addReg(InReg),
675                                FrameIndex);
676    } else {           // move -> load
677      unsigned OutReg = MI->getOperand(0).getReg();
678      NewMI = addFrameReference(BuildMI(get(PPC::LFS), OutReg), FrameIndex);
679    }
680  }
681
682  if (NewMI)
683    NewMI->copyKillDeadInfo(MI);
684  return NewMI;
685}
686
687bool PPCInstrInfo::canFoldMemoryOperand(MachineInstr *MI,
688                                        SmallVectorImpl<unsigned> &Ops) const {
689  if (Ops.size() != 1) return false;
690
691  // Make sure this is a reg-reg copy.  Note that we can't handle MCRF, because
692  // it takes more than one instruction to store it.
693  unsigned Opc = MI->getOpcode();
694
695  if ((Opc == PPC::OR &&
696       MI->getOperand(1).getReg() == MI->getOperand(2).getReg()))
697    return true;
698  else if ((Opc == PPC::OR8 &&
699              MI->getOperand(1).getReg() == MI->getOperand(2).getReg()))
700    return true;
701  else if (Opc == PPC::FMRD || Opc == PPC::FMRS)
702    return true;
703
704  return false;
705}
706
707
708bool PPCInstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
709  if (MBB.empty()) return false;
710
711  switch (MBB.back().getOpcode()) {
712  case PPC::BLR:   // Return.
713  case PPC::B:     // Uncond branch.
714  case PPC::BCTR:  // Indirect branch.
715    return true;
716  default: return false;
717  }
718}
719
720bool PPCInstrInfo::
721ReverseBranchCondition(std::vector<MachineOperand> &Cond) const {
722  assert(Cond.size() == 2 && "Invalid PPC branch opcode!");
723  // Leave the CR# the same, but invert the condition.
724  Cond[0].setImm(PPC::InvertPredicate((PPC::Predicate)Cond[0].getImm()));
725  return false;
726}
727