SystemZRegisterInfo.h revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//===-- SystemZRegisterInfo.h - SystemZ register information ----*- C++ -*-===//
2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//
3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//                     The LLVM Compiler Infrastructure
4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//
5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson// This file is distributed under the University of Illinois Open Source
6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson// License. See LICENSE.TXT for details.
7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//
8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson//===----------------------------------------------------------------------===//
9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#ifndef SystemZREGISTERINFO_H
11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#define SystemZREGISTERINFO_H
12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "SystemZ.h"
14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "llvm/Target/TargetRegisterInfo.h"
15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#define GET_REGINFO_HEADER
17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#include "SystemZGenRegisterInfo.inc"
18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonnamespace llvm {
20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonnamespace SystemZ {
22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson// Return the subreg to use for referring to the even and odd registers
23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson// in a GR128 pair.  Is32Bit says whether we want a GR32 or GR64.
24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsoninline unsigned even128(bool Is32bit) {
25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  return Is32bit ? subreg_hl32 : subreg_h64;
26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson}
27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsoninline unsigned odd128(bool Is32bit) {
28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  return Is32bit ? subreg_l32 : subreg_l64;
29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson}
30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} // end namespace SystemZ
31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonstruct SystemZRegisterInfo : public SystemZGenRegisterInfo {
33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic:
34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  SystemZRegisterInfo();
35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  // Override TargetRegisterInfo.h.
37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  bool requiresRegisterScavenging(const MachineFunction &MF) const override {
38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    return true;
39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  }
40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  bool requiresFrameIndexScavenging(const MachineFunction &MF) const override {
41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    return true;
42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  }
43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override {
44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    return true;
45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  }
46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF = nullptr) const
47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    override;
48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  const uint32_t *getCallPreservedMask(CallingConv::ID CC) const override;
49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  BitVector getReservedRegs(const MachineFunction &MF) const override;
50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  void eliminateFrameIndex(MachineBasicBlock::iterator MI,
51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                           int SPAdj, unsigned FIOperandNum,
52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                           RegScavenger *RS) const override;
53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson  unsigned getFrameRegister(const MachineFunction &MF) const override;
54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson};
55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} // end namespace llvm
57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson#endif
59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson