LLVM  16.0.0git
SystemZRegisterInfo.h
Go to the documentation of this file.
1 //===-- SystemZRegisterInfo.h - SystemZ register information ----*- 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 #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZREGISTERINFO_H
10 #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZREGISTERINFO_H
11 
12 #include "SystemZ.h"
15 
16 #define GET_REGINFO_HEADER
17 #include "SystemZGenRegisterInfo.inc"
18 
19 namespace llvm {
20 
21 class LiveIntervals;
22 
23 namespace SystemZ {
24 // Return the subreg to use for referring to the even and odd registers
25 // in a GR128 pair. Is32Bit says whether we want a GR32 or GR64.
26 inline unsigned even128(bool Is32bit) {
27  return Is32bit ? subreg_hl32 : subreg_h64;
28 }
29 inline unsigned odd128(bool Is32bit) {
30  return Is32bit ? subreg_l32 : subreg_l64;
31 }
32 
33 // Reg should be a 32-bit GPR. Return true if it is a high register rather
34 // than a low register.
35 inline bool isHighReg(unsigned int Reg) {
36  if (SystemZ::GRH32BitRegClass.contains(Reg))
37  return true;
38  assert(SystemZ::GR32BitRegClass.contains(Reg) && "Invalid GRX32");
39  return false;
40 }
41 } // end namespace SystemZ
42 
43 /// A SystemZ-specific class detailing special use registers
44 /// particular for calling conventions.
45 /// It is abstract, all calling conventions must override and
46 /// define the pure virtual member function defined in this class.
48 
49 public:
50  /// \returns the register that keeps the return function address.
51  virtual int getReturnFunctionAddressRegister() = 0;
52 
53  /// \returns the register that keeps the
54  /// stack pointer address.
55  virtual int getStackPointerRegister() = 0;
56 
57  /// \returns the register that keeps the
58  /// frame pointer address.
59  virtual int getFramePointerRegister() = 0;
60 
61  /// \returns an array of all the callee saved registers.
62  virtual const MCPhysReg *
63  getCalleeSavedRegs(const MachineFunction *MF) const = 0;
64 
65  /// \returns the mask of all the call preserved registers.
66  virtual const uint32_t *getCallPreservedMask(const MachineFunction &MF,
67  CallingConv::ID CC) const = 0;
68 
69  /// \returns the offset to the locals area.
70  virtual int getCallFrameSize() = 0;
71 
72  /// \returns the stack pointer bias.
73  virtual int getStackPointerBias() = 0;
74 
75  /// Destroys the object. Bogus destructor allowing derived classes
76  /// to override it.
77  virtual ~SystemZCallingConventionRegisters() = default;
78 };
79 
80 /// XPLINK64 calling convention specific use registers
81 /// Particular to z/OS when in 64 bit mode
83 public:
84  int getReturnFunctionAddressRegister() final { return SystemZ::R7D; };
85 
86  int getStackPointerRegister() final { return SystemZ::R4D; };
87 
88  int getFramePointerRegister() final { return SystemZ::R8D; };
89 
90  int getAddressOfCalleeRegister() { return SystemZ::R6D; };
91 
92  const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const final;
93 
95  CallingConv::ID CC) const final;
96 
97  int getCallFrameSize() final { return 128; }
98 
99  int getStackPointerBias() final { return 2048; }
100 
101  /// Destroys the object. Bogus destructor overriding base class destructor
102  ~SystemZXPLINK64Registers() = default;
103 };
104 
105 /// ELF calling convention specific use registers
106 /// Particular when on zLinux in 64 bit mode
108 public:
109  int getReturnFunctionAddressRegister() final { return SystemZ::R14D; };
110 
111  int getStackPointerRegister() final { return SystemZ::R15D; };
112 
113  int getFramePointerRegister() final { return SystemZ::R11D; };
114 
115  const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const final;
116 
118  CallingConv::ID CC) const final;
119 
121 
122  int getStackPointerBias() final { return 0; }
123 
124  /// Destroys the object. Bogus destructor overriding base class destructor
125  ~SystemZELFRegisters() = default;
126 };
127 
129 public:
130  SystemZRegisterInfo(unsigned int RA);
131 
132  /// getPointerRegClass - Return the register class to use to hold pointers.
133  /// This is currently only used by LOAD_STACK_GUARD, which requires a non-%r0
134  /// register, hence ADDR64.
135  const TargetRegisterClass *
137  unsigned Kind=0) const override {
138  return &SystemZ::ADDR64BitRegClass;
139  }
140 
141  /// getCrossCopyRegClass - Returns a legal register class to copy a register
142  /// in the specified class to or from. Returns NULL if it is possible to copy
143  /// between a two registers of the specified class.
144  const TargetRegisterClass *
145  getCrossCopyRegClass(const TargetRegisterClass *RC) const override;
146 
149  const MachineFunction &MF, const VirtRegMap *VRM,
150  const LiveRegMatrix *Matrix) const override;
151 
152  // Override TargetRegisterInfo.h.
153  bool requiresRegisterScavenging(const MachineFunction &MF) const override {
154  return true;
155  }
156  bool requiresFrameIndexScavenging(const MachineFunction &MF) const override {
157  return true;
158  }
159  const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
161  CallingConv::ID CC) const override;
162  BitVector getReservedRegs(const MachineFunction &MF) const override;
164  int SPAdj, unsigned FIOperandNum,
165  RegScavenger *RS) const override;
166 
167  /// SrcRC and DstRC will be morphed into NewRC if this returns true.
169  const TargetRegisterClass *SrcRC,
170  unsigned SubReg,
171  const TargetRegisterClass *DstRC,
172  unsigned DstSubReg,
173  const TargetRegisterClass *NewRC,
174  LiveIntervals &LIS) const override;
175 
176  Register getFrameRegister(const MachineFunction &MF) const override;
177 };
178 
179 } // end namespace llvm
180 
181 #endif
MI
IRTranslator LLVM IR MI
Definition: IRTranslator.cpp:108
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
TargetFrameLowering.h
llvm::SystemZCallingConventionRegisters::~SystemZCallingConventionRegisters
virtual ~SystemZCallingConventionRegisters()=default
Destroys the object.
llvm::SystemZELFRegisters::getFramePointerRegister
int getFramePointerRegister() final
Definition: SystemZRegisterInfo.h:113
llvm::SystemZCallingConventionRegisters::getReturnFunctionAddressRegister
virtual int getReturnFunctionAddressRegister()=0
llvm::SystemZRegisterInfo::SystemZRegisterInfo
SystemZRegisterInfo(unsigned int RA)
Definition: SystemZRegisterInfo.cpp:237
contains
return AArch64::GPR64RegClass contains(Reg)
llvm::VirtRegMap
Definition: VirtRegMap.h:33
llvm::X86Disassembler::Reg
Reg
All possible values of the reg field in the ModR/M byte.
Definition: X86DisassemblerDecoder.h:462
llvm::SystemZRegisterInfo::eliminateFrameIndex
bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS) const override
Definition: SystemZRegisterInfo.cpp:286
llvm::SystemZELFRegisters::getStackPointerBias
int getStackPointerBias() final
Definition: SystemZRegisterInfo.h:122
llvm::SystemZRegisterInfo::getFrameRegister
Register getFrameRegister(const MachineFunction &MF) const override
Definition: SystemZRegisterInfo.cpp:452
llvm::SystemZELFRegisters::getCallFrameSize
int getCallFrameSize() final
Definition: SystemZRegisterInfo.h:120
llvm::SystemZXPLINK64Registers::getFramePointerRegister
int getFramePointerRegister() final
Definition: SystemZRegisterInfo.h:88
llvm::SystemZRegisterInfo::getReservedRegs
BitVector getReservedRegs(const MachineFunction &MF) const override
Definition: SystemZRegisterInfo.cpp:259
llvm::SystemZXPLINK64Registers
XPLINK64 calling convention specific use registers Particular to z/OS when in 64 bit mode.
Definition: SystemZRegisterInfo.h:82
llvm::SystemZRegisterInfo::shouldCoalesce
bool shouldCoalesce(MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg, const TargetRegisterClass *DstRC, unsigned DstSubReg, const TargetRegisterClass *NewRC, LiveIntervals &LIS) const override
SrcRC and DstRC will be morphed into NewRC if this returns true.
Definition: SystemZRegisterInfo.cpp:380
llvm::SystemZXPLINK64Registers::getStackPointerRegister
int getStackPointerRegister() final
Definition: SystemZRegisterInfo.h:86
llvm::TargetRegisterClass
Definition: TargetRegisterInfo.h:46
llvm::SystemZCallingConventionRegisters::getCalleeSavedRegs
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const =0
llvm::SystemZELFRegisters::getStackPointerRegister
int getStackPointerRegister() final
Definition: SystemZRegisterInfo.h:111
llvm::SystemZXPLINK64Registers::~SystemZXPLINK64Registers
~SystemZXPLINK64Registers()=default
Destroys the object. Bogus destructor overriding base class destructor.
llvm::SystemZ::isHighReg
bool isHighReg(unsigned int Reg)
Definition: SystemZRegisterInfo.h:35
llvm::BitVector
Definition: BitVector.h:75
llvm::SystemZXPLINK64Registers::getStackPointerBias
int getStackPointerBias() final
Definition: SystemZRegisterInfo.h:99
SystemZ.h
llvm::SystemZRegisterInfo::getRegAllocationHints
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
Definition: SystemZRegisterInfo.cpp:74
llvm::CallingConv::ID
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
llvm::SystemZ::odd128
unsigned odd128(bool Is32bit)
Definition: SystemZRegisterInfo.h:29
llvm::SystemZRegisterInfo::requiresFrameIndexScavenging
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
Definition: SystemZRegisterInfo.h:156
llvm::SystemZELFRegisters::getReturnFunctionAddressRegister
int getReturnFunctionAddressRegister() final
Definition: SystemZRegisterInfo.h:109
llvm::MachineInstr
Representation of each machine instruction.
Definition: MachineInstr.h:66
llvm::SystemZRegisterInfo::getCrossCopyRegClass
const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const override
getCrossCopyRegClass - Returns a legal register class to copy a register in the specified class to or...
Definition: SystemZRegisterInfo.cpp:462
llvm::RegScavenger
Definition: RegisterScavenging.h:34
llvm::SystemZRegisterInfo::getCallPreservedMask
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
Definition: SystemZRegisterInfo.cpp:250
llvm::SystemZCallingConventionRegisters::getStackPointerRegister
virtual int getStackPointerRegister()=0
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::SystemZCallingConventionRegisters::getStackPointerBias
virtual int getStackPointerBias()=0
llvm::SystemZXPLINK64Registers::getCallFrameSize
int getCallFrameSize() final
Definition: SystemZRegisterInfo.h:97
RA
SI optimize exec mask operations pre RA
Definition: SIOptimizeExecMaskingPreRA.cpp:71
llvm::SystemZCallingConventionRegisters::getCallPreservedMask
virtual const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const =0
llvm::MachineFunction
Definition: MachineFunction.h:257
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: APInt.h:32
uint32_t
CC
auto CC
Definition: RISCVRedundantCopyElimination.cpp:79
llvm::SystemZRegisterInfo::getCalleeSavedRegs
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Definition: SystemZRegisterInfo.cpp:241
llvm::Register
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
llvm::SystemZCallingConventionRegisters
A SystemZ-specific class detailing special use registers particular for calling conventions.
Definition: SystemZRegisterInfo.h:47
llvm::SystemZXPLINK64Registers::getCallPreservedMask
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const final
Definition: SystemZRegisterInfo.cpp:214
llvm::SystemZ::even128
unsigned even128(bool Is32bit)
Definition: SystemZRegisterInfo.h:26
uint16_t
llvm::SystemZCallingConventionRegisters::getCallFrameSize
virtual int getCallFrameSize()=0
llvm::SystemZXPLINK64Registers::getCalleeSavedRegs
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const final
Definition: SystemZRegisterInfo.cpp:192
llvm::SystemZELFRegisters::~SystemZELFRegisters
~SystemZELFRegisters()=default
Destroys the object. Bogus destructor overriding base class destructor.
SystemZGenRegisterInfo
llvm::LiveIntervals
Definition: LiveIntervals.h:53
llvm::SystemZXPLINK64Registers::getAddressOfCalleeRegister
int getAddressOfCalleeRegister()
Definition: SystemZRegisterInfo.h:90
llvm::SystemZRegisterInfo
Definition: SystemZRegisterInfo.h:128
llvm::SystemZRegisterInfo::requiresRegisterScavenging
bool requiresRegisterScavenging(const MachineFunction &MF) const override
Definition: SystemZRegisterInfo.h:153
llvm::SystemZCallingConventionRegisters::getFramePointerRegister
virtual int getFramePointerRegister()=0
llvm::SystemZELFRegisters::getCalleeSavedRegs
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const final
Definition: SystemZRegisterInfo.cpp:199
llvm::SmallVectorImpl< MCPhysReg >
llvm::SystemZXPLINK64Registers::getReturnFunctionAddressRegister
int getReturnFunctionAddressRegister() final
Definition: SystemZRegisterInfo.h:84
llvm::SystemZELFRegisters
ELF calling convention specific use registers Particular when on zLinux in 64 bit mode.
Definition: SystemZRegisterInfo.h:107
llvm::SystemZELFRegisters::getCallPreservedMask
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const final
Definition: SystemZRegisterInfo.cpp:222
llvm::MachineInstrBundleIterator< MachineInstr >
llvm::SystemZRegisterInfo::getPointerRegClass
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const override
getPointerRegClass - Return the register class to use to hold pointers.
Definition: SystemZRegisterInfo.h:136
TargetRegisterInfo.h
SubReg
unsigned SubReg
Definition: AArch64AdvSIMDScalarPass.cpp:104
llvm::SystemZMC::ELFCallFrameSize
const int64_t ELFCallFrameSize
Definition: SystemZMCTargetDesc.h:31
llvm::LiveRegMatrix
Definition: LiveRegMatrix.h:40