blob: 1ab37861134ef831e5d07ef545c657a51d178068 [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
28public:
29 explicit SIInstrInfo(AMDGPUTargetMachine &tm);
30
31 const SIRegisterInfo &getRegisterInfo() const;
32
33 virtual void copyPhysReg(MachineBasicBlock &MBB,
34 MachineBasicBlock::iterator MI, DebugLoc DL,
35 unsigned DestReg, unsigned SrcReg,
36 bool KillSrc) const;
37
Christian Konig3c145802013-03-27 09:12:59 +000038 unsigned commuteOpcode(unsigned Opcode) const;
39
Christian Konig76edd4f2013-02-26 17:52:29 +000040 virtual MachineInstr *commuteInstruction(MachineInstr *MI,
41 bool NewMI=false) const;
42
Tom Stellard75aadc22012-12-11 21:25:42 +000043 virtual unsigned getIEQOpcode() const { assert(!"Implement"); return 0;}
Tom Stellard26a3b672013-10-22 18:19:10 +000044 MachineInstr *buildMovInstr(MachineBasicBlock *MBB,
45 MachineBasicBlock::iterator I,
46 unsigned DstReg, unsigned SrcReg) const;
Tom Stellard75aadc22012-12-11 21:25:42 +000047 virtual bool isMov(unsigned Opcode) const;
48
49 virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const;
Tom Stellard16a9a202013-08-14 23:24:17 +000050 int isMIMG(uint16_t Opcode) const;
Michel Danzer20680b12013-08-16 16:19:24 +000051 int isSMRD(uint16_t Opcode) const;
Tom Stellard93fabce2013-10-10 17:11:55 +000052 bool isVOP1(uint16_t Opcode) const;
53 bool isVOP2(uint16_t Opcode) const;
54 bool isVOP3(uint16_t Opcode) const;
55 bool isVOPC(uint16_t Opcode) const;
56 bool isInlineConstant(const MachineOperand &MO) const;
57 bool isLiteralConstant(const MachineOperand &MO) const;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +000058
Tom Stellard93fabce2013-10-10 17:11:55 +000059 virtual bool verifyInstruction(const MachineInstr *MI,
60 StringRef &ErrInfo) const;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +000061 virtual int getIndirectIndexBegin(const MachineFunction &MF) const;
62
63 virtual int getIndirectIndexEnd(const MachineFunction &MF) const;
64
Tom Stellard82166022013-11-13 23:36:37 +000065 bool isSALUInstr(const MachineInstr &MI) const;
66 unsigned getVALUOp(const MachineInstr &MI) const;
67 bool isSALUOpSupportedOnVALU(const MachineInstr &MI) const;
68
69 /// \brief Return the correct register class for \p OpNo. For target-specific
70 /// instructions, this will return the register class that has been defined
71 /// in tablegen. For generic instructions, like REG_SEQUENCE it will return
72 /// the register class of its machine operand.
73 /// to infer the correct register class base on the other operands.
74 const TargetRegisterClass *getOpRegClass(const MachineInstr &MI,
75 unsigned OpNo) const;\
76
77 /// \returns true if it is legal for the operand at index \p OpNo
78 /// to read a VGPR.
79 bool canReadVGPR(const MachineInstr &MI, unsigned OpNo) const;
80
81 /// \brief Legalize the \p OpIndex operand of this instruction by inserting
82 /// a MOV. For example:
83 /// ADD_I32_e32 VGPR0, 15
84 /// to
85 /// MOV VGPR1, 15
86 /// ADD_I32_e32 VGPR0, VGPR1
87 ///
88 /// If the operand being legalized is a register, then a COPY will be used
89 /// instead of MOV.
90 void legalizeOpWithMove(MachineInstr *MI, unsigned OpIdx) const;
91
92 /// \brief Legalize all operands in this instruction. This function may
93 /// create new instruction and insert them before \p MI.
94 void legalizeOperands(MachineInstr *MI) const;
95
96 /// \brief Replace this instruction's opcode with the equivalent VALU
97 /// opcode. This function will also move the users of \p MI to the
98 /// VALU if necessary.
99 void moveToVALU(MachineInstr &MI) const;
100
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000101 virtual unsigned calculateIndirectAddress(unsigned RegIndex,
102 unsigned Channel) const;
103
Tom Stellard26a3b672013-10-22 18:19:10 +0000104 virtual const TargetRegisterClass *getIndirectAddrRegClass() const;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +0000105
106 virtual MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB,
107 MachineBasicBlock::iterator I,
108 unsigned ValueReg,
109 unsigned Address,
110 unsigned OffsetReg) const;
111
112 virtual MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB,
113 MachineBasicBlock::iterator I,
114 unsigned ValueReg,
115 unsigned Address,
116 unsigned OffsetReg) const;
Tom Stellard75aadc22012-12-11 21:25:42 +0000117 };
118
Christian Konigf741fbf2013-02-26 17:52:42 +0000119namespace AMDGPU {
120
121 int getVOPe64(uint16_t Opcode);
Christian Konig3c145802013-03-27 09:12:59 +0000122 int getCommuteRev(uint16_t Opcode);
123 int getCommuteOrig(uint16_t Opcode);
Christian Konigf741fbf2013-02-26 17:52:42 +0000124
125} // End namespace AMDGPU
126
Tom Stellard75aadc22012-12-11 21:25:42 +0000127} // End namespace llvm
128
129namespace SIInstrFlags {
130 enum Flags {
131 // First 4 bits are the instruction encoding
Tom Stellard1c822a82013-02-07 19:39:45 +0000132 VM_CNT = 1 << 0,
133 EXP_CNT = 1 << 1,
134 LGKM_CNT = 1 << 2
Tom Stellard75aadc22012-12-11 21:25:42 +0000135 };
136}
137
138#endif //SIINSTRINFO_H