MipsInstrInfo.cpp revision 210299
1//===- MipsInstrInfo.cpp - Mips 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 Mips implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsInstrInfo.h"
15#include "MipsTargetMachine.h"
16#include "MipsMachineFunction.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/CodeGen/MachineInstrBuilder.h"
19#include "llvm/CodeGen/MachineRegisterInfo.h"
20#include "llvm/Support/ErrorHandling.h"
21#include "MipsGenInstrInfo.inc"
22
23using namespace llvm;
24
25MipsInstrInfo::MipsInstrInfo(MipsTargetMachine &tm)
26  : TargetInstrInfoImpl(MipsInsts, array_lengthof(MipsInsts)),
27    TM(tm), RI(*TM.getSubtargetImpl(), *this) {}
28
29static bool isZeroImm(const MachineOperand &op) {
30  return op.isImm() && op.getImm() == 0;
31}
32
33/// Return true if the instruction is a register to register move and
34/// leave the source and dest operands in the passed parameters.
35bool MipsInstrInfo::
36isMoveInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg,
37            unsigned &SrcSubIdx, unsigned &DstSubIdx) const
38{
39  SrcSubIdx = DstSubIdx = 0; // No sub-registers.
40
41  // addu $dst, $src, $zero || addu $dst, $zero, $src
42  // or   $dst, $src, $zero || or   $dst, $zero, $src
43  if ((MI.getOpcode() == Mips::ADDu) || (MI.getOpcode() == Mips::OR)) {
44    if (MI.getOperand(1).getReg() == Mips::ZERO) {
45      DstReg = MI.getOperand(0).getReg();
46      SrcReg = MI.getOperand(2).getReg();
47      return true;
48    } else if (MI.getOperand(2).getReg() == Mips::ZERO) {
49      DstReg = MI.getOperand(0).getReg();
50      SrcReg = MI.getOperand(1).getReg();
51      return true;
52    }
53  }
54
55  // mov $fpDst, $fpSrc
56  // mfc $gpDst, $fpSrc
57  // mtc $fpDst, $gpSrc
58  if (MI.getOpcode() == Mips::FMOV_S32 ||
59      MI.getOpcode() == Mips::FMOV_D32 ||
60      MI.getOpcode() == Mips::MFC1 ||
61      MI.getOpcode() == Mips::MTC1 ||
62      MI.getOpcode() == Mips::MOVCCRToCCR) {
63    DstReg = MI.getOperand(0).getReg();
64    SrcReg = MI.getOperand(1).getReg();
65    return true;
66  }
67
68  // addiu $dst, $src, 0
69  if (MI.getOpcode() == Mips::ADDiu) {
70    if ((MI.getOperand(1).isReg()) && (isZeroImm(MI.getOperand(2)))) {
71      DstReg = MI.getOperand(0).getReg();
72      SrcReg = MI.getOperand(1).getReg();
73      return true;
74    }
75  }
76
77  return false;
78}
79
80/// isLoadFromStackSlot - If the specified machine instruction is a direct
81/// load from a stack slot, return the virtual or physical register number of
82/// the destination along with the FrameIndex of the loaded stack slot.  If
83/// not, return 0.  This predicate must return 0 if the instruction has
84/// any side effects other than loading from the stack slot.
85unsigned MipsInstrInfo::
86isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
87{
88  if ((MI->getOpcode() == Mips::LW) || (MI->getOpcode() == Mips::LWC1) ||
89      (MI->getOpcode() == Mips::LDC1)) {
90    if ((MI->getOperand(2).isFI()) && // is a stack slot
91        (MI->getOperand(1).isImm()) &&  // the imm is zero
92        (isZeroImm(MI->getOperand(1)))) {
93      FrameIndex = MI->getOperand(2).getIndex();
94      return MI->getOperand(0).getReg();
95    }
96  }
97
98  return 0;
99}
100
101/// isStoreToStackSlot - If the specified machine instruction is a direct
102/// store to a stack slot, return the virtual or physical register number of
103/// the source reg along with the FrameIndex of the loaded stack slot.  If
104/// not, return 0.  This predicate must return 0 if the instruction has
105/// any side effects other than storing to the stack slot.
106unsigned MipsInstrInfo::
107isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
108{
109  if ((MI->getOpcode() == Mips::SW) || (MI->getOpcode() == Mips::SWC1) ||
110      (MI->getOpcode() == Mips::SDC1)) {
111    if ((MI->getOperand(2).isFI()) && // is a stack slot
112        (MI->getOperand(1).isImm()) &&  // the imm is zero
113        (isZeroImm(MI->getOperand(1)))) {
114      FrameIndex = MI->getOperand(2).getIndex();
115      return MI->getOperand(0).getReg();
116    }
117  }
118  return 0;
119}
120
121/// insertNoop - If data hazard condition is found insert the target nop
122/// instruction.
123void MipsInstrInfo::
124insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
125{
126  DebugLoc DL;
127  BuildMI(MBB, MI, DL, get(Mips::NOP));
128}
129
130void MipsInstrInfo::
131copyPhysReg(MachineBasicBlock &MBB,
132            MachineBasicBlock::iterator I, DebugLoc DL,
133            unsigned DestReg, unsigned SrcReg,
134            bool KillSrc) const {
135  bool DestCPU = Mips::CPURegsRegClass.contains(DestReg);
136  bool SrcCPU  = Mips::CPURegsRegClass.contains(SrcReg);
137
138  // CPU-CPU is the most common.
139  if (DestCPU && SrcCPU) {
140    BuildMI(MBB, I, DL, get(Mips::ADDu), DestReg).addReg(Mips::ZERO)
141      .addReg(SrcReg, getKillRegState(KillSrc));
142    return;
143  }
144
145  // Copy to CPU from other registers.
146  if (DestCPU) {
147    if (Mips::CCRRegClass.contains(SrcReg))
148      BuildMI(MBB, I, DL, get(Mips::CFC1), DestReg)
149        .addReg(SrcReg, getKillRegState(KillSrc));
150    else if (Mips::FGR32RegClass.contains(SrcReg))
151      BuildMI(MBB, I, DL, get(Mips::MFC1), DestReg)
152        .addReg(SrcReg, getKillRegState(KillSrc));
153    else if (SrcReg == Mips::HI)
154      BuildMI(MBB, I, DL, get(Mips::MFHI), DestReg);
155    else if (SrcReg == Mips::LO)
156      BuildMI(MBB, I, DL, get(Mips::MFLO), DestReg);
157    else
158      llvm_unreachable("Copy to CPU from invalid register");
159    return;
160  }
161
162  // Copy to other registers from CPU.
163  if (SrcCPU) {
164    if (Mips::CCRRegClass.contains(DestReg))
165      BuildMI(MBB, I, DL, get(Mips::CTC1), DestReg)
166        .addReg(SrcReg, getKillRegState(KillSrc));
167    else if (Mips::FGR32RegClass.contains(DestReg))
168      BuildMI(MBB, I, DL, get(Mips::MTC1), DestReg)
169        .addReg(SrcReg, getKillRegState(KillSrc));
170    else if (DestReg == Mips::HI)
171      BuildMI(MBB, I, DL, get(Mips::MTHI))
172        .addReg(SrcReg, getKillRegState(KillSrc));
173    else if (DestReg == Mips::LO)
174      BuildMI(MBB, I, DL, get(Mips::MTLO))
175        .addReg(SrcReg, getKillRegState(KillSrc));
176    else
177      llvm_unreachable("Copy from CPU to invalid register");
178    return;
179  }
180
181  if (Mips::FGR32RegClass.contains(DestReg, SrcReg)) {
182    BuildMI(MBB, I, DL, get(Mips::FMOV_S32), DestReg)
183      .addReg(SrcReg, getKillRegState(KillSrc));
184    return;
185  }
186
187  if (Mips::AFGR64RegClass.contains(DestReg, SrcReg)) {
188    BuildMI(MBB, I, DL, get(Mips::FMOV_D32), DestReg)
189      .addReg(SrcReg, getKillRegState(KillSrc));
190    return;
191  }
192
193  if (Mips::CCRRegClass.contains(DestReg, SrcReg)) {
194    BuildMI(MBB, I, DL, get(Mips::MOVCCRToCCR), DestReg)
195      .addReg(SrcReg, getKillRegState(KillSrc));
196    return;
197  }
198  llvm_unreachable("Cannot copy registers");
199}
200
201void MipsInstrInfo::
202storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
203                    unsigned SrcReg, bool isKill, int FI,
204                    const TargetRegisterClass *RC,
205                    const TargetRegisterInfo *TRI) const {
206  DebugLoc DL;
207  if (I != MBB.end()) DL = I->getDebugLoc();
208
209  if (RC == Mips::CPURegsRegisterClass)
210    BuildMI(MBB, I, DL, get(Mips::SW)).addReg(SrcReg, getKillRegState(isKill))
211          .addImm(0).addFrameIndex(FI);
212  else if (RC == Mips::FGR32RegisterClass)
213    BuildMI(MBB, I, DL, get(Mips::SWC1)).addReg(SrcReg, getKillRegState(isKill))
214          .addImm(0).addFrameIndex(FI);
215  else if (RC == Mips::AFGR64RegisterClass) {
216    if (!TM.getSubtarget<MipsSubtarget>().isMips1()) {
217      BuildMI(MBB, I, DL, get(Mips::SDC1))
218        .addReg(SrcReg, getKillRegState(isKill))
219        .addImm(0).addFrameIndex(FI);
220    } else {
221      const TargetRegisterInfo *TRI =
222        MBB.getParent()->getTarget().getRegisterInfo();
223      const unsigned *SubSet = TRI->getSubRegisters(SrcReg);
224      BuildMI(MBB, I, DL, get(Mips::SWC1))
225        .addReg(SubSet[0], getKillRegState(isKill))
226        .addImm(0).addFrameIndex(FI);
227      BuildMI(MBB, I, DL, get(Mips::SWC1))
228        .addReg(SubSet[1], getKillRegState(isKill))
229        .addImm(4).addFrameIndex(FI);
230    }
231  } else
232    llvm_unreachable("Register class not handled!");
233}
234
235void MipsInstrInfo::
236loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
237                     unsigned DestReg, int FI,
238                     const TargetRegisterClass *RC,
239                     const TargetRegisterInfo *TRI) const
240{
241  DebugLoc DL;
242  if (I != MBB.end()) DL = I->getDebugLoc();
243
244  if (RC == Mips::CPURegsRegisterClass)
245    BuildMI(MBB, I, DL, get(Mips::LW), DestReg).addImm(0).addFrameIndex(FI);
246  else if (RC == Mips::FGR32RegisterClass)
247    BuildMI(MBB, I, DL, get(Mips::LWC1), DestReg).addImm(0).addFrameIndex(FI);
248  else if (RC == Mips::AFGR64RegisterClass) {
249    if (!TM.getSubtarget<MipsSubtarget>().isMips1()) {
250      BuildMI(MBB, I, DL, get(Mips::LDC1), DestReg).addImm(0).addFrameIndex(FI);
251    } else {
252      const TargetRegisterInfo *TRI =
253        MBB.getParent()->getTarget().getRegisterInfo();
254      const unsigned *SubSet = TRI->getSubRegisters(DestReg);
255      BuildMI(MBB, I, DL, get(Mips::LWC1), SubSet[0])
256        .addImm(0).addFrameIndex(FI);
257      BuildMI(MBB, I, DL, get(Mips::LWC1), SubSet[1])
258        .addImm(4).addFrameIndex(FI);
259    }
260  } else
261    llvm_unreachable("Register class not handled!");
262}
263
264//===----------------------------------------------------------------------===//
265// Branch Analysis
266//===----------------------------------------------------------------------===//
267
268/// GetCondFromBranchOpc - Return the Mips CC that matches
269/// the correspondent Branch instruction opcode.
270static Mips::CondCode GetCondFromBranchOpc(unsigned BrOpc)
271{
272  switch (BrOpc) {
273  default: return Mips::COND_INVALID;
274  case Mips::BEQ  : return Mips::COND_E;
275  case Mips::BNE  : return Mips::COND_NE;
276  case Mips::BGTZ : return Mips::COND_GZ;
277  case Mips::BGEZ : return Mips::COND_GEZ;
278  case Mips::BLTZ : return Mips::COND_LZ;
279  case Mips::BLEZ : return Mips::COND_LEZ;
280
281  // We dont do fp branch analysis yet!
282  case Mips::BC1T :
283  case Mips::BC1F : return Mips::COND_INVALID;
284  }
285}
286
287/// GetCondBranchFromCond - Return the Branch instruction
288/// opcode that matches the cc.
289unsigned Mips::GetCondBranchFromCond(Mips::CondCode CC)
290{
291  switch (CC) {
292  default: llvm_unreachable("Illegal condition code!");
293  case Mips::COND_E   : return Mips::BEQ;
294  case Mips::COND_NE  : return Mips::BNE;
295  case Mips::COND_GZ  : return Mips::BGTZ;
296  case Mips::COND_GEZ : return Mips::BGEZ;
297  case Mips::COND_LZ  : return Mips::BLTZ;
298  case Mips::COND_LEZ : return Mips::BLEZ;
299
300  case Mips::FCOND_F:
301  case Mips::FCOND_UN:
302  case Mips::FCOND_EQ:
303  case Mips::FCOND_UEQ:
304  case Mips::FCOND_OLT:
305  case Mips::FCOND_ULT:
306  case Mips::FCOND_OLE:
307  case Mips::FCOND_ULE:
308  case Mips::FCOND_SF:
309  case Mips::FCOND_NGLE:
310  case Mips::FCOND_SEQ:
311  case Mips::FCOND_NGL:
312  case Mips::FCOND_LT:
313  case Mips::FCOND_NGE:
314  case Mips::FCOND_LE:
315  case Mips::FCOND_NGT: return Mips::BC1T;
316
317  case Mips::FCOND_T:
318  case Mips::FCOND_OR:
319  case Mips::FCOND_NEQ:
320  case Mips::FCOND_OGL:
321  case Mips::FCOND_UGE:
322  case Mips::FCOND_OGE:
323  case Mips::FCOND_UGT:
324  case Mips::FCOND_OGT:
325  case Mips::FCOND_ST:
326  case Mips::FCOND_GLE:
327  case Mips::FCOND_SNE:
328  case Mips::FCOND_GL:
329  case Mips::FCOND_NLT:
330  case Mips::FCOND_GE:
331  case Mips::FCOND_NLE:
332  case Mips::FCOND_GT: return Mips::BC1F;
333  }
334}
335
336/// GetOppositeBranchCondition - Return the inverse of the specified
337/// condition, e.g. turning COND_E to COND_NE.
338Mips::CondCode Mips::GetOppositeBranchCondition(Mips::CondCode CC)
339{
340  switch (CC) {
341  default: llvm_unreachable("Illegal condition code!");
342  case Mips::COND_E   : return Mips::COND_NE;
343  case Mips::COND_NE  : return Mips::COND_E;
344  case Mips::COND_GZ  : return Mips::COND_LEZ;
345  case Mips::COND_GEZ : return Mips::COND_LZ;
346  case Mips::COND_LZ  : return Mips::COND_GEZ;
347  case Mips::COND_LEZ : return Mips::COND_GZ;
348  case Mips::FCOND_F  : return Mips::FCOND_T;
349  case Mips::FCOND_UN : return Mips::FCOND_OR;
350  case Mips::FCOND_EQ : return Mips::FCOND_NEQ;
351  case Mips::FCOND_UEQ: return Mips::FCOND_OGL;
352  case Mips::FCOND_OLT: return Mips::FCOND_UGE;
353  case Mips::FCOND_ULT: return Mips::FCOND_OGE;
354  case Mips::FCOND_OLE: return Mips::FCOND_UGT;
355  case Mips::FCOND_ULE: return Mips::FCOND_OGT;
356  case Mips::FCOND_SF:  return Mips::FCOND_ST;
357  case Mips::FCOND_NGLE:return Mips::FCOND_GLE;
358  case Mips::FCOND_SEQ: return Mips::FCOND_SNE;
359  case Mips::FCOND_NGL: return Mips::FCOND_GL;
360  case Mips::FCOND_LT:  return Mips::FCOND_NLT;
361  case Mips::FCOND_NGE: return Mips::FCOND_GE;
362  case Mips::FCOND_LE:  return Mips::FCOND_NLE;
363  case Mips::FCOND_NGT: return Mips::FCOND_GT;
364  }
365}
366
367bool MipsInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,
368                                  MachineBasicBlock *&TBB,
369                                  MachineBasicBlock *&FBB,
370                                  SmallVectorImpl<MachineOperand> &Cond,
371                                  bool AllowModify) const
372{
373  // If the block has no terminators, it just falls into the block after it.
374  MachineBasicBlock::iterator I = MBB.end();
375  if (I == MBB.begin())
376    return false;
377  --I;
378  while (I->isDebugValue()) {
379    if (I == MBB.begin())
380      return false;
381    --I;
382  }
383  if (!isUnpredicatedTerminator(I))
384    return false;
385
386  // Get the last instruction in the block.
387  MachineInstr *LastInst = I;
388
389  // If there is only one terminator instruction, process it.
390  unsigned LastOpc = LastInst->getOpcode();
391  if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
392    if (!LastInst->getDesc().isBranch())
393      return true;
394
395    // Unconditional branch
396    if (LastOpc == Mips::J) {
397      TBB = LastInst->getOperand(0).getMBB();
398      return false;
399    }
400
401    Mips::CondCode BranchCode = GetCondFromBranchOpc(LastInst->getOpcode());
402    if (BranchCode == Mips::COND_INVALID)
403      return true;  // Can't handle indirect branch.
404
405    // Conditional branch
406    // Block ends with fall-through condbranch.
407    if (LastOpc != Mips::COND_INVALID) {
408      int LastNumOp = LastInst->getNumOperands();
409
410      TBB = LastInst->getOperand(LastNumOp-1).getMBB();
411      Cond.push_back(MachineOperand::CreateImm(BranchCode));
412
413      for (int i=0; i<LastNumOp-1; i++) {
414        Cond.push_back(LastInst->getOperand(i));
415      }
416
417      return false;
418    }
419  }
420
421  // Get the instruction before it if it is a terminator.
422  MachineInstr *SecondLastInst = I;
423
424  // If there are three terminators, we don't know what sort of block this is.
425  if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(--I))
426    return true;
427
428  // If the block ends with Mips::J and a Mips::BNE/Mips::BEQ, handle it.
429  unsigned SecondLastOpc    = SecondLastInst->getOpcode();
430  Mips::CondCode BranchCode = GetCondFromBranchOpc(SecondLastOpc);
431
432  if (BranchCode != Mips::COND_INVALID && LastOpc == Mips::J) {
433    int SecondNumOp = SecondLastInst->getNumOperands();
434
435    TBB = SecondLastInst->getOperand(SecondNumOp-1).getMBB();
436    Cond.push_back(MachineOperand::CreateImm(BranchCode));
437
438    for (int i=0; i<SecondNumOp-1; i++) {
439      Cond.push_back(SecondLastInst->getOperand(i));
440    }
441
442    FBB = LastInst->getOperand(0).getMBB();
443    return false;
444  }
445
446  // If the block ends with two unconditional branches, handle it. The last
447  // one is not executed, so remove it.
448  if ((SecondLastOpc == Mips::J) && (LastOpc == Mips::J)) {
449    TBB = SecondLastInst->getOperand(0).getMBB();
450    I = LastInst;
451    if (AllowModify)
452      I->eraseFromParent();
453    return false;
454  }
455
456  // Otherwise, can't handle this.
457  return true;
458}
459
460unsigned MipsInstrInfo::
461InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
462             MachineBasicBlock *FBB,
463             const SmallVectorImpl<MachineOperand> &Cond,
464             DebugLoc DL) const {
465  // Shouldn't be a fall through.
466  assert(TBB && "InsertBranch must not be told to insert a fallthrough");
467  assert((Cond.size() == 3 || Cond.size() == 2 || Cond.size() == 0) &&
468         "Mips branch conditions can have two|three components!");
469
470  if (FBB == 0) { // One way branch.
471    if (Cond.empty()) {
472      // Unconditional branch?
473      BuildMI(&MBB, DL, get(Mips::J)).addMBB(TBB);
474    } else {
475      // Conditional branch.
476      unsigned Opc = GetCondBranchFromCond((Mips::CondCode)Cond[0].getImm());
477      const TargetInstrDesc &TID = get(Opc);
478
479      if (TID.getNumOperands() == 3)
480        BuildMI(&MBB, DL, TID).addReg(Cond[1].getReg())
481                          .addReg(Cond[2].getReg())
482                          .addMBB(TBB);
483      else
484        BuildMI(&MBB, DL, TID).addReg(Cond[1].getReg())
485                          .addMBB(TBB);
486
487    }
488    return 1;
489  }
490
491  // Two-way Conditional branch.
492  unsigned Opc = GetCondBranchFromCond((Mips::CondCode)Cond[0].getImm());
493  const TargetInstrDesc &TID = get(Opc);
494
495  if (TID.getNumOperands() == 3)
496    BuildMI(&MBB, DL, TID).addReg(Cond[1].getReg()).addReg(Cond[2].getReg())
497                      .addMBB(TBB);
498  else
499    BuildMI(&MBB, DL, TID).addReg(Cond[1].getReg()).addMBB(TBB);
500
501  BuildMI(&MBB, DL, get(Mips::J)).addMBB(FBB);
502  return 2;
503}
504
505unsigned MipsInstrInfo::
506RemoveBranch(MachineBasicBlock &MBB) const
507{
508  MachineBasicBlock::iterator I = MBB.end();
509  if (I == MBB.begin()) return 0;
510  --I;
511  while (I->isDebugValue()) {
512    if (I == MBB.begin())
513      return 0;
514    --I;
515  }
516  if (I->getOpcode() != Mips::J &&
517      GetCondFromBranchOpc(I->getOpcode()) == Mips::COND_INVALID)
518    return 0;
519
520  // Remove the branch.
521  I->eraseFromParent();
522
523  I = MBB.end();
524
525  if (I == MBB.begin()) return 1;
526  --I;
527  if (GetCondFromBranchOpc(I->getOpcode()) == Mips::COND_INVALID)
528    return 1;
529
530  // Remove the branch.
531  I->eraseFromParent();
532  return 2;
533}
534
535/// ReverseBranchCondition - Return the inverse opcode of the
536/// specified Branch instruction.
537bool MipsInstrInfo::
538ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const
539{
540  assert( (Cond.size() == 3 || Cond.size() == 2) &&
541          "Invalid Mips branch condition!");
542  Cond[0].setImm(GetOppositeBranchCondition((Mips::CondCode)Cond[0].getImm()));
543  return false;
544}
545
546/// getGlobalBaseReg - Return a virtual register initialized with the
547/// the global base register value. Output instructions required to
548/// initialize the register in the function entry block, if necessary.
549///
550unsigned MipsInstrInfo::getGlobalBaseReg(MachineFunction *MF) const {
551  MipsFunctionInfo *MipsFI = MF->getInfo<MipsFunctionInfo>();
552  unsigned GlobalBaseReg = MipsFI->getGlobalBaseReg();
553  if (GlobalBaseReg != 0)
554    return GlobalBaseReg;
555
556  // Insert the set of GlobalBaseReg into the first MBB of the function
557  MachineBasicBlock &FirstMBB = MF->front();
558  MachineBasicBlock::iterator MBBI = FirstMBB.begin();
559  MachineRegisterInfo &RegInfo = MF->getRegInfo();
560  const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
561
562  GlobalBaseReg = RegInfo.createVirtualRegister(Mips::CPURegsRegisterClass);
563  BuildMI(FirstMBB, MBBI, DebugLoc(), TII->get(TargetOpcode::COPY),
564          GlobalBaseReg).addReg(Mips::GP);
565  RegInfo.addLiveIn(Mips::GP);
566
567  MipsFI->setGlobalBaseReg(GlobalBaseReg);
568  return GlobalBaseReg;
569}
570