1 ; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
3 ; FUNC-LABEL: @lds_atomic_xchg_ret_i64:
4 ; SI: DS_WRXCHG_RTN_B64
6 define void @lds_atomic_xchg_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
7 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
8 store i64 %result, i64 addrspace(1)* %out, align 8
12 ; FUNC-LABEL: @lds_atomic_xchg_ret_i64_offset:
13 ; SI: DS_WRXCHG_RTN_B64 {{.*}} 0x20
15 define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
16 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
17 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
18 store i64 %result, i64 addrspace(1)* %out, align 8
22 ; FUNC-LABEL: @lds_atomic_add_ret_i64:
25 define void @lds_atomic_add_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
26 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
27 store i64 %result, i64 addrspace(1)* %out, align 8
31 ; FUNC-LABEL: @lds_atomic_add_ret_i64_offset:
32 ; SI: S_LOAD_DWORD [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
33 ; SI: S_MOV_B64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, 9
34 ; SI-DAG: V_MOV_B32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
35 ; SI-DAG: V_MOV_B32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
36 ; SI-DAG: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[PTR]]
37 ; SI: DS_ADD_RTN_U64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}, 0x20, [M0]
38 ; SI: BUFFER_STORE_DWORDX2 [[RESULT]],
40 define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
41 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4
42 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
43 store i64 %result, i64 addrspace(1)* %out, align 8
47 ; FUNC-LABEL: @lds_atomic_inc_ret_i64:
50 define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
51 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
52 store i64 %result, i64 addrspace(1)* %out, align 8
56 ; FUNC-LABEL: @lds_atomic_inc_ret_i64_offset:
57 ; SI: DS_INC_RTN_U64 {{.*}} 0x20
59 define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
60 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
61 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
62 store i64 %result, i64 addrspace(1)* %out, align 8
66 ; FUNC-LABEL: @lds_atomic_sub_ret_i64:
69 define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
70 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
71 store i64 %result, i64 addrspace(1)* %out, align 8
75 ; FUNC-LABEL: @lds_atomic_sub_ret_i64_offset:
76 ; SI: DS_SUB_RTN_U64 {{.*}} 0x20
78 define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
79 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
80 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
81 store i64 %result, i64 addrspace(1)* %out, align 8
85 ; FUNC-LABEL: @lds_atomic_dec_ret_i64:
88 define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
89 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
90 store i64 %result, i64 addrspace(1)* %out, align 8
94 ; FUNC-LABEL: @lds_atomic_dec_ret_i64_offset:
95 ; SI: DS_DEC_RTN_U64 {{.*}} 0x20
97 define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
98 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
99 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
100 store i64 %result, i64 addrspace(1)* %out, align 8
104 ; FUNC-LABEL: @lds_atomic_and_ret_i64:
107 define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
108 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
109 store i64 %result, i64 addrspace(1)* %out, align 8
113 ; FUNC-LABEL: @lds_atomic_and_ret_i64_offset:
114 ; SI: DS_AND_RTN_B64 {{.*}} 0x20
116 define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
117 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
118 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
119 store i64 %result, i64 addrspace(1)* %out, align 8
123 ; FUNC-LABEL: @lds_atomic_or_ret_i64:
126 define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
127 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
128 store i64 %result, i64 addrspace(1)* %out, align 8
132 ; FUNC-LABEL: @lds_atomic_or_ret_i64_offset:
133 ; SI: DS_OR_RTN_B64 {{.*}} 0x20
135 define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
136 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
137 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
138 store i64 %result, i64 addrspace(1)* %out, align 8
142 ; FUNC-LABEL: @lds_atomic_xor_ret_i64:
145 define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
146 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
147 store i64 %result, i64 addrspace(1)* %out, align 8
151 ; FUNC-LABEL: @lds_atomic_xor_ret_i64_offset:
152 ; SI: DS_XOR_RTN_B64 {{.*}} 0x20
154 define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
155 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
156 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
157 store i64 %result, i64 addrspace(1)* %out, align 8
161 ; FIXME: There is no atomic nand instr
162 ; XFUNC-LABEL: @lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
163 ; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
164 ; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
165 ; store i64 %result, i64 addrspace(1)* %out, align 8
169 ; FUNC-LABEL: @lds_atomic_min_ret_i64:
172 define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
173 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
174 store i64 %result, i64 addrspace(1)* %out, align 8
178 ; FUNC-LABEL: @lds_atomic_min_ret_i64_offset:
179 ; SI: DS_MIN_RTN_I64 {{.*}} 0x20
181 define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
182 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
183 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
184 store i64 %result, i64 addrspace(1)* %out, align 8
188 ; FUNC-LABEL: @lds_atomic_max_ret_i64:
191 define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
192 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
193 store i64 %result, i64 addrspace(1)* %out, align 8
197 ; FUNC-LABEL: @lds_atomic_max_ret_i64_offset:
198 ; SI: DS_MAX_RTN_I64 {{.*}} 0x20
200 define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
201 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
202 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
203 store i64 %result, i64 addrspace(1)* %out, align 8
207 ; FUNC-LABEL: @lds_atomic_umin_ret_i64:
210 define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
211 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
212 store i64 %result, i64 addrspace(1)* %out, align 8
216 ; FUNC-LABEL: @lds_atomic_umin_ret_i64_offset:
217 ; SI: DS_MIN_RTN_U64 {{.*}} 0x20
219 define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
220 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
221 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
222 store i64 %result, i64 addrspace(1)* %out, align 8
226 ; FUNC-LABEL: @lds_atomic_umax_ret_i64:
229 define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
230 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
231 store i64 %result, i64 addrspace(1)* %out, align 8
235 ; FUNC-LABEL: @lds_atomic_umax_ret_i64_offset:
236 ; SI: DS_MAX_RTN_U64 {{.*}} 0x20
238 define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
239 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
240 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
241 store i64 %result, i64 addrspace(1)* %out, align 8