|  | //===- SystemZInstrInfo.h - SystemZ Instruction Information -------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains the SystemZ implementation of the TargetInstrInfo class. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_TARGET_SYSTEMZINSTRINFO_H | 
|  | #define LLVM_TARGET_SYSTEMZINSTRINFO_H | 
|  |  | 
|  | #include "SystemZ.h" | 
|  | #include "SystemZRegisterInfo.h" | 
|  | #include "llvm/ADT/IndexedMap.h" | 
|  | #include "llvm/Target/TargetInstrInfo.h" | 
|  |  | 
|  | #define GET_INSTRINFO_HEADER | 
|  | #include "SystemZGenInstrInfo.inc" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class SystemZTargetMachine; | 
|  |  | 
|  | /// SystemZII - This namespace holds all of the target specific flags that | 
|  | /// instruction info tracks. | 
|  | /// | 
|  | namespace SystemZII { | 
|  | enum { | 
|  | //===------------------------------------------------------------------===// | 
|  | // SystemZ Specific MachineOperand flags. | 
|  |  | 
|  | MO_NO_FLAG = 0, | 
|  |  | 
|  | /// MO_GOTENT - On a symbol operand this indicates that the immediate is | 
|  | /// the offset to the location of the symbol name from the base of the GOT. | 
|  | /// | 
|  | ///    SYMBOL_LABEL @GOTENT | 
|  | MO_GOTENT = 1, | 
|  |  | 
|  | /// MO_PLT - On a symbol operand this indicates that the immediate is | 
|  | /// offset to the PLT entry of symbol name from the current code location. | 
|  | /// | 
|  | ///    SYMBOL_LABEL @PLT | 
|  | MO_PLT = 2 | 
|  | }; | 
|  | } | 
|  |  | 
|  | class SystemZInstrInfo : public SystemZGenInstrInfo { | 
|  | const SystemZRegisterInfo RI; | 
|  | SystemZTargetMachine &TM; | 
|  | public: | 
|  | explicit SystemZInstrInfo(SystemZTargetMachine &TM); | 
|  |  | 
|  | /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As | 
|  | /// such, whenever a client has an instance of instruction info, it should | 
|  | /// always be able to get register info as well (through this method). | 
|  | /// | 
|  | virtual const SystemZRegisterInfo &getRegisterInfo() const { return RI; } | 
|  |  | 
|  | virtual void copyPhysReg(MachineBasicBlock &MBB, | 
|  | MachineBasicBlock::iterator I, DebugLoc DL, | 
|  | unsigned DestReg, unsigned SrcReg, | 
|  | bool KillSrc) const; | 
|  |  | 
|  | unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const; | 
|  | unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const; | 
|  |  | 
|  | virtual void storeRegToStackSlot(MachineBasicBlock &MBB, | 
|  | MachineBasicBlock::iterator MI, | 
|  | unsigned SrcReg, bool isKill, | 
|  | int FrameIndex, | 
|  | const TargetRegisterClass *RC, | 
|  | const TargetRegisterInfo *TRI) const; | 
|  | virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, | 
|  | MachineBasicBlock::iterator MI, | 
|  | unsigned DestReg, int FrameIdx, | 
|  | const TargetRegisterClass *RC, | 
|  | const TargetRegisterInfo *TRI) const; | 
|  |  | 
|  | bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; | 
|  | virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const; | 
|  | virtual bool AnalyzeBranch(MachineBasicBlock &MBB, | 
|  | MachineBasicBlock *&TBB, | 
|  | MachineBasicBlock *&FBB, | 
|  | SmallVectorImpl<MachineOperand> &Cond, | 
|  | bool AllowModify) const; | 
|  | virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, | 
|  | MachineBasicBlock *FBB, | 
|  | const SmallVectorImpl<MachineOperand> &Cond, | 
|  | DebugLoc DL) const; | 
|  | virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; | 
|  |  | 
|  | SystemZCC::CondCodes getOppositeCondition(SystemZCC::CondCodes CC) const; | 
|  | SystemZCC::CondCodes getCondFromBranchOpc(unsigned Opc) const; | 
|  | const MCInstrDesc& getBrCond(SystemZCC::CondCodes CC) const; | 
|  | const MCInstrDesc& getLongDispOpc(unsigned Opc) const; | 
|  |  | 
|  | const MCInstrDesc& getMemoryInstr(unsigned Opc, int64_t Offset = 0) const { | 
|  | if (Offset < 0 || Offset >= 4096) | 
|  | return getLongDispOpc(Opc); | 
|  | else | 
|  | return get(Opc); | 
|  | } | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | #endif |