1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard//===-- R600InstrInfo.h - R600 Instruction Info Interface -------*- C++ -*-===// 2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// The LLVM Compiler Infrastructure 4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source 6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details. 7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 10fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard// Interface definition for R600InstrInfo 11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#ifndef R600INSTRUCTIONINFO_H_ 15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#define R600INSTRUCTIONINFO_H_ 16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDIL.h" 18ac669c32c6e80841e3ee63d65b58c0031b22e7b8Tom Stellard#include "AMDGPUInstrInfo.h" 19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "R600RegisterInfo.h" 20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <map> 22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardnamespace llvm { 24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard class AMDGPUTargetMachine; 26cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard class DFAPacketizer; 27cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard class ScheduleDAG; 28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard class MachineFunction; 29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard class MachineInstr; 30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard class MachineInstrBuilder; 31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard class R600InstrInfo : public AMDGPUInstrInfo { 33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard private: 34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard const R600RegisterInfo RI; 35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard AMDGPUTargetMachine &TM; 36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 370eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune int getBranchInstr(const MachineOperand &op) const; 380eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune 39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard public: 40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard explicit R600InstrInfo(AMDGPUTargetMachine &tm); 41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard const R600RegisterInfo &getRegisterInfo() const; 43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard virtual void copyPhysReg(MachineBasicBlock &MBB, 44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard MachineBasicBlock::iterator MI, DebugLoc DL, 45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard unsigned DestReg, unsigned SrcReg, 46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool KillSrc) const; 47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool isTrig(const MachineInstr &MI) const; 49040c2e04568e2fe9ec07167f5300a3dcdfebb04eApostolos Bartziokas bool isPlaceHolderOpcode(unsigned opcode) const; 50040c2e04568e2fe9ec07167f5300a3dcdfebb04eApostolos Bartziokas bool isReductionOp(unsigned opcode) const; 51040c2e04568e2fe9ec07167f5300a3dcdfebb04eApostolos Bartziokas bool isCubeOp(unsigned opcode) const; 52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 539c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard /// isVector - Vector instructions are instructions that must fill all 549c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard /// instruction slots within an instruction group. 559c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard bool isVector(const MachineInstr &MI) const; 569c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard 57d6c2d3722d795381d3cdf11fe00f63780ad0725aTom Stellard virtual MachineInstr * getMovImmInstr(MachineFunction *MF, unsigned DstReg, 58d6c2d3722d795381d3cdf11fe00f63780ad0725aTom Stellard int64_t Imm) const; 59d6c2d3722d795381d3cdf11fe00f63780ad0725aTom Stellard 60d6c2d3722d795381d3cdf11fe00f63780ad0725aTom Stellard virtual unsigned getIEQOpcode() const; 61f81e4663a766e71e907886640327abea4a0d78e2Tom Stellard virtual bool isMov(unsigned Opcode) const; 62cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard 63cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard DFAPacketizer *CreateTargetScheduleState(const TargetMachine *TM, 64cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard const ScheduleDAG *DAG) const; 65a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 66a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; 67a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 680eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, 690eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune SmallVectorImpl<MachineOperand> &Cond, bool AllowModify) const; 700eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune 710eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl<MachineOperand> &Cond, DebugLoc DL) const; 720eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune 730eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune unsigned RemoveBranch(MachineBasicBlock &MBB) const; 740eca5fd919b0a31ea926b5f5072e5e56f7a55269Vincent Lejeune 758263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune bool isPredicated(const MachineInstr *MI) const; 768263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune 778263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune bool isPredicable(MachineInstr *MI) const; 78a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 79a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool 80a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCyles, 81a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const BranchProbability &Probability) const; 82a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 83a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCyles, 84a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune unsigned ExtraPredCycles, 85a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const BranchProbability &Probability) const ; 86a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 87a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool 88a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune isProfitableToIfCvt(MachineBasicBlock &TMBB, 89a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune unsigned NumTCycles, unsigned ExtraTCycles, 90a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune MachineBasicBlock &FMBB, 91a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune unsigned NumFCycles, unsigned ExtraFCycles, 92a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const BranchProbability &Probability) const; 93a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 94a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool DefinesPredicate(MachineInstr *MI, 95a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune std::vector<MachineOperand> &Pred) const; 96a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 97a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1, 98a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const SmallVectorImpl<MachineOperand> &Pred2) const; 99a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 100a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, 101a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune MachineBasicBlock &FMBB) const; 102a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 103a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune bool PredicateInstruction(MachineInstr *MI, 104a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const SmallVectorImpl<MachineOperand> &Pred) const; 105a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 106a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune int getInstrLatency(const InstrItineraryData *ItinData, 107a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune const MachineInstr *MI, 108a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune unsigned *PredCost = 0) const; 109a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune 110a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune virtual int getInstrLatency(const InstrItineraryData *ItinData, 111a614979286f8d329af318c1e9fb067e17cab4315Vincent Lejeune SDNode *Node) const { return 1;} 1123a7a56e7aa56bc6cb847c241ef6bd749713ae6e1Tom Stellard 1132ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard ///hasFlagOperand - Returns true if this instruction has an operand for 1142ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard /// storing target flags. 1152ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard bool hasFlagOperand(const MachineInstr &MI) const; 11667a47a445b544ac638d10303dc697d70f25d12fbTom Stellard 1172ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard ///addFlag - Add one of the MO_FLAG* flags to the specified Operand. 1182ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard void addFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const; 11967a47a445b544ac638d10303dc697d70f25d12fbTom Stellard 1202ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard ///isFlagSet - Determine if the specified flag is set on this Operand. 1212ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard bool isFlagSet(const MachineInstr &MI, unsigned Operand, unsigned Flag) const; 122ead72204f1864008430189421663a5d07a02293bTom Stellard 1232ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard ///getFlagOp - Return the operand containing the flags for this instruction. 1242ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard MachineOperand &getFlagOp(MachineInstr *MI) const; 125ead72204f1864008430189421663a5d07a02293bTom Stellard 1262ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard ///clearFlag - Clear the specified flag on the instruction. 1272ad8608cb3e6a8d2f375ad2295504167b082711fTom Stellard void clearFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const; 128d6c2d3722d795381d3cdf11fe00f63780ad0725aTom Stellard}; 129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} // End llvm namespace 131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardnamespace R600_InstFlag { 133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard enum TIF { 134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard TRANS_ONLY = (1 << 0), 135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard TEX = (1 << 1), 136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard REDUCTION = (1 << 2), 137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard FC = (1 << 3), 138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard TRIG = (1 << 4), 1399c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard OP3 = (1 << 5), 1409c46cb23685d0b28d5b9124f6dd26f27d028ed30Tom Stellard VECTOR = (1 << 6) 14167a47a445b544ac638d10303dc697d70f25d12fbTom Stellard //FlagOperand bits 7, 8 142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard }; 143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#endif // R600INSTRINFO_H_ 146