SIInstrInfo.h revision 17f852892346fdf3b1e9eec56b7a55c470279bc8
1aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//===-- SIInstrInfo.h - SI Instruction Info Interface ---------------------===//
2aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
3aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//                     The LLVM Compiler Infrastructure
4aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
5aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// This file is distributed under the University of Illinois Open Source
6aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// License. See LICENSE.TXT for details.
7aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
8aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//===----------------------------------------------------------------------===//
9aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
10aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// Interface definition for SIInstrInfo.
11aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
12aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//===----------------------------------------------------------------------===//
13aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
14aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
15aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#ifndef SIINSTRINFO_H
16aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#define SIINSTRINFO_H
17aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
18aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#include "AMDGPUInstrInfo.h"
19aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#include "SIRegisterInfo.h"
20aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
21aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkenamespace llvm {
22aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
23aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkeclass SIInstrInfo : public AMDGPUInstrInfo {
24aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkeprivate:
25aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  const SIRegisterInfo RI;
26aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  AMDGPUTargetMachine &TM;
27aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
28aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  MachineInstr * convertCLAMP_f32(MachineInstr & clampInstr,
29aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke                                  MachineFunction &MF, DebugLoc DL) const;
30aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
31aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkepublic:
32aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  explicit SIInstrInfo(AMDGPUTargetMachine &tm);
33aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
34aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  const SIRegisterInfo &getRegisterInfo() const;
35aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
36aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  virtual void copyPhysReg(MachineBasicBlock &MBB,
37aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke                           MachineBasicBlock::iterator MI, DebugLoc DL,
38aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke                           unsigned DestReg, unsigned SrcReg,
39aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke                           bool KillSrc) const;
40aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
41aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// getEncodingType - Returns the encoding type of this instruction.
42aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  unsigned getEncodingType(const MachineInstr &MI) const;
43aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
44aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// getEncodingBytes - Returns the size of this instructions encoding in
45aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// number of bytes.
46aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  unsigned getEncodingBytes(const MachineInstr &MI) const;
47aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
48aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// convertToISA - Convert the AMDIL MachineInstr to a supported SI
49aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  ///MachineInstr
50aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  virtual MachineInstr * convertToISA(MachineInstr & MI, MachineFunction &MF,
51aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke                                        DebugLoc DL) const;
52aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
53aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// getISAOpcode - This function takes an AMDIL opcode as an argument and
54aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  /// returns an equivalent SI opcode.
55aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  virtual unsigned getISAOpcode(unsigned AMDILopcode) const;
56aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
57aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  };
58aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
59aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke} // End namespace llvm
60aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
61aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// These must be kept in sync with SIInstructions.td and also the
62aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// InstrEncodingInfo array in SIInstrInfo.cpp.
63aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke//
64aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// NOTE: This enum is only used to identify the encoding type within LLVM,
65aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke// the actual encoding type that is part of the instruction format is different
66aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkenamespace SIInstrEncodingType {
67aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  enum Encoding {
68aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    EXP = 0,
69aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    LDS = 1,
70aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    MIMG = 2,
71aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    MTBUF = 3,
72aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    MUBUF = 4,
73aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SMRD = 5,
74aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SOP1 = 6,
75aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SOP2 = 7,
76aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SOPC = 8,
77aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SOPK = 9,
78aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    SOPP = 10,
79aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    VINTRP = 11,
80aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    VOP1 = 12,
81aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    VOP2 = 13,
82aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    VOP3 = 14,
83aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    VOPC = 15
84aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  };
85aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke}
86aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
87aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#define SI_INSTR_FLAGS_ENCODING_MASK 0xf
88aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
89aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzkenamespace SIInstrFlags {
90aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  enum Flags {
91aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    // First 4 bits are the instruction encoding
92aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke    NEED_WAIT = 1 << 4
93aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke  };
94aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke}
95aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke
96aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke#endif //SIINSTRINFO_H
97aaa3c0d6de7fc2c8d209d3adba11eba1133c61d1Benjamin Franzke