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