10bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//===-- Mips16InstrInfo.h - Mips16 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 Mips16 implementation of the TargetInstrInfo class.
110bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//
120bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka//===----------------------------------------------------------------------===//
130bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
140bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#ifndef MIPS16INSTRUCTIONINFO_H
150bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#define MIPS16INSTRUCTIONINFO_H
160bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
178589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka#include "Mips16RegisterInfo.h"
18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "MipsInstrInfo.h"
190bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
200bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakanamespace llvm {
210bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
220bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakaclass Mips16InstrInfo : public MipsInstrInfo {
238589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka  const Mips16RegisterInfo RI;
248589010e3d1d5a902992a5039cffa9d4116982c5Akira Hatanaka
250bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakapublic:
260bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  explicit Mips16InstrInfo(MipsTargetMachine &TM);
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 MBBI,
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 MBBI,
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
69cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  // Adjust SP by FrameSize bytes. Save RA, S0, S1
70cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  void makeFrame(unsigned SP, int64_t FrameSize, MachineBasicBlock &MBB,
718a7f9de9d42e5817167e374dd61408dcac31a102Reed Kotler                 MachineBasicBlock::iterator I) const;
72cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
73cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  // Adjust SP by FrameSize bytes. Restore RA, S0, S1
74cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  void restoreFrame(unsigned SP, int64_t FrameSize, MachineBasicBlock &MBB,
75cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler                      MachineBasicBlock::iterator I) const;
76cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
77cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
789441125d636dee246acf9cb6c8f264edda92c335Reed Kotler  /// Adjust SP by Amount bytes.
799441125d636dee246acf9cb6c8f264edda92c335Reed Kotler  void adjustStackPtr(unsigned SP, int64_t Amount, MachineBasicBlock &MBB,
809441125d636dee246acf9cb6c8f264edda92c335Reed Kotler                      MachineBasicBlock::iterator I) const;
819441125d636dee246acf9cb6c8f264edda92c335Reed Kotler
8261b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler  /// Emit a series of instructions to load an immediate.
8361b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler  // This is to adjust some FrameReg. We return the new register to be used
8461b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler  // in place of FrameReg and the adjusted immediate field (&NewImm)
8561b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler  //
8661b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler  unsigned loadImmediate(unsigned FrameReg,
8761b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler                         int64_t Imm, MachineBasicBlock &MBB,
88cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler                         MachineBasicBlock::iterator II, DebugLoc DL,
8961b97b8c1721ba45e5c10ca307ceebe1efdf72a9Reed Kotler                         unsigned &NewImm) const;
90cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
918a7f9de9d42e5817167e374dd61408dcac31a102Reed Kotler  static bool validImmediate(unsigned Opcode, unsigned Reg, int64_t Amount);
928a7f9de9d42e5817167e374dd61408dcac31a102Reed Kotler
936b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler  static bool validSpImm8(int offset) {
946b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler    return ((offset & 7) == 0) && isInt<11>(offset);
956b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler  }
966b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler
976b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler  //
986b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler  // build the proper one based on the Imm field
996b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler  //
1006b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler
1016a0da011e42e553d497fce2059f43401e854b99dReed Kotler  const MCInstrDesc& AddiuSpImm(int64_t Imm) const;
1026b9d4617800d9450825f8a4b122a9aeb76f2795fReed Kotler
1032de893210b0d4178edb4e3f2a965d57e97410341Reed Kotler  void BuildAddiuSpImm
1042de893210b0d4178edb4e3f2a965d57e97410341Reed Kotler    (MachineBasicBlock &MBB, MachineBasicBlock::iterator I, int64_t Imm) const;
1052de893210b0d4178edb4e3f2a965d57e97410341Reed Kotler
1064df21b14675954ba951ad118d1dc4a4021650078Reed Kotler  unsigned getInlineAsmLength(const char *Str,
107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              const MCAsmInfo &MAI) const override;
1080bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanakaprivate:
109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getAnalyzableBrOpc(unsigned Opc) const override;
1100bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
1110bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka  void ExpandRetRA16(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
1120bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka                   unsigned Opc) const;
113cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
114cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  // Adjust SP by Amount bytes where bytes can be up to 32bit number.
115cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  void adjustStackPtrBig(unsigned SP, int64_t Amount, MachineBasicBlock &MBB,
116cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler                         MachineBasicBlock::iterator I,
117cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler                         unsigned Reg1, unsigned Reg2) const;
118cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
119cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler  // Adjust SP by Amount bytes where bytes can be up to 32bit number.
1201ebe5fce8ed51ab7e3908458bc5e2f0f24e0b21bAkira Hatanaka  void adjustStackPtrBigUnrestricted(unsigned SP, int64_t Amount,
1211ebe5fce8ed51ab7e3908458bc5e2f0f24e0b21bAkira Hatanaka                                     MachineBasicBlock &MBB,
1221ebe5fce8ed51ab7e3908458bc5e2f0f24e0b21bAkira Hatanaka                                     MachineBasicBlock::iterator I) const;
123cef95f702a5586781e5f812078a5c57f6f0e962bReed Kotler
1240bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka};
1250bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
1260bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka}
1270bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka
1280bc1adbbc4fdc6d85a671ed70a1bbd345dba445dAkira Hatanaka#endif
129