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