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