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