diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUInstructions.td | 3 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/DSInstructions.td | 21 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrInfo.td | 27 |
4 files changed, 54 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index 1ad10b36aed..db6a837c2bb 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -564,7 +564,9 @@ void AMDGPUDAGToDAGISel::Select(SDNode *N) { return; } case ISD::LOAD: - case ISD::STORE: { + case ISD::STORE: + case ISD::ATOMIC_LOAD: + case ISD::ATOMIC_STORE: { N = glueCopyToM0(N); break; } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td b/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td index d7acb6bf12d..c474a85595b 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td @@ -365,12 +365,15 @@ def az_extloadi8_local : LocalLoad <az_extloadi8>; def sextloadi8_local : LocalLoad <sextloadi8>; def az_extloadi16_local : LocalLoad <az_extloadi16>; def sextloadi16_local : LocalLoad <sextloadi16>; +def atomic_load_32_local : LocalLoad<atomic_load_32>; +def atomic_load_64_local : LocalLoad<atomic_load_64>; def store_local : LocalStore <store>; def truncstorei8_local : LocalStore <truncstorei8>; def truncstorei16_local : LocalStore <truncstorei16>; def store_local_hi16 : StoreHi16 <truncstorei16>, LocalAddress; def truncstorei8_local_hi16 : StoreHi16<truncstorei8>, LocalAddress; +def atomic_store_local : LocalStore <atomic_store>; def load_align8_local : Aligned8Bytes < (ops node:$ptr), (load_local node:$ptr) diff --git a/llvm/lib/Target/AMDGPU/DSInstructions.td b/llvm/lib/Target/AMDGPU/DSInstructions.td index 28887ea4a49..cdc6ab9412e 100644 --- a/llvm/lib/Target/AMDGPU/DSInstructions.td +++ b/llvm/lib/Target/AMDGPU/DSInstructions.td @@ -647,6 +647,8 @@ defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">; defm : DSReadPat_mc <DS_READ_U16, i32, "az_extloadi16_local">; defm : DSReadPat_mc <DS_READ_U16, i16, "load_local">; defm : DSReadPat_mc <DS_READ_B32, i32, "load_local">; +defm : DSReadPat_mc <DS_READ_B32, i32, "atomic_load_32_local">; +defm : DSReadPat_mc <DS_READ_B64, i64, "atomic_load_64_local">; let AddedComplexity = 100 in { @@ -683,11 +685,30 @@ multiclass DSWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> { } } +// Irritatingly, atomic_store reverses the order of operands from a +// normal store. +class DSAtomicWritePat <DS_Pseudo inst, ValueType vt, PatFrag frag> : GCNPat < + (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value), + (inst $ptr, $value, (as_i16imm $offset), (i1 0)) +>; + +multiclass DSAtomicWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> { + let OtherPredicates = [LDSRequiresM0Init] in { + def : DSAtomicWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>; + } + + let OtherPredicates = [NotLDSRequiresM0Init] in { + def : DSAtomicWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>; + } +} + defm : DSWritePat_mc <DS_WRITE_B8, i32, "truncstorei8_local">; defm : DSWritePat_mc <DS_WRITE_B16, i32, "truncstorei16_local">; defm : DSWritePat_mc <DS_WRITE_B8, i16, "truncstorei8_local">; defm : DSWritePat_mc <DS_WRITE_B16, i16, "store_local">; defm : DSWritePat_mc <DS_WRITE_B32, i32, "store_local">; +defm : DSAtomicWritePat_mc <DS_WRITE_B32, i32, "atomic_store_local">; +defm : DSAtomicWritePat_mc <DS_WRITE_B64, i64, "atomic_store_local">; let OtherPredicates = [D16PreservesUnusedBits] in { def : DSWritePat <DS_WRITE_B16_D16_HI, i32, store_local_hi16>; diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index d8ed8eb0849..a5fe25627f0 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -233,6 +233,10 @@ def AMDGPUld_glue : SDNode <"ISD::LOAD", SDTLoad, [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] >; +def AMDGPUatomic_ld_glue : SDNode <"ISD::ATOMIC_LOAD", SDTAtomicLoad, + [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] +>; + def unindexedload_glue : PatFrag <(ops node:$ptr), (AMDGPUld_glue node:$ptr), [{ return cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; }]>; @@ -241,6 +245,18 @@ def load_glue : PatFrag <(ops node:$ptr), (unindexedload_glue node:$ptr), [{ return cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; }]>; +def atomic_load_32_glue : PatFrag<(ops node:$ptr), + (AMDGPUatomic_ld_glue node:$ptr)> { + let IsAtomic = 1; + let MemoryVT = i32; +} + +def atomic_load_64_glue : PatFrag<(ops node:$ptr), + (AMDGPUatomic_ld_glue node:$ptr)> { + let IsAtomic = 1; + let MemoryVT = i64; +} + def extload_glue : PatFrag<(ops node:$ptr), (load_glue node:$ptr), [{ return cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD; }]>; @@ -286,12 +302,22 @@ def az_extloadi8_local_m0 : LoadFrag<az_extloadi8_glue>, LocalAddress; def az_extloadi16_local_m0 : LoadFrag<az_extloadi16_glue>, LocalAddress; def load_align8_local_m0 : LoadFrag <load_glue_align8>, LocalAddress; def load_align16_local_m0 : LoadFrag <load_glue_align16>, LocalAddress; +def atomic_load_32_local_m0 : LoadFrag<atomic_load_32_glue>, LocalAddress; +def atomic_load_64_local_m0 : LoadFrag<atomic_load_64_glue>, LocalAddress; def AMDGPUst_glue : SDNode <"ISD::STORE", SDTStore, [SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPInGlue] >; +def AMDGPUatomic_st_glue : SDNode <"ISD::ATOMIC_STORE", SDTAtomicStore, + [SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPInGlue] +>; + +def atomic_store_glue : PatFrag<(ops node:$ptr, node:$val), + (AMDGPUatomic_st_glue node:$ptr, node:$val)> { +} + def unindexedstore_glue : PatFrag<(ops node:$val, node:$ptr), (AMDGPUst_glue node:$val, node:$ptr), [{ return cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; @@ -328,6 +354,7 @@ def store_glue_align16 : Aligned16Bytes < def store_local_m0 : StoreFrag<store_glue>, LocalAddress; def truncstorei8_local_m0 : StoreFrag<truncstorei8_glue>, LocalAddress; def truncstorei16_local_m0 : StoreFrag<truncstorei16_glue>, LocalAddress; +def atomic_store_local_m0 : StoreFrag<AMDGPUatomic_st_glue>, LocalAddress; def store_align8_local_m0 : StoreFrag<store_glue_align8>, LocalAddress; def store_align16_local_m0 : StoreFrag<store_glue_align16>, LocalAddress; |