10bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//===-- MipsSEInstrInfo.h - Mips32/64 Instruction Information ---*- C++ -*-===//
20bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
30bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//                     The LLVM Compiler Infrastructure
40bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
50bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka// This file is distributed under the University of Illinois Open Source
60bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka// License. See LICENSE.TXT for details.
70bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
80bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//===----------------------------------------------------------------------===//
90bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
100bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka// This file contains the Mips32/64 implementation of the TargetInstrInfo class.
110bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
120bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//===----------------------------------------------------------------------===//
130bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
140bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#ifndef MIPSSEINSTRUCTIONINFO_H
150bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#define MIPSSEINSTRUCTIONINFO_H
160bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
170bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#include "MipsInstrInfo.h"
188589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka#include "MipsSERegisterInfo.h"
190bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
200bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakanamespace llvm {
210bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
220bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakaclass MipsSEInstrInfo : public MipsInstrInfo {
238589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka  const MipsSERegisterInfo RI;
240bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  bool IsN64;
258589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka
260bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakapublic:
270bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  explicit MipsSEInstrInfo(MipsTargetMachine &TM);
280bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
298589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka  virtual const MipsRegisterInfo &getRegisterInfo() const;
308589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka
310bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// isLoadFromStackSlot - If the specified machine instruction is a direct
320bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// load from a stack slot, return the virtual or physical register number of
330bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// the destination along with the FrameIndex of the loaded stack slot.  If
340bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// not, return 0.  This predicate must return 0 if the instruction has
350bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// any side effects other than loading from the stack slot.
360bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
370bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                       int &FrameIndex) const;
380bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
390bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// isStoreToStackSlot - If the specified machine instruction is a direct
400bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// store to a stack slot, return the virtual or physical register number of
410bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// the source reg along with the FrameIndex of the loaded stack slot.  If
420bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// not, return 0.  This predicate must return 0 if the instruction has
430bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// any side effects other than storing to the stack slot.
440bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
450bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                      int &FrameIndex) const;
460bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
470bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual void copyPhysReg(MachineBasicBlock &MBB,
480bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                           MachineBasicBlock::iterator MI, DebugLoc DL,
490bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                           unsigned DestReg, unsigned SrcReg,
500bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                           bool KillSrc) const;
510bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
520bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
530bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                   MachineBasicBlock::iterator MBBI,
540bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                   unsigned SrcReg, bool isKill, int FrameIndex,
550bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                   const TargetRegisterClass *RC,
560bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                   const TargetRegisterInfo *TRI) const;
570bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
580bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
590bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                    MachineBasicBlock::iterator MBBI,
600bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                    unsigned DestReg, int FrameIndex,
610bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                    const TargetRegisterClass *RC,
620bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                                    const TargetRegisterInfo *TRI) const;
630bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
640bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const;
650bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
660bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual unsigned GetOppositeBranchOpc(unsigned Opc) const;
670bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
6871746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  /// Adjust SP by Amount bytes.
6971746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  void adjustStackPtr(unsigned SP, int64_t Amount, MachineBasicBlock &MBB,
7071746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka                      MachineBasicBlock::iterator I) const;
7171746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka
72fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// Emit a series of instructions to load an immediate. If NewImm is a
73fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// non-NULL parameter, the last instruction is not emitted, but instead
74fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// its immediate operand is returned in NewImm.
75fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  unsigned loadImmediate(int64_t Imm, MachineBasicBlock &MBB,
76fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka                         MachineBasicBlock::iterator II, DebugLoc DL,
77fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka                         unsigned *NewImm) const;
78fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka
790bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakaprivate:
800bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  virtual unsigned GetAnalyzableBrOpc(unsigned Opc) const;
810bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
820bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  void ExpandRetRA(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
830bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                   unsigned Opc) const;
840bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  void ExpandExtractElementF64(MachineBasicBlock &MBB,
850bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                               MachineBasicBlock::iterator I) const;
860bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  void ExpandBuildPairF64(MachineBasicBlock &MBB,
870bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                          MachineBasicBlock::iterator I) const;
88544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  void ExpandEhReturn(MachineBasicBlock &MBB,
89544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka                      MachineBasicBlock::iterator I) const;
900bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka};
910bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
920bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka}
930bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
940bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#endif
95