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