@@ -758,6 +758,95 @@ entry:
758758 ret void
759759}
760760
761+ ; CMP_SWAP
762+
763+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_offset:
764+ ; GCN: buffer_atomic_cmpswap v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
765+ define void @atomic_cmpxchg_i32_offset (i32 addrspace (1 )* %out , i32 %in , i32 %old ) {
766+ entry:
767+ %gep = getelementptr i32 , i32 addrspace (1 )* %out , i32 4
768+ %0 = cmpxchg volatile i32 addrspace (1 )* %gep , i32 %old , i32 %in seq_cst seq_cst
769+ ret void
770+ }
771+
772+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_offset:
773+ ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
774+ ; GCN: buffer_store_dword v[[RET]]
775+ define void @atomic_cmpxchg_i32_ret_offset (i32 addrspace (1 )* %out , i32 addrspace (1 )* %out2 , i32 %in , i32 %old ) {
776+ entry:
777+ %gep = getelementptr i32 , i32 addrspace (1 )* %out , i32 4
778+ %0 = cmpxchg volatile i32 addrspace (1 )* %gep , i32 %old , i32 %in seq_cst seq_cst
779+ %1 = extractvalue { i32 , i1 } %0 , 0
780+ store i32 %1 , i32 addrspace (1 )* %out2
781+ ret void
782+ }
783+
784+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset:
785+ ; SI: buffer_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
786+ define void @atomic_cmpxchg_i32_addr64_offset (i32 addrspace (1 )* %out , i32 %in , i64 %index , i32 %old ) {
787+ entry:
788+ %ptr = getelementptr i32 , i32 addrspace (1 )* %out , i64 %index
789+ %gep = getelementptr i32 , i32 addrspace (1 )* %ptr , i32 4
790+ %0 = cmpxchg volatile i32 addrspace (1 )* %gep , i32 %old , i32 %in seq_cst seq_cst
791+ ret void
792+ }
793+
794+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64_offset:
795+ ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
796+ ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
797+ ; GCN: buffer_store_dword v[[RET]]
798+ define void @atomic_cmpxchg_i32_ret_addr64_offset (i32 addrspace (1 )* %out , i32 addrspace (1 )* %out2 , i32 %in , i64 %index , i32 %old ) {
799+ entry:
800+ %ptr = getelementptr i32 , i32 addrspace (1 )* %out , i64 %index
801+ %gep = getelementptr i32 , i32 addrspace (1 )* %ptr , i32 4
802+ %0 = cmpxchg volatile i32 addrspace (1 )* %gep , i32 %old , i32 %in seq_cst seq_cst
803+ %1 = extractvalue { i32 , i1 } %0 , 0
804+ store i32 %1 , i32 addrspace (1 )* %out2
805+ ret void
806+ }
807+
808+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32:
809+ ; GCN: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
810+ define void @atomic_cmpxchg_i32 (i32 addrspace (1 )* %out , i32 %in , i32 %old ) {
811+ entry:
812+ %0 = cmpxchg volatile i32 addrspace (1 )* %out , i32 %old , i32 %in seq_cst seq_cst
813+ ret void
814+ }
815+
816+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret:
817+ ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
818+ ; GCN: buffer_store_dword v[[RET]]
819+ define void @atomic_cmpxchg_i32_ret (i32 addrspace (1 )* %out , i32 addrspace (1 )* %out2 , i32 %in , i32 %old ) {
820+ entry:
821+ %0 = cmpxchg volatile i32 addrspace (1 )* %out , i32 %old , i32 %in seq_cst seq_cst
822+ %1 = extractvalue { i32 , i1 } %0 , 0
823+ store i32 %1 , i32 addrspace (1 )* %out2
824+ ret void
825+ }
826+
827+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64:
828+ ; SI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
829+ ; VI: flat_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}}
830+ define void @atomic_cmpxchg_i32_addr64 (i32 addrspace (1 )* %out , i32 %in , i64 %index , i32 %old ) {
831+ entry:
832+ %ptr = getelementptr i32 , i32 addrspace (1 )* %out , i64 %index
833+ %0 = cmpxchg volatile i32 addrspace (1 )* %ptr , i32 %old , i32 %in seq_cst seq_cst
834+ ret void
835+ }
836+
837+ ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64:
838+ ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
839+ ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
840+ ; GCN: buffer_store_dword v[[RET]]
841+ define void @atomic_cmpxchg_i32_ret_addr64 (i32 addrspace (1 )* %out , i32 addrspace (1 )* %out2 , i32 %in , i64 %index , i32 %old ) {
842+ entry:
843+ %ptr = getelementptr i32 , i32 addrspace (1 )* %out , i64 %index
844+ %0 = cmpxchg volatile i32 addrspace (1 )* %ptr , i32 %old , i32 %in seq_cst seq_cst
845+ %1 = extractvalue { i32 , i1 } %0 , 0
846+ store i32 %1 , i32 addrspace (1 )* %out2
847+ ret void
848+ }
849+
761850; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
762851; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
763852define void @atomic_xor_i32_offset (i32 addrspace (1 )* %out , i32 %in ) {
0 commit comments