xref: /aosp_15_r20/external/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- SystemZRegisterInfo.h - SystemZ register information ----*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZREGISTERINFO_H
11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZREGISTERINFO_H
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker #include "SystemZ.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_HEADER
17*9880d681SAndroid Build Coastguard Worker #include "SystemZGenRegisterInfo.inc"
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker namespace llvm {
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker namespace SystemZ {
22*9880d681SAndroid Build Coastguard Worker // Return the subreg to use for referring to the even and odd registers
23*9880d681SAndroid Build Coastguard Worker // in a GR128 pair.  Is32Bit says whether we want a GR32 or GR64.
even128(bool Is32bit)24*9880d681SAndroid Build Coastguard Worker inline unsigned even128(bool Is32bit) {
25*9880d681SAndroid Build Coastguard Worker   return Is32bit ? subreg_hl32 : subreg_h64;
26*9880d681SAndroid Build Coastguard Worker }
odd128(bool Is32bit)27*9880d681SAndroid Build Coastguard Worker inline unsigned odd128(bool Is32bit) {
28*9880d681SAndroid Build Coastguard Worker   return Is32bit ? subreg_l32 : subreg_l64;
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker } // end namespace SystemZ
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker struct SystemZRegisterInfo : public SystemZGenRegisterInfo {
33*9880d681SAndroid Build Coastguard Worker public:
34*9880d681SAndroid Build Coastguard Worker   SystemZRegisterInfo();
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker   /// getPointerRegClass - Return the register class to use to hold pointers.
37*9880d681SAndroid Build Coastguard Worker   /// This is currently only used by LOAD_STACK_GUARD, which requires a non-%r0
38*9880d681SAndroid Build Coastguard Worker   /// register, hence ADDR64.
39*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *
40*9880d681SAndroid Build Coastguard Worker   getPointerRegClass(const MachineFunction &MF,
41*9880d681SAndroid Build Coastguard Worker                      unsigned Kind=0) const override {
42*9880d681SAndroid Build Coastguard Worker     return &SystemZ::ADDR64BitRegClass;
43*9880d681SAndroid Build Coastguard Worker   }
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker   // Override TargetRegisterInfo.h.
requiresRegisterScavengingSystemZRegisterInfo46*9880d681SAndroid Build Coastguard Worker   bool requiresRegisterScavenging(const MachineFunction &MF) const override {
47*9880d681SAndroid Build Coastguard Worker     return true;
48*9880d681SAndroid Build Coastguard Worker   }
requiresFrameIndexScavengingSystemZRegisterInfo49*9880d681SAndroid Build Coastguard Worker   bool requiresFrameIndexScavenging(const MachineFunction &MF) const override {
50*9880d681SAndroid Build Coastguard Worker     return true;
51*9880d681SAndroid Build Coastguard Worker   }
trackLivenessAfterRegAllocSystemZRegisterInfo52*9880d681SAndroid Build Coastguard Worker   bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override {
53*9880d681SAndroid Build Coastguard Worker     return true;
54*9880d681SAndroid Build Coastguard Worker   }
55*9880d681SAndroid Build Coastguard Worker   const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
56*9880d681SAndroid Build Coastguard Worker   const uint32_t *getCallPreservedMask(const MachineFunction &MF,
57*9880d681SAndroid Build Coastguard Worker                                        CallingConv::ID CC) const override;
58*9880d681SAndroid Build Coastguard Worker   BitVector getReservedRegs(const MachineFunction &MF) const override;
59*9880d681SAndroid Build Coastguard Worker   void eliminateFrameIndex(MachineBasicBlock::iterator MI,
60*9880d681SAndroid Build Coastguard Worker                            int SPAdj, unsigned FIOperandNum,
61*9880d681SAndroid Build Coastguard Worker                            RegScavenger *RS) const override;
62*9880d681SAndroid Build Coastguard Worker   unsigned getFrameRegister(const MachineFunction &MF) const override;
63*9880d681SAndroid Build Coastguard Worker };
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker #endif
68