diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MipsMachineFunction.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsMachineFunction.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/llvm/lib/Target/Mips/MipsMachineFunction.cpp b/llvm/lib/Target/Mips/MipsMachineFunction.cpp index 1ee56d83009..81b4352670c 100644 --- a/llvm/lib/Target/Mips/MipsMachineFunction.cpp +++ b/llvm/lib/Target/Mips/MipsMachineFunction.cpp @@ -29,25 +29,27 @@ bool MipsFunctionInfo::globalBaseRegSet() const { return GlobalBaseReg; } +static const TargetRegisterClass &getGlobalBaseRegClass(MachineFunction &MF) { + auto &STI = static_cast<const MipsSubtarget &>(MF.getSubtarget()); + auto &TM = static_cast<const MipsTargetMachine &>(MF.getTarget()); + + if (STI.inMips16Mode()) + return Mips::CPU16RegsRegClass; + + if (STI.inMicroMipsMode()) + return Mips::GPRMM16RegClass; + + if (TM.getABI().IsN64()) + return Mips::GPR64RegClass; + + return Mips::GPR32RegClass; +} + unsigned MipsFunctionInfo::getGlobalBaseReg() { - // Return if it has already been initialized. - if (GlobalBaseReg) - return GlobalBaseReg; - - MipsSubtarget const &STI = - static_cast<const MipsSubtarget &>(MF.getSubtarget()); - - const TargetRegisterClass *RC = - STI.inMips16Mode() - ? &Mips::CPU16RegsRegClass - : STI.inMicroMipsMode() - ? &Mips::GPRMM16RegClass - : static_cast<const MipsTargetMachine &>(MF.getTarget()) - .getABI() - .IsN64() - ? &Mips::GPR64RegClass - : &Mips::GPR32RegClass; - return GlobalBaseReg = MF.getRegInfo().createVirtualRegister(RC); + if (!GlobalBaseReg) + GlobalBaseReg = + MF.getRegInfo().createVirtualRegister(&getGlobalBaseRegClass(MF)); + return GlobalBaseReg; } void MipsFunctionInfo::createEhDataRegsFI() { |