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