blob: 4c99b9524f4d3f23ba4204db608f48609963db2b [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===-- SIInstrInfo.h - SI Instruction Info Interface ---------------------===//
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
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 MachineInstr * getMovImmInstr(MachineFunction *MF, unsigned DstReg,
44 int64_t Imm) const;
45
46 virtual unsigned getIEQOpcode() const { assert(!"Implement"); return 0;}
47 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
65 virtual unsigned calculateIndirectAddress(unsigned RegIndex,
66 unsigned Channel) const;
67
68 virtual const TargetRegisterClass *getIndirectAddrStoreRegClass(
69 unsigned SourceReg) const;
70
71 virtual const TargetRegisterClass *getIndirectAddrLoadRegClass() const;
72
73 virtual MachineInstrBuilder buildIndirectWrite(MachineBasicBlock *MBB,
74 MachineBasicBlock::iterator I,
75 unsigned ValueReg,
76 unsigned Address,
77 unsigned OffsetReg) const;
78
79 virtual MachineInstrBuilder buildIndirectRead(MachineBasicBlock *MBB,
80 MachineBasicBlock::iterator I,
81 unsigned ValueReg,
82 unsigned Address,
83 unsigned OffsetReg) const;
84
85 virtual const TargetRegisterClass *getSuperIndirectRegClass() const;
Tom Stellard75aadc22012-12-11 21:25:42 +000086 };
87
Christian Konigf741fbf2013-02-26 17:52:42 +000088namespace AMDGPU {
89
90 int getVOPe64(uint16_t Opcode);
Christian Konig3c145802013-03-27 09:12:59 +000091 int getCommuteRev(uint16_t Opcode);
92 int getCommuteOrig(uint16_t Opcode);
Christian Konigf741fbf2013-02-26 17:52:42 +000093
94} // End namespace AMDGPU
95
Tom Stellard75aadc22012-12-11 21:25:42 +000096} // End namespace llvm
97
98namespace SIInstrFlags {
99 enum Flags {
100 // First 4 bits are the instruction encoding
Tom Stellard1c822a82013-02-07 19:39:45 +0000101 VM_CNT = 1 << 0,
102 EXP_CNT = 1 << 1,
103 LGKM_CNT = 1 << 2
Tom Stellard75aadc22012-12-11 21:25:42 +0000104 };
105}
106
107#endif //SIINSTRINFO_H