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;
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
113e8d8bef9SDimitry Andric                       const ArgDescriptor *Arg,
114e8d8bef9SDimitry Andric                       const TargetRegisterClass *ArgRC, LLT ArgTy) const;
115e8d8bef9SDimitry Andric   bool loadInputValue(Register DstReg, MachineIRBuilder &B,
116e8d8bef9SDimitry Andric                       AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
11781ad6265SDimitry Andric 
11806c3fb27SDimitry Andric   bool legalizePointerAsRsrcIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
11906c3fb27SDimitry Andric                                    MachineIRBuilder &B) const;
12006c3fb27SDimitry Andric 
1210b57cec5SDimitry Andric   bool legalizePreloadedArgIntrin(
1220b57cec5SDimitry Andric     MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
1230b57cec5SDimitry Andric     AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
12481ad6265SDimitry Andric   bool legalizeWorkitemIDIntrinsic(
12581ad6265SDimitry Andric       MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
12681ad6265SDimitry Andric       unsigned Dim, AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
12781ad6265SDimitry Andric 
12881ad6265SDimitry Andric   Register getKernargParameterPtr(MachineIRBuilder &B, int64_t Offset) const;
12981ad6265SDimitry Andric   bool legalizeKernargMemParameter(MachineInstr &MI, MachineIRBuilder &B,
13081ad6265SDimitry Andric                                    uint64_t Offset,
13181ad6265SDimitry Andric                                    Align Alignment = Align(4)) const;
1320b57cec5SDimitry Andric 
133fe6060f1SDimitry Andric   bool legalizeUnsignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
1345ffd83dbSDimitry Andric                                MachineIRBuilder &B) const;
1355ffd83dbSDimitry Andric 
136fe6060f1SDimitry Andric   void legalizeUnsignedDIV_REM32Impl(MachineIRBuilder &B, Register DstDivReg,
137fe6060f1SDimitry Andric                                      Register DstRemReg, Register Num,
138fe6060f1SDimitry Andric                                      Register Den) const;
1395ffd83dbSDimitry Andric 
140fe6060f1SDimitry Andric   void legalizeUnsignedDIV_REM64Impl(MachineIRBuilder &B, Register DstDivReg,
141349cc55cSDimitry Andric                                      Register DstRemReg, Register Num,
142349cc55cSDimitry Andric                                      Register Den) const;
1435ffd83dbSDimitry Andric 
144fe6060f1SDimitry Andric   bool legalizeSignedDIV_REM(MachineInstr &MI, MachineRegisterInfo &MRI,
1455ffd83dbSDimitry Andric                              MachineIRBuilder &B) const;
1465ffd83dbSDimitry Andric 
1478bcb0991SDimitry Andric   bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
1488bcb0991SDimitry Andric                     MachineIRBuilder &B) const;
149480093f4SDimitry Andric   bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
150480093f4SDimitry Andric                       MachineIRBuilder &B) const;
151480093f4SDimitry Andric   bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
152480093f4SDimitry Andric                       MachineIRBuilder &B) const;
153480093f4SDimitry Andric   bool legalizeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
154480093f4SDimitry Andric                       MachineIRBuilder &B) const;
15506c3fb27SDimitry Andric   bool legalizeFFREXP(MachineInstr &MI, MachineRegisterInfo &MRI,
15606c3fb27SDimitry Andric                       MachineIRBuilder &B) const;
1578bcb0991SDimitry Andric   bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
1588bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
159e8d8bef9SDimitry Andric   bool legalizeFastUnsafeFDIV64(MachineInstr &MI, MachineRegisterInfo &MRI,
160e8d8bef9SDimitry Andric                                 MachineIRBuilder &B) const;
1618bcb0991SDimitry Andric   bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
1628bcb0991SDimitry Andric                               MachineIRBuilder &B) const;
1638bcb0991SDimitry Andric 
1645f757f3fSDimitry Andric   bool legalizeFSQRTF16(MachineInstr &MI, MachineRegisterInfo &MRI,
1655f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
1665f757f3fSDimitry Andric   bool legalizeFSQRTF32(MachineInstr &MI, MachineRegisterInfo &MRI,
1675f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
1685f757f3fSDimitry Andric   bool legalizeFSQRTF64(MachineInstr &MI, MachineRegisterInfo &MRI,
1695f757f3fSDimitry Andric                         MachineIRBuilder &B) const;
17006c3fb27SDimitry Andric   bool legalizeFSQRT(MachineInstr &MI, MachineRegisterInfo &MRI,
17106c3fb27SDimitry Andric                      MachineIRBuilder &B) const;
17206c3fb27SDimitry Andric 
173e8d8bef9SDimitry Andric   bool legalizeRsqClampIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
174e8d8bef9SDimitry Andric                                  MachineIRBuilder &B) const;
175e8d8bef9SDimitry Andric 
176e8d8bef9SDimitry Andric   bool legalizeDSAtomicFPIntrinsic(LegalizerHelper &Helper,
177e8d8bef9SDimitry Andric                                    MachineInstr &MI, Intrinsic::ID IID) const;
178e8d8bef9SDimitry Andric 
179e8d8bef9SDimitry Andric   bool getImplicitArgPtr(Register DstReg, MachineRegisterInfo &MRI,
180e8d8bef9SDimitry Andric                          MachineIRBuilder &B) const;
181e8d8bef9SDimitry Andric 
1820b57cec5SDimitry Andric   bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
1830b57cec5SDimitry Andric                               MachineIRBuilder &B) const;
184fcaf7f86SDimitry Andric 
185fcaf7f86SDimitry Andric   bool getLDSKernelId(Register DstReg, MachineRegisterInfo &MRI,
186fcaf7f86SDimitry Andric                       MachineIRBuilder &B) const;
187fcaf7f86SDimitry Andric 
188fcaf7f86SDimitry Andric   bool legalizeLDSKernelId(MachineInstr &MI, MachineRegisterInfo &MRI,
189fcaf7f86SDimitry Andric                            MachineIRBuilder &B) const;
190fcaf7f86SDimitry Andric 
1918bcb0991SDimitry Andric   bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
1928bcb0991SDimitry Andric                            MachineIRBuilder &B, unsigned AddrSpace) const;
1938bcb0991SDimitry Andric 
194fe6060f1SDimitry Andric   std::pair<Register, unsigned> splitBufferOffsets(MachineIRBuilder &B,
195fe6060f1SDimitry Andric                                                    Register OrigOffset) const;
1965ffd83dbSDimitry Andric 
1978bcb0991SDimitry Andric   Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
198e8d8bef9SDimitry Andric                           Register Reg, bool ImageStore = false) const;
1995ffd83dbSDimitry Andric   Register fixStoreSourceType(MachineIRBuilder &B, Register VData,
2005ffd83dbSDimitry Andric                               bool IsFormat) const;
2010b57cec5SDimitry Andric 
2025ffd83dbSDimitry Andric   bool legalizeBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
2035ffd83dbSDimitry Andric                            MachineIRBuilder &B, bool IsTyped,
2045ffd83dbSDimitry Andric                            bool IsFormat) const;
2055ffd83dbSDimitry Andric   bool legalizeBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
206e8d8bef9SDimitry Andric                           MachineIRBuilder &B, bool IsFormat,
207e8d8bef9SDimitry Andric                           bool IsTyped) const;
2085ffd83dbSDimitry Andric   bool legalizeBufferAtomic(MachineInstr &MI, MachineIRBuilder &B,
2095ffd83dbSDimitry Andric                             Intrinsic::ID IID) const;
2105ffd83dbSDimitry Andric 
211e8d8bef9SDimitry Andric   bool legalizeBVHIntrinsic(MachineInstr &MI, MachineIRBuilder &B) const;
212e8d8bef9SDimitry Andric 
21381ad6265SDimitry Andric   bool legalizeFPTruncRound(MachineInstr &MI, MachineIRBuilder &B) const;
2145f757f3fSDimitry Andric   bool legalizeStackSave(MachineInstr &MI, MachineIRBuilder &B) const;
215b3edf446SDimitry Andric   bool legalizeWaveID(MachineInstr &MI, MachineIRBuilder &B) const;
21681ad6265SDimitry Andric 
2175ffd83dbSDimitry Andric   bool legalizeImageIntrinsic(
2185ffd83dbSDimitry Andric       MachineInstr &MI, MachineIRBuilder &B,
2195ffd83dbSDimitry Andric       GISelChangeObserver &Observer,
2205ffd83dbSDimitry Andric       const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr) const;
2215ffd83dbSDimitry Andric 
222e8d8bef9SDimitry Andric   bool legalizeSBufferLoad(LegalizerHelper &Helper, MachineInstr &MI) const;
2235ffd83dbSDimitry Andric 
2245ffd83dbSDimitry Andric   bool legalizeTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
2255ffd83dbSDimitry Andric                              MachineIRBuilder &B) const;
226fe6060f1SDimitry Andric   bool legalizeTrapEndpgm(MachineInstr &MI, MachineRegisterInfo &MRI,
227fe6060f1SDimitry Andric                           MachineIRBuilder &B) const;
228fe6060f1SDimitry Andric   bool legalizeTrapHsaQueuePtr(MachineInstr &MI, MachineRegisterInfo &MRI,
229fe6060f1SDimitry Andric                                MachineIRBuilder &B) const;
230fe6060f1SDimitry Andric   bool legalizeTrapHsa(MachineInstr &MI, MachineRegisterInfo &MRI,
231fe6060f1SDimitry Andric                        MachineIRBuilder &B) const;
2325ffd83dbSDimitry Andric   bool legalizeDebugTrapIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
2335ffd83dbSDimitry Andric                                   MachineIRBuilder &B) const;
2345ffd83dbSDimitry Andric 
2355ffd83dbSDimitry Andric   bool legalizeIntrinsic(LegalizerHelper &Helper,
2365ffd83dbSDimitry Andric                          MachineInstr &MI) const override;
2370b57cec5SDimitry Andric };
2380b57cec5SDimitry Andric } // End llvm namespace.
2390b57cec5SDimitry Andric #endif
240