1 //===-- CSKYRegisterInfo.h - CSKY Register Information Impl ---*- C++ -*---===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains the CSKY implementation of the TargetRegisterInfo class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "CSKYRegisterInfo.h" 14 #include "CSKY.h" 15 #include "CSKYSubtarget.h" 16 #include "llvm/CodeGen/MachineFunction.h" 17 #include "llvm/CodeGen/RegisterScavenging.h" 18 #include "llvm/MC/MCContext.h" 19 20 #define GET_REGINFO_TARGET_DESC 21 #include "CSKYGenRegisterInfo.inc" 22 23 using namespace llvm; 24 25 CSKYRegisterInfo::CSKYRegisterInfo() 26 : CSKYGenRegisterInfo(CSKY::R15, 0, 0, 0) {} 27 28 const uint32_t * 29 CSKYRegisterInfo::getCallPreservedMask(const MachineFunction &MF, 30 CallingConv::ID Id) const { 31 const CSKYSubtarget &STI = MF.getSubtarget<CSKYSubtarget>(); 32 return CSR_I32_RegMask; 33 } 34 35 Register CSKYRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 36 const TargetFrameLowering *TFI = getFrameLowering(MF); 37 return TFI->hasFP(MF) ? CSKY::R8 : CSKY::R14; 38 } 39 40 BitVector CSKYRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 41 const CSKYFrameLowering *TFI = getFrameLowering(MF); 42 const CSKYSubtarget &STI = MF.getSubtarget<CSKYSubtarget>(); 43 BitVector Reserved(getNumRegs()); 44 45 // Reserve the base register if we need to allocate 46 // variable-sized objects at runtime. 47 if (TFI->hasBP(MF)) 48 markSuperRegs(Reserved, CSKY::R7); // bp 49 50 if (TFI->hasFP(MF)) 51 markSuperRegs(Reserved, CSKY::R8); // fp 52 53 if (!STI.hasE2()) { 54 for (unsigned i = 0; i < 6; i++) 55 markSuperRegs(Reserved, CSKY::R8 + i); // R8 - R13 56 } 57 58 markSuperRegs(Reserved, CSKY::R14); // sp 59 markSuperRegs(Reserved, CSKY::R15); // lr 60 61 if (!STI.hasHighRegisters()) { 62 for (unsigned i = 0; i < 10; i++) 63 markSuperRegs(Reserved, CSKY::R16 + i); // R16 - R25 64 } 65 66 markSuperRegs(Reserved, CSKY::R26); 67 markSuperRegs(Reserved, CSKY::R27); 68 markSuperRegs(Reserved, CSKY::R28); // gp 69 markSuperRegs(Reserved, CSKY::R29); 70 markSuperRegs(Reserved, CSKY::R30); 71 markSuperRegs(Reserved, CSKY::R31); // tp 72 73 assert(checkAllSuperRegsMarked(Reserved)); 74 return Reserved; 75 } 76 77 const uint32_t *CSKYRegisterInfo::getNoPreservedMask() const { 78 return CSR_NoRegs_RegMask; 79 } 80 81 const MCPhysReg * 82 CSKYRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 83 const CSKYSubtarget &STI = MF->getSubtarget<CSKYSubtarget>(); 84 if (MF->getFunction().hasFnAttribute("interrupt")) { 85 return CSR_GPR_ISR_SaveList; 86 } 87 88 return CSR_I32_SaveList; 89 } 90 91 void CSKYRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 92 int SPAdj, unsigned FIOperandNum, 93 RegScavenger *RS) const { 94 assert(SPAdj == 0 && "Unexpected non-zero SPAdj value"); 95 }