11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZRegisterInfo.h - SystemZ register information ----*- C++ -*-===//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#ifndef SystemZREGISTERINFO_H
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define SystemZREGISTERINFO_H
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZ.h"
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/TargetRegisterInfo.h"
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define GET_REGINFO_HEADER
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZGenRegisterInfo.inc"
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace SystemZ {
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Return the subreg to use for referring to the even and odd registers
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// in a GR128 pair.  Is32Bit says whether we want a GR32 or GR64.
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline unsigned even128(bool Is32bit) {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return Is32bit ? subreg_hl32 : subreg_h64;
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline unsigned odd128(bool Is32bit) {
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return Is32bit ? subreg_l32 : subreg_l64;
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace SystemZ
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstruct SystemZRegisterInfo : public SystemZGenRegisterInfo {
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic:
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SystemZRegisterInfo();
351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Override TargetRegisterInfo.h.
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool requiresRegisterScavenging(const MachineFunction &MF) const override {
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return true;
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool requiresFrameIndexScavenging(const MachineFunction &MF) const override {
411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return true;
421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override {
44c2b840cb7c58e59c68aaa589841c41fb272df66dRichard Sandiford    return true;
45c2b840cb7c58e59c68aaa589841c41fb272df66dRichard Sandiford  }
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF = nullptr) const
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    override;
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const uint32_t *getCallPreservedMask(CallingConv::ID CC) const override;
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BitVector getReservedRegs(const MachineFunction &MF) const override;
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void eliminateFrameIndex(MachineBasicBlock::iterator MI,
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           int SPAdj, unsigned FIOperandNum,
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           RegScavenger *RS) const override;
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getFrameRegister(const MachineFunction &MF) const override;
541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand};
551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm
571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif
59