131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- XCoreRegisterInfo.h - XCore Register Information Impl ---*- C++ -*-===//
2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//                     The LLVM Compiler Infrastructure
4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file is distributed under the University of Illinois Open Source
6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// License. See LICENSE.TXT for details.
7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file contains the XCore implementation of the MRegisterInfo class.
11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#ifndef XCOREREGISTERINFO_H
15b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#define XCOREREGISTERINFO_H
16b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
17b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/Target/TargetRegisterInfo.h"
1873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
1973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_HEADER
2073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#include "XCoreGenRegisterInfo.inc"
21b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
22b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornenamespace llvm {
23b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
24b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborneclass TargetInstrInfo;
25b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
26b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestruct XCoreRegisterInfo : public XCoreGenRegisterInfo {
27b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborneprivate:
28b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  const TargetInstrInfo &TII;
29b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
30b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  void loadConstant(MachineBasicBlock &MBB,
31b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne                  MachineBasicBlock::iterator I,
32bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen                  unsigned DstReg, int64_t Value, DebugLoc dl) const;
33b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
34b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  void storeToStack(MachineBasicBlock &MBB,
35b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne                  MachineBasicBlock::iterator I,
36bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen                  unsigned SrcReg, int Offset, DebugLoc dl) const;
37b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
38b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  void loadFromStack(MachineBasicBlock &MBB,
39b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne                  MachineBasicBlock::iterator I,
40bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen                  unsigned DstReg, int Offset, DebugLoc dl) const;
41b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
42b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornepublic:
43b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  XCoreRegisterInfo(const TargetInstrInfo &tii);
44b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
45b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  /// Code Generation virtual methods...
46b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
47015f228861ef9b337366f92f637d4e8d624bb006Craig Topper  const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
48b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
49b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  BitVector getReservedRegs(const MachineFunction &MF) const;
50b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
51b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  bool requiresRegisterScavenging(const MachineFunction &MF) const;
528ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne
536a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd  bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const;
546a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd
558ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne  bool useFPForScavengingIndex(const MachineFunction &MF) const;
56b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
57fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbach  void eliminateFrameIndex(MachineBasicBlock::iterator II,
58108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                           int SPAdj, unsigned FIOperandNum,
59108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                           RegScavenger *RS = NULL) const;
60b9c2fd964ee7dd7823ac71db8443055e4d0f1c15David Greene
61b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  // Debug information queries.
62b9c2fd964ee7dd7823ac71db8443055e4d0f1c15David Greene  unsigned getFrameRegister(const MachineFunction &MF) const;
63b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
64b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  //! Return whether to emit frame moves
65b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  static bool needsFrameMoves(const MachineFunction &MF);
66b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne};
67b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
68b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} // end namespace llvm
69b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
70b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#endif
71