1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===-- AMDGPUInstrInfo.h - AMDGPU Instruction Information ------*- C++ -*-===//
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//                     The LLVM Compiler Infrastructure
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is distributed under the University of Illinois Open Source
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// License. See LICENSE.TXT for details.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===//
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file contains the definition of a TargetInstrInfo class that is common
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// to all AMD GPUs.
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===//
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef AMDGPUINSTRUCTIONINFO_H_
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AMDGPUINSTRUCTIONINFO_H_
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPURegisterInfo.h"
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPUInstrInfo.h"
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "llvm/Target/TargetInstrInfo.h"
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <map>
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_INSTRINFO_HEADER
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_INSTRINFO_ENUM
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "AMDGPUGenInstrInfo.inc"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OPCODE_IS_ZERO_INT 0x00000045
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OPCODE_IS_NOT_ZERO_INT 0x00000042
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OPCODE_IS_ZERO 0x00000020
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OPCODE_IS_NOT_ZERO 0x00000023
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace llvm {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass AMDGPUTargetMachine;
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass MachineFunction;
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass MachineInstr;
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass MachineInstrBuilder;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass AMDGPUInstrInfo : public AMDGPUGenInstrInfo {
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const AMDGPURegisterInfo RI;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  TargetMachine &TM;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool getNextBranchInstr(MachineBasicBlock::iterator &iter,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          MachineBasicBlock &MBB) const;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  explicit AMDGPUInstrInfo(TargetMachine &tm);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual const AMDGPURegisterInfo &getRegisterInfo() const = 0;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned &DstReg, unsigned &SubIdx) const;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     int &FrameIndex) const;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool hasLoadFromStackSlot(const MachineInstr *MI,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const MachineMemOperand *&MMO,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            int &FrameIndex) const;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned isStoreFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned isStoreFromStackSlotPostFE(const MachineInstr *MI,
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      int &FrameIndex) const;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool hasStoreFromStackSlot(const MachineInstr *MI,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const MachineMemOperand *&MMO,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             int &FrameIndex) const;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  MachineInstr *
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  convertToThreeAddress(MachineFunction::iterator &MFI,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        MachineBasicBlock::iterator &MBBI,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        LiveVariables *LV) const;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual void copyPhysReg(MachineBasicBlock &MBB,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           MachineBasicBlock::iterator MI, DebugLoc DL,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned DestReg, unsigned SrcReg,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           bool KillSrc) const = 0;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void storeRegToStackSlot(MachineBasicBlock &MBB,
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           MachineBasicBlock::iterator MI,
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned SrcReg, bool isKill, int FrameIndex,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           const TargetRegisterClass *RC,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           const TargetRegisterInfo *TRI) const;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void loadRegFromStackSlot(MachineBasicBlock &MBB,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            MachineBasicBlock::iterator MI,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            unsigned DestReg, int FrameIndex,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const TargetRegisterClass *RC,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const TargetRegisterInfo *TRI) const;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprotected:
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  MachineInstr *foldMemoryOperandImpl(MachineFunction &MF,
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      MachineInstr *MI,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      const SmallVectorImpl<unsigned> &Ops,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      int FrameIndex) const;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  MachineInstr *foldMemoryOperandImpl(MachineFunction &MF,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      MachineInstr *MI,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      const SmallVectorImpl<unsigned> &Ops,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      MachineInstr *LoadMI) const;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool canFoldMemoryOperand(const MachineInstr *MI,
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const SmallVectorImpl<unsigned> &Ops) const;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned Reg, bool UnfoldLoad, bool UnfoldStore,
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           SmallVectorImpl<MachineInstr *> &NewMIs) const;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           SmallVectorImpl<SDNode *> &NewNodes) const;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned getOpcodeAfterMemoryUnfold(unsigned Opc,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      bool UnfoldLoad, bool UnfoldStore,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      unsigned *LoadRegIndex = 0) const;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               int64_t Offset1, int64_t Offset2,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned NumLoads) const;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void insertNoop(MachineBasicBlock &MBB,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  MachineBasicBlock::iterator MI) const;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isPredicated(const MachineInstr *MI) const;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const SmallVectorImpl<MachineOperand> &Pred2) const;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool DefinesPredicate(MachineInstr *MI,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        std::vector<MachineOperand> &Pred) const;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isPredicable(MachineInstr *MI) const;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Helper functions that check the opcode for status information
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isLoadInst(llvm::MachineInstr *MI) const;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isExtLoadInst(llvm::MachineInstr *MI) const;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isSWSExtLoadInst(llvm::MachineInstr *MI) const;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isSExtLoadInst(llvm::MachineInstr *MI) const;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isZExtLoadInst(llvm::MachineInstr *MI) const;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isAExtLoadInst(llvm::MachineInstr *MI) const;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isStoreInst(llvm::MachineInstr *MI) const;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isTruncStoreInst(llvm::MachineInstr *MI) const;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual MachineInstr* getMovImmInstr(MachineFunction *MF, unsigned DstReg,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       int64_t Imm) const = 0;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual unsigned getIEQOpcode() const = 0;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual bool isMov(unsigned opcode) const = 0;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// convertToISA - Convert the AMDIL MachineInstr to a supported ISA
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// MachineInstr
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual void convertToISA(MachineInstr & MI, MachineFunction &MF,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DebugLoc DL) const;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // End llvm namespace
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif // AMDGPUINSTRINFO_H_
149