xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYRegisterInfo.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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 }