blob: f9ab4d0d68fef901f72b2f8b698b3693a7ffbc66 [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;
66 bool hasVgprParts(ArrayRef<GEPInfo> AddrInfo) const;
67 void getAddrModeInfo(const MachineInstr &Load, const MachineRegisterInfo &MRI,
68 SmallVectorImpl<GEPInfo> &AddrInfo) const;
69 bool selectSMRD(MachineInstr &I, ArrayRef<GEPInfo> AddrInfo) const;
70 bool selectG_LOAD(MachineInstr &I) const;
71 bool selectG_STORE(MachineInstr &I) const;
72
Tom Stellard1dc90202018-05-10 20:53:06 +000073 InstructionSelector::ComplexRendererFns
74 selectVSRC0(MachineOperand &Root) const;
75
Tom Stellardca166212017-01-30 21:56:46 +000076 const SIInstrInfo &TII;
77 const SIRegisterInfo &TRI;
78 const AMDGPURegisterBankInfo &RBI;
Tom Stellard1dc90202018-05-10 20:53:06 +000079 const AMDGPUTargetMachine &TM;
80 const SISubtarget &STI;
81 bool EnableLateStructurizeCFG;
82#define GET_GLOBALISEL_PREDICATES_DECL
83#include "AMDGPUGenGlobalISel.inc"
84#undef GET_GLOBALISEL_PREDICATES_DECL
85
86#define GET_GLOBALISEL_TEMPORARIES_DECL
87#include "AMDGPUGenGlobalISel.inc"
88#undef GET_GLOBALISEL_TEMPORARIES_DECL
89
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000090protected:
91 AMDGPUAS AMDGPUASI;
Tom Stellardca166212017-01-30 21:56:46 +000092};
93
94} // End llvm namespace.
95#endif