109467b48Spatrick //===- AMDGPULegalizerInfo ---------------------------------------*- C++ -*-==//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick /// \file
909467b48Spatrick /// This file declares the targeting of the Machinelegalizer class for
1009467b48Spatrick /// AMDGPU.
1109467b48Spatrick /// \todo This should be generated by TableGen.
1209467b48Spatrick //===----------------------------------------------------------------------===//
1309467b48Spatrick 
1409467b48Spatrick #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
1509467b48Spatrick #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
1609467b48Spatrick 
1709467b48Spatrick #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
1809467b48Spatrick #include "AMDGPUArgumentUsageInfo.h"
1909467b48Spatrick #include "SIInstrInfo.h"
2009467b48Spatrick 
2109467b48Spatrick namespace llvm {
2209467b48Spatrick 
2309467b48Spatrick class GCNTargetMachine;
2409467b48Spatrick class GCNSubtarget;
2573471bf0Spatrick class MachineIRBuilder;
2609467b48Spatrick 
2773471bf0Spatrick namespace AMDGPU {
2873471bf0Spatrick struct ImageDimIntrinsicInfo;
2973471bf0Spatrick }
3009467b48Spatrick /// This class provides the information for the target register banks.
3173471bf0Spatrick class AMDGPULegalizerInfo final : public LegalizerInfo {
3209467b48Spatrick   const GCNSubtarget &ST;
3309467b48Spatrick 
3409467b48Spatrick public:
3509467b48Spatrick   AMDGPULegalizerInfo(const GCNSubtarget &ST,
3609467b48Spatrick                       const GCNTargetMachine &TM);
3709467b48Spatrick 
38097a140dSpatrick   bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI) const override;
3909467b48Spatrick 
4009467b48Spatrick   Register getSegmentAperture(unsigned AddrSpace,
4109467b48Spatrick                               MachineRegisterInfo &MRI,
4209467b48Spatrick                               MachineIRBuilder &B) const;
4309467b48Spatrick 
4409467b48Spatrick   bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
4509467b48Spatrick                              MachineIRBuilder &B) const;
4609467b48Spatrick   bool legalizeFrint(MachineInstr &MI, MachineRegisterInfo &MRI,
4709467b48Spatrick                      MachineIRBuilder &B) const;
4809467b48Spatrick   bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
4909467b48Spatrick                      MachineIRBuilder &B) const;
5073471bf0Spatrick   bool legalizeFrem(MachineInstr &MI, MachineRegisterInfo &MRI,
5173471bf0Spatrick                     MachineIRBuilder &B) const;
5209467b48Spatrick   bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
5309467b48Spatrick                               MachineIRBuilder &B) const;
5409467b48Spatrick   bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
5509467b48Spatrick                      MachineIRBuilder &B, bool Signed) const;
56097a140dSpatrick   bool legalizeFPTOI(MachineInstr &MI, MachineRegisterInfo &MRI,
57097a140dSpatrick                      MachineIRBuilder &B, bool Signed) const;
58097a140dSpatrick   bool legalizeMinNumMaxNum(LegalizerHelper &Helper, MachineInstr &MI) const;
5909467b48Spatrick   bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
6009467b48Spatrick                                 MachineIRBuilder &B) const;
6109467b48Spatrick   bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
6209467b48Spatrick                                MachineIRBuilder &B) const;
63097a140dSpatrick 
6409467b48Spatrick   bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
6509467b48Spatrick                       MachineIRBuilder &B) const;
6609467b48Spatrick 
67097a140dSpatrick   bool buildPCRelGlobalAddress(Register DstReg, LLT PtrTy, MachineIRBuilder &B,
68097a140dSpatrick                                const GlobalValue *GV, int64_t Offset,
69097a140dSpatrick                                unsigned GAFlags = SIInstrInfo::MO_NONE) const;
7009467b48Spatrick 
7109467b48Spatrick   bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
7209467b48Spatrick                            MachineIRBuilder &B) const;
7373471bf0Spatrick   bool legalizeLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
7409467b48Spatrick 
7509467b48Spatrick   bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
7609467b48Spatrick                     MachineIRBuilder &B) const;
7709467b48Spatrick 
7809467b48Spatrick   bool legalizeAtomicCmpXChg(MachineInstr &MI, MachineRegisterInfo &MRI,
7909467b48Spatrick                              MachineIRBuilder &B) const;
80097a140dSpatrick   bool legalizeFlog(MachineInstr &MI, MachineIRBuilder &B,
81097a140dSpatrick                     double Log2BaseInverted) const;
82097a140dSpatrick   bool legalizeFExp(MachineInstr &MI, MachineIRBuilder &B) const;
83097a140dSpatrick   bool legalizeFPow(MachineInstr &MI, MachineIRBuilder &B) const;
84097a140dSpatrick   bool legalizeFFloor(MachineInstr &MI, MachineRegisterInfo &MRI,
85097a140dSpatrick                       MachineIRBuilder &B) const;
8609467b48Spatrick 
87097a140dSpatrick   bool legalizeBuildVector(MachineInstr &MI, MachineRegisterInfo &MRI,
88097a140dSpatrick                            MachineIRBuilder &B) const;
8909467b48Spatrick 
90*d415bd75Srobert   void buildMultiply(LegalizerHelper &Helper, MutableArrayRef<Register> Accum,
91*d415bd75Srobert                      ArrayRef<Register> Src0, ArrayRef<Register> Src1,
92*d415bd75Srobert                      bool UsePartialMad64_32,
93*d415bd75Srobert                      bool SeparateOddAlignedProducts) const;
94*d415bd75Srobert   bool legalizeMul(LegalizerHelper &Helper, MachineInstr &MI) const;
95*d415bd75Srobert   bool legalizeCTLZ_CTTZ(MachineInstr &MI, MachineRegisterInfo &MRI,
96*d415bd75Srobert                          MachineIRBuilder &B) const;
97*d415bd75Srobert 
9809467b48Spatrick   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
9973471bf0Spatrick                       const ArgDescriptor *Arg,
10073471bf0Spatrick                       const TargetRegisterClass *ArgRC, LLT ArgTy) const;
10173471bf0Spatrick   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
10273471bf0Spatrick                       AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
103*d415bd75Srobert 
10409467b48Spatrick   bool legalizePreloadedArgIntrin(
10509467b48Spatrick     MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
10609467b48Spatrick     AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
107*d415bd75Srobert   bool legalizeWorkitemIDIntrinsic(
108*d415bd75Srobert       MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
109*d415bd75Srobert       unsigned Dim, AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
110*d415bd75Srobert 
111*d415bd75Srobert   Register getKernargParameterPtr(MachineIRBuilder &B, int64_t Offset) const;
112*d415bd75Srobert   bool legalizeKernargMemParameter(MachineInstr &MI, MachineIRBuilder &B,
113*d415bd75Srobert                                    uint64_t Offset,
114*d415bd75Srobert                                    Align Alignment = Align(4)) const;
11509467b48Spatrick 
11673471bf0Spatrick   bool legalizeUnsignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
117097a140dSpatrick                                MachineIRBuilder &B) const;
118097a140dSpatrick 
11973471bf0Spatrick   void legalizeUnsignedDIV_REM32Impl(MachineIRBuilder &B, Register DstDivReg,
12073471bf0Spatrick                                      Register DstRemReg, Register Num,
12173471bf0Spatrick                                      Register Den) const;
122097a140dSpatrick 
12373471bf0Spatrick   void legalizeUnsignedDIV_REM64Impl(MachineIRBuilder &B, Register DstDivReg,
124*d415bd75Srobert                                      Register DstRemReg, Register Num,
125*d415bd75Srobert                                      Register Den) const;
126097a140dSpatrick 
12773471bf0Spatrick   bool legalizeSignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
128097a140dSpatrick                              MachineIRBuilder &B) const;
129097a140dSpatrick 
13009467b48Spatrick   bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
13109467b48Spatrick                     MachineIRBuilder &B) const;
13209467b48Spatrick   bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
13309467b48Spatrick                       MachineIRBuilder &B) const;
13409467b48Spatrick   bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
13509467b48Spatrick                       MachineIRBuilder &B) const;
13609467b48Spatrick   bool legalizeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
13709467b48Spatrick                       MachineIRBuilder &B) const;
13809467b48Spatrick   bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
13909467b48Spatrick                               MachineIRBuilder &B) const;
14073471bf0Spatrick   bool legalizeFastUnsafeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
14173471bf0Spatrick                                 MachineIRBuilder &B) const;
14209467b48Spatrick   bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
14309467b48Spatrick                               MachineIRBuilder &B) const;
14409467b48Spatrick 
14573471bf0Spatrick   bool legalizeRsqClampIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
14673471bf0Spatrick                                  MachineIRBuilder &B) const;
14773471bf0Spatrick 
14873471bf0Spatrick   bool legalizeDSAtomicFPIntrinsic(LegalizerHelper &Helper,
14973471bf0Spatrick                                    MachineInstr &MI, Intrinsic::ID IID) const;
15073471bf0Spatrick 
15173471bf0Spatrick   bool getImplicitArgPtr(Register DstReg, MachineRegisterInfo &MRI,
15273471bf0Spatrick                          MachineIRBuilder &B) const;
15373471bf0Spatrick 
15409467b48Spatrick   bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
15509467b48Spatrick                               MachineIRBuilder &B) const;
156*d415bd75Srobert 
157*d415bd75Srobert   bool getLDSKernelId(Register DstReg, MachineRegisterInfo &MRI,
158*d415bd75Srobert                       MachineIRBuilder &B) const;
159*d415bd75Srobert 
160*d415bd75Srobert   bool legalizeLDSKernelId(MachineInstr &MI, MachineRegisterInfo &MRI,
161*d415bd75Srobert                            MachineIRBuilder &B) const;
162*d415bd75Srobert 
16309467b48Spatrick   bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
16409467b48Spatrick                            MachineIRBuilder &B, unsigned AddrSpace) const;
16509467b48Spatrick 
16673471bf0Spatrick   std::pair<Register, unsigned> splitBufferOffsets(MachineIRBuilder &B,
16773471bf0Spatrick                                                    Register OrigOffset) const;
16873471bf0Spatrick   void updateBufferMMO(MachineMemOperand *MMO, Register VOffset,
16973471bf0Spatrick                        Register SOffset, unsigned ImmOffset, Register VIndex,
17073471bf0Spatrick                        MachineRegisterInfo &MRI) const;
171097a140dSpatrick 
17209467b48Spatrick   Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
17373471bf0Spatrick                           Register Reg, bool ImageStore = false) const;
17409467b48Spatrick   bool legalizeRawBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
17509467b48Spatrick                               MachineIRBuilder &B, bool IsFormat) const;
176097a140dSpatrick   bool legalizeRawBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
177097a140dSpatrick                              MachineIRBuilder &B, bool IsFormat) const;
178097a140dSpatrick   Register fixStoreSourceType(MachineIRBuilder &B, Register VData,
179097a140dSpatrick                               bool IsFormat) const;
18009467b48Spatrick 
181097a140dSpatrick   bool legalizeBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
182097a140dSpatrick                            MachineIRBuilder &B, bool IsTyped,
183097a140dSpatrick                            bool IsFormat) const;
184097a140dSpatrick   bool legalizeBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
18573471bf0Spatrick                           MachineIRBuilder &B, bool IsFormat,
18673471bf0Spatrick                           bool IsTyped) const;
187097a140dSpatrick   bool legalizeBufferAtomic(MachineInstr &MI, MachineIRBuilder &B,
188097a140dSpatrick                             Intrinsic::ID IID) const;
189097a140dSpatrick 
19073471bf0Spatrick   bool legalizeBVHIntrinsic(MachineInstr &MI, MachineIRBuilder &B) const;
19173471bf0Spatrick 
192*d415bd75Srobert   bool legalizeFPTruncRound(MachineInstr &MI, MachineIRBuilder &B) const;
193*d415bd75Srobert 
194097a140dSpatrick   bool legalizeImageIntrinsic(
195097a140dSpatrick       MachineInstr &MI, MachineIRBuilder &B,
196097a140dSpatrick       GISelChangeObserver &Observer,
197097a140dSpatrick       const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr) const;
198097a140dSpatrick 
19973471bf0Spatrick   bool legalizeSBufferLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
200097a140dSpatrick 
201097a140dSpatrick   bool legalizeAtomicIncDec(MachineInstr &MI,  MachineIRBuilder &B,
202097a140dSpatrick                             bool IsInc) const;
203097a140dSpatrick 
204097a140dSpatrick   bool legalizeTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
205097a140dSpatrick                              MachineIRBuilder &B) const;
20673471bf0Spatrick   bool legalizeTrapEndpgm(MachineInstr &MI, MachineRegisterInfo &MRI,
20773471bf0Spatrick                           MachineIRBuilder &B) const;
20873471bf0Spatrick   bool legalizeTrapHsaQueuePtr(MachineInstr &MI, MachineRegisterInfo &MRI,
20973471bf0Spatrick                                MachineIRBuilder &B) const;
21073471bf0Spatrick   bool legalizeTrapHsa(MachineInstr &MI, MachineRegisterInfo &MRI,
21173471bf0Spatrick                        MachineIRBuilder &B) const;
212097a140dSpatrick   bool legalizeDebugTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
213097a140dSpatrick                                   MachineIRBuilder &B) const;
214097a140dSpatrick 
215097a140dSpatrick   bool legalizeIntrinsic(LegalizerHelper &Helper,
216097a140dSpatrick                          MachineInstr &MI) const override;
21709467b48Spatrick };
21809467b48Spatrick } // End llvm namespace.
21909467b48Spatrick #endif
220