blob: 0ffa5e751b7d032f8d28e78bc8e8bc734fb5b8c1 [file] [log] [blame]
Marek Olsakfa6607d2015-02-11 14:26:46 +00001; 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
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +00003
Tom Stellard79243d92014-10-01 17:15:17 +00004; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +00005; GCN: ds_wrxchg_rtn_b64
6; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +00007define 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
Tom Stellard79243d92014-10-01 17:15:17 +000013; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +000014; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
15; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000016define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +000017 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000018 %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
Tom Stellard79243d92014-10-01 17:15:17 +000023; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +000024; GCN: ds_add_rtn_u64
25; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000026define 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
Tom Stellard79243d92014-10-01 17:15:17 +000032; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +000033; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
34; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
Tom Stellard326d6ec2014-11-05 14:50:53 +000035; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
Marek Olsakfa6607d2015-02-11 14:26:46 +000036; 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]]
Tom Stellardeb05c612015-02-26 17:08:43 +000038; GCN: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
Marek Olsakfa6607d2015-02-11 14:26:46 +000039; GCN: buffer_store_dwordx2 [[RESULT]],
40; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000041define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +000042 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000043 %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
Tom Stellard79243d92014-10-01 17:15:17 +000048; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +000049; 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
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000054define 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
Tom Stellard79243d92014-10-01 17:15:17 +000060; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +000061; GCN: ds_inc_rtn_u64 {{.*}} offset:32
62; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000063define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +000064 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000065 %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
Tom Stellard79243d92014-10-01 17:15:17 +000070; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +000071; GCN: ds_sub_rtn_u64
72; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000073define 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
Tom Stellard79243d92014-10-01 17:15:17 +000079; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +000080; GCN: ds_sub_rtn_u64 {{.*}} offset:32
81; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000082define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +000083 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000084 %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
Tom Stellard79243d92014-10-01 17:15:17 +000089; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +000090; 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
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000095define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000101; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000102; GCN: ds_dec_rtn_u64 {{.*}} offset:32
103; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000104define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000105 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000106 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000111; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000112; GCN: ds_and_rtn_b64
113; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000114define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000120; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000121; GCN: ds_and_rtn_b64 {{.*}} offset:32
122; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000123define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000124 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000125 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000130; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000131; GCN: ds_or_rtn_b64
132; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000133define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000139; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000140; GCN: ds_or_rtn_b64 {{.*}} offset:32
141; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000142define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000143 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000144 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000149; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000150; GCN: ds_xor_rtn_b64
151; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000152define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000158; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000159; GCN: ds_xor_rtn_b64 {{.*}} offset:32
160; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000161define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000162 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000163 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000169; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000170; 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
Tom Stellard79243d92014-10-01 17:15:17 +0000176; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000177; GCN: ds_min_rtn_i64
178; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000179define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000185; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000186; GCN: ds_min_rtn_i64 {{.*}} offset:32
187; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000188define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000189 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000190 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000195; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000196; GCN: ds_max_rtn_i64
197; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000198define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000204; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000205; GCN: ds_max_rtn_i64 {{.*}} offset:32
206; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000207define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000208 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000209 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000214; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000215; GCN: ds_min_rtn_u64
216; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000217define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000223; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000224; GCN: ds_min_rtn_u64 {{.*}} offset:32
225; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000226define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000227 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000228 %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
Tom Stellard79243d92014-10-01 17:15:17 +0000233; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000234; GCN: ds_max_rtn_u64
235; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000236define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000242; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000243; GCN: ds_max_rtn_u64 {{.*}} offset:32
244; GCN: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000245define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000246 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000247 %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}
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000251
Tom Stellard79243d92014-10-01 17:15:17 +0000252; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000253; GCN: ds_wrxchg_rtn_b64
254; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000255define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000260; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000261; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32
262; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000263define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000264 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000265 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
266 ret void
267}
268
Tom Stellard79243d92014-10-01 17:15:17 +0000269; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000270; GCN: ds_add_u64
271; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000272define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000277; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000278; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9
Marek Olsakfa6607d2015-02-11 14:26:46 +0000279; 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]]
Tom Stellardeb05c612015-02-26 17:08:43 +0000283; GCN: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32
Marek Olsakfa6607d2015-02-11 14:26:46 +0000284; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000285define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000286 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000287 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
288 ret void
289}
290
Tom Stellard79243d92014-10-01 17:15:17 +0000291; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000292; 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
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000296define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000301; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000302; GCN: ds_inc_u64 {{.*}} offset:32
303; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000304define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000305 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000306 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
307 ret void
308}
309
Tom Stellard79243d92014-10-01 17:15:17 +0000310; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000311; GCN: ds_sub_u64
312; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000313define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000318; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000319; GCN: ds_sub_u64 {{.*}} offset:32
320; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000321define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000322 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000323 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
324 ret void
325}
326
Tom Stellard79243d92014-10-01 17:15:17 +0000327; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000328; 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
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000332define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000337; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000338; GCN: ds_dec_u64 {{.*}} offset:32
339; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000340define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000341 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000342 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
343 ret void
344}
345
Tom Stellard79243d92014-10-01 17:15:17 +0000346; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000347; GCN: ds_and_b64
348; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000349define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000354; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000355; GCN: ds_and_b64 {{.*}} offset:32
356; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000357define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000358 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000359 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
360 ret void
361}
362
Tom Stellard79243d92014-10-01 17:15:17 +0000363; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000364; GCN: ds_or_b64
365; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000366define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000371; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000372; GCN: ds_or_b64 {{.*}} offset:32
373; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000374define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000375 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000376 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
377 ret void
378}
379
Tom Stellard79243d92014-10-01 17:15:17 +0000380; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000381; GCN: ds_xor_b64
382; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000383define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000388; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000389; GCN: ds_xor_b64 {{.*}} offset:32
390; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000391define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000392 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000393 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
394 ret void
395}
396
397; FIXME: There is no atomic nand instr
Tom Stellard79243d92014-10-01 17:15:17 +0000398; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this.
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000399; 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
Tom Stellard79243d92014-10-01 17:15:17 +0000404; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000405; GCN: ds_min_i64
406; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000407define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000412; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000413; GCN: ds_min_i64 {{.*}} offset:32
414; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000415define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000416 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000417 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
418 ret void
419}
420
Tom Stellard79243d92014-10-01 17:15:17 +0000421; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000422; GCN: ds_max_i64
423; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000424define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000429; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000430; GCN: ds_max_i64 {{.*}} offset:32
431; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000432define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000433 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000434 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
435 ret void
436}
437
Tom Stellard79243d92014-10-01 17:15:17 +0000438; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000439; GCN: ds_min_u64
440; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000441define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000446; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000447; GCN: ds_min_u64 {{.*}} offset:32
448; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000449define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000450 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000451 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
452 ret void
453}
454
Tom Stellard79243d92014-10-01 17:15:17 +0000455; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000456; GCN: ds_max_u64
457; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000458define 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
Tom Stellard79243d92014-10-01 17:15:17 +0000463; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset:
Marek Olsakfa6607d2015-02-11 14:26:46 +0000464; GCN: ds_max_u64 {{.*}} offset:32
465; GCN: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000466define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
David Blaikie79e6c742015-02-27 19:29:02 +0000467 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000468 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
469 ret void
470}