MipsMachineFunction.cpp revision d04a8d4b33ff316ca4cf961e06c9e312eff8e64f
1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//===-- MipsMachineFunctionInfo.cpp - Private data used for Mips ----------===//
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// License. See LICENSE.TXT for details.
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//===----------------------------------------------------------------------===//
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "MipsMachineFunction.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "MCTargetDesc/MipsBaseInfo.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "MipsInstrInfo.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "MipsSubtarget.h"
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/CodeGen/MachineInstrBuilder.h"
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/CodeGen/MachineRegisterInfo.h"
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/Function.h"
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "llvm/Support/CommandLine.h"
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using namespace llvm;
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static cl::opt<bool>
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FixGlobalBaseReg("mips-fix-global-base-reg", cl::Hidden, cl::init(true),
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 cl::desc("Always use $gp as the global base register."));
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool MipsFunctionInfo::globalBaseRegSet() const {
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return GlobalBaseReg;
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)unsigned MipsFunctionInfo::getGlobalBaseReg() {
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Return if it has already been initialized.
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (GlobalBaseReg)
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return GlobalBaseReg;
33
34  const MipsSubtarget &ST = MF.getTarget().getSubtarget<MipsSubtarget>();
35
36  const TargetRegisterClass *RC;
37  if (ST.inMips16Mode())
38    RC=(const TargetRegisterClass*)&Mips::CPU16RegsRegClass;
39  else
40    RC = ST.isABI_N64() ?
41      (const TargetRegisterClass*)&Mips::CPU64RegsRegClass :
42      (const TargetRegisterClass*)&Mips::CPURegsRegClass;
43  return GlobalBaseReg = MF.getRegInfo().createVirtualRegister(RC);
44}
45
46bool MipsFunctionInfo::mips16SPAliasRegSet() const {
47  return Mips16SPAliasReg;
48}
49unsigned MipsFunctionInfo::getMips16SPAliasReg() {
50  // Return if it has already been initialized.
51  if (Mips16SPAliasReg)
52    return Mips16SPAliasReg;
53
54  const TargetRegisterClass *RC;
55  RC=(const TargetRegisterClass*)&Mips::CPU16RegsRegClass;
56  return Mips16SPAliasReg = MF.getRegInfo().createVirtualRegister(RC);
57}
58
59void MipsFunctionInfo::anchor() { }
60