blob: ce0cf598bb3f3254a5d946466b4bf74b5bc4106a [file] [log] [blame]
Matt Arsenault61cc9082014-10-10 22:16:07 +00001; RUN: llc -march=r600 -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 Stellard326d6ec2014-11-05 14:50:53 +000032; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
33; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, 9
34; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
35; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
36; SI-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
37; SI: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 [M0]
38; SI: buffer_store_dwordx2 [[RESULT]],
39; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000040define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
41 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4
42 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
43 store i64 %result, i64 addrspace(1)* %out, align 8
44 ret void
45}
46
Tom Stellard79243d92014-10-01 17:15:17 +000047; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000048; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1
49; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
50; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
51; SI: ds_inc_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
52; SI: buffer_store_dwordx2 [[RESULT]],
53; SI: 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:
Tom Stellard326d6ec2014-11-05 14:50:53 +000061; SI: ds_inc_rtn_u64 {{.*}} offset:32
62; SI: 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 {
64 %gep = getelementptr 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
Tom Stellard79243d92014-10-01 17:15:17 +000070; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000071; SI: ds_sub_rtn_u64
72; SI: 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:
Tom Stellard326d6ec2014-11-05 14:50:53 +000080; SI: ds_sub_rtn_u64 {{.*}} offset:32
81; SI: 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 {
83 %gep = getelementptr 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
Tom Stellard79243d92014-10-01 17:15:17 +000089; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +000090; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1
91; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
92; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
93; SI: ds_dec_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
94; SI: buffer_store_dwordx2 [[RESULT]],
95; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +000096define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
97 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
98 store i64 %result, i64 addrspace(1)* %out, align 8
99 ret void
100}
101
Tom Stellard79243d92014-10-01 17:15:17 +0000102; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000103; SI: ds_dec_rtn_u64 {{.*}} offset:32
104; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000105define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
106 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
107 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
108 store i64 %result, i64 addrspace(1)* %out, align 8
109 ret void
110}
111
Tom Stellard79243d92014-10-01 17:15:17 +0000112; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000113; SI: ds_and_rtn_b64
114; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000115define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
116 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
117 store i64 %result, i64 addrspace(1)* %out, align 8
118 ret void
119}
120
Tom Stellard79243d92014-10-01 17:15:17 +0000121; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000122; SI: ds_and_rtn_b64 {{.*}} offset:32
123; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000124define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
125 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
126 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
127 store i64 %result, i64 addrspace(1)* %out, align 8
128 ret void
129}
130
Tom Stellard79243d92014-10-01 17:15:17 +0000131; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000132; SI: ds_or_rtn_b64
133; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000134define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
135 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
136 store i64 %result, i64 addrspace(1)* %out, align 8
137 ret void
138}
139
Tom Stellard79243d92014-10-01 17:15:17 +0000140; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000141; SI: ds_or_rtn_b64 {{.*}} offset:32
142; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000143define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
144 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
145 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
146 store i64 %result, i64 addrspace(1)* %out, align 8
147 ret void
148}
149
Tom Stellard79243d92014-10-01 17:15:17 +0000150; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000151; SI: ds_xor_rtn_b64
152; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000153define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
154 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
155 store i64 %result, i64 addrspace(1)* %out, align 8
156 ret void
157}
158
Tom Stellard79243d92014-10-01 17:15:17 +0000159; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000160; SI: ds_xor_rtn_b64 {{.*}} offset:32
161; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000162define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
163 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
164 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
165 store i64 %result, i64 addrspace(1)* %out, align 8
166 ret void
167}
168
169; FIXME: There is no atomic nand instr
Tom Stellard79243d92014-10-01 17:15:17 +0000170; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this.
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000171; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
172; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
173; store i64 %result, i64 addrspace(1)* %out, align 8
174; ret void
175; }
176
Tom Stellard79243d92014-10-01 17:15:17 +0000177; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000178; SI: ds_min_rtn_i64
179; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000180define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
181 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
182 store i64 %result, i64 addrspace(1)* %out, align 8
183 ret void
184}
185
Tom Stellard79243d92014-10-01 17:15:17 +0000186; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000187; SI: ds_min_rtn_i64 {{.*}} offset:32
188; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000189define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
190 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
191 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
192 store i64 %result, i64 addrspace(1)* %out, align 8
193 ret void
194}
195
Tom Stellard79243d92014-10-01 17:15:17 +0000196; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000197; SI: ds_max_rtn_i64
198; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000199define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
200 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
201 store i64 %result, i64 addrspace(1)* %out, align 8
202 ret void
203}
204
Tom Stellard79243d92014-10-01 17:15:17 +0000205; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000206; SI: ds_max_rtn_i64 {{.*}} offset:32
207; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000208define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
209 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
210 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
211 store i64 %result, i64 addrspace(1)* %out, align 8
212 ret void
213}
214
Tom Stellard79243d92014-10-01 17:15:17 +0000215; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000216; SI: ds_min_rtn_u64
217; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000218define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
219 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
220 store i64 %result, i64 addrspace(1)* %out, align 8
221 ret void
222}
223
Tom Stellard79243d92014-10-01 17:15:17 +0000224; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000225; SI: ds_min_rtn_u64 {{.*}} offset:32
226; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000227define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
228 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
229 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
230 store i64 %result, i64 addrspace(1)* %out, align 8
231 ret void
232}
233
Tom Stellard79243d92014-10-01 17:15:17 +0000234; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000235; SI: ds_max_rtn_u64
236; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000237define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
238 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
239 store i64 %result, i64 addrspace(1)* %out, align 8
240 ret void
241}
242
Tom Stellard79243d92014-10-01 17:15:17 +0000243; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000244; SI: ds_max_rtn_u64 {{.*}} offset:32
245; SI: s_endpgm
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000246define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind {
247 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
248 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
249 store i64 %result, i64 addrspace(1)* %out, align 8
250 ret void
251}
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000252
Tom Stellard79243d92014-10-01 17:15:17 +0000253; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000254; SI: ds_wrxchg_rtn_b64
255; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000256define void @lds_atomic_xchg_noret_i64(i64 addrspace(3)* %ptr) nounwind {
257 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst
258 ret void
259}
260
Tom Stellard79243d92014-10-01 17:15:17 +0000261; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000262; SI: ds_wrxchg_rtn_b64 {{.*}} offset:32
263; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000264define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
265 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
266 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst
267 ret void
268}
269
Tom Stellard79243d92014-10-01 17:15:17 +0000270; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000271; SI: ds_add_u64
272; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000273define void @lds_atomic_add_noret_i64(i64 addrspace(3)* %ptr) nounwind {
274 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst
275 ret void
276}
277
Tom Stellard79243d92014-10-01 17:15:17 +0000278; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000279; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9
280; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, 9
281; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
282; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
283; SI-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]]
284; SI: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 [M0]
285; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000286define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
287 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4
288 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst
289 ret void
290}
291
Tom Stellard79243d92014-10-01 17:15:17 +0000292; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000293; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1
294; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
295; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
296; SI: ds_inc_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
297; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000298define void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind {
299 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst
300 ret void
301}
302
Tom Stellard79243d92014-10-01 17:15:17 +0000303; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000304; SI: ds_inc_u64 {{.*}} offset:32
305; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000306define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
307 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
308 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst
309 ret void
310}
311
Tom Stellard79243d92014-10-01 17:15:17 +0000312; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000313; SI: ds_sub_u64
314; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000315define void @lds_atomic_sub_noret_i64(i64 addrspace(3)* %ptr) nounwind {
316 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst
317 ret void
318}
319
Tom Stellard79243d92014-10-01 17:15:17 +0000320; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000321; SI: ds_sub_u64 {{.*}} offset:32
322; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000323define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
324 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
325 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst
326 ret void
327}
328
Tom Stellard79243d92014-10-01 17:15:17 +0000329; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000330; SI: s_mov_b64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1
331; SI-DAG: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]]
332; SI-DAG: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]]
333; SI: ds_dec_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}
334; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000335define void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind {
336 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst
337 ret void
338}
339
Tom Stellard79243d92014-10-01 17:15:17 +0000340; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000341; SI: ds_dec_u64 {{.*}} offset:32
342; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000343define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
344 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
345 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst
346 ret void
347}
348
Tom Stellard79243d92014-10-01 17:15:17 +0000349; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000350; SI: ds_and_b64
351; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000352define void @lds_atomic_and_noret_i64(i64 addrspace(3)* %ptr) nounwind {
353 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst
354 ret void
355}
356
Tom Stellard79243d92014-10-01 17:15:17 +0000357; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000358; SI: ds_and_b64 {{.*}} offset:32
359; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000360define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
361 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
362 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst
363 ret void
364}
365
Tom Stellard79243d92014-10-01 17:15:17 +0000366; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000367; SI: ds_or_b64
368; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000369define void @lds_atomic_or_noret_i64(i64 addrspace(3)* %ptr) nounwind {
370 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst
371 ret void
372}
373
Tom Stellard79243d92014-10-01 17:15:17 +0000374; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000375; SI: ds_or_b64 {{.*}} offset:32
376; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000377define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
378 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
379 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst
380 ret void
381}
382
Tom Stellard79243d92014-10-01 17:15:17 +0000383; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000384; SI: ds_xor_b64
385; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000386define void @lds_atomic_xor_noret_i64(i64 addrspace(3)* %ptr) nounwind {
387 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst
388 ret void
389}
390
Tom Stellard79243d92014-10-01 17:15:17 +0000391; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000392; SI: ds_xor_b64 {{.*}} offset:32
393; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000394define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
395 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
396 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst
397 ret void
398}
399
400; FIXME: There is no atomic nand instr
Tom Stellard79243d92014-10-01 17:15:17 +0000401; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this.
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000402; define void @lds_atomic_nand_noret_i64(i64 addrspace(3)* %ptr) nounwind {
403; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst
404; ret void
405; }
406
Tom Stellard79243d92014-10-01 17:15:17 +0000407; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000408; SI: ds_min_i64
409; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000410define void @lds_atomic_min_noret_i64(i64 addrspace(3)* %ptr) nounwind {
411 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst
412 ret void
413}
414
Tom Stellard79243d92014-10-01 17:15:17 +0000415; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000416; SI: ds_min_i64 {{.*}} offset:32
417; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000418define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
419 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
420 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst
421 ret void
422}
423
Tom Stellard79243d92014-10-01 17:15:17 +0000424; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000425; SI: ds_max_i64
426; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000427define void @lds_atomic_max_noret_i64(i64 addrspace(3)* %ptr) nounwind {
428 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst
429 ret void
430}
431
Tom Stellard79243d92014-10-01 17:15:17 +0000432; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000433; SI: ds_max_i64 {{.*}} offset:32
434; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000435define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
436 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
437 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst
438 ret void
439}
440
Tom Stellard79243d92014-10-01 17:15:17 +0000441; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000442; SI: ds_min_u64
443; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000444define void @lds_atomic_umin_noret_i64(i64 addrspace(3)* %ptr) nounwind {
445 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst
446 ret void
447}
448
Tom Stellard79243d92014-10-01 17:15:17 +0000449; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000450; SI: ds_min_u64 {{.*}} offset:32
451; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000452define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
453 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
454 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst
455 ret void
456}
457
Tom Stellard79243d92014-10-01 17:15:17 +0000458; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000459; SI: ds_max_u64
460; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000461define void @lds_atomic_umax_noret_i64(i64 addrspace(3)* %ptr) nounwind {
462 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst
463 ret void
464}
465
Tom Stellard79243d92014-10-01 17:15:17 +0000466; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000467; SI: ds_max_u64 {{.*}} offset:32
468; SI: s_endpgm
Matt Arsenault7ac9c4a2014-09-08 15:07:31 +0000469define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
470 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4
471 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst
472 ret void
473}