1 //===- AMDGPULegalizerInfo ---------------------------------------*- C++ -*-==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 /// This file declares the targeting of the Machinelegalizer class for
10 /// AMDGPU.
11 /// \todo This should be generated by TableGen.
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
15 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
16 
17 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
18 #include "AMDGPUArgumentUsageInfo.h"
19 #include "SIInstrInfo.h"
20 
21 namespace llvm {
22 
23 class GCNTargetMachine;
24 class LLVMContext;
25 class GCNSubtarget;
26 
27 /// This class provides the information for the target register banks.
28 class AMDGPULegalizerInfo : public LegalizerInfo {
29   const GCNSubtarget &ST;
30 
31 public:
32   AMDGPULegalizerInfo(const GCNSubtarget &ST,
33                       const GCNTargetMachine &TM);
34 
35   bool legalizeCustom(MachineInstr &MI, MachineRegisterInfo &MRI,
36                       MachineIRBuilder &B,
37                       GISelChangeObserver &Observer) const override;
38 
39   Register getSegmentAperture(unsigned AddrSpace,
40                               MachineRegisterInfo &MRI,
41                               MachineIRBuilder &B) const;
42 
43   bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
44                              MachineIRBuilder &B) const;
45   bool legalizeFrint(MachineInstr &MI, MachineRegisterInfo &MRI,
46                      MachineIRBuilder &B) const;
47   bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
48                      MachineIRBuilder &B) const;
49   bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
50                               MachineIRBuilder &B) const;
51   bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
52                      MachineIRBuilder &B, bool Signed) const;
53   bool legalizeFPTOI(MachineInstr &MI, MachineRegisterInfo &MRI,
54                      MachineIRBuilder &B, bool Signed) const;
55   bool legalizeMinNumMaxNum(MachineInstr &MI, MachineRegisterInfo &MRI,
56                             MachineIRBuilder &B) const;
57   bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
58                                 MachineIRBuilder &B) const;
59   bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
60                                MachineIRBuilder &B) const;
61   bool legalizeShuffleVector(MachineInstr &MI, MachineRegisterInfo &MRI,
62                              MachineIRBuilder &B) const;
63 
64   bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
65                       MachineIRBuilder &B) const;
66 
67   bool buildPCRelGlobalAddress(
68     Register DstReg, LLT PtrTy, MachineIRBuilder &B, const GlobalValue *GV,
69     unsigned Offset, unsigned GAFlags = SIInstrInfo::MO_NONE) const;
70 
71   bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
72                            MachineIRBuilder &B) const;
73   bool legalizeLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
74                     MachineIRBuilder &B,
75                     GISelChangeObserver &Observer) const;
76 
77   bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
78                     MachineIRBuilder &B) const;
79 
80   bool legalizeAtomicCmpXChg(MachineInstr &MI, MachineRegisterInfo &MRI,
81                              MachineIRBuilder &B) const;
82   bool legalizeFlog(MachineInstr &MI, MachineIRBuilder &B,
83                     double Log2BaseInverted) const;
84   bool legalizeFExp(MachineInstr &MI, MachineIRBuilder &B) const;
85   bool legalizeFPow(MachineInstr &MI, MachineIRBuilder &B) const;
86   bool legalizeFFloor(MachineInstr &MI, MachineRegisterInfo &MRI,
87                       MachineIRBuilder &B) const;
88 
89   bool legalizeBuildVector(MachineInstr &MI, MachineRegisterInfo &MRI,
90                            MachineIRBuilder &B) const;
91 
92   Register getLiveInRegister(MachineIRBuilder &B, MachineRegisterInfo &MRI,
93                              Register PhyReg, LLT Ty,
94                              bool InsertLiveInCopy = true) const;
95   Register insertLiveInCopy(MachineIRBuilder &B, MachineRegisterInfo &MRI,
96                             Register LiveIn, Register PhyReg) const;
97   const ArgDescriptor *
98   getArgDescriptor(MachineIRBuilder &B,
99                    AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
100   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
101                       const ArgDescriptor *Arg) const;
102   bool legalizePreloadedArgIntrin(
103     MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
104     AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
105 
106   bool legalizeUDIV_UREM(MachineInstr &MI, MachineRegisterInfo &MRI,
107                          MachineIRBuilder &B) const;
108 
109   void legalizeUDIV_UREM32Impl(MachineIRBuilder &B,
110                                Register DstReg, Register Num, Register Den,
111                                bool IsRem) const;
112   bool legalizeUDIV_UREM32(MachineInstr &MI, MachineRegisterInfo &MRI,
113                            MachineIRBuilder &B) const;
114   bool legalizeSDIV_SREM32(MachineInstr &MI, MachineRegisterInfo &MRI,
115                            MachineIRBuilder &B) const;
116 
117   bool legalizeUDIV_UREM64(MachineInstr &MI, MachineRegisterInfo &MRI,
118                            MachineIRBuilder &B) const;
119   bool legalizeSDIV_SREM(MachineInstr &MI, MachineRegisterInfo &MRI,
120                          MachineIRBuilder &B) const;
121 
122   bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
123                     MachineIRBuilder &B) const;
124   bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
125                       MachineIRBuilder &B) const;
126   bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
127                       MachineIRBuilder &B) const;
128   bool legalizeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
129                       MachineIRBuilder &B) const;
130   bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
131                               MachineIRBuilder &B) const;
132   bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
133                               MachineIRBuilder &B) const;
134 
135   bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
136                               MachineIRBuilder &B) const;
137   bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
138                            MachineIRBuilder &B, unsigned AddrSpace) const;
139 
140   std::tuple<Register, unsigned, unsigned>
141   splitBufferOffsets(MachineIRBuilder &B, Register OrigOffset) const;
142 
143   Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
144                           Register Reg) const;
145   bool legalizeRawBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
146                               MachineIRBuilder &B, bool IsFormat) const;
147   bool legalizeRawBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
148                              MachineIRBuilder &B, bool IsFormat) const;
149   Register fixStoreSourceType(MachineIRBuilder &B, Register VData,
150                               bool IsFormat) const;
151 
152   bool legalizeBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
153                            MachineIRBuilder &B, bool IsTyped,
154                            bool IsFormat) const;
155   bool legalizeBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
156                           MachineIRBuilder &B, bool IsTyped,
157                           bool IsFormat) const;
158   bool legalizeBufferAtomic(MachineInstr &MI, MachineIRBuilder &B,
159                             Intrinsic::ID IID) const;
160 
161   bool legalizeImageIntrinsic(
162       MachineInstr &MI, MachineIRBuilder &B,
163       GISelChangeObserver &Observer,
164       const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr) const;
165 
166   bool legalizeSBufferLoad(
167     MachineInstr &MI, MachineIRBuilder &B,
168     GISelChangeObserver &Observer) const;
169 
170   bool legalizeAtomicIncDec(MachineInstr &MI,  MachineIRBuilder &B,
171                             bool IsInc) const;
172 
173   bool legalizeTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
174                              MachineIRBuilder &B) const;
175   bool legalizeDebugTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
176                                   MachineIRBuilder &B) const;
177 
178   bool legalizeIntrinsic(MachineInstr &MI, MachineIRBuilder &B,
179                          GISelChangeObserver &Observer) const override;
180 };
181 } // End llvm namespace.
182 #endif
183