Files
llvm-6502/lib/Target/Hexagon/HexagonRegisterInfo.h
Eli Bendersky 700ed80d3d Move the eliminateCallFramePseudoInstr method from TargetRegisterInfo
to TargetFrameLowering, where it belongs. Incidentally, this allows us
to delete some duplicated (and slightly different!) code in TRI.

There are potentially other layering problems that can be cleaned up
as a result, or in a similar manner.

The refactoring was OK'd by Anton Korobeynikov on llvmdev.

Note: this touches the target interfaces, so out-of-tree targets may
be affected.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175788 91177308-0d34-0410-b5e6-96231b3b80d8
2013-02-21 20:05:00 +00:00

97 lines
3.3 KiB
C++

//==- HexagonRegisterInfo.h - Hexagon Register Information Impl --*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the Hexagon implementation of the TargetRegisterInfo
// class.
//
//===----------------------------------------------------------------------===//
#ifndef HexagonREGISTERINFO_H
#define HexagonREGISTERINFO_H
#include "llvm/MC/MachineLocation.h"
#include "llvm/Target/TargetRegisterInfo.h"
#define GET_REGINFO_HEADER
#include "HexagonGenRegisterInfo.inc"
//
// We try not to hard code the reserved registers in our code,
// so the following two macros were defined. However, there
// are still a few places that R11 and R10 are hard wired.
// See below. If, in the future, we decided to change the reserved
// register. Don't forget changing the following places.
//
// 1. the "Defs" set of STriw_pred in HexagonInstrInfo.td
// 2. the "Defs" set of LDri_pred in HexagonInstrInfo.td
// 3. the definition of "IntRegs" in HexagonRegisterInfo.td
// 4. the definition of "DoubleRegs" in HexagonRegisterInfo.td
//
#define HEXAGON_RESERVED_REG_1 Hexagon::R10
#define HEXAGON_RESERVED_REG_2 Hexagon::R11
namespace llvm {
class HexagonSubtarget;
class HexagonInstrInfo;
class Type;
struct HexagonRegisterInfo : public HexagonGenRegisterInfo {
HexagonSubtarget &Subtarget;
const HexagonInstrInfo &TII;
HexagonRegisterInfo(HexagonSubtarget &st, const HexagonInstrInfo &tii);
/// Code Generation virtual methods...
const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
const TargetRegisterClass* const* getCalleeSavedRegClasses(
const MachineFunction *MF = 0) const;
BitVector getReservedRegs(const MachineFunction &MF) const;
void eliminateFrameIndex(MachineBasicBlock::iterator II,
int SPAdj, unsigned FIOperandNum,
RegScavenger *RS = NULL) const;
/// determineFrameLayout - Determine the size of the frame and maximum call
/// frame size.
void determineFrameLayout(MachineFunction &MF) const;
/// requiresRegisterScavenging - returns true since we may need scavenging for
/// a temporary register when generating hardware loop instructions.
bool requiresRegisterScavenging(const MachineFunction &MF) const {
return true;
}
bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
return true;
}
// Debug information queries.
unsigned getRARegister() const;
unsigned getFrameRegister(const MachineFunction &MF) const;
unsigned getFrameRegister() const;
void getInitialFrameState(std::vector<MachineMove> &Moves) const;
unsigned getStackRegister() const;
// Exception handling queries.
unsigned getEHExceptionRegister() const;
unsigned getEHHandlerRegister() const;
const RegClassWeight &getRegClassWeight(const TargetRegisterClass *RC) const;
unsigned getNumRegPressureSets() const;
const char *getRegPressureSetName(unsigned Idx) const;
unsigned getRegPressureSetLimit(unsigned Idx) const;
const int* getRegClassPressureSets(const TargetRegisterClass *RC) const;
};
} // end namespace llvm
#endif