1251607Sdim//===-- SystemZRegisterInfo.h - SystemZ register information ----*- C++ -*-===//
2251607Sdim//
3251607Sdim//                     The LLVM Compiler Infrastructure
4251607Sdim//
5251607Sdim// This file is distributed under the University of Illinois Open Source
6251607Sdim// License. See LICENSE.TXT for details.
7251607Sdim//
8251607Sdim//===----------------------------------------------------------------------===//
9251607Sdim
10251607Sdim#ifndef SystemZREGISTERINFO_H
11251607Sdim#define SystemZREGISTERINFO_H
12251607Sdim
13251607Sdim#include "SystemZ.h"
14251607Sdim#include "llvm/Target/TargetRegisterInfo.h"
15251607Sdim
16251607Sdim#define GET_REGINFO_HEADER
17251607Sdim#include "SystemZGenRegisterInfo.inc"
18251607Sdim
19251607Sdimnamespace llvm {
20251607Sdim
21251607Sdimnamespace SystemZ {
22251607Sdim  // Return the subreg to use for referring to the even and odd registers
23251607Sdim  // in a GR128 pair.  Is32Bit says whether we want a GR32 or GR64.
24251607Sdim  inline unsigned even128(bool Is32bit) {
25263509Sdim    return Is32bit ? subreg_hl32 : subreg_h64;
26251607Sdim  }
27251607Sdim  inline unsigned odd128(bool Is32bit) {
28263509Sdim    return Is32bit ? subreg_l32 : subreg_l64;
29251607Sdim  }
30251607Sdim}
31251607Sdim
32251607Sdimclass SystemZSubtarget;
33251607Sdimclass SystemZInstrInfo;
34251607Sdim
35251607Sdimstruct SystemZRegisterInfo : public SystemZGenRegisterInfo {
36251607Sdimprivate:
37251607Sdim  SystemZTargetMachine &TM;
38251607Sdim
39251607Sdimpublic:
40263509Sdim  SystemZRegisterInfo(SystemZTargetMachine &tm);
41251607Sdim
42251607Sdim  // Override TargetRegisterInfo.h.
43251607Sdim  virtual bool requiresRegisterScavenging(const MachineFunction &MF) const
44251607Sdim    LLVM_OVERRIDE {
45251607Sdim    return true;
46251607Sdim  }
47251607Sdim  virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const
48251607Sdim    LLVM_OVERRIDE {
49251607Sdim    return true;
50251607Sdim  }
51263509Sdim  virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
52263509Sdim    LLVM_OVERRIDE {
53263509Sdim    return true;
54263509Sdim  }
55251607Sdim  virtual const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0)
56251607Sdim    const LLVM_OVERRIDE;
57251607Sdim  virtual BitVector getReservedRegs(const MachineFunction &MF)
58251607Sdim    const LLVM_OVERRIDE;
59251607Sdim  virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
60251607Sdim                                   int SPAdj, unsigned FIOperandNum,
61251607Sdim                                   RegScavenger *RS) const LLVM_OVERRIDE;
62251607Sdim  virtual unsigned getFrameRegister(const MachineFunction &MF) const
63251607Sdim    LLVM_OVERRIDE;
64251607Sdim};
65251607Sdim
66251607Sdim} // end namespace llvm
67251607Sdim
68251607Sdim#endif
69