blob: 6c05f3cc0c17541b26fdbd60d8152e4590730d09 [file] [log] [blame]
Tom Stellardca166212017-01-30 21:56:46 +00001//===- AMDGPUInstructionSelector --------------------------------*- C++ -*-==//
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/// \file
10/// This file declares the targeting of the InstructionSelector class for
11/// AMDGPU.
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H
16
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000017#include "AMDGPU.h"
Tom Stellardca166212017-01-30 21:56:46 +000018#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/SmallVector.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000020#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
Tom Stellardca166212017-01-30 21:56:46 +000021
Tom Stellard1dc90202018-05-10 20:53:06 +000022namespace {
23#define GET_GLOBALISEL_PREDICATE_BITSET
24#include "AMDGPUGenGlobalISel.inc"
25#undef GET_GLOBALISEL_PREDICATE_BITSET
26}
27
Tom Stellardca166212017-01-30 21:56:46 +000028namespace llvm {
29
30class AMDGPUInstrInfo;
31class AMDGPURegisterBankInfo;
Tom Stellard1dc90202018-05-10 20:53:06 +000032class AMDGPUSubtarget;
Tom Stellardca166212017-01-30 21:56:46 +000033class MachineInstr;
34class MachineOperand;
35class MachineRegisterInfo;
36class SIInstrInfo;
37class SIRegisterInfo;
38class SISubtarget;
39
40class AMDGPUInstructionSelector : public InstructionSelector {
41public:
42 AMDGPUInstructionSelector(const SISubtarget &STI,
Tom Stellard1dc90202018-05-10 20:53:06 +000043 const AMDGPURegisterBankInfo &RBI,
44 const AMDGPUTargetMachine &TM);
Tom Stellardca166212017-01-30 21:56:46 +000045
Daniel Sandersf76f3152017-11-16 00:46:35 +000046 bool select(MachineInstr &I, CodeGenCoverage &CoverageInfo) const override;
Tom Stellard1dc90202018-05-10 20:53:06 +000047 static const char *getName();
Daniel Sandersf76f3152017-11-16 00:46:35 +000048
Tom Stellardca166212017-01-30 21:56:46 +000049private:
50 struct GEPInfo {
51 const MachineInstr &GEP;
52 SmallVector<unsigned, 2> SgprParts;
53 SmallVector<unsigned, 2> VgprParts;
54 int64_t Imm;
55 GEPInfo(const MachineInstr &GEP) : GEP(GEP), Imm(0) { }
56 };
57
Tom Stellard1dc90202018-05-10 20:53:06 +000058 /// tblgen-erated 'select' implementation.
59 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
60
Tom Stellardca166212017-01-30 21:56:46 +000061 MachineOperand getSubOperand64(MachineOperand &MO, unsigned SubIdx) const;
Tom Stellard1e0edad2018-05-10 21:20:10 +000062 bool selectCOPY(MachineInstr &I) const;
Tom Stellardca166212017-01-30 21:56:46 +000063 bool selectG_CONSTANT(MachineInstr &I) const;
64 bool selectG_ADD(MachineInstr &I) const;
65 bool selectG_GEP(MachineInstr &I) const;
Tom Stellarda9284732018-06-14 19:26:37 +000066 bool selectG_INTRINSIC(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
Tom Stellardca166212017-01-30 21:56:46 +000067 bool hasVgprParts(ArrayRef<GEPInfo> AddrInfo) const;
68 void getAddrModeInfo(const MachineInstr &Load, const MachineRegisterInfo &MRI,
69 SmallVectorImpl<GEPInfo> &AddrInfo) const;
70 bool selectSMRD(MachineInstr &I, ArrayRef<GEPInfo> AddrInfo) const;
71 bool selectG_LOAD(MachineInstr &I) const;
72 bool selectG_STORE(MachineInstr &I) const;
73
Tom Stellard1dc90202018-05-10 20:53:06 +000074 InstructionSelector::ComplexRendererFns
75 selectVSRC0(MachineOperand &Root) const;
76
Tom Stellarddcc95e92018-05-11 05:44:16 +000077 InstructionSelector::ComplexRendererFns
78 selectVOP3Mods0(MachineOperand &Root) const;
Tom Stellard46bbbc32018-06-13 22:30:47 +000079 InstructionSelector::ComplexRendererFns
80 selectVOP3Mods(MachineOperand &Root) const;
Tom Stellarddcc95e92018-05-11 05:44:16 +000081
Tom Stellardca166212017-01-30 21:56:46 +000082 const SIInstrInfo &TII;
83 const SIRegisterInfo &TRI;
84 const AMDGPURegisterBankInfo &RBI;
Tom Stellard1dc90202018-05-10 20:53:06 +000085 const AMDGPUTargetMachine &TM;
86 const SISubtarget &STI;
87 bool EnableLateStructurizeCFG;
88#define GET_GLOBALISEL_PREDICATES_DECL
89#include "AMDGPUGenGlobalISel.inc"
90#undef GET_GLOBALISEL_PREDICATES_DECL
91
92#define GET_GLOBALISEL_TEMPORARIES_DECL
93#include "AMDGPUGenGlobalISel.inc"
94#undef GET_GLOBALISEL_TEMPORARIES_DECL
95
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000096protected:
97 AMDGPUAS AMDGPUASI;
Tom Stellardca166212017-01-30 21:56:46 +000098};
99
100} // End llvm namespace.
101#endif