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
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_MIPS_MIPSSEINSTRINFO_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_MIPS_MIPSSEINSTRINFO_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;
248589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka
250bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakapublic:
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  explicit MipsSEInstrInfo(const MipsSubtarget &STI);
270bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MipsRegisterInfo &getRegisterInfo() const override;
298589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka
300bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// isLoadFromStackSlot - If the specified machine instruction is a direct
310bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// load from a stack slot, return the virtual or physical register number of
320bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// the destination along with the FrameIndex of the loaded stack slot.  If
330bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// not, return 0.  This predicate must return 0 if the instruction has
340bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// any side effects other than loading from the stack slot.
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned isLoadFromStackSlot(const MachineInstr *MI,
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               int &FrameIndex) const override;
370bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
380bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// isStoreToStackSlot - If the specified machine instruction is a direct
390bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// store to a stack slot, return the virtual or physical register number of
400bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// the source reg along with the FrameIndex of the loaded stack slot.  If
410bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// not, return 0.  This predicate must return 0 if the instruction has
420bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  /// any side effects other than storing to the stack slot.
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned isStoreToStackSlot(const MachineInstr *MI,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              int &FrameIndex) const override;
450bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void copyPhysReg(MachineBasicBlock &MBB,
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   MachineBasicBlock::iterator MI, DebugLoc DL,
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   unsigned DestReg, unsigned SrcReg,
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   bool KillSrc) const override;
500bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void storeRegToStack(MachineBasicBlock &MBB,
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       MachineBasicBlock::iterator MI,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       unsigned SrcReg, bool isKill, int FrameIndex,
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       const TargetRegisterClass *RC,
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       const TargetRegisterInfo *TRI,
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       int64_t Offset) const override;
570bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void loadRegFromStack(MachineBasicBlock &MBB,
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        MachineBasicBlock::iterator MI,
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        unsigned DestReg, int FrameIndex,
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        const TargetRegisterClass *RC,
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        const TargetRegisterInfo *TRI,
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        int64_t Offset) const override;
640bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const override;
660bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getOppositeBranchOpc(unsigned Opc) const override;
680bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
6971746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  /// Adjust SP by Amount bytes.
7071746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka  void adjustStackPtr(unsigned SP, int64_t Amount, MachineBasicBlock &MBB,
712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                      MachineBasicBlock::iterator I) const override;
7271746220d3d1c3e8efba35038ac2ff14b4a4d3aeAkira Hatanaka
73fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// Emit a series of instructions to load an immediate. If NewImm is a
74fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// non-NULL parameter, the last instruction is not emitted, but instead
75fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  /// its immediate operand is returned in NewImm.
76fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka  unsigned loadImmediate(int64_t Imm, MachineBasicBlock &MBB,
77fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka                         MachineBasicBlock::iterator II, DebugLoc DL,
78fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka                         unsigned *NewImm) const;
79fc4eafa0f490bd06d8191a2f007514b9e3ce0387Akira Hatanaka
800bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakaprivate:
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getAnalyzableBrOpc(unsigned Opc) const override;
820bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
83c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void expandRetRA(MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const;
8402e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka
854cef3d818183aafc1b3adfad4140483d9ad1ad86Akira Hatanaka  std::pair<bool, bool> compareOpndSize(unsigned Opc,
864cef3d818183aafc1b3adfad4140483d9ad1ad86Akira Hatanaka                                        const MachineFunction &MF) const;
877462a875d9ca4cf7ab30829152175f7448757943Akira Hatanaka
88243702b95a471ffb7d2374dfad3d7f8b11bee7e7Akira Hatanaka  void expandPseudoMFHiLo(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
89243702b95a471ffb7d2374dfad3d7f8b11bee7e7Akira Hatanaka                          unsigned NewOpc) const;
90243702b95a471ffb7d2374dfad3d7f8b11bee7e7Akira Hatanaka
912ef99c5dff1ab9612f2d65e38f725d809672d2fdAkira Hatanaka  void expandPseudoMTLoHi(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
922ef99c5dff1ab9612f2d65e38f725d809672d2fdAkira Hatanaka                          unsigned LoOpc, unsigned HiOpc,
932ef99c5dff1ab9612f2d65e38f725d809672d2fdAkira Hatanaka                          bool HasExplicitDef) const;
942ef99c5dff1ab9612f2d65e38f725d809672d2fdAkira Hatanaka
9502e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  /// Expand pseudo Int-to-FP conversion instructions.
9602e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  ///
9702e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  /// For example, the following pseudo instruction
9802e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  ///  PseudoCVT_D32_W D2, A5
9902e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  /// gets expanded into these two instructions:
10002e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  ///  MTC1 F4, A5
10102e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  ///  CVT_D32_W D2, F4
10202e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  ///
10302e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  /// We do this expansion post-RA to avoid inserting a floating point copy
10402e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka  /// instruction between MTC1 and CVT_D32_W.
105ec4db6ab5f64318b1aa2351f7e710569869193e9Akira Hatanaka  void expandCvtFPInt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
1067462a875d9ca4cf7ab30829152175f7448757943Akira Hatanaka                      unsigned CvtOpc, unsigned MovOpc, bool IsI64) const;
10702e168003f45cf8e0a277c6b8c85c1a3032b1decAkira Hatanaka
1086daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  void expandExtractElementF64(MachineBasicBlock &MBB,
109b1f4f120a50c392c85c6b4388d63e36251fce279Akira Hatanaka                               MachineBasicBlock::iterator I, bool FP64) const;
1106daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  void expandBuildPairF64(MachineBasicBlock &MBB,
111b1f4f120a50c392c85c6b4388d63e36251fce279Akira Hatanaka                          MachineBasicBlock::iterator I, bool FP64) const;
1126daba286836e6fb2351e7ebc248e18a5c80e8a31Akira Hatanaka  void expandEhReturn(MachineBasicBlock &MBB,
113544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka                      MachineBasicBlock::iterator I) const;
1140bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka};
1150bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
1160bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka}
1170bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
1180bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#endif
119