1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s
2 ; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=CIVI -check-prefix=GCN -check-prefix=FUNC %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=CIVI -check-prefix=GCN -check-prefix=FUNC %s
4 ; RUN: llc -march=r600 -mcpu=redwood -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
6 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i32:
8 ; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4
9 ; GCN: s_load_dword [[SPTR:s[0-9]+]],
10 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
11 ; GCN: ds_wrxchg_rtn_b32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]]
12 ; GCN: buffer_store_dword [[RESULT]],
14 define void @lds_atomic_xchg_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
15 %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst
16 store i32 %result, i32 addrspace(1)* %out, align 4
20 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i32_offset:
21 ; EG: LDS_WRXCHG_RET *
22 ; GCN: ds_wrxchg_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
24 define void @lds_atomic_xchg_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
25 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
26 %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst
27 store i32 %result, i32 addrspace(1)* %out, align 4
31 ; XXX - Is it really necessary to load 4 into VGPR?
32 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32:
34 ; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4
35 ; GCN: s_load_dword [[SPTR:s[0-9]+]],
36 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
37 ; GCN: ds_add_rtn_u32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]]
38 ; GCN: buffer_store_dword [[RESULT]],
40 define void @lds_atomic_add_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
41 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst
42 store i32 %result, i32 addrspace(1)* %out, align 4
46 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32_offset:
48 ; GCN: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
50 define void @lds_atomic_add_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
51 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
52 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
53 store i32 %result, i32 addrspace(1)* %out, align 4
57 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32_bad_si_offset:
59 ; SI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
60 ; CIVI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
62 define void @lds_atomic_add_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
64 %add = add i32 %sub, 4
65 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add
66 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
67 store i32 %result, i32 addrspace(1)* %out, align 4
71 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i32:
73 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
74 ; GCN: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]]
76 define void @lds_atomic_inc_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
77 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst
78 store i32 %result, i32 addrspace(1)* %out, align 4
82 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i32_offset:
84 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
85 ; GCN: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]] offset:16
87 define void @lds_atomic_inc_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
88 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
89 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
90 store i32 %result, i32 addrspace(1)* %out, align 4
94 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i32_bad_si_offset:
96 ; SI: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
97 ; CIVI: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
99 define void @lds_atomic_inc_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
100 %sub = sub i32 %a, %b
101 %add = add i32 %sub, 4
102 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add
103 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
104 store i32 %result, i32 addrspace(1)* %out, align 4
108 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i32:
110 ; GCN: ds_sub_rtn_u32
112 define void @lds_atomic_sub_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
113 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst
114 store i32 %result, i32 addrspace(1)* %out, align 4
118 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i32_offset:
120 ; GCN: ds_sub_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
122 define void @lds_atomic_sub_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
123 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
124 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst
125 store i32 %result, i32 addrspace(1)* %out, align 4
129 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i32:
131 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
132 ; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]]
134 define void @lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
135 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst
136 store i32 %result, i32 addrspace(1)* %out, align 4
140 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i32_offset:
142 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
143 ; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]] offset:16
145 define void @lds_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
146 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
147 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst
148 store i32 %result, i32 addrspace(1)* %out, align 4
152 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i32:
154 ; GCN: ds_and_rtn_b32
156 define void @lds_atomic_and_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
157 %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst
158 store i32 %result, i32 addrspace(1)* %out, align 4
162 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i32_offset:
164 ; GCN: ds_and_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
166 define void @lds_atomic_and_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
167 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
168 %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst
169 store i32 %result, i32 addrspace(1)* %out, align 4
173 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i32:
177 define void @lds_atomic_or_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
178 %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst
179 store i32 %result, i32 addrspace(1)* %out, align 4
183 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i32_offset:
185 ; GCN: ds_or_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
187 define void @lds_atomic_or_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
188 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
189 %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst
190 store i32 %result, i32 addrspace(1)* %out, align 4
194 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i32:
196 ; GCN: ds_xor_rtn_b32
198 define void @lds_atomic_xor_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
199 %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst
200 store i32 %result, i32 addrspace(1)* %out, align 4
204 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i32_offset:
206 ; GCN: ds_xor_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
208 define void @lds_atomic_xor_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
209 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
210 %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst
211 store i32 %result, i32 addrspace(1)* %out, align 4
215 ; FIXME: There is no atomic nand instr
216 ; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i32:uction, so we somehow need to expand this.
217 ; define void @lds_atomic_nand_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
218 ; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst
219 ; store i32 %result, i32 addrspace(1)* %out, align 4
223 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i32:
224 ; EG: LDS_MIN_INT_RET *
225 ; GCN: ds_min_rtn_i32
227 define void @lds_atomic_min_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
228 %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst
229 store i32 %result, i32 addrspace(1)* %out, align 4
233 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i32_offset:
234 ; EG: LDS_MIN_INT_RET *
235 ; GCN: ds_min_rtn_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
237 define void @lds_atomic_min_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
238 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
239 %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst
240 store i32 %result, i32 addrspace(1)* %out, align 4
244 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i32:
245 ; EG: LDS_MAX_INT_RET *
246 ; GCN: ds_max_rtn_i32
248 define void @lds_atomic_max_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
249 %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst
250 store i32 %result, i32 addrspace(1)* %out, align 4
254 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i32_offset:
255 ; EG: LDS_MAX_INT_RET *
256 ; GCN: ds_max_rtn_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
258 define void @lds_atomic_max_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
259 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
260 %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst
261 store i32 %result, i32 addrspace(1)* %out, align 4
265 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i32:
266 ; EG: LDS_MIN_UINT_RET *
267 ; GCN: ds_min_rtn_u32
269 define void @lds_atomic_umin_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
270 %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst
271 store i32 %result, i32 addrspace(1)* %out, align 4
275 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i32_offset:
276 ; EG: LDS_MIN_UINT_RET *
277 ; GCN: ds_min_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
279 define void @lds_atomic_umin_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
280 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
281 %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst
282 store i32 %result, i32 addrspace(1)* %out, align 4
286 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i32:
287 ; EG: LDS_MAX_UINT_RET *
288 ; GCN: ds_max_rtn_u32
290 define void @lds_atomic_umax_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
291 %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst
292 store i32 %result, i32 addrspace(1)* %out, align 4
296 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i32_offset:
297 ; EG: LDS_MAX_UINT_RET *
298 ; GCN: ds_max_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
300 define void @lds_atomic_umax_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
301 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
302 %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst
303 store i32 %result, i32 addrspace(1)* %out, align 4
307 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i32:
308 ; GCN: s_load_dword [[SPTR:s[0-9]+]],
309 ; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4
310 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
311 ; GCN: ds_wrxchg_rtn_b32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]]
313 define void @lds_atomic_xchg_noret_i32(i32 addrspace(3)* %ptr) nounwind {
314 %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst
318 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i32_offset:
319 ; GCN: ds_wrxchg_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16
321 define void @lds_atomic_xchg_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
322 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
323 %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst
327 ; XXX - Is it really necessary to load 4 into VGPR?
328 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32:
329 ; GCN: s_load_dword [[SPTR:s[0-9]+]],
330 ; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4
331 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
332 ; GCN: ds_add_u32 [[VPTR]], [[DATA]]
334 define void @lds_atomic_add_noret_i32(i32 addrspace(3)* %ptr) nounwind {
335 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst
339 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32_offset:
340 ; GCN: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
342 define void @lds_atomic_add_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
343 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
344 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
348 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32_bad_si_offset
349 ; SI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}}
350 ; CIVI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
352 define void @lds_atomic_add_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
353 %sub = sub i32 %a, %b
354 %add = add i32 %sub, 4
355 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add
356 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
360 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i32:
361 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
362 ; GCN: ds_inc_u32 v{{[0-9]+}}, [[NEGONE]]
364 define void @lds_atomic_inc_noret_i32(i32 addrspace(3)* %ptr) nounwind {
365 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst
369 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i32_offset:
370 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
371 ; GCN: ds_inc_u32 v{{[0-9]+}}, [[NEGONE]] offset:16
373 define void @lds_atomic_inc_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
374 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
375 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
379 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i32_bad_si_offset:
380 ; SI: ds_inc_u32 v{{[0-9]+}}, v{{[0-9]+}}
381 ; CIVI: ds_inc_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
383 define void @lds_atomic_inc_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
384 %sub = sub i32 %a, %b
385 %add = add i32 %sub, 4
386 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add
387 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
391 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i32:
394 define void @lds_atomic_sub_noret_i32(i32 addrspace(3)* %ptr) nounwind {
395 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst
399 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i32_offset:
400 ; GCN: ds_sub_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
402 define void @lds_atomic_sub_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
403 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
404 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst
408 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i32:
409 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
410 ; GCN: ds_dec_u32 v{{[0-9]+}}, [[NEGONE]]
412 define void @lds_atomic_dec_noret_i32(i32 addrspace(3)* %ptr) nounwind {
413 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst
417 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i32_offset:
418 ; GCN: v_mov_b32_e32 [[NEGONE:v[0-9]+]], -1
419 ; GCN: ds_dec_u32 v{{[0-9]+}}, [[NEGONE]] offset:16
421 define void @lds_atomic_dec_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
422 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
423 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst
427 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i32:
430 define void @lds_atomic_and_noret_i32(i32 addrspace(3)* %ptr) nounwind {
431 %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst
435 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i32_offset:
436 ; GCN: ds_and_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
438 define void @lds_atomic_and_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
439 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
440 %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst
444 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i32:
447 define void @lds_atomic_or_noret_i32(i32 addrspace(3)* %ptr) nounwind {
448 %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst
452 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i32_offset:
453 ; GCN: ds_or_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
455 define void @lds_atomic_or_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
456 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
457 %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst
461 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i32:
464 define void @lds_atomic_xor_noret_i32(i32 addrspace(3)* %ptr) nounwind {
465 %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst
469 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i32_offset:
470 ; GCN: ds_xor_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
472 define void @lds_atomic_xor_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
473 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
474 %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst
478 ; FIXME: There is no atomic nand instr
479 ; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i32:uction, so we somehow need to expand this.
480 ; define void @lds_atomic_nand_noret_i32(i32 addrspace(3)* %ptr) nounwind {
481 ; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst
485 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i32:
488 define void @lds_atomic_min_noret_i32(i32 addrspace(3)* %ptr) nounwind {
489 %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst
493 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i32_offset:
494 ; GCN: ds_min_i32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
496 define void @lds_atomic_min_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
497 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
498 %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst
502 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i32:
505 define void @lds_atomic_max_noret_i32(i32 addrspace(3)* %ptr) nounwind {
506 %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst
510 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i32_offset:
511 ; GCN: ds_max_i32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
513 define void @lds_atomic_max_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
514 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
515 %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst
519 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i32:
522 define void @lds_atomic_umin_noret_i32(i32 addrspace(3)* %ptr) nounwind {
523 %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst
527 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i32_offset:
528 ; GCN: ds_min_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
530 define void @lds_atomic_umin_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
531 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
532 %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst
536 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i32:
539 define void @lds_atomic_umax_noret_i32(i32 addrspace(3)* %ptr) nounwind {
540 %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst
544 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i32_offset:
545 ; GCN: ds_max_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16
547 define void @lds_atomic_umax_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
548 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
549 %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst