diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-06-11 18:08:54 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-06-11 18:08:54 +0000 |
commit | c9dbd0da7a127ace39c064f79fe0cbe19d4f4d77 (patch) | |
tree | 5bbad7ccdd0976dace0c23f48d8055ac66c1c245 /lib | |
parent | 481a071a8b79010c4ce40bea2f3589f514ca6e39 (diff) | |
download | llvm-c9dbd0da7a127ace39c064f79fe0cbe19d4f4d77.tar.gz llvm-c9dbd0da7a127ace39c064f79fe0cbe19d4f4d77.tar.bz2 llvm-c9dbd0da7a127ace39c064f79fe0cbe19d4f4d77.tar.xz |
R600/SI: Add common 64-bit LDS atomics
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210680 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/R600/AMDGPUInstructions.td | 8 | ||||
-rw-r--r-- | lib/Target/R600/SIInstrInfo.td | 8 | ||||
-rw-r--r-- | lib/Target/R600/SIInstructions.td | 44 |
3 files changed, 43 insertions, 17 deletions
diff --git a/lib/Target/R600/AMDGPUInstructions.td b/lib/Target/R600/AMDGPUInstructions.td index 0a103e8ab7..5afad6e474 100644 --- a/lib/Target/R600/AMDGPUInstructions.td +++ b/lib/Target/R600/AMDGPUInstructions.td @@ -265,6 +265,14 @@ def atomic_cmp_swap_32_local : AN->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; }]>; +def atomic_cmp_swap_64_local : + PatFrag<(ops node:$ptr, node:$cmp, node:$swap), + (atomic_cmp_swap node:$ptr, node:$cmp, node:$swap), [{ + AtomicSDNode *AN = cast<AtomicSDNode>(N); + return AN->getMemoryVT() == MVT::i64 && + AN->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; +}]>; + class Constants { int TWO_PI = 0x40c90fdb; diff --git a/lib/Target/R600/SIInstrInfo.td b/lib/Target/R600/SIInstrInfo.td index 61769f3dd7..bad5de4c47 100644 --- a/lib/Target/R600/SIInstrInfo.td +++ b/lib/Target/R600/SIInstrInfo.td @@ -485,7 +485,7 @@ class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A < op, (outs rc:$vdst), - (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, u16imm:$offset), + (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset), asm#" $vdst, $addr, $data0, $offset, [M0]", []> { @@ -524,7 +524,7 @@ class DS_1A0D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A < class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A < op, (outs rc:$vdst), - (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1, u16imm:$offset), + (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset), asm#" $vdst, $addr, $data0, $data1, $offset, [M0]", []> { let mayStore = 1; @@ -535,7 +535,7 @@ class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A < class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A < op, (outs), - (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1, u16imm:$offset), + (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset), asm#" $addr, $data0, $data1, $offset, [M0]", []> { let mayStore = 1; @@ -546,7 +546,7 @@ class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A < class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A < op, (outs), - (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, u16imm:$offset), + (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset), asm#" $addr, $data0, $offset, [M0]", []> { diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td index 0e65518b2a..5f42d09cc8 100644 --- a/lib/Target/R600/SIInstructions.td +++ b/lib/Target/R600/SIInstructions.td @@ -2282,6 +2282,20 @@ multiclass DSAtomicIncRetPat<DS inst, ValueType vt, PatFrag frag> { >; } +multiclass DSAtomicCmpXChg <DS inst, ValueType vt, PatFrag frag> { + def : Pat < + (frag (add i32:$ptr, (i32 IMM16bit:$offset)), vt:$cmp, vt:$swap), + (inst (i1 0), $ptr, $cmp, $swap, (as_i16imm $offset)) + >; + + def : Pat < + (frag i32:$ptr, vt:$cmp, vt:$swap), + (inst 0, $ptr, $cmp, $swap, 0) + >; +} + + +// 32-bit atomics. defm : DSAtomicIncRetPat<DS_INC_RTN_U32, i32, atomic_load_add_local>; defm : DSAtomicIncRetPat<DS_DEC_RTN_U32, i32, atomic_load_sub_local>; @@ -2296,21 +2310,25 @@ defm : DSAtomicRetPat<DS_MAX_RTN_I32, i32, atomic_load_max_local>; defm : DSAtomicRetPat<DS_MIN_RTN_U32, i32, atomic_load_umin_local>; defm : DSAtomicRetPat<DS_MAX_RTN_U32, i32, atomic_load_umax_local>; - -multiclass DSAtomicCmpXChg <DS inst, ValueType vt, PatFrag frag> { - def : Pat < - (frag (add i32:$ptr, (i32 IMM16bit:$offset)), vt:$cmp, vt:$swap), - (inst (i1 0), $ptr, $cmp, $swap, (as_i16imm $offset)) - >; - - def : Pat < - (frag i32:$ptr, vt:$cmp, vt:$swap), - (inst 0, $ptr, $cmp, $swap, 0) - >; -} - defm : DSAtomicCmpXChg<DS_CMPST_RTN_B32, i32, atomic_cmp_swap_32_local>; +// 64-bit atomics. +defm : DSAtomicIncRetPat<DS_INC_RTN_U64, i64, atomic_load_add_local>; +defm : DSAtomicIncRetPat<DS_DEC_RTN_U64, i64, atomic_load_sub_local>; + +defm : DSAtomicRetPat<DS_WRXCHG_RTN_B64, i64, atomic_swap_local>; +defm : DSAtomicRetPat<DS_ADD_RTN_U64, i64, atomic_load_add_local>; +defm : DSAtomicRetPat<DS_SUB_RTN_U64, i64, atomic_load_sub_local>; +defm : DSAtomicRetPat<DS_AND_RTN_B64, i64, atomic_load_and_local>; +defm : DSAtomicRetPat<DS_OR_RTN_B64, i64, atomic_load_or_local>; +defm : DSAtomicRetPat<DS_XOR_RTN_B64, i64, atomic_load_xor_local>; +defm : DSAtomicRetPat<DS_MIN_RTN_I64, i64, atomic_load_min_local>; +defm : DSAtomicRetPat<DS_MAX_RTN_I64, i64, atomic_load_max_local>; +defm : DSAtomicRetPat<DS_MIN_RTN_U64, i64, atomic_load_umin_local>; +defm : DSAtomicRetPat<DS_MAX_RTN_U64, i64, atomic_load_umax_local>; + +defm : DSAtomicCmpXChg<DS_CMPST_RTN_B64, i64, atomic_cmp_swap_64_local>; + //===----------------------------------------------------------------------===// // MUBUF Patterns |