1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsMachineFunctionInfo.cpp - Private data used for Mips ----------===//
22d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//
32d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//                     The LLVM Compiler Infrastructure
42d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//
52d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// This file is distributed under the University of Illinois Open Source
62d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// License. See LICENSE.TXT for details.
72d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//
82d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//===----------------------------------------------------------------------===//
92d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
102d24e2a396a1d211baaeedf32148a3b657240170David Blaikie#include "MipsMachineFunction.h"
11648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "MipsInstrInfo.h"
12648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "MipsSubtarget.h"
13648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h"
14648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "llvm/Function.h"
15648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h"
16648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "llvm/CodeGen/MachineRegisterInfo.h"
17648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "llvm/Support/CommandLine.h"
182d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
192d24e2a396a1d211baaeedf32148a3b657240170David Blaikieusing namespace llvm;
202d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
21648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakastatic cl::opt<bool>
22648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira HatanakaFixGlobalBaseReg("mips-fix-global-base-reg", cl::Hidden, cl::init(true),
23648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka                 cl::desc("Always use $gp as the global base register."));
24648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka
25648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakabool MipsFunctionInfo::globalBaseRegSet() const {
26648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  return GlobalBaseReg;
27648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka}
28648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka
29648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakaunsigned MipsFunctionInfo::getGlobalBaseReg() {
30648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  // Return if it has already been initialized.
31648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  if (GlobalBaseReg)
32648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka    return GlobalBaseReg;
33648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka
34648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  const MipsSubtarget &ST = MF.getTarget().getSubtarget<MipsSubtarget>();
35648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka
363ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka  const TargetRegisterClass *RC;
373ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka  if (ST.inMips16Mode())
383ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka    RC=(const TargetRegisterClass*)&Mips::CPU16RegsRegClass;
393ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka  else
403ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka    RC = ST.isABI_N64() ?
413ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka      (const TargetRegisterClass*)&Mips::CPU64RegsRegClass :
423ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka      (const TargetRegisterClass*)&Mips::CPURegsRegClass;
43648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  return GlobalBaseReg = MF.getRegInfo().createVirtualRegister(RC);
44648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka}
45648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka
462d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MipsFunctionInfo::anchor() { }
47