Revert 239644.
[oota-llvm.git] / test / CodeGen / R600 / local-atomics64.ll
1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=SI -check-prefix=GCN %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=VI -check-prefix=GCN %s
3
4 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64:
5 ; GCN: ds_wrxchg_rtn_b64
6 ; GCN: s_endpgm
7 define void @lds_atomic_xchg_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
8   %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
9   store i64 %result, i64 addrspace(1)* %out, align 8
10   ret void
11 }
12
13 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64_offset:
14 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
15 ; GCN: s_endpgm
16 define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
17   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
18   %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
19   store i64 %result, i64 addrspace(1)* %out, align 8
20   ret void
21 }
22
23 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64:
24 ; GCN: ds_add_rtn_u64
25 ; GCN: s_endpgm
26 define void @lds_atomic_add_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
27   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
28   store i64 %result, i64 addrspace(1)* %out, align 8
29   ret void
30 }
31
32 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64_offset:
33 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
34 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
35 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
36 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c
37 ; GCN-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
38 ; GCN: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
39 ; GCN: buffer_store_dwordx2 [[RESULT]],
40 ; GCN: s_endpgm
41 define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
42   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
43   %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
44   store i64 %result, i64 addrspace(1)* %out, align 8
45   ret void
46 }
47
48 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64:
49 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
50 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
51 ; GCN: ds_inc_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
52 ; GCN: buffer_store_dwordx2 [[RESULT]],
53 ; GCN: s_endpgm
54 define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
55   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
56   store i64 %result, i64 addrspace(1)* %out, align 8
57   ret void
58 }
59
60 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64_offset:
61 ; GCN: ds_inc_rtn_u64 {{.*}} offset:32
62 ; GCN: s_endpgm
63 define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
64   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
65   %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
66   store i64 %result, i64 addrspace(1)* %out, align 8
67   ret void
68 }
69
70 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64:
71 ; GCN: ds_sub_rtn_u64
72 ; GCN: s_endpgm
73 define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
74   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
75   store i64 %result, i64 addrspace(1)* %out, align 8
76   ret void
77 }
78
79 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64_offset:
80 ; GCN: ds_sub_rtn_u64 {{.*}} offset:32
81 ; GCN: s_endpgm
82 define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
83   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
84   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
85   store i64 %result, i64 addrspace(1)* %out, align 8
86   ret void
87 }
88
89 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64:
90 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
91 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
92 ; GCN: ds_dec_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
93 ; GCN: buffer_store_dwordx2 [[RESULT]],
94 ; GCN: s_endpgm
95 define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
96   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
97   store i64 %result, i64 addrspace(1)* %out, align 8
98   ret void
99 }
100
101 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
102 ; GCN: ds_dec_rtn_u64 {{.*}} offset:32
103 ; GCN: s_endpgm
104 define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
105   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
106   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
107   store i64 %result, i64 addrspace(1)* %out, align 8
108   ret void
109 }
110
111 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64:
112 ; GCN: ds_and_rtn_b64
113 ; GCN: s_endpgm
114 define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
115   %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
116   store i64 %result, i64 addrspace(1)* %out, align 8
117   ret void
118 }
119
120 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset:
121 ; GCN: ds_and_rtn_b64 {{.*}} offset:32
122 ; GCN: s_endpgm
123 define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
124   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
125   %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
126   store i64 %result, i64 addrspace(1)* %out, align 8
127   ret void
128 }
129
130 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64:
131 ; GCN: ds_or_rtn_b64
132 ; GCN: s_endpgm
133 define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
134   %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
135   store i64 %result, i64 addrspace(1)* %out, align 8
136   ret void
137 }
138
139 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset:
140 ; GCN: ds_or_rtn_b64 {{.*}} offset:32
141 ; GCN: s_endpgm
142 define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
143   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
144   %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
145   store i64 %result, i64 addrspace(1)* %out, align 8
146   ret void
147 }
148
149 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64:
150 ; GCN: ds_xor_rtn_b64
151 ; GCN: s_endpgm
152 define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
153   %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
154   store i64 %result, i64 addrspace(1)* %out, align 8
155   ret void
156 }
157
158 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset:
159 ; GCN: ds_xor_rtn_b64 {{.*}} offset:32
160 ; GCN: s_endpgm
161 define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
162   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
163   %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
164   store i64 %result, i64 addrspace(1)* %out, align 8
165   ret void
166 }
167
168 ; FIXME: There is no atomic nand instr
169 ; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
170 ; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
171 ;   %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
172 ;   store i64 %result, i64 addrspace(1)* %out, align 8
173 ;   ret void
174 ; }
175
176 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64:
177 ; GCN: ds_min_rtn_i64
178 ; GCN: s_endpgm
179 define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
180   %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
181   store i64 %result, i64 addrspace(1)* %out, align 8
182   ret void
183 }
184
185 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset:
186 ; GCN: ds_min_rtn_i64 {{.*}} offset:32
187 ; GCN: s_endpgm
188 define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
189   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
190   %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
191   store i64 %result, i64 addrspace(1)* %out, align 8
192   ret void
193 }
194
195 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64:
196 ; GCN: ds_max_rtn_i64
197 ; GCN: s_endpgm
198 define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
199   %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
200   store i64 %result, i64 addrspace(1)* %out, align 8
201   ret void
202 }
203
204 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset:
205 ; GCN: ds_max_rtn_i64 {{.*}} offset:32
206 ; GCN: s_endpgm
207 define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
208   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
209   %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
210   store i64 %result, i64 addrspace(1)* %out, align 8
211   ret void
212 }
213
214 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64:
215 ; GCN: ds_min_rtn_u64
216 ; GCN: s_endpgm
217 define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
218   %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
219   store i64 %result, i64 addrspace(1)* %out, align 8
220   ret void
221 }
222
223 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset:
224 ; GCN: ds_min_rtn_u64 {{.*}} offset:32
225 ; GCN: s_endpgm
226 define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
227   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
228   %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
229   store i64 %result, i64 addrspace(1)* %out, align 8
230   ret void
231 }
232
233 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64:
234 ; GCN: ds_max_rtn_u64
235 ; GCN: s_endpgm
236 define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
237   %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
238   store i64 %result, i64 addrspace(1)* %out, align 8
239   ret void
240 }
241
242 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset:
243 ; GCN: ds_max_rtn_u64 {{.*}} offset:32
244 ; GCN: s_endpgm
245 define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
246   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
247   %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
248   store i64 %result, i64 addrspace(1)* %out, align 8
249   ret void
250 }
251
252 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64:
253 ; GCN: ds_wrxchg_rtn_b64
254 ; GCN: s_endpgm
255 define void @lds_atomic_xchg_noret_i64(i64 addrspace(3)* %ptr) nounwind {
256   %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
257   ret void
258 }
259
260 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset:
261 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
262 ; GCN: s_endpgm
263 define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
264   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
265   %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
266   ret void
267 }
268
269 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64:
270 ; GCN: ds_add_u64
271 ; GCN: s_endpgm
272 define void @lds_atomic_add_noret_i64(i64 addrspace(3)* %ptr) nounwind {
273   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
274   ret void
275 }
276
277 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset:
278 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9
279 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x24
280 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
281 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
282 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
283 ; GCN: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
284 ; GCN: s_endpgm
285 define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
286   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
287   %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
288   ret void
289 }
290
291 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64:
292 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
293 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
294 ; GCN: ds_inc_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
295 ; GCN: s_endpgm
296 define void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind {
297   %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
298   ret void
299 }
300
301 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset:
302 ; GCN: ds_inc_u64 {{.*}} offset:32
303 ; GCN: s_endpgm
304 define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
305   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
306   %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
307   ret void
308 }
309
310 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64:
311 ; GCN: ds_sub_u64
312 ; GCN: s_endpgm
313 define void @lds_atomic_sub_noret_i64(i64 addrspace(3)* %ptr) nounwind {
314   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
315   ret void
316 }
317
318 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset:
319 ; GCN: ds_sub_u64 {{.*}} offset:32
320 ; GCN: s_endpgm
321 define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
322   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
323   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
324   ret void
325 }
326
327 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64:
328 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
329 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
330 ; GCN: ds_dec_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
331 ; GCN: s_endpgm
332 define void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind {
333   %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
334   ret void
335 }
336
337 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
338 ; GCN: ds_dec_u64 {{.*}} offset:32
339 ; GCN: s_endpgm
340 define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
341   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
342   %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
343   ret void
344 }
345
346 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64:
347 ; GCN: ds_and_b64
348 ; GCN: s_endpgm
349 define void @lds_atomic_and_noret_i64(i64 addrspace(3)* %ptr) nounwind {
350   %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
351   ret void
352 }
353
354 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset:
355 ; GCN: ds_and_b64 {{.*}} offset:32
356 ; GCN: s_endpgm
357 define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
358   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
359   %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
360   ret void
361 }
362
363 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64:
364 ; GCN: ds_or_b64
365 ; GCN: s_endpgm
366 define void @lds_atomic_or_noret_i64(i64 addrspace(3)* %ptr) nounwind {
367   %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
368   ret void
369 }
370
371 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset:
372 ; GCN: ds_or_b64 {{.*}} offset:32
373 ; GCN: s_endpgm
374 define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
375   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
376   %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
377   ret void
378 }
379
380 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64:
381 ; GCN: ds_xor_b64
382 ; GCN: s_endpgm
383 define void @lds_atomic_xor_noret_i64(i64 addrspace(3)* %ptr) nounwind {
384   %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
385   ret void
386 }
387
388 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset:
389 ; GCN: ds_xor_b64 {{.*}} offset:32
390 ; GCN: s_endpgm
391 define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
392   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
393   %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
394   ret void
395 }
396
397 ; FIXME: There is no atomic nand instr
398 ; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this.
399 ; define void @lds_atomic_nand_noret_i64(i64 addrspace(3)* %ptr) nounwind {
400 ;   %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
401 ;   ret void
402 ; }
403
404 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64:
405 ; GCN: ds_min_i64
406 ; GCN: s_endpgm
407 define void @lds_atomic_min_noret_i64(i64 addrspace(3)* %ptr) nounwind {
408   %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
409   ret void
410 }
411
412 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset:
413 ; GCN: ds_min_i64 {{.*}} offset:32
414 ; GCN: s_endpgm
415 define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
416   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
417   %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
418   ret void
419 }
420
421 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64:
422 ; GCN: ds_max_i64
423 ; GCN: s_endpgm
424 define void @lds_atomic_max_noret_i64(i64 addrspace(3)* %ptr) nounwind {
425   %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
426   ret void
427 }
428
429 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset:
430 ; GCN: ds_max_i64 {{.*}} offset:32
431 ; GCN: s_endpgm
432 define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
433   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
434   %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
435   ret void
436 }
437
438 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64:
439 ; GCN: ds_min_u64
440 ; GCN: s_endpgm
441 define void @lds_atomic_umin_noret_i64(i64 addrspace(3)* %ptr) nounwind {
442   %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
443   ret void
444 }
445
446 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset:
447 ; GCN: ds_min_u64 {{.*}} offset:32
448 ; GCN: s_endpgm
449 define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
450   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
451   %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
452   ret void
453 }
454
455 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64:
456 ; GCN: ds_max_u64
457 ; GCN: s_endpgm
458 define void @lds_atomic_umax_noret_i64(i64 addrspace(3)* %ptr) nounwind {
459   %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
460   ret void
461 }
462
463 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset:
464 ; GCN: ds_max_u64 {{.*}} offset:32
465 ; GCN: s_endpgm
466 define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
467   %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
468   %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
469   ret void
470 }