1 ; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2 ; RUN: llc -march=r600 -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=CI -check-prefix=FUNC %s
4 ; FUNC-LABEL: @lds_atomic_xchg_ret_i32:
5 ; SI: S_LOAD_DWORD [[SPTR:s[0-9]+]],
6 ; SI: V_MOV_B32_e32 [[DATA:v[0-9]+]], 4
7 ; SI: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
8 ; SI: DS_WRXCHG_RTN_B32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]], 0x0, [M0]
9 ; SI: BUFFER_STORE_DWORD [[RESULT]],
11 define void @lds_atomic_xchg_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
12 %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst
13 store i32 %result, i32 addrspace(1)* %out, align 4
17 ; FUNC-LABEL: @lds_atomic_xchg_ret_i32_offset:
18 ; SI: DS_WRXCHG_RTN_B32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
20 define void @lds_atomic_xchg_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
21 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
22 %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst
23 store i32 %result, i32 addrspace(1)* %out, align 4
27 ; XXX - Is it really necessary to load 4 into VGPR?
28 ; FUNC-LABEL: @lds_atomic_add_ret_i32:
29 ; SI: S_LOAD_DWORD [[SPTR:s[0-9]+]],
30 ; SI: V_MOV_B32_e32 [[DATA:v[0-9]+]], 4
31 ; SI: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
32 ; SI: DS_ADD_RTN_U32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]], 0x0, [M0]
33 ; SI: BUFFER_STORE_DWORD [[RESULT]],
35 define void @lds_atomic_add_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
36 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst
37 store i32 %result, i32 addrspace(1)* %out, align 4
41 ; FUNC-LABEL: @lds_atomic_add_ret_i32_offset:
42 ; SI: DS_ADD_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
44 define void @lds_atomic_add_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
45 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
46 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
47 store i32 %result, i32 addrspace(1)* %out, align 4
51 ; FUNC-LABEL: @lds_atomic_add_ret_i32_bad_si_offset
52 ; SI: DS_ADD_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x0
53 ; CI: DS_ADD_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
55 define void @lds_atomic_add_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
57 %add = add i32 %sub, 4
58 %gep = getelementptr i32 addrspace(3)* %ptr, i32 %add
59 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
60 store i32 %result, i32 addrspace(1)* %out, align 4
64 ; FUNC-LABEL: @lds_atomic_inc_ret_i32:
65 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
66 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
67 ; SI: DS_INC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]], 0x0
69 define void @lds_atomic_inc_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
70 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst
71 store i32 %result, i32 addrspace(1)* %out, align 4
75 ; FUNC-LABEL: @lds_atomic_inc_ret_i32_offset:
76 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
77 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
78 ; SI: DS_INC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]], 0x10
80 define void @lds_atomic_inc_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
81 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
82 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
83 store i32 %result, i32 addrspace(1)* %out, align 4
87 ; FUNC-LABEL: @lds_atomic_inc_ret_i32_bad_si_offset:
88 ; SI: DS_INC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x0
89 ; CI: DS_INC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
91 define void @lds_atomic_inc_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
93 %add = add i32 %sub, 4
94 %gep = getelementptr i32 addrspace(3)* %ptr, i32 %add
95 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
96 store i32 %result, i32 addrspace(1)* %out, align 4
100 ; FUNC-LABEL: @lds_atomic_sub_ret_i32:
103 define void @lds_atomic_sub_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
104 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst
105 store i32 %result, i32 addrspace(1)* %out, align 4
109 ; FUNC-LABEL: @lds_atomic_sub_ret_i32_offset:
110 ; SI: DS_SUB_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
112 define void @lds_atomic_sub_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
113 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
114 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst
115 store i32 %result, i32 addrspace(1)* %out, align 4
119 ; FUNC-LABEL: @lds_atomic_dec_ret_i32:
120 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
121 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
122 ; SI: DS_DEC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]], 0x0
124 define void @lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
125 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst
126 store i32 %result, i32 addrspace(1)* %out, align 4
130 ; FUNC-LABEL: @lds_atomic_dec_ret_i32_offset:
131 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
132 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
133 ; SI: DS_DEC_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, [[NEGONE]], 0x10
135 define void @lds_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
136 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
137 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst
138 store i32 %result, i32 addrspace(1)* %out, align 4
142 ; FUNC-LABEL: @lds_atomic_and_ret_i32:
145 define void @lds_atomic_and_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
146 %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst
147 store i32 %result, i32 addrspace(1)* %out, align 4
151 ; FUNC-LABEL: @lds_atomic_and_ret_i32_offset:
152 ; SI: DS_AND_RTN_B32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
154 define void @lds_atomic_and_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
155 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
156 %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst
157 store i32 %result, i32 addrspace(1)* %out, align 4
161 ; FUNC-LABEL: @lds_atomic_or_ret_i32:
164 define void @lds_atomic_or_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
165 %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst
166 store i32 %result, i32 addrspace(1)* %out, align 4
170 ; FUNC-LABEL: @lds_atomic_or_ret_i32_offset:
171 ; SI: DS_OR_RTN_B32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
173 define void @lds_atomic_or_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
174 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
175 %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst
176 store i32 %result, i32 addrspace(1)* %out, align 4
180 ; FUNC-LABEL: @lds_atomic_xor_ret_i32:
183 define void @lds_atomic_xor_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
184 %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst
185 store i32 %result, i32 addrspace(1)* %out, align 4
189 ; FUNC-LABEL: @lds_atomic_xor_ret_i32_offset:
190 ; SI: DS_XOR_RTN_B32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
192 define void @lds_atomic_xor_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
193 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
194 %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst
195 store i32 %result, i32 addrspace(1)* %out, align 4
199 ; FIXME: There is no atomic nand instr
200 ; XFUNC-LABEL: @lds_atomic_nand_ret_i32:uction, so we somehow need to expand this.
201 ; define void @lds_atomic_nand_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
202 ; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst
203 ; store i32 %result, i32 addrspace(1)* %out, align 4
207 ; FUNC-LABEL: @lds_atomic_min_ret_i32:
210 define void @lds_atomic_min_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
211 %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst
212 store i32 %result, i32 addrspace(1)* %out, align 4
216 ; FUNC-LABEL: @lds_atomic_min_ret_i32_offset:
217 ; SI: DS_MIN_RTN_I32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
219 define void @lds_atomic_min_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
220 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
221 %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst
222 store i32 %result, i32 addrspace(1)* %out, align 4
226 ; FUNC-LABEL: @lds_atomic_max_ret_i32:
229 define void @lds_atomic_max_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
230 %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst
231 store i32 %result, i32 addrspace(1)* %out, align 4
235 ; FUNC-LABEL: @lds_atomic_max_ret_i32_offset:
236 ; SI: DS_MAX_RTN_I32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
238 define void @lds_atomic_max_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
239 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
240 %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst
241 store i32 %result, i32 addrspace(1)* %out, align 4
245 ; FUNC-LABEL: @lds_atomic_umin_ret_i32:
248 define void @lds_atomic_umin_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
249 %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst
250 store i32 %result, i32 addrspace(1)* %out, align 4
254 ; FUNC-LABEL: @lds_atomic_umin_ret_i32_offset:
255 ; SI: DS_MIN_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
257 define void @lds_atomic_umin_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
258 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
259 %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst
260 store i32 %result, i32 addrspace(1)* %out, align 4
264 ; FUNC-LABEL: @lds_atomic_umax_ret_i32:
267 define void @lds_atomic_umax_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
268 %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst
269 store i32 %result, i32 addrspace(1)* %out, align 4
273 ; FUNC-LABEL: @lds_atomic_umax_ret_i32_offset:
274 ; SI: DS_MAX_RTN_U32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
276 define void @lds_atomic_umax_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind {
277 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
278 %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst
279 store i32 %result, i32 addrspace(1)* %out, align 4
283 ; FUNC-LABEL: @lds_atomic_xchg_noret_i32:
284 ; SI: S_LOAD_DWORD [[SPTR:s[0-9]+]],
285 ; SI: V_MOV_B32_e32 [[DATA:v[0-9]+]], 4
286 ; SI: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
287 ; SI: DS_WRXCHG_RTN_B32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]], 0x0, [M0]
289 define void @lds_atomic_xchg_noret_i32(i32 addrspace(3)* %ptr) nounwind {
290 %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst
294 ; FUNC-LABEL: @lds_atomic_xchg_noret_i32_offset:
295 ; SI: DS_WRXCHG_RTN_B32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}, 0x10
297 define void @lds_atomic_xchg_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
298 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
299 %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst
303 ; XXX - Is it really necessary to load 4 into VGPR?
304 ; FUNC-LABEL: @lds_atomic_add_noret_i32:
305 ; SI: S_LOAD_DWORD [[SPTR:s[0-9]+]],
306 ; SI: V_MOV_B32_e32 [[DATA:v[0-9]+]], 4
307 ; SI: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
308 ; SI: DS_ADD_U32 [[VPTR]], [[DATA]], 0x0, [M0]
310 define void @lds_atomic_add_noret_i32(i32 addrspace(3)* %ptr) nounwind {
311 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst
315 ; FUNC-LABEL: @lds_atomic_add_noret_i32_offset:
316 ; SI: DS_ADD_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
318 define void @lds_atomic_add_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
319 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
320 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
324 ; FUNC-LABEL: @lds_atomic_add_noret_i32_bad_si_offset
325 ; SI: DS_ADD_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x0
326 ; CI: DS_ADD_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
328 define void @lds_atomic_add_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
329 %sub = sub i32 %a, %b
330 %add = add i32 %sub, 4
331 %gep = getelementptr i32 addrspace(3)* %ptr, i32 %add
332 %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst
336 ; FUNC-LABEL: @lds_atomic_inc_noret_i32:
337 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
338 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
339 ; SI: DS_INC_U32 v{{[0-9]+}}, [[NEGONE]], 0x0
341 define void @lds_atomic_inc_noret_i32(i32 addrspace(3)* %ptr) nounwind {
342 %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst
346 ; FUNC-LABEL: @lds_atomic_inc_noret_i32_offset:
347 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
348 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
349 ; SI: DS_INC_U32 v{{[0-9]+}}, [[NEGONE]], 0x10
351 define void @lds_atomic_inc_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
352 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
353 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
357 ; FUNC-LABEL: @lds_atomic_inc_noret_i32_bad_si_offset:
358 ; SI: DS_INC_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x0
359 ; CI: DS_INC_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
361 define void @lds_atomic_inc_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind {
362 %sub = sub i32 %a, %b
363 %add = add i32 %sub, 4
364 %gep = getelementptr i32 addrspace(3)* %ptr, i32 %add
365 %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst
369 ; FUNC-LABEL: @lds_atomic_sub_noret_i32:
372 define void @lds_atomic_sub_noret_i32(i32 addrspace(3)* %ptr) nounwind {
373 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst
377 ; FUNC-LABEL: @lds_atomic_sub_noret_i32_offset:
378 ; SI: DS_SUB_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
380 define void @lds_atomic_sub_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
381 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
382 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst
386 ; FUNC-LABEL: @lds_atomic_dec_noret_i32:
387 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
388 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
389 ; SI: DS_DEC_U32 v{{[0-9]+}}, [[NEGONE]], 0x0
391 define void @lds_atomic_dec_noret_i32(i32 addrspace(3)* %ptr) nounwind {
392 %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst
396 ; FUNC-LABEL: @lds_atomic_dec_noret_i32_offset:
397 ; SI: S_MOV_B32 [[SNEGONE:s[0-9]+]], -1
398 ; SI: V_MOV_B32_e32 [[NEGONE:v[0-9]+]], [[SNEGONE]]
399 ; SI: DS_DEC_U32 v{{[0-9]+}}, [[NEGONE]], 0x10
401 define void @lds_atomic_dec_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
402 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
403 %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst
407 ; FUNC-LABEL: @lds_atomic_and_noret_i32:
410 define void @lds_atomic_and_noret_i32(i32 addrspace(3)* %ptr) nounwind {
411 %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst
415 ; FUNC-LABEL: @lds_atomic_and_noret_i32_offset:
416 ; SI: DS_AND_B32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
418 define void @lds_atomic_and_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
419 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
420 %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst
424 ; FUNC-LABEL: @lds_atomic_or_noret_i32:
427 define void @lds_atomic_or_noret_i32(i32 addrspace(3)* %ptr) nounwind {
428 %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst
432 ; FUNC-LABEL: @lds_atomic_or_noret_i32_offset:
433 ; SI: DS_OR_B32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
435 define void @lds_atomic_or_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
436 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
437 %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst
441 ; FUNC-LABEL: @lds_atomic_xor_noret_i32:
444 define void @lds_atomic_xor_noret_i32(i32 addrspace(3)* %ptr) nounwind {
445 %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst
449 ; FUNC-LABEL: @lds_atomic_xor_noret_i32_offset:
450 ; SI: DS_XOR_B32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
452 define void @lds_atomic_xor_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
453 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
454 %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst
458 ; FIXME: There is no atomic nand instr
459 ; XFUNC-LABEL: @lds_atomic_nand_noret_i32:uction, so we somehow need to expand this.
460 ; define void @lds_atomic_nand_noret_i32(i32 addrspace(3)* %ptr) nounwind {
461 ; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst
465 ; FUNC-LABEL: @lds_atomic_min_noret_i32:
468 define void @lds_atomic_min_noret_i32(i32 addrspace(3)* %ptr) nounwind {
469 %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst
473 ; FUNC-LABEL: @lds_atomic_min_noret_i32_offset:
474 ; SI: DS_MIN_I32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
476 define void @lds_atomic_min_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
477 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
478 %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst
482 ; FUNC-LABEL: @lds_atomic_max_noret_i32:
485 define void @lds_atomic_max_noret_i32(i32 addrspace(3)* %ptr) nounwind {
486 %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst
490 ; FUNC-LABEL: @lds_atomic_max_noret_i32_offset:
491 ; SI: DS_MAX_I32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
493 define void @lds_atomic_max_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
494 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
495 %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst
499 ; FUNC-LABEL: @lds_atomic_umin_noret_i32:
502 define void @lds_atomic_umin_noret_i32(i32 addrspace(3)* %ptr) nounwind {
503 %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst
507 ; FUNC-LABEL: @lds_atomic_umin_noret_i32_offset:
508 ; SI: DS_MIN_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
510 define void @lds_atomic_umin_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
511 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
512 %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst
516 ; FUNC-LABEL: @lds_atomic_umax_noret_i32:
519 define void @lds_atomic_umax_noret_i32(i32 addrspace(3)* %ptr) nounwind {
520 %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst
524 ; FUNC-LABEL: @lds_atomic_umax_noret_i32_offset:
525 ; SI: DS_MAX_U32 v{{[0-9]+}}, v{{[0-9]+}}, 0x10
527 define void @lds_atomic_umax_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
528 %gep = getelementptr i32 addrspace(3)* %ptr, i32 4
529 %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst