diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
commit | b60736ec1405bb0a8dd40989f67ef4c93da068ab (patch) | |
tree | 5c43fbb7c9fc45f0f87e0e6795a86267dbd12f9d /llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h | |
parent | cfca06d7963fa0909f90483b42a6d7d194d01e08 (diff) | |
download | src-b60736ec1405bb0a8dd40989f67ef4c93da068ab.tar.gz src-b60736ec1405bb0a8dd40989f67ef4c93da068ab.zip |
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h index 1fe80958917d..d70f18098cd7 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h @@ -13,13 +13,11 @@ #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H #define LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H -#include "AMDGPU.h" -#include "AMDGPUArgumentUsageInfo.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/CodeGen/Register.h" #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" +#include "llvm/CodeGen/Register.h" #include "llvm/IR/InstrTypes.h" +#include "llvm/IR/Intrinsics.h" +#include "llvm/IR/IntrinsicsAMDGPU.h" namespace { #define GET_GLOBALISEL_PREDICATE_BITSET @@ -37,6 +35,7 @@ struct ImageDimIntrinsicInfo; class AMDGPUInstrInfo; class AMDGPURegisterBankInfo; +class AMDGPUTargetMachine; class GCNSubtarget; class MachineInstr; class MachineIRBuilder; @@ -47,9 +46,10 @@ class SIInstrInfo; class SIMachineFunctionInfo; class SIRegisterInfo; -class AMDGPUInstructionSelector : public InstructionSelector { +class AMDGPUInstructionSelector final : public InstructionSelector { private: MachineRegisterInfo *MRI; + const GCNSubtarget *Subtarget; public: AMDGPUInstructionSelector(const GCNSubtarget &STI, @@ -71,6 +71,8 @@ private: GEPInfo(const MachineInstr &GEP) : GEP(GEP), Imm(0) { } }; + bool isSGPR(Register Reg) const; + bool isInstrUniform(const MachineInstr &MI) const; bool isVCC(Register Reg, const MachineRegisterInfo &MRI) const; @@ -105,15 +107,20 @@ private: bool selectG_INSERT(MachineInstr &I) const; bool selectInterpP1F16(MachineInstr &MI) const; + bool selectWritelane(MachineInstr &MI) const; bool selectDivScale(MachineInstr &MI) const; bool selectIntrinsicIcmp(MachineInstr &MI) const; bool selectBallot(MachineInstr &I) const; + bool selectRelocConstant(MachineInstr &I) const; + bool selectGroupStaticSize(MachineInstr &I) const; + bool selectReturnAddress(MachineInstr &I) const; bool selectG_INTRINSIC(MachineInstr &I) const; bool selectEndCfIntrinsic(MachineInstr &MI) const; bool selectDSOrderedIntrinsic(MachineInstr &MI, Intrinsic::ID IID) const; bool selectDSGWSIntrinsic(MachineInstr &MI, Intrinsic::ID IID) const; bool selectDSAppendConsume(MachineInstr &MI, bool IsAppend) const; + bool selectSBarrier(MachineInstr &MI) const; bool selectImageIntrinsic(MachineInstr &MI, const AMDGPU::ImageDimIntrinsicInfo *Intr) const; @@ -126,19 +133,21 @@ private: bool selectSMRD(MachineInstr &I, ArrayRef<GEPInfo> AddrInfo) const; void initM0(MachineInstr &I) const; - bool selectG_LOAD_ATOMICRMW(MachineInstr &I) const; + bool selectG_LOAD_STORE_ATOMICRMW(MachineInstr &I) const; bool selectG_AMDGPU_ATOMIC_CMPXCHG(MachineInstr &I) const; - bool selectG_STORE(MachineInstr &I) const; bool selectG_SELECT(MachineInstr &I) const; bool selectG_BRCOND(MachineInstr &I) const; - bool selectG_FRAME_INDEX_GLOBAL_VALUE(MachineInstr &I) const; + bool selectG_GLOBAL_VALUE(MachineInstr &I) const; bool selectG_PTRMASK(MachineInstr &I) const; bool selectG_EXTRACT_VECTOR_ELT(MachineInstr &I) const; bool selectG_INSERT_VECTOR_ELT(MachineInstr &I) const; bool selectG_SHUFFLE_VECTOR(MachineInstr &I) const; + bool selectAMDGPU_BUFFER_ATOMIC_FADD(MachineInstr &I) const; + bool selectGlobalAtomicFaddIntrinsic(MachineInstr &I) const; + bool selectBVHIntrinsic(MachineInstr &I) const; - std::pair<Register, unsigned> - selectVOP3ModsImpl(MachineOperand &Root) const; + std::pair<Register, unsigned> selectVOP3ModsImpl(MachineOperand &Root, + bool AllowAbs = true) const; InstructionSelector::ComplexRendererFns selectVCSRC(MachineOperand &Root) const; @@ -149,9 +158,13 @@ private: InstructionSelector::ComplexRendererFns selectVOP3Mods0(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns + selectVOP3BMods0(MachineOperand &Root) const; + InstructionSelector::ComplexRendererFns selectVOP3OMods(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns selectVOP3Mods(MachineOperand &Root) const; + InstructionSelector::ComplexRendererFns + selectVOP3BMods(MachineOperand &Root) const; ComplexRendererFns selectVOP3NoMods(MachineOperand &Root) const; @@ -175,32 +188,45 @@ private: selectSmrdSgpr(MachineOperand &Root) const; template <bool Signed> - InstructionSelector::ComplexRendererFns + std::pair<Register, int> selectFlatOffsetImpl(MachineOperand &Root) const; + InstructionSelector::ComplexRendererFns selectFlatOffset(MachineOperand &Root) const; - InstructionSelector::ComplexRendererFns selectFlatOffsetSigned(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns + selectGlobalSAddr(MachineOperand &Root) const; + + InstructionSelector::ComplexRendererFns + selectScratchSAddr(MachineOperand &Root) const; + + InstructionSelector::ComplexRendererFns selectMUBUFScratchOffen(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns selectMUBUFScratchOffset(MachineOperand &Root) const; - bool isDSOffsetLegal(Register Base, int64_t Offset, - unsigned OffsetBits) const; + bool isDSOffsetLegal(Register Base, int64_t Offset) const; + bool isDSOffset2Legal(Register Base, int64_t Offset0, int64_t Offset1, + unsigned Size) const; std::pair<Register, unsigned> selectDS1Addr1OffsetImpl(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns selectDS1Addr1Offset(MachineOperand &Root) const; - std::pair<Register, unsigned> - selectDS64Bit4ByteAlignedImpl(MachineOperand &Root) const; InstructionSelector::ComplexRendererFns selectDS64Bit4ByteAligned(MachineOperand &Root) const; + InstructionSelector::ComplexRendererFns + selectDS128Bit8ByteAligned(MachineOperand &Root) const; + + std::pair<Register, unsigned> selectDSReadWrite2Impl(MachineOperand &Root, + unsigned size) const; + InstructionSelector::ComplexRendererFns + selectDSReadWrite2(MachineOperand &Root, unsigned size) const; + std::pair<Register, int64_t> getPtrBaseWithConstantOffset(Register Root, const MachineRegisterInfo &MRI) const; @@ -284,6 +310,8 @@ private: int OpIdx) const; void renderExtractSWZ(MachineInstrBuilder &MIB, const MachineInstr &MI, int OpIdx) const; + void renderFrameIndex(MachineInstrBuilder &MIB, const MachineInstr &MI, + int OpIdx) const; bool isInlineImmediate16(int64_t Imm) const; bool isInlineImmediate32(int64_t Imm) const; |