[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / local-atomics-fp.ll
blob3641bd4ef865dc49fd9f98dab0bdeaf2bd766b79
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s
4 ; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX7 %s
5 ; RUN: llc -march=amdgcn -mcpu=hawaii -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX8 %s
7 define float @lds_atomic_fadd_ret_f32(ptr addrspace(3) %ptr) nounwind {
8 ; VI-LABEL: lds_atomic_fadd_ret_f32:
9 ; VI:       ; %bb.0:
10 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11 ; VI-NEXT:    v_mov_b32_e32 v1, 4.0
12 ; VI-NEXT:    s_mov_b32 m0, -1
13 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
14 ; VI-NEXT:    ds_add_rtn_f32 v0, v0, v1
15 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
16 ; VI-NEXT:    s_setpc_b64 s[30:31]
18 ; GFX9-LABEL: lds_atomic_fadd_ret_f32:
19 ; GFX9:       ; %bb.0:
20 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
21 ; GFX9-NEXT:    v_mov_b32_e32 v1, 4.0
22 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
23 ; GFX9-NEXT:    ds_add_rtn_f32 v0, v0, v1
24 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
25 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
27 ; GFX7-LABEL: lds_atomic_fadd_ret_f32:
28 ; GFX7:       ; %bb.0:
29 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30 ; GFX7-NEXT:    s_mov_b32 m0, -1
31 ; GFX7-NEXT:    ds_read_b32 v1, v0
32 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
33 ; GFX7-NEXT:  .LBB0_1: ; %atomicrmw.start
34 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
35 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
36 ; GFX7-NEXT:    v_mov_b32_e32 v2, v1
37 ; GFX7-NEXT:    v_add_f32_e32 v1, 4.0, v2
38 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
39 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1
40 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
41 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
42 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
43 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
44 ; GFX7-NEXT:    s_cbranch_execnz .LBB0_1
45 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
46 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
47 ; GFX7-NEXT:    v_mov_b32_e32 v0, v1
48 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
50 ; GFX8-LABEL: lds_atomic_fadd_ret_f32:
51 ; GFX8:       ; %bb.0:
52 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
53 ; GFX8-NEXT:    s_mov_b32 m0, -1
54 ; GFX8-NEXT:    ds_read_b32 v1, v0
55 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
56 ; GFX8-NEXT:  .LBB0_1: ; %atomicrmw.start
57 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
58 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
59 ; GFX8-NEXT:    v_mov_b32_e32 v2, v1
60 ; GFX8-NEXT:    v_add_f32_e32 v1, 4.0, v2
61 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
62 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1
63 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
64 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
65 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
66 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
67 ; GFX8-NEXT:    s_cbranch_execnz .LBB0_1
68 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
69 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
70 ; GFX8-NEXT:    v_mov_b32_e32 v0, v1
71 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
72   %result = atomicrmw fadd ptr addrspace(3) %ptr, float 4.0 seq_cst
73   ret float %result
76 define void @lds_atomic_fadd_noret_f32(ptr addrspace(3) %ptr) nounwind {
77 ; VI-LABEL: lds_atomic_fadd_noret_f32:
78 ; VI:       ; %bb.0:
79 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
80 ; VI-NEXT:    v_mov_b32_e32 v1, 4.0
81 ; VI-NEXT:    s_mov_b32 m0, -1
82 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
83 ; VI-NEXT:    ds_add_f32 v0, v1
84 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
85 ; VI-NEXT:    s_setpc_b64 s[30:31]
87 ; GFX9-LABEL: lds_atomic_fadd_noret_f32:
88 ; GFX9:       ; %bb.0:
89 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
90 ; GFX9-NEXT:    v_mov_b32_e32 v1, 4.0
91 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
92 ; GFX9-NEXT:    ds_add_f32 v0, v1
93 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
94 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
96 ; GFX7-LABEL: lds_atomic_fadd_noret_f32:
97 ; GFX7:       ; %bb.0:
98 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
99 ; GFX7-NEXT:    s_mov_b32 m0, -1
100 ; GFX7-NEXT:    ds_read_b32 v1, v0
101 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
102 ; GFX7-NEXT:  .LBB1_1: ; %atomicrmw.start
103 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
104 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
105 ; GFX7-NEXT:    v_add_f32_e32 v2, 4.0, v1
106 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
107 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2
108 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
109 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
110 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
111 ; GFX7-NEXT:    v_mov_b32_e32 v1, v2
112 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
113 ; GFX7-NEXT:    s_cbranch_execnz .LBB1_1
114 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
115 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
116 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
118 ; GFX8-LABEL: lds_atomic_fadd_noret_f32:
119 ; GFX8:       ; %bb.0:
120 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
121 ; GFX8-NEXT:    s_mov_b32 m0, -1
122 ; GFX8-NEXT:    ds_read_b32 v1, v0
123 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
124 ; GFX8-NEXT:  .LBB1_1: ; %atomicrmw.start
125 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
126 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
127 ; GFX8-NEXT:    v_add_f32_e32 v2, 4.0, v1
128 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
129 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2
130 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
131 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
132 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
133 ; GFX8-NEXT:    v_mov_b32_e32 v1, v2
134 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
135 ; GFX8-NEXT:    s_cbranch_execnz .LBB1_1
136 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
137 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
138 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
139   %result = atomicrmw fadd ptr addrspace(3) %ptr, float 4.0 seq_cst
140   ret void
143 define amdgpu_kernel void @lds_ds_fadd(ptr addrspace(1) %out, ptr addrspace(3) %ptrf, i32 %idx) {
144 ; VI-LABEL: lds_ds_fadd:
145 ; VI:       ; %bb.0:
146 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
147 ; VI-NEXT:    s_mov_b64 s[4:5], exec
148 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v0, s4, 0
149 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v0, s5, v0
150 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
151 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
152 ; VI-NEXT:    s_add_i32 s3, s3, 4
153 ; VI-NEXT:    ; implicit-def: $vgpr1
154 ; VI-NEXT:    s_mov_b32 m0, -1
155 ; VI-NEXT:    s_and_saveexec_b64 s[6:7], vcc
156 ; VI-NEXT:    s_cbranch_execz .LBB2_2
157 ; VI-NEXT:  ; %bb.1:
158 ; VI-NEXT:    s_bcnt1_i32_b64 s4, s[4:5]
159 ; VI-NEXT:    s_lshl_b32 s8, s3, 3
160 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v1, s4
161 ; VI-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
162 ; VI-NEXT:    v_mov_b32_e32 v2, s8
163 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
164 ; VI-NEXT:    ds_add_rtn_f32 v1, v2, v1
165 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
166 ; VI-NEXT:  .LBB2_2:
167 ; VI-NEXT:    s_or_b64 exec, exec, s[6:7]
168 ; VI-NEXT:    s_mov_b64 s[6:7], exec
169 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
170 ; VI-NEXT:    v_readfirstlane_b32 s8, v1
171 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v1, s6, 0
172 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v1, s7, v1
173 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
174 ; VI-NEXT:    s_and_saveexec_b64 s[4:5], vcc
175 ; VI-NEXT:    s_cbranch_execz .LBB2_4
176 ; VI-NEXT:  ; %bb.3:
177 ; VI-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
178 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
179 ; VI-NEXT:    s_lshl_b32 s3, s3, 4
180 ; VI-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
181 ; VI-NEXT:    v_mov_b32_e32 v2, s3
182 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
183 ; VI-NEXT:    ds_add_f32 v2, v1
184 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
185 ; VI-NEXT:  .LBB2_4:
186 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
187 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
188 ; VI-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
189 ; VI-NEXT:    s_mov_b64 s[4:5], exec
190 ; VI-NEXT:    v_add_f32_e32 v2, s8, v0
191 ; VI-NEXT:    v_bfrev_b32_e32 v1, 1
192 ; VI-NEXT:    ; implicit-def: $vgpr0
193 ; VI-NEXT:  .LBB2_5: ; %ComputeLoop
194 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
195 ; VI-NEXT:    s_ff1_i32_b32 s3, s5
196 ; VI-NEXT:    s_ff1_i32_b32 s6, s4
197 ; VI-NEXT:    s_add_i32 s3, s3, 32
198 ; VI-NEXT:    s_min_u32 s3, s6, s3
199 ; VI-NEXT:    s_lshl_b64 s[6:7], 1, s3
200 ; VI-NEXT:    v_readfirstlane_b32 s8, v1
201 ; VI-NEXT:    v_readlane_b32 s9, v2, s3
202 ; VI-NEXT:    s_mov_b32 m0, s3
203 ; VI-NEXT:    s_andn2_b64 s[4:5], s[4:5], s[6:7]
204 ; VI-NEXT:    v_writelane_b32 v0, s8, m0
205 ; VI-NEXT:    s_cmp_lg_u64 s[4:5], 0
206 ; VI-NEXT:    v_add_f32_e32 v1, s9, v1
207 ; VI-NEXT:    s_cbranch_scc1 .LBB2_5
208 ; VI-NEXT:  ; %bb.6: ; %ComputeEnd
209 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v2, exec_lo, 0
210 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v2, exec_hi, v2
211 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
212 ; VI-NEXT:    ; implicit-def: $vgpr2
213 ; VI-NEXT:    s_and_saveexec_b64 s[4:5], vcc
214 ; VI-NEXT:    s_xor_b64 s[4:5], exec, s[4:5]
215 ; VI-NEXT:    s_cbranch_execz .LBB2_8
216 ; VI-NEXT:  ; %bb.7:
217 ; VI-NEXT:    v_mov_b32_e32 v2, s2
218 ; VI-NEXT:    s_mov_b32 m0, -1
219 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
220 ; VI-NEXT:    ds_add_rtn_f32 v2, v2, v1
221 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
222 ; VI-NEXT:  .LBB2_8:
223 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
224 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
225 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
226 ; VI-NEXT:    v_readfirstlane_b32 s2, v2
227 ; VI-NEXT:    v_add_f32_e32 v2, s2, v0
228 ; VI-NEXT:    v_mov_b32_e32 v0, s0
229 ; VI-NEXT:    v_mov_b32_e32 v1, s1
230 ; VI-NEXT:    flat_store_dword v[0:1], v2
231 ; VI-NEXT:    s_endpgm
233 ; GFX9-LABEL: lds_ds_fadd:
234 ; GFX9:       ; %bb.0:
235 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
236 ; GFX9-NEXT:    s_mov_b64 s[4:5], exec
237 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v0, s4, 0
238 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v0, s5, v0
239 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
240 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
241 ; GFX9-NEXT:    s_add_i32 s3, s3, 4
242 ; GFX9-NEXT:    ; implicit-def: $vgpr1
243 ; GFX9-NEXT:    s_and_saveexec_b64 s[6:7], vcc
244 ; GFX9-NEXT:    s_cbranch_execz .LBB2_2
245 ; GFX9-NEXT:  ; %bb.1:
246 ; GFX9-NEXT:    s_bcnt1_i32_b64 s4, s[4:5]
247 ; GFX9-NEXT:    s_lshl_b32 s8, s3, 3
248 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v1, s4
249 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
250 ; GFX9-NEXT:    v_mov_b32_e32 v2, s8
251 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX9-NEXT:    ds_add_rtn_f32 v1, v2, v1
253 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
254 ; GFX9-NEXT:  .LBB2_2:
255 ; GFX9-NEXT:    s_or_b64 exec, exec, s[6:7]
256 ; GFX9-NEXT:    s_mov_b64 s[6:7], exec
257 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
258 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
259 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v1, s6, 0
260 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v1, s7, v1
261 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
262 ; GFX9-NEXT:    s_and_saveexec_b64 s[4:5], vcc
263 ; GFX9-NEXT:    s_cbranch_execz .LBB2_4
264 ; GFX9-NEXT:  ; %bb.3:
265 ; GFX9-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
266 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
267 ; GFX9-NEXT:    s_lshl_b32 s3, s3, 4
268 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
269 ; GFX9-NEXT:    v_mov_b32_e32 v2, s3
270 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
271 ; GFX9-NEXT:    ds_add_f32 v2, v1
272 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
273 ; GFX9-NEXT:  .LBB2_4:
274 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
275 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
276 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
277 ; GFX9-NEXT:    s_mov_b64 s[4:5], exec
278 ; GFX9-NEXT:    v_add_f32_e32 v2, s8, v0
279 ; GFX9-NEXT:    v_bfrev_b32_e32 v1, 1
280 ; GFX9-NEXT:    ; implicit-def: $vgpr0
281 ; GFX9-NEXT:  .LBB2_5: ; %ComputeLoop
282 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
283 ; GFX9-NEXT:    s_ff1_i32_b32 s3, s5
284 ; GFX9-NEXT:    s_ff1_i32_b32 s6, s4
285 ; GFX9-NEXT:    s_add_i32 s3, s3, 32
286 ; GFX9-NEXT:    s_min_u32 s3, s6, s3
287 ; GFX9-NEXT:    s_lshl_b64 s[6:7], 1, s3
288 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
289 ; GFX9-NEXT:    v_readlane_b32 s9, v2, s3
290 ; GFX9-NEXT:    s_mov_b32 m0, s3
291 ; GFX9-NEXT:    s_andn2_b64 s[4:5], s[4:5], s[6:7]
292 ; GFX9-NEXT:    v_writelane_b32 v0, s8, m0
293 ; GFX9-NEXT:    s_cmp_lg_u64 s[4:5], 0
294 ; GFX9-NEXT:    v_add_f32_e32 v1, s9, v1
295 ; GFX9-NEXT:    s_cbranch_scc1 .LBB2_5
296 ; GFX9-NEXT:  ; %bb.6: ; %ComputeEnd
297 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v2, exec_lo, 0
298 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v2, exec_hi, v2
299 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
300 ; GFX9-NEXT:    ; implicit-def: $vgpr2
301 ; GFX9-NEXT:    s_and_saveexec_b64 s[4:5], vcc
302 ; GFX9-NEXT:    s_xor_b64 s[4:5], exec, s[4:5]
303 ; GFX9-NEXT:    s_cbranch_execz .LBB2_8
304 ; GFX9-NEXT:  ; %bb.7:
305 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
306 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
307 ; GFX9-NEXT:    ds_add_rtn_f32 v2, v2, v1
308 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
309 ; GFX9-NEXT:  .LBB2_8:
310 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
311 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
312 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
313 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
314 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
315 ; GFX9-NEXT:    v_add_f32_e32 v0, s2, v0
316 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
317 ; GFX9-NEXT:    s_endpgm
319 ; GFX7-LABEL: lds_ds_fadd:
320 ; GFX7:       ; %bb.0:
321 ; GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xb
322 ; GFX7-NEXT:    s_mov_b64 s[6:7], exec
323 ; GFX7-NEXT:    v_mbcnt_lo_u32_b32_e64 v0, s6, 0
324 ; GFX7-NEXT:    v_mbcnt_hi_u32_b32_e32 v0, s7, v0
325 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
326 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
327 ; GFX7-NEXT:    s_add_i32 s3, s3, 4
328 ; GFX7-NEXT:    ; implicit-def: $vgpr1
329 ; GFX7-NEXT:    s_mov_b32 m0, -1
330 ; GFX7-NEXT:    s_and_saveexec_b64 s[4:5], vcc
331 ; GFX7-NEXT:    s_cbranch_execz .LBB2_4
332 ; GFX7-NEXT:  ; %bb.1:
333 ; GFX7-NEXT:    s_lshl_b32 s8, s3, 3
334 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
335 ; GFX7-NEXT:    ds_read_b32 v1, v1
336 ; GFX7-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
337 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v2, s6
338 ; GFX7-NEXT:    v_mul_f32_e32 v2, 0x42280000, v2
339 ; GFX7-NEXT:    s_mov_b64 s[6:7], 0
340 ; GFX7-NEXT:  .LBB2_2: ; %atomicrmw.start
341 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
342 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
343 ; GFX7-NEXT:    v_mov_b32_e32 v3, v1
344 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
345 ; GFX7-NEXT:    v_add_f32_e32 v4, v3, v2
346 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
347 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v1, v3, v4
348 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
349 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v3
350 ; GFX7-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
351 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[6:7]
352 ; GFX7-NEXT:    s_cbranch_execnz .LBB2_2
353 ; GFX7-NEXT:  ; %bb.3: ; %Flow15
354 ; GFX7-NEXT:    s_or_b64 exec, exec, s[6:7]
355 ; GFX7-NEXT:  .LBB2_4: ; %Flow16
356 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
357 ; GFX7-NEXT:    s_mov_b64 s[6:7], exec
358 ; GFX7-NEXT:    v_readfirstlane_b32 s8, v1
359 ; GFX7-NEXT:    v_mbcnt_lo_u32_b32_e64 v1, s6, 0
360 ; GFX7-NEXT:    v_mbcnt_hi_u32_b32_e32 v1, s7, v1
361 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
362 ; GFX7-NEXT:    s_and_saveexec_b64 s[4:5], vcc
363 ; GFX7-NEXT:    s_cbranch_execz .LBB2_7
364 ; GFX7-NEXT:  ; %bb.5:
365 ; GFX7-NEXT:    s_lshl_b32 s3, s3, 4
366 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
367 ; GFX7-NEXT:    ds_read_b32 v2, v1
368 ; GFX7-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
369 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
370 ; GFX7-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
371 ; GFX7-NEXT:    s_mov_b64 s[6:7], 0
372 ; GFX7-NEXT:  .LBB2_6: ; %atomicrmw.start2
373 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
374 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX7-NEXT:    v_add_f32_e32 v3, v2, v1
376 ; GFX7-NEXT:    v_mov_b32_e32 v4, s3
377 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
378 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v4, v2, v3
379 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
380 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
381 ; GFX7-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
382 ; GFX7-NEXT:    v_mov_b32_e32 v2, v3
383 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[6:7]
384 ; GFX7-NEXT:    s_cbranch_execnz .LBB2_6
385 ; GFX7-NEXT:  .LBB2_7: ; %Flow14
386 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
387 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
388 ; GFX7-NEXT:    ds_read_b32 v1, v1
389 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
390 ; GFX7-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
391 ; GFX7-NEXT:    v_add_f32_e32 v0, s8, v0
392 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
393 ; GFX7-NEXT:  .LBB2_8: ; %atomicrmw.start8
394 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
395 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
396 ; GFX7-NEXT:    v_mov_b32_e32 v2, v1
397 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
398 ; GFX7-NEXT:    v_add_f32_e32 v3, v2, v0
399 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
400 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v1, v2, v3
401 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
402 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
403 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
404 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
405 ; GFX7-NEXT:    s_cbranch_execnz .LBB2_8
406 ; GFX7-NEXT:  ; %bb.9: ; %atomicrmw.end7
407 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
408 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
409 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
410 ; GFX7-NEXT:    s_mov_b32 s2, -1
411 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
412 ; GFX7-NEXT:    buffer_store_dword v1, off, s[0:3], 0
413 ; GFX7-NEXT:    s_endpgm
415 ; GFX8-LABEL: lds_ds_fadd:
416 ; GFX8:       ; %bb.0:
417 ; GFX8-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xb
418 ; GFX8-NEXT:    s_mov_b64 s[6:7], exec
419 ; GFX8-NEXT:    v_mbcnt_lo_u32_b32_e64 v0, s6, 0
420 ; GFX8-NEXT:    v_mbcnt_hi_u32_b32_e32 v0, s7, v0
421 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
422 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
423 ; GFX8-NEXT:    s_add_i32 s3, s3, 4
424 ; GFX8-NEXT:    ; implicit-def: $vgpr1
425 ; GFX8-NEXT:    s_mov_b32 m0, -1
426 ; GFX8-NEXT:    s_and_saveexec_b64 s[4:5], vcc
427 ; GFX8-NEXT:    s_cbranch_execz .LBB2_4
428 ; GFX8-NEXT:  ; %bb.1:
429 ; GFX8-NEXT:    s_lshl_b32 s8, s3, 3
430 ; GFX8-NEXT:    v_mov_b32_e32 v1, s8
431 ; GFX8-NEXT:    ds_read_b32 v1, v1
432 ; GFX8-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
433 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v2, s6
434 ; GFX8-NEXT:    v_mul_f32_e32 v2, 0x42280000, v2
435 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
436 ; GFX8-NEXT:  .LBB2_2: ; %atomicrmw.start
437 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
438 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
439 ; GFX8-NEXT:    v_mov_b32_e32 v3, v1
440 ; GFX8-NEXT:    v_mov_b32_e32 v1, s8
441 ; GFX8-NEXT:    v_add_f32_e32 v4, v3, v2
442 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
443 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v1, v3, v4
444 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
445 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v3
446 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
447 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
448 ; GFX8-NEXT:    s_cbranch_execnz .LBB2_2
449 ; GFX8-NEXT:  ; %bb.3: ; %Flow17
450 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
451 ; GFX8-NEXT:  .LBB2_4: ; %Flow18
452 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
453 ; GFX8-NEXT:    s_mov_b64 s[6:7], exec
454 ; GFX8-NEXT:    v_readfirstlane_b32 s8, v1
455 ; GFX8-NEXT:    v_mbcnt_lo_u32_b32_e64 v1, s6, 0
456 ; GFX8-NEXT:    v_mbcnt_hi_u32_b32_e32 v1, s7, v1
457 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
458 ; GFX8-NEXT:    s_and_saveexec_b64 s[4:5], vcc
459 ; GFX8-NEXT:    s_cbranch_execz .LBB2_7
460 ; GFX8-NEXT:  ; %bb.5:
461 ; GFX8-NEXT:    s_lshl_b32 s3, s3, 4
462 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
463 ; GFX8-NEXT:    ds_read_b32 v2, v1
464 ; GFX8-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
465 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
466 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
467 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
468 ; GFX8-NEXT:  .LBB2_6: ; %atomicrmw.start2
469 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
470 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
471 ; GFX8-NEXT:    v_add_f32_e32 v3, v2, v1
472 ; GFX8-NEXT:    v_mov_b32_e32 v4, s3
473 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
474 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v4, v2, v3
475 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
476 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
477 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
478 ; GFX8-NEXT:    v_mov_b32_e32 v2, v3
479 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
480 ; GFX8-NEXT:    s_cbranch_execnz .LBB2_6
481 ; GFX8-NEXT:  .LBB2_7: ; %Flow16
482 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
483 ; GFX8-NEXT:    v_mov_b32_e32 v1, s2
484 ; GFX8-NEXT:    ds_read_b32 v1, v1
485 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
486 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
487 ; GFX8-NEXT:    v_add_f32_e32 v0, s8, v0
488 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
489 ; GFX8-NEXT:  .LBB2_8: ; %atomicrmw.start8
490 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
491 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
492 ; GFX8-NEXT:    v_mov_b32_e32 v2, v1
493 ; GFX8-NEXT:    v_mov_b32_e32 v1, s2
494 ; GFX8-NEXT:    v_add_f32_e32 v3, v2, v0
495 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
496 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v1, v2, v3
497 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
498 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
499 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
500 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
501 ; GFX8-NEXT:    s_cbranch_execnz .LBB2_8
502 ; GFX8-NEXT:  ; %bb.9: ; %atomicrmw.end7
503 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
504 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
505 ; GFX8-NEXT:    s_mov_b32 s3, 0xf000
506 ; GFX8-NEXT:    s_mov_b32 s2, -1
507 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
508 ; GFX8-NEXT:    buffer_store_dword v1, off, s[0:3], 0
509 ; GFX8-NEXT:    s_endpgm
510   %idx.add = add nuw i32 %idx, 4
511   %shl0 = shl i32 %idx.add, 3
512   %shl1 = shl i32 %idx.add, 4
513   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
514   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
515   %a1 = atomicrmw fadd ptr addrspace(3) %ptr0, float 4.2e+1 seq_cst
516   %a2 = atomicrmw fadd ptr addrspace(3) %ptr1, float 4.2e+1 seq_cst
517   %a3 = atomicrmw fadd ptr addrspace(3) %ptrf, float %a1 seq_cst
518   store float %a3, ptr addrspace(1) %out
519   ret void
522 define amdgpu_kernel void @lds_ds_fadd_one_as(ptr addrspace(1) %out, ptr addrspace(3) %ptrf, i32 %idx) {
523 ; VI-LABEL: lds_ds_fadd_one_as:
524 ; VI:       ; %bb.0:
525 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
526 ; VI-NEXT:    s_mov_b64 s[4:5], exec
527 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v0, s4, 0
528 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v0, s5, v0
529 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
530 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
531 ; VI-NEXT:    s_add_i32 s3, s3, 4
532 ; VI-NEXT:    ; implicit-def: $vgpr1
533 ; VI-NEXT:    s_mov_b32 m0, -1
534 ; VI-NEXT:    s_and_saveexec_b64 s[6:7], vcc
535 ; VI-NEXT:    s_cbranch_execz .LBB3_2
536 ; VI-NEXT:  ; %bb.1:
537 ; VI-NEXT:    s_bcnt1_i32_b64 s4, s[4:5]
538 ; VI-NEXT:    s_lshl_b32 s8, s3, 3
539 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v1, s4
540 ; VI-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
541 ; VI-NEXT:    v_mov_b32_e32 v2, s8
542 ; VI-NEXT:    ds_add_rtn_f32 v1, v2, v1
543 ; VI-NEXT:  .LBB3_2:
544 ; VI-NEXT:    s_or_b64 exec, exec, s[6:7]
545 ; VI-NEXT:    s_mov_b64 s[6:7], exec
546 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
547 ; VI-NEXT:    v_readfirstlane_b32 s8, v1
548 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v1, s6, 0
549 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v1, s7, v1
550 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
551 ; VI-NEXT:    s_and_saveexec_b64 s[4:5], vcc
552 ; VI-NEXT:    s_cbranch_execz .LBB3_4
553 ; VI-NEXT:  ; %bb.3:
554 ; VI-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
555 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
556 ; VI-NEXT:    s_lshl_b32 s3, s3, 4
557 ; VI-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
558 ; VI-NEXT:    v_mov_b32_e32 v2, s3
559 ; VI-NEXT:    ds_add_f32 v2, v1
560 ; VI-NEXT:  .LBB3_4:
561 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
562 ; VI-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
563 ; VI-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
564 ; VI-NEXT:    s_mov_b64 s[4:5], exec
565 ; VI-NEXT:    v_add_f32_e32 v2, s8, v0
566 ; VI-NEXT:    v_bfrev_b32_e32 v1, 1
567 ; VI-NEXT:    ; implicit-def: $vgpr0
568 ; VI-NEXT:  .LBB3_5: ; %ComputeLoop
569 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
570 ; VI-NEXT:    s_ff1_i32_b32 s3, s5
571 ; VI-NEXT:    s_ff1_i32_b32 s6, s4
572 ; VI-NEXT:    s_add_i32 s3, s3, 32
573 ; VI-NEXT:    s_min_u32 s3, s6, s3
574 ; VI-NEXT:    s_lshl_b64 s[6:7], 1, s3
575 ; VI-NEXT:    v_readfirstlane_b32 s8, v1
576 ; VI-NEXT:    v_readlane_b32 s9, v2, s3
577 ; VI-NEXT:    s_mov_b32 m0, s3
578 ; VI-NEXT:    s_andn2_b64 s[4:5], s[4:5], s[6:7]
579 ; VI-NEXT:    v_writelane_b32 v0, s8, m0
580 ; VI-NEXT:    s_cmp_lg_u64 s[4:5], 0
581 ; VI-NEXT:    v_add_f32_e32 v1, s9, v1
582 ; VI-NEXT:    s_cbranch_scc1 .LBB3_5
583 ; VI-NEXT:  ; %bb.6: ; %ComputeEnd
584 ; VI-NEXT:    v_mbcnt_lo_u32_b32 v2, exec_lo, 0
585 ; VI-NEXT:    v_mbcnt_hi_u32_b32 v2, exec_hi, v2
586 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
587 ; VI-NEXT:    ; implicit-def: $vgpr2
588 ; VI-NEXT:    s_and_saveexec_b64 s[4:5], vcc
589 ; VI-NEXT:    s_xor_b64 s[4:5], exec, s[4:5]
590 ; VI-NEXT:    s_cbranch_execz .LBB3_8
591 ; VI-NEXT:  ; %bb.7:
592 ; VI-NEXT:    v_mov_b32_e32 v2, s2
593 ; VI-NEXT:    s_mov_b32 m0, -1
594 ; VI-NEXT:    ds_add_rtn_f32 v2, v2, v1
595 ; VI-NEXT:  .LBB3_8:
596 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
597 ; VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
598 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
599 ; VI-NEXT:    v_readfirstlane_b32 s2, v2
600 ; VI-NEXT:    v_add_f32_e32 v2, s2, v0
601 ; VI-NEXT:    v_mov_b32_e32 v0, s0
602 ; VI-NEXT:    v_mov_b32_e32 v1, s1
603 ; VI-NEXT:    flat_store_dword v[0:1], v2
604 ; VI-NEXT:    s_endpgm
606 ; GFX9-LABEL: lds_ds_fadd_one_as:
607 ; GFX9:       ; %bb.0:
608 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x2c
609 ; GFX9-NEXT:    s_mov_b64 s[4:5], exec
610 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v0, s4, 0
611 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v0, s5, v0
612 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
613 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
614 ; GFX9-NEXT:    s_add_i32 s3, s3, 4
615 ; GFX9-NEXT:    ; implicit-def: $vgpr1
616 ; GFX9-NEXT:    s_and_saveexec_b64 s[6:7], vcc
617 ; GFX9-NEXT:    s_cbranch_execz .LBB3_2
618 ; GFX9-NEXT:  ; %bb.1:
619 ; GFX9-NEXT:    s_bcnt1_i32_b64 s4, s[4:5]
620 ; GFX9-NEXT:    s_lshl_b32 s8, s3, 3
621 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v1, s4
622 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
623 ; GFX9-NEXT:    v_mov_b32_e32 v2, s8
624 ; GFX9-NEXT:    ds_add_rtn_f32 v1, v2, v1
625 ; GFX9-NEXT:  .LBB3_2:
626 ; GFX9-NEXT:    s_or_b64 exec, exec, s[6:7]
627 ; GFX9-NEXT:    s_mov_b64 s[6:7], exec
628 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
629 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
630 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v1, s6, 0
631 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v1, s7, v1
632 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
633 ; GFX9-NEXT:    s_and_saveexec_b64 s[4:5], vcc
634 ; GFX9-NEXT:    s_cbranch_execz .LBB3_4
635 ; GFX9-NEXT:  ; %bb.3:
636 ; GFX9-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
637 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
638 ; GFX9-NEXT:    s_lshl_b32 s3, s3, 4
639 ; GFX9-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
640 ; GFX9-NEXT:    v_mov_b32_e32 v2, s3
641 ; GFX9-NEXT:    ds_add_f32 v2, v1
642 ; GFX9-NEXT:  .LBB3_4:
643 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
644 ; GFX9-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
645 ; GFX9-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
646 ; GFX9-NEXT:    s_mov_b64 s[4:5], exec
647 ; GFX9-NEXT:    v_add_f32_e32 v2, s8, v0
648 ; GFX9-NEXT:    v_bfrev_b32_e32 v1, 1
649 ; GFX9-NEXT:    ; implicit-def: $vgpr0
650 ; GFX9-NEXT:  .LBB3_5: ; %ComputeLoop
651 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
652 ; GFX9-NEXT:    s_ff1_i32_b32 s3, s5
653 ; GFX9-NEXT:    s_ff1_i32_b32 s6, s4
654 ; GFX9-NEXT:    s_add_i32 s3, s3, 32
655 ; GFX9-NEXT:    s_min_u32 s3, s6, s3
656 ; GFX9-NEXT:    s_lshl_b64 s[6:7], 1, s3
657 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v1
658 ; GFX9-NEXT:    v_readlane_b32 s9, v2, s3
659 ; GFX9-NEXT:    s_mov_b32 m0, s3
660 ; GFX9-NEXT:    s_andn2_b64 s[4:5], s[4:5], s[6:7]
661 ; GFX9-NEXT:    v_writelane_b32 v0, s8, m0
662 ; GFX9-NEXT:    s_cmp_lg_u64 s[4:5], 0
663 ; GFX9-NEXT:    v_add_f32_e32 v1, s9, v1
664 ; GFX9-NEXT:    s_cbranch_scc1 .LBB3_5
665 ; GFX9-NEXT:  ; %bb.6: ; %ComputeEnd
666 ; GFX9-NEXT:    v_mbcnt_lo_u32_b32 v2, exec_lo, 0
667 ; GFX9-NEXT:    v_mbcnt_hi_u32_b32 v2, exec_hi, v2
668 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v2
669 ; GFX9-NEXT:    ; implicit-def: $vgpr2
670 ; GFX9-NEXT:    s_and_saveexec_b64 s[4:5], vcc
671 ; GFX9-NEXT:    s_xor_b64 s[4:5], exec, s[4:5]
672 ; GFX9-NEXT:    s_cbranch_execz .LBB3_8
673 ; GFX9-NEXT:  ; %bb.7:
674 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
675 ; GFX9-NEXT:    ds_add_rtn_f32 v2, v2, v1
676 ; GFX9-NEXT:  .LBB3_8:
677 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
678 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
679 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
680 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
681 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
682 ; GFX9-NEXT:    v_add_f32_e32 v0, s2, v0
683 ; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
684 ; GFX9-NEXT:    s_endpgm
686 ; GFX7-LABEL: lds_ds_fadd_one_as:
687 ; GFX7:       ; %bb.0:
688 ; GFX7-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xb
689 ; GFX7-NEXT:    s_mov_b64 s[6:7], exec
690 ; GFX7-NEXT:    v_mbcnt_lo_u32_b32_e64 v0, s6, 0
691 ; GFX7-NEXT:    v_mbcnt_hi_u32_b32_e32 v0, s7, v0
692 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
693 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
694 ; GFX7-NEXT:    s_add_i32 s3, s3, 4
695 ; GFX7-NEXT:    ; implicit-def: $vgpr1
696 ; GFX7-NEXT:    s_mov_b32 m0, -1
697 ; GFX7-NEXT:    s_and_saveexec_b64 s[4:5], vcc
698 ; GFX7-NEXT:    s_cbranch_execz .LBB3_4
699 ; GFX7-NEXT:  ; %bb.1:
700 ; GFX7-NEXT:    s_lshl_b32 s8, s3, 3
701 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
702 ; GFX7-NEXT:    ds_read_b32 v1, v1
703 ; GFX7-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
704 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v2, s6
705 ; GFX7-NEXT:    v_mul_f32_e32 v2, 0x42280000, v2
706 ; GFX7-NEXT:    s_mov_b64 s[6:7], 0
707 ; GFX7-NEXT:  .LBB3_2: ; %atomicrmw.start
708 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
709 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
710 ; GFX7-NEXT:    v_mov_b32_e32 v3, v1
711 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
712 ; GFX7-NEXT:    v_add_f32_e32 v4, v3, v2
713 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v1, v3, v4
714 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
715 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v3
716 ; GFX7-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
717 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[6:7]
718 ; GFX7-NEXT:    s_cbranch_execnz .LBB3_2
719 ; GFX7-NEXT:  ; %bb.3: ; %Flow15
720 ; GFX7-NEXT:    s_or_b64 exec, exec, s[6:7]
721 ; GFX7-NEXT:  .LBB3_4: ; %Flow16
722 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
723 ; GFX7-NEXT:    s_mov_b64 s[6:7], exec
724 ; GFX7-NEXT:    v_readfirstlane_b32 s8, v1
725 ; GFX7-NEXT:    v_mbcnt_lo_u32_b32_e64 v1, s6, 0
726 ; GFX7-NEXT:    v_mbcnt_hi_u32_b32_e32 v1, s7, v1
727 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
728 ; GFX7-NEXT:    s_and_saveexec_b64 s[4:5], vcc
729 ; GFX7-NEXT:    s_cbranch_execz .LBB3_7
730 ; GFX7-NEXT:  ; %bb.5:
731 ; GFX7-NEXT:    s_lshl_b32 s3, s3, 4
732 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
733 ; GFX7-NEXT:    ds_read_b32 v2, v1
734 ; GFX7-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
735 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
736 ; GFX7-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
737 ; GFX7-NEXT:    s_mov_b64 s[6:7], 0
738 ; GFX7-NEXT:  .LBB3_6: ; %atomicrmw.start2
739 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
740 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
741 ; GFX7-NEXT:    v_add_f32_e32 v3, v2, v1
742 ; GFX7-NEXT:    v_mov_b32_e32 v4, s3
743 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v4, v2, v3
744 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
745 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
746 ; GFX7-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
747 ; GFX7-NEXT:    v_mov_b32_e32 v2, v3
748 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[6:7]
749 ; GFX7-NEXT:    s_cbranch_execnz .LBB3_6
750 ; GFX7-NEXT:  .LBB3_7: ; %Flow14
751 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
752 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
753 ; GFX7-NEXT:    ds_read_b32 v1, v1
754 ; GFX7-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
755 ; GFX7-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
756 ; GFX7-NEXT:    v_add_f32_e32 v0, s8, v0
757 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
758 ; GFX7-NEXT:  .LBB3_8: ; %atomicrmw.start8
759 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
760 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
761 ; GFX7-NEXT:    v_mov_b32_e32 v2, v1
762 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
763 ; GFX7-NEXT:    v_add_f32_e32 v3, v2, v0
764 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v1, v2, v3
765 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
766 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
767 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
768 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
769 ; GFX7-NEXT:    s_cbranch_execnz .LBB3_8
770 ; GFX7-NEXT:  ; %bb.9: ; %atomicrmw.end7
771 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
772 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
773 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
774 ; GFX7-NEXT:    s_mov_b32 s2, -1
775 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
776 ; GFX7-NEXT:    buffer_store_dword v1, off, s[0:3], 0
777 ; GFX7-NEXT:    s_endpgm
779 ; GFX8-LABEL: lds_ds_fadd_one_as:
780 ; GFX8:       ; %bb.0:
781 ; GFX8-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0xb
782 ; GFX8-NEXT:    s_mov_b64 s[6:7], exec
783 ; GFX8-NEXT:    v_mbcnt_lo_u32_b32_e64 v0, s6, 0
784 ; GFX8-NEXT:    v_mbcnt_hi_u32_b32_e32 v0, s7, v0
785 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
786 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
787 ; GFX8-NEXT:    s_add_i32 s3, s3, 4
788 ; GFX8-NEXT:    ; implicit-def: $vgpr1
789 ; GFX8-NEXT:    s_mov_b32 m0, -1
790 ; GFX8-NEXT:    s_and_saveexec_b64 s[4:5], vcc
791 ; GFX8-NEXT:    s_cbranch_execz .LBB3_4
792 ; GFX8-NEXT:  ; %bb.1:
793 ; GFX8-NEXT:    s_lshl_b32 s8, s3, 3
794 ; GFX8-NEXT:    v_mov_b32_e32 v1, s8
795 ; GFX8-NEXT:    ds_read_b32 v1, v1
796 ; GFX8-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
797 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v2, s6
798 ; GFX8-NEXT:    v_mul_f32_e32 v2, 0x42280000, v2
799 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
800 ; GFX8-NEXT:  .LBB3_2: ; %atomicrmw.start
801 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
802 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
803 ; GFX8-NEXT:    v_mov_b32_e32 v3, v1
804 ; GFX8-NEXT:    v_mov_b32_e32 v1, s8
805 ; GFX8-NEXT:    v_add_f32_e32 v4, v3, v2
806 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v1, v3, v4
807 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
808 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v3
809 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
810 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
811 ; GFX8-NEXT:    s_cbranch_execnz .LBB3_2
812 ; GFX8-NEXT:  ; %bb.3: ; %Flow17
813 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
814 ; GFX8-NEXT:  .LBB3_4: ; %Flow18
815 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
816 ; GFX8-NEXT:    s_mov_b64 s[6:7], exec
817 ; GFX8-NEXT:    v_readfirstlane_b32 s8, v1
818 ; GFX8-NEXT:    v_mbcnt_lo_u32_b32_e64 v1, s6, 0
819 ; GFX8-NEXT:    v_mbcnt_hi_u32_b32_e32 v1, s7, v1
820 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v1
821 ; GFX8-NEXT:    s_and_saveexec_b64 s[4:5], vcc
822 ; GFX8-NEXT:    s_cbranch_execz .LBB3_7
823 ; GFX8-NEXT:  ; %bb.5:
824 ; GFX8-NEXT:    s_lshl_b32 s3, s3, 4
825 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
826 ; GFX8-NEXT:    ds_read_b32 v2, v1
827 ; GFX8-NEXT:    s_bcnt1_i32_b64 s6, s[6:7]
828 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v1, s6
829 ; GFX8-NEXT:    v_mul_f32_e32 v1, 0x42280000, v1
830 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
831 ; GFX8-NEXT:  .LBB3_6: ; %atomicrmw.start2
832 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
833 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
834 ; GFX8-NEXT:    v_add_f32_e32 v3, v2, v1
835 ; GFX8-NEXT:    v_mov_b32_e32 v4, s3
836 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v4, v2, v3
837 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
838 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
839 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
840 ; GFX8-NEXT:    v_mov_b32_e32 v2, v3
841 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
842 ; GFX8-NEXT:    s_cbranch_execnz .LBB3_6
843 ; GFX8-NEXT:  .LBB3_7: ; %Flow16
844 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
845 ; GFX8-NEXT:    v_mov_b32_e32 v1, s2
846 ; GFX8-NEXT:    ds_read_b32 v1, v1
847 ; GFX8-NEXT:    v_cvt_f32_ubyte0_e32 v0, v0
848 ; GFX8-NEXT:    v_mul_f32_e32 v0, 0x42280000, v0
849 ; GFX8-NEXT:    v_add_f32_e32 v0, s8, v0
850 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
851 ; GFX8-NEXT:  .LBB3_8: ; %atomicrmw.start8
852 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
853 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
854 ; GFX8-NEXT:    v_mov_b32_e32 v2, v1
855 ; GFX8-NEXT:    v_mov_b32_e32 v1, s2
856 ; GFX8-NEXT:    v_add_f32_e32 v3, v2, v0
857 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v1, v2, v3
858 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
859 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
860 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
861 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
862 ; GFX8-NEXT:    s_cbranch_execnz .LBB3_8
863 ; GFX8-NEXT:  ; %bb.9: ; %atomicrmw.end7
864 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
865 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
866 ; GFX8-NEXT:    s_mov_b32 s3, 0xf000
867 ; GFX8-NEXT:    s_mov_b32 s2, -1
868 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
869 ; GFX8-NEXT:    buffer_store_dword v1, off, s[0:3], 0
870 ; GFX8-NEXT:    s_endpgm
871   %idx.add = add nuw i32 %idx, 4
872   %shl0 = shl i32 %idx.add, 3
873   %shl1 = shl i32 %idx.add, 4
874   %ptr0 = inttoptr i32 %shl0 to ptr addrspace(3)
875   %ptr1 = inttoptr i32 %shl1 to ptr addrspace(3)
876   %a1 = atomicrmw fadd ptr addrspace(3) %ptr0, float 4.2e+1 syncscope("one-as") seq_cst
877   %a2 = atomicrmw fadd ptr addrspace(3) %ptr1, float 4.2e+1 syncscope("one-as") seq_cst
878   %a3 = atomicrmw fadd ptr addrspace(3) %ptrf, float %a1 syncscope("one-as") seq_cst
879   store float %a3, ptr addrspace(1) %out
880   ret void
883 define double @lds_atomic_fadd_ret_f64(ptr addrspace(3) %ptr) nounwind {
884 ; VI-LABEL: lds_atomic_fadd_ret_f64:
885 ; VI:       ; %bb.0:
886 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
887 ; VI-NEXT:    s_mov_b32 m0, -1
888 ; VI-NEXT:    v_mov_b32_e32 v2, v0
889 ; VI-NEXT:    ds_read_b64 v[0:1], v0
890 ; VI-NEXT:    s_mov_b64 s[4:5], 0
891 ; VI-NEXT:  .LBB4_1: ; %atomicrmw.start
892 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
893 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
894 ; VI-NEXT:    v_mov_b32_e32 v4, v1
895 ; VI-NEXT:    v_mov_b32_e32 v3, v0
896 ; VI-NEXT:    v_add_f64 v[0:1], v[3:4], 4.0
897 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
898 ; VI-NEXT:    ds_cmpst_rtn_b64 v[0:1], v2, v[3:4], v[0:1]
899 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
900 ; VI-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[3:4]
901 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
902 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
903 ; VI-NEXT:    s_cbranch_execnz .LBB4_1
904 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
905 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
906 ; VI-NEXT:    s_setpc_b64 s[30:31]
908 ; GFX9-LABEL: lds_atomic_fadd_ret_f64:
909 ; GFX9:       ; %bb.0:
910 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
911 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
912 ; GFX9-NEXT:    ds_read_b64 v[0:1], v0
913 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
914 ; GFX9-NEXT:  .LBB4_1: ; %atomicrmw.start
915 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
916 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
917 ; GFX9-NEXT:    v_mov_b32_e32 v4, v1
918 ; GFX9-NEXT:    v_mov_b32_e32 v3, v0
919 ; GFX9-NEXT:    v_add_f64 v[0:1], v[3:4], 4.0
920 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
921 ; GFX9-NEXT:    ds_cmpst_rtn_b64 v[0:1], v2, v[3:4], v[0:1]
922 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
923 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[3:4]
924 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
925 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
926 ; GFX9-NEXT:    s_cbranch_execnz .LBB4_1
927 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
928 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
929 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
931 ; GFX7-LABEL: lds_atomic_fadd_ret_f64:
932 ; GFX7:       ; %bb.0:
933 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
934 ; GFX7-NEXT:    s_mov_b32 m0, -1
935 ; GFX7-NEXT:    v_mov_b32_e32 v2, v0
936 ; GFX7-NEXT:    ds_read_b64 v[0:1], v0
937 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
938 ; GFX7-NEXT:  .LBB4_1: ; %atomicrmw.start
939 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
940 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
941 ; GFX7-NEXT:    v_mov_b32_e32 v4, v1
942 ; GFX7-NEXT:    v_mov_b32_e32 v3, v0
943 ; GFX7-NEXT:    v_add_f64 v[0:1], v[3:4], 4.0
944 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
945 ; GFX7-NEXT:    ds_cmpst_rtn_b64 v[0:1], v2, v[3:4], v[0:1]
946 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
947 ; GFX7-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[3:4]
948 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
949 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
950 ; GFX7-NEXT:    s_cbranch_execnz .LBB4_1
951 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
952 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
953 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
955 ; GFX8-LABEL: lds_atomic_fadd_ret_f64:
956 ; GFX8:       ; %bb.0:
957 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
958 ; GFX8-NEXT:    s_mov_b32 m0, -1
959 ; GFX8-NEXT:    v_mov_b32_e32 v2, v0
960 ; GFX8-NEXT:    ds_read_b64 v[0:1], v0
961 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
962 ; GFX8-NEXT:  .LBB4_1: ; %atomicrmw.start
963 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
964 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
965 ; GFX8-NEXT:    v_mov_b32_e32 v4, v1
966 ; GFX8-NEXT:    v_mov_b32_e32 v3, v0
967 ; GFX8-NEXT:    v_add_f64 v[0:1], v[3:4], 4.0
968 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
969 ; GFX8-NEXT:    ds_cmpst_rtn_b64 v[0:1], v2, v[3:4], v[0:1]
970 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
971 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[0:1], v[3:4]
972 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
973 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
974 ; GFX8-NEXT:    s_cbranch_execnz .LBB4_1
975 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
976 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
977 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
978   %result = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
979   ret double %result
982 define void @lds_atomic_fadd_noret_f64(ptr addrspace(3) %ptr) nounwind {
983 ; VI-LABEL: lds_atomic_fadd_noret_f64:
984 ; VI:       ; %bb.0:
985 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
986 ; VI-NEXT:    s_mov_b32 m0, -1
987 ; VI-NEXT:    ds_read_b64 v[1:2], v0
988 ; VI-NEXT:    s_mov_b64 s[4:5], 0
989 ; VI-NEXT:  .LBB5_1: ; %atomicrmw.start
990 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
991 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
992 ; VI-NEXT:    v_add_f64 v[3:4], v[1:2], 4.0
993 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
994 ; VI-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[1:2], v[3:4]
995 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
996 ; VI-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[1:2]
997 ; VI-NEXT:    v_mov_b32_e32 v1, v3
998 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
999 ; VI-NEXT:    v_mov_b32_e32 v2, v4
1000 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1001 ; VI-NEXT:    s_cbranch_execnz .LBB5_1
1002 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
1003 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
1004 ; VI-NEXT:    s_setpc_b64 s[30:31]
1006 ; GFX9-LABEL: lds_atomic_fadd_noret_f64:
1007 ; GFX9:       ; %bb.0:
1008 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1009 ; GFX9-NEXT:    ds_read_b64 v[1:2], v0
1010 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
1011 ; GFX9-NEXT:  .LBB5_1: ; %atomicrmw.start
1012 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1013 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1014 ; GFX9-NEXT:    v_add_f64 v[3:4], v[1:2], 4.0
1015 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1016 ; GFX9-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[1:2], v[3:4]
1017 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1018 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[1:2]
1019 ; GFX9-NEXT:    v_mov_b32_e32 v1, v3
1020 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1021 ; GFX9-NEXT:    v_mov_b32_e32 v2, v4
1022 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1023 ; GFX9-NEXT:    s_cbranch_execnz .LBB5_1
1024 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1025 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
1026 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1028 ; GFX7-LABEL: lds_atomic_fadd_noret_f64:
1029 ; GFX7:       ; %bb.0:
1030 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1031 ; GFX7-NEXT:    s_mov_b32 m0, -1
1032 ; GFX7-NEXT:    ds_read_b64 v[1:2], v0
1033 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1034 ; GFX7-NEXT:  .LBB5_1: ; %atomicrmw.start
1035 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1036 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1037 ; GFX7-NEXT:    v_add_f64 v[3:4], v[1:2], 4.0
1038 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1039 ; GFX7-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[1:2], v[3:4]
1040 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1041 ; GFX7-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[1:2]
1042 ; GFX7-NEXT:    v_mov_b32_e32 v1, v3
1043 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1044 ; GFX7-NEXT:    v_mov_b32_e32 v2, v4
1045 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1046 ; GFX7-NEXT:    s_cbranch_execnz .LBB5_1
1047 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1048 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1049 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1051 ; GFX8-LABEL: lds_atomic_fadd_noret_f64:
1052 ; GFX8:       ; %bb.0:
1053 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1054 ; GFX8-NEXT:    s_mov_b32 m0, -1
1055 ; GFX8-NEXT:    ds_read_b64 v[1:2], v0
1056 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1057 ; GFX8-NEXT:  .LBB5_1: ; %atomicrmw.start
1058 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1059 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1060 ; GFX8-NEXT:    v_add_f64 v[3:4], v[1:2], 4.0
1061 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1062 ; GFX8-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[1:2], v[3:4]
1063 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1064 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[1:2]
1065 ; GFX8-NEXT:    v_mov_b32_e32 v1, v3
1066 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1067 ; GFX8-NEXT:    v_mov_b32_e32 v2, v4
1068 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1069 ; GFX8-NEXT:    s_cbranch_execnz .LBB5_1
1070 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1071 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1072 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1073   %result = atomicrmw fadd ptr addrspace(3) %ptr, double 4.0 seq_cst
1074   ret void
1077 define float @lds_atomic_fsub_ret_f32(ptr addrspace(3) %ptr, float %val) nounwind {
1078 ; VI-LABEL: lds_atomic_fsub_ret_f32:
1079 ; VI:       ; %bb.0:
1080 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1081 ; VI-NEXT:    s_mov_b32 m0, -1
1082 ; VI-NEXT:    ds_read_b32 v2, v0
1083 ; VI-NEXT:    s_mov_b64 s[4:5], 0
1084 ; VI-NEXT:  .LBB6_1: ; %atomicrmw.start
1085 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
1086 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1087 ; VI-NEXT:    v_mov_b32_e32 v3, v2
1088 ; VI-NEXT:    v_sub_f32_e32 v2, v3, v1
1089 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1090 ; VI-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
1091 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1092 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
1093 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1094 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1095 ; VI-NEXT:    s_cbranch_execnz .LBB6_1
1096 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
1097 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
1098 ; VI-NEXT:    v_mov_b32_e32 v0, v2
1099 ; VI-NEXT:    s_setpc_b64 s[30:31]
1101 ; GFX9-LABEL: lds_atomic_fsub_ret_f32:
1102 ; GFX9:       ; %bb.0:
1103 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1104 ; GFX9-NEXT:    ds_read_b32 v2, v0
1105 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
1106 ; GFX9-NEXT:  .LBB6_1: ; %atomicrmw.start
1107 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1108 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1109 ; GFX9-NEXT:    v_mov_b32_e32 v3, v2
1110 ; GFX9-NEXT:    v_sub_f32_e32 v2, v3, v1
1111 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1112 ; GFX9-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
1113 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1114 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
1115 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1116 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1117 ; GFX9-NEXT:    s_cbranch_execnz .LBB6_1
1118 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1119 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
1120 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
1121 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1123 ; GFX7-LABEL: lds_atomic_fsub_ret_f32:
1124 ; GFX7:       ; %bb.0:
1125 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1126 ; GFX7-NEXT:    s_mov_b32 m0, -1
1127 ; GFX7-NEXT:    ds_read_b32 v2, v0
1128 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1129 ; GFX7-NEXT:  .LBB6_1: ; %atomicrmw.start
1130 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1131 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1132 ; GFX7-NEXT:    v_mov_b32_e32 v3, v2
1133 ; GFX7-NEXT:    v_sub_f32_e32 v2, v3, v1
1134 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1135 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
1136 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1137 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
1138 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1139 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1140 ; GFX7-NEXT:    s_cbranch_execnz .LBB6_1
1141 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1142 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1143 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1144 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1146 ; GFX8-LABEL: lds_atomic_fsub_ret_f32:
1147 ; GFX8:       ; %bb.0:
1148 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1149 ; GFX8-NEXT:    s_mov_b32 m0, -1
1150 ; GFX8-NEXT:    ds_read_b32 v2, v0
1151 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1152 ; GFX8-NEXT:  .LBB6_1: ; %atomicrmw.start
1153 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1154 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1155 ; GFX8-NEXT:    v_mov_b32_e32 v3, v2
1156 ; GFX8-NEXT:    v_sub_f32_e32 v2, v3, v1
1157 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1158 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
1159 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1160 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
1161 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1162 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1163 ; GFX8-NEXT:    s_cbranch_execnz .LBB6_1
1164 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1165 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1166 ; GFX8-NEXT:    v_mov_b32_e32 v0, v2
1167 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1168   %result = atomicrmw fsub ptr addrspace(3) %ptr, float %val seq_cst
1169   ret float %result
1172 define void @lds_atomic_fsub_noret_f32(ptr addrspace(3) %ptr, float %val) nounwind {
1173 ; VI-LABEL: lds_atomic_fsub_noret_f32:
1174 ; VI:       ; %bb.0:
1175 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1176 ; VI-NEXT:    s_mov_b32 m0, -1
1177 ; VI-NEXT:    ds_read_b32 v2, v0
1178 ; VI-NEXT:    s_mov_b64 s[4:5], 0
1179 ; VI-NEXT:  .LBB7_1: ; %atomicrmw.start
1180 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
1181 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1182 ; VI-NEXT:    v_sub_f32_e32 v3, v2, v1
1183 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1184 ; VI-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
1185 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1186 ; VI-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
1187 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1188 ; VI-NEXT:    v_mov_b32_e32 v2, v3
1189 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1190 ; VI-NEXT:    s_cbranch_execnz .LBB7_1
1191 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
1192 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
1193 ; VI-NEXT:    s_setpc_b64 s[30:31]
1195 ; GFX9-LABEL: lds_atomic_fsub_noret_f32:
1196 ; GFX9:       ; %bb.0:
1197 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1198 ; GFX9-NEXT:    ds_read_b32 v2, v0
1199 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
1200 ; GFX9-NEXT:  .LBB7_1: ; %atomicrmw.start
1201 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1202 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1203 ; GFX9-NEXT:    v_sub_f32_e32 v3, v2, v1
1204 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1205 ; GFX9-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
1206 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1207 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
1208 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1209 ; GFX9-NEXT:    v_mov_b32_e32 v2, v3
1210 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1211 ; GFX9-NEXT:    s_cbranch_execnz .LBB7_1
1212 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1213 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
1214 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1216 ; GFX7-LABEL: lds_atomic_fsub_noret_f32:
1217 ; GFX7:       ; %bb.0:
1218 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1219 ; GFX7-NEXT:    s_mov_b32 m0, -1
1220 ; GFX7-NEXT:    ds_read_b32 v2, v0
1221 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1222 ; GFX7-NEXT:  .LBB7_1: ; %atomicrmw.start
1223 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1224 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1225 ; GFX7-NEXT:    v_sub_f32_e32 v3, v2, v1
1226 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1227 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
1228 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1229 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
1230 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1231 ; GFX7-NEXT:    v_mov_b32_e32 v2, v3
1232 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1233 ; GFX7-NEXT:    s_cbranch_execnz .LBB7_1
1234 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1235 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1236 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1238 ; GFX8-LABEL: lds_atomic_fsub_noret_f32:
1239 ; GFX8:       ; %bb.0:
1240 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1241 ; GFX8-NEXT:    s_mov_b32 m0, -1
1242 ; GFX8-NEXT:    ds_read_b32 v2, v0
1243 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1244 ; GFX8-NEXT:  .LBB7_1: ; %atomicrmw.start
1245 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1246 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1247 ; GFX8-NEXT:    v_sub_f32_e32 v3, v2, v1
1248 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1249 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
1250 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1251 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
1252 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1253 ; GFX8-NEXT:    v_mov_b32_e32 v2, v3
1254 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1255 ; GFX8-NEXT:    s_cbranch_execnz .LBB7_1
1256 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1257 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1258 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1259   %result = atomicrmw fsub ptr addrspace(3) %ptr, float %val seq_cst
1260   ret void
1263 define double @lds_atomic_fsub_ret_f64(ptr addrspace(3) %ptr, double %val) nounwind {
1264 ; VI-LABEL: lds_atomic_fsub_ret_f64:
1265 ; VI:       ; %bb.0:
1266 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1267 ; VI-NEXT:    s_mov_b32 m0, -1
1268 ; VI-NEXT:    ds_read_b64 v[3:4], v0
1269 ; VI-NEXT:    s_mov_b64 s[4:5], 0
1270 ; VI-NEXT:  .LBB8_1: ; %atomicrmw.start
1271 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
1272 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1273 ; VI-NEXT:    v_mov_b32_e32 v6, v4
1274 ; VI-NEXT:    v_mov_b32_e32 v5, v3
1275 ; VI-NEXT:    v_add_f64 v[3:4], v[5:6], -v[1:2]
1276 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1277 ; VI-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[5:6], v[3:4]
1278 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1279 ; VI-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1280 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1281 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1282 ; VI-NEXT:    s_cbranch_execnz .LBB8_1
1283 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
1284 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
1285 ; VI-NEXT:    v_mov_b32_e32 v0, v3
1286 ; VI-NEXT:    v_mov_b32_e32 v1, v4
1287 ; VI-NEXT:    s_setpc_b64 s[30:31]
1289 ; GFX9-LABEL: lds_atomic_fsub_ret_f64:
1290 ; GFX9:       ; %bb.0:
1291 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1292 ; GFX9-NEXT:    ds_read_b64 v[3:4], v0
1293 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
1294 ; GFX9-NEXT:  .LBB8_1: ; %atomicrmw.start
1295 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1296 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1297 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
1298 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
1299 ; GFX9-NEXT:    v_add_f64 v[3:4], v[5:6], -v[1:2]
1300 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1301 ; GFX9-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[5:6], v[3:4]
1302 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1303 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1304 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1305 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1306 ; GFX9-NEXT:    s_cbranch_execnz .LBB8_1
1307 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1308 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
1309 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1310 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1311 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1313 ; GFX7-LABEL: lds_atomic_fsub_ret_f64:
1314 ; GFX7:       ; %bb.0:
1315 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1316 ; GFX7-NEXT:    s_mov_b32 m0, -1
1317 ; GFX7-NEXT:    ds_read_b64 v[3:4], v0
1318 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1319 ; GFX7-NEXT:  .LBB8_1: ; %atomicrmw.start
1320 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1321 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1322 ; GFX7-NEXT:    v_mov_b32_e32 v6, v4
1323 ; GFX7-NEXT:    v_mov_b32_e32 v5, v3
1324 ; GFX7-NEXT:    v_add_f64 v[3:4], v[5:6], -v[1:2]
1325 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1326 ; GFX7-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[5:6], v[3:4]
1327 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1328 ; GFX7-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1329 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1330 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1331 ; GFX7-NEXT:    s_cbranch_execnz .LBB8_1
1332 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1333 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1334 ; GFX7-NEXT:    v_mov_b32_e32 v0, v3
1335 ; GFX7-NEXT:    v_mov_b32_e32 v1, v4
1336 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1338 ; GFX8-LABEL: lds_atomic_fsub_ret_f64:
1339 ; GFX8:       ; %bb.0:
1340 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1341 ; GFX8-NEXT:    s_mov_b32 m0, -1
1342 ; GFX8-NEXT:    ds_read_b64 v[3:4], v0
1343 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1344 ; GFX8-NEXT:  .LBB8_1: ; %atomicrmw.start
1345 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1346 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1347 ; GFX8-NEXT:    v_mov_b32_e32 v6, v4
1348 ; GFX8-NEXT:    v_mov_b32_e32 v5, v3
1349 ; GFX8-NEXT:    v_add_f64 v[3:4], v[5:6], -v[1:2]
1350 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1351 ; GFX8-NEXT:    ds_cmpst_rtn_b64 v[3:4], v0, v[5:6], v[3:4]
1352 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1353 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1354 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1355 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1356 ; GFX8-NEXT:    s_cbranch_execnz .LBB8_1
1357 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1358 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1359 ; GFX8-NEXT:    v_mov_b32_e32 v0, v3
1360 ; GFX8-NEXT:    v_mov_b32_e32 v1, v4
1361 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1362   %result = atomicrmw fsub ptr addrspace(3) %ptr, double %val seq_cst
1363   ret double %result
1366 define void @lds_atomic_fsub_noret_f64(ptr addrspace(3) %ptr, double %val) nounwind {
1367 ; VI-LABEL: lds_atomic_fsub_noret_f64:
1368 ; VI:       ; %bb.0:
1369 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1370 ; VI-NEXT:    s_mov_b32 m0, -1
1371 ; VI-NEXT:    ds_read_b64 v[3:4], v0
1372 ; VI-NEXT:    s_mov_b64 s[4:5], 0
1373 ; VI-NEXT:  .LBB9_1: ; %atomicrmw.start
1374 ; VI-NEXT:    ; =>This Inner Loop Header: Depth=1
1375 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1376 ; VI-NEXT:    v_add_f64 v[5:6], v[3:4], -v[1:2]
1377 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1378 ; VI-NEXT:    ds_cmpst_rtn_b64 v[5:6], v0, v[3:4], v[5:6]
1379 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1380 ; VI-NEXT:    v_cmp_eq_u64_e32 vcc, v[5:6], v[3:4]
1381 ; VI-NEXT:    v_mov_b32_e32 v3, v5
1382 ; VI-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1383 ; VI-NEXT:    v_mov_b32_e32 v4, v6
1384 ; VI-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1385 ; VI-NEXT:    s_cbranch_execnz .LBB9_1
1386 ; VI-NEXT:  ; %bb.2: ; %atomicrmw.end
1387 ; VI-NEXT:    s_or_b64 exec, exec, s[4:5]
1388 ; VI-NEXT:    s_setpc_b64 s[30:31]
1390 ; GFX9-LABEL: lds_atomic_fsub_noret_f64:
1391 ; GFX9:       ; %bb.0:
1392 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1393 ; GFX9-NEXT:    ds_read_b64 v[3:4], v0
1394 ; GFX9-NEXT:    s_mov_b64 s[4:5], 0
1395 ; GFX9-NEXT:  .LBB9_1: ; %atomicrmw.start
1396 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1397 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1398 ; GFX9-NEXT:    v_add_f64 v[5:6], v[3:4], -v[1:2]
1399 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1400 ; GFX9-NEXT:    ds_cmpst_rtn_b64 v[5:6], v0, v[3:4], v[5:6]
1401 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1402 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[5:6], v[3:4]
1403 ; GFX9-NEXT:    v_mov_b32_e32 v3, v5
1404 ; GFX9-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1405 ; GFX9-NEXT:    v_mov_b32_e32 v4, v6
1406 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1407 ; GFX9-NEXT:    s_cbranch_execnz .LBB9_1
1408 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1409 ; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
1410 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1412 ; GFX7-LABEL: lds_atomic_fsub_noret_f64:
1413 ; GFX7:       ; %bb.0:
1414 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1415 ; GFX7-NEXT:    s_mov_b32 m0, -1
1416 ; GFX7-NEXT:    ds_read_b64 v[3:4], v0
1417 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1418 ; GFX7-NEXT:  .LBB9_1: ; %atomicrmw.start
1419 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1420 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1421 ; GFX7-NEXT:    v_add_f64 v[5:6], v[3:4], -v[1:2]
1422 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1423 ; GFX7-NEXT:    ds_cmpst_rtn_b64 v[5:6], v0, v[3:4], v[5:6]
1424 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1425 ; GFX7-NEXT:    v_cmp_eq_u64_e32 vcc, v[5:6], v[3:4]
1426 ; GFX7-NEXT:    v_mov_b32_e32 v3, v5
1427 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1428 ; GFX7-NEXT:    v_mov_b32_e32 v4, v6
1429 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1430 ; GFX7-NEXT:    s_cbranch_execnz .LBB9_1
1431 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1432 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1433 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1435 ; GFX8-LABEL: lds_atomic_fsub_noret_f64:
1436 ; GFX8:       ; %bb.0:
1437 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1438 ; GFX8-NEXT:    s_mov_b32 m0, -1
1439 ; GFX8-NEXT:    ds_read_b64 v[3:4], v0
1440 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1441 ; GFX8-NEXT:  .LBB9_1: ; %atomicrmw.start
1442 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1443 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1444 ; GFX8-NEXT:    v_add_f64 v[5:6], v[3:4], -v[1:2]
1445 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1446 ; GFX8-NEXT:    ds_cmpst_rtn_b64 v[5:6], v0, v[3:4], v[5:6]
1447 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1448 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[5:6], v[3:4]
1449 ; GFX8-NEXT:    v_mov_b32_e32 v3, v5
1450 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1451 ; GFX8-NEXT:    v_mov_b32_e32 v4, v6
1452 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1453 ; GFX8-NEXT:    s_cbranch_execnz .LBB9_1
1454 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1455 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1456 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1457   %result = atomicrmw fsub ptr addrspace(3) %ptr, double %val seq_cst
1458   ret void