SIInstrInfo.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1//===-- SIInstrInfo.h - SI Instruction Info Interface -----------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief Interface definition for SIInstrInfo.
12//
13//===----------------------------------------------------------------------===//
14
15
16#ifndef SIINSTRINFO_H
17#define SIINSTRINFO_H
18
19#include "AMDGPUInstrInfo.h"
20#include "SIRegisterInfo.h"
21
22namespace llvm {
23
24class SIInstrInfo : public AMDGPUInstrInfo {
25private:
26  const SIRegisterInfo RI;
27
28  unsigned buildExtractSubReg(MachineBasicBlock::iterator MI,
29                              MachineRegisterInfo &MRI,
30                              MachineOperand &SuperReg,
31                              const TargetRegisterClass *SuperRC,
32                              unsigned SubIdx,
33                              const TargetRegisterClass *SubRC) const;
34  MachineOperand buildExtractSubRegOrImm(MachineBasicBlock::iterator MI,
35                                         MachineRegisterInfo &MRI,
36                                         MachineOperand &SuperReg,
37                                         const TargetRegisterClass *SuperRC,
38                                         unsigned SubIdx,
39                                         const TargetRegisterClass *SubRC) const;
40
41  unsigned split64BitImm(SmallVectorImpl<MachineInstr *> &Worklist,
42                         MachineBasicBlock::iterator MI,
43                         MachineRegisterInfo &MRI,
44                         const TargetRegisterClass *RC,
45                         const MachineOperand &Op) const;
46
47  void splitScalar64BitOp(SmallVectorImpl<MachineInstr *> & Worklist,
48                          MachineInstr *Inst, unsigned Opcode) const;
49
50  void addDescImplicitUseDef(const MCInstrDesc &Desc, MachineInstr *MI) const;
51
52public:
53  explicit SIInstrInfo(AMDGPUTargetMachine &tm);
54
55  const SIRegisterInfo &getRegisterInfo() const override {
56    return RI;
57  }
58
59  void copyPhysReg(MachineBasicBlock &MBB,
60                   MachineBasicBlock::iterator MI, DebugLoc DL,
61                   unsigned DestReg, unsigned SrcReg,
62                   bool KillSrc) const override;
63
64  void storeRegToStackSlot(MachineBasicBlock &MBB,
65                           MachineBasicBlock::iterator MI,
66                           unsigned SrcReg, bool isKill, int FrameIndex,
67                           const TargetRegisterClass *RC,
68                           const TargetRegisterInfo *TRI) const override;
69
70  void loadRegFromStackSlot(MachineBasicBlock &MBB,
71                            MachineBasicBlock::iterator MI,
72                            unsigned DestReg, int FrameIndex,
73                            const TargetRegisterClass *RC,
74                            const TargetRegisterInfo *TRI) const override;
75
76  virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const;
77
78  unsigned commuteOpcode(unsigned Opcode) const;
79
80  MachineInstr *commuteInstruction(MachineInstr *MI,
81                                   bool NewMI=false) const override;
82
83  bool isTriviallyReMaterializable(const MachineInstr *MI,
84                                   AliasAnalysis *AA = nullptr) const;
85
86  unsigned getIEQOpcode() const override {
87    llvm_unreachable("Unimplemented");
88  }
89
90  MachineInstr *buildMovInstr(MachineBasicBlock *MBB,
91                              MachineBasicBlock::iterator I,
92                              unsigned DstReg, unsigned SrcReg) const override;
93  bool isMov(unsigned Opcode) const override;
94
95  bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const override;
96  bool isDS(uint16_t Opcode) const;
97  int isMIMG(uint16_t Opcode) const;
98  int isSMRD(uint16_t Opcode) const;
99  bool isVOP1(uint16_t Opcode) const;
100  bool isVOP2(uint16_t Opcode) const;
101  bool isVOP3(uint16_t Opcode) const;
102  bool isVOPC(uint16_t Opcode) const;
103  bool isInlineConstant(const APInt &Imm) const;
104  bool isInlineConstant(const MachineOperand &MO) const;
105  bool isLiteralConstant(const MachineOperand &MO) const;
106
107  bool verifyInstruction(const MachineInstr *MI,
108                         StringRef &ErrInfo) const override;
109
110  bool isSALUInstr(const MachineInstr &MI) const;
111  static unsigned getVALUOp(const MachineInstr &MI);
112
113  bool isSALUOpSupportedOnVALU(const MachineInstr &MI) const;
114
115  /// \brief Return the correct register class for \p OpNo.  For target-specific
116  /// instructions, this will return the register class that has been defined
117  /// in tablegen.  For generic instructions, like REG_SEQUENCE it will return
118  /// the register class of its machine operand.
119  /// to infer the correct register class base on the other operands.
120  const TargetRegisterClass *getOpRegClass(const MachineInstr &MI,
121                                           unsigned OpNo) const;\
122
123  /// \returns true if it is legal for the operand at index \p OpNo
124  /// to read a VGPR.
125  bool canReadVGPR(const MachineInstr &MI, unsigned OpNo) const;
126
127  /// \brief Legalize the \p OpIndex operand of this instruction by inserting
128  /// a MOV.  For example:
129  /// ADD_I32_e32 VGPR0, 15
130  /// to
131  /// MOV VGPR1, 15
132  /// ADD_I32_e32 VGPR0, VGPR1
133  ///
134  /// If the operand being legalized is a register, then a COPY will be used
135  /// instead of MOV.
136  void legalizeOpWithMove(MachineInstr *MI, unsigned OpIdx) const;
137
138  /// \brief Legalize all operands in this instruction.  This function may
139  /// create new instruction and insert them before \p MI.
140  void legalizeOperands(MachineInstr *MI) const;
141
142  void moveSMRDToVALU(MachineInstr *MI, MachineRegisterInfo &MRI) const;
143
144  /// \brief Replace this instruction's opcode with the equivalent VALU
145  /// opcode.  This function will also move the users of \p MI to the
146  /// VALU if necessary.
147  void moveToVALU(MachineInstr &MI) const;
148
149  unsigned calculateIndirectAddress(unsigned RegIndex,
150                                    unsigned Channel) const override;
151
152  const TargetRegisterClass *getIndirectAddrRegClass() const override;
153
154  MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB,
155                                         MachineBasicBlock::iterator I,
156                                         unsigned ValueReg,
157                                         unsigned Address,
158                                         unsigned OffsetReg) const override;
159
160  MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB,
161                                        MachineBasicBlock::iterator I,
162                                        unsigned ValueReg,
163                                        unsigned Address,
164                                        unsigned OffsetReg) const override;
165  void reserveIndirectRegisters(BitVector &Reserved,
166                                const MachineFunction &MF) const;
167
168  void LoadM0(MachineInstr *MoveRel, MachineBasicBlock::iterator I,
169              unsigned SavReg, unsigned IndexReg) const;
170
171  void insertNOPs(MachineBasicBlock::iterator MI, int Count) const;
172};
173
174namespace AMDGPU {
175
176  int getVOPe64(uint16_t Opcode);
177  int getCommuteRev(uint16_t Opcode);
178  int getCommuteOrig(uint16_t Opcode);
179  int getMCOpcode(uint16_t Opcode, unsigned Gen);
180
181  const uint64_t RSRC_DATA_FORMAT = 0xf00000000000LL;
182
183
184} // End namespace AMDGPU
185
186} // End namespace llvm
187
188namespace SIInstrFlags {
189  enum Flags {
190    // First 4 bits are the instruction encoding
191    VM_CNT = 1 << 0,
192    EXP_CNT = 1 << 1,
193    LGKM_CNT = 1 << 2
194  };
195}
196
197#endif //SIINSTRINFO_H
198