xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- AMDGPULegalizerInfo ---------------------------------------*- C++ -*-==//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric /// \file
90b57cec5SDimitry Andric /// This file declares the targeting of the Machinelegalizer class for
100b57cec5SDimitry Andric /// AMDGPU.
110b57cec5SDimitry Andric /// \todo This should be generated by TableGen.
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
150b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
180b57cec5SDimitry Andric #include "AMDGPUArgumentUsageInfo.h"
198bcb0991SDimitry Andric #include "SIInstrInfo.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric class GCNTargetMachine;
240b57cec5SDimitry Andric class GCNSubtarget;
25e8d8bef9SDimitry Andric class MachineIRBuilder;
260b57cec5SDimitry Andric 
27e8d8bef9SDimitry Andric namespace AMDGPU {
28e8d8bef9SDimitry Andric struct ImageDimIntrinsicInfo;
29e8d8bef9SDimitry Andric }
30e8d8bef9SDimitry Andric class AMDGPULegalizerInfo final : public LegalizerInfo {
310b57cec5SDimitry Andric   const GCNSubtarget &ST;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric public:
340b57cec5SDimitry Andric   AMDGPULegalizerInfo(const GCNSubtarget &ST,
350b57cec5SDimitry Andric                       const GCNTargetMachine &TM);
360b57cec5SDimitry Andric 
371db9f3b2SDimitry Andric   bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
381db9f3b2SDimitry Andric                       LostDebugLocObserver &LocObserver) const override;
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric   Register getSegmentAperture(unsigned AddrSpace,
410b57cec5SDimitry Andric                               MachineRegisterInfo &MRI,
428bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
458bcb0991SDimitry Andric                              MachineIRBuilder &B) const;
465f757f3fSDimitry Andric   bool legalizeFroundeven(MachineInstr &MI, MachineRegisterInfo &MRI,
478bcb0991SDimitry Andric                           MachineIRBuilder &B) const;
480b57cec5SDimitry Andric   bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
498bcb0991SDimitry Andric                      MachineIRBuilder &B) const;
50e8d8bef9SDimitry Andric   bool legalizeFrem(MachineInstr &MI, MachineRegisterInfo &MRI,
51e8d8bef9SDimitry Andric                     MachineIRBuilder &B) const;
520b57cec5SDimitry Andric   bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
538bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
540b57cec5SDimitry Andric   bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
558bcb0991SDimitry Andric                      MachineIRBuilder &B, bool Signed) const;
565ffd83dbSDimitry Andric   bool legalizeFPTOI(MachineInstr &MI, MachineRegisterInfo &MRI,
575ffd83dbSDimitry Andric                      MachineIRBuilder &B, bool Signed) const;
585ffd83dbSDimitry Andric   bool legalizeMinNumMaxNum(LegalizerHelper &Helper, MachineInstr &MI) const;
590b57cec5SDimitry Andric   bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
608bcb0991SDimitry Andric                                 MachineIRBuilder &B) const;
610b57cec5SDimitry Andric   bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
628bcb0991SDimitry Andric                                MachineIRBuilder &B) const;
635ffd83dbSDimitry Andric 
648bcb0991SDimitry Andric   bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
658bcb0991SDimitry Andric                       MachineIRBuilder &B) const;
668bcb0991SDimitry Andric 
675ffd83dbSDimitry Andric   bool buildPCRelGlobalAddress(Register DstReg, LLT PtrTy, MachineIRBuilder &B,
685ffd83dbSDimitry Andric                                const GlobalValue *GV, int64_t Offset,
695ffd83dbSDimitry Andric                                unsigned GAFlags = SIInstrInfo::MO_NONE) const;
708bcb0991SDimitry Andric 
715f757f3fSDimitry Andric   void buildAbsGlobalAddress(Register DstReg, LLT PtrTy, MachineIRBuilder &B,
725f757f3fSDimitry Andric                              const GlobalValue *GV,
735f757f3fSDimitry Andric                              MachineRegisterInfo &MRI) const;
745f757f3fSDimitry Andric 
758bcb0991SDimitry Andric   bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
768bcb0991SDimitry Andric                            MachineIRBuilder &B) const;
77e8d8bef9SDimitry Andric   bool legalizeLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
7806c3fb27SDimitry Andric   bool legalizeStore(LegalizerHelper &Helper, MachineInstr &MI) const;
798bcb0991SDimitry Andric 
808bcb0991SDimitry Andric   bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
818bcb0991SDimitry Andric                     MachineIRBuilder &B) const;
820b57cec5SDimitry Andric 
83480093f4SDimitry Andric   bool legalizeAtomicCmpXChg(MachineInstr &MI, MachineRegisterInfo &MRI,
84480093f4SDimitry Andric                              MachineIRBuilder &B) const;
8506c3fb27SDimitry Andric 
8606c3fb27SDimitry Andric   std::pair<Register, Register>
8706c3fb27SDimitry Andric   getScaledLogInput(MachineIRBuilder &B, Register Src, unsigned Flags) const;
8806c3fb27SDimitry Andric 
8906c3fb27SDimitry Andric   bool legalizeFlog2(MachineInstr &MI, MachineIRBuilder &B) const;
9006c3fb27SDimitry Andric   bool legalizeFlogCommon(MachineInstr &MI, MachineIRBuilder &B) const;
9106c3fb27SDimitry Andric   bool legalizeFlogUnsafe(MachineIRBuilder &B, Register Dst, Register Src,
928a4dda33SDimitry Andric                           bool IsLog10, unsigned Flags) const;
9306c3fb27SDimitry Andric   bool legalizeFExp2(MachineInstr &MI, MachineIRBuilder &B) const;
9406c3fb27SDimitry Andric   bool legalizeFExpUnsafe(MachineIRBuilder &B, Register Dst, Register Src,
9506c3fb27SDimitry Andric                           unsigned Flags) const;
965ffd83dbSDimitry Andric   bool legalizeFExp(MachineInstr &MI, MachineIRBuilder &B) const;
975ffd83dbSDimitry Andric   bool legalizeFPow(MachineInstr &MI, MachineIRBuilder &B) const;
985ffd83dbSDimitry Andric   bool legalizeFFloor(MachineInstr &MI, MachineRegisterInfo &MRI,
995ffd83dbSDimitry Andric                       MachineIRBuilder &B) const;
100480093f4SDimitry Andric 
1015ffd83dbSDimitry Andric   bool legalizeBuildVector(MachineInstr &MI, MachineRegisterInfo &MRI,
1025ffd83dbSDimitry Andric                            MachineIRBuilder &B) const;
10381ad6265SDimitry Andric 
10481ad6265SDimitry Andric   void buildMultiply(LegalizerHelper &Helper, MutableArrayRef<Register> Accum,
10581ad6265SDimitry Andric                      ArrayRef<Register> Src0, ArrayRef<Register> Src1,
10681ad6265SDimitry Andric                      bool UsePartialMad64_32,
10781ad6265SDimitry Andric                      bool SeparateOddAlignedProducts) const;
10881ad6265SDimitry Andric   bool legalizeMul(LegalizerHelper &Helper, MachineInstr &MI) const;
109349cc55cSDimitry Andric   bool legalizeCTLZ_CTTZ(MachineInstr &MI, MachineRegisterInfo &MRI,
110349cc55cSDimitry Andric                          MachineIRBuilder &B) const;
111*0fca6ea1SDimitry Andric   bool legalizeCTLZ_ZERO_UNDEF(MachineInstr &MI, MachineRegisterInfo &MRI,
112*0fca6ea1SDimitry Andric                                MachineIRBuilder &B) const;
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
115e8d8bef9SDimitry Andric                       const ArgDescriptor *Arg,
116e8d8bef9SDimitry Andric                       const TargetRegisterClass *ArgRC, LLT ArgTy) const;
117e8d8bef9SDimitry Andric   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
118e8d8bef9SDimitry Andric                       AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
11981ad6265SDimitry Andric 
12006c3fb27SDimitry Andric   bool legalizePointerAsRsrcIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
12106c3fb27SDimitry Andric                                    MachineIRBuilder &B) const;
12206c3fb27SDimitry Andric 
1230b57cec5SDimitry Andric   bool legalizePreloadedArgIntrin(
1240b57cec5SDimitry Andric     MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
1250b57cec5SDimitry Andric     AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
12681ad6265SDimitry Andric   bool legalizeWorkitemIDIntrinsic(
12781ad6265SDimitry Andric       MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
12881ad6265SDimitry Andric       unsigned Dim, AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
12981ad6265SDimitry Andric 
13081ad6265SDimitry Andric   Register getKernargParameterPtr(MachineIRBuilder &B, int64_t Offset) const;
13181ad6265SDimitry Andric   bool legalizeKernargMemParameter(MachineInstr &MI, MachineIRBuilder &B,
13281ad6265SDimitry Andric                                    uint64_t Offset,
13381ad6265SDimitry Andric                                    Align Alignment = Align(4)) const;
1340b57cec5SDimitry Andric 
135fe6060f1SDimitry Andric   bool legalizeUnsignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
1365ffd83dbSDimitry Andric                                MachineIRBuilder &B) const;
1375ffd83dbSDimitry Andric 
138fe6060f1SDimitry Andric   void legalizeUnsignedDIV_REM32Impl(MachineIRBuilder &B, Register DstDivReg,
139fe6060f1SDimitry Andric                                      Register DstRemReg, Register Num,
140fe6060f1SDimitry Andric                                      Register Den) const;
1415ffd83dbSDimitry Andric 
142fe6060f1SDimitry Andric   void legalizeUnsignedDIV_REM64Impl(MachineIRBuilder &B, Register DstDivReg,
143349cc55cSDimitry Andric                                      Register DstRemReg, Register Num,
144349cc55cSDimitry Andric                                      Register Den) const;
1455ffd83dbSDimitry Andric 
146fe6060f1SDimitry Andric   bool legalizeSignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
1475ffd83dbSDimitry Andric                              MachineIRBuilder &B) const;
1485ffd83dbSDimitry Andric 
1498bcb0991SDimitry Andric   bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
1508bcb0991SDimitry Andric                     MachineIRBuilder &B) const;
151480093f4SDimitry Andric   bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
152480093f4SDimitry Andric                       MachineIRBuilder &B) const;
153480093f4SDimitry Andric   bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
154480093f4SDimitry Andric                       MachineIRBuilder &B) const;
155480093f4SDimitry Andric   bool legalizeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
156480093f4SDimitry Andric                       MachineIRBuilder &B) const;
15706c3fb27SDimitry Andric   bool legalizeFFREXP(MachineInstr &MI, MachineRegisterInfo &MRI,
15806c3fb27SDimitry Andric                       MachineIRBuilder &B) const;
1598bcb0991SDimitry Andric   bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
1608bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
161e8d8bef9SDimitry Andric   bool legalizeFastUnsafeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
162e8d8bef9SDimitry Andric                                 MachineIRBuilder &B) const;
1638bcb0991SDimitry Andric   bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
1648bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
1658bcb0991SDimitry Andric 
1665f757f3fSDimitry Andric   bool legalizeFSQRTF16(MachineInstr &MI, MachineRegisterInfo &MRI,
1675f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
1685f757f3fSDimitry Andric   bool legalizeFSQRTF32(MachineInstr &MI, MachineRegisterInfo &MRI,
1695f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
1705f757f3fSDimitry Andric   bool legalizeFSQRTF64(MachineInstr &MI, MachineRegisterInfo &MRI,
1715f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
17206c3fb27SDimitry Andric   bool legalizeFSQRT(MachineInstr &MI, MachineRegisterInfo &MRI,
17306c3fb27SDimitry Andric                      MachineIRBuilder &B) const;
17406c3fb27SDimitry Andric 
175e8d8bef9SDimitry Andric   bool legalizeRsqClampIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
176e8d8bef9SDimitry Andric                                  MachineIRBuilder &B) const;
177e8d8bef9SDimitry Andric 
178e8d8bef9SDimitry Andric   bool getImplicitArgPtr(Register DstReg, MachineRegisterInfo &MRI,
179e8d8bef9SDimitry Andric                          MachineIRBuilder &B) const;
180e8d8bef9SDimitry Andric 
1810b57cec5SDimitry Andric   bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
1820b57cec5SDimitry Andric                               MachineIRBuilder &B) const;
183fcaf7f86SDimitry Andric 
184fcaf7f86SDimitry Andric   bool getLDSKernelId(Register DstReg, MachineRegisterInfo &MRI,
185fcaf7f86SDimitry Andric                       MachineIRBuilder &B) const;
186fcaf7f86SDimitry Andric 
187fcaf7f86SDimitry Andric   bool legalizeLDSKernelId(MachineInstr &MI, MachineRegisterInfo &MRI,
188fcaf7f86SDimitry Andric                            MachineIRBuilder &B) const;
189fcaf7f86SDimitry Andric 
1908bcb0991SDimitry Andric   bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
1918bcb0991SDimitry Andric                            MachineIRBuilder &B, unsigned AddrSpace) const;
1928bcb0991SDimitry Andric 
193fe6060f1SDimitry Andric   std::pair<Register, unsigned> splitBufferOffsets(MachineIRBuilder &B,
194fe6060f1SDimitry Andric                                                    Register OrigOffset) const;
1955ffd83dbSDimitry Andric 
1968bcb0991SDimitry Andric   Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
197e8d8bef9SDimitry Andric                           Register Reg, bool ImageStore = false) const;
1985ffd83dbSDimitry Andric   Register fixStoreSourceType(MachineIRBuilder &B, Register VData,
1995ffd83dbSDimitry Andric                               bool IsFormat) const;
2000b57cec5SDimitry Andric 
2015ffd83dbSDimitry Andric   bool legalizeBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
2025ffd83dbSDimitry Andric                            MachineIRBuilder &B, bool IsTyped,
2035ffd83dbSDimitry Andric                            bool IsFormat) const;
2045ffd83dbSDimitry Andric   bool legalizeBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
205e8d8bef9SDimitry Andric                           MachineIRBuilder &B, bool IsFormat,
206e8d8bef9SDimitry Andric                           bool IsTyped) const;
2075ffd83dbSDimitry Andric   bool legalizeBufferAtomic(MachineInstr &MI, MachineIRBuilder &B,
2085ffd83dbSDimitry Andric                             Intrinsic::ID IID) const;
2095ffd83dbSDimitry Andric 
210*0fca6ea1SDimitry Andric   bool legalizeLaneOp(LegalizerHelper &Helper, MachineInstr &MI,
211*0fca6ea1SDimitry Andric                       Intrinsic::ID IID) const;
212*0fca6ea1SDimitry Andric 
213e8d8bef9SDimitry Andric   bool legalizeBVHIntrinsic(MachineInstr &MI, MachineIRBuilder &B) const;
214e8d8bef9SDimitry Andric 
21581ad6265SDimitry Andric   bool legalizeFPTruncRound(MachineInstr &MI, MachineIRBuilder &B) const;
2165f757f3fSDimitry Andric   bool legalizeStackSave(MachineInstr &MI, MachineIRBuilder &B) const;
217b3edf446SDimitry Andric   bool legalizeWaveID(MachineInstr &MI, MachineIRBuilder &B) const;
21881ad6265SDimitry Andric 
219*0fca6ea1SDimitry Andric   bool legalizeGetFPEnv(MachineInstr &MI, MachineRegisterInfo &MRI,
220*0fca6ea1SDimitry Andric                         MachineIRBuilder &B) const;
221*0fca6ea1SDimitry Andric   bool legalizeSetFPEnv(MachineInstr &MI, MachineRegisterInfo &MRI,
222*0fca6ea1SDimitry Andric                         MachineIRBuilder &B) const;
223*0fca6ea1SDimitry Andric 
2245ffd83dbSDimitry Andric   bool legalizeImageIntrinsic(
2255ffd83dbSDimitry Andric       MachineInstr &MI, MachineIRBuilder &B,
2265ffd83dbSDimitry Andric       GISelChangeObserver &Observer,
2275ffd83dbSDimitry Andric       const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr) const;
2285ffd83dbSDimitry Andric 
229e8d8bef9SDimitry Andric   bool legalizeSBufferLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
2305ffd83dbSDimitry Andric 
231*0fca6ea1SDimitry Andric   bool legalizeTrap(MachineInstr &MI, MachineRegisterInfo &MRI,
2325ffd83dbSDimitry Andric                     MachineIRBuilder &B) const;
233fe6060f1SDimitry Andric   bool legalizeTrapEndpgm(MachineInstr &MI, MachineRegisterInfo &MRI,
234fe6060f1SDimitry Andric                           MachineIRBuilder &B) const;
235fe6060f1SDimitry Andric   bool legalizeTrapHsaQueuePtr(MachineInstr &MI, MachineRegisterInfo &MRI,
236fe6060f1SDimitry Andric                                MachineIRBuilder &B) const;
237fe6060f1SDimitry Andric   bool legalizeTrapHsa(MachineInstr &MI, MachineRegisterInfo &MRI,
238fe6060f1SDimitry Andric                        MachineIRBuilder &B) const;
239*0fca6ea1SDimitry Andric   bool legalizeDebugTrap(MachineInstr &MI, MachineRegisterInfo &MRI,
2405ffd83dbSDimitry Andric                          MachineIRBuilder &B) const;
2415ffd83dbSDimitry Andric 
2425ffd83dbSDimitry Andric   bool legalizeIntrinsic(LegalizerHelper &Helper,
2435ffd83dbSDimitry Andric                          MachineInstr &MI) const override;
2440b57cec5SDimitry Andric };
2450b57cec5SDimitry Andric } // End llvm namespace.
2460b57cec5SDimitry Andric #endif
247