[clang] Fix crashes when passing VLA to va_arg (#119563)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / local-atomicrmw-fmax.ll
blobd419b0cdfdd1ab5fdabca8b8cf3816057491896c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 < %s | FileCheck -check-prefix=GFX12 %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx940 < %s | FileCheck -check-prefix=GFX940 %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s
5 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s
6 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx90a < %s | FileCheck -check-prefix=GFX90A %s
7 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx908 < %s | FileCheck -check-prefix=GFX908 %s
8 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=tonga < %s | FileCheck -check-prefix=GFX8 %s
9 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=hawaii < %s | FileCheck -check-prefix=GFX7 %s
10 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s
12 ; --------------------------------------------------------------------
13 ; float
14 ; --------------------------------------------------------------------
16 define float @local_atomic_fmax_ret_f32(ptr addrspace(3) %ptr) nounwind {
17 ; GFX12-LABEL: local_atomic_fmax_ret_f32:
18 ; GFX12:       ; %bb.0:
19 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
20 ; GFX12-NEXT:    s_wait_expcnt 0x0
21 ; GFX12-NEXT:    s_wait_samplecnt 0x0
22 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
23 ; GFX12-NEXT:    s_wait_kmcnt 0x0
24 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
25 ; GFX12-NEXT:    s_wait_storecnt 0x0
26 ; GFX12-NEXT:    ds_max_num_rtn_f32 v0, v0, v1
27 ; GFX12-NEXT:    s_wait_dscnt 0x0
28 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
29 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
31 ; GFX940-LABEL: local_atomic_fmax_ret_f32:
32 ; GFX940:       ; %bb.0:
33 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
35 ; GFX940-NEXT:    ds_max_rtn_f32 v0, v0, v1
36 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
37 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
39 ; GFX11-LABEL: local_atomic_fmax_ret_f32:
40 ; GFX11:       ; %bb.0:
41 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
42 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
43 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
44 ; GFX11-NEXT:    ds_max_rtn_f32 v0, v0, v1
45 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
46 ; GFX11-NEXT:    buffer_gl0_inv
47 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
49 ; GFX10-LABEL: local_atomic_fmax_ret_f32:
50 ; GFX10:       ; %bb.0:
51 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
52 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
53 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
54 ; GFX10-NEXT:    ds_max_rtn_f32 v0, v0, v1
55 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
56 ; GFX10-NEXT:    buffer_gl0_inv
57 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
59 ; GFX90A-LABEL: local_atomic_fmax_ret_f32:
60 ; GFX90A:       ; %bb.0:
61 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
62 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
63 ; GFX90A-NEXT:    ds_max_rtn_f32 v0, v0, v1
64 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
65 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
67 ; GFX908-LABEL: local_atomic_fmax_ret_f32:
68 ; GFX908:       ; %bb.0:
69 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
70 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
71 ; GFX908-NEXT:    ds_max_rtn_f32 v0, v0, v1
72 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
73 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
75 ; GFX8-LABEL: local_atomic_fmax_ret_f32:
76 ; GFX8:       ; %bb.0:
77 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
78 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
79 ; GFX8-NEXT:    s_mov_b32 m0, -1
80 ; GFX8-NEXT:    ds_max_rtn_f32 v0, v0, v1
81 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
82 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
84 ; GFX7-LABEL: local_atomic_fmax_ret_f32:
85 ; GFX7:       ; %bb.0:
86 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
87 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
88 ; GFX7-NEXT:    s_mov_b32 m0, -1
89 ; GFX7-NEXT:    ds_max_rtn_f32 v0, v0, v1
90 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
91 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
93 ; GFX6-LABEL: local_atomic_fmax_ret_f32:
94 ; GFX6:       ; %bb.0:
95 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
96 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
97 ; GFX6-NEXT:    s_mov_b32 m0, -1
98 ; GFX6-NEXT:    ds_max_rtn_f32 v0, v0, v1
99 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
100 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
101   %result = atomicrmw fmax ptr addrspace(3) %ptr, float 4.0 seq_cst
102   ret float %result
105 define float @local_atomic_fmax_ret_f32__offset(ptr addrspace(3) %ptr) nounwind {
106 ; GFX12-LABEL: local_atomic_fmax_ret_f32__offset:
107 ; GFX12:       ; %bb.0:
108 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
109 ; GFX12-NEXT:    s_wait_expcnt 0x0
110 ; GFX12-NEXT:    s_wait_samplecnt 0x0
111 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
112 ; GFX12-NEXT:    s_wait_kmcnt 0x0
113 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
114 ; GFX12-NEXT:    s_wait_storecnt 0x0
115 ; GFX12-NEXT:    ds_max_num_rtn_f32 v0, v0, v1 offset:65532
116 ; GFX12-NEXT:    s_wait_dscnt 0x0
117 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
118 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
120 ; GFX940-LABEL: local_atomic_fmax_ret_f32__offset:
121 ; GFX940:       ; %bb.0:
122 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
124 ; GFX940-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
125 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
126 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
128 ; GFX11-LABEL: local_atomic_fmax_ret_f32__offset:
129 ; GFX11:       ; %bb.0:
130 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
131 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
132 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
133 ; GFX11-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
134 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
135 ; GFX11-NEXT:    buffer_gl0_inv
136 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
138 ; GFX10-LABEL: local_atomic_fmax_ret_f32__offset:
139 ; GFX10:       ; %bb.0:
140 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
141 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
142 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
143 ; GFX10-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
144 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
145 ; GFX10-NEXT:    buffer_gl0_inv
146 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
148 ; GFX90A-LABEL: local_atomic_fmax_ret_f32__offset:
149 ; GFX90A:       ; %bb.0:
150 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
151 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
152 ; GFX90A-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
153 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
154 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
156 ; GFX908-LABEL: local_atomic_fmax_ret_f32__offset:
157 ; GFX908:       ; %bb.0:
158 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
159 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
160 ; GFX908-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
161 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
162 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
164 ; GFX8-LABEL: local_atomic_fmax_ret_f32__offset:
165 ; GFX8:       ; %bb.0:
166 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
167 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
168 ; GFX8-NEXT:    s_mov_b32 m0, -1
169 ; GFX8-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
170 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
171 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
173 ; GFX7-LABEL: local_atomic_fmax_ret_f32__offset:
174 ; GFX7:       ; %bb.0:
175 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
176 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
177 ; GFX7-NEXT:    s_mov_b32 m0, -1
178 ; GFX7-NEXT:    ds_max_rtn_f32 v0, v0, v1 offset:65532
179 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
180 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
182 ; GFX6-LABEL: local_atomic_fmax_ret_f32__offset:
183 ; GFX6:       ; %bb.0:
184 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
185 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffc, v0
186 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
187 ; GFX6-NEXT:    s_mov_b32 m0, -1
188 ; GFX6-NEXT:    ds_max_rtn_f32 v0, v0, v1
189 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
190 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
191   %gep = getelementptr float, ptr addrspace(3) %ptr, i32 16383
192   %result = atomicrmw fmax ptr addrspace(3) %gep, float 4.0 seq_cst
193   ret float %result
196 define void @local_atomic_fmax_noret_f32(ptr addrspace(3) %ptr) nounwind {
197 ; GFX12-LABEL: local_atomic_fmax_noret_f32:
198 ; GFX12:       ; %bb.0:
199 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
200 ; GFX12-NEXT:    s_wait_expcnt 0x0
201 ; GFX12-NEXT:    s_wait_samplecnt 0x0
202 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
203 ; GFX12-NEXT:    s_wait_kmcnt 0x0
204 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
205 ; GFX12-NEXT:    s_wait_storecnt 0x0
206 ; GFX12-NEXT:    ds_max_num_f32 v0, v1
207 ; GFX12-NEXT:    s_wait_dscnt 0x0
208 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
209 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
211 ; GFX940-LABEL: local_atomic_fmax_noret_f32:
212 ; GFX940:       ; %bb.0:
213 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
214 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
215 ; GFX940-NEXT:    ds_max_f32 v0, v1
216 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
217 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
219 ; GFX11-LABEL: local_atomic_fmax_noret_f32:
220 ; GFX11:       ; %bb.0:
221 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
222 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
223 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
224 ; GFX11-NEXT:    ds_max_f32 v0, v1
225 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX11-NEXT:    buffer_gl0_inv
227 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
229 ; GFX10-LABEL: local_atomic_fmax_noret_f32:
230 ; GFX10:       ; %bb.0:
231 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
232 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
233 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
234 ; GFX10-NEXT:    ds_max_f32 v0, v1
235 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
236 ; GFX10-NEXT:    buffer_gl0_inv
237 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
239 ; GFX90A-LABEL: local_atomic_fmax_noret_f32:
240 ; GFX90A:       ; %bb.0:
241 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
242 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
243 ; GFX90A-NEXT:    ds_max_f32 v0, v1
244 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
245 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
247 ; GFX908-LABEL: local_atomic_fmax_noret_f32:
248 ; GFX908:       ; %bb.0:
249 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
250 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
251 ; GFX908-NEXT:    ds_max_f32 v0, v1
252 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
253 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
255 ; GFX8-LABEL: local_atomic_fmax_noret_f32:
256 ; GFX8:       ; %bb.0:
257 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
259 ; GFX8-NEXT:    s_mov_b32 m0, -1
260 ; GFX8-NEXT:    ds_max_f32 v0, v1
261 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
262 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
264 ; GFX7-LABEL: local_atomic_fmax_noret_f32:
265 ; GFX7:       ; %bb.0:
266 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
267 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
268 ; GFX7-NEXT:    s_mov_b32 m0, -1
269 ; GFX7-NEXT:    ds_max_f32 v0, v1
270 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
271 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
273 ; GFX6-LABEL: local_atomic_fmax_noret_f32:
274 ; GFX6:       ; %bb.0:
275 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
276 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
277 ; GFX6-NEXT:    s_mov_b32 m0, -1
278 ; GFX6-NEXT:    ds_max_f32 v0, v1
279 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
280 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
281   %result = atomicrmw fmax ptr addrspace(3) %ptr, float 4.0 seq_cst
282   ret void
285 define void @local_atomic_fmax_noret_f32__offset(ptr addrspace(3) %ptr) nounwind {
286 ; GFX12-LABEL: local_atomic_fmax_noret_f32__offset:
287 ; GFX12:       ; %bb.0:
288 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
289 ; GFX12-NEXT:    s_wait_expcnt 0x0
290 ; GFX12-NEXT:    s_wait_samplecnt 0x0
291 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
292 ; GFX12-NEXT:    s_wait_kmcnt 0x0
293 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
294 ; GFX12-NEXT:    s_wait_storecnt 0x0
295 ; GFX12-NEXT:    ds_max_num_f32 v0, v1 offset:65532
296 ; GFX12-NEXT:    s_wait_dscnt 0x0
297 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
298 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
300 ; GFX940-LABEL: local_atomic_fmax_noret_f32__offset:
301 ; GFX940:       ; %bb.0:
302 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
303 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
304 ; GFX940-NEXT:    ds_max_f32 v0, v1 offset:65532
305 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
306 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
308 ; GFX11-LABEL: local_atomic_fmax_noret_f32__offset:
309 ; GFX11:       ; %bb.0:
310 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
311 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
312 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
313 ; GFX11-NEXT:    ds_max_f32 v0, v1 offset:65532
314 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
315 ; GFX11-NEXT:    buffer_gl0_inv
316 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
318 ; GFX10-LABEL: local_atomic_fmax_noret_f32__offset:
319 ; GFX10:       ; %bb.0:
320 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
321 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
322 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
323 ; GFX10-NEXT:    ds_max_f32 v0, v1 offset:65532
324 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
325 ; GFX10-NEXT:    buffer_gl0_inv
326 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
328 ; GFX90A-LABEL: local_atomic_fmax_noret_f32__offset:
329 ; GFX90A:       ; %bb.0:
330 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
331 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
332 ; GFX90A-NEXT:    ds_max_f32 v0, v1 offset:65532
333 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
334 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
336 ; GFX908-LABEL: local_atomic_fmax_noret_f32__offset:
337 ; GFX908:       ; %bb.0:
338 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
339 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
340 ; GFX908-NEXT:    ds_max_f32 v0, v1 offset:65532
341 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
342 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
344 ; GFX8-LABEL: local_atomic_fmax_noret_f32__offset:
345 ; GFX8:       ; %bb.0:
346 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
347 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
348 ; GFX8-NEXT:    s_mov_b32 m0, -1
349 ; GFX8-NEXT:    ds_max_f32 v0, v1 offset:65532
350 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
351 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
353 ; GFX7-LABEL: local_atomic_fmax_noret_f32__offset:
354 ; GFX7:       ; %bb.0:
355 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
356 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
357 ; GFX7-NEXT:    s_mov_b32 m0, -1
358 ; GFX7-NEXT:    ds_max_f32 v0, v1 offset:65532
359 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
360 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
362 ; GFX6-LABEL: local_atomic_fmax_noret_f32__offset:
363 ; GFX6:       ; %bb.0:
364 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
365 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffc, v0
366 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
367 ; GFX6-NEXT:    s_mov_b32 m0, -1
368 ; GFX6-NEXT:    ds_max_f32 v0, v1
369 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
370 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
371   %gep = getelementptr float, ptr addrspace(3) %ptr, i32 16383
372   %unused = atomicrmw fmax ptr addrspace(3) %gep, float 4.0 seq_cst
373   ret void
376 ; --------------------------------------------------------------------
377 ; double
378 ; --------------------------------------------------------------------
380 define double @local_atomic_fmax_ret_f64(ptr addrspace(3) %ptr) nounwind {
381 ; GFX12-LABEL: local_atomic_fmax_ret_f64:
382 ; GFX12:       ; %bb.0:
383 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
384 ; GFX12-NEXT:    s_wait_expcnt 0x0
385 ; GFX12-NEXT:    s_wait_samplecnt 0x0
386 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
387 ; GFX12-NEXT:    s_wait_kmcnt 0x0
388 ; GFX12-NEXT:    v_mov_b32_e32 v1, 0
389 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0x40100000
390 ; GFX12-NEXT:    s_wait_storecnt 0x0
391 ; GFX12-NEXT:    ds_max_num_rtn_f64 v[0:1], v0, v[1:2]
392 ; GFX12-NEXT:    s_wait_dscnt 0x0
393 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
394 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
396 ; GFX940-LABEL: local_atomic_fmax_ret_f64:
397 ; GFX940:       ; %bb.0:
398 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
400 ; GFX940-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3]
401 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
402 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
404 ; GFX11-LABEL: local_atomic_fmax_ret_f64:
405 ; GFX11:       ; %bb.0:
406 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
407 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
408 ; GFX11-NEXT:    v_mov_b32_e32 v2, 0x40100000
409 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
410 ; GFX11-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
411 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
412 ; GFX11-NEXT:    buffer_gl0_inv
413 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
415 ; GFX10-LABEL: local_atomic_fmax_ret_f64:
416 ; GFX10:       ; %bb.0:
417 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
418 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
419 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0x40100000
420 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
421 ; GFX10-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
422 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
423 ; GFX10-NEXT:    buffer_gl0_inv
424 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
426 ; GFX90A-LABEL: local_atomic_fmax_ret_f64:
427 ; GFX90A:       ; %bb.0:
428 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
429 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
430 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
431 ; GFX90A-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3]
432 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
433 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
435 ; GFX908-LABEL: local_atomic_fmax_ret_f64:
436 ; GFX908:       ; %bb.0:
437 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
438 ; GFX908-NEXT:    v_mov_b32_e32 v1, 0
439 ; GFX908-NEXT:    v_mov_b32_e32 v2, 0x40100000
440 ; GFX908-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
441 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
442 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
444 ; GFX8-LABEL: local_atomic_fmax_ret_f64:
445 ; GFX8:       ; %bb.0:
446 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
447 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0
448 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x40100000
449 ; GFX8-NEXT:    s_mov_b32 m0, -1
450 ; GFX8-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
451 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
452 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
454 ; GFX7-LABEL: local_atomic_fmax_ret_f64:
455 ; GFX7:       ; %bb.0:
456 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
457 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
458 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0x40100000
459 ; GFX7-NEXT:    s_mov_b32 m0, -1
460 ; GFX7-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
461 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
462 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
464 ; GFX6-LABEL: local_atomic_fmax_ret_f64:
465 ; GFX6:       ; %bb.0:
466 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
467 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
468 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x40100000
469 ; GFX6-NEXT:    s_mov_b32 m0, -1
470 ; GFX6-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2]
471 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
472 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
473   %result = atomicrmw fmax ptr addrspace(3) %ptr, double 4.0 seq_cst
474   ret double %result
477 define double @local_atomic_fmax_ret_f64__offset(ptr addrspace(3) %ptr) nounwind {
478 ; GFX12-LABEL: local_atomic_fmax_ret_f64__offset:
479 ; GFX12:       ; %bb.0:
480 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
481 ; GFX12-NEXT:    s_wait_expcnt 0x0
482 ; GFX12-NEXT:    s_wait_samplecnt 0x0
483 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
484 ; GFX12-NEXT:    s_wait_kmcnt 0x0
485 ; GFX12-NEXT:    v_mov_b32_e32 v1, 0
486 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0x40100000
487 ; GFX12-NEXT:    s_wait_storecnt 0x0
488 ; GFX12-NEXT:    ds_max_num_rtn_f64 v[0:1], v0, v[1:2] offset:65528
489 ; GFX12-NEXT:    s_wait_dscnt 0x0
490 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
491 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
493 ; GFX940-LABEL: local_atomic_fmax_ret_f64__offset:
494 ; GFX940:       ; %bb.0:
495 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
496 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
497 ; GFX940-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3] offset:65528
498 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
499 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
501 ; GFX11-LABEL: local_atomic_fmax_ret_f64__offset:
502 ; GFX11:       ; %bb.0:
503 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
504 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
505 ; GFX11-NEXT:    v_mov_b32_e32 v2, 0x40100000
506 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
507 ; GFX11-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2] offset:65528
508 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
509 ; GFX11-NEXT:    buffer_gl0_inv
510 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
512 ; GFX10-LABEL: local_atomic_fmax_ret_f64__offset:
513 ; GFX10:       ; %bb.0:
514 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
515 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
516 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0x40100000
517 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
518 ; GFX10-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2] offset:65528
519 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
520 ; GFX10-NEXT:    buffer_gl0_inv
521 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
523 ; GFX90A-LABEL: local_atomic_fmax_ret_f64__offset:
524 ; GFX90A:       ; %bb.0:
525 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
526 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
527 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
528 ; GFX90A-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[2:3] offset:65528
529 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
530 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
532 ; GFX908-LABEL: local_atomic_fmax_ret_f64__offset:
533 ; GFX908:       ; %bb.0:
534 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
535 ; GFX908-NEXT:    v_mov_b32_e32 v1, 0
536 ; GFX908-NEXT:    v_mov_b32_e32 v2, 0x40100000
537 ; GFX908-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2] offset:65528
538 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
539 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
541 ; GFX8-LABEL: local_atomic_fmax_ret_f64__offset:
542 ; GFX8:       ; %bb.0:
543 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
544 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0
545 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x40100000
546 ; GFX8-NEXT:    s_mov_b32 m0, -1
547 ; GFX8-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2] offset:65528
548 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
549 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
551 ; GFX7-LABEL: local_atomic_fmax_ret_f64__offset:
552 ; GFX7:       ; %bb.0:
553 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
554 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
555 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0x40100000
556 ; GFX7-NEXT:    s_mov_b32 m0, -1
557 ; GFX7-NEXT:    ds_max_rtn_f64 v[0:1], v0, v[1:2] offset:65528
558 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
559 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
561 ; GFX6-LABEL: local_atomic_fmax_ret_f64__offset:
562 ; GFX6:       ; %bb.0:
563 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
564 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 0xfff8, v0
565 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
566 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x40100000
567 ; GFX6-NEXT:    s_mov_b32 m0, -1
568 ; GFX6-NEXT:    ds_max_rtn_f64 v[0:1], v2, v[0:1]
569 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
570 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
571   %gep = getelementptr double, ptr addrspace(3) %ptr, i32 8191
572   %result = atomicrmw fmax ptr addrspace(3) %gep, double 4.0 seq_cst
573   ret double %result
576 define void @local_atomic_fmax_noret_f64(ptr addrspace(3) %ptr) nounwind {
577 ; GFX12-LABEL: local_atomic_fmax_noret_f64:
578 ; GFX12:       ; %bb.0:
579 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
580 ; GFX12-NEXT:    s_wait_expcnt 0x0
581 ; GFX12-NEXT:    s_wait_samplecnt 0x0
582 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
583 ; GFX12-NEXT:    s_wait_kmcnt 0x0
584 ; GFX12-NEXT:    v_mov_b32_e32 v1, 0
585 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0x40100000
586 ; GFX12-NEXT:    s_wait_storecnt 0x0
587 ; GFX12-NEXT:    ds_max_num_f64 v0, v[1:2]
588 ; GFX12-NEXT:    s_wait_dscnt 0x0
589 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
590 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
592 ; GFX940-LABEL: local_atomic_fmax_noret_f64:
593 ; GFX940:       ; %bb.0:
594 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
595 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
596 ; GFX940-NEXT:    ds_max_f64 v0, v[2:3]
597 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
598 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
600 ; GFX11-LABEL: local_atomic_fmax_noret_f64:
601 ; GFX11:       ; %bb.0:
602 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
603 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
604 ; GFX11-NEXT:    v_mov_b32_e32 v2, 0x40100000
605 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
606 ; GFX11-NEXT:    ds_max_f64 v0, v[1:2]
607 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
608 ; GFX11-NEXT:    buffer_gl0_inv
609 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
611 ; GFX10-LABEL: local_atomic_fmax_noret_f64:
612 ; GFX10:       ; %bb.0:
613 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
614 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
615 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0x40100000
616 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
617 ; GFX10-NEXT:    ds_max_f64 v0, v[1:2]
618 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
619 ; GFX10-NEXT:    buffer_gl0_inv
620 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
622 ; GFX90A-LABEL: local_atomic_fmax_noret_f64:
623 ; GFX90A:       ; %bb.0:
624 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
625 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
626 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
627 ; GFX90A-NEXT:    ds_max_f64 v0, v[2:3]
628 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
629 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
631 ; GFX908-LABEL: local_atomic_fmax_noret_f64:
632 ; GFX908:       ; %bb.0:
633 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
634 ; GFX908-NEXT:    v_mov_b32_e32 v1, 0
635 ; GFX908-NEXT:    v_mov_b32_e32 v2, 0x40100000
636 ; GFX908-NEXT:    ds_max_f64 v0, v[1:2]
637 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
638 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
640 ; GFX8-LABEL: local_atomic_fmax_noret_f64:
641 ; GFX8:       ; %bb.0:
642 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
643 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0
644 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x40100000
645 ; GFX8-NEXT:    s_mov_b32 m0, -1
646 ; GFX8-NEXT:    ds_max_f64 v0, v[1:2]
647 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
648 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
650 ; GFX7-LABEL: local_atomic_fmax_noret_f64:
651 ; GFX7:       ; %bb.0:
652 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
653 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
654 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0x40100000
655 ; GFX7-NEXT:    s_mov_b32 m0, -1
656 ; GFX7-NEXT:    ds_max_f64 v0, v[1:2]
657 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
658 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
660 ; GFX6-LABEL: local_atomic_fmax_noret_f64:
661 ; GFX6:       ; %bb.0:
662 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
663 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
664 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x40100000
665 ; GFX6-NEXT:    s_mov_b32 m0, -1
666 ; GFX6-NEXT:    ds_max_f64 v0, v[1:2]
667 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
668 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
669   %result = atomicrmw fmax ptr addrspace(3) %ptr, double 4.0 seq_cst
670   ret void
673 define void @local_atomic_fmax_noret_f64__offset(ptr addrspace(3) %ptr) nounwind {
674 ; GFX12-LABEL: local_atomic_fmax_noret_f64__offset:
675 ; GFX12:       ; %bb.0:
676 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
677 ; GFX12-NEXT:    s_wait_expcnt 0x0
678 ; GFX12-NEXT:    s_wait_samplecnt 0x0
679 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
680 ; GFX12-NEXT:    s_wait_kmcnt 0x0
681 ; GFX12-NEXT:    v_mov_b32_e32 v1, 0
682 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0x40100000
683 ; GFX12-NEXT:    s_wait_storecnt 0x0
684 ; GFX12-NEXT:    ds_max_num_f64 v0, v[1:2] offset:65528
685 ; GFX12-NEXT:    s_wait_dscnt 0x0
686 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
687 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
689 ; GFX940-LABEL: local_atomic_fmax_noret_f64__offset:
690 ; GFX940:       ; %bb.0:
691 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
692 ; GFX940-NEXT:    v_mov_b64_e32 v[2:3], 4.0
693 ; GFX940-NEXT:    ds_max_f64 v0, v[2:3] offset:65528
694 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
695 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
697 ; GFX11-LABEL: local_atomic_fmax_noret_f64__offset:
698 ; GFX11:       ; %bb.0:
699 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
700 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
701 ; GFX11-NEXT:    v_mov_b32_e32 v2, 0x40100000
702 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
703 ; GFX11-NEXT:    ds_max_f64 v0, v[1:2] offset:65528
704 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
705 ; GFX11-NEXT:    buffer_gl0_inv
706 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
708 ; GFX10-LABEL: local_atomic_fmax_noret_f64__offset:
709 ; GFX10:       ; %bb.0:
710 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
711 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
712 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0x40100000
713 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
714 ; GFX10-NEXT:    ds_max_f64 v0, v[1:2] offset:65528
715 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
716 ; GFX10-NEXT:    buffer_gl0_inv
717 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
719 ; GFX90A-LABEL: local_atomic_fmax_noret_f64__offset:
720 ; GFX90A:       ; %bb.0:
721 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
722 ; GFX90A-NEXT:    v_mov_b32_e32 v2, 0
723 ; GFX90A-NEXT:    v_mov_b32_e32 v3, 0x40100000
724 ; GFX90A-NEXT:    ds_max_f64 v0, v[2:3] offset:65528
725 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
726 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
728 ; GFX908-LABEL: local_atomic_fmax_noret_f64__offset:
729 ; GFX908:       ; %bb.0:
730 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
731 ; GFX908-NEXT:    v_mov_b32_e32 v1, 0
732 ; GFX908-NEXT:    v_mov_b32_e32 v2, 0x40100000
733 ; GFX908-NEXT:    ds_max_f64 v0, v[1:2] offset:65528
734 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
735 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
737 ; GFX8-LABEL: local_atomic_fmax_noret_f64__offset:
738 ; GFX8:       ; %bb.0:
739 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
740 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0
741 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x40100000
742 ; GFX8-NEXT:    s_mov_b32 m0, -1
743 ; GFX8-NEXT:    ds_max_f64 v0, v[1:2] offset:65528
744 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
745 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
747 ; GFX7-LABEL: local_atomic_fmax_noret_f64__offset:
748 ; GFX7:       ; %bb.0:
749 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
750 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
751 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0x40100000
752 ; GFX7-NEXT:    s_mov_b32 m0, -1
753 ; GFX7-NEXT:    ds_max_f64 v0, v[1:2] offset:65528
754 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
755 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
757 ; GFX6-LABEL: local_atomic_fmax_noret_f64__offset:
758 ; GFX6:       ; %bb.0:
759 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
760 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 0xfff8, v0
761 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
762 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x40100000
763 ; GFX6-NEXT:    s_mov_b32 m0, -1
764 ; GFX6-NEXT:    ds_max_f64 v2, v[0:1]
765 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
766 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
767   %gep = getelementptr double, ptr addrspace(3) %ptr, i32 8191
768   %unused = atomicrmw fmax ptr addrspace(3) %gep, double 4.0 seq_cst
769   ret void
772 ; --------------------------------------------------------------------
773 ; half
774 ; --------------------------------------------------------------------
776 define half @local_atomic_fmax_ret_f16(ptr addrspace(3) %ptr) nounwind {
777 ; GFX12-LABEL: local_atomic_fmax_ret_f16:
778 ; GFX12:       ; %bb.0:
779 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
780 ; GFX12-NEXT:    s_wait_expcnt 0x0
781 ; GFX12-NEXT:    s_wait_samplecnt 0x0
782 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
783 ; GFX12-NEXT:    s_wait_kmcnt 0x0
784 ; GFX12-NEXT:    v_and_b32_e32 v1, -4, v0
785 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
786 ; GFX12-NEXT:    s_mov_b32 s0, 0
787 ; GFX12-NEXT:    ds_load_b32 v3, v1
788 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v0, 0xffff
789 ; GFX12-NEXT:    v_and_b32_e32 v0, 24, v0
790 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
791 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
792 ; GFX12-NEXT:  .LBB8_1: ; %atomicrmw.start
793 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
794 ; GFX12-NEXT:    s_wait_dscnt 0x0
795 ; GFX12-NEXT:    v_mov_b32_e32 v4, v3
796 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
797 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
798 ; GFX12-NEXT:    v_max_num_f16_e32 v3, v3, v3
799 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
800 ; GFX12-NEXT:    v_max_num_f16_e32 v3, 4.0, v3
801 ; GFX12-NEXT:    v_and_b32_e32 v3, 0xffff, v3
802 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
803 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
804 ; GFX12-NEXT:    v_and_or_b32 v3, v4, v2, v3
805 ; GFX12-NEXT:    s_wait_storecnt 0x0
806 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v1, v3, v4
807 ; GFX12-NEXT:    s_wait_dscnt 0x0
808 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
809 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
810 ; GFX12-NEXT:    s_wait_alu 0xfffe
811 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
812 ; GFX12-NEXT:    s_wait_alu 0xfffe
813 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
814 ; GFX12-NEXT:    s_cbranch_execnz .LBB8_1
815 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
816 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
817 ; GFX12-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
818 ; GFX12-NEXT:    s_wait_alu 0xfffe
819 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
821 ; GFX940-LABEL: local_atomic_fmax_ret_f16:
822 ; GFX940:       ; %bb.0:
823 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
824 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
825 ; GFX940-NEXT:    ds_read_b32 v3, v1
826 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
827 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
828 ; GFX940-NEXT:    v_and_b32_e32 v0, 24, v2
829 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v2, s0
830 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
831 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
832 ; GFX940-NEXT:  .LBB8_1: ; %atomicrmw.start
833 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
834 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
835 ; GFX940-NEXT:    v_mov_b32_e32 v4, v3
836 ; GFX940-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
837 ; GFX940-NEXT:    v_max_f16_e32 v3, v3, v3
838 ; GFX940-NEXT:    v_max_f16_e32 v3, 4.0, v3
839 ; GFX940-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
840 ; GFX940-NEXT:    v_and_or_b32 v3, v4, v2, v3
841 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
842 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
843 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
844 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
845 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
846 ; GFX940-NEXT:    s_cbranch_execnz .LBB8_1
847 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
848 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
849 ; GFX940-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
850 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
852 ; GFX11-LABEL: local_atomic_fmax_ret_f16:
853 ; GFX11:       ; %bb.0:
854 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
855 ; GFX11-NEXT:    v_and_b32_e32 v1, -4, v0
856 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
857 ; GFX11-NEXT:    s_mov_b32 s0, 0
858 ; GFX11-NEXT:    ds_load_b32 v3, v1
859 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v0, 0xffff
860 ; GFX11-NEXT:    v_and_b32_e32 v0, 24, v0
861 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
862 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
863 ; GFX11-NEXT:  .LBB8_1: ; %atomicrmw.start
864 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
865 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
866 ; GFX11-NEXT:    v_mov_b32_e32 v4, v3
867 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
868 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
869 ; GFX11-NEXT:    v_max_f16_e32 v3, v3, v3
870 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
871 ; GFX11-NEXT:    v_max_f16_e32 v3, 4.0, v3
872 ; GFX11-NEXT:    v_and_b32_e32 v3, 0xffff, v3
873 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
874 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
875 ; GFX11-NEXT:    v_and_or_b32 v3, v4, v2, v3
876 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
877 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v1, v3, v4
878 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
879 ; GFX11-NEXT:    buffer_gl0_inv
880 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
881 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
882 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
883 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
884 ; GFX11-NEXT:    s_cbranch_execnz .LBB8_1
885 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
886 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
887 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
888 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
890 ; GFX10-LABEL: local_atomic_fmax_ret_f16:
891 ; GFX10:       ; %bb.0:
892 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
893 ; GFX10-NEXT:    v_and_b32_e32 v1, -4, v0
894 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
895 ; GFX10-NEXT:    s_mov_b32 s4, 0
896 ; GFX10-NEXT:    ds_read_b32 v2, v1
897 ; GFX10-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
898 ; GFX10-NEXT:    v_and_b32_e32 v0, 24, v0
899 ; GFX10-NEXT:    v_not_b32_e32 v3, v3
900 ; GFX10-NEXT:  .LBB8_1: ; %atomicrmw.start
901 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
902 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
903 ; GFX10-NEXT:    v_mov_b32_e32 v4, v2
904 ; GFX10-NEXT:    v_lshrrev_b32_e32 v2, v0, v4
905 ; GFX10-NEXT:    v_max_f16_e32 v2, v2, v2
906 ; GFX10-NEXT:    v_max_f16_e32 v2, 4.0, v2
907 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
908 ; GFX10-NEXT:    v_and_or_b32 v2, v4, v3, v2
909 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
910 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v1, v4, v2
911 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
912 ; GFX10-NEXT:    buffer_gl0_inv
913 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
914 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
915 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
916 ; GFX10-NEXT:    s_cbranch_execnz .LBB8_1
917 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
918 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
919 ; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v2
920 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
922 ; GFX90A-LABEL: local_atomic_fmax_ret_f16:
923 ; GFX90A:       ; %bb.0:
924 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
925 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
926 ; GFX90A-NEXT:    ds_read_b32 v3, v1
927 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
928 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
929 ; GFX90A-NEXT:    v_and_b32_e32 v0, 24, v2
930 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
931 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
932 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
933 ; GFX90A-NEXT:  .LBB8_1: ; %atomicrmw.start
934 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
935 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
936 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v3
937 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
938 ; GFX90A-NEXT:    v_max_f16_e32 v3, v3, v3
939 ; GFX90A-NEXT:    v_max_f16_e32 v3, 4.0, v3
940 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
941 ; GFX90A-NEXT:    v_and_or_b32 v3, v4, v2, v3
942 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
943 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
944 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
945 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
946 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
947 ; GFX90A-NEXT:    s_cbranch_execnz .LBB8_1
948 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
949 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
950 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
951 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
953 ; GFX908-LABEL: local_atomic_fmax_ret_f16:
954 ; GFX908:       ; %bb.0:
955 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
956 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
957 ; GFX908-NEXT:    ds_read_b32 v3, v1
958 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
959 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
960 ; GFX908-NEXT:    v_and_b32_e32 v0, 24, v2
961 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
962 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
963 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
964 ; GFX908-NEXT:  .LBB8_1: ; %atomicrmw.start
965 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
966 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
967 ; GFX908-NEXT:    v_mov_b32_e32 v4, v3
968 ; GFX908-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
969 ; GFX908-NEXT:    v_max_f16_e32 v3, v3, v3
970 ; GFX908-NEXT:    v_max_f16_e32 v3, 4.0, v3
971 ; GFX908-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
972 ; GFX908-NEXT:    v_and_or_b32 v3, v4, v2, v3
973 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
974 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
975 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
976 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
977 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
978 ; GFX908-NEXT:    s_cbranch_execnz .LBB8_1
979 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
980 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
981 ; GFX908-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
982 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
984 ; GFX8-LABEL: local_atomic_fmax_ret_f16:
985 ; GFX8:       ; %bb.0:
986 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
987 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
988 ; GFX8-NEXT:    s_mov_b32 m0, -1
989 ; GFX8-NEXT:    ds_read_b32 v3, v1
990 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
991 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
992 ; GFX8-NEXT:    v_and_b32_e32 v0, 24, v2
993 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
994 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
995 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
996 ; GFX8-NEXT:  .LBB8_1: ; %atomicrmw.start
997 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
998 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
999 ; GFX8-NEXT:    v_mov_b32_e32 v4, v3
1000 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1001 ; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
1002 ; GFX8-NEXT:    v_max_f16_e32 v3, 4.0, v3
1003 ; GFX8-NEXT:    v_and_b32_e32 v5, v4, v2
1004 ; GFX8-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1005 ; GFX8-NEXT:    v_or_b32_e32 v3, v5, v3
1006 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1007 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1008 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1009 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1010 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1011 ; GFX8-NEXT:    s_cbranch_execnz .LBB8_1
1012 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1013 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1014 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1015 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1017 ; GFX7-LABEL: local_atomic_fmax_ret_f16:
1018 ; GFX7:       ; %bb.0:
1019 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1020 ; GFX7-NEXT:    v_and_b32_e32 v1, -4, v0
1021 ; GFX7-NEXT:    s_mov_b32 m0, -1
1022 ; GFX7-NEXT:    ds_read_b32 v3, v1
1023 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1024 ; GFX7-NEXT:    v_and_b32_e32 v0, 24, v2
1025 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
1026 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
1027 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1028 ; GFX7-NEXT:  .LBB8_1: ; %atomicrmw.start
1029 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1030 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1031 ; GFX7-NEXT:    v_mov_b32_e32 v4, v3
1032 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1033 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v3
1034 ; GFX7-NEXT:    v_and_b32_e32 v5, v4, v2
1035 ; GFX7-NEXT:    v_max_f32_e32 v3, 4.0, v3
1036 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v3, v3
1037 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1038 ; GFX7-NEXT:    v_or_b32_e32 v3, v5, v3
1039 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1040 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1041 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1042 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1043 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1044 ; GFX7-NEXT:    s_cbranch_execnz .LBB8_1
1045 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1046 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1047 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1048 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v0, v0
1049 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1051 ; GFX6-LABEL: local_atomic_fmax_ret_f16:
1052 ; GFX6:       ; %bb.0:
1053 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1054 ; GFX6-NEXT:    v_and_b32_e32 v1, -4, v0
1055 ; GFX6-NEXT:    s_mov_b32 m0, -1
1056 ; GFX6-NEXT:    ds_read_b32 v3, v1
1057 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1058 ; GFX6-NEXT:    v_and_b32_e32 v0, 24, v2
1059 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
1060 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
1061 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
1062 ; GFX6-NEXT:  .LBB8_1: ; %atomicrmw.start
1063 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
1064 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1065 ; GFX6-NEXT:    v_mov_b32_e32 v4, v3
1066 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1067 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
1068 ; GFX6-NEXT:    v_and_b32_e32 v5, v4, v2
1069 ; GFX6-NEXT:    v_max_f32_e32 v3, 4.0, v3
1070 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
1071 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1072 ; GFX6-NEXT:    v_or_b32_e32 v3, v5, v3
1073 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1074 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1075 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1076 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1077 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1078 ; GFX6-NEXT:    s_cbranch_execnz .LBB8_1
1079 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
1080 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
1081 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1082 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
1083 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1084   %result = atomicrmw fmax ptr addrspace(3) %ptr, half 4.0 seq_cst
1085   ret half %result
1088 define half @local_atomic_fmax_ret_f16__offset(ptr addrspace(3) %ptr) nounwind {
1089 ; GFX12-LABEL: local_atomic_fmax_ret_f16__offset:
1090 ; GFX12:       ; %bb.0:
1091 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1092 ; GFX12-NEXT:    s_wait_expcnt 0x0
1093 ; GFX12-NEXT:    s_wait_samplecnt 0x0
1094 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
1095 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1096 ; GFX12-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1097 ; GFX12-NEXT:    s_mov_b32 s0, 0
1098 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
1099 ; GFX12-NEXT:    v_and_b32_e32 v0, -4, v1
1100 ; GFX12-NEXT:    v_and_b32_e32 v1, 3, v1
1101 ; GFX12-NEXT:    ds_load_b32 v3, v0
1102 ; GFX12-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1103 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1104 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1105 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
1106 ; GFX12-NEXT:  .LBB9_1: ; %atomicrmw.start
1107 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
1108 ; GFX12-NEXT:    s_wait_dscnt 0x0
1109 ; GFX12-NEXT:    v_mov_b32_e32 v4, v3
1110 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1111 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
1112 ; GFX12-NEXT:    v_max_num_f16_e32 v3, v3, v3
1113 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1114 ; GFX12-NEXT:    v_max_num_f16_e32 v3, 4.0, v3
1115 ; GFX12-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1116 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1117 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
1118 ; GFX12-NEXT:    v_and_or_b32 v3, v4, v2, v3
1119 ; GFX12-NEXT:    s_wait_storecnt 0x0
1120 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v4
1121 ; GFX12-NEXT:    s_wait_dscnt 0x0
1122 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
1123 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
1124 ; GFX12-NEXT:    s_wait_alu 0xfffe
1125 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
1126 ; GFX12-NEXT:    s_wait_alu 0xfffe
1127 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1128 ; GFX12-NEXT:    s_cbranch_execnz .LBB9_1
1129 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
1130 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1131 ; GFX12-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
1132 ; GFX12-NEXT:    s_wait_alu 0xfffe
1133 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
1135 ; GFX940-LABEL: local_atomic_fmax_ret_f16__offset:
1136 ; GFX940:       ; %bb.0:
1137 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1138 ; GFX940-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
1139 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
1140 ; GFX940-NEXT:    ds_read_b32 v3, v1
1141 ; GFX940-NEXT:    v_and_b32_e32 v0, 3, v0
1142 ; GFX940-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1143 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
1144 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v0, s0
1145 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
1146 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
1147 ; GFX940-NEXT:  .LBB9_1: ; %atomicrmw.start
1148 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
1149 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1150 ; GFX940-NEXT:    v_mov_b32_e32 v4, v3
1151 ; GFX940-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1152 ; GFX940-NEXT:    v_max_f16_e32 v3, v3, v3
1153 ; GFX940-NEXT:    v_max_f16_e32 v3, 4.0, v3
1154 ; GFX940-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1155 ; GFX940-NEXT:    v_and_or_b32 v3, v4, v2, v3
1156 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1157 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1158 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1159 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1160 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1161 ; GFX940-NEXT:    s_cbranch_execnz .LBB9_1
1162 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
1163 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
1164 ; GFX940-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1165 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1167 ; GFX11-LABEL: local_atomic_fmax_ret_f16__offset:
1168 ; GFX11:       ; %bb.0:
1169 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1170 ; GFX11-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1171 ; GFX11-NEXT:    s_mov_b32 s0, 0
1172 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
1173 ; GFX11-NEXT:    v_and_b32_e32 v0, -4, v1
1174 ; GFX11-NEXT:    v_and_b32_e32 v1, 3, v1
1175 ; GFX11-NEXT:    ds_load_b32 v3, v0
1176 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1177 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1178 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1179 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
1180 ; GFX11-NEXT:  .LBB9_1: ; %atomicrmw.start
1181 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1182 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1183 ; GFX11-NEXT:    v_mov_b32_e32 v4, v3
1184 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1185 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
1186 ; GFX11-NEXT:    v_max_f16_e32 v3, v3, v3
1187 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1188 ; GFX11-NEXT:    v_max_f16_e32 v3, 4.0, v3
1189 ; GFX11-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1190 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1191 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
1192 ; GFX11-NEXT:    v_and_or_b32 v3, v4, v2, v3
1193 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1194 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v4
1195 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1196 ; GFX11-NEXT:    buffer_gl0_inv
1197 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
1198 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
1199 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1200 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1201 ; GFX11-NEXT:    s_cbranch_execnz .LBB9_1
1202 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1203 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1204 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
1205 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1207 ; GFX10-LABEL: local_atomic_fmax_ret_f16__offset:
1208 ; GFX10:       ; %bb.0:
1209 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1210 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1211 ; GFX10-NEXT:    s_mov_b32 s4, 0
1212 ; GFX10-NEXT:    v_and_b32_e32 v0, -4, v1
1213 ; GFX10-NEXT:    v_and_b32_e32 v1, 3, v1
1214 ; GFX10-NEXT:    ds_read_b32 v3, v0
1215 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1216 ; GFX10-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1217 ; GFX10-NEXT:    v_not_b32_e32 v2, v2
1218 ; GFX10-NEXT:  .LBB9_1: ; %atomicrmw.start
1219 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1220 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1221 ; GFX10-NEXT:    v_mov_b32_e32 v4, v3
1222 ; GFX10-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
1223 ; GFX10-NEXT:    v_max_f16_e32 v3, v3, v3
1224 ; GFX10-NEXT:    v_max_f16_e32 v3, 4.0, v3
1225 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1226 ; GFX10-NEXT:    v_and_or_b32 v3, v4, v2, v3
1227 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1228 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
1229 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1230 ; GFX10-NEXT:    buffer_gl0_inv
1231 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
1232 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
1233 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
1234 ; GFX10-NEXT:    s_cbranch_execnz .LBB9_1
1235 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1236 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
1237 ; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
1238 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1240 ; GFX90A-LABEL: local_atomic_fmax_ret_f16__offset:
1241 ; GFX90A:       ; %bb.0:
1242 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1243 ; GFX90A-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
1244 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
1245 ; GFX90A-NEXT:    ds_read_b32 v3, v1
1246 ; GFX90A-NEXT:    v_and_b32_e32 v0, 3, v0
1247 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1248 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
1249 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
1250 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
1251 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1252 ; GFX90A-NEXT:  .LBB9_1: ; %atomicrmw.start
1253 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1254 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1255 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v3
1256 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1257 ; GFX90A-NEXT:    v_max_f16_e32 v3, v3, v3
1258 ; GFX90A-NEXT:    v_max_f16_e32 v3, 4.0, v3
1259 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1260 ; GFX90A-NEXT:    v_and_or_b32 v3, v4, v2, v3
1261 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1262 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1263 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1264 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1265 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1266 ; GFX90A-NEXT:    s_cbranch_execnz .LBB9_1
1267 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1268 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1269 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1270 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1272 ; GFX908-LABEL: local_atomic_fmax_ret_f16__offset:
1273 ; GFX908:       ; %bb.0:
1274 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1275 ; GFX908-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
1276 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
1277 ; GFX908-NEXT:    ds_read_b32 v3, v1
1278 ; GFX908-NEXT:    v_and_b32_e32 v0, 3, v0
1279 ; GFX908-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1280 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
1281 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
1282 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
1283 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
1284 ; GFX908-NEXT:  .LBB9_1: ; %atomicrmw.start
1285 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
1286 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1287 ; GFX908-NEXT:    v_mov_b32_e32 v4, v3
1288 ; GFX908-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1289 ; GFX908-NEXT:    v_max_f16_e32 v3, v3, v3
1290 ; GFX908-NEXT:    v_max_f16_e32 v3, 4.0, v3
1291 ; GFX908-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1292 ; GFX908-NEXT:    v_and_or_b32 v3, v4, v2, v3
1293 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1294 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1295 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1296 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1297 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1298 ; GFX908-NEXT:    s_cbranch_execnz .LBB9_1
1299 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
1300 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
1301 ; GFX908-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1302 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
1304 ; GFX8-LABEL: local_atomic_fmax_ret_f16__offset:
1305 ; GFX8:       ; %bb.0:
1306 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1307 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 0xfffe, v0
1308 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
1309 ; GFX8-NEXT:    s_mov_b32 m0, -1
1310 ; GFX8-NEXT:    ds_read_b32 v3, v1
1311 ; GFX8-NEXT:    v_and_b32_e32 v0, 3, v0
1312 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1313 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
1314 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
1315 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
1316 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1317 ; GFX8-NEXT:  .LBB9_1: ; %atomicrmw.start
1318 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1319 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1320 ; GFX8-NEXT:    v_mov_b32_e32 v4, v3
1321 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
1322 ; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
1323 ; GFX8-NEXT:    v_max_f16_e32 v3, 4.0, v3
1324 ; GFX8-NEXT:    v_and_b32_e32 v5, v4, v2
1325 ; GFX8-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
1326 ; GFX8-NEXT:    v_or_b32_e32 v3, v5, v3
1327 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
1328 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1329 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1330 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1331 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1332 ; GFX8-NEXT:    s_cbranch_execnz .LBB9_1
1333 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1334 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1335 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
1336 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1338 ; GFX7-LABEL: local_atomic_fmax_ret_f16__offset:
1339 ; GFX7:       ; %bb.0:
1340 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1341 ; GFX7-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
1342 ; GFX7-NEXT:    v_and_b32_e32 v0, -4, v1
1343 ; GFX7-NEXT:    s_mov_b32 m0, -1
1344 ; GFX7-NEXT:    ds_read_b32 v3, v0
1345 ; GFX7-NEXT:    v_and_b32_e32 v1, 3, v1
1346 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1347 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
1348 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
1349 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1350 ; GFX7-NEXT:  .LBB9_1: ; %atomicrmw.start
1351 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1352 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1353 ; GFX7-NEXT:    v_mov_b32_e32 v4, v3
1354 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
1355 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v3
1356 ; GFX7-NEXT:    v_and_b32_e32 v5, v4, v2
1357 ; GFX7-NEXT:    v_max_f32_e32 v3, 4.0, v3
1358 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v3, v3
1359 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
1360 ; GFX7-NEXT:    v_or_b32_e32 v3, v5, v3
1361 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
1362 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1363 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1364 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1365 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1366 ; GFX7-NEXT:    s_cbranch_execnz .LBB9_1
1367 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1368 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1369 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
1370 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v0, v0
1371 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1373 ; GFX6-LABEL: local_atomic_fmax_ret_f16__offset:
1374 ; GFX6:       ; %bb.0:
1375 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1376 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
1377 ; GFX6-NEXT:    v_and_b32_e32 v0, -4, v1
1378 ; GFX6-NEXT:    s_mov_b32 m0, -1
1379 ; GFX6-NEXT:    ds_read_b32 v3, v0
1380 ; GFX6-NEXT:    v_and_b32_e32 v1, 3, v1
1381 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1382 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
1383 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
1384 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
1385 ; GFX6-NEXT:  .LBB9_1: ; %atomicrmw.start
1386 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
1387 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1388 ; GFX6-NEXT:    v_mov_b32_e32 v4, v3
1389 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
1390 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
1391 ; GFX6-NEXT:    v_and_b32_e32 v5, v4, v2
1392 ; GFX6-NEXT:    v_max_f32_e32 v3, 4.0, v3
1393 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
1394 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
1395 ; GFX6-NEXT:    v_or_b32_e32 v3, v5, v3
1396 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
1397 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1398 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1399 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1400 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1401 ; GFX6-NEXT:    s_cbranch_execnz .LBB9_1
1402 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
1403 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
1404 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
1405 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
1406 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1407   %gep = getelementptr half, ptr addrspace(3) %ptr, i32 32767
1408   %result = atomicrmw fmax ptr addrspace(3) %gep, half 4.0 seq_cst
1409   ret half %result
1412 define void @local_atomic_fmax_noret_f16(ptr addrspace(3) %ptr) nounwind {
1413 ; GFX12-LABEL: local_atomic_fmax_noret_f16:
1414 ; GFX12:       ; %bb.0:
1415 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1416 ; GFX12-NEXT:    s_wait_expcnt 0x0
1417 ; GFX12-NEXT:    s_wait_samplecnt 0x0
1418 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
1419 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1420 ; GFX12-NEXT:    v_and_b32_e32 v1, -4, v0
1421 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1422 ; GFX12-NEXT:    s_mov_b32 s0, 0
1423 ; GFX12-NEXT:    ds_load_b32 v2, v1
1424 ; GFX12-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
1425 ; GFX12-NEXT:    v_and_b32_e32 v0, 24, v0
1426 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1427 ; GFX12-NEXT:    v_not_b32_e32 v3, v3
1428 ; GFX12-NEXT:  .LBB10_1: ; %atomicrmw.start
1429 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
1430 ; GFX12-NEXT:    s_wait_dscnt 0x0
1431 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1432 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, v0, v2
1433 ; GFX12-NEXT:    v_max_num_f16_e32 v4, v4, v4
1434 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1435 ; GFX12-NEXT:    v_max_num_f16_e32 v4, 4.0, v4
1436 ; GFX12-NEXT:    v_and_b32_e32 v4, 0xffff, v4
1437 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1438 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1439 ; GFX12-NEXT:    v_and_or_b32 v4, v2, v3, v4
1440 ; GFX12-NEXT:    s_wait_storecnt 0x0
1441 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v1, v4, v2
1442 ; GFX12-NEXT:    s_wait_dscnt 0x0
1443 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
1444 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
1445 ; GFX12-NEXT:    v_mov_b32_e32 v2, v4
1446 ; GFX12-NEXT:    s_wait_alu 0xfffe
1447 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
1448 ; GFX12-NEXT:    s_wait_alu 0xfffe
1449 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1450 ; GFX12-NEXT:    s_cbranch_execnz .LBB10_1
1451 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
1452 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1453 ; GFX12-NEXT:    s_wait_alu 0xfffe
1454 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
1456 ; GFX940-LABEL: local_atomic_fmax_noret_f16:
1457 ; GFX940:       ; %bb.0:
1458 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1459 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
1460 ; GFX940-NEXT:    ds_read_b32 v3, v1
1461 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1462 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
1463 ; GFX940-NEXT:    v_and_b32_e32 v0, 24, v2
1464 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v2, s0
1465 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
1466 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
1467 ; GFX940-NEXT:  .LBB10_1: ; %atomicrmw.start
1468 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
1469 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1470 ; GFX940-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1471 ; GFX940-NEXT:    v_max_f16_e32 v4, v4, v4
1472 ; GFX940-NEXT:    v_max_f16_e32 v4, 4.0, v4
1473 ; GFX940-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1474 ; GFX940-NEXT:    v_and_or_b32 v4, v3, v2, v4
1475 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1476 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1477 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1478 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1479 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
1480 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1481 ; GFX940-NEXT:    s_cbranch_execnz .LBB10_1
1482 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
1483 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
1484 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1486 ; GFX11-LABEL: local_atomic_fmax_noret_f16:
1487 ; GFX11:       ; %bb.0:
1488 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1489 ; GFX11-NEXT:    v_and_b32_e32 v1, -4, v0
1490 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1491 ; GFX11-NEXT:    s_mov_b32 s0, 0
1492 ; GFX11-NEXT:    ds_load_b32 v2, v1
1493 ; GFX11-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
1494 ; GFX11-NEXT:    v_and_b32_e32 v0, 24, v0
1495 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1496 ; GFX11-NEXT:    v_not_b32_e32 v3, v3
1497 ; GFX11-NEXT:  .LBB10_1: ; %atomicrmw.start
1498 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1499 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1500 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1501 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, v0, v2
1502 ; GFX11-NEXT:    v_max_f16_e32 v4, v4, v4
1503 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1504 ; GFX11-NEXT:    v_max_f16_e32 v4, 4.0, v4
1505 ; GFX11-NEXT:    v_and_b32_e32 v4, 0xffff, v4
1506 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1507 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1508 ; GFX11-NEXT:    v_and_or_b32 v4, v2, v3, v4
1509 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1510 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v1, v4, v2
1511 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1512 ; GFX11-NEXT:    buffer_gl0_inv
1513 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
1514 ; GFX11-NEXT:    v_mov_b32_e32 v2, v4
1515 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
1516 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1517 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1518 ; GFX11-NEXT:    s_cbranch_execnz .LBB10_1
1519 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1520 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1521 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1523 ; GFX10-LABEL: local_atomic_fmax_noret_f16:
1524 ; GFX10:       ; %bb.0:
1525 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1526 ; GFX10-NEXT:    v_and_b32_e32 v1, -4, v0
1527 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1528 ; GFX10-NEXT:    s_mov_b32 s4, 0
1529 ; GFX10-NEXT:    ds_read_b32 v2, v1
1530 ; GFX10-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
1531 ; GFX10-NEXT:    v_and_b32_e32 v0, 24, v0
1532 ; GFX10-NEXT:    v_not_b32_e32 v3, v3
1533 ; GFX10-NEXT:  .LBB10_1: ; %atomicrmw.start
1534 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1535 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1536 ; GFX10-NEXT:    v_lshrrev_b32_e32 v4, v0, v2
1537 ; GFX10-NEXT:    v_max_f16_e32 v4, v4, v4
1538 ; GFX10-NEXT:    v_max_f16_e32 v4, 4.0, v4
1539 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1540 ; GFX10-NEXT:    v_and_or_b32 v4, v2, v3, v4
1541 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1542 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v1, v2, v4
1543 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1544 ; GFX10-NEXT:    buffer_gl0_inv
1545 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
1546 ; GFX10-NEXT:    v_mov_b32_e32 v2, v4
1547 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
1548 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
1549 ; GFX10-NEXT:    s_cbranch_execnz .LBB10_1
1550 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1551 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
1552 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1554 ; GFX90A-LABEL: local_atomic_fmax_noret_f16:
1555 ; GFX90A:       ; %bb.0:
1556 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1557 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
1558 ; GFX90A-NEXT:    ds_read_b32 v3, v1
1559 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1560 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
1561 ; GFX90A-NEXT:    v_and_b32_e32 v0, 24, v2
1562 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
1563 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
1564 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1565 ; GFX90A-NEXT:  .LBB10_1: ; %atomicrmw.start
1566 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1567 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1568 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1569 ; GFX90A-NEXT:    v_max_f16_e32 v4, v4, v4
1570 ; GFX90A-NEXT:    v_max_f16_e32 v4, 4.0, v4
1571 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1572 ; GFX90A-NEXT:    v_and_or_b32 v4, v3, v2, v4
1573 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1574 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1575 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1576 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1577 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
1578 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1579 ; GFX90A-NEXT:    s_cbranch_execnz .LBB10_1
1580 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1581 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1582 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1584 ; GFX908-LABEL: local_atomic_fmax_noret_f16:
1585 ; GFX908:       ; %bb.0:
1586 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1587 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
1588 ; GFX908-NEXT:    ds_read_b32 v3, v1
1589 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1590 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
1591 ; GFX908-NEXT:    v_and_b32_e32 v0, 24, v2
1592 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
1593 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
1594 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
1595 ; GFX908-NEXT:  .LBB10_1: ; %atomicrmw.start
1596 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
1597 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1598 ; GFX908-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1599 ; GFX908-NEXT:    v_max_f16_e32 v4, v4, v4
1600 ; GFX908-NEXT:    v_max_f16_e32 v4, 4.0, v4
1601 ; GFX908-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1602 ; GFX908-NEXT:    v_and_or_b32 v4, v3, v2, v4
1603 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1604 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1605 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1606 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1607 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
1608 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1609 ; GFX908-NEXT:    s_cbranch_execnz .LBB10_1
1610 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
1611 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
1612 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
1614 ; GFX8-LABEL: local_atomic_fmax_noret_f16:
1615 ; GFX8:       ; %bb.0:
1616 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1617 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
1618 ; GFX8-NEXT:    s_mov_b32 m0, -1
1619 ; GFX8-NEXT:    ds_read_b32 v3, v1
1620 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1621 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
1622 ; GFX8-NEXT:    v_and_b32_e32 v0, 24, v2
1623 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
1624 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
1625 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1626 ; GFX8-NEXT:  .LBB10_1: ; %atomicrmw.start
1627 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1628 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1629 ; GFX8-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1630 ; GFX8-NEXT:    v_max_f16_e32 v4, v4, v4
1631 ; GFX8-NEXT:    v_max_f16_e32 v4, 4.0, v4
1632 ; GFX8-NEXT:    v_and_b32_e32 v5, v3, v2
1633 ; GFX8-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1634 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
1635 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1636 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1637 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1638 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1639 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
1640 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1641 ; GFX8-NEXT:    s_cbranch_execnz .LBB10_1
1642 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1643 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1644 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1646 ; GFX7-LABEL: local_atomic_fmax_noret_f16:
1647 ; GFX7:       ; %bb.0:
1648 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1649 ; GFX7-NEXT:    v_and_b32_e32 v1, -4, v0
1650 ; GFX7-NEXT:    s_mov_b32 m0, -1
1651 ; GFX7-NEXT:    ds_read_b32 v3, v1
1652 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1653 ; GFX7-NEXT:    v_and_b32_e32 v0, 24, v2
1654 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
1655 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
1656 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1657 ; GFX7-NEXT:  .LBB10_1: ; %atomicrmw.start
1658 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1659 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1660 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1661 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
1662 ; GFX7-NEXT:    v_and_b32_e32 v5, v3, v2
1663 ; GFX7-NEXT:    v_max_f32_e32 v4, 4.0, v4
1664 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v4
1665 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1666 ; GFX7-NEXT:    v_or_b32_e32 v4, v5, v4
1667 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1668 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1669 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1670 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1671 ; GFX7-NEXT:    v_mov_b32_e32 v3, v4
1672 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1673 ; GFX7-NEXT:    s_cbranch_execnz .LBB10_1
1674 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1675 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1676 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1678 ; GFX6-LABEL: local_atomic_fmax_noret_f16:
1679 ; GFX6:       ; %bb.0:
1680 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1681 ; GFX6-NEXT:    v_and_b32_e32 v1, -4, v0
1682 ; GFX6-NEXT:    s_mov_b32 m0, -1
1683 ; GFX6-NEXT:    ds_read_b32 v3, v1
1684 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1685 ; GFX6-NEXT:    v_and_b32_e32 v0, 24, v2
1686 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
1687 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
1688 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
1689 ; GFX6-NEXT:  .LBB10_1: ; %atomicrmw.start
1690 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
1691 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1692 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
1693 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
1694 ; GFX6-NEXT:    v_and_b32_e32 v5, v3, v2
1695 ; GFX6-NEXT:    v_max_f32_e32 v4, 4.0, v4
1696 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v4, v4
1697 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
1698 ; GFX6-NEXT:    v_or_b32_e32 v4, v5, v4
1699 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
1700 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1701 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1702 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1703 ; GFX6-NEXT:    v_mov_b32_e32 v3, v4
1704 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1705 ; GFX6-NEXT:    s_cbranch_execnz .LBB10_1
1706 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
1707 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
1708 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1709   %result = atomicrmw fmax ptr addrspace(3) %ptr, half 4.0 seq_cst
1710   ret void
1713 define void @local_atomic_fmax_noret_f16__offset(ptr addrspace(3) %ptr) nounwind {
1714 ; GFX12-LABEL: local_atomic_fmax_noret_f16__offset:
1715 ; GFX12:       ; %bb.0:
1716 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1717 ; GFX12-NEXT:    s_wait_expcnt 0x0
1718 ; GFX12-NEXT:    s_wait_samplecnt 0x0
1719 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
1720 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1721 ; GFX12-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1722 ; GFX12-NEXT:    s_mov_b32 s0, 0
1723 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
1724 ; GFX12-NEXT:    v_and_b32_e32 v0, -4, v1
1725 ; GFX12-NEXT:    v_and_b32_e32 v1, 3, v1
1726 ; GFX12-NEXT:    ds_load_b32 v3, v0
1727 ; GFX12-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1728 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1729 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1730 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
1731 ; GFX12-NEXT:  .LBB11_1: ; %atomicrmw.start
1732 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
1733 ; GFX12-NEXT:    s_wait_dscnt 0x0
1734 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1735 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1736 ; GFX12-NEXT:    v_max_num_f16_e32 v4, v4, v4
1737 ; GFX12-NEXT:    v_max_num_f16_e32 v4, 4.0, v4
1738 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1739 ; GFX12-NEXT:    v_and_b32_e32 v4, 0xffff, v4
1740 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1741 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1742 ; GFX12-NEXT:    v_and_or_b32 v4, v3, v2, v4
1743 ; GFX12-NEXT:    s_wait_storecnt 0x0
1744 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
1745 ; GFX12-NEXT:    s_wait_dscnt 0x0
1746 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
1747 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
1748 ; GFX12-NEXT:    v_mov_b32_e32 v3, v4
1749 ; GFX12-NEXT:    s_wait_alu 0xfffe
1750 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
1751 ; GFX12-NEXT:    s_wait_alu 0xfffe
1752 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1753 ; GFX12-NEXT:    s_cbranch_execnz .LBB11_1
1754 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
1755 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1756 ; GFX12-NEXT:    s_wait_alu 0xfffe
1757 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
1759 ; GFX940-LABEL: local_atomic_fmax_noret_f16__offset:
1760 ; GFX940:       ; %bb.0:
1761 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1762 ; GFX940-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
1763 ; GFX940-NEXT:    v_and_b32_e32 v0, -4, v1
1764 ; GFX940-NEXT:    ds_read_b32 v3, v0
1765 ; GFX940-NEXT:    v_and_b32_e32 v1, 3, v1
1766 ; GFX940-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1767 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
1768 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v1, s0
1769 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
1770 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
1771 ; GFX940-NEXT:  .LBB11_1: ; %atomicrmw.start
1772 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
1773 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1774 ; GFX940-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1775 ; GFX940-NEXT:    v_max_f16_e32 v4, v4, v4
1776 ; GFX940-NEXT:    v_max_f16_e32 v4, 4.0, v4
1777 ; GFX940-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1778 ; GFX940-NEXT:    v_and_or_b32 v4, v3, v2, v4
1779 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1780 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
1781 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1782 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1783 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
1784 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1785 ; GFX940-NEXT:    s_cbranch_execnz .LBB11_1
1786 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
1787 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
1788 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
1790 ; GFX11-LABEL: local_atomic_fmax_noret_f16__offset:
1791 ; GFX11:       ; %bb.0:
1792 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1793 ; GFX11-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1794 ; GFX11-NEXT:    s_mov_b32 s0, 0
1795 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
1796 ; GFX11-NEXT:    v_and_b32_e32 v0, -4, v1
1797 ; GFX11-NEXT:    v_and_b32_e32 v1, 3, v1
1798 ; GFX11-NEXT:    ds_load_b32 v3, v0
1799 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1800 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1801 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1802 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
1803 ; GFX11-NEXT:  .LBB11_1: ; %atomicrmw.start
1804 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1805 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1806 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1807 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1808 ; GFX11-NEXT:    v_max_f16_e32 v4, v4, v4
1809 ; GFX11-NEXT:    v_max_f16_e32 v4, 4.0, v4
1810 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1811 ; GFX11-NEXT:    v_and_b32_e32 v4, 0xffff, v4
1812 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1813 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1814 ; GFX11-NEXT:    v_and_or_b32 v4, v3, v2, v4
1815 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1816 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
1817 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1818 ; GFX11-NEXT:    buffer_gl0_inv
1819 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
1820 ; GFX11-NEXT:    v_mov_b32_e32 v3, v4
1821 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
1822 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1823 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
1824 ; GFX11-NEXT:    s_cbranch_execnz .LBB11_1
1825 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1826 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
1827 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1829 ; GFX10-LABEL: local_atomic_fmax_noret_f16__offset:
1830 ; GFX10:       ; %bb.0:
1831 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1832 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
1833 ; GFX10-NEXT:    s_mov_b32 s4, 0
1834 ; GFX10-NEXT:    v_and_b32_e32 v0, -4, v1
1835 ; GFX10-NEXT:    v_and_b32_e32 v1, 3, v1
1836 ; GFX10-NEXT:    ds_read_b32 v3, v0
1837 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1838 ; GFX10-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
1839 ; GFX10-NEXT:    v_not_b32_e32 v2, v2
1840 ; GFX10-NEXT:  .LBB11_1: ; %atomicrmw.start
1841 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1842 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1843 ; GFX10-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1844 ; GFX10-NEXT:    v_max_f16_e32 v4, v4, v4
1845 ; GFX10-NEXT:    v_max_f16_e32 v4, 4.0, v4
1846 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1847 ; GFX10-NEXT:    v_and_or_b32 v4, v3, v2, v4
1848 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1849 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1850 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1851 ; GFX10-NEXT:    buffer_gl0_inv
1852 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
1853 ; GFX10-NEXT:    v_mov_b32_e32 v3, v4
1854 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
1855 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
1856 ; GFX10-NEXT:    s_cbranch_execnz .LBB11_1
1857 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1858 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
1859 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1861 ; GFX90A-LABEL: local_atomic_fmax_noret_f16__offset:
1862 ; GFX90A:       ; %bb.0:
1863 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1864 ; GFX90A-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
1865 ; GFX90A-NEXT:    v_and_b32_e32 v0, -4, v1
1866 ; GFX90A-NEXT:    ds_read_b32 v3, v0
1867 ; GFX90A-NEXT:    v_and_b32_e32 v1, 3, v1
1868 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1869 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
1870 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
1871 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
1872 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
1873 ; GFX90A-NEXT:  .LBB11_1: ; %atomicrmw.start
1874 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
1875 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1876 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1877 ; GFX90A-NEXT:    v_max_f16_e32 v4, v4, v4
1878 ; GFX90A-NEXT:    v_max_f16_e32 v4, 4.0, v4
1879 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1880 ; GFX90A-NEXT:    v_and_or_b32 v4, v3, v2, v4
1881 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1882 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
1883 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1884 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1885 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
1886 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1887 ; GFX90A-NEXT:    s_cbranch_execnz .LBB11_1
1888 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
1889 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
1890 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
1892 ; GFX908-LABEL: local_atomic_fmax_noret_f16__offset:
1893 ; GFX908:       ; %bb.0:
1894 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1895 ; GFX908-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
1896 ; GFX908-NEXT:    v_and_b32_e32 v0, -4, v1
1897 ; GFX908-NEXT:    ds_read_b32 v3, v0
1898 ; GFX908-NEXT:    v_and_b32_e32 v1, 3, v1
1899 ; GFX908-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1900 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
1901 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
1902 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
1903 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
1904 ; GFX908-NEXT:  .LBB11_1: ; %atomicrmw.start
1905 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
1906 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1907 ; GFX908-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1908 ; GFX908-NEXT:    v_max_f16_e32 v4, v4, v4
1909 ; GFX908-NEXT:    v_max_f16_e32 v4, 4.0, v4
1910 ; GFX908-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1911 ; GFX908-NEXT:    v_and_or_b32 v4, v3, v2, v4
1912 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1913 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
1914 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1915 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1916 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
1917 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1918 ; GFX908-NEXT:    s_cbranch_execnz .LBB11_1
1919 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
1920 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
1921 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
1923 ; GFX8-LABEL: local_atomic_fmax_noret_f16__offset:
1924 ; GFX8:       ; %bb.0:
1925 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1926 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, 0xfffe, v0
1927 ; GFX8-NEXT:    v_and_b32_e32 v0, -4, v1
1928 ; GFX8-NEXT:    s_mov_b32 m0, -1
1929 ; GFX8-NEXT:    ds_read_b32 v3, v0
1930 ; GFX8-NEXT:    v_and_b32_e32 v1, 3, v1
1931 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1932 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
1933 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
1934 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
1935 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
1936 ; GFX8-NEXT:  .LBB11_1: ; %atomicrmw.start
1937 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
1938 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1939 ; GFX8-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1940 ; GFX8-NEXT:    v_max_f16_e32 v4, v4, v4
1941 ; GFX8-NEXT:    v_max_f16_e32 v4, 4.0, v4
1942 ; GFX8-NEXT:    v_and_b32_e32 v5, v3, v2
1943 ; GFX8-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1944 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
1945 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1946 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1947 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1948 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1949 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
1950 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1951 ; GFX8-NEXT:    s_cbranch_execnz .LBB11_1
1952 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
1953 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
1954 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1956 ; GFX7-LABEL: local_atomic_fmax_noret_f16__offset:
1957 ; GFX7:       ; %bb.0:
1958 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1959 ; GFX7-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
1960 ; GFX7-NEXT:    v_and_b32_e32 v0, -4, v1
1961 ; GFX7-NEXT:    s_mov_b32 m0, -1
1962 ; GFX7-NEXT:    ds_read_b32 v3, v0
1963 ; GFX7-NEXT:    v_and_b32_e32 v1, 3, v1
1964 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1965 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
1966 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
1967 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1968 ; GFX7-NEXT:  .LBB11_1: ; %atomicrmw.start
1969 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
1970 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1971 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
1972 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
1973 ; GFX7-NEXT:    v_and_b32_e32 v5, v3, v2
1974 ; GFX7-NEXT:    v_max_f32_e32 v4, 4.0, v4
1975 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v4
1976 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
1977 ; GFX7-NEXT:    v_or_b32_e32 v4, v5, v4
1978 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
1979 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1980 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
1981 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1982 ; GFX7-NEXT:    v_mov_b32_e32 v3, v4
1983 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1984 ; GFX7-NEXT:    s_cbranch_execnz .LBB11_1
1985 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
1986 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
1987 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
1989 ; GFX6-LABEL: local_atomic_fmax_noret_f16__offset:
1990 ; GFX6:       ; %bb.0:
1991 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1992 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
1993 ; GFX6-NEXT:    v_and_b32_e32 v0, -4, v1
1994 ; GFX6-NEXT:    s_mov_b32 m0, -1
1995 ; GFX6-NEXT:    ds_read_b32 v3, v0
1996 ; GFX6-NEXT:    v_and_b32_e32 v1, 3, v1
1997 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
1998 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
1999 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
2000 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
2001 ; GFX6-NEXT:  .LBB11_1: ; %atomicrmw.start
2002 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
2003 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2004 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
2005 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
2006 ; GFX6-NEXT:    v_and_b32_e32 v5, v3, v2
2007 ; GFX6-NEXT:    v_max_f32_e32 v4, 4.0, v4
2008 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v4, v4
2009 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
2010 ; GFX6-NEXT:    v_or_b32_e32 v4, v5, v4
2011 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
2012 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2013 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
2014 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2015 ; GFX6-NEXT:    v_mov_b32_e32 v3, v4
2016 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2017 ; GFX6-NEXT:    s_cbranch_execnz .LBB11_1
2018 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
2019 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
2020 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2021   %gep = getelementptr half, ptr addrspace(3) %ptr, i32 32767
2022   %unused = atomicrmw fmax ptr addrspace(3) %gep, half 4.0 seq_cst
2023   ret void
2026 define half @local_atomic_fmax_ret_f16__offset__align4(ptr addrspace(3) %ptr) nounwind {
2027 ; GFX12-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2028 ; GFX12:       ; %bb.0:
2029 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
2030 ; GFX12-NEXT:    s_wait_expcnt 0x0
2031 ; GFX12-NEXT:    s_wait_samplecnt 0x0
2032 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
2033 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2034 ; GFX12-NEXT:    ds_load_b32 v1, v0 offset:65534
2035 ; GFX12-NEXT:    s_mov_b32 s0, 0
2036 ; GFX12-NEXT:  .LBB12_1: ; %atomicrmw.start
2037 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
2038 ; GFX12-NEXT:    s_wait_dscnt 0x0
2039 ; GFX12-NEXT:    v_mov_b32_e32 v2, v1
2040 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2041 ; GFX12-NEXT:    v_max_num_f16_e32 v1, v2, v2
2042 ; GFX12-NEXT:    v_max_num_f16_e32 v1, 4.0, v1
2043 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2044 ; GFX12-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2045 ; GFX12-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
2046 ; GFX12-NEXT:    s_wait_storecnt 0x0
2047 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:65534
2048 ; GFX12-NEXT:    s_wait_dscnt 0x0
2049 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
2050 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
2051 ; GFX12-NEXT:    s_wait_alu 0xfffe
2052 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
2053 ; GFX12-NEXT:    s_wait_alu 0xfffe
2054 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2055 ; GFX12-NEXT:    s_cbranch_execnz .LBB12_1
2056 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
2057 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2058 ; GFX12-NEXT:    v_mov_b32_e32 v0, v1
2059 ; GFX12-NEXT:    s_wait_alu 0xfffe
2060 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
2062 ; GFX940-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2063 ; GFX940:       ; %bb.0:
2064 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2065 ; GFX940-NEXT:    ds_read_b32 v1, v0 offset:65534
2066 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
2067 ; GFX940-NEXT:    s_mov_b32 s2, 0xffff0000
2068 ; GFX940-NEXT:  .LBB12_1: ; %atomicrmw.start
2069 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
2070 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2071 ; GFX940-NEXT:    v_mov_b32_e32 v2, v1
2072 ; GFX940-NEXT:    v_max_f16_e32 v1, v2, v2
2073 ; GFX940-NEXT:    v_max_f16_e32 v1, 4.0, v1
2074 ; GFX940-NEXT:    v_and_or_b32 v1, v2, s2, v1
2075 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2076 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2077 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2078 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2079 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2080 ; GFX940-NEXT:    s_cbranch_execnz .LBB12_1
2081 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
2082 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
2083 ; GFX940-NEXT:    v_mov_b32_e32 v0, v1
2084 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2086 ; GFX11-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2087 ; GFX11:       ; %bb.0:
2088 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2089 ; GFX11-NEXT:    ds_load_b32 v1, v0 offset:65534
2090 ; GFX11-NEXT:    s_mov_b32 s0, 0
2091 ; GFX11-NEXT:  .LBB12_1: ; %atomicrmw.start
2092 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2093 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2094 ; GFX11-NEXT:    v_mov_b32_e32 v2, v1
2095 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2096 ; GFX11-NEXT:    v_max_f16_e32 v1, v2, v2
2097 ; GFX11-NEXT:    v_max_f16_e32 v1, 4.0, v1
2098 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2099 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2100 ; GFX11-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
2101 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
2102 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:65534
2103 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2104 ; GFX11-NEXT:    buffer_gl0_inv
2105 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
2106 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
2107 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2108 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2109 ; GFX11-NEXT:    s_cbranch_execnz .LBB12_1
2110 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2111 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2112 ; GFX11-NEXT:    v_mov_b32_e32 v0, v1
2113 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2115 ; GFX10-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2116 ; GFX10:       ; %bb.0:
2117 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2118 ; GFX10-NEXT:    ds_read_b32 v1, v0 offset:65534
2119 ; GFX10-NEXT:    s_mov_b32 s4, 0
2120 ; GFX10-NEXT:  .LBB12_1: ; %atomicrmw.start
2121 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2122 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2123 ; GFX10-NEXT:    v_mov_b32_e32 v2, v1
2124 ; GFX10-NEXT:    v_max_f16_e32 v1, v2, v2
2125 ; GFX10-NEXT:    v_max_f16_e32 v1, 4.0, v1
2126 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
2127 ; GFX10-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
2128 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2129 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2130 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2131 ; GFX10-NEXT:    buffer_gl0_inv
2132 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
2133 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
2134 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
2135 ; GFX10-NEXT:    s_cbranch_execnz .LBB12_1
2136 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2137 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
2138 ; GFX10-NEXT:    v_mov_b32_e32 v0, v1
2139 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2141 ; GFX90A-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2142 ; GFX90A:       ; %bb.0:
2143 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2144 ; GFX90A-NEXT:    ds_read_b32 v1, v0 offset:65534
2145 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
2146 ; GFX90A-NEXT:    s_mov_b32 s6, 0xffff0000
2147 ; GFX90A-NEXT:  .LBB12_1: ; %atomicrmw.start
2148 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
2149 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2150 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v1
2151 ; GFX90A-NEXT:    v_max_f16_e32 v1, v2, v2
2152 ; GFX90A-NEXT:    v_max_f16_e32 v1, 4.0, v1
2153 ; GFX90A-NEXT:    v_and_or_b32 v1, v2, s6, v1
2154 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2155 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2156 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2157 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2158 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2159 ; GFX90A-NEXT:    s_cbranch_execnz .LBB12_1
2160 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
2161 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
2162 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v1
2163 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2165 ; GFX908-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2166 ; GFX908:       ; %bb.0:
2167 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2168 ; GFX908-NEXT:    ds_read_b32 v1, v0 offset:65534
2169 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
2170 ; GFX908-NEXT:    s_mov_b32 s6, 0xffff0000
2171 ; GFX908-NEXT:  .LBB12_1: ; %atomicrmw.start
2172 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
2173 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2174 ; GFX908-NEXT:    v_mov_b32_e32 v2, v1
2175 ; GFX908-NEXT:    v_max_f16_e32 v1, v2, v2
2176 ; GFX908-NEXT:    v_max_f16_e32 v1, 4.0, v1
2177 ; GFX908-NEXT:    v_and_or_b32 v1, v2, s6, v1
2178 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2179 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2180 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2181 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2182 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2183 ; GFX908-NEXT:    s_cbranch_execnz .LBB12_1
2184 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
2185 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
2186 ; GFX908-NEXT:    v_mov_b32_e32 v0, v1
2187 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
2189 ; GFX8-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2190 ; GFX8:       ; %bb.0:
2191 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2192 ; GFX8-NEXT:    s_mov_b32 m0, -1
2193 ; GFX8-NEXT:    ds_read_b32 v1, v0 offset:65534
2194 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
2195 ; GFX8-NEXT:  .LBB12_1: ; %atomicrmw.start
2196 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
2197 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2198 ; GFX8-NEXT:    v_mov_b32_e32 v2, v1
2199 ; GFX8-NEXT:    v_max_f16_e32 v1, v2, v2
2200 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
2201 ; GFX8-NEXT:    v_max_f16_e32 v1, 4.0, v1
2202 ; GFX8-NEXT:    v_or_b32_e32 v1, v3, v1
2203 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2204 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2205 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2206 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2207 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2208 ; GFX8-NEXT:    s_cbranch_execnz .LBB12_1
2209 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
2210 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
2211 ; GFX8-NEXT:    v_mov_b32_e32 v0, v1
2212 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2214 ; GFX7-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2215 ; GFX7:       ; %bb.0:
2216 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2217 ; GFX7-NEXT:    s_mov_b32 m0, -1
2218 ; GFX7-NEXT:    ds_read_b32 v1, v0 offset:65534
2219 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2220 ; GFX7-NEXT:  .LBB12_1: ; %atomicrmw.start
2221 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
2222 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2223 ; GFX7-NEXT:    v_mov_b32_e32 v2, v1
2224 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v2
2225 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
2226 ; GFX7-NEXT:    v_max_f32_e32 v1, 4.0, v1
2227 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v1, v1
2228 ; GFX7-NEXT:    v_or_b32_e32 v1, v3, v1
2229 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
2230 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2231 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2232 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2233 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2234 ; GFX7-NEXT:    s_cbranch_execnz .LBB12_1
2235 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
2236 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
2237 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v0, v1
2238 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
2240 ; GFX6-LABEL: local_atomic_fmax_ret_f16__offset__align4:
2241 ; GFX6:       ; %bb.0:
2242 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2243 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffe, v0
2244 ; GFX6-NEXT:    s_mov_b32 m0, -1
2245 ; GFX6-NEXT:    ds_read_b32 v1, v0
2246 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
2247 ; GFX6-NEXT:  .LBB12_1: ; %atomicrmw.start
2248 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
2249 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2250 ; GFX6-NEXT:    v_mov_b32_e32 v2, v1
2251 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v2
2252 ; GFX6-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
2253 ; GFX6-NEXT:    v_max_f32_e32 v1, 4.0, v1
2254 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
2255 ; GFX6-NEXT:    v_or_b32_e32 v1, v3, v1
2256 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1
2257 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2258 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
2259 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2260 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2261 ; GFX6-NEXT:    s_cbranch_execnz .LBB12_1
2262 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
2263 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
2264 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v1
2265 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2266   %gep = getelementptr half, ptr addrspace(3) %ptr, i32 32767
2267   %result = atomicrmw fmax ptr addrspace(3) %gep, half 4.0 seq_cst, align 4
2268   ret half %result
2271 define void @local_atomic_fmax_noret_f16__offset__align4(ptr addrspace(3) %ptr) nounwind {
2272 ; GFX12-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2273 ; GFX12:       ; %bb.0:
2274 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
2275 ; GFX12-NEXT:    s_wait_expcnt 0x0
2276 ; GFX12-NEXT:    s_wait_samplecnt 0x0
2277 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
2278 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2279 ; GFX12-NEXT:    ds_load_b32 v1, v0 offset:65534
2280 ; GFX12-NEXT:    s_mov_b32 s0, 0
2281 ; GFX12-NEXT:  .LBB13_1: ; %atomicrmw.start
2282 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
2283 ; GFX12-NEXT:    s_wait_dscnt 0x0
2284 ; GFX12-NEXT:    v_max_num_f16_e32 v2, v1, v1
2285 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2286 ; GFX12-NEXT:    v_max_num_f16_e32 v2, 4.0, v2
2287 ; GFX12-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2288 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2289 ; GFX12-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
2290 ; GFX12-NEXT:    s_wait_storecnt 0x0
2291 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v1 offset:65534
2292 ; GFX12-NEXT:    s_wait_dscnt 0x0
2293 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
2294 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
2295 ; GFX12-NEXT:    v_mov_b32_e32 v1, v2
2296 ; GFX12-NEXT:    s_wait_alu 0xfffe
2297 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
2298 ; GFX12-NEXT:    s_wait_alu 0xfffe
2299 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2300 ; GFX12-NEXT:    s_cbranch_execnz .LBB13_1
2301 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
2302 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2303 ; GFX12-NEXT:    s_wait_alu 0xfffe
2304 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
2306 ; GFX940-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2307 ; GFX940:       ; %bb.0:
2308 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2309 ; GFX940-NEXT:    ds_read_b32 v1, v0 offset:65534
2310 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
2311 ; GFX940-NEXT:    s_mov_b32 s2, 0xffff0000
2312 ; GFX940-NEXT:  .LBB13_1: ; %atomicrmw.start
2313 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
2314 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2315 ; GFX940-NEXT:    v_max_f16_e32 v2, v1, v1
2316 ; GFX940-NEXT:    v_max_f16_e32 v2, 4.0, v2
2317 ; GFX940-NEXT:    v_and_or_b32 v2, v1, s2, v2
2318 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2319 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2320 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2321 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2322 ; GFX940-NEXT:    v_mov_b32_e32 v1, v2
2323 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2324 ; GFX940-NEXT:    s_cbranch_execnz .LBB13_1
2325 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
2326 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
2327 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2329 ; GFX11-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2330 ; GFX11:       ; %bb.0:
2331 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2332 ; GFX11-NEXT:    ds_load_b32 v1, v0 offset:65534
2333 ; GFX11-NEXT:    s_mov_b32 s0, 0
2334 ; GFX11-NEXT:  .LBB13_1: ; %atomicrmw.start
2335 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2336 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2337 ; GFX11-NEXT:    v_max_f16_e32 v2, v1, v1
2338 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2339 ; GFX11-NEXT:    v_max_f16_e32 v2, 4.0, v2
2340 ; GFX11-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2341 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2342 ; GFX11-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
2343 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
2344 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v1 offset:65534
2345 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2346 ; GFX11-NEXT:    buffer_gl0_inv
2347 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
2348 ; GFX11-NEXT:    v_mov_b32_e32 v1, v2
2349 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
2350 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2351 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2352 ; GFX11-NEXT:    s_cbranch_execnz .LBB13_1
2353 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2354 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2355 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2357 ; GFX10-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2358 ; GFX10:       ; %bb.0:
2359 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2360 ; GFX10-NEXT:    ds_read_b32 v1, v0 offset:65534
2361 ; GFX10-NEXT:    s_mov_b32 s4, 0
2362 ; GFX10-NEXT:  .LBB13_1: ; %atomicrmw.start
2363 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2364 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2365 ; GFX10-NEXT:    v_max_f16_e32 v2, v1, v1
2366 ; GFX10-NEXT:    v_max_f16_e32 v2, 4.0, v2
2367 ; GFX10-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2368 ; GFX10-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
2369 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2370 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2371 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2372 ; GFX10-NEXT:    buffer_gl0_inv
2373 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
2374 ; GFX10-NEXT:    v_mov_b32_e32 v1, v2
2375 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
2376 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
2377 ; GFX10-NEXT:    s_cbranch_execnz .LBB13_1
2378 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2379 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
2380 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2382 ; GFX90A-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2383 ; GFX90A:       ; %bb.0:
2384 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2385 ; GFX90A-NEXT:    ds_read_b32 v1, v0 offset:65534
2386 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
2387 ; GFX90A-NEXT:    s_mov_b32 s6, 0xffff0000
2388 ; GFX90A-NEXT:  .LBB13_1: ; %atomicrmw.start
2389 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
2390 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2391 ; GFX90A-NEXT:    v_max_f16_e32 v2, v1, v1
2392 ; GFX90A-NEXT:    v_max_f16_e32 v2, 4.0, v2
2393 ; GFX90A-NEXT:    v_and_or_b32 v2, v1, s6, v2
2394 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2395 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2396 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2397 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2398 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v2
2399 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2400 ; GFX90A-NEXT:    s_cbranch_execnz .LBB13_1
2401 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
2402 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
2403 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2405 ; GFX908-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2406 ; GFX908:       ; %bb.0:
2407 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2408 ; GFX908-NEXT:    ds_read_b32 v1, v0 offset:65534
2409 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
2410 ; GFX908-NEXT:    s_mov_b32 s6, 0xffff0000
2411 ; GFX908-NEXT:  .LBB13_1: ; %atomicrmw.start
2412 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
2413 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2414 ; GFX908-NEXT:    v_max_f16_e32 v2, v1, v1
2415 ; GFX908-NEXT:    v_max_f16_e32 v2, 4.0, v2
2416 ; GFX908-NEXT:    v_and_or_b32 v2, v1, s6, v2
2417 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2418 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2419 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2420 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2421 ; GFX908-NEXT:    v_mov_b32_e32 v1, v2
2422 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2423 ; GFX908-NEXT:    s_cbranch_execnz .LBB13_1
2424 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
2425 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
2426 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
2428 ; GFX8-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2429 ; GFX8:       ; %bb.0:
2430 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2431 ; GFX8-NEXT:    s_mov_b32 m0, -1
2432 ; GFX8-NEXT:    ds_read_b32 v1, v0 offset:65534
2433 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
2434 ; GFX8-NEXT:  .LBB13_1: ; %atomicrmw.start
2435 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
2436 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2437 ; GFX8-NEXT:    v_max_f16_e32 v2, v1, v1
2438 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
2439 ; GFX8-NEXT:    v_max_f16_e32 v2, 4.0, v2
2440 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2441 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2442 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2443 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2444 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2445 ; GFX8-NEXT:    v_mov_b32_e32 v1, v2
2446 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2447 ; GFX8-NEXT:    s_cbranch_execnz .LBB13_1
2448 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
2449 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
2450 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2452 ; GFX7-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2453 ; GFX7:       ; %bb.0:
2454 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2455 ; GFX7-NEXT:    s_mov_b32 m0, -1
2456 ; GFX7-NEXT:    ds_read_b32 v1, v0 offset:65534
2457 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2458 ; GFX7-NEXT:  .LBB13_1: ; %atomicrmw.start
2459 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
2460 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2461 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v1
2462 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
2463 ; GFX7-NEXT:    v_max_f32_e32 v2, 4.0, v2
2464 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v2, v2
2465 ; GFX7-NEXT:    v_or_b32_e32 v2, v3, v2
2466 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
2467 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2468 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2469 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2470 ; GFX7-NEXT:    v_mov_b32_e32 v1, v2
2471 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2472 ; GFX7-NEXT:    s_cbranch_execnz .LBB13_1
2473 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
2474 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
2475 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
2477 ; GFX6-LABEL: local_atomic_fmax_noret_f16__offset__align4:
2478 ; GFX6:       ; %bb.0:
2479 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2480 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffe, v0
2481 ; GFX6-NEXT:    s_mov_b32 m0, -1
2482 ; GFX6-NEXT:    ds_read_b32 v1, v0
2483 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
2484 ; GFX6-NEXT:  .LBB13_1: ; %atomicrmw.start
2485 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
2486 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2487 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v1
2488 ; GFX6-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
2489 ; GFX6-NEXT:    v_max_f32_e32 v2, 4.0, v2
2490 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2491 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
2492 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2
2493 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2494 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
2495 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2496 ; GFX6-NEXT:    v_mov_b32_e32 v1, v2
2497 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2498 ; GFX6-NEXT:    s_cbranch_execnz .LBB13_1
2499 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
2500 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
2501 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2502   %gep = getelementptr half, ptr addrspace(3) %ptr, i32 32767
2503   %unused = atomicrmw fmax ptr addrspace(3) %gep, half 4.0 seq_cst, align 4
2504   ret void
2507 ; --------------------------------------------------------------------
2508 ; bfloat
2509 ; --------------------------------------------------------------------
2511 define bfloat @local_atomic_fmax_ret_bf16(ptr addrspace(3) %ptr) nounwind {
2512 ; GFX12-LABEL: local_atomic_fmax_ret_bf16:
2513 ; GFX12:       ; %bb.0:
2514 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
2515 ; GFX12-NEXT:    s_wait_expcnt 0x0
2516 ; GFX12-NEXT:    s_wait_samplecnt 0x0
2517 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
2518 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2519 ; GFX12-NEXT:    v_and_b32_e32 v1, -4, v0
2520 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2521 ; GFX12-NEXT:    s_mov_b32 s0, 0
2522 ; GFX12-NEXT:    ds_load_b32 v3, v1
2523 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v0, 0xffff
2524 ; GFX12-NEXT:    v_and_b32_e32 v0, 24, v0
2525 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
2526 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
2527 ; GFX12-NEXT:  .LBB14_1: ; %atomicrmw.start
2528 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
2529 ; GFX12-NEXT:    s_wait_dscnt 0x0
2530 ; GFX12-NEXT:    v_mov_b32_e32 v4, v3
2531 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2532 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
2533 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2534 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2535 ; GFX12-NEXT:    v_max_num_f32_e32 v3, 4.0, v3
2536 ; GFX12-NEXT:    v_bfe_u32 v5, v3, 16, 1
2537 ; GFX12-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2538 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
2539 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
2540 ; GFX12-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
2541 ; GFX12-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
2542 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2543 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2544 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
2545 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2546 ; GFX12-NEXT:    v_and_or_b32 v3, v4, v2, v3
2547 ; GFX12-NEXT:    s_wait_storecnt 0x0
2548 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v1, v3, v4
2549 ; GFX12-NEXT:    s_wait_dscnt 0x0
2550 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
2551 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
2552 ; GFX12-NEXT:    s_wait_alu 0xfffe
2553 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
2554 ; GFX12-NEXT:    s_wait_alu 0xfffe
2555 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2556 ; GFX12-NEXT:    s_cbranch_execnz .LBB14_1
2557 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
2558 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2559 ; GFX12-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2560 ; GFX12-NEXT:    s_wait_alu 0xfffe
2561 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
2563 ; GFX940-LABEL: local_atomic_fmax_ret_bf16:
2564 ; GFX940:       ; %bb.0:
2565 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2566 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
2567 ; GFX940-NEXT:    ds_read_b32 v3, v1
2568 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2569 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
2570 ; GFX940-NEXT:    v_and_b32_e32 v0, 24, v2
2571 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v2, s0
2572 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
2573 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
2574 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
2575 ; GFX940-NEXT:  .LBB14_1: ; %atomicrmw.start
2576 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
2577 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2578 ; GFX940-NEXT:    v_mov_b32_e32 v4, v3
2579 ; GFX940-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2580 ; GFX940-NEXT:    s_nop 0
2581 ; GFX940-NEXT:    v_max_f32_e32 v3, 4.0, v3
2582 ; GFX940-NEXT:    v_bfe_u32 v5, v3, 16, 1
2583 ; GFX940-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2584 ; GFX940-NEXT:    v_add3_u32 v5, v5, v3, s2
2585 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
2586 ; GFX940-NEXT:    s_nop 1
2587 ; GFX940-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
2588 ; GFX940-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2589 ; GFX940-NEXT:    v_and_or_b32 v3, v4, v2, v3
2590 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2591 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2592 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2593 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2594 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2595 ; GFX940-NEXT:    s_cbranch_execnz .LBB14_1
2596 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
2597 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
2598 ; GFX940-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2599 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2601 ; GFX11-LABEL: local_atomic_fmax_ret_bf16:
2602 ; GFX11:       ; %bb.0:
2603 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2604 ; GFX11-NEXT:    v_and_b32_e32 v1, -4, v0
2605 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2606 ; GFX11-NEXT:    s_mov_b32 s0, 0
2607 ; GFX11-NEXT:    ds_load_b32 v3, v1
2608 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v0, 0xffff
2609 ; GFX11-NEXT:    v_and_b32_e32 v0, 24, v0
2610 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
2611 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
2612 ; GFX11-NEXT:    .p2align 6
2613 ; GFX11-NEXT:  .LBB14_1: ; %atomicrmw.start
2614 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2615 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2616 ; GFX11-NEXT:    v_mov_b32_e32 v4, v3
2617 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2618 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
2619 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2620 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2621 ; GFX11-NEXT:    v_max_f32_e32 v3, 4.0, v3
2622 ; GFX11-NEXT:    v_bfe_u32 v5, v3, 16, 1
2623 ; GFX11-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2624 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
2625 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
2626 ; GFX11-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
2627 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
2628 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2629 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2630 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
2631 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2632 ; GFX11-NEXT:    v_and_or_b32 v3, v4, v2, v3
2633 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
2634 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v1, v3, v4
2635 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2636 ; GFX11-NEXT:    buffer_gl0_inv
2637 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
2638 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
2639 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2640 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2641 ; GFX11-NEXT:    s_cbranch_execnz .LBB14_1
2642 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2643 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2644 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2645 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2647 ; GFX10-LABEL: local_atomic_fmax_ret_bf16:
2648 ; GFX10:       ; %bb.0:
2649 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2650 ; GFX10-NEXT:    v_and_b32_e32 v1, -4, v0
2651 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2652 ; GFX10-NEXT:    s_mov_b32 s4, 0
2653 ; GFX10-NEXT:    ds_read_b32 v3, v1
2654 ; GFX10-NEXT:    v_lshlrev_b32_e64 v2, v0, 0xffff
2655 ; GFX10-NEXT:    v_and_b32_e32 v0, 24, v0
2656 ; GFX10-NEXT:    v_not_b32_e32 v2, v2
2657 ; GFX10-NEXT:  .LBB14_1: ; %atomicrmw.start
2658 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2659 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2660 ; GFX10-NEXT:    v_mov_b32_e32 v4, v3
2661 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2662 ; GFX10-NEXT:    v_max_f32_e32 v3, 4.0, v3
2663 ; GFX10-NEXT:    v_bfe_u32 v5, v3, 16, 1
2664 ; GFX10-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2665 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
2666 ; GFX10-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
2667 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
2668 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2669 ; GFX10-NEXT:    v_and_or_b32 v3, v4, v2, v3
2670 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2671 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2672 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2673 ; GFX10-NEXT:    buffer_gl0_inv
2674 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
2675 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
2676 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
2677 ; GFX10-NEXT:    s_cbranch_execnz .LBB14_1
2678 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2679 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
2680 ; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2681 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2683 ; GFX90A-LABEL: local_atomic_fmax_ret_bf16:
2684 ; GFX90A:       ; %bb.0:
2685 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2686 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
2687 ; GFX90A-NEXT:    ds_read_b32 v3, v1
2688 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2689 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
2690 ; GFX90A-NEXT:    v_and_b32_e32 v0, 24, v2
2691 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
2692 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
2693 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
2694 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
2695 ; GFX90A-NEXT:  .LBB14_1: ; %atomicrmw.start
2696 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
2697 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2698 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v3
2699 ; GFX90A-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2700 ; GFX90A-NEXT:    v_max_f32_e32 v3, 4.0, v3
2701 ; GFX90A-NEXT:    v_bfe_u32 v5, v3, 16, 1
2702 ; GFX90A-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2703 ; GFX90A-NEXT:    v_add3_u32 v5, v5, v3, s6
2704 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
2705 ; GFX90A-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
2706 ; GFX90A-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2707 ; GFX90A-NEXT:    v_and_or_b32 v3, v4, v2, v3
2708 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2709 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
2710 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2711 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2712 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2713 ; GFX90A-NEXT:    s_cbranch_execnz .LBB14_1
2714 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
2715 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
2716 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2717 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
2719 ; GFX908-LABEL: local_atomic_fmax_ret_bf16:
2720 ; GFX908:       ; %bb.0:
2721 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2722 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
2723 ; GFX908-NEXT:    ds_read_b32 v3, v1
2724 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2725 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
2726 ; GFX908-NEXT:    v_and_b32_e32 v0, 24, v2
2727 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
2728 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
2729 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
2730 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
2731 ; GFX908-NEXT:  .LBB14_1: ; %atomicrmw.start
2732 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
2733 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2734 ; GFX908-NEXT:    v_mov_b32_e32 v4, v3
2735 ; GFX908-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2736 ; GFX908-NEXT:    v_max_f32_e32 v3, 4.0, v3
2737 ; GFX908-NEXT:    v_bfe_u32 v5, v3, 16, 1
2738 ; GFX908-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2739 ; GFX908-NEXT:    v_add3_u32 v5, v5, v3, s6
2740 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
2741 ; GFX908-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
2742 ; GFX908-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2743 ; GFX908-NEXT:    v_and_or_b32 v3, v4, v2, v3
2744 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2745 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
2746 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2747 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2748 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2749 ; GFX908-NEXT:    s_cbranch_execnz .LBB14_1
2750 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
2751 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
2752 ; GFX908-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2753 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
2755 ; GFX8-LABEL: local_atomic_fmax_ret_bf16:
2756 ; GFX8:       ; %bb.0:
2757 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2758 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
2759 ; GFX8-NEXT:    s_mov_b32 m0, -1
2760 ; GFX8-NEXT:    ds_read_b32 v3, v1
2761 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2762 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
2763 ; GFX8-NEXT:    v_and_b32_e32 v0, 24, v2
2764 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
2765 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
2766 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
2767 ; GFX8-NEXT:  .LBB14_1: ; %atomicrmw.start
2768 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
2769 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2770 ; GFX8-NEXT:    v_mov_b32_e32 v4, v3
2771 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2772 ; GFX8-NEXT:    v_max_f32_e32 v3, 4.0, v3
2773 ; GFX8-NEXT:    v_bfe_u32 v6, v3, 16, 1
2774 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v3
2775 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
2776 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v3
2777 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
2778 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v6, v7, vcc
2779 ; GFX8-NEXT:    v_and_b32_e32 v5, v4, v2
2780 ; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2781 ; GFX8-NEXT:    v_or_b32_e32 v3, v5, v3
2782 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2783 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2784 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2785 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2786 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2787 ; GFX8-NEXT:    s_cbranch_execnz .LBB14_1
2788 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
2789 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
2790 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2791 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2793 ; GFX7-LABEL: local_atomic_fmax_ret_bf16:
2794 ; GFX7:       ; %bb.0:
2795 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2796 ; GFX7-NEXT:    v_and_b32_e32 v1, -4, v0
2797 ; GFX7-NEXT:    s_mov_b32 m0, -1
2798 ; GFX7-NEXT:    ds_read_b32 v3, v1
2799 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2800 ; GFX7-NEXT:    v_and_b32_e32 v0, 24, v2
2801 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
2802 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
2803 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2804 ; GFX7-NEXT:  .LBB14_1: ; %atomicrmw.start
2805 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
2806 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2807 ; GFX7-NEXT:    v_mov_b32_e32 v4, v3
2808 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
2809 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2810 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
2811 ; GFX7-NEXT:    v_max_f32_e32 v3, 4.0, v3
2812 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2813 ; GFX7-NEXT:    v_and_b32_e32 v5, v4, v2
2814 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
2815 ; GFX7-NEXT:    v_or_b32_e32 v3, v5, v3
2816 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2817 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2818 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2819 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2820 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2821 ; GFX7-NEXT:    s_cbranch_execnz .LBB14_1
2822 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
2823 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
2824 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2825 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2826 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
2828 ; GFX6-LABEL: local_atomic_fmax_ret_bf16:
2829 ; GFX6:       ; %bb.0:
2830 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2831 ; GFX6-NEXT:    v_and_b32_e32 v1, -4, v0
2832 ; GFX6-NEXT:    s_mov_b32 m0, -1
2833 ; GFX6-NEXT:    ds_read_b32 v3, v1
2834 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
2835 ; GFX6-NEXT:    v_and_b32_e32 v0, 24, v2
2836 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
2837 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
2838 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
2839 ; GFX6-NEXT:  .LBB14_1: ; %atomicrmw.start
2840 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
2841 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2842 ; GFX6-NEXT:    v_mov_b32_e32 v4, v3
2843 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, v0, v4
2844 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2845 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
2846 ; GFX6-NEXT:    v_max_f32_e32 v3, 4.0, v3
2847 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2848 ; GFX6-NEXT:    v_and_b32_e32 v5, v4, v2
2849 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, v0, v3
2850 ; GFX6-NEXT:    v_or_b32_e32 v3, v5, v3
2851 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2852 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2853 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2854 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2855 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2856 ; GFX6-NEXT:    s_cbranch_execnz .LBB14_1
2857 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
2858 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
2859 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2860 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2861 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2862   %result = atomicrmw fmax ptr addrspace(3) %ptr, bfloat 4.0 seq_cst
2863   ret bfloat %result
2866 define bfloat @local_atomic_fmax_ret_bf16__offset(ptr addrspace(3) %ptr) nounwind {
2867 ; GFX12-LABEL: local_atomic_fmax_ret_bf16__offset:
2868 ; GFX12:       ; %bb.0:
2869 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
2870 ; GFX12-NEXT:    s_wait_expcnt 0x0
2871 ; GFX12-NEXT:    s_wait_samplecnt 0x0
2872 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
2873 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2874 ; GFX12-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
2875 ; GFX12-NEXT:    s_mov_b32 s0, 0
2876 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
2877 ; GFX12-NEXT:    v_and_b32_e32 v0, -4, v1
2878 ; GFX12-NEXT:    v_and_b32_e32 v1, 3, v1
2879 ; GFX12-NEXT:    ds_load_b32 v3, v0
2880 ; GFX12-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
2881 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
2882 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2883 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
2884 ; GFX12-NEXT:  .LBB15_1: ; %atomicrmw.start
2885 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
2886 ; GFX12-NEXT:    s_wait_dscnt 0x0
2887 ; GFX12-NEXT:    v_mov_b32_e32 v4, v3
2888 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2889 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
2890 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2891 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2892 ; GFX12-NEXT:    v_max_num_f32_e32 v3, 4.0, v3
2893 ; GFX12-NEXT:    v_bfe_u32 v5, v3, 16, 1
2894 ; GFX12-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2895 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
2896 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
2897 ; GFX12-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
2898 ; GFX12-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
2899 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2900 ; GFX12-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2901 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
2902 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2903 ; GFX12-NEXT:    v_and_or_b32 v3, v4, v2, v3
2904 ; GFX12-NEXT:    s_wait_storecnt 0x0
2905 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v4
2906 ; GFX12-NEXT:    s_wait_dscnt 0x0
2907 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
2908 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
2909 ; GFX12-NEXT:    s_wait_alu 0xfffe
2910 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
2911 ; GFX12-NEXT:    s_wait_alu 0xfffe
2912 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
2913 ; GFX12-NEXT:    s_cbranch_execnz .LBB15_1
2914 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
2915 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
2916 ; GFX12-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
2917 ; GFX12-NEXT:    s_wait_alu 0xfffe
2918 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
2920 ; GFX940-LABEL: local_atomic_fmax_ret_bf16__offset:
2921 ; GFX940:       ; %bb.0:
2922 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2923 ; GFX940-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
2924 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
2925 ; GFX940-NEXT:    ds_read_b32 v3, v1
2926 ; GFX940-NEXT:    v_and_b32_e32 v0, 3, v0
2927 ; GFX940-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2928 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
2929 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v0, s0
2930 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
2931 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
2932 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
2933 ; GFX940-NEXT:  .LBB15_1: ; %atomicrmw.start
2934 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
2935 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2936 ; GFX940-NEXT:    v_mov_b32_e32 v4, v3
2937 ; GFX940-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2938 ; GFX940-NEXT:    s_nop 0
2939 ; GFX940-NEXT:    v_max_f32_e32 v3, 4.0, v3
2940 ; GFX940-NEXT:    v_bfe_u32 v5, v3, 16, 1
2941 ; GFX940-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2942 ; GFX940-NEXT:    v_add3_u32 v5, v5, v3, s2
2943 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
2944 ; GFX940-NEXT:    s_nop 1
2945 ; GFX940-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
2946 ; GFX940-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2947 ; GFX940-NEXT:    v_and_or_b32 v3, v4, v2, v3
2948 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
2949 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
2950 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2951 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2952 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2953 ; GFX940-NEXT:    s_cbranch_execnz .LBB15_1
2954 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
2955 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
2956 ; GFX940-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
2957 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
2959 ; GFX11-LABEL: local_atomic_fmax_ret_bf16__offset:
2960 ; GFX11:       ; %bb.0:
2961 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2962 ; GFX11-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
2963 ; GFX11-NEXT:    s_mov_b32 s0, 0
2964 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
2965 ; GFX11-NEXT:    v_and_b32_e32 v0, -4, v1
2966 ; GFX11-NEXT:    v_and_b32_e32 v1, 3, v1
2967 ; GFX11-NEXT:    ds_load_b32 v3, v0
2968 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
2969 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
2970 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2971 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
2972 ; GFX11-NEXT:    .p2align 6
2973 ; GFX11-NEXT:  .LBB15_1: ; %atomicrmw.start
2974 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2975 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2976 ; GFX11-NEXT:    v_mov_b32_e32 v4, v3
2977 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2978 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
2979 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2980 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2981 ; GFX11-NEXT:    v_max_f32_e32 v3, 4.0, v3
2982 ; GFX11-NEXT:    v_bfe_u32 v5, v3, 16, 1
2983 ; GFX11-NEXT:    v_or_b32_e32 v6, 0x400000, v3
2984 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
2985 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
2986 ; GFX11-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
2987 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
2988 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2989 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2990 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
2991 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2992 ; GFX11-NEXT:    v_and_or_b32 v3, v4, v2, v3
2993 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
2994 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v4
2995 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2996 ; GFX11-NEXT:    buffer_gl0_inv
2997 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
2998 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
2999 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
3000 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3001 ; GFX11-NEXT:    s_cbranch_execnz .LBB15_1
3002 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
3003 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3004 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
3005 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3007 ; GFX10-LABEL: local_atomic_fmax_ret_bf16__offset:
3008 ; GFX10:       ; %bb.0:
3009 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3010 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
3011 ; GFX10-NEXT:    s_mov_b32 s4, 0
3012 ; GFX10-NEXT:    v_and_b32_e32 v0, -4, v1
3013 ; GFX10-NEXT:    v_and_b32_e32 v1, 3, v1
3014 ; GFX10-NEXT:    ds_read_b32 v3, v0
3015 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3016 ; GFX10-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
3017 ; GFX10-NEXT:    v_not_b32_e32 v2, v2
3018 ; GFX10-NEXT:  .LBB15_1: ; %atomicrmw.start
3019 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
3020 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3021 ; GFX10-NEXT:    v_mov_b32_e32 v4, v3
3022 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v3, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3023 ; GFX10-NEXT:    v_max_f32_e32 v3, 4.0, v3
3024 ; GFX10-NEXT:    v_bfe_u32 v5, v3, 16, 1
3025 ; GFX10-NEXT:    v_or_b32_e32 v6, 0x400000, v3
3026 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v3, v3
3027 ; GFX10-NEXT:    v_add3_u32 v5, v5, v3, 0x7fff
3028 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc_lo
3029 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3030 ; GFX10-NEXT:    v_and_or_b32 v3, v4, v2, v3
3031 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3032 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
3033 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3034 ; GFX10-NEXT:    buffer_gl0_inv
3035 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v4
3036 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
3037 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
3038 ; GFX10-NEXT:    s_cbranch_execnz .LBB15_1
3039 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
3040 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
3041 ; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
3042 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3044 ; GFX90A-LABEL: local_atomic_fmax_ret_bf16__offset:
3045 ; GFX90A:       ; %bb.0:
3046 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3047 ; GFX90A-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
3048 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
3049 ; GFX90A-NEXT:    ds_read_b32 v3, v1
3050 ; GFX90A-NEXT:    v_and_b32_e32 v0, 3, v0
3051 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3052 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
3053 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
3054 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
3055 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
3056 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
3057 ; GFX90A-NEXT:  .LBB15_1: ; %atomicrmw.start
3058 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
3059 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3060 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v3
3061 ; GFX90A-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3062 ; GFX90A-NEXT:    v_max_f32_e32 v3, 4.0, v3
3063 ; GFX90A-NEXT:    v_bfe_u32 v5, v3, 16, 1
3064 ; GFX90A-NEXT:    v_or_b32_e32 v6, 0x400000, v3
3065 ; GFX90A-NEXT:    v_add3_u32 v5, v5, v3, s6
3066 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
3067 ; GFX90A-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
3068 ; GFX90A-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3069 ; GFX90A-NEXT:    v_and_or_b32 v3, v4, v2, v3
3070 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
3071 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3072 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3073 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3074 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3075 ; GFX90A-NEXT:    s_cbranch_execnz .LBB15_1
3076 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
3077 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
3078 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
3079 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
3081 ; GFX908-LABEL: local_atomic_fmax_ret_bf16__offset:
3082 ; GFX908:       ; %bb.0:
3083 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3084 ; GFX908-NEXT:    v_add_u32_e32 v0, 0xfffe, v0
3085 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
3086 ; GFX908-NEXT:    ds_read_b32 v3, v1
3087 ; GFX908-NEXT:    v_and_b32_e32 v0, 3, v0
3088 ; GFX908-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3089 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
3090 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
3091 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
3092 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
3093 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
3094 ; GFX908-NEXT:  .LBB15_1: ; %atomicrmw.start
3095 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
3096 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3097 ; GFX908-NEXT:    v_mov_b32_e32 v4, v3
3098 ; GFX908-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3099 ; GFX908-NEXT:    v_max_f32_e32 v3, 4.0, v3
3100 ; GFX908-NEXT:    v_bfe_u32 v5, v3, 16, 1
3101 ; GFX908-NEXT:    v_or_b32_e32 v6, 0x400000, v3
3102 ; GFX908-NEXT:    v_add3_u32 v5, v5, v3, s6
3103 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
3104 ; GFX908-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
3105 ; GFX908-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3106 ; GFX908-NEXT:    v_and_or_b32 v3, v4, v2, v3
3107 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
3108 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3109 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3110 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3111 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3112 ; GFX908-NEXT:    s_cbranch_execnz .LBB15_1
3113 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
3114 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
3115 ; GFX908-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
3116 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
3118 ; GFX8-LABEL: local_atomic_fmax_ret_bf16__offset:
3119 ; GFX8:       ; %bb.0:
3120 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3121 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 0xfffe, v0
3122 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
3123 ; GFX8-NEXT:    s_mov_b32 m0, -1
3124 ; GFX8-NEXT:    ds_read_b32 v3, v1
3125 ; GFX8-NEXT:    v_and_b32_e32 v0, 3, v0
3126 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3127 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
3128 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v0, s4
3129 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
3130 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
3131 ; GFX8-NEXT:  .LBB15_1: ; %atomicrmw.start
3132 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
3133 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3134 ; GFX8-NEXT:    v_mov_b32_e32 v4, v3
3135 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v3, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3136 ; GFX8-NEXT:    v_max_f32_e32 v3, 4.0, v3
3137 ; GFX8-NEXT:    v_bfe_u32 v6, v3, 16, 1
3138 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v3
3139 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
3140 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v3
3141 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
3142 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v6, v7, vcc
3143 ; GFX8-NEXT:    v_and_b32_e32 v5, v4, v2
3144 ; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3145 ; GFX8-NEXT:    v_or_b32_e32 v3, v5, v3
3146 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v3, v1, v4, v3
3147 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3148 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3149 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3150 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3151 ; GFX8-NEXT:    s_cbranch_execnz .LBB15_1
3152 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
3153 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
3154 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v0, v3
3155 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3157 ; GFX7-LABEL: local_atomic_fmax_ret_bf16__offset:
3158 ; GFX7:       ; %bb.0:
3159 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3160 ; GFX7-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
3161 ; GFX7-NEXT:    v_and_b32_e32 v0, -4, v1
3162 ; GFX7-NEXT:    s_mov_b32 m0, -1
3163 ; GFX7-NEXT:    ds_read_b32 v3, v0
3164 ; GFX7-NEXT:    v_and_b32_e32 v1, 3, v1
3165 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3166 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
3167 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
3168 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3169 ; GFX7-NEXT:  .LBB15_1: ; %atomicrmw.start
3170 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
3171 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3172 ; GFX7-NEXT:    v_mov_b32_e32 v4, v3
3173 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
3174 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3175 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
3176 ; GFX7-NEXT:    v_max_f32_e32 v3, 4.0, v3
3177 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
3178 ; GFX7-NEXT:    v_and_b32_e32 v5, v4, v2
3179 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
3180 ; GFX7-NEXT:    v_or_b32_e32 v3, v5, v3
3181 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
3182 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3183 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3184 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3185 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3186 ; GFX7-NEXT:    s_cbranch_execnz .LBB15_1
3187 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
3188 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
3189 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
3190 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3191 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
3193 ; GFX6-LABEL: local_atomic_fmax_ret_bf16__offset:
3194 ; GFX6:       ; %bb.0:
3195 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3196 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
3197 ; GFX6-NEXT:    v_and_b32_e32 v0, -4, v1
3198 ; GFX6-NEXT:    s_mov_b32 m0, -1
3199 ; GFX6-NEXT:    ds_read_b32 v3, v0
3200 ; GFX6-NEXT:    v_and_b32_e32 v1, 3, v1
3201 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3202 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
3203 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
3204 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
3205 ; GFX6-NEXT:  .LBB15_1: ; %atomicrmw.start
3206 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
3207 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3208 ; GFX6-NEXT:    v_mov_b32_e32 v4, v3
3209 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, v1, v4
3210 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3211 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
3212 ; GFX6-NEXT:    v_max_f32_e32 v3, 4.0, v3
3213 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
3214 ; GFX6-NEXT:    v_and_b32_e32 v5, v4, v2
3215 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, v1, v3
3216 ; GFX6-NEXT:    v_or_b32_e32 v3, v5, v3
3217 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v3, v0, v4, v3
3218 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3219 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3220 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3221 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3222 ; GFX6-NEXT:    s_cbranch_execnz .LBB15_1
3223 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
3224 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
3225 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, v1, v3
3226 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3227 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3228   %gep = getelementptr bfloat, ptr addrspace(3) %ptr, i32 32767
3229   %result = atomicrmw fmax ptr addrspace(3) %gep, bfloat 4.0 seq_cst
3230   ret bfloat %result
3233 define void @local_atomic_fmax_noret_bf16(ptr addrspace(3) %ptr) nounwind {
3234 ; GFX12-LABEL: local_atomic_fmax_noret_bf16:
3235 ; GFX12:       ; %bb.0:
3236 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
3237 ; GFX12-NEXT:    s_wait_expcnt 0x0
3238 ; GFX12-NEXT:    s_wait_samplecnt 0x0
3239 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
3240 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3241 ; GFX12-NEXT:    v_and_b32_e32 v1, -4, v0
3242 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3243 ; GFX12-NEXT:    s_mov_b32 s0, 0
3244 ; GFX12-NEXT:    ds_load_b32 v2, v1
3245 ; GFX12-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
3246 ; GFX12-NEXT:    v_and_b32_e32 v0, 24, v0
3247 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
3248 ; GFX12-NEXT:    v_not_b32_e32 v3, v3
3249 ; GFX12-NEXT:  .LBB16_1: ; %atomicrmw.start
3250 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
3251 ; GFX12-NEXT:    s_wait_dscnt 0x0
3252 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
3253 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, v0, v2
3254 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3255 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3256 ; GFX12-NEXT:    v_max_num_f32_e32 v4, 4.0, v4
3257 ; GFX12-NEXT:    v_bfe_u32 v5, v4, 16, 1
3258 ; GFX12-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3259 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3260 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
3261 ; GFX12-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3262 ; GFX12-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3263 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3264 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3265 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
3266 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3267 ; GFX12-NEXT:    v_and_or_b32 v4, v2, v3, v4
3268 ; GFX12-NEXT:    s_wait_storecnt 0x0
3269 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v1, v4, v2
3270 ; GFX12-NEXT:    s_wait_dscnt 0x0
3271 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
3272 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
3273 ; GFX12-NEXT:    v_mov_b32_e32 v2, v4
3274 ; GFX12-NEXT:    s_wait_alu 0xfffe
3275 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
3276 ; GFX12-NEXT:    s_wait_alu 0xfffe
3277 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3278 ; GFX12-NEXT:    s_cbranch_execnz .LBB16_1
3279 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
3280 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3281 ; GFX12-NEXT:    s_wait_alu 0xfffe
3282 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
3284 ; GFX940-LABEL: local_atomic_fmax_noret_bf16:
3285 ; GFX940:       ; %bb.0:
3286 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3287 ; GFX940-NEXT:    v_and_b32_e32 v1, -4, v0
3288 ; GFX940-NEXT:    ds_read_b32 v3, v1
3289 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3290 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
3291 ; GFX940-NEXT:    v_and_b32_e32 v0, 24, v2
3292 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v2, s0
3293 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
3294 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
3295 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
3296 ; GFX940-NEXT:  .LBB16_1: ; %atomicrmw.start
3297 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
3298 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3299 ; GFX940-NEXT:    v_lshrrev_b32_sdwa v4, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3300 ; GFX940-NEXT:    s_nop 0
3301 ; GFX940-NEXT:    v_max_f32_e32 v4, 4.0, v4
3302 ; GFX940-NEXT:    v_bfe_u32 v5, v4, 16, 1
3303 ; GFX940-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3304 ; GFX940-NEXT:    v_add3_u32 v5, v5, v4, s2
3305 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3306 ; GFX940-NEXT:    s_nop 1
3307 ; GFX940-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3308 ; GFX940-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3309 ; GFX940-NEXT:    v_and_or_b32 v4, v3, v2, v4
3310 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3311 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3312 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3313 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
3314 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
3315 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
3316 ; GFX940-NEXT:    s_cbranch_execnz .LBB16_1
3317 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
3318 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
3319 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
3321 ; GFX11-LABEL: local_atomic_fmax_noret_bf16:
3322 ; GFX11:       ; %bb.0:
3323 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3324 ; GFX11-NEXT:    v_and_b32_e32 v1, -4, v0
3325 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3326 ; GFX11-NEXT:    s_mov_b32 s0, 0
3327 ; GFX11-NEXT:    ds_load_b32 v2, v1
3328 ; GFX11-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
3329 ; GFX11-NEXT:    v_and_b32_e32 v0, 24, v0
3330 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
3331 ; GFX11-NEXT:    v_not_b32_e32 v3, v3
3332 ; GFX11-NEXT:    .p2align 6
3333 ; GFX11-NEXT:  .LBB16_1: ; %atomicrmw.start
3334 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
3335 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3336 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
3337 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, v0, v2
3338 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3339 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3340 ; GFX11-NEXT:    v_max_f32_e32 v4, 4.0, v4
3341 ; GFX11-NEXT:    v_bfe_u32 v5, v4, 16, 1
3342 ; GFX11-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3343 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3344 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
3345 ; GFX11-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3346 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3347 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3348 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3349 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
3350 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3351 ; GFX11-NEXT:    v_and_or_b32 v4, v2, v3, v4
3352 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
3353 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v1, v4, v2
3354 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3355 ; GFX11-NEXT:    buffer_gl0_inv
3356 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
3357 ; GFX11-NEXT:    v_mov_b32_e32 v2, v4
3358 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
3359 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
3360 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3361 ; GFX11-NEXT:    s_cbranch_execnz .LBB16_1
3362 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
3363 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3364 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3366 ; GFX10-LABEL: local_atomic_fmax_noret_bf16:
3367 ; GFX10:       ; %bb.0:
3368 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3369 ; GFX10-NEXT:    v_and_b32_e32 v1, -4, v0
3370 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
3371 ; GFX10-NEXT:    s_mov_b32 s4, 0
3372 ; GFX10-NEXT:    ds_read_b32 v2, v1
3373 ; GFX10-NEXT:    v_lshlrev_b32_e64 v3, v0, 0xffff
3374 ; GFX10-NEXT:    v_and_b32_e32 v0, 24, v0
3375 ; GFX10-NEXT:    v_not_b32_e32 v3, v3
3376 ; GFX10-NEXT:  .LBB16_1: ; %atomicrmw.start
3377 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
3378 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3379 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3380 ; GFX10-NEXT:    v_max_f32_e32 v4, 4.0, v4
3381 ; GFX10-NEXT:    v_bfe_u32 v5, v4, 16, 1
3382 ; GFX10-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3383 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3384 ; GFX10-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3385 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3386 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3387 ; GFX10-NEXT:    v_and_or_b32 v4, v2, v3, v4
3388 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3389 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v1, v2, v4
3390 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3391 ; GFX10-NEXT:    buffer_gl0_inv
3392 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v2
3393 ; GFX10-NEXT:    v_mov_b32_e32 v2, v4
3394 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
3395 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
3396 ; GFX10-NEXT:    s_cbranch_execnz .LBB16_1
3397 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
3398 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
3399 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3401 ; GFX90A-LABEL: local_atomic_fmax_noret_bf16:
3402 ; GFX90A:       ; %bb.0:
3403 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3404 ; GFX90A-NEXT:    v_and_b32_e32 v1, -4, v0
3405 ; GFX90A-NEXT:    ds_read_b32 v3, v1
3406 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3407 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
3408 ; GFX90A-NEXT:    v_and_b32_e32 v0, 24, v2
3409 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
3410 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
3411 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
3412 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
3413 ; GFX90A-NEXT:  .LBB16_1: ; %atomicrmw.start
3414 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
3415 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3416 ; GFX90A-NEXT:    v_lshrrev_b32_sdwa v4, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3417 ; GFX90A-NEXT:    v_max_f32_e32 v4, 4.0, v4
3418 ; GFX90A-NEXT:    v_bfe_u32 v5, v4, 16, 1
3419 ; GFX90A-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3420 ; GFX90A-NEXT:    v_add3_u32 v5, v5, v4, s6
3421 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3422 ; GFX90A-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3423 ; GFX90A-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3424 ; GFX90A-NEXT:    v_and_or_b32 v4, v3, v2, v4
3425 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3426 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3427 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3428 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3429 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
3430 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3431 ; GFX90A-NEXT:    s_cbranch_execnz .LBB16_1
3432 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
3433 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
3434 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
3436 ; GFX908-LABEL: local_atomic_fmax_noret_bf16:
3437 ; GFX908:       ; %bb.0:
3438 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3439 ; GFX908-NEXT:    v_and_b32_e32 v1, -4, v0
3440 ; GFX908-NEXT:    ds_read_b32 v3, v1
3441 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3442 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
3443 ; GFX908-NEXT:    v_and_b32_e32 v0, 24, v2
3444 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
3445 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
3446 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
3447 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
3448 ; GFX908-NEXT:  .LBB16_1: ; %atomicrmw.start
3449 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
3450 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3451 ; GFX908-NEXT:    v_lshrrev_b32_sdwa v4, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3452 ; GFX908-NEXT:    v_max_f32_e32 v4, 4.0, v4
3453 ; GFX908-NEXT:    v_bfe_u32 v5, v4, 16, 1
3454 ; GFX908-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3455 ; GFX908-NEXT:    v_add3_u32 v5, v5, v4, s6
3456 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3457 ; GFX908-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3458 ; GFX908-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3459 ; GFX908-NEXT:    v_and_or_b32 v4, v3, v2, v4
3460 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3461 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3462 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3463 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3464 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
3465 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3466 ; GFX908-NEXT:    s_cbranch_execnz .LBB16_1
3467 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
3468 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
3469 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
3471 ; GFX8-LABEL: local_atomic_fmax_noret_bf16:
3472 ; GFX8:       ; %bb.0:
3473 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3474 ; GFX8-NEXT:    v_and_b32_e32 v1, -4, v0
3475 ; GFX8-NEXT:    s_mov_b32 m0, -1
3476 ; GFX8-NEXT:    ds_read_b32 v3, v1
3477 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3478 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
3479 ; GFX8-NEXT:    v_and_b32_e32 v0, 24, v2
3480 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v2, s4
3481 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
3482 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
3483 ; GFX8-NEXT:  .LBB16_1: ; %atomicrmw.start
3484 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
3485 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3486 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v4, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3487 ; GFX8-NEXT:    v_max_f32_e32 v4, 4.0, v4
3488 ; GFX8-NEXT:    v_bfe_u32 v6, v4, 16, 1
3489 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v4
3490 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
3491 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v4
3492 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3493 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v6, v7, vcc
3494 ; GFX8-NEXT:    v_and_b32_e32 v5, v3, v2
3495 ; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3496 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
3497 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3498 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3499 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3500 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3501 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
3502 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3503 ; GFX8-NEXT:    s_cbranch_execnz .LBB16_1
3504 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
3505 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
3506 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3508 ; GFX7-LABEL: local_atomic_fmax_noret_bf16:
3509 ; GFX7:       ; %bb.0:
3510 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3511 ; GFX7-NEXT:    v_and_b32_e32 v1, -4, v0
3512 ; GFX7-NEXT:    s_mov_b32 m0, -1
3513 ; GFX7-NEXT:    ds_read_b32 v3, v1
3514 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3515 ; GFX7-NEXT:    v_and_b32_e32 v0, 24, v2
3516 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
3517 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
3518 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3519 ; GFX7-NEXT:  .LBB16_1: ; %atomicrmw.start
3520 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
3521 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3522 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
3523 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3524 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
3525 ; GFX7-NEXT:    v_max_f32_e32 v4, 4.0, v4
3526 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3527 ; GFX7-NEXT:    v_and_b32_e32 v5, v3, v2
3528 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
3529 ; GFX7-NEXT:    v_or_b32_e32 v4, v5, v4
3530 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3531 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3532 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3533 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3534 ; GFX7-NEXT:    v_mov_b32_e32 v3, v4
3535 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3536 ; GFX7-NEXT:    s_cbranch_execnz .LBB16_1
3537 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
3538 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
3539 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
3541 ; GFX6-LABEL: local_atomic_fmax_noret_bf16:
3542 ; GFX6:       ; %bb.0:
3543 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3544 ; GFX6-NEXT:    v_and_b32_e32 v1, -4, v0
3545 ; GFX6-NEXT:    s_mov_b32 m0, -1
3546 ; GFX6-NEXT:    ds_read_b32 v3, v1
3547 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
3548 ; GFX6-NEXT:    v_and_b32_e32 v0, 24, v2
3549 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
3550 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
3551 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
3552 ; GFX6-NEXT:  .LBB16_1: ; %atomicrmw.start
3553 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
3554 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3555 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, v0, v3
3556 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3557 ; GFX6-NEXT:    v_mul_f32_e32 v4, 1.0, v4
3558 ; GFX6-NEXT:    v_max_f32_e32 v4, 4.0, v4
3559 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3560 ; GFX6-NEXT:    v_and_b32_e32 v5, v3, v2
3561 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, v0, v4
3562 ; GFX6-NEXT:    v_or_b32_e32 v4, v5, v4
3563 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v4, v1, v3, v4
3564 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3565 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3566 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3567 ; GFX6-NEXT:    v_mov_b32_e32 v3, v4
3568 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3569 ; GFX6-NEXT:    s_cbranch_execnz .LBB16_1
3570 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
3571 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
3572 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3573   %result = atomicrmw fmax ptr addrspace(3) %ptr, bfloat 4.0 seq_cst
3574   ret void
3577 define void @local_atomic_fmax_noret_bf16__offset(ptr addrspace(3) %ptr) nounwind {
3578 ; GFX12-LABEL: local_atomic_fmax_noret_bf16__offset:
3579 ; GFX12:       ; %bb.0:
3580 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
3581 ; GFX12-NEXT:    s_wait_expcnt 0x0
3582 ; GFX12-NEXT:    s_wait_samplecnt 0x0
3583 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
3584 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3585 ; GFX12-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
3586 ; GFX12-NEXT:    s_mov_b32 s0, 0
3587 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
3588 ; GFX12-NEXT:    v_and_b32_e32 v0, -4, v1
3589 ; GFX12-NEXT:    v_and_b32_e32 v1, 3, v1
3590 ; GFX12-NEXT:    ds_load_b32 v3, v0
3591 ; GFX12-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3592 ; GFX12-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
3593 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3594 ; GFX12-NEXT:    v_not_b32_e32 v2, v2
3595 ; GFX12-NEXT:  .LBB17_1: ; %atomicrmw.start
3596 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
3597 ; GFX12-NEXT:    s_wait_dscnt 0x0
3598 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
3599 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3600 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3601 ; GFX12-NEXT:    v_max_num_f32_e32 v4, 4.0, v4
3602 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
3603 ; GFX12-NEXT:    v_bfe_u32 v5, v4, 16, 1
3604 ; GFX12-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3605 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3606 ; GFX12-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3607 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3608 ; GFX12-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3609 ; GFX12-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3610 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3611 ; GFX12-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
3612 ; GFX12-NEXT:    v_and_or_b32 v4, v3, v2, v4
3613 ; GFX12-NEXT:    s_wait_storecnt 0x0
3614 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
3615 ; GFX12-NEXT:    s_wait_dscnt 0x0
3616 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
3617 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
3618 ; GFX12-NEXT:    v_mov_b32_e32 v3, v4
3619 ; GFX12-NEXT:    s_wait_alu 0xfffe
3620 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
3621 ; GFX12-NEXT:    s_wait_alu 0xfffe
3622 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3623 ; GFX12-NEXT:    s_cbranch_execnz .LBB17_1
3624 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
3625 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3626 ; GFX12-NEXT:    s_wait_alu 0xfffe
3627 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
3629 ; GFX940-LABEL: local_atomic_fmax_noret_bf16__offset:
3630 ; GFX940:       ; %bb.0:
3631 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3632 ; GFX940-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
3633 ; GFX940-NEXT:    v_and_b32_e32 v0, -4, v1
3634 ; GFX940-NEXT:    ds_read_b32 v3, v0
3635 ; GFX940-NEXT:    v_and_b32_e32 v1, 3, v1
3636 ; GFX940-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3637 ; GFX940-NEXT:    s_mov_b32 s0, 0xffff
3638 ; GFX940-NEXT:    v_lshlrev_b32_e64 v2, v1, s0
3639 ; GFX940-NEXT:    v_not_b32_e32 v2, v2
3640 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
3641 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
3642 ; GFX940-NEXT:  .LBB17_1: ; %atomicrmw.start
3643 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
3644 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3645 ; GFX940-NEXT:    v_lshrrev_b32_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3646 ; GFX940-NEXT:    s_nop 0
3647 ; GFX940-NEXT:    v_max_f32_e32 v4, 4.0, v4
3648 ; GFX940-NEXT:    v_bfe_u32 v5, v4, 16, 1
3649 ; GFX940-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3650 ; GFX940-NEXT:    v_add3_u32 v5, v5, v4, s2
3651 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3652 ; GFX940-NEXT:    s_nop 1
3653 ; GFX940-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3654 ; GFX940-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3655 ; GFX940-NEXT:    v_and_or_b32 v4, v3, v2, v4
3656 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3657 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3658 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3659 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
3660 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
3661 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
3662 ; GFX940-NEXT:    s_cbranch_execnz .LBB17_1
3663 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
3664 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
3665 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
3667 ; GFX11-LABEL: local_atomic_fmax_noret_bf16__offset:
3668 ; GFX11:       ; %bb.0:
3669 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3670 ; GFX11-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
3671 ; GFX11-NEXT:    s_mov_b32 s0, 0
3672 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
3673 ; GFX11-NEXT:    v_and_b32_e32 v0, -4, v1
3674 ; GFX11-NEXT:    v_and_b32_e32 v1, 3, v1
3675 ; GFX11-NEXT:    ds_load_b32 v3, v0
3676 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3677 ; GFX11-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
3678 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3679 ; GFX11-NEXT:    v_not_b32_e32 v2, v2
3680 ; GFX11-NEXT:    .p2align 6
3681 ; GFX11-NEXT:  .LBB17_1: ; %atomicrmw.start
3682 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
3683 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3684 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
3685 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3686 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3687 ; GFX11-NEXT:    v_max_f32_e32 v4, 4.0, v4
3688 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
3689 ; GFX11-NEXT:    v_bfe_u32 v5, v4, 16, 1
3690 ; GFX11-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3691 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3692 ; GFX11-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3693 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3694 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3695 ; GFX11-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3696 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3697 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
3698 ; GFX11-NEXT:    v_and_or_b32 v4, v3, v2, v4
3699 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
3700 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
3701 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3702 ; GFX11-NEXT:    buffer_gl0_inv
3703 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
3704 ; GFX11-NEXT:    v_mov_b32_e32 v3, v4
3705 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
3706 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
3707 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3708 ; GFX11-NEXT:    s_cbranch_execnz .LBB17_1
3709 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
3710 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3711 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3713 ; GFX10-LABEL: local_atomic_fmax_noret_bf16__offset:
3714 ; GFX10:       ; %bb.0:
3715 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3716 ; GFX10-NEXT:    v_add_nc_u32_e32 v1, 0xfffe, v0
3717 ; GFX10-NEXT:    s_mov_b32 s4, 0
3718 ; GFX10-NEXT:    v_and_b32_e32 v0, -4, v1
3719 ; GFX10-NEXT:    v_and_b32_e32 v1, 3, v1
3720 ; GFX10-NEXT:    ds_read_b32 v3, v0
3721 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3722 ; GFX10-NEXT:    v_lshlrev_b32_e64 v2, v1, 0xffff
3723 ; GFX10-NEXT:    v_not_b32_e32 v2, v2
3724 ; GFX10-NEXT:  .LBB17_1: ; %atomicrmw.start
3725 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
3726 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3727 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3728 ; GFX10-NEXT:    v_max_f32_e32 v4, 4.0, v4
3729 ; GFX10-NEXT:    v_bfe_u32 v5, v4, 16, 1
3730 ; GFX10-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3731 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
3732 ; GFX10-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
3733 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc_lo
3734 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3735 ; GFX10-NEXT:    v_and_or_b32 v4, v3, v2, v4
3736 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3737 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3738 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
3739 ; GFX10-NEXT:    buffer_gl0_inv
3740 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
3741 ; GFX10-NEXT:    v_mov_b32_e32 v3, v4
3742 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
3743 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
3744 ; GFX10-NEXT:    s_cbranch_execnz .LBB17_1
3745 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
3746 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
3747 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3749 ; GFX90A-LABEL: local_atomic_fmax_noret_bf16__offset:
3750 ; GFX90A:       ; %bb.0:
3751 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3752 ; GFX90A-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
3753 ; GFX90A-NEXT:    v_and_b32_e32 v0, -4, v1
3754 ; GFX90A-NEXT:    ds_read_b32 v3, v0
3755 ; GFX90A-NEXT:    v_and_b32_e32 v1, 3, v1
3756 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3757 ; GFX90A-NEXT:    s_mov_b32 s4, 0xffff
3758 ; GFX90A-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
3759 ; GFX90A-NEXT:    v_not_b32_e32 v2, v2
3760 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
3761 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
3762 ; GFX90A-NEXT:  .LBB17_1: ; %atomicrmw.start
3763 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
3764 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3765 ; GFX90A-NEXT:    v_lshrrev_b32_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3766 ; GFX90A-NEXT:    v_max_f32_e32 v4, 4.0, v4
3767 ; GFX90A-NEXT:    v_bfe_u32 v5, v4, 16, 1
3768 ; GFX90A-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3769 ; GFX90A-NEXT:    v_add3_u32 v5, v5, v4, s6
3770 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3771 ; GFX90A-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3772 ; GFX90A-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3773 ; GFX90A-NEXT:    v_and_or_b32 v4, v3, v2, v4
3774 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3775 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
3776 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3777 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3778 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
3779 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3780 ; GFX90A-NEXT:    s_cbranch_execnz .LBB17_1
3781 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
3782 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
3783 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
3785 ; GFX908-LABEL: local_atomic_fmax_noret_bf16__offset:
3786 ; GFX908:       ; %bb.0:
3787 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3788 ; GFX908-NEXT:    v_add_u32_e32 v1, 0xfffe, v0
3789 ; GFX908-NEXT:    v_and_b32_e32 v0, -4, v1
3790 ; GFX908-NEXT:    ds_read_b32 v3, v0
3791 ; GFX908-NEXT:    v_and_b32_e32 v1, 3, v1
3792 ; GFX908-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3793 ; GFX908-NEXT:    s_mov_b32 s4, 0xffff
3794 ; GFX908-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
3795 ; GFX908-NEXT:    v_not_b32_e32 v2, v2
3796 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
3797 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
3798 ; GFX908-NEXT:  .LBB17_1: ; %atomicrmw.start
3799 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
3800 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3801 ; GFX908-NEXT:    v_lshrrev_b32_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3802 ; GFX908-NEXT:    v_max_f32_e32 v4, 4.0, v4
3803 ; GFX908-NEXT:    v_bfe_u32 v5, v4, 16, 1
3804 ; GFX908-NEXT:    v_or_b32_e32 v6, 0x400000, v4
3805 ; GFX908-NEXT:    v_add3_u32 v5, v5, v4, s6
3806 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3807 ; GFX908-NEXT:    v_cndmask_b32_e32 v4, v5, v6, vcc
3808 ; GFX908-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3809 ; GFX908-NEXT:    v_and_or_b32 v4, v3, v2, v4
3810 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3811 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
3812 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3813 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3814 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
3815 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3816 ; GFX908-NEXT:    s_cbranch_execnz .LBB17_1
3817 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
3818 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
3819 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
3821 ; GFX8-LABEL: local_atomic_fmax_noret_bf16__offset:
3822 ; GFX8:       ; %bb.0:
3823 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3824 ; GFX8-NEXT:    v_add_u32_e32 v1, vcc, 0xfffe, v0
3825 ; GFX8-NEXT:    v_and_b32_e32 v0, -4, v1
3826 ; GFX8-NEXT:    s_mov_b32 m0, -1
3827 ; GFX8-NEXT:    ds_read_b32 v3, v0
3828 ; GFX8-NEXT:    v_and_b32_e32 v1, 3, v1
3829 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3830 ; GFX8-NEXT:    s_mov_b32 s4, 0xffff
3831 ; GFX8-NEXT:    v_lshlrev_b32_e64 v2, v1, s4
3832 ; GFX8-NEXT:    v_not_b32_e32 v2, v2
3833 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
3834 ; GFX8-NEXT:  .LBB17_1: ; %atomicrmw.start
3835 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
3836 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3837 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3838 ; GFX8-NEXT:    v_max_f32_e32 v4, 4.0, v4
3839 ; GFX8-NEXT:    v_bfe_u32 v6, v4, 16, 1
3840 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v4
3841 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
3842 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v4
3843 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
3844 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v6, v7, vcc
3845 ; GFX8-NEXT:    v_and_b32_e32 v5, v3, v2
3846 ; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3847 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
3848 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3849 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3850 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3851 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3852 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
3853 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3854 ; GFX8-NEXT:    s_cbranch_execnz .LBB17_1
3855 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
3856 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
3857 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3859 ; GFX7-LABEL: local_atomic_fmax_noret_bf16__offset:
3860 ; GFX7:       ; %bb.0:
3861 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3862 ; GFX7-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
3863 ; GFX7-NEXT:    v_and_b32_e32 v0, -4, v1
3864 ; GFX7-NEXT:    s_mov_b32 m0, -1
3865 ; GFX7-NEXT:    ds_read_b32 v3, v0
3866 ; GFX7-NEXT:    v_and_b32_e32 v1, 3, v1
3867 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3868 ; GFX7-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
3869 ; GFX7-NEXT:    v_not_b32_e32 v2, v2
3870 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3871 ; GFX7-NEXT:  .LBB17_1: ; %atomicrmw.start
3872 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
3873 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3874 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
3875 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3876 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
3877 ; GFX7-NEXT:    v_max_f32_e32 v4, 4.0, v4
3878 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3879 ; GFX7-NEXT:    v_and_b32_e32 v5, v3, v2
3880 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
3881 ; GFX7-NEXT:    v_or_b32_e32 v4, v5, v4
3882 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3883 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3884 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3885 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3886 ; GFX7-NEXT:    v_mov_b32_e32 v3, v4
3887 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3888 ; GFX7-NEXT:    s_cbranch_execnz .LBB17_1
3889 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
3890 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
3891 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
3893 ; GFX6-LABEL: local_atomic_fmax_noret_bf16__offset:
3894 ; GFX6:       ; %bb.0:
3895 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3896 ; GFX6-NEXT:    v_add_i32_e32 v1, vcc, 0xfffe, v0
3897 ; GFX6-NEXT:    v_and_b32_e32 v0, -4, v1
3898 ; GFX6-NEXT:    s_mov_b32 m0, -1
3899 ; GFX6-NEXT:    ds_read_b32 v3, v0
3900 ; GFX6-NEXT:    v_and_b32_e32 v1, 3, v1
3901 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
3902 ; GFX6-NEXT:    v_lshl_b32_e32 v2, 0xffff, v1
3903 ; GFX6-NEXT:    v_not_b32_e32 v2, v2
3904 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
3905 ; GFX6-NEXT:  .LBB17_1: ; %atomicrmw.start
3906 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
3907 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3908 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, v1, v3
3909 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3910 ; GFX6-NEXT:    v_mul_f32_e32 v4, 1.0, v4
3911 ; GFX6-NEXT:    v_max_f32_e32 v4, 4.0, v4
3912 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
3913 ; GFX6-NEXT:    v_and_b32_e32 v5, v3, v2
3914 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, v1, v4
3915 ; GFX6-NEXT:    v_or_b32_e32 v4, v5, v4
3916 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
3917 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3918 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
3919 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3920 ; GFX6-NEXT:    v_mov_b32_e32 v3, v4
3921 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3922 ; GFX6-NEXT:    s_cbranch_execnz .LBB17_1
3923 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
3924 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
3925 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3926   %gep = getelementptr bfloat, ptr addrspace(3) %ptr, i32 32767
3927   %unused = atomicrmw fmax ptr addrspace(3) %gep, bfloat 4.0 seq_cst
3928   ret void
3931 define bfloat @local_atomic_fmax_ret_bf16__offset__align4(ptr addrspace(3) %ptr) nounwind {
3932 ; GFX12-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
3933 ; GFX12:       ; %bb.0:
3934 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
3935 ; GFX12-NEXT:    s_wait_expcnt 0x0
3936 ; GFX12-NEXT:    s_wait_samplecnt 0x0
3937 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
3938 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3939 ; GFX12-NEXT:    ds_load_b32 v1, v0 offset:65534
3940 ; GFX12-NEXT:    s_mov_b32 s0, 0
3941 ; GFX12-NEXT:  .LBB18_1: ; %atomicrmw.start
3942 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
3943 ; GFX12-NEXT:    s_wait_dscnt 0x0
3944 ; GFX12-NEXT:    v_mov_b32_e32 v2, v1
3945 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3946 ; GFX12-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
3947 ; GFX12-NEXT:    v_max_num_f32_e32 v1, 4.0, v1
3948 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
3949 ; GFX12-NEXT:    v_bfe_u32 v3, v1, 16, 1
3950 ; GFX12-NEXT:    v_or_b32_e32 v4, 0x400000, v1
3951 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
3952 ; GFX12-NEXT:    v_add3_u32 v3, v3, v1, 0x7fff
3953 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
3954 ; GFX12-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
3955 ; GFX12-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
3956 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3957 ; GFX12-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
3958 ; GFX12-NEXT:    s_wait_storecnt 0x0
3959 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:65534
3960 ; GFX12-NEXT:    s_wait_dscnt 0x0
3961 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
3962 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
3963 ; GFX12-NEXT:    s_wait_alu 0xfffe
3964 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
3965 ; GFX12-NEXT:    s_wait_alu 0xfffe
3966 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
3967 ; GFX12-NEXT:    s_cbranch_execnz .LBB18_1
3968 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
3969 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
3970 ; GFX12-NEXT:    v_mov_b32_e32 v0, v1
3971 ; GFX12-NEXT:    s_wait_alu 0xfffe
3972 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
3974 ; GFX940-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
3975 ; GFX940:       ; %bb.0:
3976 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3977 ; GFX940-NEXT:    ds_read_b32 v1, v0 offset:65534
3978 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
3979 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
3980 ; GFX940-NEXT:    s_mov_b32 s3, 0xffff0000
3981 ; GFX940-NEXT:  .LBB18_1: ; %atomicrmw.start
3982 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
3983 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3984 ; GFX940-NEXT:    v_mov_b32_e32 v2, v1
3985 ; GFX940-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
3986 ; GFX940-NEXT:    v_max_f32_e32 v1, 4.0, v1
3987 ; GFX940-NEXT:    v_bfe_u32 v3, v1, 16, 1
3988 ; GFX940-NEXT:    v_or_b32_e32 v4, 0x400000, v1
3989 ; GFX940-NEXT:    v_add3_u32 v3, v3, v1, s2
3990 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
3991 ; GFX940-NEXT:    s_nop 1
3992 ; GFX940-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc
3993 ; GFX940-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
3994 ; GFX940-NEXT:    v_and_or_b32 v1, v2, s3, v1
3995 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
3996 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
3997 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
3998 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
3999 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
4000 ; GFX940-NEXT:    s_cbranch_execnz .LBB18_1
4001 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
4002 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
4003 ; GFX940-NEXT:    v_mov_b32_e32 v0, v1
4004 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
4006 ; GFX11-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4007 ; GFX11:       ; %bb.0:
4008 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4009 ; GFX11-NEXT:    ds_load_b32 v1, v0 offset:65534
4010 ; GFX11-NEXT:    s_mov_b32 s0, 0
4011 ; GFX11-NEXT:    .p2align 6
4012 ; GFX11-NEXT:  .LBB18_1: ; %atomicrmw.start
4013 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
4014 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4015 ; GFX11-NEXT:    v_mov_b32_e32 v2, v1
4016 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4017 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4018 ; GFX11-NEXT:    v_max_f32_e32 v1, 4.0, v1
4019 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
4020 ; GFX11-NEXT:    v_bfe_u32 v3, v1, 16, 1
4021 ; GFX11-NEXT:    v_or_b32_e32 v4, 0x400000, v1
4022 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4023 ; GFX11-NEXT:    v_add3_u32 v3, v3, v1, 0x7fff
4024 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4025 ; GFX11-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
4026 ; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4027 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4028 ; GFX11-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
4029 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
4030 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v1, v0, v1, v2 offset:65534
4031 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4032 ; GFX11-NEXT:    buffer_gl0_inv
4033 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
4034 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
4035 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
4036 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4037 ; GFX11-NEXT:    s_cbranch_execnz .LBB18_1
4038 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
4039 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4040 ; GFX11-NEXT:    v_mov_b32_e32 v0, v1
4041 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4043 ; GFX10-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4044 ; GFX10:       ; %bb.0:
4045 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4046 ; GFX10-NEXT:    ds_read_b32 v1, v0 offset:65534
4047 ; GFX10-NEXT:    s_mov_b32 s4, 0
4048 ; GFX10-NEXT:  .LBB18_1: ; %atomicrmw.start
4049 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
4050 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4051 ; GFX10-NEXT:    v_mov_b32_e32 v2, v1
4052 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4053 ; GFX10-NEXT:    v_max_f32_e32 v1, 4.0, v1
4054 ; GFX10-NEXT:    v_bfe_u32 v3, v1, 16, 1
4055 ; GFX10-NEXT:    v_or_b32_e32 v4, 0x400000, v1
4056 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4057 ; GFX10-NEXT:    v_add3_u32 v3, v3, v1, 0x7fff
4058 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
4059 ; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4060 ; GFX10-NEXT:    v_and_or_b32 v1, 0xffff0000, v2, v1
4061 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4062 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
4063 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4064 ; GFX10-NEXT:    buffer_gl0_inv
4065 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v1, v2
4066 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
4067 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
4068 ; GFX10-NEXT:    s_cbranch_execnz .LBB18_1
4069 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
4070 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
4071 ; GFX10-NEXT:    v_mov_b32_e32 v0, v1
4072 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4074 ; GFX90A-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4075 ; GFX90A:       ; %bb.0:
4076 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4077 ; GFX90A-NEXT:    ds_read_b32 v1, v0 offset:65534
4078 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
4079 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
4080 ; GFX90A-NEXT:    s_mov_b32 s7, 0xffff0000
4081 ; GFX90A-NEXT:  .LBB18_1: ; %atomicrmw.start
4082 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
4083 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4084 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v1
4085 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4086 ; GFX90A-NEXT:    v_max_f32_e32 v1, 4.0, v1
4087 ; GFX90A-NEXT:    v_bfe_u32 v3, v1, 16, 1
4088 ; GFX90A-NEXT:    v_or_b32_e32 v4, 0x400000, v1
4089 ; GFX90A-NEXT:    v_add3_u32 v3, v3, v1, s6
4090 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
4091 ; GFX90A-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc
4092 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4093 ; GFX90A-NEXT:    v_and_or_b32 v1, v2, s7, v1
4094 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
4095 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4096 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
4097 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4098 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4099 ; GFX90A-NEXT:    s_cbranch_execnz .LBB18_1
4100 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
4101 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
4102 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v1
4103 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
4105 ; GFX908-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4106 ; GFX908:       ; %bb.0:
4107 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4108 ; GFX908-NEXT:    ds_read_b32 v1, v0 offset:65534
4109 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
4110 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
4111 ; GFX908-NEXT:    s_mov_b32 s7, 0xffff0000
4112 ; GFX908-NEXT:  .LBB18_1: ; %atomicrmw.start
4113 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
4114 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4115 ; GFX908-NEXT:    v_mov_b32_e32 v2, v1
4116 ; GFX908-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4117 ; GFX908-NEXT:    v_max_f32_e32 v1, 4.0, v1
4118 ; GFX908-NEXT:    v_bfe_u32 v3, v1, 16, 1
4119 ; GFX908-NEXT:    v_or_b32_e32 v4, 0x400000, v1
4120 ; GFX908-NEXT:    v_add3_u32 v3, v3, v1, s6
4121 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
4122 ; GFX908-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc
4123 ; GFX908-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4124 ; GFX908-NEXT:    v_and_or_b32 v1, v2, s7, v1
4125 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
4126 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4127 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
4128 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4129 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4130 ; GFX908-NEXT:    s_cbranch_execnz .LBB18_1
4131 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
4132 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
4133 ; GFX908-NEXT:    v_mov_b32_e32 v0, v1
4134 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
4136 ; GFX8-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4137 ; GFX8:       ; %bb.0:
4138 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4139 ; GFX8-NEXT:    s_mov_b32 m0, -1
4140 ; GFX8-NEXT:    ds_read_b32 v1, v0 offset:65534
4141 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
4142 ; GFX8-NEXT:  .LBB18_1: ; %atomicrmw.start
4143 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
4144 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4145 ; GFX8-NEXT:    v_mov_b32_e32 v2, v1
4146 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4147 ; GFX8-NEXT:    v_max_f32_e32 v1, 4.0, v1
4148 ; GFX8-NEXT:    v_bfe_u32 v4, v1, 16, 1
4149 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v1
4150 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 0x7fff, v4
4151 ; GFX8-NEXT:    v_or_b32_e32 v5, 0x400000, v1
4152 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
4153 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
4154 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v4, v5, vcc
4155 ; GFX8-NEXT:    v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
4156 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
4157 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4158 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
4159 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4160 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4161 ; GFX8-NEXT:    s_cbranch_execnz .LBB18_1
4162 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
4163 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
4164 ; GFX8-NEXT:    v_mov_b32_e32 v0, v1
4165 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4167 ; GFX7-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4168 ; GFX7:       ; %bb.0:
4169 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4170 ; GFX7-NEXT:    s_mov_b32 m0, -1
4171 ; GFX7-NEXT:    ds_read_b32 v1, v0 offset:65534
4172 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4173 ; GFX7-NEXT:  .LBB18_1: ; %atomicrmw.start
4174 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
4175 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4176 ; GFX7-NEXT:    v_mov_b32_e32 v2, v1
4177 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4178 ; GFX7-NEXT:    v_mul_f32_e32 v1, 1.0, v1
4179 ; GFX7-NEXT:    v_max_f32_e32 v1, 4.0, v1
4180 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
4181 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4182 ; GFX7-NEXT:    v_or_b32_e32 v1, v3, v1
4183 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1 offset:65534
4184 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4185 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
4186 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4187 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4188 ; GFX7-NEXT:    s_cbranch_execnz .LBB18_1
4189 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
4190 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
4191 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v1
4192 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
4194 ; GFX6-LABEL: local_atomic_fmax_ret_bf16__offset__align4:
4195 ; GFX6:       ; %bb.0:
4196 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4197 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffe, v0
4198 ; GFX6-NEXT:    s_mov_b32 m0, -1
4199 ; GFX6-NEXT:    ds_read_b32 v1, v0
4200 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
4201 ; GFX6-NEXT:  .LBB18_1: ; %atomicrmw.start
4202 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
4203 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4204 ; GFX6-NEXT:    v_mov_b32_e32 v2, v1
4205 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
4206 ; GFX6-NEXT:    v_mul_f32_e32 v1, 1.0, v1
4207 ; GFX6-NEXT:    v_max_f32_e32 v1, 4.0, v1
4208 ; GFX6-NEXT:    v_and_b32_e32 v3, 0xffff0000, v2
4209 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
4210 ; GFX6-NEXT:    v_or_b32_e32 v1, v3, v1
4211 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v2, v1
4212 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4213 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v1, v2
4214 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4215 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4216 ; GFX6-NEXT:    s_cbranch_execnz .LBB18_1
4217 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
4218 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
4219 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v1
4220 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
4221   %gep = getelementptr bfloat, ptr addrspace(3) %ptr, i32 32767
4222   %result = atomicrmw fmax ptr addrspace(3) %gep, bfloat 4.0 seq_cst, align 4
4223   ret bfloat %result
4226 define void @local_atomic_fmax_noret_bf16__offset__align4(ptr addrspace(3) %ptr) nounwind {
4227 ; GFX12-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4228 ; GFX12:       ; %bb.0:
4229 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
4230 ; GFX12-NEXT:    s_wait_expcnt 0x0
4231 ; GFX12-NEXT:    s_wait_samplecnt 0x0
4232 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
4233 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4234 ; GFX12-NEXT:    ds_load_b32 v1, v0 offset:65534
4235 ; GFX12-NEXT:    s_mov_b32 s0, 0
4236 ; GFX12-NEXT:  .LBB19_1: ; %atomicrmw.start
4237 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
4238 ; GFX12-NEXT:    s_wait_dscnt 0x0
4239 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4240 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4241 ; GFX12-NEXT:    v_max_num_f32_e32 v2, 4.0, v2
4242 ; GFX12-NEXT:    v_bfe_u32 v3, v2, 16, 1
4243 ; GFX12-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4244 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v2, v2
4245 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
4246 ; GFX12-NEXT:    v_add3_u32 v3, v3, v2, 0x7fff
4247 ; GFX12-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc_lo
4248 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4249 ; GFX12-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4250 ; GFX12-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
4251 ; GFX12-NEXT:    s_wait_storecnt 0x0
4252 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v1 offset:65534
4253 ; GFX12-NEXT:    s_wait_dscnt 0x0
4254 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
4255 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
4256 ; GFX12-NEXT:    v_mov_b32_e32 v1, v2
4257 ; GFX12-NEXT:    s_wait_alu 0xfffe
4258 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
4259 ; GFX12-NEXT:    s_wait_alu 0xfffe
4260 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4261 ; GFX12-NEXT:    s_cbranch_execnz .LBB19_1
4262 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
4263 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4264 ; GFX12-NEXT:    s_wait_alu 0xfffe
4265 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
4267 ; GFX940-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4268 ; GFX940:       ; %bb.0:
4269 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4270 ; GFX940-NEXT:    ds_read_b32 v1, v0 offset:65534
4271 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
4272 ; GFX940-NEXT:    s_movk_i32 s2, 0x7fff
4273 ; GFX940-NEXT:    s_mov_b32 s3, 0xffff0000
4274 ; GFX940-NEXT:  .LBB19_1: ; %atomicrmw.start
4275 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
4276 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4277 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4278 ; GFX940-NEXT:    v_max_f32_e32 v2, 4.0, v2
4279 ; GFX940-NEXT:    v_bfe_u32 v3, v2, 16, 1
4280 ; GFX940-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4281 ; GFX940-NEXT:    v_add3_u32 v3, v3, v2, s2
4282 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4283 ; GFX940-NEXT:    s_nop 1
4284 ; GFX940-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
4285 ; GFX940-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4286 ; GFX940-NEXT:    v_and_or_b32 v2, v1, s3, v2
4287 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4288 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4289 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4290 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
4291 ; GFX940-NEXT:    v_mov_b32_e32 v1, v2
4292 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
4293 ; GFX940-NEXT:    s_cbranch_execnz .LBB19_1
4294 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
4295 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
4296 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
4298 ; GFX11-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4299 ; GFX11:       ; %bb.0:
4300 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4301 ; GFX11-NEXT:    ds_load_b32 v1, v0 offset:65534
4302 ; GFX11-NEXT:    s_mov_b32 s0, 0
4303 ; GFX11-NEXT:    .p2align 6
4304 ; GFX11-NEXT:  .LBB19_1: ; %atomicrmw.start
4305 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
4306 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4307 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4308 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4309 ; GFX11-NEXT:    v_max_f32_e32 v2, 4.0, v2
4310 ; GFX11-NEXT:    v_bfe_u32 v3, v2, 16, 1
4311 ; GFX11-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4312 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v2, v2
4313 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
4314 ; GFX11-NEXT:    v_add3_u32 v3, v3, v2, 0x7fff
4315 ; GFX11-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc_lo
4316 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4317 ; GFX11-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4318 ; GFX11-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
4319 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
4320 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v1 offset:65534
4321 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4322 ; GFX11-NEXT:    buffer_gl0_inv
4323 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
4324 ; GFX11-NEXT:    v_mov_b32_e32 v1, v2
4325 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
4326 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
4327 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4328 ; GFX11-NEXT:    s_cbranch_execnz .LBB19_1
4329 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
4330 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4331 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4333 ; GFX10-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4334 ; GFX10:       ; %bb.0:
4335 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4336 ; GFX10-NEXT:    ds_read_b32 v1, v0 offset:65534
4337 ; GFX10-NEXT:    s_mov_b32 s4, 0
4338 ; GFX10-NEXT:  .LBB19_1: ; %atomicrmw.start
4339 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
4340 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4341 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4342 ; GFX10-NEXT:    v_max_f32_e32 v2, 4.0, v2
4343 ; GFX10-NEXT:    v_bfe_u32 v3, v2, 16, 1
4344 ; GFX10-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4345 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v2, v2
4346 ; GFX10-NEXT:    v_add3_u32 v3, v3, v2, 0x7fff
4347 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc_lo
4348 ; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4349 ; GFX10-NEXT:    v_and_or_b32 v2, 0xffff0000, v1, v2
4350 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4351 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4352 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4353 ; GFX10-NEXT:    buffer_gl0_inv
4354 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v1
4355 ; GFX10-NEXT:    v_mov_b32_e32 v1, v2
4356 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
4357 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
4358 ; GFX10-NEXT:    s_cbranch_execnz .LBB19_1
4359 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
4360 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
4361 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4363 ; GFX90A-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4364 ; GFX90A:       ; %bb.0:
4365 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4366 ; GFX90A-NEXT:    ds_read_b32 v1, v0 offset:65534
4367 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
4368 ; GFX90A-NEXT:    s_movk_i32 s6, 0x7fff
4369 ; GFX90A-NEXT:    s_mov_b32 s7, 0xffff0000
4370 ; GFX90A-NEXT:  .LBB19_1: ; %atomicrmw.start
4371 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
4372 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4373 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4374 ; GFX90A-NEXT:    v_max_f32_e32 v2, 4.0, v2
4375 ; GFX90A-NEXT:    v_bfe_u32 v3, v2, 16, 1
4376 ; GFX90A-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4377 ; GFX90A-NEXT:    v_add3_u32 v3, v3, v2, s6
4378 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4379 ; GFX90A-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
4380 ; GFX90A-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4381 ; GFX90A-NEXT:    v_and_or_b32 v2, v1, s7, v2
4382 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4383 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4384 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4385 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4386 ; GFX90A-NEXT:    v_mov_b32_e32 v1, v2
4387 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4388 ; GFX90A-NEXT:    s_cbranch_execnz .LBB19_1
4389 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
4390 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
4391 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
4393 ; GFX908-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4394 ; GFX908:       ; %bb.0:
4395 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4396 ; GFX908-NEXT:    ds_read_b32 v1, v0 offset:65534
4397 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
4398 ; GFX908-NEXT:    s_movk_i32 s6, 0x7fff
4399 ; GFX908-NEXT:    s_mov_b32 s7, 0xffff0000
4400 ; GFX908-NEXT:  .LBB19_1: ; %atomicrmw.start
4401 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
4402 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4403 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4404 ; GFX908-NEXT:    v_max_f32_e32 v2, 4.0, v2
4405 ; GFX908-NEXT:    v_bfe_u32 v3, v2, 16, 1
4406 ; GFX908-NEXT:    v_or_b32_e32 v4, 0x400000, v2
4407 ; GFX908-NEXT:    v_add3_u32 v3, v3, v2, s6
4408 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4409 ; GFX908-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
4410 ; GFX908-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4411 ; GFX908-NEXT:    v_and_or_b32 v2, v1, s7, v2
4412 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4413 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4414 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4415 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4416 ; GFX908-NEXT:    v_mov_b32_e32 v1, v2
4417 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4418 ; GFX908-NEXT:    s_cbranch_execnz .LBB19_1
4419 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
4420 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
4421 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
4423 ; GFX8-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4424 ; GFX8:       ; %bb.0:
4425 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4426 ; GFX8-NEXT:    s_mov_b32 m0, -1
4427 ; GFX8-NEXT:    ds_read_b32 v1, v0 offset:65534
4428 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
4429 ; GFX8-NEXT:  .LBB19_1: ; %atomicrmw.start
4430 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
4431 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4432 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4433 ; GFX8-NEXT:    v_max_f32_e32 v2, 4.0, v2
4434 ; GFX8-NEXT:    v_bfe_u32 v4, v2, 16, 1
4435 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, v4, v2
4436 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, 0x7fff, v4
4437 ; GFX8-NEXT:    v_or_b32_e32 v5, 0x400000, v2
4438 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4439 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
4440 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v4, v5, vcc
4441 ; GFX8-NEXT:    v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
4442 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4443 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4444 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4445 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4446 ; GFX8-NEXT:    v_mov_b32_e32 v1, v2
4447 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4448 ; GFX8-NEXT:    s_cbranch_execnz .LBB19_1
4449 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
4450 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
4451 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4453 ; GFX7-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4454 ; GFX7:       ; %bb.0:
4455 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4456 ; GFX7-NEXT:    s_mov_b32 m0, -1
4457 ; GFX7-NEXT:    ds_read_b32 v1, v0 offset:65534
4458 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4459 ; GFX7-NEXT:  .LBB19_1: ; %atomicrmw.start
4460 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
4461 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4462 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4463 ; GFX7-NEXT:    v_mul_f32_e32 v2, 1.0, v2
4464 ; GFX7-NEXT:    v_max_f32_e32 v2, 4.0, v2
4465 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
4466 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4467 ; GFX7-NEXT:    v_or_b32_e32 v2, v3, v2
4468 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2 offset:65534
4469 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4470 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4471 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4472 ; GFX7-NEXT:    v_mov_b32_e32 v1, v2
4473 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4474 ; GFX7-NEXT:    s_cbranch_execnz .LBB19_1
4475 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
4476 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
4477 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
4479 ; GFX6-LABEL: local_atomic_fmax_noret_bf16__offset__align4:
4480 ; GFX6:       ; %bb.0:
4481 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4482 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffe, v0
4483 ; GFX6-NEXT:    s_mov_b32 m0, -1
4484 ; GFX6-NEXT:    ds_read_b32 v1, v0
4485 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
4486 ; GFX6-NEXT:  .LBB19_1: ; %atomicrmw.start
4487 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
4488 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4489 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
4490 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
4491 ; GFX6-NEXT:    v_max_f32_e32 v2, 4.0, v2
4492 ; GFX6-NEXT:    v_and_b32_e32 v3, 0xffff0000, v1
4493 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
4494 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
4495 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v2, v0, v1, v2
4496 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4497 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v1
4498 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4499 ; GFX6-NEXT:    v_mov_b32_e32 v1, v2
4500 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4501 ; GFX6-NEXT:    s_cbranch_execnz .LBB19_1
4502 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
4503 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
4504 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
4505   %gep = getelementptr bfloat, ptr addrspace(3) %ptr, i32 32767
4506   %unused = atomicrmw fmax ptr addrspace(3) %gep, bfloat 4.0 seq_cst, align 4
4507   ret void
4510 ; --------------------------------------------------------------------
4511 ; <2 x half>
4512 ; --------------------------------------------------------------------
4514 define <2 x half> @local_atomic_fmax_ret_v2f16(ptr addrspace(3) %ptr, <2 x half> %val) {
4515 ; GFX12-LABEL: local_atomic_fmax_ret_v2f16:
4516 ; GFX12:       ; %bb.0:
4517 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
4518 ; GFX12-NEXT:    s_wait_expcnt 0x0
4519 ; GFX12-NEXT:    s_wait_samplecnt 0x0
4520 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
4521 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4522 ; GFX12-NEXT:    ds_load_b32 v2, v0
4523 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
4524 ; GFX12-NEXT:    s_mov_b32 s0, 0
4525 ; GFX12-NEXT:  .LBB20_1: ; %atomicrmw.start
4526 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
4527 ; GFX12-NEXT:    s_wait_dscnt 0x0
4528 ; GFX12-NEXT:    v_mov_b32_e32 v3, v2
4529 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4530 ; GFX12-NEXT:    v_pk_max_num_f16 v2, v3, v3
4531 ; GFX12-NEXT:    v_pk_max_num_f16 v2, v2, v1
4532 ; GFX12-NEXT:    s_wait_storecnt 0x0
4533 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v3
4534 ; GFX12-NEXT:    s_wait_dscnt 0x0
4535 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
4536 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4537 ; GFX12-NEXT:    s_wait_alu 0xfffe
4538 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
4539 ; GFX12-NEXT:    s_wait_alu 0xfffe
4540 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4541 ; GFX12-NEXT:    s_cbranch_execnz .LBB20_1
4542 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
4543 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4544 ; GFX12-NEXT:    v_mov_b32_e32 v0, v2
4545 ; GFX12-NEXT:    s_wait_alu 0xfffe
4546 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
4548 ; GFX940-LABEL: local_atomic_fmax_ret_v2f16:
4549 ; GFX940:       ; %bb.0:
4550 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4551 ; GFX940-NEXT:    ds_read_b32 v2, v0
4552 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
4553 ; GFX940-NEXT:    v_pk_max_f16 v1, v1, v1
4554 ; GFX940-NEXT:  .LBB20_1: ; %atomicrmw.start
4555 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
4556 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4557 ; GFX940-NEXT:    v_mov_b32_e32 v3, v2
4558 ; GFX940-NEXT:    v_pk_max_f16 v2, v3, v3
4559 ; GFX940-NEXT:    s_nop 0
4560 ; GFX940-NEXT:    v_pk_max_f16 v2, v2, v1
4561 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
4562 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4563 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4564 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
4565 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
4566 ; GFX940-NEXT:    s_cbranch_execnz .LBB20_1
4567 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
4568 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
4569 ; GFX940-NEXT:    v_mov_b32_e32 v0, v2
4570 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
4572 ; GFX11-LABEL: local_atomic_fmax_ret_v2f16:
4573 ; GFX11:       ; %bb.0:
4574 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4575 ; GFX11-NEXT:    ds_load_b32 v2, v0
4576 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
4577 ; GFX11-NEXT:    s_mov_b32 s0, 0
4578 ; GFX11-NEXT:  .LBB20_1: ; %atomicrmw.start
4579 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
4580 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4581 ; GFX11-NEXT:    v_mov_b32_e32 v3, v2
4582 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4583 ; GFX11-NEXT:    v_pk_max_f16 v2, v3, v3
4584 ; GFX11-NEXT:    v_pk_max_f16 v2, v2, v1
4585 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
4586 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v3
4587 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4588 ; GFX11-NEXT:    buffer_gl0_inv
4589 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4590 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
4591 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
4592 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4593 ; GFX11-NEXT:    s_cbranch_execnz .LBB20_1
4594 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
4595 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4596 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
4597 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4599 ; GFX10-LABEL: local_atomic_fmax_ret_v2f16:
4600 ; GFX10:       ; %bb.0:
4601 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4602 ; GFX10-NEXT:    ds_read_b32 v2, v0
4603 ; GFX10-NEXT:    v_pk_max_f16 v1, v1, v1
4604 ; GFX10-NEXT:    s_mov_b32 s4, 0
4605 ; GFX10-NEXT:  .LBB20_1: ; %atomicrmw.start
4606 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
4607 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4608 ; GFX10-NEXT:    v_mov_b32_e32 v3, v2
4609 ; GFX10-NEXT:    v_pk_max_f16 v2, v3, v3
4610 ; GFX10-NEXT:    v_pk_max_f16 v2, v2, v1
4611 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4612 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
4613 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4614 ; GFX10-NEXT:    buffer_gl0_inv
4615 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4616 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
4617 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
4618 ; GFX10-NEXT:    s_cbranch_execnz .LBB20_1
4619 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
4620 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
4621 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
4622 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4624 ; GFX90A-LABEL: local_atomic_fmax_ret_v2f16:
4625 ; GFX90A:       ; %bb.0:
4626 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4627 ; GFX90A-NEXT:    ds_read_b32 v2, v0
4628 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
4629 ; GFX90A-NEXT:    v_pk_max_f16 v1, v1, v1
4630 ; GFX90A-NEXT:  .LBB20_1: ; %atomicrmw.start
4631 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
4632 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4633 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v2
4634 ; GFX90A-NEXT:    v_pk_max_f16 v2, v3, v3
4635 ; GFX90A-NEXT:    v_pk_max_f16 v2, v2, v1
4636 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
4637 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4638 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4639 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4640 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4641 ; GFX90A-NEXT:    s_cbranch_execnz .LBB20_1
4642 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
4643 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
4644 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
4645 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
4647 ; GFX908-LABEL: local_atomic_fmax_ret_v2f16:
4648 ; GFX908:       ; %bb.0:
4649 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4650 ; GFX908-NEXT:    ds_read_b32 v2, v0
4651 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
4652 ; GFX908-NEXT:    v_pk_max_f16 v1, v1, v1
4653 ; GFX908-NEXT:  .LBB20_1: ; %atomicrmw.start
4654 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
4655 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4656 ; GFX908-NEXT:    v_mov_b32_e32 v3, v2
4657 ; GFX908-NEXT:    v_pk_max_f16 v2, v3, v3
4658 ; GFX908-NEXT:    v_pk_max_f16 v2, v2, v1
4659 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2
4660 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4661 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4662 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4663 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4664 ; GFX908-NEXT:    s_cbranch_execnz .LBB20_1
4665 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
4666 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
4667 ; GFX908-NEXT:    v_mov_b32_e32 v0, v2
4668 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
4670 ; GFX8-LABEL: local_atomic_fmax_ret_v2f16:
4671 ; GFX8:       ; %bb.0:
4672 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4673 ; GFX8-NEXT:    s_mov_b32 m0, -1
4674 ; GFX8-NEXT:    ds_read_b32 v2, v0
4675 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
4676 ; GFX8-NEXT:    v_max_f16_sdwa v3, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
4677 ; GFX8-NEXT:    v_max_f16_e32 v1, v1, v1
4678 ; GFX8-NEXT:  .LBB20_1: ; %atomicrmw.start
4679 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
4680 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4681 ; GFX8-NEXT:    v_mov_b32_e32 v4, v2
4682 ; GFX8-NEXT:    v_max_f16_sdwa v2, v4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
4683 ; GFX8-NEXT:    v_max_f16_e32 v5, v4, v4
4684 ; GFX8-NEXT:    v_max_f16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
4685 ; GFX8-NEXT:    v_max_f16_e32 v5, v5, v1
4686 ; GFX8-NEXT:    v_or_b32_e32 v2, v5, v2
4687 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
4688 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4689 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
4690 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4691 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4692 ; GFX8-NEXT:    s_cbranch_execnz .LBB20_1
4693 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
4694 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
4695 ; GFX8-NEXT:    v_mov_b32_e32 v0, v2
4696 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4698 ; GFX7-LABEL: local_atomic_fmax_ret_v2f16:
4699 ; GFX7:       ; %bb.0:
4700 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4701 ; GFX7-NEXT:    s_mov_b32 m0, -1
4702 ; GFX7-NEXT:    ds_read_b32 v3, v0
4703 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v2
4704 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v1
4705 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4706 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4707 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
4708 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v2
4709 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v3
4710 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v4
4711 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v5
4712 ; GFX7-NEXT:  .LBB20_1: ; %atomicrmw.start
4713 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
4714 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v1, v1
4715 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v2, v2
4716 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v5, v1
4717 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v6, v2
4718 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4719 ; GFX7-NEXT:    v_or_b32_e32 v7, v2, v1
4720 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v3
4721 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v4
4722 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v5
4723 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v6, v6
4724 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v5
4725 ; GFX7-NEXT:    v_or_b32_e32 v1, v6, v1
4726 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v1
4727 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4728 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v5
4729 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v5
4730 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v1
4731 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
4732 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4733 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4734 ; GFX7-NEXT:    s_cbranch_execnz .LBB20_1
4735 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
4736 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
4737 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
4738 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
4740 ; GFX6-LABEL: local_atomic_fmax_ret_v2f16:
4741 ; GFX6:       ; %bb.0:
4742 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4743 ; GFX6-NEXT:    s_mov_b32 m0, -1
4744 ; GFX6-NEXT:    ds_read_b32 v3, v0
4745 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v4, v2
4746 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v1
4747 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
4748 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4749 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
4750 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v2
4751 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v3
4752 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v4
4753 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v5
4754 ; GFX6-NEXT:  .LBB20_1: ; %atomicrmw.start
4755 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
4756 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
4757 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
4758 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v1
4759 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v2
4760 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4761 ; GFX6-NEXT:    v_or_b32_e32 v7, v2, v1
4762 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v3
4763 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v4
4764 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v5
4765 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v6, v6
4766 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v5
4767 ; GFX6-NEXT:    v_or_b32_e32 v1, v6, v1
4768 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v1
4769 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4770 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v5
4771 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v5
4772 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
4773 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
4774 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4775 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4776 ; GFX6-NEXT:    s_cbranch_execnz .LBB20_1
4777 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
4778 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
4779 ; GFX6-NEXT:    v_mov_b32_e32 v0, v2
4780 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
4781   %gep = getelementptr <2 x half>, ptr addrspace(3) %ptr, i32 16383
4782   %result = atomicrmw fmax ptr addrspace(3) %ptr, <2 x half> %val seq_cst
4783   ret <2 x half> %result
4786 define <2 x half> @local_atomic_fmax_ret_v2f16__offset(ptr addrspace(3) %ptr, <2 x half> %val) {
4787 ; GFX12-LABEL: local_atomic_fmax_ret_v2f16__offset:
4788 ; GFX12:       ; %bb.0:
4789 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
4790 ; GFX12-NEXT:    s_wait_expcnt 0x0
4791 ; GFX12-NEXT:    s_wait_samplecnt 0x0
4792 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
4793 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4794 ; GFX12-NEXT:    ds_load_b32 v2, v0 offset:65532
4795 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
4796 ; GFX12-NEXT:    s_mov_b32 s0, 0
4797 ; GFX12-NEXT:  .LBB21_1: ; %atomicrmw.start
4798 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
4799 ; GFX12-NEXT:    s_wait_dscnt 0x0
4800 ; GFX12-NEXT:    v_mov_b32_e32 v3, v2
4801 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4802 ; GFX12-NEXT:    v_pk_max_num_f16 v2, v3, v3
4803 ; GFX12-NEXT:    v_pk_max_num_f16 v2, v2, v1
4804 ; GFX12-NEXT:    s_wait_storecnt 0x0
4805 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v3 offset:65532
4806 ; GFX12-NEXT:    s_wait_dscnt 0x0
4807 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
4808 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4809 ; GFX12-NEXT:    s_wait_alu 0xfffe
4810 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
4811 ; GFX12-NEXT:    s_wait_alu 0xfffe
4812 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4813 ; GFX12-NEXT:    s_cbranch_execnz .LBB21_1
4814 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
4815 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4816 ; GFX12-NEXT:    v_mov_b32_e32 v0, v2
4817 ; GFX12-NEXT:    s_wait_alu 0xfffe
4818 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
4820 ; GFX940-LABEL: local_atomic_fmax_ret_v2f16__offset:
4821 ; GFX940:       ; %bb.0:
4822 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4823 ; GFX940-NEXT:    ds_read_b32 v2, v0 offset:65532
4824 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
4825 ; GFX940-NEXT:    v_pk_max_f16 v1, v1, v1
4826 ; GFX940-NEXT:  .LBB21_1: ; %atomicrmw.start
4827 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
4828 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4829 ; GFX940-NEXT:    v_mov_b32_e32 v3, v2
4830 ; GFX940-NEXT:    v_pk_max_f16 v2, v3, v3
4831 ; GFX940-NEXT:    s_nop 0
4832 ; GFX940-NEXT:    v_pk_max_f16 v2, v2, v1
4833 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2 offset:65532
4834 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
4835 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4836 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
4837 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
4838 ; GFX940-NEXT:    s_cbranch_execnz .LBB21_1
4839 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
4840 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
4841 ; GFX940-NEXT:    v_mov_b32_e32 v0, v2
4842 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
4844 ; GFX11-LABEL: local_atomic_fmax_ret_v2f16__offset:
4845 ; GFX11:       ; %bb.0:
4846 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4847 ; GFX11-NEXT:    ds_load_b32 v2, v0 offset:65532
4848 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
4849 ; GFX11-NEXT:    s_mov_b32 s0, 0
4850 ; GFX11-NEXT:  .LBB21_1: ; %atomicrmw.start
4851 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
4852 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4853 ; GFX11-NEXT:    v_mov_b32_e32 v3, v2
4854 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4855 ; GFX11-NEXT:    v_pk_max_f16 v2, v3, v3
4856 ; GFX11-NEXT:    v_pk_max_f16 v2, v2, v1
4857 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
4858 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v3 offset:65532
4859 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4860 ; GFX11-NEXT:    buffer_gl0_inv
4861 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4862 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
4863 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
4864 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
4865 ; GFX11-NEXT:    s_cbranch_execnz .LBB21_1
4866 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
4867 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
4868 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
4869 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4871 ; GFX10-LABEL: local_atomic_fmax_ret_v2f16__offset:
4872 ; GFX10:       ; %bb.0:
4873 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4874 ; GFX10-NEXT:    ds_read_b32 v2, v0 offset:65532
4875 ; GFX10-NEXT:    v_pk_max_f16 v1, v1, v1
4876 ; GFX10-NEXT:    s_mov_b32 s4, 0
4877 ; GFX10-NEXT:  .LBB21_1: ; %atomicrmw.start
4878 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
4879 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4880 ; GFX10-NEXT:    v_mov_b32_e32 v3, v2
4881 ; GFX10-NEXT:    v_pk_max_f16 v2, v3, v3
4882 ; GFX10-NEXT:    v_pk_max_f16 v2, v2, v1
4883 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4884 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2 offset:65532
4885 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4886 ; GFX10-NEXT:    buffer_gl0_inv
4887 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v3
4888 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
4889 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
4890 ; GFX10-NEXT:    s_cbranch_execnz .LBB21_1
4891 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
4892 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
4893 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
4894 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4896 ; GFX90A-LABEL: local_atomic_fmax_ret_v2f16__offset:
4897 ; GFX90A:       ; %bb.0:
4898 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4899 ; GFX90A-NEXT:    ds_read_b32 v2, v0 offset:65532
4900 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
4901 ; GFX90A-NEXT:    v_pk_max_f16 v1, v1, v1
4902 ; GFX90A-NEXT:  .LBB21_1: ; %atomicrmw.start
4903 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
4904 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4905 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v2
4906 ; GFX90A-NEXT:    v_pk_max_f16 v2, v3, v3
4907 ; GFX90A-NEXT:    v_pk_max_f16 v2, v2, v1
4908 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2 offset:65532
4909 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
4910 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4911 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4912 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4913 ; GFX90A-NEXT:    s_cbranch_execnz .LBB21_1
4914 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
4915 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
4916 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
4917 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
4919 ; GFX908-LABEL: local_atomic_fmax_ret_v2f16__offset:
4920 ; GFX908:       ; %bb.0:
4921 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4922 ; GFX908-NEXT:    ds_read_b32 v2, v0 offset:65532
4923 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
4924 ; GFX908-NEXT:    v_pk_max_f16 v1, v1, v1
4925 ; GFX908-NEXT:  .LBB21_1: ; %atomicrmw.start
4926 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
4927 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4928 ; GFX908-NEXT:    v_mov_b32_e32 v3, v2
4929 ; GFX908-NEXT:    v_pk_max_f16 v2, v3, v3
4930 ; GFX908-NEXT:    v_pk_max_f16 v2, v2, v1
4931 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v3, v2 offset:65532
4932 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
4933 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v3
4934 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4935 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4936 ; GFX908-NEXT:    s_cbranch_execnz .LBB21_1
4937 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
4938 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
4939 ; GFX908-NEXT:    v_mov_b32_e32 v0, v2
4940 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
4942 ; GFX8-LABEL: local_atomic_fmax_ret_v2f16__offset:
4943 ; GFX8:       ; %bb.0:
4944 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4945 ; GFX8-NEXT:    s_mov_b32 m0, -1
4946 ; GFX8-NEXT:    ds_read_b32 v2, v0 offset:65532
4947 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
4948 ; GFX8-NEXT:    v_max_f16_sdwa v3, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
4949 ; GFX8-NEXT:    v_max_f16_e32 v1, v1, v1
4950 ; GFX8-NEXT:  .LBB21_1: ; %atomicrmw.start
4951 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
4952 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4953 ; GFX8-NEXT:    v_mov_b32_e32 v4, v2
4954 ; GFX8-NEXT:    v_max_f16_sdwa v2, v4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
4955 ; GFX8-NEXT:    v_max_f16_e32 v5, v4, v4
4956 ; GFX8-NEXT:    v_max_f16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
4957 ; GFX8-NEXT:    v_max_f16_e32 v5, v5, v1
4958 ; GFX8-NEXT:    v_or_b32_e32 v2, v5, v2
4959 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
4960 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4961 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
4962 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4963 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4964 ; GFX8-NEXT:    s_cbranch_execnz .LBB21_1
4965 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
4966 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
4967 ; GFX8-NEXT:    v_mov_b32_e32 v0, v2
4968 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4970 ; GFX7-LABEL: local_atomic_fmax_ret_v2f16__offset:
4971 ; GFX7:       ; %bb.0:
4972 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4973 ; GFX7-NEXT:    s_mov_b32 m0, -1
4974 ; GFX7-NEXT:    ds_read_b32 v3, v0 offset:65532
4975 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v2
4976 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v1
4977 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4978 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4979 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
4980 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v2
4981 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v3
4982 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v4
4983 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v5
4984 ; GFX7-NEXT:  .LBB21_1: ; %atomicrmw.start
4985 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
4986 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v1, v1
4987 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v2, v2
4988 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v5, v1
4989 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v6, v2
4990 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4991 ; GFX7-NEXT:    v_or_b32_e32 v7, v2, v1
4992 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v3
4993 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v4
4994 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v5
4995 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v6, v6
4996 ; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v5
4997 ; GFX7-NEXT:    v_or_b32_e32 v1, v6, v1
4998 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v1 offset:65532
4999 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5000 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v5
5001 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v5
5002 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v1
5003 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5004 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5005 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5006 ; GFX7-NEXT:    s_cbranch_execnz .LBB21_1
5007 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
5008 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
5009 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
5010 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
5012 ; GFX6-LABEL: local_atomic_fmax_ret_v2f16__offset:
5013 ; GFX6:       ; %bb.0:
5014 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5015 ; GFX6-NEXT:    v_add_i32_e32 v3, vcc, 0xfffc, v0
5016 ; GFX6-NEXT:    s_mov_b32 m0, -1
5017 ; GFX6-NEXT:    ds_read_b32 v4, v3
5018 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
5019 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v1
5020 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
5021 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5022 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v4
5023 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v4
5024 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
5025 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
5026 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v5
5027 ; GFX6-NEXT:  .LBB21_1: ; %atomicrmw.start
5028 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
5029 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
5030 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
5031 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v1
5032 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v0
5033 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
5034 ; GFX6-NEXT:    v_or_b32_e32 v7, v0, v1
5035 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v2
5036 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v4
5037 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v5
5038 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v6, v6
5039 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v5
5040 ; GFX6-NEXT:    v_or_b32_e32 v0, v6, v0
5041 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v3, v7, v0
5042 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5043 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v5
5044 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v5
5045 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
5046 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5047 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5048 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5049 ; GFX6-NEXT:    s_cbranch_execnz .LBB21_1
5050 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
5051 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
5052 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
5053   %gep = getelementptr <2 x half>, ptr addrspace(3) %ptr, i32 16383
5054   %result = atomicrmw fmax ptr addrspace(3) %gep, <2 x half> %val seq_cst
5055   ret <2 x half> %result
5058 define void @local_atomic_fmax_noret_v2f16(ptr addrspace(3) %ptr, <2 x half> %val) {
5059 ; GFX12-LABEL: local_atomic_fmax_noret_v2f16:
5060 ; GFX12:       ; %bb.0:
5061 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
5062 ; GFX12-NEXT:    s_wait_expcnt 0x0
5063 ; GFX12-NEXT:    s_wait_samplecnt 0x0
5064 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
5065 ; GFX12-NEXT:    s_wait_kmcnt 0x0
5066 ; GFX12-NEXT:    ds_load_b32 v2, v0
5067 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
5068 ; GFX12-NEXT:    s_mov_b32 s0, 0
5069 ; GFX12-NEXT:  .LBB22_1: ; %atomicrmw.start
5070 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
5071 ; GFX12-NEXT:    s_wait_dscnt 0x0
5072 ; GFX12-NEXT:    v_pk_max_num_f16 v3, v2, v2
5073 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
5074 ; GFX12-NEXT:    v_pk_max_num_f16 v3, v3, v1
5075 ; GFX12-NEXT:    s_wait_storecnt 0x0
5076 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v2
5077 ; GFX12-NEXT:    s_wait_dscnt 0x0
5078 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
5079 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5080 ; GFX12-NEXT:    v_mov_b32_e32 v2, v3
5081 ; GFX12-NEXT:    s_wait_alu 0xfffe
5082 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
5083 ; GFX12-NEXT:    s_wait_alu 0xfffe
5084 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
5085 ; GFX12-NEXT:    s_cbranch_execnz .LBB22_1
5086 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
5087 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
5088 ; GFX12-NEXT:    s_wait_alu 0xfffe
5089 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
5091 ; GFX940-LABEL: local_atomic_fmax_noret_v2f16:
5092 ; GFX940:       ; %bb.0:
5093 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5094 ; GFX940-NEXT:    ds_read_b32 v2, v0
5095 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
5096 ; GFX940-NEXT:    v_pk_max_f16 v1, v1, v1
5097 ; GFX940-NEXT:  .LBB22_1: ; %atomicrmw.start
5098 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
5099 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5100 ; GFX940-NEXT:    v_pk_max_f16 v3, v2, v2
5101 ; GFX940-NEXT:    s_nop 0
5102 ; GFX940-NEXT:    v_pk_max_f16 v3, v3, v1
5103 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
5104 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5105 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5106 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
5107 ; GFX940-NEXT:    v_mov_b32_e32 v2, v3
5108 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
5109 ; GFX940-NEXT:    s_cbranch_execnz .LBB22_1
5110 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
5111 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
5112 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
5114 ; GFX11-LABEL: local_atomic_fmax_noret_v2f16:
5115 ; GFX11:       ; %bb.0:
5116 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5117 ; GFX11-NEXT:    ds_load_b32 v2, v0
5118 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
5119 ; GFX11-NEXT:    s_mov_b32 s0, 0
5120 ; GFX11-NEXT:  .LBB22_1: ; %atomicrmw.start
5121 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
5122 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5123 ; GFX11-NEXT:    v_pk_max_f16 v3, v2, v2
5124 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
5125 ; GFX11-NEXT:    v_pk_max_f16 v3, v3, v1
5126 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
5127 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v2
5128 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5129 ; GFX11-NEXT:    buffer_gl0_inv
5130 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5131 ; GFX11-NEXT:    v_mov_b32_e32 v2, v3
5132 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
5133 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
5134 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
5135 ; GFX11-NEXT:    s_cbranch_execnz .LBB22_1
5136 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
5137 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
5138 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
5140 ; GFX10-LABEL: local_atomic_fmax_noret_v2f16:
5141 ; GFX10:       ; %bb.0:
5142 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5143 ; GFX10-NEXT:    ds_read_b32 v2, v0
5144 ; GFX10-NEXT:    v_pk_max_f16 v1, v1, v1
5145 ; GFX10-NEXT:    s_mov_b32 s4, 0
5146 ; GFX10-NEXT:  .LBB22_1: ; %atomicrmw.start
5147 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
5148 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5149 ; GFX10-NEXT:    v_pk_max_f16 v3, v2, v2
5150 ; GFX10-NEXT:    v_pk_max_f16 v3, v3, v1
5151 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
5152 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
5153 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5154 ; GFX10-NEXT:    buffer_gl0_inv
5155 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5156 ; GFX10-NEXT:    v_mov_b32_e32 v2, v3
5157 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
5158 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
5159 ; GFX10-NEXT:    s_cbranch_execnz .LBB22_1
5160 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
5161 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
5162 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
5164 ; GFX90A-LABEL: local_atomic_fmax_noret_v2f16:
5165 ; GFX90A:       ; %bb.0:
5166 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5167 ; GFX90A-NEXT:    ds_read_b32 v2, v0
5168 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
5169 ; GFX90A-NEXT:    v_pk_max_f16 v1, v1, v1
5170 ; GFX90A-NEXT:  .LBB22_1: ; %atomicrmw.start
5171 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
5172 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5173 ; GFX90A-NEXT:    v_pk_max_f16 v3, v2, v2
5174 ; GFX90A-NEXT:    v_pk_max_f16 v3, v3, v1
5175 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
5176 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5177 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5178 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5179 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v3
5180 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5181 ; GFX90A-NEXT:    s_cbranch_execnz .LBB22_1
5182 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
5183 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
5184 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
5186 ; GFX908-LABEL: local_atomic_fmax_noret_v2f16:
5187 ; GFX908:       ; %bb.0:
5188 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5189 ; GFX908-NEXT:    ds_read_b32 v2, v0
5190 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
5191 ; GFX908-NEXT:    v_pk_max_f16 v1, v1, v1
5192 ; GFX908-NEXT:  .LBB22_1: ; %atomicrmw.start
5193 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
5194 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5195 ; GFX908-NEXT:    v_pk_max_f16 v3, v2, v2
5196 ; GFX908-NEXT:    v_pk_max_f16 v3, v3, v1
5197 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3
5198 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5199 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5200 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5201 ; GFX908-NEXT:    v_mov_b32_e32 v2, v3
5202 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5203 ; GFX908-NEXT:    s_cbranch_execnz .LBB22_1
5204 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
5205 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
5206 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
5208 ; GFX8-LABEL: local_atomic_fmax_noret_v2f16:
5209 ; GFX8:       ; %bb.0:
5210 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5211 ; GFX8-NEXT:    s_mov_b32 m0, -1
5212 ; GFX8-NEXT:    ds_read_b32 v3, v0
5213 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
5214 ; GFX8-NEXT:    v_max_f16_sdwa v2, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
5215 ; GFX8-NEXT:    v_max_f16_e32 v1, v1, v1
5216 ; GFX8-NEXT:  .LBB22_1: ; %atomicrmw.start
5217 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
5218 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5219 ; GFX8-NEXT:    v_max_f16_sdwa v4, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
5220 ; GFX8-NEXT:    v_max_f16_e32 v5, v3, v3
5221 ; GFX8-NEXT:    v_max_f16_sdwa v4, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
5222 ; GFX8-NEXT:    v_max_f16_e32 v5, v5, v1
5223 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
5224 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
5225 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5226 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
5227 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5228 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
5229 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5230 ; GFX8-NEXT:    s_cbranch_execnz .LBB22_1
5231 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
5232 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
5233 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
5235 ; GFX7-LABEL: local_atomic_fmax_noret_v2f16:
5236 ; GFX7:       ; %bb.0:
5237 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5238 ; GFX7-NEXT:    s_mov_b32 m0, -1
5239 ; GFX7-NEXT:    ds_read_b32 v3, v0
5240 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v2, v2
5241 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v1
5242 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
5243 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v2
5244 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5245 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
5246 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
5247 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v3
5248 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v5
5249 ; GFX7-NEXT:  .LBB22_1: ; %atomicrmw.start
5250 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
5251 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v4
5252 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v3, v3
5253 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v5, v4
5254 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v6, v3
5255 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
5256 ; GFX7-NEXT:    v_or_b32_e32 v7, v3, v4
5257 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v1
5258 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v2
5259 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v5
5260 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v6, v6
5261 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
5262 ; GFX7-NEXT:    v_or_b32_e32 v3, v6, v3
5263 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v3
5264 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5265 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
5266 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v5
5267 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
5268 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5269 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5270 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5271 ; GFX7-NEXT:    s_cbranch_execnz .LBB22_1
5272 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
5273 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
5274 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
5276 ; GFX6-LABEL: local_atomic_fmax_noret_v2f16:
5277 ; GFX6:       ; %bb.0:
5278 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5279 ; GFX6-NEXT:    s_mov_b32 m0, -1
5280 ; GFX6-NEXT:    ds_read_b32 v3, v0
5281 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
5282 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v1
5283 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
5284 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v2
5285 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5286 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
5287 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
5288 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
5289 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v5
5290 ; GFX6-NEXT:  .LBB22_1: ; %atomicrmw.start
5291 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
5292 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v4, v4
5293 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
5294 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v4
5295 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v3
5296 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
5297 ; GFX6-NEXT:    v_or_b32_e32 v7, v3, v4
5298 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v1
5299 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v2
5300 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v5
5301 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v6, v6
5302 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
5303 ; GFX6-NEXT:    v_or_b32_e32 v3, v6, v3
5304 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v3
5305 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5306 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
5307 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v5
5308 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
5309 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5310 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5311 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5312 ; GFX6-NEXT:    s_cbranch_execnz .LBB22_1
5313 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
5314 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
5315 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
5316   %result = atomicrmw fmax ptr addrspace(3) %ptr, <2 x half> %val seq_cst
5317   ret void
5320 define void @local_atomic_fmax_noret_v2f16__offset(ptr addrspace(3) %ptr, <2 x half> %val) {
5321 ; GFX12-LABEL: local_atomic_fmax_noret_v2f16__offset:
5322 ; GFX12:       ; %bb.0:
5323 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
5324 ; GFX12-NEXT:    s_wait_expcnt 0x0
5325 ; GFX12-NEXT:    s_wait_samplecnt 0x0
5326 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
5327 ; GFX12-NEXT:    s_wait_kmcnt 0x0
5328 ; GFX12-NEXT:    ds_load_b32 v2, v0 offset:65532
5329 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
5330 ; GFX12-NEXT:    s_mov_b32 s0, 0
5331 ; GFX12-NEXT:  .LBB23_1: ; %atomicrmw.start
5332 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
5333 ; GFX12-NEXT:    s_wait_dscnt 0x0
5334 ; GFX12-NEXT:    v_pk_max_num_f16 v3, v2, v2
5335 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
5336 ; GFX12-NEXT:    v_pk_max_num_f16 v3, v3, v1
5337 ; GFX12-NEXT:    s_wait_storecnt 0x0
5338 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v2 offset:65532
5339 ; GFX12-NEXT:    s_wait_dscnt 0x0
5340 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
5341 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5342 ; GFX12-NEXT:    v_mov_b32_e32 v2, v3
5343 ; GFX12-NEXT:    s_wait_alu 0xfffe
5344 ; GFX12-NEXT:    s_or_b32 s0, vcc_lo, s0
5345 ; GFX12-NEXT:    s_wait_alu 0xfffe
5346 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
5347 ; GFX12-NEXT:    s_cbranch_execnz .LBB23_1
5348 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
5349 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s0
5350 ; GFX12-NEXT:    s_wait_alu 0xfffe
5351 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
5353 ; GFX940-LABEL: local_atomic_fmax_noret_v2f16__offset:
5354 ; GFX940:       ; %bb.0:
5355 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5356 ; GFX940-NEXT:    ds_read_b32 v2, v0 offset:65532
5357 ; GFX940-NEXT:    s_mov_b64 s[0:1], 0
5358 ; GFX940-NEXT:    v_pk_max_f16 v1, v1, v1
5359 ; GFX940-NEXT:  .LBB23_1: ; %atomicrmw.start
5360 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
5361 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5362 ; GFX940-NEXT:    v_pk_max_f16 v3, v2, v2
5363 ; GFX940-NEXT:    s_nop 0
5364 ; GFX940-NEXT:    v_pk_max_f16 v3, v3, v1
5365 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3 offset:65532
5366 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5367 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5368 ; GFX940-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
5369 ; GFX940-NEXT:    v_mov_b32_e32 v2, v3
5370 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[0:1]
5371 ; GFX940-NEXT:    s_cbranch_execnz .LBB23_1
5372 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
5373 ; GFX940-NEXT:    s_or_b64 exec, exec, s[0:1]
5374 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
5376 ; GFX11-LABEL: local_atomic_fmax_noret_v2f16__offset:
5377 ; GFX11:       ; %bb.0:
5378 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5379 ; GFX11-NEXT:    ds_load_b32 v2, v0 offset:65532
5380 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
5381 ; GFX11-NEXT:    s_mov_b32 s0, 0
5382 ; GFX11-NEXT:  .LBB23_1: ; %atomicrmw.start
5383 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
5384 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5385 ; GFX11-NEXT:    v_pk_max_f16 v3, v2, v2
5386 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
5387 ; GFX11-NEXT:    v_pk_max_f16 v3, v3, v1
5388 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
5389 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v3, v0, v3, v2 offset:65532
5390 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5391 ; GFX11-NEXT:    buffer_gl0_inv
5392 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5393 ; GFX11-NEXT:    v_mov_b32_e32 v2, v3
5394 ; GFX11-NEXT:    s_or_b32 s0, vcc_lo, s0
5395 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
5396 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s0
5397 ; GFX11-NEXT:    s_cbranch_execnz .LBB23_1
5398 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
5399 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s0
5400 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
5402 ; GFX10-LABEL: local_atomic_fmax_noret_v2f16__offset:
5403 ; GFX10:       ; %bb.0:
5404 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5405 ; GFX10-NEXT:    ds_read_b32 v2, v0 offset:65532
5406 ; GFX10-NEXT:    v_pk_max_f16 v1, v1, v1
5407 ; GFX10-NEXT:    s_mov_b32 s4, 0
5408 ; GFX10-NEXT:  .LBB23_1: ; %atomicrmw.start
5409 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
5410 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5411 ; GFX10-NEXT:    v_pk_max_f16 v3, v2, v2
5412 ; GFX10-NEXT:    v_pk_max_f16 v3, v3, v1
5413 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
5414 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3 offset:65532
5415 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5416 ; GFX10-NEXT:    buffer_gl0_inv
5417 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v3, v2
5418 ; GFX10-NEXT:    v_mov_b32_e32 v2, v3
5419 ; GFX10-NEXT:    s_or_b32 s4, vcc_lo, s4
5420 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s4
5421 ; GFX10-NEXT:    s_cbranch_execnz .LBB23_1
5422 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
5423 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s4
5424 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
5426 ; GFX90A-LABEL: local_atomic_fmax_noret_v2f16__offset:
5427 ; GFX90A:       ; %bb.0:
5428 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5429 ; GFX90A-NEXT:    ds_read_b32 v2, v0 offset:65532
5430 ; GFX90A-NEXT:    s_mov_b64 s[4:5], 0
5431 ; GFX90A-NEXT:    v_pk_max_f16 v1, v1, v1
5432 ; GFX90A-NEXT:  .LBB23_1: ; %atomicrmw.start
5433 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
5434 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5435 ; GFX90A-NEXT:    v_pk_max_f16 v3, v2, v2
5436 ; GFX90A-NEXT:    v_pk_max_f16 v3, v3, v1
5437 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3 offset:65532
5438 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5439 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5440 ; GFX90A-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5441 ; GFX90A-NEXT:    v_mov_b32_e32 v2, v3
5442 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5443 ; GFX90A-NEXT:    s_cbranch_execnz .LBB23_1
5444 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
5445 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[4:5]
5446 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
5448 ; GFX908-LABEL: local_atomic_fmax_noret_v2f16__offset:
5449 ; GFX908:       ; %bb.0:
5450 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5451 ; GFX908-NEXT:    ds_read_b32 v2, v0 offset:65532
5452 ; GFX908-NEXT:    s_mov_b64 s[4:5], 0
5453 ; GFX908-NEXT:    v_pk_max_f16 v1, v1, v1
5454 ; GFX908-NEXT:  .LBB23_1: ; %atomicrmw.start
5455 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
5456 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5457 ; GFX908-NEXT:    v_pk_max_f16 v3, v2, v2
5458 ; GFX908-NEXT:    v_pk_max_f16 v3, v3, v1
5459 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v3, v0, v2, v3 offset:65532
5460 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5461 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v2
5462 ; GFX908-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5463 ; GFX908-NEXT:    v_mov_b32_e32 v2, v3
5464 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5465 ; GFX908-NEXT:    s_cbranch_execnz .LBB23_1
5466 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
5467 ; GFX908-NEXT:    s_or_b64 exec, exec, s[4:5]
5468 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
5470 ; GFX8-LABEL: local_atomic_fmax_noret_v2f16__offset:
5471 ; GFX8:       ; %bb.0:
5472 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5473 ; GFX8-NEXT:    s_mov_b32 m0, -1
5474 ; GFX8-NEXT:    ds_read_b32 v3, v0 offset:65532
5475 ; GFX8-NEXT:    s_mov_b64 s[4:5], 0
5476 ; GFX8-NEXT:    v_max_f16_sdwa v2, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
5477 ; GFX8-NEXT:    v_max_f16_e32 v1, v1, v1
5478 ; GFX8-NEXT:  .LBB23_1: ; %atomicrmw.start
5479 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
5480 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5481 ; GFX8-NEXT:    v_max_f16_sdwa v4, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
5482 ; GFX8-NEXT:    v_max_f16_e32 v5, v3, v3
5483 ; GFX8-NEXT:    v_max_f16_sdwa v4, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
5484 ; GFX8-NEXT:    v_max_f16_e32 v5, v5, v1
5485 ; GFX8-NEXT:    v_or_b32_e32 v4, v5, v4
5486 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
5487 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5488 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
5489 ; GFX8-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5490 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
5491 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5492 ; GFX8-NEXT:    s_cbranch_execnz .LBB23_1
5493 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
5494 ; GFX8-NEXT:    s_or_b64 exec, exec, s[4:5]
5495 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
5497 ; GFX7-LABEL: local_atomic_fmax_noret_v2f16__offset:
5498 ; GFX7:       ; %bb.0:
5499 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5500 ; GFX7-NEXT:    s_mov_b32 m0, -1
5501 ; GFX7-NEXT:    ds_read_b32 v3, v0 offset:65532
5502 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v2, v2
5503 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v1
5504 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
5505 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v1, v2
5506 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5507 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
5508 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
5509 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v3
5510 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v2, v5
5511 ; GFX7-NEXT:  .LBB23_1: ; %atomicrmw.start
5512 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
5513 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v4, v4
5514 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v3, v3
5515 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v5, v4
5516 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v6, v3
5517 ; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
5518 ; GFX7-NEXT:    v_or_b32_e32 v7, v3, v4
5519 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v1
5520 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v2
5521 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v5, v5
5522 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v6, v6
5523 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
5524 ; GFX7-NEXT:    v_or_b32_e32 v3, v6, v3
5525 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v3 offset:65532
5526 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5527 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
5528 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v3, v5
5529 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v4, v4
5530 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5531 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5532 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5533 ; GFX7-NEXT:    s_cbranch_execnz .LBB23_1
5534 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
5535 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
5536 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
5538 ; GFX6-LABEL: local_atomic_fmax_noret_v2f16__offset:
5539 ; GFX6:       ; %bb.0:
5540 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5541 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffc, v0
5542 ; GFX6-NEXT:    s_mov_b32 m0, -1
5543 ; GFX6-NEXT:    ds_read_b32 v4, v0
5544 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
5545 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v1
5546 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
5547 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5548 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v4
5549 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v4
5550 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v1
5551 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v2
5552 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v5
5553 ; GFX6-NEXT:  .LBB23_1: ; %atomicrmw.start
5554 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
5555 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v4, v4
5556 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
5557 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v5, v4
5558 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v6, v3
5559 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
5560 ; GFX6-NEXT:    v_or_b32_e32 v7, v3, v4
5561 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v1
5562 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v2
5563 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v5, v5
5564 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v6, v6
5565 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
5566 ; GFX6-NEXT:    v_or_b32_e32 v3, v6, v3
5567 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v0, v7, v3
5568 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5569 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
5570 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v5
5571 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v4, v4
5572 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v7
5573 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5574 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5575 ; GFX6-NEXT:    s_cbranch_execnz .LBB23_1
5576 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
5577 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
5578 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
5579   %gep = getelementptr <2 x half>, ptr addrspace(3) %ptr, i32 16383
5580   %result = atomicrmw fmax ptr addrspace(3) %gep, <2 x half> %val seq_cst
5581   ret void
5584 ; --------------------------------------------------------------------
5585 ; <2 x bfloat>
5586 ; --------------------------------------------------------------------
5588 define <2 x bfloat> @local_atomic_fmax_ret_v2bf16(ptr addrspace(3) %ptr, <2 x bfloat> %val) {
5589 ; GFX12-LABEL: local_atomic_fmax_ret_v2bf16:
5590 ; GFX12:       ; %bb.0:
5591 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
5592 ; GFX12-NEXT:    s_wait_expcnt 0x0
5593 ; GFX12-NEXT:    s_wait_samplecnt 0x0
5594 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
5595 ; GFX12-NEXT:    s_wait_kmcnt 0x0
5596 ; GFX12-NEXT:    ds_load_b32 v2, v0
5597 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5598 ; GFX12-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5599 ; GFX12-NEXT:    s_mov_b32 s1, 0
5600 ; GFX12-NEXT:  .LBB24_1: ; %atomicrmw.start
5601 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
5602 ; GFX12-NEXT:    s_wait_dscnt 0x0
5603 ; GFX12-NEXT:    v_mov_b32_e32 v4, v2
5604 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5605 ; GFX12-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5606 ; GFX12-NEXT:    v_max_num_f32_e32 v5, v5, v1
5607 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5608 ; GFX12-NEXT:    v_bfe_u32 v7, v5, 16, 1
5609 ; GFX12-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5610 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
5611 ; GFX12-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
5612 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5613 ; GFX12-NEXT:    v_dual_cndmask_b32 v5, v7, v9 :: v_dual_lshlrev_b32 v2, 16, v4
5614 ; GFX12-NEXT:    v_max_num_f32_e32 v2, v2, v3
5615 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5616 ; GFX12-NEXT:    v_bfe_u32 v6, v2, 16, 1
5617 ; GFX12-NEXT:    v_or_b32_e32 v8, 0x400000, v2
5618 ; GFX12-NEXT:    v_cmp_u_f32_e64 s0, v2, v2
5619 ; GFX12-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
5620 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5621 ; GFX12-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
5622 ; GFX12-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
5623 ; GFX12-NEXT:    s_wait_storecnt 0x0
5624 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v4
5625 ; GFX12-NEXT:    s_wait_dscnt 0x0
5626 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
5627 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
5628 ; GFX12-NEXT:    s_wait_alu 0xfffe
5629 ; GFX12-NEXT:    s_or_b32 s1, vcc_lo, s1
5630 ; GFX12-NEXT:    s_wait_alu 0xfffe
5631 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
5632 ; GFX12-NEXT:    s_cbranch_execnz .LBB24_1
5633 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
5634 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s1
5635 ; GFX12-NEXT:    v_mov_b32_e32 v0, v2
5636 ; GFX12-NEXT:    s_wait_alu 0xfffe
5637 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
5639 ; GFX940-LABEL: local_atomic_fmax_ret_v2bf16:
5640 ; GFX940:       ; %bb.0:
5641 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5642 ; GFX940-NEXT:    ds_read_b32 v2, v0
5643 ; GFX940-NEXT:    s_mov_b64 s[2:3], 0
5644 ; GFX940-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5645 ; GFX940-NEXT:    s_movk_i32 s4, 0x7fff
5646 ; GFX940-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5647 ; GFX940-NEXT:    s_mov_b32 s5, 0x7060302
5648 ; GFX940-NEXT:  .LBB24_1: ; %atomicrmw.start
5649 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
5650 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5651 ; GFX940-NEXT:    v_mov_b32_e32 v4, v2
5652 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
5653 ; GFX940-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5654 ; GFX940-NEXT:    v_max_f32_e32 v2, v2, v3
5655 ; GFX940-NEXT:    v_max_f32_e32 v5, v5, v1
5656 ; GFX940-NEXT:    v_bfe_u32 v6, v2, 16, 1
5657 ; GFX940-NEXT:    v_bfe_u32 v8, v5, 16, 1
5658 ; GFX940-NEXT:    v_or_b32_e32 v7, 0x400000, v2
5659 ; GFX940-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5660 ; GFX940-NEXT:    v_add3_u32 v6, v6, v2, s4
5661 ; GFX940-NEXT:    v_add3_u32 v8, v8, v5, s4
5662 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
5663 ; GFX940-NEXT:    v_cmp_u_f32_e64 s[0:1], v2, v2
5664 ; GFX940-NEXT:    s_nop 0
5665 ; GFX940-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
5666 ; GFX940-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[0:1]
5667 ; GFX940-NEXT:    v_perm_b32 v2, v5, v2, s5
5668 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
5669 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
5670 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
5671 ; GFX940-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
5672 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[2:3]
5673 ; GFX940-NEXT:    s_cbranch_execnz .LBB24_1
5674 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
5675 ; GFX940-NEXT:    s_or_b64 exec, exec, s[2:3]
5676 ; GFX940-NEXT:    v_mov_b32_e32 v0, v2
5677 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
5679 ; GFX11-LABEL: local_atomic_fmax_ret_v2bf16:
5680 ; GFX11:       ; %bb.0:
5681 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5682 ; GFX11-NEXT:    ds_load_b32 v2, v0
5683 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5684 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5685 ; GFX11-NEXT:    s_mov_b32 s1, 0
5686 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x1
5687 ; GFX11-NEXT:    .p2align 6
5688 ; GFX11-NEXT:  .LBB24_1: ; %atomicrmw.start
5689 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
5690 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5691 ; GFX11-NEXT:    v_mov_b32_e32 v4, v2
5692 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5693 ; GFX11-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5694 ; GFX11-NEXT:    v_max_f32_e32 v5, v5, v1
5695 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5696 ; GFX11-NEXT:    v_bfe_u32 v7, v5, 16, 1
5697 ; GFX11-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5698 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
5699 ; GFX11-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
5700 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5701 ; GFX11-NEXT:    v_dual_cndmask_b32 v5, v7, v9 :: v_dual_lshlrev_b32 v2, 16, v4
5702 ; GFX11-NEXT:    v_max_f32_e32 v2, v2, v3
5703 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5704 ; GFX11-NEXT:    v_bfe_u32 v6, v2, 16, 1
5705 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v2
5706 ; GFX11-NEXT:    v_cmp_u_f32_e64 s0, v2, v2
5707 ; GFX11-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
5708 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5709 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
5710 ; GFX11-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
5711 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
5712 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v4
5713 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
5714 ; GFX11-NEXT:    buffer_gl0_inv
5715 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
5716 ; GFX11-NEXT:    s_or_b32 s1, vcc_lo, s1
5717 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
5718 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
5719 ; GFX11-NEXT:    s_cbranch_execnz .LBB24_1
5720 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
5721 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x2
5722 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s1
5723 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
5724 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
5726 ; GFX10-LABEL: local_atomic_fmax_ret_v2bf16:
5727 ; GFX10:       ; %bb.0:
5728 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5729 ; GFX10-NEXT:    ds_read_b32 v2, v0
5730 ; GFX10-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5731 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5732 ; GFX10-NEXT:    s_mov_b32 s5, 0
5733 ; GFX10-NEXT:  .LBB24_1: ; %atomicrmw.start
5734 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
5735 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5736 ; GFX10-NEXT:    v_mov_b32_e32 v4, v2
5737 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
5738 ; GFX10-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5739 ; GFX10-NEXT:    v_max_f32_e32 v2, v2, v3
5740 ; GFX10-NEXT:    v_max_f32_e32 v5, v5, v1
5741 ; GFX10-NEXT:    v_bfe_u32 v6, v2, 16, 1
5742 ; GFX10-NEXT:    v_bfe_u32 v7, v5, 16, 1
5743 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v2
5744 ; GFX10-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5745 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
5746 ; GFX10-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
5747 ; GFX10-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
5748 ; GFX10-NEXT:    v_cmp_u_f32_e64 s4, v2, v2
5749 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
5750 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s4
5751 ; GFX10-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
5752 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
5753 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
5754 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
5755 ; GFX10-NEXT:    buffer_gl0_inv
5756 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
5757 ; GFX10-NEXT:    s_or_b32 s5, vcc_lo, s5
5758 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s5
5759 ; GFX10-NEXT:    s_cbranch_execnz .LBB24_1
5760 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
5761 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s5
5762 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
5763 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
5765 ; GFX90A-LABEL: local_atomic_fmax_ret_v2bf16:
5766 ; GFX90A:       ; %bb.0:
5767 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5768 ; GFX90A-NEXT:    ds_read_b32 v2, v0
5769 ; GFX90A-NEXT:    s_mov_b64 s[6:7], 0
5770 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5771 ; GFX90A-NEXT:    s_movk_i32 s8, 0x7fff
5772 ; GFX90A-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5773 ; GFX90A-NEXT:    s_mov_b32 s9, 0x7060302
5774 ; GFX90A-NEXT:  .LBB24_1: ; %atomicrmw.start
5775 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
5776 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5777 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v2
5778 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
5779 ; GFX90A-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5780 ; GFX90A-NEXT:    v_max_f32_e32 v2, v2, v3
5781 ; GFX90A-NEXT:    v_max_f32_e32 v5, v5, v1
5782 ; GFX90A-NEXT:    v_bfe_u32 v6, v2, 16, 1
5783 ; GFX90A-NEXT:    v_bfe_u32 v8, v5, 16, 1
5784 ; GFX90A-NEXT:    v_or_b32_e32 v7, 0x400000, v2
5785 ; GFX90A-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5786 ; GFX90A-NEXT:    v_add3_u32 v6, v6, v2, s8
5787 ; GFX90A-NEXT:    v_add3_u32 v8, v8, v5, s8
5788 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
5789 ; GFX90A-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
5790 ; GFX90A-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
5791 ; GFX90A-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
5792 ; GFX90A-NEXT:    v_perm_b32 v2, v5, v2, s9
5793 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
5794 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
5795 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
5796 ; GFX90A-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
5797 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[6:7]
5798 ; GFX90A-NEXT:    s_cbranch_execnz .LBB24_1
5799 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
5800 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[6:7]
5801 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
5802 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
5804 ; GFX908-LABEL: local_atomic_fmax_ret_v2bf16:
5805 ; GFX908:       ; %bb.0:
5806 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5807 ; GFX908-NEXT:    ds_read_b32 v2, v0
5808 ; GFX908-NEXT:    s_mov_b64 s[6:7], 0
5809 ; GFX908-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5810 ; GFX908-NEXT:    s_movk_i32 s8, 0x7fff
5811 ; GFX908-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5812 ; GFX908-NEXT:    s_mov_b32 s9, 0x7060302
5813 ; GFX908-NEXT:  .LBB24_1: ; %atomicrmw.start
5814 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
5815 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5816 ; GFX908-NEXT:    v_mov_b32_e32 v4, v2
5817 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
5818 ; GFX908-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5819 ; GFX908-NEXT:    v_max_f32_e32 v2, v2, v3
5820 ; GFX908-NEXT:    v_max_f32_e32 v5, v5, v1
5821 ; GFX908-NEXT:    v_bfe_u32 v6, v2, 16, 1
5822 ; GFX908-NEXT:    v_bfe_u32 v8, v5, 16, 1
5823 ; GFX908-NEXT:    v_or_b32_e32 v7, 0x400000, v2
5824 ; GFX908-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5825 ; GFX908-NEXT:    v_add3_u32 v6, v6, v2, s8
5826 ; GFX908-NEXT:    v_add3_u32 v8, v8, v5, s8
5827 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
5828 ; GFX908-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
5829 ; GFX908-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
5830 ; GFX908-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
5831 ; GFX908-NEXT:    v_perm_b32 v2, v5, v2, s9
5832 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
5833 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
5834 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
5835 ; GFX908-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
5836 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[6:7]
5837 ; GFX908-NEXT:    s_cbranch_execnz .LBB24_1
5838 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
5839 ; GFX908-NEXT:    s_or_b64 exec, exec, s[6:7]
5840 ; GFX908-NEXT:    v_mov_b32_e32 v0, v2
5841 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
5843 ; GFX8-LABEL: local_atomic_fmax_ret_v2bf16:
5844 ; GFX8:       ; %bb.0:
5845 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5846 ; GFX8-NEXT:    s_mov_b32 m0, -1
5847 ; GFX8-NEXT:    ds_read_b32 v2, v0
5848 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
5849 ; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5850 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5851 ; GFX8-NEXT:  .LBB24_1: ; %atomicrmw.start
5852 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
5853 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5854 ; GFX8-NEXT:    v_mov_b32_e32 v4, v2
5855 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
5856 ; GFX8-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5857 ; GFX8-NEXT:    v_max_f32_e32 v2, v2, v3
5858 ; GFX8-NEXT:    v_max_f32_e32 v5, v5, v1
5859 ; GFX8-NEXT:    v_bfe_u32 v6, v2, 16, 1
5860 ; GFX8-NEXT:    v_bfe_u32 v8, v5, 16, 1
5861 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v2
5862 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v5
5863 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
5864 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 0x7fff, v8
5865 ; GFX8-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5866 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
5867 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v2
5868 ; GFX8-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
5869 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
5870 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
5871 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v5
5872 ; GFX8-NEXT:    v_alignbit_b32 v2, v5, v2, 16
5873 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2
5874 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
5875 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
5876 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
5877 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
5878 ; GFX8-NEXT:    s_cbranch_execnz .LBB24_1
5879 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
5880 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
5881 ; GFX8-NEXT:    v_mov_b32_e32 v0, v2
5882 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
5884 ; GFX7-LABEL: local_atomic_fmax_ret_v2bf16:
5885 ; GFX7:       ; %bb.0:
5886 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5887 ; GFX7-NEXT:    s_mov_b32 m0, -1
5888 ; GFX7-NEXT:    ds_read_b32 v3, v0
5889 ; GFX7-NEXT:    v_mov_b32_e32 v4, v1
5890 ; GFX7-NEXT:    v_mul_f32_e32 v2, 1.0, v2
5891 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
5892 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
5893 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5894 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
5895 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
5896 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
5897 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
5898 ; GFX7-NEXT:  .LBB24_1: ; %atomicrmw.start
5899 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
5900 ; GFX7-NEXT:    v_mul_f32_e32 v1, 1.0, v1
5901 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
5902 ; GFX7-NEXT:    v_and_b32_e32 v5, 0xffff0000, v1
5903 ; GFX7-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
5904 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
5905 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v2
5906 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v4
5907 ; GFX7-NEXT:    v_alignbit_b32 v1, v1, v3, 16
5908 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v5
5909 ; GFX7-NEXT:    v_alignbit_b32 v3, v3, v6, 16
5910 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v0, v1, v3
5911 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5912 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v1
5913 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
5914 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5915 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
5916 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5917 ; GFX7-NEXT:    s_cbranch_execnz .LBB24_1
5918 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
5919 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
5920 ; GFX7-NEXT:    v_mov_b32_e32 v0, v3
5921 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
5923 ; GFX6-LABEL: local_atomic_fmax_ret_v2bf16:
5924 ; GFX6:       ; %bb.0:
5925 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5926 ; GFX6-NEXT:    s_mov_b32 m0, -1
5927 ; GFX6-NEXT:    ds_read_b32 v3, v0
5928 ; GFX6-NEXT:    v_mov_b32_e32 v4, v1
5929 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
5930 ; GFX6-NEXT:    v_mul_f32_e32 v4, 1.0, v4
5931 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
5932 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5933 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
5934 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
5935 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
5936 ; GFX6-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
5937 ; GFX6-NEXT:  .LBB24_1: ; %atomicrmw.start
5938 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
5939 ; GFX6-NEXT:    v_mul_f32_e32 v1, 1.0, v1
5940 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
5941 ; GFX6-NEXT:    v_and_b32_e32 v5, 0xffff0000, v1
5942 ; GFX6-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
5943 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
5944 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v2
5945 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v4
5946 ; GFX6-NEXT:    v_alignbit_b32 v1, v1, v3, 16
5947 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v5
5948 ; GFX6-NEXT:    v_alignbit_b32 v3, v3, v6, 16
5949 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v3, v0, v1, v3
5950 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5951 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v1
5952 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
5953 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5954 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
5955 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5956 ; GFX6-NEXT:    s_cbranch_execnz .LBB24_1
5957 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
5958 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
5959 ; GFX6-NEXT:    v_mov_b32_e32 v0, v3
5960 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
5961   %result = atomicrmw fmax ptr addrspace(3) %ptr, <2 x bfloat> %val seq_cst
5962   ret <2 x bfloat> %result
5965 define <2 x bfloat> @local_atomic_fmax_ret_v2bf16__offset(ptr addrspace(3) %ptr, <2 x bfloat> %val) {
5966 ; GFX12-LABEL: local_atomic_fmax_ret_v2bf16__offset:
5967 ; GFX12:       ; %bb.0:
5968 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
5969 ; GFX12-NEXT:    s_wait_expcnt 0x0
5970 ; GFX12-NEXT:    s_wait_samplecnt 0x0
5971 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
5972 ; GFX12-NEXT:    s_wait_kmcnt 0x0
5973 ; GFX12-NEXT:    ds_load_b32 v2, v0 offset:65532
5974 ; GFX12-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
5975 ; GFX12-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
5976 ; GFX12-NEXT:    s_mov_b32 s1, 0
5977 ; GFX12-NEXT:  .LBB25_1: ; %atomicrmw.start
5978 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
5979 ; GFX12-NEXT:    s_wait_dscnt 0x0
5980 ; GFX12-NEXT:    v_mov_b32_e32 v4, v2
5981 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5982 ; GFX12-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
5983 ; GFX12-NEXT:    v_max_num_f32_e32 v5, v5, v1
5984 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5985 ; GFX12-NEXT:    v_bfe_u32 v7, v5, 16, 1
5986 ; GFX12-NEXT:    v_or_b32_e32 v9, 0x400000, v5
5987 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
5988 ; GFX12-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
5989 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5990 ; GFX12-NEXT:    v_dual_cndmask_b32 v5, v7, v9 :: v_dual_lshlrev_b32 v2, 16, v4
5991 ; GFX12-NEXT:    v_max_num_f32_e32 v2, v2, v3
5992 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
5993 ; GFX12-NEXT:    v_bfe_u32 v6, v2, 16, 1
5994 ; GFX12-NEXT:    v_or_b32_e32 v8, 0x400000, v2
5995 ; GFX12-NEXT:    v_cmp_u_f32_e64 s0, v2, v2
5996 ; GFX12-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
5997 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
5998 ; GFX12-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
5999 ; GFX12-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
6000 ; GFX12-NEXT:    s_wait_storecnt 0x0
6001 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v4 offset:65532
6002 ; GFX12-NEXT:    s_wait_dscnt 0x0
6003 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
6004 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
6005 ; GFX12-NEXT:    s_wait_alu 0xfffe
6006 ; GFX12-NEXT:    s_or_b32 s1, vcc_lo, s1
6007 ; GFX12-NEXT:    s_wait_alu 0xfffe
6008 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6009 ; GFX12-NEXT:    s_cbranch_execnz .LBB25_1
6010 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
6011 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6012 ; GFX12-NEXT:    v_mov_b32_e32 v0, v2
6013 ; GFX12-NEXT:    s_wait_alu 0xfffe
6014 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
6016 ; GFX940-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6017 ; GFX940:       ; %bb.0:
6018 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6019 ; GFX940-NEXT:    ds_read_b32 v2, v0 offset:65532
6020 ; GFX940-NEXT:    s_mov_b64 s[2:3], 0
6021 ; GFX940-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6022 ; GFX940-NEXT:    s_movk_i32 s4, 0x7fff
6023 ; GFX940-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6024 ; GFX940-NEXT:    s_mov_b32 s5, 0x7060302
6025 ; GFX940-NEXT:  .LBB25_1: ; %atomicrmw.start
6026 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
6027 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6028 ; GFX940-NEXT:    v_mov_b32_e32 v4, v2
6029 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
6030 ; GFX940-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6031 ; GFX940-NEXT:    v_max_f32_e32 v2, v2, v3
6032 ; GFX940-NEXT:    v_max_f32_e32 v5, v5, v1
6033 ; GFX940-NEXT:    v_bfe_u32 v6, v2, 16, 1
6034 ; GFX940-NEXT:    v_bfe_u32 v8, v5, 16, 1
6035 ; GFX940-NEXT:    v_or_b32_e32 v7, 0x400000, v2
6036 ; GFX940-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6037 ; GFX940-NEXT:    v_add3_u32 v6, v6, v2, s4
6038 ; GFX940-NEXT:    v_add3_u32 v8, v8, v5, s4
6039 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6040 ; GFX940-NEXT:    v_cmp_u_f32_e64 s[0:1], v2, v2
6041 ; GFX940-NEXT:    s_nop 0
6042 ; GFX940-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6043 ; GFX940-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[0:1]
6044 ; GFX940-NEXT:    v_perm_b32 v2, v5, v2, s5
6045 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
6046 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6047 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
6048 ; GFX940-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
6049 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[2:3]
6050 ; GFX940-NEXT:    s_cbranch_execnz .LBB25_1
6051 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
6052 ; GFX940-NEXT:    s_or_b64 exec, exec, s[2:3]
6053 ; GFX940-NEXT:    v_mov_b32_e32 v0, v2
6054 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
6056 ; GFX11-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6057 ; GFX11:       ; %bb.0:
6058 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6059 ; GFX11-NEXT:    ds_load_b32 v2, v0 offset:65532
6060 ; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6061 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6062 ; GFX11-NEXT:    s_mov_b32 s1, 0
6063 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x1
6064 ; GFX11-NEXT:    .p2align 6
6065 ; GFX11-NEXT:  .LBB25_1: ; %atomicrmw.start
6066 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
6067 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6068 ; GFX11-NEXT:    v_mov_b32_e32 v4, v2
6069 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6070 ; GFX11-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6071 ; GFX11-NEXT:    v_max_f32_e32 v5, v5, v1
6072 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
6073 ; GFX11-NEXT:    v_bfe_u32 v7, v5, 16, 1
6074 ; GFX11-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6075 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6076 ; GFX11-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6077 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6078 ; GFX11-NEXT:    v_dual_cndmask_b32 v5, v7, v9 :: v_dual_lshlrev_b32 v2, 16, v4
6079 ; GFX11-NEXT:    v_max_f32_e32 v2, v2, v3
6080 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_3)
6081 ; GFX11-NEXT:    v_bfe_u32 v6, v2, 16, 1
6082 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v2
6083 ; GFX11-NEXT:    v_cmp_u_f32_e64 s0, v2, v2
6084 ; GFX11-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
6085 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6086 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
6087 ; GFX11-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
6088 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
6089 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v2, v0, v2, v4 offset:65532
6090 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6091 ; GFX11-NEXT:    buffer_gl0_inv
6092 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
6093 ; GFX11-NEXT:    s_or_b32 s1, vcc_lo, s1
6094 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
6095 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6096 ; GFX11-NEXT:    s_cbranch_execnz .LBB25_1
6097 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
6098 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x2
6099 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6100 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
6101 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
6103 ; GFX10-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6104 ; GFX10:       ; %bb.0:
6105 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6106 ; GFX10-NEXT:    ds_read_b32 v2, v0 offset:65532
6107 ; GFX10-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6108 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6109 ; GFX10-NEXT:    s_mov_b32 s5, 0
6110 ; GFX10-NEXT:  .LBB25_1: ; %atomicrmw.start
6111 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
6112 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6113 ; GFX10-NEXT:    v_mov_b32_e32 v4, v2
6114 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
6115 ; GFX10-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6116 ; GFX10-NEXT:    v_max_f32_e32 v2, v2, v3
6117 ; GFX10-NEXT:    v_max_f32_e32 v5, v5, v1
6118 ; GFX10-NEXT:    v_bfe_u32 v6, v2, 16, 1
6119 ; GFX10-NEXT:    v_bfe_u32 v7, v5, 16, 1
6120 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v2
6121 ; GFX10-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6122 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6123 ; GFX10-NEXT:    v_add3_u32 v6, v6, v2, 0x7fff
6124 ; GFX10-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6125 ; GFX10-NEXT:    v_cmp_u_f32_e64 s4, v2, v2
6126 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6127 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s4
6128 ; GFX10-NEXT:    v_perm_b32 v2, v5, v2, 0x7060302
6129 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
6130 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
6131 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6132 ; GFX10-NEXT:    buffer_gl0_inv
6133 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v2, v4
6134 ; GFX10-NEXT:    s_or_b32 s5, vcc_lo, s5
6135 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s5
6136 ; GFX10-NEXT:    s_cbranch_execnz .LBB25_1
6137 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
6138 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s5
6139 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
6140 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
6142 ; GFX90A-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6143 ; GFX90A:       ; %bb.0:
6144 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6145 ; GFX90A-NEXT:    ds_read_b32 v2, v0 offset:65532
6146 ; GFX90A-NEXT:    s_mov_b64 s[6:7], 0
6147 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6148 ; GFX90A-NEXT:    s_movk_i32 s8, 0x7fff
6149 ; GFX90A-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6150 ; GFX90A-NEXT:    s_mov_b32 s9, 0x7060302
6151 ; GFX90A-NEXT:  .LBB25_1: ; %atomicrmw.start
6152 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
6153 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6154 ; GFX90A-NEXT:    v_mov_b32_e32 v4, v2
6155 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
6156 ; GFX90A-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6157 ; GFX90A-NEXT:    v_max_f32_e32 v2, v2, v3
6158 ; GFX90A-NEXT:    v_max_f32_e32 v5, v5, v1
6159 ; GFX90A-NEXT:    v_bfe_u32 v6, v2, 16, 1
6160 ; GFX90A-NEXT:    v_bfe_u32 v8, v5, 16, 1
6161 ; GFX90A-NEXT:    v_or_b32_e32 v7, 0x400000, v2
6162 ; GFX90A-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6163 ; GFX90A-NEXT:    v_add3_u32 v6, v6, v2, s8
6164 ; GFX90A-NEXT:    v_add3_u32 v8, v8, v5, s8
6165 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6166 ; GFX90A-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
6167 ; GFX90A-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
6168 ; GFX90A-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6169 ; GFX90A-NEXT:    v_perm_b32 v2, v5, v2, s9
6170 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
6171 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6172 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
6173 ; GFX90A-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6174 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6175 ; GFX90A-NEXT:    s_cbranch_execnz .LBB25_1
6176 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
6177 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[6:7]
6178 ; GFX90A-NEXT:    v_mov_b32_e32 v0, v2
6179 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
6181 ; GFX908-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6182 ; GFX908:       ; %bb.0:
6183 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6184 ; GFX908-NEXT:    ds_read_b32 v2, v0 offset:65532
6185 ; GFX908-NEXT:    s_mov_b64 s[6:7], 0
6186 ; GFX908-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6187 ; GFX908-NEXT:    s_movk_i32 s8, 0x7fff
6188 ; GFX908-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6189 ; GFX908-NEXT:    s_mov_b32 s9, 0x7060302
6190 ; GFX908-NEXT:  .LBB25_1: ; %atomicrmw.start
6191 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
6192 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6193 ; GFX908-NEXT:    v_mov_b32_e32 v4, v2
6194 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
6195 ; GFX908-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6196 ; GFX908-NEXT:    v_max_f32_e32 v2, v2, v3
6197 ; GFX908-NEXT:    v_max_f32_e32 v5, v5, v1
6198 ; GFX908-NEXT:    v_bfe_u32 v6, v2, 16, 1
6199 ; GFX908-NEXT:    v_bfe_u32 v8, v5, 16, 1
6200 ; GFX908-NEXT:    v_or_b32_e32 v7, 0x400000, v2
6201 ; GFX908-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6202 ; GFX908-NEXT:    v_add3_u32 v6, v6, v2, s8
6203 ; GFX908-NEXT:    v_add3_u32 v8, v8, v5, s8
6204 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6205 ; GFX908-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
6206 ; GFX908-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
6207 ; GFX908-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6208 ; GFX908-NEXT:    v_perm_b32 v2, v5, v2, s9
6209 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
6210 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6211 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
6212 ; GFX908-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6213 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6214 ; GFX908-NEXT:    s_cbranch_execnz .LBB25_1
6215 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
6216 ; GFX908-NEXT:    s_or_b64 exec, exec, s[6:7]
6217 ; GFX908-NEXT:    v_mov_b32_e32 v0, v2
6218 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
6220 ; GFX8-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6221 ; GFX8:       ; %bb.0:
6222 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6223 ; GFX8-NEXT:    s_mov_b32 m0, -1
6224 ; GFX8-NEXT:    ds_read_b32 v2, v0 offset:65532
6225 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
6226 ; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 16, v1
6227 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6228 ; GFX8-NEXT:  .LBB25_1: ; %atomicrmw.start
6229 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
6230 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6231 ; GFX8-NEXT:    v_mov_b32_e32 v4, v2
6232 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
6233 ; GFX8-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6234 ; GFX8-NEXT:    v_max_f32_e32 v2, v2, v3
6235 ; GFX8-NEXT:    v_max_f32_e32 v5, v5, v1
6236 ; GFX8-NEXT:    v_bfe_u32 v6, v2, 16, 1
6237 ; GFX8-NEXT:    v_bfe_u32 v8, v5, 16, 1
6238 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v2
6239 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v5
6240 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
6241 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 0x7fff, v8
6242 ; GFX8-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6243 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6244 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v2
6245 ; GFX8-NEXT:    v_cmp_u_f32_e64 s[4:5], v2, v2
6246 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6247 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, v6, v7, s[4:5]
6248 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v5
6249 ; GFX8-NEXT:    v_alignbit_b32 v2, v5, v2, 16
6250 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v2, v0, v4, v2 offset:65532
6251 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6252 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v2, v4
6253 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6254 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6255 ; GFX8-NEXT:    s_cbranch_execnz .LBB25_1
6256 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
6257 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
6258 ; GFX8-NEXT:    v_mov_b32_e32 v0, v2
6259 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
6261 ; GFX7-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6262 ; GFX7:       ; %bb.0:
6263 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6264 ; GFX7-NEXT:    s_mov_b32 m0, -1
6265 ; GFX7-NEXT:    ds_read_b32 v3, v0 offset:65532
6266 ; GFX7-NEXT:    v_mov_b32_e32 v4, v1
6267 ; GFX7-NEXT:    v_mul_f32_e32 v2, 1.0, v2
6268 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
6269 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
6270 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6271 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
6272 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
6273 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
6274 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
6275 ; GFX7-NEXT:  .LBB25_1: ; %atomicrmw.start
6276 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
6277 ; GFX7-NEXT:    v_mul_f32_e32 v1, 1.0, v1
6278 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
6279 ; GFX7-NEXT:    v_and_b32_e32 v5, 0xffff0000, v1
6280 ; GFX7-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
6281 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
6282 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v2
6283 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v4
6284 ; GFX7-NEXT:    v_alignbit_b32 v1, v1, v3, 16
6285 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v5
6286 ; GFX7-NEXT:    v_alignbit_b32 v3, v3, v6, 16
6287 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v3, v0, v1, v3 offset:65532
6288 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6289 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v1
6290 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v3
6291 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6292 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
6293 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6294 ; GFX7-NEXT:    s_cbranch_execnz .LBB25_1
6295 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
6296 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
6297 ; GFX7-NEXT:    v_mov_b32_e32 v0, v3
6298 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
6300 ; GFX6-LABEL: local_atomic_fmax_ret_v2bf16__offset:
6301 ; GFX6:       ; %bb.0:
6302 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6303 ; GFX6-NEXT:    v_add_i32_e32 v4, vcc, 0xfffc, v0
6304 ; GFX6-NEXT:    s_mov_b32 m0, -1
6305 ; GFX6-NEXT:    ds_read_b32 v0, v4
6306 ; GFX6-NEXT:    v_mov_b32_e32 v3, v1
6307 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
6308 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
6309 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
6310 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6311 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v0
6312 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
6313 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
6314 ; GFX6-NEXT:    v_and_b32_e32 v3, 0xffff0000, v3
6315 ; GFX6-NEXT:  .LBB25_1: ; %atomicrmw.start
6316 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
6317 ; GFX6-NEXT:    v_mul_f32_e32 v1, 1.0, v1
6318 ; GFX6-NEXT:    v_mul_f32_e32 v0, 1.0, v0
6319 ; GFX6-NEXT:    v_and_b32_e32 v5, 0xffff0000, v1
6320 ; GFX6-NEXT:    v_and_b32_e32 v6, 0xffff0000, v0
6321 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
6322 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v2
6323 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v3
6324 ; GFX6-NEXT:    v_alignbit_b32 v0, v1, v0, 16
6325 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v5
6326 ; GFX6-NEXT:    v_alignbit_b32 v1, v1, v6, 16
6327 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v4, v0, v1
6328 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6329 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v0
6330 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v5
6331 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6332 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v5
6333 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6334 ; GFX6-NEXT:    s_cbranch_execnz .LBB25_1
6335 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
6336 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
6337 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
6338   %gep = getelementptr <2 x bfloat>, ptr addrspace(3) %ptr, i32 16383
6339   %result = atomicrmw fmax ptr addrspace(3) %gep, <2 x bfloat> %val seq_cst
6340   ret <2 x bfloat> %result
6343 define void @local_atomic_fmax_noret_v2bf16(ptr addrspace(3) %ptr, <2 x bfloat> %val) {
6344 ; GFX12-LABEL: local_atomic_fmax_noret_v2bf16:
6345 ; GFX12:       ; %bb.0:
6346 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
6347 ; GFX12-NEXT:    s_wait_expcnt 0x0
6348 ; GFX12-NEXT:    s_wait_samplecnt 0x0
6349 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
6350 ; GFX12-NEXT:    s_wait_kmcnt 0x0
6351 ; GFX12-NEXT:    ds_load_b32 v3, v0
6352 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6353 ; GFX12-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6354 ; GFX12-NEXT:    s_mov_b32 s1, 0
6355 ; GFX12-NEXT:  .LBB26_1: ; %atomicrmw.start
6356 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
6357 ; GFX12-NEXT:    s_wait_dscnt 0x0
6358 ; GFX12-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6359 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6360 ; GFX12-NEXT:    v_dual_max_num_f32 v5, v5, v1 :: v_dual_lshlrev_b32 v4, 16, v3
6361 ; GFX12-NEXT:    v_max_num_f32_e32 v4, v4, v2
6362 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
6363 ; GFX12-NEXT:    v_bfe_u32 v7, v5, 16, 1
6364 ; GFX12-NEXT:    v_bfe_u32 v6, v4, 16, 1
6365 ; GFX12-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6366 ; GFX12-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6367 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6368 ; GFX12-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6369 ; GFX12-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6370 ; GFX12-NEXT:    v_cmp_u_f32_e64 s0, v4, v4
6371 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
6372 ; GFX12-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6373 ; GFX12-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s0
6374 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
6375 ; GFX12-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6376 ; GFX12-NEXT:    s_wait_storecnt 0x0
6377 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
6378 ; GFX12-NEXT:    s_wait_dscnt 0x0
6379 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
6380 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6381 ; GFX12-NEXT:    v_mov_b32_e32 v3, v4
6382 ; GFX12-NEXT:    s_wait_alu 0xfffe
6383 ; GFX12-NEXT:    s_or_b32 s1, vcc_lo, s1
6384 ; GFX12-NEXT:    s_wait_alu 0xfffe
6385 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6386 ; GFX12-NEXT:    s_cbranch_execnz .LBB26_1
6387 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
6388 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6389 ; GFX12-NEXT:    s_wait_alu 0xfffe
6390 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
6392 ; GFX940-LABEL: local_atomic_fmax_noret_v2bf16:
6393 ; GFX940:       ; %bb.0:
6394 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6395 ; GFX940-NEXT:    ds_read_b32 v3, v0
6396 ; GFX940-NEXT:    s_mov_b64 s[2:3], 0
6397 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6398 ; GFX940-NEXT:    s_movk_i32 s4, 0x7fff
6399 ; GFX940-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6400 ; GFX940-NEXT:    s_mov_b32 s5, 0x7060302
6401 ; GFX940-NEXT:  .LBB26_1: ; %atomicrmw.start
6402 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
6403 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6404 ; GFX940-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6405 ; GFX940-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6406 ; GFX940-NEXT:    v_max_f32_e32 v4, v4, v2
6407 ; GFX940-NEXT:    v_max_f32_e32 v5, v5, v1
6408 ; GFX940-NEXT:    v_bfe_u32 v6, v4, 16, 1
6409 ; GFX940-NEXT:    v_bfe_u32 v8, v5, 16, 1
6410 ; GFX940-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6411 ; GFX940-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6412 ; GFX940-NEXT:    v_add3_u32 v6, v6, v4, s4
6413 ; GFX940-NEXT:    v_add3_u32 v8, v8, v5, s4
6414 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6415 ; GFX940-NEXT:    v_cmp_u_f32_e64 s[0:1], v4, v4
6416 ; GFX940-NEXT:    s_nop 0
6417 ; GFX940-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6418 ; GFX940-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[0:1]
6419 ; GFX940-NEXT:    v_perm_b32 v4, v5, v4, s5
6420 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
6421 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6422 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6423 ; GFX940-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
6424 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
6425 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[2:3]
6426 ; GFX940-NEXT:    s_cbranch_execnz .LBB26_1
6427 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
6428 ; GFX940-NEXT:    s_or_b64 exec, exec, s[2:3]
6429 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
6431 ; GFX11-LABEL: local_atomic_fmax_noret_v2bf16:
6432 ; GFX11:       ; %bb.0:
6433 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6434 ; GFX11-NEXT:    ds_load_b32 v3, v0
6435 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6436 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6437 ; GFX11-NEXT:    s_mov_b32 s1, 0
6438 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x1
6439 ; GFX11-NEXT:    .p2align 6
6440 ; GFX11-NEXT:  .LBB26_1: ; %atomicrmw.start
6441 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
6442 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6443 ; GFX11-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6444 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6445 ; GFX11-NEXT:    v_dual_max_f32 v5, v5, v1 :: v_dual_lshlrev_b32 v4, 16, v3
6446 ; GFX11-NEXT:    v_max_f32_e32 v4, v4, v2
6447 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
6448 ; GFX11-NEXT:    v_bfe_u32 v7, v5, 16, 1
6449 ; GFX11-NEXT:    v_bfe_u32 v6, v4, 16, 1
6450 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6451 ; GFX11-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6452 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6453 ; GFX11-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6454 ; GFX11-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6455 ; GFX11-NEXT:    v_cmp_u_f32_e64 s0, v4, v4
6456 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
6457 ; GFX11-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6458 ; GFX11-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s0
6459 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
6460 ; GFX11-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6461 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
6462 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3
6463 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6464 ; GFX11-NEXT:    buffer_gl0_inv
6465 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6466 ; GFX11-NEXT:    v_mov_b32_e32 v3, v4
6467 ; GFX11-NEXT:    s_or_b32 s1, vcc_lo, s1
6468 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
6469 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6470 ; GFX11-NEXT:    s_cbranch_execnz .LBB26_1
6471 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
6472 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x2
6473 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6474 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
6476 ; GFX10-LABEL: local_atomic_fmax_noret_v2bf16:
6477 ; GFX10:       ; %bb.0:
6478 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6479 ; GFX10-NEXT:    ds_read_b32 v3, v0
6480 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6481 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6482 ; GFX10-NEXT:    s_mov_b32 s5, 0
6483 ; GFX10-NEXT:  .LBB26_1: ; %atomicrmw.start
6484 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
6485 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6486 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6487 ; GFX10-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6488 ; GFX10-NEXT:    v_max_f32_e32 v4, v4, v2
6489 ; GFX10-NEXT:    v_max_f32_e32 v5, v5, v1
6490 ; GFX10-NEXT:    v_bfe_u32 v6, v4, 16, 1
6491 ; GFX10-NEXT:    v_bfe_u32 v7, v5, 16, 1
6492 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6493 ; GFX10-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6494 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6495 ; GFX10-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6496 ; GFX10-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6497 ; GFX10-NEXT:    v_cmp_u_f32_e64 s4, v4, v4
6498 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6499 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s4
6500 ; GFX10-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6501 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
6502 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
6503 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6504 ; GFX10-NEXT:    buffer_gl0_inv
6505 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6506 ; GFX10-NEXT:    v_mov_b32_e32 v3, v4
6507 ; GFX10-NEXT:    s_or_b32 s5, vcc_lo, s5
6508 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s5
6509 ; GFX10-NEXT:    s_cbranch_execnz .LBB26_1
6510 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
6511 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s5
6512 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
6514 ; GFX90A-LABEL: local_atomic_fmax_noret_v2bf16:
6515 ; GFX90A:       ; %bb.0:
6516 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6517 ; GFX90A-NEXT:    ds_read_b32 v3, v0
6518 ; GFX90A-NEXT:    s_mov_b64 s[6:7], 0
6519 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6520 ; GFX90A-NEXT:    s_movk_i32 s8, 0x7fff
6521 ; GFX90A-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6522 ; GFX90A-NEXT:    s_mov_b32 s9, 0x7060302
6523 ; GFX90A-NEXT:  .LBB26_1: ; %atomicrmw.start
6524 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
6525 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6526 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6527 ; GFX90A-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6528 ; GFX90A-NEXT:    v_max_f32_e32 v4, v4, v2
6529 ; GFX90A-NEXT:    v_max_f32_e32 v5, v5, v1
6530 ; GFX90A-NEXT:    v_bfe_u32 v6, v4, 16, 1
6531 ; GFX90A-NEXT:    v_bfe_u32 v8, v5, 16, 1
6532 ; GFX90A-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6533 ; GFX90A-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6534 ; GFX90A-NEXT:    v_add3_u32 v6, v6, v4, s8
6535 ; GFX90A-NEXT:    v_add3_u32 v8, v8, v5, s8
6536 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6537 ; GFX90A-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6538 ; GFX90A-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6539 ; GFX90A-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6540 ; GFX90A-NEXT:    v_perm_b32 v4, v5, v4, s9
6541 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
6542 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6543 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6544 ; GFX90A-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6545 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
6546 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6547 ; GFX90A-NEXT:    s_cbranch_execnz .LBB26_1
6548 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
6549 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[6:7]
6550 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
6552 ; GFX908-LABEL: local_atomic_fmax_noret_v2bf16:
6553 ; GFX908:       ; %bb.0:
6554 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6555 ; GFX908-NEXT:    ds_read_b32 v3, v0
6556 ; GFX908-NEXT:    s_mov_b64 s[6:7], 0
6557 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6558 ; GFX908-NEXT:    s_movk_i32 s8, 0x7fff
6559 ; GFX908-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6560 ; GFX908-NEXT:    s_mov_b32 s9, 0x7060302
6561 ; GFX908-NEXT:  .LBB26_1: ; %atomicrmw.start
6562 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
6563 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6564 ; GFX908-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6565 ; GFX908-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6566 ; GFX908-NEXT:    v_max_f32_e32 v4, v4, v2
6567 ; GFX908-NEXT:    v_max_f32_e32 v5, v5, v1
6568 ; GFX908-NEXT:    v_bfe_u32 v6, v4, 16, 1
6569 ; GFX908-NEXT:    v_bfe_u32 v8, v5, 16, 1
6570 ; GFX908-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6571 ; GFX908-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6572 ; GFX908-NEXT:    v_add3_u32 v6, v6, v4, s8
6573 ; GFX908-NEXT:    v_add3_u32 v8, v8, v5, s8
6574 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6575 ; GFX908-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6576 ; GFX908-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6577 ; GFX908-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6578 ; GFX908-NEXT:    v_perm_b32 v4, v5, v4, s9
6579 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
6580 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6581 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6582 ; GFX908-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6583 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
6584 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6585 ; GFX908-NEXT:    s_cbranch_execnz .LBB26_1
6586 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
6587 ; GFX908-NEXT:    s_or_b64 exec, exec, s[6:7]
6588 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
6590 ; GFX8-LABEL: local_atomic_fmax_noret_v2bf16:
6591 ; GFX8:       ; %bb.0:
6592 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6593 ; GFX8-NEXT:    s_mov_b32 m0, -1
6594 ; GFX8-NEXT:    ds_read_b32 v3, v0
6595 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
6596 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6597 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6598 ; GFX8-NEXT:  .LBB26_1: ; %atomicrmw.start
6599 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
6600 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6601 ; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6602 ; GFX8-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6603 ; GFX8-NEXT:    v_max_f32_e32 v4, v4, v2
6604 ; GFX8-NEXT:    v_max_f32_e32 v5, v5, v1
6605 ; GFX8-NEXT:    v_bfe_u32 v6, v4, 16, 1
6606 ; GFX8-NEXT:    v_bfe_u32 v8, v5, 16, 1
6607 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v4
6608 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v5
6609 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
6610 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 0x7fff, v8
6611 ; GFX8-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6612 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6613 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6614 ; GFX8-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6615 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6616 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6617 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v5
6618 ; GFX8-NEXT:    v_alignbit_b32 v4, v5, v4, 16
6619 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4
6620 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6621 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6622 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6623 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
6624 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6625 ; GFX8-NEXT:    s_cbranch_execnz .LBB26_1
6626 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
6627 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
6628 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
6630 ; GFX7-LABEL: local_atomic_fmax_noret_v2bf16:
6631 ; GFX7:       ; %bb.0:
6632 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6633 ; GFX7-NEXT:    s_mov_b32 m0, -1
6634 ; GFX7-NEXT:    ds_read_b32 v3, v0
6635 ; GFX7-NEXT:    v_mul_f32_e32 v2, 1.0, v2
6636 ; GFX7-NEXT:    v_mul_f32_e32 v1, 1.0, v1
6637 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
6638 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
6639 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6640 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v3
6641 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
6642 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6643 ; GFX7-NEXT:  .LBB26_1: ; %atomicrmw.start
6644 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
6645 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
6646 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
6647 ; GFX7-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6648 ; GFX7-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
6649 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
6650 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v2
6651 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v1
6652 ; GFX7-NEXT:    v_alignbit_b32 v3, v4, v3, 16
6653 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
6654 ; GFX7-NEXT:    v_alignbit_b32 v4, v4, v6, 16
6655 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v3, v4
6656 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6657 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v3
6658 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v5
6659 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6660 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
6661 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6662 ; GFX7-NEXT:    s_cbranch_execnz .LBB26_1
6663 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
6664 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
6665 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
6667 ; GFX6-LABEL: local_atomic_fmax_noret_v2bf16:
6668 ; GFX6:       ; %bb.0:
6669 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6670 ; GFX6-NEXT:    s_mov_b32 m0, -1
6671 ; GFX6-NEXT:    ds_read_b32 v3, v0
6672 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
6673 ; GFX6-NEXT:    v_mul_f32_e32 v1, 1.0, v1
6674 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
6675 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
6676 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6677 ; GFX6-NEXT:    v_and_b32_e32 v4, 0xffff0000, v3
6678 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
6679 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6680 ; GFX6-NEXT:  .LBB26_1: ; %atomicrmw.start
6681 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
6682 ; GFX6-NEXT:    v_mul_f32_e32 v4, 1.0, v4
6683 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
6684 ; GFX6-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
6685 ; GFX6-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
6686 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
6687 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v2
6688 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v1
6689 ; GFX6-NEXT:    v_alignbit_b32 v3, v4, v3, 16
6690 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
6691 ; GFX6-NEXT:    v_alignbit_b32 v4, v4, v6, 16
6692 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v0, v3, v4
6693 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6694 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v3
6695 ; GFX6-NEXT:    v_and_b32_e32 v4, 0xffff0000, v5
6696 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6697 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
6698 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6699 ; GFX6-NEXT:    s_cbranch_execnz .LBB26_1
6700 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
6701 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
6702 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
6703   %result = atomicrmw fmax ptr addrspace(3) %ptr, <2 x bfloat> %val seq_cst
6704   ret void
6707 define void @local_atomic_fmax_noret_v2bf16__ofset(ptr addrspace(3) %ptr, <2 x bfloat> %val) {
6708 ; GFX12-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6709 ; GFX12:       ; %bb.0:
6710 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
6711 ; GFX12-NEXT:    s_wait_expcnt 0x0
6712 ; GFX12-NEXT:    s_wait_samplecnt 0x0
6713 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
6714 ; GFX12-NEXT:    s_wait_kmcnt 0x0
6715 ; GFX12-NEXT:    ds_load_b32 v3, v0 offset:65532
6716 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6717 ; GFX12-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6718 ; GFX12-NEXT:    s_mov_b32 s1, 0
6719 ; GFX12-NEXT:  .LBB27_1: ; %atomicrmw.start
6720 ; GFX12-NEXT:    ; =>This Inner Loop Header: Depth=1
6721 ; GFX12-NEXT:    s_wait_dscnt 0x0
6722 ; GFX12-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6723 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6724 ; GFX12-NEXT:    v_dual_max_num_f32 v5, v5, v1 :: v_dual_lshlrev_b32 v4, 16, v3
6725 ; GFX12-NEXT:    v_max_num_f32_e32 v4, v4, v2
6726 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
6727 ; GFX12-NEXT:    v_bfe_u32 v7, v5, 16, 1
6728 ; GFX12-NEXT:    v_bfe_u32 v6, v4, 16, 1
6729 ; GFX12-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6730 ; GFX12-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6731 ; GFX12-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6732 ; GFX12-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6733 ; GFX12-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6734 ; GFX12-NEXT:    v_cmp_u_f32_e64 s0, v4, v4
6735 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
6736 ; GFX12-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6737 ; GFX12-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s0
6738 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
6739 ; GFX12-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6740 ; GFX12-NEXT:    s_wait_storecnt 0x0
6741 ; GFX12-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3 offset:65532
6742 ; GFX12-NEXT:    s_wait_dscnt 0x0
6743 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
6744 ; GFX12-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6745 ; GFX12-NEXT:    v_mov_b32_e32 v3, v4
6746 ; GFX12-NEXT:    s_wait_alu 0xfffe
6747 ; GFX12-NEXT:    s_or_b32 s1, vcc_lo, s1
6748 ; GFX12-NEXT:    s_wait_alu 0xfffe
6749 ; GFX12-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6750 ; GFX12-NEXT:    s_cbranch_execnz .LBB27_1
6751 ; GFX12-NEXT:  ; %bb.2: ; %atomicrmw.end
6752 ; GFX12-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6753 ; GFX12-NEXT:    s_wait_alu 0xfffe
6754 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
6756 ; GFX940-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6757 ; GFX940:       ; %bb.0:
6758 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6759 ; GFX940-NEXT:    ds_read_b32 v3, v0 offset:65532
6760 ; GFX940-NEXT:    s_mov_b64 s[2:3], 0
6761 ; GFX940-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6762 ; GFX940-NEXT:    s_movk_i32 s4, 0x7fff
6763 ; GFX940-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6764 ; GFX940-NEXT:    s_mov_b32 s5, 0x7060302
6765 ; GFX940-NEXT:  .LBB27_1: ; %atomicrmw.start
6766 ; GFX940-NEXT:    ; =>This Inner Loop Header: Depth=1
6767 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6768 ; GFX940-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6769 ; GFX940-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6770 ; GFX940-NEXT:    v_max_f32_e32 v4, v4, v2
6771 ; GFX940-NEXT:    v_max_f32_e32 v5, v5, v1
6772 ; GFX940-NEXT:    v_bfe_u32 v6, v4, 16, 1
6773 ; GFX940-NEXT:    v_bfe_u32 v8, v5, 16, 1
6774 ; GFX940-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6775 ; GFX940-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6776 ; GFX940-NEXT:    v_add3_u32 v6, v6, v4, s4
6777 ; GFX940-NEXT:    v_add3_u32 v8, v8, v5, s4
6778 ; GFX940-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6779 ; GFX940-NEXT:    v_cmp_u_f32_e64 s[0:1], v4, v4
6780 ; GFX940-NEXT:    s_nop 0
6781 ; GFX940-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6782 ; GFX940-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[0:1]
6783 ; GFX940-NEXT:    v_perm_b32 v4, v5, v4, s5
6784 ; GFX940-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
6785 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
6786 ; GFX940-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6787 ; GFX940-NEXT:    s_or_b64 s[2:3], vcc, s[2:3]
6788 ; GFX940-NEXT:    v_mov_b32_e32 v3, v4
6789 ; GFX940-NEXT:    s_andn2_b64 exec, exec, s[2:3]
6790 ; GFX940-NEXT:    s_cbranch_execnz .LBB27_1
6791 ; GFX940-NEXT:  ; %bb.2: ; %atomicrmw.end
6792 ; GFX940-NEXT:    s_or_b64 exec, exec, s[2:3]
6793 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
6795 ; GFX11-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6796 ; GFX11:       ; %bb.0:
6797 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6798 ; GFX11-NEXT:    ds_load_b32 v3, v0 offset:65532
6799 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6800 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6801 ; GFX11-NEXT:    s_mov_b32 s1, 0
6802 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x1
6803 ; GFX11-NEXT:    .p2align 6
6804 ; GFX11-NEXT:  .LBB27_1: ; %atomicrmw.start
6805 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
6806 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6807 ; GFX11-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6808 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
6809 ; GFX11-NEXT:    v_dual_max_f32 v5, v5, v1 :: v_dual_lshlrev_b32 v4, 16, v3
6810 ; GFX11-NEXT:    v_max_f32_e32 v4, v4, v2
6811 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
6812 ; GFX11-NEXT:    v_bfe_u32 v7, v5, 16, 1
6813 ; GFX11-NEXT:    v_bfe_u32 v6, v4, 16, 1
6814 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6815 ; GFX11-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6816 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6817 ; GFX11-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6818 ; GFX11-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6819 ; GFX11-NEXT:    v_cmp_u_f32_e64 s0, v4, v4
6820 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
6821 ; GFX11-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6822 ; GFX11-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s0
6823 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
6824 ; GFX11-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6825 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
6826 ; GFX11-NEXT:    ds_cmpstore_rtn_b32 v4, v0, v4, v3 offset:65532
6827 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
6828 ; GFX11-NEXT:    buffer_gl0_inv
6829 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6830 ; GFX11-NEXT:    v_mov_b32_e32 v3, v4
6831 ; GFX11-NEXT:    s_or_b32 s1, vcc_lo, s1
6832 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
6833 ; GFX11-NEXT:    s_and_not1_b32 exec_lo, exec_lo, s1
6834 ; GFX11-NEXT:    s_cbranch_execnz .LBB27_1
6835 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
6836 ; GFX11-NEXT:    s_set_inst_prefetch_distance 0x2
6837 ; GFX11-NEXT:    s_or_b32 exec_lo, exec_lo, s1
6838 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
6840 ; GFX10-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6841 ; GFX10:       ; %bb.0:
6842 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6843 ; GFX10-NEXT:    ds_read_b32 v3, v0 offset:65532
6844 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6845 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6846 ; GFX10-NEXT:    s_mov_b32 s5, 0
6847 ; GFX10-NEXT:  .LBB27_1: ; %atomicrmw.start
6848 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
6849 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6850 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6851 ; GFX10-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6852 ; GFX10-NEXT:    v_max_f32_e32 v4, v4, v2
6853 ; GFX10-NEXT:    v_max_f32_e32 v5, v5, v1
6854 ; GFX10-NEXT:    v_bfe_u32 v6, v4, 16, 1
6855 ; GFX10-NEXT:    v_bfe_u32 v7, v5, 16, 1
6856 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v4
6857 ; GFX10-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6858 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v5, v5
6859 ; GFX10-NEXT:    v_add3_u32 v6, v6, v4, 0x7fff
6860 ; GFX10-NEXT:    v_add3_u32 v7, v7, v5, 0x7fff
6861 ; GFX10-NEXT:    v_cmp_u_f32_e64 s4, v4, v4
6862 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v7, v9, vcc_lo
6863 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v6, v8, s4
6864 ; GFX10-NEXT:    v_perm_b32 v4, v5, v4, 0x7060302
6865 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
6866 ; GFX10-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
6867 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
6868 ; GFX10-NEXT:    buffer_gl0_inv
6869 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, v4, v3
6870 ; GFX10-NEXT:    v_mov_b32_e32 v3, v4
6871 ; GFX10-NEXT:    s_or_b32 s5, vcc_lo, s5
6872 ; GFX10-NEXT:    s_andn2_b32 exec_lo, exec_lo, s5
6873 ; GFX10-NEXT:    s_cbranch_execnz .LBB27_1
6874 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
6875 ; GFX10-NEXT:    s_or_b32 exec_lo, exec_lo, s5
6876 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
6878 ; GFX90A-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6879 ; GFX90A:       ; %bb.0:
6880 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6881 ; GFX90A-NEXT:    ds_read_b32 v3, v0 offset:65532
6882 ; GFX90A-NEXT:    s_mov_b64 s[6:7], 0
6883 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6884 ; GFX90A-NEXT:    s_movk_i32 s8, 0x7fff
6885 ; GFX90A-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6886 ; GFX90A-NEXT:    s_mov_b32 s9, 0x7060302
6887 ; GFX90A-NEXT:  .LBB27_1: ; %atomicrmw.start
6888 ; GFX90A-NEXT:    ; =>This Inner Loop Header: Depth=1
6889 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6890 ; GFX90A-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6891 ; GFX90A-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6892 ; GFX90A-NEXT:    v_max_f32_e32 v4, v4, v2
6893 ; GFX90A-NEXT:    v_max_f32_e32 v5, v5, v1
6894 ; GFX90A-NEXT:    v_bfe_u32 v6, v4, 16, 1
6895 ; GFX90A-NEXT:    v_bfe_u32 v8, v5, 16, 1
6896 ; GFX90A-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6897 ; GFX90A-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6898 ; GFX90A-NEXT:    v_add3_u32 v6, v6, v4, s8
6899 ; GFX90A-NEXT:    v_add3_u32 v8, v8, v5, s8
6900 ; GFX90A-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6901 ; GFX90A-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6902 ; GFX90A-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6903 ; GFX90A-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6904 ; GFX90A-NEXT:    v_perm_b32 v4, v5, v4, s9
6905 ; GFX90A-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
6906 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
6907 ; GFX90A-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6908 ; GFX90A-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6909 ; GFX90A-NEXT:    v_mov_b32_e32 v3, v4
6910 ; GFX90A-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6911 ; GFX90A-NEXT:    s_cbranch_execnz .LBB27_1
6912 ; GFX90A-NEXT:  ; %bb.2: ; %atomicrmw.end
6913 ; GFX90A-NEXT:    s_or_b64 exec, exec, s[6:7]
6914 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
6916 ; GFX908-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6917 ; GFX908:       ; %bb.0:
6918 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6919 ; GFX908-NEXT:    ds_read_b32 v3, v0 offset:65532
6920 ; GFX908-NEXT:    s_mov_b64 s[6:7], 0
6921 ; GFX908-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6922 ; GFX908-NEXT:    s_movk_i32 s8, 0x7fff
6923 ; GFX908-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6924 ; GFX908-NEXT:    s_mov_b32 s9, 0x7060302
6925 ; GFX908-NEXT:  .LBB27_1: ; %atomicrmw.start
6926 ; GFX908-NEXT:    ; =>This Inner Loop Header: Depth=1
6927 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6928 ; GFX908-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6929 ; GFX908-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6930 ; GFX908-NEXT:    v_max_f32_e32 v4, v4, v2
6931 ; GFX908-NEXT:    v_max_f32_e32 v5, v5, v1
6932 ; GFX908-NEXT:    v_bfe_u32 v6, v4, 16, 1
6933 ; GFX908-NEXT:    v_bfe_u32 v8, v5, 16, 1
6934 ; GFX908-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6935 ; GFX908-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6936 ; GFX908-NEXT:    v_add3_u32 v6, v6, v4, s8
6937 ; GFX908-NEXT:    v_add3_u32 v8, v8, v5, s8
6938 ; GFX908-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6939 ; GFX908-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6940 ; GFX908-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6941 ; GFX908-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6942 ; GFX908-NEXT:    v_perm_b32 v4, v5, v4, s9
6943 ; GFX908-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
6944 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
6945 ; GFX908-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6946 ; GFX908-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6947 ; GFX908-NEXT:    v_mov_b32_e32 v3, v4
6948 ; GFX908-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6949 ; GFX908-NEXT:    s_cbranch_execnz .LBB27_1
6950 ; GFX908-NEXT:  ; %bb.2: ; %atomicrmw.end
6951 ; GFX908-NEXT:    s_or_b64 exec, exec, s[6:7]
6952 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
6954 ; GFX8-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6955 ; GFX8:       ; %bb.0:
6956 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6957 ; GFX8-NEXT:    s_mov_b32 m0, -1
6958 ; GFX8-NEXT:    ds_read_b32 v3, v0 offset:65532
6959 ; GFX8-NEXT:    s_mov_b64 s[6:7], 0
6960 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 16, v1
6961 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
6962 ; GFX8-NEXT:  .LBB27_1: ; %atomicrmw.start
6963 ; GFX8-NEXT:    ; =>This Inner Loop Header: Depth=1
6964 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6965 ; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 16, v3
6966 ; GFX8-NEXT:    v_and_b32_e32 v5, 0xffff0000, v3
6967 ; GFX8-NEXT:    v_max_f32_e32 v4, v4, v2
6968 ; GFX8-NEXT:    v_max_f32_e32 v5, v5, v1
6969 ; GFX8-NEXT:    v_bfe_u32 v6, v4, 16, 1
6970 ; GFX8-NEXT:    v_bfe_u32 v8, v5, 16, 1
6971 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, v6, v4
6972 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, v8, v5
6973 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0x7fff, v6
6974 ; GFX8-NEXT:    v_add_u32_e32 v8, vcc, 0x7fff, v8
6975 ; GFX8-NEXT:    v_or_b32_e32 v9, 0x400000, v5
6976 ; GFX8-NEXT:    v_cmp_u_f32_e32 vcc, v5, v5
6977 ; GFX8-NEXT:    v_or_b32_e32 v7, 0x400000, v4
6978 ; GFX8-NEXT:    v_cmp_u_f32_e64 s[4:5], v4, v4
6979 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v8, v9, vcc
6980 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, v6, v7, s[4:5]
6981 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v5
6982 ; GFX8-NEXT:    v_alignbit_b32 v4, v5, v4, 16
6983 ; GFX8-NEXT:    ds_cmpst_rtn_b32 v4, v0, v3, v4 offset:65532
6984 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
6985 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, v4, v3
6986 ; GFX8-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6987 ; GFX8-NEXT:    v_mov_b32_e32 v3, v4
6988 ; GFX8-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6989 ; GFX8-NEXT:    s_cbranch_execnz .LBB27_1
6990 ; GFX8-NEXT:  ; %bb.2: ; %atomicrmw.end
6991 ; GFX8-NEXT:    s_or_b64 exec, exec, s[6:7]
6992 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
6994 ; GFX7-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
6995 ; GFX7:       ; %bb.0:
6996 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6997 ; GFX7-NEXT:    s_mov_b32 m0, -1
6998 ; GFX7-NEXT:    ds_read_b32 v3, v0 offset:65532
6999 ; GFX7-NEXT:    v_mul_f32_e32 v2, 1.0, v2
7000 ; GFX7-NEXT:    v_mul_f32_e32 v1, 1.0, v1
7001 ; GFX7-NEXT:    s_mov_b64 s[4:5], 0
7002 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
7003 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7004 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v3
7005 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
7006 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
7007 ; GFX7-NEXT:  .LBB27_1: ; %atomicrmw.start
7008 ; GFX7-NEXT:    ; =>This Inner Loop Header: Depth=1
7009 ; GFX7-NEXT:    v_mul_f32_e32 v4, 1.0, v4
7010 ; GFX7-NEXT:    v_mul_f32_e32 v3, 1.0, v3
7011 ; GFX7-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
7012 ; GFX7-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
7013 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
7014 ; GFX7-NEXT:    v_max_f32_e32 v5, v5, v2
7015 ; GFX7-NEXT:    v_max_f32_e32 v6, v6, v1
7016 ; GFX7-NEXT:    v_alignbit_b32 v3, v4, v3, 16
7017 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
7018 ; GFX7-NEXT:    v_alignbit_b32 v4, v4, v6, 16
7019 ; GFX7-NEXT:    ds_cmpst_rtn_b32 v5, v0, v3, v4 offset:65532
7020 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7021 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v3
7022 ; GFX7-NEXT:    v_and_b32_e32 v4, 0xffff0000, v5
7023 ; GFX7-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
7024 ; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
7025 ; GFX7-NEXT:    s_andn2_b64 exec, exec, s[4:5]
7026 ; GFX7-NEXT:    s_cbranch_execnz .LBB27_1
7027 ; GFX7-NEXT:  ; %bb.2: ; %atomicrmw.end
7028 ; GFX7-NEXT:    s_or_b64 exec, exec, s[4:5]
7029 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
7031 ; GFX6-LABEL: local_atomic_fmax_noret_v2bf16__ofset:
7032 ; GFX6:       ; %bb.0:
7033 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7034 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, 0xfffc, v0
7035 ; GFX6-NEXT:    s_mov_b32 m0, -1
7036 ; GFX6-NEXT:    ds_read_b32 v3, v0
7037 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
7038 ; GFX6-NEXT:    v_mul_f32_e32 v1, 1.0, v1
7039 ; GFX6-NEXT:    s_mov_b64 s[4:5], 0
7040 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
7041 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7042 ; GFX6-NEXT:    v_and_b32_e32 v4, 0xffff0000, v3
7043 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
7044 ; GFX6-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
7045 ; GFX6-NEXT:  .LBB27_1: ; %atomicrmw.start
7046 ; GFX6-NEXT:    ; =>This Inner Loop Header: Depth=1
7047 ; GFX6-NEXT:    v_mul_f32_e32 v4, 1.0, v4
7048 ; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
7049 ; GFX6-NEXT:    v_and_b32_e32 v5, 0xffff0000, v4
7050 ; GFX6-NEXT:    v_and_b32_e32 v6, 0xffff0000, v3
7051 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v4
7052 ; GFX6-NEXT:    v_max_f32_e32 v5, v5, v2
7053 ; GFX6-NEXT:    v_max_f32_e32 v6, v6, v1
7054 ; GFX6-NEXT:    v_alignbit_b32 v3, v4, v3, 16
7055 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 16, v5
7056 ; GFX6-NEXT:    v_alignbit_b32 v4, v4, v6, 16
7057 ; GFX6-NEXT:    ds_cmpst_rtn_b32 v5, v0, v3, v4
7058 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7059 ; GFX6-NEXT:    v_cmp_eq_u32_e32 vcc, v5, v3
7060 ; GFX6-NEXT:    v_and_b32_e32 v4, 0xffff0000, v5
7061 ; GFX6-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
7062 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v5
7063 ; GFX6-NEXT:    s_andn2_b64 exec, exec, s[4:5]
7064 ; GFX6-NEXT:    s_cbranch_execnz .LBB27_1
7065 ; GFX6-NEXT:  ; %bb.2: ; %atomicrmw.end
7066 ; GFX6-NEXT:    s_or_b64 exec, exec, s[4:5]
7067 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
7068   %gep = getelementptr <2 x bfloat>, ptr addrspace(3) %ptr, i32 16383
7069   %result = atomicrmw fmax ptr addrspace(3) %gep, <2 x bfloat> %val seq_cst
7070   ret void
7073 ; --------------------------------------------------------------------
7074 ; misc
7075 ; --------------------------------------------------------------------
7077 define float @local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode(ptr addrspace(3) %ptr) {
7078 ; GFX12-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7079 ; GFX12:       ; %bb.0:
7080 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
7081 ; GFX12-NEXT:    s_wait_expcnt 0x0
7082 ; GFX12-NEXT:    s_wait_samplecnt 0x0
7083 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
7084 ; GFX12-NEXT:    s_wait_kmcnt 0x0
7085 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
7086 ; GFX12-NEXT:    s_wait_storecnt 0x0
7087 ; GFX12-NEXT:    ds_max_num_rtn_f32 v0, v0, v1
7088 ; GFX12-NEXT:    s_wait_dscnt 0x0
7089 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
7090 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
7092 ; GFX940-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7093 ; GFX940:       ; %bb.0:
7094 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7095 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
7096 ; GFX940-NEXT:    ds_max_rtn_f32 v0, v0, v1
7097 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
7098 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
7100 ; GFX11-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7101 ; GFX11:       ; %bb.0:
7102 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7103 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
7104 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
7105 ; GFX11-NEXT:    ds_max_rtn_f32 v0, v0, v1
7106 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
7107 ; GFX11-NEXT:    buffer_gl0_inv
7108 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
7110 ; GFX10-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7111 ; GFX10:       ; %bb.0:
7112 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7113 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
7114 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
7115 ; GFX10-NEXT:    ds_max_rtn_f32 v0, v0, v1
7116 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
7117 ; GFX10-NEXT:    buffer_gl0_inv
7118 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
7120 ; GFX90A-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7121 ; GFX90A:       ; %bb.0:
7122 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7123 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
7124 ; GFX90A-NEXT:    ds_max_rtn_f32 v0, v0, v1
7125 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
7126 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
7128 ; GFX908-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7129 ; GFX908:       ; %bb.0:
7130 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7131 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
7132 ; GFX908-NEXT:    ds_max_rtn_f32 v0, v0, v1
7133 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
7134 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
7136 ; GFX8-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7137 ; GFX8:       ; %bb.0:
7138 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7139 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
7140 ; GFX8-NEXT:    s_mov_b32 m0, -1
7141 ; GFX8-NEXT:    ds_max_rtn_f32 v0, v0, v1
7142 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
7143 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
7145 ; GFX7-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7146 ; GFX7:       ; %bb.0:
7147 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7148 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
7149 ; GFX7-NEXT:    s_mov_b32 m0, -1
7150 ; GFX7-NEXT:    ds_max_rtn_f32 v0, v0, v1
7151 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7152 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
7154 ; GFX6-LABEL: local_atomic_fmax_ret_f32__amdgpu_ignore_denormal_mode:
7155 ; GFX6:       ; %bb.0:
7156 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7157 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
7158 ; GFX6-NEXT:    s_mov_b32 m0, -1
7159 ; GFX6-NEXT:    ds_max_rtn_f32 v0, v0, v1
7160 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7161 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
7162   %result = atomicrmw fmax ptr addrspace(3) %ptr, float 4.0 seq_cst, !amdgpu.ignore.denormal.mode !0
7163   ret float %result
7166 define void @local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode(ptr addrspace(3) %ptr) {
7167 ; GFX12-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7168 ; GFX12:       ; %bb.0:
7169 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
7170 ; GFX12-NEXT:    s_wait_expcnt 0x0
7171 ; GFX12-NEXT:    s_wait_samplecnt 0x0
7172 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
7173 ; GFX12-NEXT:    s_wait_kmcnt 0x0
7174 ; GFX12-NEXT:    v_mov_b32_e32 v1, 4.0
7175 ; GFX12-NEXT:    s_wait_storecnt 0x0
7176 ; GFX12-NEXT:    ds_max_num_f32 v0, v1
7177 ; GFX12-NEXT:    s_wait_dscnt 0x0
7178 ; GFX12-NEXT:    global_inv scope:SCOPE_SE
7179 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
7181 ; GFX940-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7182 ; GFX940:       ; %bb.0:
7183 ; GFX940-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7184 ; GFX940-NEXT:    v_mov_b32_e32 v1, 4.0
7185 ; GFX940-NEXT:    ds_max_f32 v0, v1
7186 ; GFX940-NEXT:    s_waitcnt lgkmcnt(0)
7187 ; GFX940-NEXT:    s_setpc_b64 s[30:31]
7189 ; GFX11-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7190 ; GFX11:       ; %bb.0:
7191 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7192 ; GFX11-NEXT:    v_mov_b32_e32 v1, 4.0
7193 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
7194 ; GFX11-NEXT:    ds_max_f32 v0, v1
7195 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
7196 ; GFX11-NEXT:    buffer_gl0_inv
7197 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
7199 ; GFX10-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7200 ; GFX10:       ; %bb.0:
7201 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7202 ; GFX10-NEXT:    v_mov_b32_e32 v1, 4.0
7203 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
7204 ; GFX10-NEXT:    ds_max_f32 v0, v1
7205 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
7206 ; GFX10-NEXT:    buffer_gl0_inv
7207 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
7209 ; GFX90A-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7210 ; GFX90A:       ; %bb.0:
7211 ; GFX90A-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7212 ; GFX90A-NEXT:    v_mov_b32_e32 v1, 4.0
7213 ; GFX90A-NEXT:    ds_max_f32 v0, v1
7214 ; GFX90A-NEXT:    s_waitcnt lgkmcnt(0)
7215 ; GFX90A-NEXT:    s_setpc_b64 s[30:31]
7217 ; GFX908-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7218 ; GFX908:       ; %bb.0:
7219 ; GFX908-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7220 ; GFX908-NEXT:    v_mov_b32_e32 v1, 4.0
7221 ; GFX908-NEXT:    ds_max_f32 v0, v1
7222 ; GFX908-NEXT:    s_waitcnt lgkmcnt(0)
7223 ; GFX908-NEXT:    s_setpc_b64 s[30:31]
7225 ; GFX8-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7226 ; GFX8:       ; %bb.0:
7227 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7228 ; GFX8-NEXT:    v_mov_b32_e32 v1, 4.0
7229 ; GFX8-NEXT:    s_mov_b32 m0, -1
7230 ; GFX8-NEXT:    ds_max_f32 v0, v1
7231 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
7232 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
7234 ; GFX7-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7235 ; GFX7:       ; %bb.0:
7236 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7237 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4.0
7238 ; GFX7-NEXT:    s_mov_b32 m0, -1
7239 ; GFX7-NEXT:    ds_max_f32 v0, v1
7240 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7241 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
7243 ; GFX6-LABEL: local_atomic_fmax_noret_f32__amdgpu_ignore_denormal_mode:
7244 ; GFX6:       ; %bb.0:
7245 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7246 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4.0
7247 ; GFX6-NEXT:    s_mov_b32 m0, -1
7248 ; GFX6-NEXT:    ds_max_f32 v0, v1
7249 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7250 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
7251   %result = atomicrmw fmax ptr addrspace(3) %ptr, float 4.0 seq_cst, !amdgpu.ignore.denormal.mode !0
7252   ret void
7255 !0 = !{}