//===-- CSKYRegisterInfo.h - CSKY Register Information Impl ---*- C++ -*---===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains the CSKY implementation of the TargetRegisterInfo class. // //===----------------------------------------------------------------------===// #include "CSKYRegisterInfo.h" #include "CSKY.h" #include "CSKYSubtarget.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/RegisterScavenging.h" #include "llvm/MC/MCContext.h" #define GET_REGINFO_TARGET_DESC #include "CSKYGenRegisterInfo.inc" using namespace llvm; CSKYRegisterInfo::CSKYRegisterInfo() : CSKYGenRegisterInfo(CSKY::R15, 0, 0, 0) {} const uint32_t * CSKYRegisterInfo::getCallPreservedMask(const MachineFunction &MF, CallingConv::ID Id) const { const CSKYSubtarget &STI = MF.getSubtarget(); return CSR_I32_RegMask; } Register CSKYRegisterInfo::getFrameRegister(const MachineFunction &MF) const { const TargetFrameLowering *TFI = getFrameLowering(MF); return TFI->hasFP(MF) ? CSKY::R8 : CSKY::R14; } BitVector CSKYRegisterInfo::getReservedRegs(const MachineFunction &MF) const { const CSKYFrameLowering *TFI = getFrameLowering(MF); const CSKYSubtarget &STI = MF.getSubtarget(); BitVector Reserved(getNumRegs()); // Reserve the base register if we need to allocate // variable-sized objects at runtime. if (TFI->hasBP(MF)) markSuperRegs(Reserved, CSKY::R7); // bp if (TFI->hasFP(MF)) markSuperRegs(Reserved, CSKY::R8); // fp if (!STI.hasE2()) { for (unsigned i = 0; i < 6; i++) markSuperRegs(Reserved, CSKY::R8 + i); // R8 - R13 } markSuperRegs(Reserved, CSKY::R14); // sp markSuperRegs(Reserved, CSKY::R15); // lr if (!STI.hasHighRegisters()) { for (unsigned i = 0; i < 10; i++) markSuperRegs(Reserved, CSKY::R16 + i); // R16 - R25 } markSuperRegs(Reserved, CSKY::R26); markSuperRegs(Reserved, CSKY::R27); markSuperRegs(Reserved, CSKY::R28); // gp markSuperRegs(Reserved, CSKY::R29); markSuperRegs(Reserved, CSKY::R30); markSuperRegs(Reserved, CSKY::R31); // tp assert(checkAllSuperRegsMarked(Reserved)); return Reserved; } const uint32_t *CSKYRegisterInfo::getNoPreservedMask() const { return CSR_NoRegs_RegMask; } const MCPhysReg * CSKYRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { const CSKYSubtarget &STI = MF->getSubtarget(); if (MF->getFunction().hasFnAttribute("interrupt")) { return CSR_GPR_ISR_SaveList; } return CSR_I32_SaveList; } void CSKYRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS) const { assert(SPAdj == 0 && "Unexpected non-zero SPAdj value"); }