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