blob: a9b014f88050039894741090eb03cf5bbc5ea203 [file] [log] [blame]
Matt Arsenaultdf90c022013-10-15 23:44:45 +00001//===-- SIInstrInfo.h - SI Instruction Info Interface -----------*- C++ -*-===//
Tom Stellard75aadc22012-12-11 21:25:42 +00002//
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
Tom Stellard15834092014-03-21 15:51:57 +000028 unsigned buildExtractSubReg(MachineBasicBlock::iterator MI,
29 MachineRegisterInfo &MRI,
30 MachineOperand &SuperReg,
31 const TargetRegisterClass *SuperRC,
32 unsigned SubIdx,
33 const TargetRegisterClass *SubRC) const;
Matt Arsenault248b7b62014-03-24 20:08:09 +000034 MachineOperand buildExtractSubRegOrImm(MachineBasicBlock::iterator MI,
35 MachineRegisterInfo &MRI,
36 MachineOperand &SuperReg,
37 const TargetRegisterClass *SuperRC,
38 unsigned SubIdx,
39 const TargetRegisterClass *SubRC) const;
Tom Stellard15834092014-03-21 15:51:57 +000040
Matt Arsenaultbd995802014-03-24 18:26:52 +000041 unsigned split64BitImm(SmallVectorImpl<MachineInstr *> &Worklist,
42 MachineBasicBlock::iterator MI,
43 MachineRegisterInfo &MRI,
44 const TargetRegisterClass *RC,
45 const MachineOperand &Op) const;
46
Matt Arsenault689f3252014-06-09 16:36:31 +000047 void splitScalar64BitUnaryOp(SmallVectorImpl<MachineInstr *> &Worklist,
48 MachineInstr *Inst, unsigned Opcode) const;
49
50 void splitScalar64BitBinaryOp(SmallVectorImpl<MachineInstr *> &Worklist,
51 MachineInstr *Inst, unsigned Opcode) const;
Matt Arsenaultf35182c2014-03-24 20:08:05 +000052
Matt Arsenault27cc9582014-04-18 01:53:18 +000053 void addDescImplicitUseDef(const MCInstrDesc &Desc, MachineInstr *MI) const;
Matt Arsenaultf35182c2014-03-24 20:08:05 +000054
Tom Stellard75aadc22012-12-11 21:25:42 +000055public:
56 explicit SIInstrInfo(AMDGPUTargetMachine &tm);
57
Craig Topper5656db42014-04-29 07:57:24 +000058 const SIRegisterInfo &getRegisterInfo() const override {
Matt Arsenault6dde3032014-03-11 00:01:34 +000059 return RI;
60 }
Tom Stellard75aadc22012-12-11 21:25:42 +000061
Craig Topper5656db42014-04-29 07:57:24 +000062 void copyPhysReg(MachineBasicBlock &MBB,
63 MachineBasicBlock::iterator MI, DebugLoc DL,
64 unsigned DestReg, unsigned SrcReg,
65 bool KillSrc) const override;
Tom Stellard75aadc22012-12-11 21:25:42 +000066
Tom Stellardc149dc02013-11-27 21:23:35 +000067 void storeRegToStackSlot(MachineBasicBlock &MBB,
68 MachineBasicBlock::iterator MI,
69 unsigned SrcReg, bool isKill, int FrameIndex,
70 const TargetRegisterClass *RC,
Craig Topper5656db42014-04-29 07:57:24 +000071 const TargetRegisterInfo *TRI) const override;
Tom Stellardc149dc02013-11-27 21:23:35 +000072
73 void loadRegFromStackSlot(MachineBasicBlock &MBB,
74 MachineBasicBlock::iterator MI,
75 unsigned DestReg, int FrameIndex,
76 const TargetRegisterClass *RC,
Craig Topper5656db42014-04-29 07:57:24 +000077 const TargetRegisterInfo *TRI) const override;
Tom Stellardc149dc02013-11-27 21:23:35 +000078
Tom Stellardeba61072014-05-02 15:41:42 +000079 virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const;
80
Christian Konig3c145802013-03-27 09:12:59 +000081 unsigned commuteOpcode(unsigned Opcode) const;
82
Craig Topper5656db42014-04-29 07:57:24 +000083 MachineInstr *commuteInstruction(MachineInstr *MI,
84 bool NewMI=false) const override;
Christian Konig76edd4f2013-02-26 17:52:29 +000085
Tom Stellard30f59412014-03-31 14:01:56 +000086 bool isTriviallyReMaterializable(const MachineInstr *MI,
Craig Toppere73658d2014-04-28 04:05:08 +000087 AliasAnalysis *AA = nullptr) const;
Tom Stellard30f59412014-03-31 14:01:56 +000088
Craig Topper5656db42014-04-29 07:57:24 +000089 unsigned getIEQOpcode() const override {
Matt Arsenaulteaa3a7e2013-12-10 21:37:42 +000090 llvm_unreachable("Unimplemented");
91 }
92
Tom Stellard26a3b672013-10-22 18:19:10 +000093 MachineInstr *buildMovInstr(MachineBasicBlock *MBB,
94 MachineBasicBlock::iterator I,
Craig Topper5656db42014-04-29 07:57:24 +000095 unsigned DstReg, unsigned SrcReg) const override;
96 bool isMov(unsigned Opcode) const override;
Tom Stellard75aadc22012-12-11 21:25:42 +000097
Craig Topper5656db42014-04-29 07:57:24 +000098 bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const override;
Tom Stellard5d7aaae2014-02-10 16:58:30 +000099 bool isDS(uint16_t Opcode) const;
Tom Stellard16a9a202013-08-14 23:24:17 +0000100 int isMIMG(uint16_t Opcode) const;
Michel Danzer20680b12013-08-16 16:19:24 +0000101 int isSMRD(uint16_t Opcode) const;
Tom Stellard93fabce2013-10-10 17:11:55 +0000102 bool isVOP1(uint16_t Opcode) const;
103 bool isVOP2(uint16_t Opcode) const;
104 bool isVOP3(uint16_t Opcode) const;
105 bool isVOPC(uint16_t Opcode) const;
Matt Arsenaultd7bdcc42014-03-31 19:54:27 +0000106 bool isInlineConstant(const APInt &Imm) const;
Tom Stellard93fabce2013-10-10 17:11:55 +0000107 bool isInlineConstant(const MachineOperand &MO) const;
108 bool isLiteralConstant(const MachineOperand &MO) const;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000109
Craig Topper5656db42014-04-29 07:57:24 +0000110 bool verifyInstruction(const MachineInstr *MI,
111 StringRef &ErrInfo) const override;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000112
Tom Stellard82166022013-11-13 23:36:37 +0000113 bool isSALUInstr(const MachineInstr &MI) const;
Matt Arsenaultf14032a2013-11-15 22:02:28 +0000114 static unsigned getVALUOp(const MachineInstr &MI);
Matt Arsenaultf35182c2014-03-24 20:08:05 +0000115
Tom Stellard82166022013-11-13 23:36:37 +0000116 bool isSALUOpSupportedOnVALU(const MachineInstr &MI) const;
117
118 /// \brief Return the correct register class for \p OpNo. For target-specific
119 /// instructions, this will return the register class that has been defined
120 /// in tablegen. For generic instructions, like REG_SEQUENCE it will return
121 /// the register class of its machine operand.
122 /// to infer the correct register class base on the other operands.
123 const TargetRegisterClass *getOpRegClass(const MachineInstr &MI,
124 unsigned OpNo) const;\
125
126 /// \returns true if it is legal for the operand at index \p OpNo
127 /// to read a VGPR.
128 bool canReadVGPR(const MachineInstr &MI, unsigned OpNo) const;
129
130 /// \brief Legalize the \p OpIndex operand of this instruction by inserting
131 /// a MOV. For example:
132 /// ADD_I32_e32 VGPR0, 15
133 /// to
134 /// MOV VGPR1, 15
135 /// ADD_I32_e32 VGPR0, VGPR1
136 ///
137 /// If the operand being legalized is a register, then a COPY will be used
138 /// instead of MOV.
139 void legalizeOpWithMove(MachineInstr *MI, unsigned OpIdx) const;
140
141 /// \brief Legalize all operands in this instruction. This function may
142 /// create new instruction and insert them before \p MI.
143 void legalizeOperands(MachineInstr *MI) const;
144
Tom Stellard0c354f22014-04-30 15:31:29 +0000145 void moveSMRDToVALU(MachineInstr *MI, MachineRegisterInfo &MRI) const;
146
Tom Stellard82166022013-11-13 23:36:37 +0000147 /// \brief Replace this instruction's opcode with the equivalent VALU
148 /// opcode. This function will also move the users of \p MI to the
149 /// VALU if necessary.
150 void moveToVALU(MachineInstr &MI) const;
151
Craig Topper5656db42014-04-29 07:57:24 +0000152 unsigned calculateIndirectAddress(unsigned RegIndex,
153 unsigned Channel) const override;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000154
Craig Topper5656db42014-04-29 07:57:24 +0000155 const TargetRegisterClass *getIndirectAddrRegClass() const override;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000156
Craig Topper5656db42014-04-29 07:57:24 +0000157 MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB,
158 MachineBasicBlock::iterator I,
159 unsigned ValueReg,
160 unsigned Address,
161 unsigned OffsetReg) const override;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000162
Craig Topper5656db42014-04-29 07:57:24 +0000163 MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB,
164 MachineBasicBlock::iterator I,
165 unsigned ValueReg,
166 unsigned Address,
167 unsigned OffsetReg) const override;
Tom Stellard81d871d2013-11-13 23:36:50 +0000168 void reserveIndirectRegisters(BitVector &Reserved,
169 const MachineFunction &MF) const;
170
171 void LoadM0(MachineInstr *MoveRel, MachineBasicBlock::iterator I,
172 unsigned SavReg, unsigned IndexReg) const;
Tom Stellardeba61072014-05-02 15:41:42 +0000173
174 void insertNOPs(MachineBasicBlock::iterator MI, int Count) const;
Tom Stellard81d871d2013-11-13 23:36:50 +0000175};
Tom Stellard75aadc22012-12-11 21:25:42 +0000176
Christian Konigf741fbf2013-02-26 17:52:42 +0000177namespace AMDGPU {
178
179 int getVOPe64(uint16_t Opcode);
Christian Konig3c145802013-03-27 09:12:59 +0000180 int getCommuteRev(uint16_t Opcode);
181 int getCommuteOrig(uint16_t Opcode);
Tom Stellardc721a232014-05-16 20:56:47 +0000182 int getMCOpcode(uint16_t Opcode, unsigned Gen);
Christian Konigf741fbf2013-02-26 17:52:42 +0000183
Tom Stellard15834092014-03-21 15:51:57 +0000184 const uint64_t RSRC_DATA_FORMAT = 0xf00000000000LL;
185
186
Christian Konigf741fbf2013-02-26 17:52:42 +0000187} // End namespace AMDGPU
188
Tom Stellard75aadc22012-12-11 21:25:42 +0000189} // End namespace llvm
190
191namespace SIInstrFlags {
192 enum Flags {
193 // First 4 bits are the instruction encoding
Tom Stellard1c822a82013-02-07 19:39:45 +0000194 VM_CNT = 1 << 0,
195 EXP_CNT = 1 << 1,
196 LGKM_CNT = 1 << 2
Tom Stellard75aadc22012-12-11 21:25:42 +0000197 };
198}
199
200#endif //SIINSTRINFO_H