blob: cc9d3a72972e3be43867c16952f9795458d6d19e [file] [log] [blame]
Tom Stellard49f8bfd2015-01-06 18:00:21 +00001; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=SI %s
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +00002
Tom Stellard79243d92014-10-01 17:15:17 +00003; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +00004; SI: ds_wrxchg_rtn_b64
5; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +00006define 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
9 ret void
10}
11
Tom Stellard79243d92014-10-01 17:15:17 +000012; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +000013; SI: ds_wrxchg_rtn_b64 {{.*}} offset:32
14; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000015define 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
19 ret void
20}
21
Tom Stellard79243d92014-10-01 17:15:17 +000022; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000023; SI: ds_add_rtn_u64
24; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000025define 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
28 ret void
29}
30
Tom Stellard79243d92014-10-01 17:15:17 +000031; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64_offset:
Tom Stellard83f0bce2015-01-29 16:55:25 +000032; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
33; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
Tom Stellard326d6ec2014-11-05 14:50:53 +000034; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
Tom Stellard326d6ec2014-11-05 14:50:53 +000035; SI-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
36; SI: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 [M0]
37; SI: buffer_store_dwordx2 [[RESULT]],
38; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000039define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
40 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4
41 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
42 store i64 %result, i64 addrspace(1)* %out, align 8
43 ret void
44}
45
Tom Stellard79243d92014-10-01 17:15:17 +000046; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64:
Tom Stellard4842c052015-01-07 20:27:25 +000047; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
48; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
Tom Stellard326d6ec2014-11-05 14:50:53 +000049; SI: ds_inc_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
50; SI: buffer_store_dwordx2 [[RESULT]],
51; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000052define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
53 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
54 store i64 %result, i64 addrspace(1)* %out, align 8
55 ret void
56}
57
Tom Stellard79243d92014-10-01 17:15:17 +000058; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +000059; SI: ds_inc_rtn_u64 {{.*}} offset:32
60; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000061define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
62 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
63 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
64 store i64 %result, i64 addrspace(1)* %out, align 8
65 ret void
66}
67
Tom Stellard79243d92014-10-01 17:15:17 +000068; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000069; SI: ds_sub_rtn_u64
70; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000071define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
72 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
73 store i64 %result, i64 addrspace(1)* %out, align 8
74 ret void
75}
76
Tom Stellard79243d92014-10-01 17:15:17 +000077; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +000078; SI: ds_sub_rtn_u64 {{.*}} offset:32
79; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000080define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
81 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
82 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
83 store i64 %result, i64 addrspace(1)* %out, align 8
84 ret void
85}
86
Tom Stellard79243d92014-10-01 17:15:17 +000087; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64:
Tom Stellard4842c052015-01-07 20:27:25 +000088; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
89; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
Tom Stellard326d6ec2014-11-05 14:50:53 +000090; SI: ds_dec_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
91; SI: buffer_store_dwordx2 [[RESULT]],
92; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000093define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
94 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
95 store i64 %result, i64 addrspace(1)* %out, align 8
96 ret void
97}
98
Tom Stellard79243d92014-10-01 17:15:17 +000099; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000100; SI: ds_dec_rtn_u64 {{.*}} offset:32
101; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000102define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
103 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
104 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
105 store i64 %result, i64 addrspace(1)* %out, align 8
106 ret void
107}
108
Tom Stellard79243d92014-10-01 17:15:17 +0000109; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000110; SI: ds_and_rtn_b64
111; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000112define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
113 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
114 store i64 %result, i64 addrspace(1)* %out, align 8
115 ret void
116}
117
Tom Stellard79243d92014-10-01 17:15:17 +0000118; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000119; SI: ds_and_rtn_b64 {{.*}} offset:32
120; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000121define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
122 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
123 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
124 store i64 %result, i64 addrspace(1)* %out, align 8
125 ret void
126}
127
Tom Stellard79243d92014-10-01 17:15:17 +0000128; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000129; SI: ds_or_rtn_b64
130; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000131define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
132 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
133 store i64 %result, i64 addrspace(1)* %out, align 8
134 ret void
135}
136
Tom Stellard79243d92014-10-01 17:15:17 +0000137; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000138; SI: ds_or_rtn_b64 {{.*}} offset:32
139; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000140define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
141 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
142 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
143 store i64 %result, i64 addrspace(1)* %out, align 8
144 ret void
145}
146
Tom Stellard79243d92014-10-01 17:15:17 +0000147; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000148; SI: ds_xor_rtn_b64
149; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000150define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
151 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
152 store i64 %result, i64 addrspace(1)* %out, align 8
153 ret void
154}
155
Tom Stellard79243d92014-10-01 17:15:17 +0000156; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000157; SI: ds_xor_rtn_b64 {{.*}} offset:32
158; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000159define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
160 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
161 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
162 store i64 %result, i64 addrspace(1)* %out, align 8
163 ret void
164}
165
166; FIXME: There is no atomic nand instr
Tom Stellard79243d92014-10-01 17:15:17 +0000167; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000168; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
169; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
170; store i64 %result, i64 addrspace(1)* %out, align 8
171; ret void
172; }
173
Tom Stellard79243d92014-10-01 17:15:17 +0000174; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000175; SI: ds_min_rtn_i64
176; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000177define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
178 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
179 store i64 %result, i64 addrspace(1)* %out, align 8
180 ret void
181}
182
Tom Stellard79243d92014-10-01 17:15:17 +0000183; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000184; SI: ds_min_rtn_i64 {{.*}} offset:32
185; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000186define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
187 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
188 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
189 store i64 %result, i64 addrspace(1)* %out, align 8
190 ret void
191}
192
Tom Stellard79243d92014-10-01 17:15:17 +0000193; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000194; SI: ds_max_rtn_i64
195; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000196define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
197 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
198 store i64 %result, i64 addrspace(1)* %out, align 8
199 ret void
200}
201
Tom Stellard79243d92014-10-01 17:15:17 +0000202; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000203; SI: ds_max_rtn_i64 {{.*}} offset:32
204; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000205define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
206 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
207 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
208 store i64 %result, i64 addrspace(1)* %out, align 8
209 ret void
210}
211
Tom Stellard79243d92014-10-01 17:15:17 +0000212; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000213; SI: ds_min_rtn_u64
214; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000215define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
216 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
217 store i64 %result, i64 addrspace(1)* %out, align 8
218 ret void
219}
220
Tom Stellard79243d92014-10-01 17:15:17 +0000221; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000222; SI: ds_min_rtn_u64 {{.*}} offset:32
223; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000224define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
225 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
226 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
227 store i64 %result, i64 addrspace(1)* %out, align 8
228 ret void
229}
230
Tom Stellard79243d92014-10-01 17:15:17 +0000231; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000232; SI: ds_max_rtn_u64
233; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000234define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
235 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
236 store i64 %result, i64 addrspace(1)* %out, align 8
237 ret void
238}
239
Tom Stellard79243d92014-10-01 17:15:17 +0000240; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000241; SI: ds_max_rtn_u64 {{.*}} offset:32
242; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000243define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
244 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
245 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
246 store i64 %result, i64 addrspace(1)* %out, align 8
247 ret void
248}
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000249
Tom Stellard79243d92014-10-01 17:15:17 +0000250; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000251; SI: ds_wrxchg_rtn_b64
252; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000253define void @lds_atomic_xchg_noret_i64(i64 addrspace(3)* %ptr) nounwind {
254 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
255 ret void
256}
257
Tom Stellard79243d92014-10-01 17:15:17 +0000258; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000259; SI: ds_wrxchg_rtn_b64 {{.*}} offset:32
260; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000261define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
262 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
263 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
264 ret void
265}
266
Tom Stellard79243d92014-10-01 17:15:17 +0000267; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000268; SI: ds_add_u64
269; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000270define void @lds_atomic_add_noret_i64(i64 addrspace(3)* %ptr) nounwind {
271 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
272 ret void
273}
274
Tom Stellard79243d92014-10-01 17:15:17 +0000275; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000276; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9
Tom Stellard4842c052015-01-07 20:27:25 +0000277; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9
278; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0
Tom Stellard83f0bce2015-01-29 16:55:25 +0000279; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
Tom Stellard326d6ec2014-11-05 14:50:53 +0000280; SI: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 [M0]
281; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000282define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
283 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4
284 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
285 ret void
286}
287
Tom Stellard79243d92014-10-01 17:15:17 +0000288; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64:
Tom Stellard4842c052015-01-07 20:27:25 +0000289; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
290; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
Tom Stellard326d6ec2014-11-05 14:50:53 +0000291; SI: ds_inc_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
292; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000293define void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind {
294 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
295 ret void
296}
297
Tom Stellard79243d92014-10-01 17:15:17 +0000298; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000299; SI: ds_inc_u64 {{.*}} offset:32
300; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000301define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
302 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
303 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
304 ret void
305}
306
Tom Stellard79243d92014-10-01 17:15:17 +0000307; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000308; SI: ds_sub_u64
309; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000310define void @lds_atomic_sub_noret_i64(i64 addrspace(3)* %ptr) nounwind {
311 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
312 ret void
313}
314
Tom Stellard79243d92014-10-01 17:15:17 +0000315; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000316; SI: ds_sub_u64 {{.*}} offset:32
317; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000318define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
319 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
320 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
321 ret void
322}
323
Tom Stellard79243d92014-10-01 17:15:17 +0000324; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64:
Tom Stellard4842c052015-01-07 20:27:25 +0000325; SI: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1
326; SI: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1
Tom Stellard326d6ec2014-11-05 14:50:53 +0000327; SI: ds_dec_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
328; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000329define void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind {
330 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
331 ret void
332}
333
Tom Stellard79243d92014-10-01 17:15:17 +0000334; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000335; SI: ds_dec_u64 {{.*}} offset:32
336; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000337define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
338 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
339 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
340 ret void
341}
342
Tom Stellard79243d92014-10-01 17:15:17 +0000343; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000344; SI: ds_and_b64
345; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000346define void @lds_atomic_and_noret_i64(i64 addrspace(3)* %ptr) nounwind {
347 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
348 ret void
349}
350
Tom Stellard79243d92014-10-01 17:15:17 +0000351; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000352; SI: ds_and_b64 {{.*}} offset:32
353; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000354define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
355 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
356 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
357 ret void
358}
359
Tom Stellard79243d92014-10-01 17:15:17 +0000360; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000361; SI: ds_or_b64
362; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000363define void @lds_atomic_or_noret_i64(i64 addrspace(3)* %ptr) nounwind {
364 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
365 ret void
366}
367
Tom Stellard79243d92014-10-01 17:15:17 +0000368; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000369; SI: ds_or_b64 {{.*}} offset:32
370; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000371define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
372 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
373 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
374 ret void
375}
376
Tom Stellard79243d92014-10-01 17:15:17 +0000377; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000378; SI: ds_xor_b64
379; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000380define void @lds_atomic_xor_noret_i64(i64 addrspace(3)* %ptr) nounwind {
381 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
382 ret void
383}
384
Tom Stellard79243d92014-10-01 17:15:17 +0000385; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000386; SI: ds_xor_b64 {{.*}} offset:32
387; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000388define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
389 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
390 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
391 ret void
392}
393
394; FIXME: There is no atomic nand instr
Tom Stellard79243d92014-10-01 17:15:17 +0000395; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this.
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000396; define void @lds_atomic_nand_noret_i64(i64 addrspace(3)* %ptr) nounwind {
397; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
398; ret void
399; }
400
Tom Stellard79243d92014-10-01 17:15:17 +0000401; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000402; SI: ds_min_i64
403; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000404define void @lds_atomic_min_noret_i64(i64 addrspace(3)* %ptr) nounwind {
405 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
406 ret void
407}
408
Tom Stellard79243d92014-10-01 17:15:17 +0000409; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000410; SI: ds_min_i64 {{.*}} offset:32
411; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000412define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
413 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
414 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
415 ret void
416}
417
Tom Stellard79243d92014-10-01 17:15:17 +0000418; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000419; SI: ds_max_i64
420; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000421define void @lds_atomic_max_noret_i64(i64 addrspace(3)* %ptr) nounwind {
422 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
423 ret void
424}
425
Tom Stellard79243d92014-10-01 17:15:17 +0000426; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000427; SI: ds_max_i64 {{.*}} offset:32
428; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000429define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
430 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
431 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
432 ret void
433}
434
Tom Stellard79243d92014-10-01 17:15:17 +0000435; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000436; SI: ds_min_u64
437; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000438define void @lds_atomic_umin_noret_i64(i64 addrspace(3)* %ptr) nounwind {
439 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
440 ret void
441}
442
Tom Stellard79243d92014-10-01 17:15:17 +0000443; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000444; SI: ds_min_u64 {{.*}} offset:32
445; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000446define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
447 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
448 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
449 ret void
450}
451
Tom Stellard79243d92014-10-01 17:15:17 +0000452; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000453; SI: ds_max_u64
454; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000455define void @lds_atomic_umax_noret_i64(i64 addrspace(3)* %ptr) nounwind {
456 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
457 ret void
458}
459
Tom Stellard79243d92014-10-01 17:15:17 +0000460; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000461; SI: ds_max_u64 {{.*}} offset:32
462; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000463define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
464 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
465 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
466 ret void
467}