[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / global-saddr-atomics-min-max-system.ll
blob6b4a6381d954cb4742471937b3aec3d72c888b1c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s
3 ; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX10 %s
4 ; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX11 %s
6 ; Test using saddr addressing mode of global_* flat atomic instructions.
8 ; --------------------------------------------------------------------------------
9 ; atomicrmw max
10 ; --------------------------------------------------------------------------------
12 define amdgpu_ps float @global_max_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
13 ; GFX9-LABEL: global_max_saddr_i32_rtn:
14 ; GFX9:       ; %bb.0:
15 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
16 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]
17 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
18 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
19 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
20 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
21 ; GFX9-NEXT:  .LBB0_1: ; %atomicrmw.start
22 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
23 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
24 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
25 ; GFX9-NEXT:    v_max_i32_e32 v4, v5, v1
26 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
27 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
28 ; GFX9-NEXT:    buffer_wbinvl1
29 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
30 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
31 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
32 ; GFX9-NEXT:    s_cbranch_execnz .LBB0_1
33 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
34 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
35 ; GFX9-NEXT:    ; return to shader part epilog
37 ; GFX10-LABEL: global_max_saddr_i32_rtn:
38 ; GFX10:       ; %bb.0:
39 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
40 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3]
41 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
42 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
43 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
44 ; GFX10-NEXT:  .LBB0_1: ; %atomicrmw.start
45 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
46 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
47 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
48 ; GFX10-NEXT:    v_max_i32_e32 v4, v5, v1
49 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
50 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
51 ; GFX10-NEXT:    buffer_gl1_inv
52 ; GFX10-NEXT:    buffer_gl0_inv
53 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
54 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
55 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
56 ; GFX10-NEXT:    s_cbranch_execnz .LBB0_1
57 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
58 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
59 ; GFX10-NEXT:    ; return to shader part epilog
61 ; GFX11-LABEL: global_max_saddr_i32_rtn:
62 ; GFX11:       ; %bb.0:
63 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
64 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]
65 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
66 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
67 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
68 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
69 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
70 ; GFX11-NEXT:  .LBB0_1: ; %atomicrmw.start
71 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
72 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
73 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
74 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
75 ; GFX11-NEXT:    v_max_i32_e32 v4, v5, v1
76 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
77 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
78 ; GFX11-NEXT:    buffer_gl1_inv
79 ; GFX11-NEXT:    buffer_gl0_inv
80 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
81 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
82 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
83 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
84 ; GFX11-NEXT:    s_cbranch_execnz .LBB0_1
85 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
86 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
87 ; GFX11-NEXT:    ; return to shader part epilog
88   %zext.offset = zext i32 %voffset to i64
89   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
90   %rtn = atomicrmw max ptr addrspace(1) %gep0, i32 %data seq_cst
91   %cast.rtn = bitcast i32 %rtn to float
92   ret float %cast.rtn
95 define amdgpu_ps float @global_max_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
96 ; GFX9-LABEL: global_max_saddr_i32_rtn_neg128:
97 ; GFX9:       ; %bb.0:
98 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
99 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
100 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
101 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
102 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
103 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
104 ; GFX9-NEXT:  .LBB1_1: ; %atomicrmw.start
105 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
106 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
107 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
108 ; GFX9-NEXT:    v_max_i32_e32 v4, v5, v1
109 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
110 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
111 ; GFX9-NEXT:    buffer_wbinvl1
112 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
113 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
114 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
115 ; GFX9-NEXT:    s_cbranch_execnz .LBB1_1
116 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
117 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
118 ; GFX9-NEXT:    ; return to shader part epilog
120 ; GFX10-LABEL: global_max_saddr_i32_rtn_neg128:
121 ; GFX10:       ; %bb.0:
122 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
123 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
124 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
125 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
126 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
127 ; GFX10-NEXT:  .LBB1_1: ; %atomicrmw.start
128 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
129 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
130 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
131 ; GFX10-NEXT:    v_max_i32_e32 v4, v5, v1
132 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
133 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
134 ; GFX10-NEXT:    buffer_gl1_inv
135 ; GFX10-NEXT:    buffer_gl0_inv
136 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
137 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
138 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
139 ; GFX10-NEXT:    s_cbranch_execnz .LBB1_1
140 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
141 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
142 ; GFX10-NEXT:    ; return to shader part epilog
144 ; GFX11-LABEL: global_max_saddr_i32_rtn_neg128:
145 ; GFX11:       ; %bb.0:
146 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
147 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3] offset:-128
148 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
149 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
150 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
151 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
152 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
153 ; GFX11-NEXT:  .LBB1_1: ; %atomicrmw.start
154 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
155 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
156 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
157 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
158 ; GFX11-NEXT:    v_max_i32_e32 v4, v5, v1
159 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
160 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
161 ; GFX11-NEXT:    buffer_gl1_inv
162 ; GFX11-NEXT:    buffer_gl0_inv
163 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
164 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
165 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
166 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
167 ; GFX11-NEXT:    s_cbranch_execnz .LBB1_1
168 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
169 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
170 ; GFX11-NEXT:    ; return to shader part epilog
171   %zext.offset = zext i32 %voffset to i64
172   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
173   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
174   %rtn = atomicrmw max ptr addrspace(1) %gep1, i32 %data seq_cst
175   %cast.rtn = bitcast i32 %rtn to float
176   ret float %cast.rtn
179 define amdgpu_ps void @global_max_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
180 ; GFX9-LABEL: global_max_saddr_i32_nortn:
181 ; GFX9:       ; %bb.0:
182 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3]
183 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
184 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
185 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
186 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
187 ; GFX9-NEXT:  .LBB2_1: ; %atomicrmw.start
188 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
189 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
190 ; GFX9-NEXT:    v_max_i32_e32 v4, v5, v1
191 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
192 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
193 ; GFX9-NEXT:    buffer_wbinvl1
194 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
195 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
196 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
197 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
198 ; GFX9-NEXT:    s_cbranch_execnz .LBB2_1
199 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
200 ; GFX9-NEXT:    s_endpgm
202 ; GFX10-LABEL: global_max_saddr_i32_nortn:
203 ; GFX10:       ; %bb.0:
204 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3]
205 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
206 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
207 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
208 ; GFX10-NEXT:  .LBB2_1: ; %atomicrmw.start
209 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
210 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
211 ; GFX10-NEXT:    v_max_i32_e32 v4, v5, v1
212 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
213 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
214 ; GFX10-NEXT:    buffer_gl1_inv
215 ; GFX10-NEXT:    buffer_gl0_inv
216 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
217 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
218 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
219 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
220 ; GFX10-NEXT:    s_cbranch_execnz .LBB2_1
221 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
222 ; GFX10-NEXT:    s_endpgm
224 ; GFX11-LABEL: global_max_saddr_i32_nortn:
225 ; GFX11:       ; %bb.0:
226 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3]
227 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
228 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
229 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
230 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
231 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
232 ; GFX11-NEXT:  .LBB2_1: ; %atomicrmw.start
233 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
234 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
235 ; GFX11-NEXT:    v_max_i32_e32 v4, v5, v1
236 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
237 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
238 ; GFX11-NEXT:    buffer_gl1_inv
239 ; GFX11-NEXT:    buffer_gl0_inv
240 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
241 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
242 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
243 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
244 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
245 ; GFX11-NEXT:    s_cbranch_execnz .LBB2_1
246 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
247 ; GFX11-NEXT:    s_endpgm
248   %zext.offset = zext i32 %voffset to i64
249   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
250   %unused = atomicrmw max ptr addrspace(1) %gep0, i32 %data seq_cst
251   ret void
254 define amdgpu_ps void @global_max_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
255 ; GFX9-LABEL: global_max_saddr_i32_nortn_neg128:
256 ; GFX9:       ; %bb.0:
257 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
258 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
259 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
260 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
261 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
262 ; GFX9-NEXT:  .LBB3_1: ; %atomicrmw.start
263 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
264 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
265 ; GFX9-NEXT:    v_max_i32_e32 v4, v5, v1
266 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
267 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
268 ; GFX9-NEXT:    buffer_wbinvl1
269 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
270 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
271 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
272 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
273 ; GFX9-NEXT:    s_cbranch_execnz .LBB3_1
274 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
275 ; GFX9-NEXT:    s_endpgm
277 ; GFX10-LABEL: global_max_saddr_i32_nortn_neg128:
278 ; GFX10:       ; %bb.0:
279 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
280 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
281 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
282 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
283 ; GFX10-NEXT:  .LBB3_1: ; %atomicrmw.start
284 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
285 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
286 ; GFX10-NEXT:    v_max_i32_e32 v4, v5, v1
287 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
288 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
289 ; GFX10-NEXT:    buffer_gl1_inv
290 ; GFX10-NEXT:    buffer_gl0_inv
291 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
292 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
293 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
294 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
295 ; GFX10-NEXT:    s_cbranch_execnz .LBB3_1
296 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
297 ; GFX10-NEXT:    s_endpgm
299 ; GFX11-LABEL: global_max_saddr_i32_nortn_neg128:
300 ; GFX11:       ; %bb.0:
301 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3] offset:-128
302 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
303 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
304 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
305 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
306 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
307 ; GFX11-NEXT:  .LBB3_1: ; %atomicrmw.start
308 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
309 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
310 ; GFX11-NEXT:    v_max_i32_e32 v4, v5, v1
311 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
312 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
313 ; GFX11-NEXT:    buffer_gl1_inv
314 ; GFX11-NEXT:    buffer_gl0_inv
315 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
316 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
317 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
318 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
319 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
320 ; GFX11-NEXT:    s_cbranch_execnz .LBB3_1
321 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
322 ; GFX11-NEXT:    s_endpgm
323   %zext.offset = zext i32 %voffset to i64
324   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
325   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
326   %unused = atomicrmw max ptr addrspace(1) %gep1, i32 %data seq_cst
327   ret void
330 define amdgpu_ps <2 x float> @global_max_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
331 ; GFX9-LABEL: global_max_saddr_i64_rtn:
332 ; GFX9:       ; %bb.0:
333 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
334 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
335 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
336 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
337 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
338 ; GFX9-NEXT:  .LBB4_1: ; %atomicrmw.start
339 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
340 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
341 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
342 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
343 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
344 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
345 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
346 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
347 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
348 ; GFX9-NEXT:    buffer_wbinvl1
349 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
350 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
351 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
352 ; GFX9-NEXT:    s_cbranch_execnz .LBB4_1
353 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
354 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
355 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
356 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
357 ; GFX9-NEXT:    ; return to shader part epilog
359 ; GFX10-LABEL: global_max_saddr_i64_rtn:
360 ; GFX10:       ; %bb.0:
361 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
362 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
363 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
364 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
365 ; GFX10-NEXT:  .LBB4_1: ; %atomicrmw.start
366 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
367 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
368 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
369 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
370 ; GFX10-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
371 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
372 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
373 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
374 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
375 ; GFX10-NEXT:    buffer_gl1_inv
376 ; GFX10-NEXT:    buffer_gl0_inv
377 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
378 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
379 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
380 ; GFX10-NEXT:    s_cbranch_execnz .LBB4_1
381 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
382 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
383 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
384 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
385 ; GFX10-NEXT:    ; return to shader part epilog
387 ; GFX11-LABEL: global_max_saddr_i64_rtn:
388 ; GFX11:       ; %bb.0:
389 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3]
390 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
391 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
392 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
393 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
394 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
395 ; GFX11-NEXT:  .LBB4_1: ; %atomicrmw.start
396 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
397 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
398 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
399 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
400 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
401 ; GFX11-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
402 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
403 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
404 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off glc
405 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
406 ; GFX11-NEXT:    buffer_gl1_inv
407 ; GFX11-NEXT:    buffer_gl0_inv
408 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
409 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
410 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
411 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
412 ; GFX11-NEXT:    s_cbranch_execnz .LBB4_1
413 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
414 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
415 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
416 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
417 ; GFX11-NEXT:    ; return to shader part epilog
418   %zext.offset = zext i32 %voffset to i64
419   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
420   %rtn = atomicrmw max ptr addrspace(1) %gep0, i64 %data seq_cst
421   %cast.rtn = bitcast i64 %rtn to <2 x float>
422   ret <2 x float> %cast.rtn
425 define amdgpu_ps <2 x float> @global_max_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
426 ; GFX9-LABEL: global_max_saddr_i64_rtn_neg128:
427 ; GFX9:       ; %bb.0:
428 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
429 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
430 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
431 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
432 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
433 ; GFX9-NEXT:  .LBB5_1: ; %atomicrmw.start
434 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
435 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
436 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
437 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
438 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
439 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
440 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
441 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
442 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
443 ; GFX9-NEXT:    buffer_wbinvl1
444 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
445 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
446 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
447 ; GFX9-NEXT:    s_cbranch_execnz .LBB5_1
448 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
449 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
450 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
451 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
452 ; GFX9-NEXT:    ; return to shader part epilog
454 ; GFX10-LABEL: global_max_saddr_i64_rtn_neg128:
455 ; GFX10:       ; %bb.0:
456 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
457 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
458 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
459 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
460 ; GFX10-NEXT:  .LBB5_1: ; %atomicrmw.start
461 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
462 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
463 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
464 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
465 ; GFX10-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
466 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
467 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
468 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
469 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
470 ; GFX10-NEXT:    buffer_gl1_inv
471 ; GFX10-NEXT:    buffer_gl0_inv
472 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
473 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
474 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
475 ; GFX10-NEXT:    s_cbranch_execnz .LBB5_1
476 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
477 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
478 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
479 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
480 ; GFX10-NEXT:    ; return to shader part epilog
482 ; GFX11-LABEL: global_max_saddr_i64_rtn_neg128:
483 ; GFX11:       ; %bb.0:
484 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3] offset:-128
485 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
486 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
487 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
488 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
489 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
490 ; GFX11-NEXT:  .LBB5_1: ; %atomicrmw.start
491 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
492 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
493 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
494 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
495 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
496 ; GFX11-NEXT:    v_cmp_gt_i64_e32 vcc, v[9:10], v[1:2]
497 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
498 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
499 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off offset:-128 glc
500 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
501 ; GFX11-NEXT:    buffer_gl1_inv
502 ; GFX11-NEXT:    buffer_gl0_inv
503 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
504 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
505 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
506 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
507 ; GFX11-NEXT:    s_cbranch_execnz .LBB5_1
508 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
509 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
510 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
511 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
512 ; GFX11-NEXT:    ; return to shader part epilog
513   %zext.offset = zext i32 %voffset to i64
514   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
515   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
516   %rtn = atomicrmw max ptr addrspace(1) %gep1, i64 %data seq_cst
517   %cast.rtn = bitcast i64 %rtn to <2 x float>
518   ret <2 x float> %cast.rtn
521 define amdgpu_ps void @global_max_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
522 ; GFX9-LABEL: global_max_saddr_i64_nortn:
523 ; GFX9:       ; %bb.0:
524 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
525 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
526 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
527 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
528 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
529 ; GFX9-NEXT:  .LBB6_1: ; %atomicrmw.start
530 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
531 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
532 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
533 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
534 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
535 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
536 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
537 ; GFX9-NEXT:    buffer_wbinvl1
538 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
539 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
540 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
541 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
542 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
543 ; GFX9-NEXT:    s_cbranch_execnz .LBB6_1
544 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
545 ; GFX9-NEXT:    s_endpgm
547 ; GFX10-LABEL: global_max_saddr_i64_nortn:
548 ; GFX10:       ; %bb.0:
549 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
550 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
551 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
552 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
553 ; GFX10-NEXT:  .LBB6_1: ; %atomicrmw.start
554 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
555 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
556 ; GFX10-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
557 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
558 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
559 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
560 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
561 ; GFX10-NEXT:    buffer_gl1_inv
562 ; GFX10-NEXT:    buffer_gl0_inv
563 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
564 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
565 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
566 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
567 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
568 ; GFX10-NEXT:    s_cbranch_execnz .LBB6_1
569 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
570 ; GFX10-NEXT:    s_endpgm
572 ; GFX11-LABEL: global_max_saddr_i64_nortn:
573 ; GFX11:       ; %bb.0:
574 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3]
575 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
576 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
577 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
578 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
579 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
580 ; GFX11-NEXT:  .LBB6_1: ; %atomicrmw.start
581 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
582 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
583 ; GFX11-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
584 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
585 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
586 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off glc
587 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
588 ; GFX11-NEXT:    buffer_gl1_inv
589 ; GFX11-NEXT:    buffer_gl0_inv
590 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
591 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
592 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
593 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
594 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
595 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
596 ; GFX11-NEXT:    s_cbranch_execnz .LBB6_1
597 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
598 ; GFX11-NEXT:    s_endpgm
599   %zext.offset = zext i32 %voffset to i64
600   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
601   %unused = atomicrmw max ptr addrspace(1) %gep0, i64 %data seq_cst
602   ret void
605 define amdgpu_ps void @global_max_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
606 ; GFX9-LABEL: global_max_saddr_i64_nortn_neg128:
607 ; GFX9:       ; %bb.0:
608 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
609 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
610 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
611 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
612 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
613 ; GFX9-NEXT:  .LBB7_1: ; %atomicrmw.start
614 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
615 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
616 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
617 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
618 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
619 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
620 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
621 ; GFX9-NEXT:    buffer_wbinvl1
622 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
623 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
624 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
625 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
626 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
627 ; GFX9-NEXT:    s_cbranch_execnz .LBB7_1
628 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
629 ; GFX9-NEXT:    s_endpgm
631 ; GFX10-LABEL: global_max_saddr_i64_nortn_neg128:
632 ; GFX10:       ; %bb.0:
633 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
634 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
635 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
636 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
637 ; GFX10-NEXT:  .LBB7_1: ; %atomicrmw.start
638 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
639 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
640 ; GFX10-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
641 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
642 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
643 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
644 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
645 ; GFX10-NEXT:    buffer_gl1_inv
646 ; GFX10-NEXT:    buffer_gl0_inv
647 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
648 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
649 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
650 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
651 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
652 ; GFX10-NEXT:    s_cbranch_execnz .LBB7_1
653 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
654 ; GFX10-NEXT:    s_endpgm
656 ; GFX11-LABEL: global_max_saddr_i64_nortn_neg128:
657 ; GFX11:       ; %bb.0:
658 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3] offset:-128
659 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
660 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
661 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
662 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
663 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
664 ; GFX11-NEXT:  .LBB7_1: ; %atomicrmw.start
665 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
666 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
667 ; GFX11-NEXT:    v_cmp_gt_i64_e32 vcc, v[5:6], v[1:2]
668 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
669 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
670 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off offset:-128 glc
671 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
672 ; GFX11-NEXT:    buffer_gl1_inv
673 ; GFX11-NEXT:    buffer_gl0_inv
674 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
675 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
676 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
677 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
678 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
679 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
680 ; GFX11-NEXT:    s_cbranch_execnz .LBB7_1
681 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
682 ; GFX11-NEXT:    s_endpgm
683   %zext.offset = zext i32 %voffset to i64
684   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
685   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
686   %unused = atomicrmw max ptr addrspace(1) %gep1, i64 %data seq_cst
687   ret void
690 ; --------------------------------------------------------------------------------
691 ; atomicrmw min
692 ; --------------------------------------------------------------------------------
694 define amdgpu_ps float @global_min_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
695 ; GFX9-LABEL: global_min_saddr_i32_rtn:
696 ; GFX9:       ; %bb.0:
697 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
698 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]
699 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
700 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
701 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
702 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
703 ; GFX9-NEXT:  .LBB8_1: ; %atomicrmw.start
704 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
705 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
706 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
707 ; GFX9-NEXT:    v_min_i32_e32 v4, v5, v1
708 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
709 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
710 ; GFX9-NEXT:    buffer_wbinvl1
711 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
712 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
713 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
714 ; GFX9-NEXT:    s_cbranch_execnz .LBB8_1
715 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
716 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
717 ; GFX9-NEXT:    ; return to shader part epilog
719 ; GFX10-LABEL: global_min_saddr_i32_rtn:
720 ; GFX10:       ; %bb.0:
721 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
722 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3]
723 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
724 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
725 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
726 ; GFX10-NEXT:  .LBB8_1: ; %atomicrmw.start
727 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
728 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
729 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
730 ; GFX10-NEXT:    v_min_i32_e32 v4, v5, v1
731 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
732 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
733 ; GFX10-NEXT:    buffer_gl1_inv
734 ; GFX10-NEXT:    buffer_gl0_inv
735 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
736 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
737 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
738 ; GFX10-NEXT:    s_cbranch_execnz .LBB8_1
739 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
740 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
741 ; GFX10-NEXT:    ; return to shader part epilog
743 ; GFX11-LABEL: global_min_saddr_i32_rtn:
744 ; GFX11:       ; %bb.0:
745 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
746 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]
747 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
748 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
749 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
750 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
751 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
752 ; GFX11-NEXT:  .LBB8_1: ; %atomicrmw.start
753 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
754 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
755 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
756 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
757 ; GFX11-NEXT:    v_min_i32_e32 v4, v5, v1
758 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
759 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
760 ; GFX11-NEXT:    buffer_gl1_inv
761 ; GFX11-NEXT:    buffer_gl0_inv
762 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
763 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
764 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
765 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
766 ; GFX11-NEXT:    s_cbranch_execnz .LBB8_1
767 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
768 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
769 ; GFX11-NEXT:    ; return to shader part epilog
770   %zext.offset = zext i32 %voffset to i64
771   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
772   %rtn = atomicrmw min ptr addrspace(1) %gep0, i32 %data seq_cst
773   %cast.rtn = bitcast i32 %rtn to float
774   ret float %cast.rtn
777 define amdgpu_ps float @global_min_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
778 ; GFX9-LABEL: global_min_saddr_i32_rtn_neg128:
779 ; GFX9:       ; %bb.0:
780 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
781 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
782 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
783 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
784 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
785 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
786 ; GFX9-NEXT:  .LBB9_1: ; %atomicrmw.start
787 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
788 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
789 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
790 ; GFX9-NEXT:    v_min_i32_e32 v4, v5, v1
791 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
792 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
793 ; GFX9-NEXT:    buffer_wbinvl1
794 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
795 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
796 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
797 ; GFX9-NEXT:    s_cbranch_execnz .LBB9_1
798 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
799 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
800 ; GFX9-NEXT:    ; return to shader part epilog
802 ; GFX10-LABEL: global_min_saddr_i32_rtn_neg128:
803 ; GFX10:       ; %bb.0:
804 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
805 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
806 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
807 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
808 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
809 ; GFX10-NEXT:  .LBB9_1: ; %atomicrmw.start
810 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
811 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
812 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
813 ; GFX10-NEXT:    v_min_i32_e32 v4, v5, v1
814 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
815 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
816 ; GFX10-NEXT:    buffer_gl1_inv
817 ; GFX10-NEXT:    buffer_gl0_inv
818 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
819 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
820 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
821 ; GFX10-NEXT:    s_cbranch_execnz .LBB9_1
822 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
823 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
824 ; GFX10-NEXT:    ; return to shader part epilog
826 ; GFX11-LABEL: global_min_saddr_i32_rtn_neg128:
827 ; GFX11:       ; %bb.0:
828 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
829 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3] offset:-128
830 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
831 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
832 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
833 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
834 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
835 ; GFX11-NEXT:  .LBB9_1: ; %atomicrmw.start
836 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
837 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
838 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
839 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
840 ; GFX11-NEXT:    v_min_i32_e32 v4, v5, v1
841 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
842 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
843 ; GFX11-NEXT:    buffer_gl1_inv
844 ; GFX11-NEXT:    buffer_gl0_inv
845 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
846 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
847 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
848 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
849 ; GFX11-NEXT:    s_cbranch_execnz .LBB9_1
850 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
851 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
852 ; GFX11-NEXT:    ; return to shader part epilog
853   %zext.offset = zext i32 %voffset to i64
854   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
855   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
856   %rtn = atomicrmw min ptr addrspace(1) %gep1, i32 %data seq_cst
857   %cast.rtn = bitcast i32 %rtn to float
858   ret float %cast.rtn
861 define amdgpu_ps void @global_min_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
862 ; GFX9-LABEL: global_min_saddr_i32_nortn:
863 ; GFX9:       ; %bb.0:
864 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3]
865 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
866 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
867 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
868 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
869 ; GFX9-NEXT:  .LBB10_1: ; %atomicrmw.start
870 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
871 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
872 ; GFX9-NEXT:    v_min_i32_e32 v4, v5, v1
873 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
874 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
875 ; GFX9-NEXT:    buffer_wbinvl1
876 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
877 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
878 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
879 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
880 ; GFX9-NEXT:    s_cbranch_execnz .LBB10_1
881 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
882 ; GFX9-NEXT:    s_endpgm
884 ; GFX10-LABEL: global_min_saddr_i32_nortn:
885 ; GFX10:       ; %bb.0:
886 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3]
887 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
888 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
889 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
890 ; GFX10-NEXT:  .LBB10_1: ; %atomicrmw.start
891 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
892 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
893 ; GFX10-NEXT:    v_min_i32_e32 v4, v5, v1
894 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
895 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
896 ; GFX10-NEXT:    buffer_gl1_inv
897 ; GFX10-NEXT:    buffer_gl0_inv
898 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
899 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
900 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
901 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
902 ; GFX10-NEXT:    s_cbranch_execnz .LBB10_1
903 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
904 ; GFX10-NEXT:    s_endpgm
906 ; GFX11-LABEL: global_min_saddr_i32_nortn:
907 ; GFX11:       ; %bb.0:
908 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3]
909 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
910 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
911 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
912 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
913 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
914 ; GFX11-NEXT:  .LBB10_1: ; %atomicrmw.start
915 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
916 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
917 ; GFX11-NEXT:    v_min_i32_e32 v4, v5, v1
918 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
919 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
920 ; GFX11-NEXT:    buffer_gl1_inv
921 ; GFX11-NEXT:    buffer_gl0_inv
922 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
923 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
924 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
925 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
926 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
927 ; GFX11-NEXT:    s_cbranch_execnz .LBB10_1
928 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
929 ; GFX11-NEXT:    s_endpgm
930   %zext.offset = zext i32 %voffset to i64
931   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
932   %unused = atomicrmw min ptr addrspace(1) %gep0, i32 %data seq_cst
933   ret void
936 define amdgpu_ps void @global_min_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
937 ; GFX9-LABEL: global_min_saddr_i32_nortn_neg128:
938 ; GFX9:       ; %bb.0:
939 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
940 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
941 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
942 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
943 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
944 ; GFX9-NEXT:  .LBB11_1: ; %atomicrmw.start
945 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
946 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
947 ; GFX9-NEXT:    v_min_i32_e32 v4, v5, v1
948 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
949 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
950 ; GFX9-NEXT:    buffer_wbinvl1
951 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
952 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
953 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
954 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
955 ; GFX9-NEXT:    s_cbranch_execnz .LBB11_1
956 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
957 ; GFX9-NEXT:    s_endpgm
959 ; GFX10-LABEL: global_min_saddr_i32_nortn_neg128:
960 ; GFX10:       ; %bb.0:
961 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
962 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
963 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
964 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
965 ; GFX10-NEXT:  .LBB11_1: ; %atomicrmw.start
966 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
967 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
968 ; GFX10-NEXT:    v_min_i32_e32 v4, v5, v1
969 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
970 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
971 ; GFX10-NEXT:    buffer_gl1_inv
972 ; GFX10-NEXT:    buffer_gl0_inv
973 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
974 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
975 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
976 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
977 ; GFX10-NEXT:    s_cbranch_execnz .LBB11_1
978 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
979 ; GFX10-NEXT:    s_endpgm
981 ; GFX11-LABEL: global_min_saddr_i32_nortn_neg128:
982 ; GFX11:       ; %bb.0:
983 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3] offset:-128
984 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
985 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
986 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
987 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
988 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
989 ; GFX11-NEXT:  .LBB11_1: ; %atomicrmw.start
990 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
991 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
992 ; GFX11-NEXT:    v_min_i32_e32 v4, v5, v1
993 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
994 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
995 ; GFX11-NEXT:    buffer_gl1_inv
996 ; GFX11-NEXT:    buffer_gl0_inv
997 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
998 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
999 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1000 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1001 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1002 ; GFX11-NEXT:    s_cbranch_execnz .LBB11_1
1003 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1004 ; GFX11-NEXT:    s_endpgm
1005   %zext.offset = zext i32 %voffset to i64
1006   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1007   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1008   %unused = atomicrmw min ptr addrspace(1) %gep1, i32 %data seq_cst
1009   ret void
1012 define amdgpu_ps <2 x float> @global_min_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1013 ; GFX9-LABEL: global_min_saddr_i64_rtn:
1014 ; GFX9:       ; %bb.0:
1015 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
1016 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
1017 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
1018 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
1019 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1020 ; GFX9-NEXT:  .LBB12_1: ; %atomicrmw.start
1021 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1022 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1023 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
1024 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
1025 ; GFX9-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1026 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1027 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1028 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
1029 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1030 ; GFX9-NEXT:    buffer_wbinvl1
1031 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1032 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1033 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1034 ; GFX9-NEXT:    s_cbranch_execnz .LBB12_1
1035 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1036 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1037 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1038 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1039 ; GFX9-NEXT:    ; return to shader part epilog
1041 ; GFX10-LABEL: global_min_saddr_i64_rtn:
1042 ; GFX10:       ; %bb.0:
1043 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
1044 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1045 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
1046 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1047 ; GFX10-NEXT:  .LBB12_1: ; %atomicrmw.start
1048 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1049 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1050 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
1051 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
1052 ; GFX10-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1053 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1054 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1055 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
1056 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1057 ; GFX10-NEXT:    buffer_gl1_inv
1058 ; GFX10-NEXT:    buffer_gl0_inv
1059 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1060 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1061 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1062 ; GFX10-NEXT:    s_cbranch_execnz .LBB12_1
1063 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1064 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1065 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1066 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
1067 ; GFX10-NEXT:    ; return to shader part epilog
1069 ; GFX11-LABEL: global_min_saddr_i64_rtn:
1070 ; GFX11:       ; %bb.0:
1071 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3]
1072 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1073 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1074 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
1075 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1076 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1077 ; GFX11-NEXT:  .LBB12_1: ; %atomicrmw.start
1078 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1079 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1080 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
1081 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
1082 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1083 ; GFX11-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1084 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1085 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1086 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off glc
1087 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1088 ; GFX11-NEXT:    buffer_gl1_inv
1089 ; GFX11-NEXT:    buffer_gl0_inv
1090 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1091 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1092 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1093 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1094 ; GFX11-NEXT:    s_cbranch_execnz .LBB12_1
1095 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1096 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1097 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
1098 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
1099 ; GFX11-NEXT:    ; return to shader part epilog
1100   %zext.offset = zext i32 %voffset to i64
1101   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1102   %rtn = atomicrmw min ptr addrspace(1) %gep0, i64 %data seq_cst
1103   %cast.rtn = bitcast i64 %rtn to <2 x float>
1104   ret <2 x float> %cast.rtn
1107 define amdgpu_ps <2 x float> @global_min_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1108 ; GFX9-LABEL: global_min_saddr_i64_rtn_neg128:
1109 ; GFX9:       ; %bb.0:
1110 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
1111 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
1112 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
1113 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
1114 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1115 ; GFX9-NEXT:  .LBB13_1: ; %atomicrmw.start
1116 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1117 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1118 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
1119 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
1120 ; GFX9-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1121 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1122 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1123 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1124 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1125 ; GFX9-NEXT:    buffer_wbinvl1
1126 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1127 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1128 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1129 ; GFX9-NEXT:    s_cbranch_execnz .LBB13_1
1130 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1131 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1132 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1133 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1134 ; GFX9-NEXT:    ; return to shader part epilog
1136 ; GFX10-LABEL: global_min_saddr_i64_rtn_neg128:
1137 ; GFX10:       ; %bb.0:
1138 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
1139 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1140 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
1141 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1142 ; GFX10-NEXT:  .LBB13_1: ; %atomicrmw.start
1143 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1144 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1145 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
1146 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
1147 ; GFX10-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1148 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1149 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1150 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1151 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1152 ; GFX10-NEXT:    buffer_gl1_inv
1153 ; GFX10-NEXT:    buffer_gl0_inv
1154 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1155 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1156 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1157 ; GFX10-NEXT:    s_cbranch_execnz .LBB13_1
1158 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1159 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1160 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1161 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
1162 ; GFX10-NEXT:    ; return to shader part epilog
1164 ; GFX11-LABEL: global_min_saddr_i64_rtn_neg128:
1165 ; GFX11:       ; %bb.0:
1166 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3] offset:-128
1167 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1168 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1169 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
1170 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1171 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1172 ; GFX11-NEXT:  .LBB13_1: ; %atomicrmw.start
1173 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1174 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1175 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
1176 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
1177 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1178 ; GFX11-NEXT:    v_cmp_le_i64_e32 vcc, v[9:10], v[1:2]
1179 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1180 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1181 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1182 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1183 ; GFX11-NEXT:    buffer_gl1_inv
1184 ; GFX11-NEXT:    buffer_gl0_inv
1185 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1186 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1187 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1188 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1189 ; GFX11-NEXT:    s_cbranch_execnz .LBB13_1
1190 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1191 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1192 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
1193 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
1194 ; GFX11-NEXT:    ; return to shader part epilog
1195   %zext.offset = zext i32 %voffset to i64
1196   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1197   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1198   %rtn = atomicrmw min ptr addrspace(1) %gep1, i64 %data seq_cst
1199   %cast.rtn = bitcast i64 %rtn to <2 x float>
1200   ret <2 x float> %cast.rtn
1203 define amdgpu_ps void @global_min_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1204 ; GFX9-LABEL: global_min_saddr_i64_nortn:
1205 ; GFX9:       ; %bb.0:
1206 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
1207 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1208 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
1209 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
1210 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1211 ; GFX9-NEXT:  .LBB14_1: ; %atomicrmw.start
1212 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1213 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1214 ; GFX9-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1215 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1216 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1217 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
1218 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1219 ; GFX9-NEXT:    buffer_wbinvl1
1220 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1221 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
1222 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1223 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
1224 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1225 ; GFX9-NEXT:    s_cbranch_execnz .LBB14_1
1226 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1227 ; GFX9-NEXT:    s_endpgm
1229 ; GFX10-LABEL: global_min_saddr_i64_nortn:
1230 ; GFX10:       ; %bb.0:
1231 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
1232 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1233 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
1234 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1235 ; GFX10-NEXT:  .LBB14_1: ; %atomicrmw.start
1236 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1237 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1238 ; GFX10-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1239 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1240 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1241 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
1242 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1243 ; GFX10-NEXT:    buffer_gl1_inv
1244 ; GFX10-NEXT:    buffer_gl0_inv
1245 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1246 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
1247 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
1248 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1249 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1250 ; GFX10-NEXT:    s_cbranch_execnz .LBB14_1
1251 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1252 ; GFX10-NEXT:    s_endpgm
1254 ; GFX11-LABEL: global_min_saddr_i64_nortn:
1255 ; GFX11:       ; %bb.0:
1256 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3]
1257 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1258 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1259 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
1260 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1261 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1262 ; GFX11-NEXT:  .LBB14_1: ; %atomicrmw.start
1263 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1264 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1265 ; GFX11-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1266 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1267 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1268 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off glc
1269 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1270 ; GFX11-NEXT:    buffer_gl1_inv
1271 ; GFX11-NEXT:    buffer_gl0_inv
1272 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1273 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
1274 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
1275 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1276 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1277 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1278 ; GFX11-NEXT:    s_cbranch_execnz .LBB14_1
1279 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1280 ; GFX11-NEXT:    s_endpgm
1281   %zext.offset = zext i32 %voffset to i64
1282   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1283   %unused = atomicrmw min ptr addrspace(1) %gep0, i64 %data seq_cst
1284   ret void
1287 define amdgpu_ps void @global_min_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1288 ; GFX9-LABEL: global_min_saddr_i64_nortn_neg128:
1289 ; GFX9:       ; %bb.0:
1290 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
1291 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1292 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
1293 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
1294 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1295 ; GFX9-NEXT:  .LBB15_1: ; %atomicrmw.start
1296 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1297 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1298 ; GFX9-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1299 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1300 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1301 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
1302 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1303 ; GFX9-NEXT:    buffer_wbinvl1
1304 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1305 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
1306 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1307 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
1308 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1309 ; GFX9-NEXT:    s_cbranch_execnz .LBB15_1
1310 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1311 ; GFX9-NEXT:    s_endpgm
1313 ; GFX10-LABEL: global_min_saddr_i64_nortn_neg128:
1314 ; GFX10:       ; %bb.0:
1315 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
1316 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1317 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
1318 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1319 ; GFX10-NEXT:  .LBB15_1: ; %atomicrmw.start
1320 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1321 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1322 ; GFX10-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1323 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1324 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1325 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
1326 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1327 ; GFX10-NEXT:    buffer_gl1_inv
1328 ; GFX10-NEXT:    buffer_gl0_inv
1329 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1330 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
1331 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
1332 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1333 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1334 ; GFX10-NEXT:    s_cbranch_execnz .LBB15_1
1335 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1336 ; GFX10-NEXT:    s_endpgm
1338 ; GFX11-LABEL: global_min_saddr_i64_nortn_neg128:
1339 ; GFX11:       ; %bb.0:
1340 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3] offset:-128
1341 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1342 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1343 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
1344 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1345 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1346 ; GFX11-NEXT:  .LBB15_1: ; %atomicrmw.start
1347 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1348 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1349 ; GFX11-NEXT:    v_cmp_le_i64_e32 vcc, v[5:6], v[1:2]
1350 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1351 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1352 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off offset:-128 glc
1353 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1354 ; GFX11-NEXT:    buffer_gl1_inv
1355 ; GFX11-NEXT:    buffer_gl0_inv
1356 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1357 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
1358 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
1359 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1360 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1361 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1362 ; GFX11-NEXT:    s_cbranch_execnz .LBB15_1
1363 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1364 ; GFX11-NEXT:    s_endpgm
1365   %zext.offset = zext i32 %voffset to i64
1366   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1367   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1368   %unused = atomicrmw min ptr addrspace(1) %gep1, i64 %data seq_cst
1369   ret void
1372 ; --------------------------------------------------------------------------------
1373 ; atomicrmw umax
1374 ; --------------------------------------------------------------------------------
1376 define amdgpu_ps float @global_umax_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
1377 ; GFX9-LABEL: global_umax_saddr_i32_rtn:
1378 ; GFX9:       ; %bb.0:
1379 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
1380 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]
1381 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1382 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
1383 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
1384 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1385 ; GFX9-NEXT:  .LBB16_1: ; %atomicrmw.start
1386 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1387 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1388 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
1389 ; GFX9-NEXT:    v_max_u32_e32 v4, v5, v1
1390 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
1391 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1392 ; GFX9-NEXT:    buffer_wbinvl1
1393 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1394 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1395 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1396 ; GFX9-NEXT:    s_cbranch_execnz .LBB16_1
1397 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1398 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1399 ; GFX9-NEXT:    ; return to shader part epilog
1401 ; GFX10-LABEL: global_umax_saddr_i32_rtn:
1402 ; GFX10:       ; %bb.0:
1403 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
1404 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3]
1405 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
1406 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
1407 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1408 ; GFX10-NEXT:  .LBB16_1: ; %atomicrmw.start
1409 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1410 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1411 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
1412 ; GFX10-NEXT:    v_max_u32_e32 v4, v5, v1
1413 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
1414 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1415 ; GFX10-NEXT:    buffer_gl1_inv
1416 ; GFX10-NEXT:    buffer_gl0_inv
1417 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1418 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1419 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1420 ; GFX10-NEXT:    s_cbranch_execnz .LBB16_1
1421 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1422 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1423 ; GFX10-NEXT:    ; return to shader part epilog
1425 ; GFX11-LABEL: global_umax_saddr_i32_rtn:
1426 ; GFX11:       ; %bb.0:
1427 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
1428 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]
1429 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
1430 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1431 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
1432 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1433 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1434 ; GFX11-NEXT:  .LBB16_1: ; %atomicrmw.start
1435 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1436 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1437 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
1438 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1439 ; GFX11-NEXT:    v_max_u32_e32 v4, v5, v1
1440 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
1441 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1442 ; GFX11-NEXT:    buffer_gl1_inv
1443 ; GFX11-NEXT:    buffer_gl0_inv
1444 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1445 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1446 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1447 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1448 ; GFX11-NEXT:    s_cbranch_execnz .LBB16_1
1449 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1450 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1451 ; GFX11-NEXT:    ; return to shader part epilog
1452   %zext.offset = zext i32 %voffset to i64
1453   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1454   %rtn = atomicrmw umax ptr addrspace(1) %gep0, i32 %data seq_cst
1455   %cast.rtn = bitcast i32 %rtn to float
1456   ret float %cast.rtn
1459 define amdgpu_ps float @global_umax_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
1460 ; GFX9-LABEL: global_umax_saddr_i32_rtn_neg128:
1461 ; GFX9:       ; %bb.0:
1462 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
1463 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
1464 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1465 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
1466 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
1467 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1468 ; GFX9-NEXT:  .LBB17_1: ; %atomicrmw.start
1469 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1470 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1471 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
1472 ; GFX9-NEXT:    v_max_u32_e32 v4, v5, v1
1473 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
1474 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1475 ; GFX9-NEXT:    buffer_wbinvl1
1476 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1477 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1478 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1479 ; GFX9-NEXT:    s_cbranch_execnz .LBB17_1
1480 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1481 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1482 ; GFX9-NEXT:    ; return to shader part epilog
1484 ; GFX10-LABEL: global_umax_saddr_i32_rtn_neg128:
1485 ; GFX10:       ; %bb.0:
1486 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
1487 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
1488 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
1489 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
1490 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1491 ; GFX10-NEXT:  .LBB17_1: ; %atomicrmw.start
1492 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1493 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1494 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
1495 ; GFX10-NEXT:    v_max_u32_e32 v4, v5, v1
1496 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
1497 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1498 ; GFX10-NEXT:    buffer_gl1_inv
1499 ; GFX10-NEXT:    buffer_gl0_inv
1500 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1501 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1502 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1503 ; GFX10-NEXT:    s_cbranch_execnz .LBB17_1
1504 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1505 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1506 ; GFX10-NEXT:    ; return to shader part epilog
1508 ; GFX11-LABEL: global_umax_saddr_i32_rtn_neg128:
1509 ; GFX11:       ; %bb.0:
1510 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
1511 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3] offset:-128
1512 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
1513 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1514 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
1515 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1516 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1517 ; GFX11-NEXT:  .LBB17_1: ; %atomicrmw.start
1518 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1519 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1520 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
1521 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1522 ; GFX11-NEXT:    v_max_u32_e32 v4, v5, v1
1523 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
1524 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1525 ; GFX11-NEXT:    buffer_gl1_inv
1526 ; GFX11-NEXT:    buffer_gl0_inv
1527 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1528 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1529 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1530 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1531 ; GFX11-NEXT:    s_cbranch_execnz .LBB17_1
1532 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1533 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1534 ; GFX11-NEXT:    ; return to shader part epilog
1535   %zext.offset = zext i32 %voffset to i64
1536   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1537   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1538   %rtn = atomicrmw umax ptr addrspace(1) %gep1, i32 %data seq_cst
1539   %cast.rtn = bitcast i32 %rtn to float
1540   ret float %cast.rtn
1543 define amdgpu_ps void @global_umax_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
1544 ; GFX9-LABEL: global_umax_saddr_i32_nortn:
1545 ; GFX9:       ; %bb.0:
1546 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3]
1547 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1548 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
1549 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
1550 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1551 ; GFX9-NEXT:  .LBB18_1: ; %atomicrmw.start
1552 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1553 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1554 ; GFX9-NEXT:    v_max_u32_e32 v4, v5, v1
1555 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
1556 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1557 ; GFX9-NEXT:    buffer_wbinvl1
1558 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1559 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1560 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
1561 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1562 ; GFX9-NEXT:    s_cbranch_execnz .LBB18_1
1563 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1564 ; GFX9-NEXT:    s_endpgm
1566 ; GFX10-LABEL: global_umax_saddr_i32_nortn:
1567 ; GFX10:       ; %bb.0:
1568 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3]
1569 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
1570 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
1571 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1572 ; GFX10-NEXT:  .LBB18_1: ; %atomicrmw.start
1573 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1574 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1575 ; GFX10-NEXT:    v_max_u32_e32 v4, v5, v1
1576 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
1577 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1578 ; GFX10-NEXT:    buffer_gl1_inv
1579 ; GFX10-NEXT:    buffer_gl0_inv
1580 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1581 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
1582 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1583 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1584 ; GFX10-NEXT:    s_cbranch_execnz .LBB18_1
1585 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1586 ; GFX10-NEXT:    s_endpgm
1588 ; GFX11-LABEL: global_umax_saddr_i32_nortn:
1589 ; GFX11:       ; %bb.0:
1590 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3]
1591 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
1592 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1593 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
1594 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1595 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1596 ; GFX11-NEXT:  .LBB18_1: ; %atomicrmw.start
1597 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1598 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1599 ; GFX11-NEXT:    v_max_u32_e32 v4, v5, v1
1600 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
1601 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1602 ; GFX11-NEXT:    buffer_gl1_inv
1603 ; GFX11-NEXT:    buffer_gl0_inv
1604 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1605 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
1606 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1607 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1608 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1609 ; GFX11-NEXT:    s_cbranch_execnz .LBB18_1
1610 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1611 ; GFX11-NEXT:    s_endpgm
1612   %zext.offset = zext i32 %voffset to i64
1613   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1614   %unused = atomicrmw umax ptr addrspace(1) %gep0, i32 %data seq_cst
1615   ret void
1618 define amdgpu_ps void @global_umax_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
1619 ; GFX9-LABEL: global_umax_saddr_i32_nortn_neg128:
1620 ; GFX9:       ; %bb.0:
1621 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
1622 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1623 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
1624 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
1625 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1626 ; GFX9-NEXT:  .LBB19_1: ; %atomicrmw.start
1627 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1628 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1629 ; GFX9-NEXT:    v_max_u32_e32 v4, v5, v1
1630 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
1631 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1632 ; GFX9-NEXT:    buffer_wbinvl1
1633 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1634 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1635 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
1636 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1637 ; GFX9-NEXT:    s_cbranch_execnz .LBB19_1
1638 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1639 ; GFX9-NEXT:    s_endpgm
1641 ; GFX10-LABEL: global_umax_saddr_i32_nortn_neg128:
1642 ; GFX10:       ; %bb.0:
1643 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
1644 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
1645 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
1646 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1647 ; GFX10-NEXT:  .LBB19_1: ; %atomicrmw.start
1648 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1649 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1650 ; GFX10-NEXT:    v_max_u32_e32 v4, v5, v1
1651 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
1652 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1653 ; GFX10-NEXT:    buffer_gl1_inv
1654 ; GFX10-NEXT:    buffer_gl0_inv
1655 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1656 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
1657 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1658 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1659 ; GFX10-NEXT:    s_cbranch_execnz .LBB19_1
1660 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1661 ; GFX10-NEXT:    s_endpgm
1663 ; GFX11-LABEL: global_umax_saddr_i32_nortn_neg128:
1664 ; GFX11:       ; %bb.0:
1665 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3] offset:-128
1666 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
1667 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1668 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
1669 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1670 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1671 ; GFX11-NEXT:  .LBB19_1: ; %atomicrmw.start
1672 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1673 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1674 ; GFX11-NEXT:    v_max_u32_e32 v4, v5, v1
1675 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
1676 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1677 ; GFX11-NEXT:    buffer_gl1_inv
1678 ; GFX11-NEXT:    buffer_gl0_inv
1679 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
1680 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
1681 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1682 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1683 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1684 ; GFX11-NEXT:    s_cbranch_execnz .LBB19_1
1685 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1686 ; GFX11-NEXT:    s_endpgm
1687   %zext.offset = zext i32 %voffset to i64
1688   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1689   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1690   %unused = atomicrmw umax ptr addrspace(1) %gep1, i32 %data seq_cst
1691   ret void
1694 define amdgpu_ps <2 x float> @global_umax_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1695 ; GFX9-LABEL: global_umax_saddr_i64_rtn:
1696 ; GFX9:       ; %bb.0:
1697 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
1698 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
1699 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
1700 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
1701 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1702 ; GFX9-NEXT:  .LBB20_1: ; %atomicrmw.start
1703 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1704 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1705 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
1706 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
1707 ; GFX9-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1708 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1709 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1710 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
1711 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1712 ; GFX9-NEXT:    buffer_wbinvl1
1713 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1714 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1715 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1716 ; GFX9-NEXT:    s_cbranch_execnz .LBB20_1
1717 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1718 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1719 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1720 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1721 ; GFX9-NEXT:    ; return to shader part epilog
1723 ; GFX10-LABEL: global_umax_saddr_i64_rtn:
1724 ; GFX10:       ; %bb.0:
1725 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
1726 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1727 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
1728 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1729 ; GFX10-NEXT:  .LBB20_1: ; %atomicrmw.start
1730 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1731 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1732 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
1733 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
1734 ; GFX10-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1735 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1736 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1737 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
1738 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1739 ; GFX10-NEXT:    buffer_gl1_inv
1740 ; GFX10-NEXT:    buffer_gl0_inv
1741 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1742 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1743 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1744 ; GFX10-NEXT:    s_cbranch_execnz .LBB20_1
1745 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1746 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1747 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1748 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
1749 ; GFX10-NEXT:    ; return to shader part epilog
1751 ; GFX11-LABEL: global_umax_saddr_i64_rtn:
1752 ; GFX11:       ; %bb.0:
1753 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3]
1754 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1755 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1756 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
1757 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1758 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1759 ; GFX11-NEXT:  .LBB20_1: ; %atomicrmw.start
1760 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1761 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1762 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
1763 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
1764 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1765 ; GFX11-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1766 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1767 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1768 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off glc
1769 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1770 ; GFX11-NEXT:    buffer_gl1_inv
1771 ; GFX11-NEXT:    buffer_gl0_inv
1772 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1773 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1774 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1775 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1776 ; GFX11-NEXT:    s_cbranch_execnz .LBB20_1
1777 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1778 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1779 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
1780 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
1781 ; GFX11-NEXT:    ; return to shader part epilog
1782   %zext.offset = zext i32 %voffset to i64
1783   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1784   %rtn = atomicrmw umax ptr addrspace(1) %gep0, i64 %data seq_cst
1785   %cast.rtn = bitcast i64 %rtn to <2 x float>
1786   ret <2 x float> %cast.rtn
1789 define amdgpu_ps <2 x float> @global_umax_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1790 ; GFX9-LABEL: global_umax_saddr_i64_rtn_neg128:
1791 ; GFX9:       ; %bb.0:
1792 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
1793 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
1794 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
1795 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
1796 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1797 ; GFX9-NEXT:  .LBB21_1: ; %atomicrmw.start
1798 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1799 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1800 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
1801 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
1802 ; GFX9-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1803 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1804 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1805 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1806 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1807 ; GFX9-NEXT:    buffer_wbinvl1
1808 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1809 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1810 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1811 ; GFX9-NEXT:    s_cbranch_execnz .LBB21_1
1812 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1813 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
1814 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1815 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1816 ; GFX9-NEXT:    ; return to shader part epilog
1818 ; GFX10-LABEL: global_umax_saddr_i64_rtn_neg128:
1819 ; GFX10:       ; %bb.0:
1820 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
1821 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1822 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
1823 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1824 ; GFX10-NEXT:  .LBB21_1: ; %atomicrmw.start
1825 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1826 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1827 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
1828 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
1829 ; GFX10-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1830 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1831 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1832 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1833 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1834 ; GFX10-NEXT:    buffer_gl1_inv
1835 ; GFX10-NEXT:    buffer_gl0_inv
1836 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1837 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1838 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1839 ; GFX10-NEXT:    s_cbranch_execnz .LBB21_1
1840 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1841 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
1842 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1843 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
1844 ; GFX10-NEXT:    ; return to shader part epilog
1846 ; GFX11-LABEL: global_umax_saddr_i64_rtn_neg128:
1847 ; GFX11:       ; %bb.0:
1848 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3] offset:-128
1849 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
1850 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1851 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
1852 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1853 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1854 ; GFX11-NEXT:  .LBB21_1: ; %atomicrmw.start
1855 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1856 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1857 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
1858 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
1859 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1860 ; GFX11-NEXT:    v_cmp_gt_u64_e32 vcc, v[9:10], v[1:2]
1861 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
1862 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
1863 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off offset:-128 glc
1864 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1865 ; GFX11-NEXT:    buffer_gl1_inv
1866 ; GFX11-NEXT:    buffer_gl0_inv
1867 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
1868 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1869 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1870 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1871 ; GFX11-NEXT:    s_cbranch_execnz .LBB21_1
1872 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1873 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
1874 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
1875 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
1876 ; GFX11-NEXT:    ; return to shader part epilog
1877   %zext.offset = zext i32 %voffset to i64
1878   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1879   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
1880   %rtn = atomicrmw umax ptr addrspace(1) %gep1, i64 %data seq_cst
1881   %cast.rtn = bitcast i64 %rtn to <2 x float>
1882   ret <2 x float> %cast.rtn
1885 define amdgpu_ps void @global_umax_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1886 ; GFX9-LABEL: global_umax_saddr_i64_nortn:
1887 ; GFX9:       ; %bb.0:
1888 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
1889 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1890 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
1891 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
1892 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1893 ; GFX9-NEXT:  .LBB22_1: ; %atomicrmw.start
1894 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1895 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1896 ; GFX9-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
1897 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1898 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1899 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
1900 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1901 ; GFX9-NEXT:    buffer_wbinvl1
1902 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1903 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
1904 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1905 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
1906 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1907 ; GFX9-NEXT:    s_cbranch_execnz .LBB22_1
1908 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1909 ; GFX9-NEXT:    s_endpgm
1911 ; GFX10-LABEL: global_umax_saddr_i64_nortn:
1912 ; GFX10:       ; %bb.0:
1913 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
1914 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1915 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
1916 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
1917 ; GFX10-NEXT:  .LBB22_1: ; %atomicrmw.start
1918 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
1919 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1920 ; GFX10-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
1921 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1922 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1923 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
1924 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1925 ; GFX10-NEXT:    buffer_gl1_inv
1926 ; GFX10-NEXT:    buffer_gl0_inv
1927 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1928 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
1929 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
1930 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1931 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1932 ; GFX10-NEXT:    s_cbranch_execnz .LBB22_1
1933 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
1934 ; GFX10-NEXT:    s_endpgm
1936 ; GFX11-LABEL: global_umax_saddr_i64_nortn:
1937 ; GFX11:       ; %bb.0:
1938 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3]
1939 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1940 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1941 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
1942 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
1943 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
1944 ; GFX11-NEXT:  .LBB22_1: ; %atomicrmw.start
1945 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
1946 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1947 ; GFX11-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
1948 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1949 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1950 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off glc
1951 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1952 ; GFX11-NEXT:    buffer_gl1_inv
1953 ; GFX11-NEXT:    buffer_gl0_inv
1954 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1955 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
1956 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
1957 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1958 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1959 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
1960 ; GFX11-NEXT:    s_cbranch_execnz .LBB22_1
1961 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
1962 ; GFX11-NEXT:    s_endpgm
1963   %zext.offset = zext i32 %voffset to i64
1964   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
1965   %unused = atomicrmw umax ptr addrspace(1) %gep0, i64 %data seq_cst
1966   ret void
1969 define amdgpu_ps void @global_umax_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
1970 ; GFX9-LABEL: global_umax_saddr_i64_nortn_neg128:
1971 ; GFX9:       ; %bb.0:
1972 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
1973 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
1974 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
1975 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
1976 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
1977 ; GFX9-NEXT:  .LBB23_1: ; %atomicrmw.start
1978 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
1979 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1980 ; GFX9-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
1981 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
1982 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
1983 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
1984 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1985 ; GFX9-NEXT:    buffer_wbinvl1
1986 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
1987 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
1988 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
1989 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
1990 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
1991 ; GFX9-NEXT:    s_cbranch_execnz .LBB23_1
1992 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
1993 ; GFX9-NEXT:    s_endpgm
1995 ; GFX10-LABEL: global_umax_saddr_i64_nortn_neg128:
1996 ; GFX10:       ; %bb.0:
1997 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
1998 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
1999 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
2000 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2001 ; GFX10-NEXT:  .LBB23_1: ; %atomicrmw.start
2002 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2003 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2004 ; GFX10-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
2005 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2006 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2007 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
2008 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2009 ; GFX10-NEXT:    buffer_gl1_inv
2010 ; GFX10-NEXT:    buffer_gl0_inv
2011 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2012 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
2013 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
2014 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2015 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2016 ; GFX10-NEXT:    s_cbranch_execnz .LBB23_1
2017 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2018 ; GFX10-NEXT:    s_endpgm
2020 ; GFX11-LABEL: global_umax_saddr_i64_nortn_neg128:
2021 ; GFX11:       ; %bb.0:
2022 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3] offset:-128
2023 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
2024 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2025 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
2026 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2027 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2028 ; GFX11-NEXT:  .LBB23_1: ; %atomicrmw.start
2029 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2030 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2031 ; GFX11-NEXT:    v_cmp_gt_u64_e32 vcc, v[5:6], v[1:2]
2032 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2033 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2034 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off offset:-128 glc
2035 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2036 ; GFX11-NEXT:    buffer_gl1_inv
2037 ; GFX11-NEXT:    buffer_gl0_inv
2038 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2039 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
2040 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
2041 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2042 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2043 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2044 ; GFX11-NEXT:    s_cbranch_execnz .LBB23_1
2045 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2046 ; GFX11-NEXT:    s_endpgm
2047   %zext.offset = zext i32 %voffset to i64
2048   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2049   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
2050   %unused = atomicrmw umax ptr addrspace(1) %gep1, i64 %data seq_cst
2051   ret void
2054 ; --------------------------------------------------------------------------------
2055 ; atomicrmw umin
2056 ; --------------------------------------------------------------------------------
2058 define amdgpu_ps float @global_umin_saddr_i32_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
2059 ; GFX9-LABEL: global_umin_saddr_i32_rtn:
2060 ; GFX9:       ; %bb.0:
2061 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
2062 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]
2063 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2064 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
2065 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
2066 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2067 ; GFX9-NEXT:  .LBB24_1: ; %atomicrmw.start
2068 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2069 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2070 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
2071 ; GFX9-NEXT:    v_min_u32_e32 v4, v5, v1
2072 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
2073 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2074 ; GFX9-NEXT:    buffer_wbinvl1
2075 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2076 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2077 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2078 ; GFX9-NEXT:    s_cbranch_execnz .LBB24_1
2079 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2080 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
2081 ; GFX9-NEXT:    ; return to shader part epilog
2083 ; GFX10-LABEL: global_umin_saddr_i32_rtn:
2084 ; GFX10:       ; %bb.0:
2085 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
2086 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3]
2087 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
2088 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
2089 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2090 ; GFX10-NEXT:  .LBB24_1: ; %atomicrmw.start
2091 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2092 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2093 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
2094 ; GFX10-NEXT:    v_min_u32_e32 v4, v5, v1
2095 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
2096 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2097 ; GFX10-NEXT:    buffer_gl1_inv
2098 ; GFX10-NEXT:    buffer_gl0_inv
2099 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2100 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2101 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2102 ; GFX10-NEXT:    s_cbranch_execnz .LBB24_1
2103 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2104 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
2105 ; GFX10-NEXT:    ; return to shader part epilog
2107 ; GFX11-LABEL: global_umin_saddr_i32_rtn:
2108 ; GFX11:       ; %bb.0:
2109 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
2110 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]
2111 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
2112 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2113 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
2114 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2115 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2116 ; GFX11-NEXT:  .LBB24_1: ; %atomicrmw.start
2117 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2118 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2119 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
2120 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2121 ; GFX11-NEXT:    v_min_u32_e32 v4, v5, v1
2122 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
2123 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2124 ; GFX11-NEXT:    buffer_gl1_inv
2125 ; GFX11-NEXT:    buffer_gl0_inv
2126 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2127 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2128 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2129 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2130 ; GFX11-NEXT:    s_cbranch_execnz .LBB24_1
2131 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2132 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
2133 ; GFX11-NEXT:    ; return to shader part epilog
2134   %zext.offset = zext i32 %voffset to i64
2135   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2136   %rtn = atomicrmw umin ptr addrspace(1) %gep0, i32 %data seq_cst
2137   %cast.rtn = bitcast i32 %rtn to float
2138   ret float %cast.rtn
2141 define amdgpu_ps float @global_umin_saddr_i32_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
2142 ; GFX9-LABEL: global_umin_saddr_i32_rtn_neg128:
2143 ; GFX9:       ; %bb.0:
2144 ; GFX9-NEXT:    v_mov_b32_e32 v2, v0
2145 ; GFX9-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
2146 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2147 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v2
2148 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
2149 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2150 ; GFX9-NEXT:  .LBB25_1: ; %atomicrmw.start
2151 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2152 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2153 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
2154 ; GFX9-NEXT:    v_min_u32_e32 v4, v5, v1
2155 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
2156 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2157 ; GFX9-NEXT:    buffer_wbinvl1
2158 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2159 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2160 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2161 ; GFX9-NEXT:    s_cbranch_execnz .LBB25_1
2162 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2163 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
2164 ; GFX9-NEXT:    ; return to shader part epilog
2166 ; GFX10-LABEL: global_umin_saddr_i32_rtn_neg128:
2167 ; GFX10:       ; %bb.0:
2168 ; GFX10-NEXT:    v_mov_b32_e32 v2, v0
2169 ; GFX10-NEXT:    global_load_dword v0, v0, s[2:3] offset:-128
2170 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
2171 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
2172 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2173 ; GFX10-NEXT:  .LBB25_1: ; %atomicrmw.start
2174 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2175 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2176 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
2177 ; GFX10-NEXT:    v_min_u32_e32 v4, v5, v1
2178 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
2179 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2180 ; GFX10-NEXT:    buffer_gl1_inv
2181 ; GFX10-NEXT:    buffer_gl0_inv
2182 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2183 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2184 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2185 ; GFX10-NEXT:    s_cbranch_execnz .LBB25_1
2186 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2187 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
2188 ; GFX10-NEXT:    ; return to shader part epilog
2190 ; GFX11-LABEL: global_umin_saddr_i32_rtn_neg128:
2191 ; GFX11:       ; %bb.0:
2192 ; GFX11-NEXT:    v_mov_b32_e32 v2, v0
2193 ; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3] offset:-128
2194 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v2
2195 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2196 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
2197 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2198 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2199 ; GFX11-NEXT:  .LBB25_1: ; %atomicrmw.start
2200 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2201 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2202 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
2203 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2204 ; GFX11-NEXT:    v_min_u32_e32 v4, v5, v1
2205 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
2206 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2207 ; GFX11-NEXT:    buffer_gl1_inv
2208 ; GFX11-NEXT:    buffer_gl0_inv
2209 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2210 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2211 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2212 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2213 ; GFX11-NEXT:    s_cbranch_execnz .LBB25_1
2214 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2215 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
2216 ; GFX11-NEXT:    ; return to shader part epilog
2217   %zext.offset = zext i32 %voffset to i64
2218   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2219   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
2220   %rtn = atomicrmw umin ptr addrspace(1) %gep1, i32 %data seq_cst
2221   %cast.rtn = bitcast i32 %rtn to float
2222   ret float %cast.rtn
2225 define amdgpu_ps void @global_umin_saddr_i32_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
2226 ; GFX9-LABEL: global_umin_saddr_i32_nortn:
2227 ; GFX9:       ; %bb.0:
2228 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3]
2229 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2230 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
2231 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
2232 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2233 ; GFX9-NEXT:  .LBB26_1: ; %atomicrmw.start
2234 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2235 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2236 ; GFX9-NEXT:    v_min_u32_e32 v4, v5, v1
2237 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
2238 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2239 ; GFX9-NEXT:    buffer_wbinvl1
2240 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2241 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2242 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
2243 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2244 ; GFX9-NEXT:    s_cbranch_execnz .LBB26_1
2245 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2246 ; GFX9-NEXT:    s_endpgm
2248 ; GFX10-LABEL: global_umin_saddr_i32_nortn:
2249 ; GFX10:       ; %bb.0:
2250 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3]
2251 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
2252 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
2253 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2254 ; GFX10-NEXT:  .LBB26_1: ; %atomicrmw.start
2255 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2256 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2257 ; GFX10-NEXT:    v_min_u32_e32 v4, v5, v1
2258 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off glc
2259 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2260 ; GFX10-NEXT:    buffer_gl1_inv
2261 ; GFX10-NEXT:    buffer_gl0_inv
2262 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2263 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
2264 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2265 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2266 ; GFX10-NEXT:    s_cbranch_execnz .LBB26_1
2267 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2268 ; GFX10-NEXT:    s_endpgm
2270 ; GFX11-LABEL: global_umin_saddr_i32_nortn:
2271 ; GFX11:       ; %bb.0:
2272 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3]
2273 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
2274 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2275 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
2276 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2277 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2278 ; GFX11-NEXT:  .LBB26_1: ; %atomicrmw.start
2279 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2280 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2281 ; GFX11-NEXT:    v_min_u32_e32 v4, v5, v1
2282 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off glc
2283 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2284 ; GFX11-NEXT:    buffer_gl1_inv
2285 ; GFX11-NEXT:    buffer_gl0_inv
2286 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2287 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
2288 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2289 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2290 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2291 ; GFX11-NEXT:    s_cbranch_execnz .LBB26_1
2292 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2293 ; GFX11-NEXT:    s_endpgm
2294   %zext.offset = zext i32 %voffset to i64
2295   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2296   %unused = atomicrmw umin ptr addrspace(1) %gep0, i32 %data seq_cst
2297   ret void
2300 define amdgpu_ps void @global_umin_saddr_i32_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i32 %data) {
2301 ; GFX9-LABEL: global_umin_saddr_i32_nortn_neg128:
2302 ; GFX9:       ; %bb.0:
2303 ; GFX9-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
2304 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2305 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, s2, v0
2306 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v3, vcc
2307 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2308 ; GFX9-NEXT:  .LBB27_1: ; %atomicrmw.start
2309 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2310 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2311 ; GFX9-NEXT:    v_min_u32_e32 v4, v5, v1
2312 ; GFX9-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
2313 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2314 ; GFX9-NEXT:    buffer_wbinvl1
2315 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2316 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2317 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
2318 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2319 ; GFX9-NEXT:    s_cbranch_execnz .LBB27_1
2320 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2321 ; GFX9-NEXT:    s_endpgm
2323 ; GFX10-LABEL: global_umin_saddr_i32_nortn_neg128:
2324 ; GFX10:       ; %bb.0:
2325 ; GFX10-NEXT:    global_load_dword v5, v0, s[2:3] offset:-128
2326 ; GFX10-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
2327 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s[0:1], s3, 0, s[0:1]
2328 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2329 ; GFX10-NEXT:  .LBB27_1: ; %atomicrmw.start
2330 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2331 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2332 ; GFX10-NEXT:    v_min_u32_e32 v4, v5, v1
2333 ; GFX10-NEXT:    global_atomic_cmpswap v0, v[2:3], v[4:5], off offset:-128 glc
2334 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2335 ; GFX10-NEXT:    buffer_gl1_inv
2336 ; GFX10-NEXT:    buffer_gl0_inv
2337 ; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2338 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
2339 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2340 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2341 ; GFX10-NEXT:    s_cbranch_execnz .LBB27_1
2342 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2343 ; GFX10-NEXT:    s_endpgm
2345 ; GFX11-LABEL: global_umin_saddr_i32_nortn_neg128:
2346 ; GFX11:       ; %bb.0:
2347 ; GFX11-NEXT:    global_load_b32 v5, v0, s[2:3] offset:-128
2348 ; GFX11-NEXT:    v_add_co_u32 v2, s[0:1], s2, v0
2349 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2350 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v3, null, s3, 0, s[0:1]
2351 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2352 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2353 ; GFX11-NEXT:  .LBB27_1: ; %atomicrmw.start
2354 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2355 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2356 ; GFX11-NEXT:    v_min_u32_e32 v4, v5, v1
2357 ; GFX11-NEXT:    global_atomic_cmpswap_b32 v0, v[2:3], v[4:5], off offset:-128 glc
2358 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2359 ; GFX11-NEXT:    buffer_gl1_inv
2360 ; GFX11-NEXT:    buffer_gl0_inv
2361 ; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v5
2362 ; GFX11-NEXT:    v_mov_b32_e32 v5, v0
2363 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2364 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2365 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2366 ; GFX11-NEXT:    s_cbranch_execnz .LBB27_1
2367 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2368 ; GFX11-NEXT:    s_endpgm
2369   %zext.offset = zext i32 %voffset to i64
2370   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2371   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
2372   %unused = atomicrmw umin ptr addrspace(1) %gep1, i32 %data seq_cst
2373   ret void
2376 define amdgpu_ps <2 x float> @global_umin_saddr_i64_rtn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
2377 ; GFX9-LABEL: global_umin_saddr_i64_rtn:
2378 ; GFX9:       ; %bb.0:
2379 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
2380 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
2381 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
2382 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
2383 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2384 ; GFX9-NEXT:  .LBB28_1: ; %atomicrmw.start
2385 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2386 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2387 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
2388 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
2389 ; GFX9-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2390 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2391 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2392 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
2393 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2394 ; GFX9-NEXT:    buffer_wbinvl1
2395 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2396 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2397 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2398 ; GFX9-NEXT:    s_cbranch_execnz .LBB28_1
2399 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2400 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
2401 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
2402 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2403 ; GFX9-NEXT:    ; return to shader part epilog
2405 ; GFX10-LABEL: global_umin_saddr_i64_rtn:
2406 ; GFX10:       ; %bb.0:
2407 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3]
2408 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
2409 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
2410 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2411 ; GFX10-NEXT:  .LBB28_1: ; %atomicrmw.start
2412 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2413 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2414 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
2415 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
2416 ; GFX10-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2417 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2418 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2419 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off glc
2420 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2421 ; GFX10-NEXT:    buffer_gl1_inv
2422 ; GFX10-NEXT:    buffer_gl0_inv
2423 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2424 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2425 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2426 ; GFX10-NEXT:    s_cbranch_execnz .LBB28_1
2427 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2428 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
2429 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
2430 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2431 ; GFX10-NEXT:    ; return to shader part epilog
2433 ; GFX11-LABEL: global_umin_saddr_i64_rtn:
2434 ; GFX11:       ; %bb.0:
2435 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3]
2436 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
2437 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2438 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
2439 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2440 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2441 ; GFX11-NEXT:  .LBB28_1: ; %atomicrmw.start
2442 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2443 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2444 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
2445 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
2446 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2447 ; GFX11-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2448 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2449 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2450 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off glc
2451 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2452 ; GFX11-NEXT:    buffer_gl1_inv
2453 ; GFX11-NEXT:    buffer_gl0_inv
2454 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2455 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2456 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2457 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2458 ; GFX11-NEXT:    s_cbranch_execnz .LBB28_1
2459 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2460 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
2461 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
2462 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
2463 ; GFX11-NEXT:    ; return to shader part epilog
2464   %zext.offset = zext i32 %voffset to i64
2465   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2466   %rtn = atomicrmw umin ptr addrspace(1) %gep0, i64 %data seq_cst
2467   %cast.rtn = bitcast i64 %rtn to <2 x float>
2468   ret <2 x float> %cast.rtn
2471 define amdgpu_ps <2 x float> @global_umin_saddr_i64_rtn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
2472 ; GFX9-LABEL: global_umin_saddr_i64_rtn_neg128:
2473 ; GFX9:       ; %bb.0:
2474 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
2475 ; GFX9-NEXT:    v_mov_b32_e32 v6, s3
2476 ; GFX9-NEXT:    v_add_co_u32_e32 v5, vcc, s2, v0
2477 ; GFX9-NEXT:    v_addc_co_u32_e32 v6, vcc, 0, v6, vcc
2478 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2479 ; GFX9-NEXT:  .LBB29_1: ; %atomicrmw.start
2480 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2481 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2482 ; GFX9-NEXT:    v_mov_b32_e32 v10, v4
2483 ; GFX9-NEXT:    v_mov_b32_e32 v9, v3
2484 ; GFX9-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2485 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2486 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2487 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
2488 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2489 ; GFX9-NEXT:    buffer_wbinvl1
2490 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2491 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2492 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2493 ; GFX9-NEXT:    s_cbranch_execnz .LBB29_1
2494 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2495 ; GFX9-NEXT:    s_or_b64 exec, exec, s[0:1]
2496 ; GFX9-NEXT:    v_mov_b32_e32 v0, v3
2497 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2498 ; GFX9-NEXT:    ; return to shader part epilog
2500 ; GFX10-LABEL: global_umin_saddr_i64_rtn_neg128:
2501 ; GFX10:       ; %bb.0:
2502 ; GFX10-NEXT:    global_load_dwordx2 v[3:4], v0, s[2:3] offset:-128
2503 ; GFX10-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
2504 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v6, s[0:1], s3, 0, s[0:1]
2505 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2506 ; GFX10-NEXT:  .LBB29_1: ; %atomicrmw.start
2507 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2508 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2509 ; GFX10-NEXT:    v_mov_b32_e32 v10, v4
2510 ; GFX10-NEXT:    v_mov_b32_e32 v9, v3
2511 ; GFX10-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2512 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2513 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2514 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[5:6], v[7:10], off offset:-128 glc
2515 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2516 ; GFX10-NEXT:    buffer_gl1_inv
2517 ; GFX10-NEXT:    buffer_gl0_inv
2518 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2519 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2520 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2521 ; GFX10-NEXT:    s_cbranch_execnz .LBB29_1
2522 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2523 ; GFX10-NEXT:    s_or_b64 exec, exec, s[0:1]
2524 ; GFX10-NEXT:    v_mov_b32_e32 v0, v3
2525 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2526 ; GFX10-NEXT:    ; return to shader part epilog
2528 ; GFX11-LABEL: global_umin_saddr_i64_rtn_neg128:
2529 ; GFX11:       ; %bb.0:
2530 ; GFX11-NEXT:    global_load_b64 v[3:4], v0, s[2:3] offset:-128
2531 ; GFX11-NEXT:    v_add_co_u32 v5, s[0:1], s2, v0
2532 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2533 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v6, null, s3, 0, s[0:1]
2534 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2535 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2536 ; GFX11-NEXT:  .LBB29_1: ; %atomicrmw.start
2537 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2538 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2539 ; GFX11-NEXT:    v_mov_b32_e32 v10, v4
2540 ; GFX11-NEXT:    v_mov_b32_e32 v9, v3
2541 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2542 ; GFX11-NEXT:    v_cmp_le_u64_e32 vcc, v[9:10], v[1:2]
2543 ; GFX11-NEXT:    v_cndmask_b32_e32 v8, v2, v10, vcc
2544 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v1, v9, vcc
2545 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[5:6], v[7:10], off offset:-128 glc
2546 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2547 ; GFX11-NEXT:    buffer_gl1_inv
2548 ; GFX11-NEXT:    buffer_gl0_inv
2549 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[9:10]
2550 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2551 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2552 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2553 ; GFX11-NEXT:    s_cbranch_execnz .LBB29_1
2554 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2555 ; GFX11-NEXT:    s_or_b64 exec, exec, s[0:1]
2556 ; GFX11-NEXT:    v_mov_b32_e32 v0, v3
2557 ; GFX11-NEXT:    v_mov_b32_e32 v1, v4
2558 ; GFX11-NEXT:    ; return to shader part epilog
2559   %zext.offset = zext i32 %voffset to i64
2560   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2561   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
2562   %rtn = atomicrmw umin ptr addrspace(1) %gep1, i64 %data seq_cst
2563   %cast.rtn = bitcast i64 %rtn to <2 x float>
2564   ret <2 x float> %cast.rtn
2567 define amdgpu_ps void @global_umin_saddr_i64_nortn(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
2568 ; GFX9-LABEL: global_umin_saddr_i64_nortn:
2569 ; GFX9:       ; %bb.0:
2570 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
2571 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2572 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
2573 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
2574 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2575 ; GFX9-NEXT:  .LBB30_1: ; %atomicrmw.start
2576 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2577 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2578 ; GFX9-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2579 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2580 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2581 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
2582 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2583 ; GFX9-NEXT:    buffer_wbinvl1
2584 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2585 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
2586 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2587 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
2588 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2589 ; GFX9-NEXT:    s_cbranch_execnz .LBB30_1
2590 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2591 ; GFX9-NEXT:    s_endpgm
2593 ; GFX10-LABEL: global_umin_saddr_i64_nortn:
2594 ; GFX10:       ; %bb.0:
2595 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3]
2596 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
2597 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
2598 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2599 ; GFX10-NEXT:  .LBB30_1: ; %atomicrmw.start
2600 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2601 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2602 ; GFX10-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2603 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2604 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2605 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off glc
2606 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2607 ; GFX10-NEXT:    buffer_gl1_inv
2608 ; GFX10-NEXT:    buffer_gl0_inv
2609 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2610 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
2611 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
2612 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2613 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2614 ; GFX10-NEXT:    s_cbranch_execnz .LBB30_1
2615 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2616 ; GFX10-NEXT:    s_endpgm
2618 ; GFX11-LABEL: global_umin_saddr_i64_nortn:
2619 ; GFX11:       ; %bb.0:
2620 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3]
2621 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
2622 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2623 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
2624 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2625 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2626 ; GFX11-NEXT:  .LBB30_1: ; %atomicrmw.start
2627 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2628 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2629 ; GFX11-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2630 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2631 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2632 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off glc
2633 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2634 ; GFX11-NEXT:    buffer_gl1_inv
2635 ; GFX11-NEXT:    buffer_gl0_inv
2636 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2637 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
2638 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
2639 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2640 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2641 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2642 ; GFX11-NEXT:    s_cbranch_execnz .LBB30_1
2643 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2644 ; GFX11-NEXT:    s_endpgm
2645   %zext.offset = zext i32 %voffset to i64
2646   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2647   %unused = atomicrmw umin ptr addrspace(1) %gep0, i64 %data seq_cst
2648   ret void
2651 define amdgpu_ps void @global_umin_saddr_i64_nortn_neg128(ptr addrspace(1) inreg %sbase, i32 %voffset, i64 %data) {
2652 ; GFX9-LABEL: global_umin_saddr_i64_nortn_neg128:
2653 ; GFX9:       ; %bb.0:
2654 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
2655 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
2656 ; GFX9-NEXT:    v_add_co_u32_e32 v7, vcc, s2, v0
2657 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v3, vcc
2658 ; GFX9-NEXT:    s_mov_b64 s[0:1], 0
2659 ; GFX9-NEXT:  .LBB31_1: ; %atomicrmw.start
2660 ; GFX9-NEXT:    ; =>This Inner Loop Header: Depth=1
2661 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2662 ; GFX9-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2663 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2664 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2665 ; GFX9-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
2666 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2667 ; GFX9-NEXT:    buffer_wbinvl1
2668 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2669 ; GFX9-NEXT:    v_mov_b32_e32 v6, v4
2670 ; GFX9-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2671 ; GFX9-NEXT:    v_mov_b32_e32 v5, v3
2672 ; GFX9-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2673 ; GFX9-NEXT:    s_cbranch_execnz .LBB31_1
2674 ; GFX9-NEXT:  ; %bb.2: ; %atomicrmw.end
2675 ; GFX9-NEXT:    s_endpgm
2677 ; GFX10-LABEL: global_umin_saddr_i64_nortn_neg128:
2678 ; GFX10:       ; %bb.0:
2679 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v0, s[2:3] offset:-128
2680 ; GFX10-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
2681 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v8, s[0:1], s3, 0, s[0:1]
2682 ; GFX10-NEXT:    s_mov_b64 s[0:1], 0
2683 ; GFX10-NEXT:  .LBB31_1: ; %atomicrmw.start
2684 ; GFX10-NEXT:    ; =>This Inner Loop Header: Depth=1
2685 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2686 ; GFX10-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2687 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2688 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2689 ; GFX10-NEXT:    global_atomic_cmpswap_x2 v[3:4], v[7:8], v[3:6], off offset:-128 glc
2690 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2691 ; GFX10-NEXT:    buffer_gl1_inv
2692 ; GFX10-NEXT:    buffer_gl0_inv
2693 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2694 ; GFX10-NEXT:    v_mov_b32_e32 v6, v4
2695 ; GFX10-NEXT:    v_mov_b32_e32 v5, v3
2696 ; GFX10-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2697 ; GFX10-NEXT:    s_andn2_b64 exec, exec, s[0:1]
2698 ; GFX10-NEXT:    s_cbranch_execnz .LBB31_1
2699 ; GFX10-NEXT:  ; %bb.2: ; %atomicrmw.end
2700 ; GFX10-NEXT:    s_endpgm
2702 ; GFX11-LABEL: global_umin_saddr_i64_nortn_neg128:
2703 ; GFX11:       ; %bb.0:
2704 ; GFX11-NEXT:    global_load_b64 v[5:6], v0, s[2:3] offset:-128
2705 ; GFX11-NEXT:    v_add_co_u32 v7, s[0:1], s2, v0
2706 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2707 ; GFX11-NEXT:    v_add_co_ci_u32_e64 v8, null, s3, 0, s[0:1]
2708 ; GFX11-NEXT:    s_mov_b64 s[0:1], 0
2709 ; GFX11-NEXT:    s_waitcnt_depctr 0xfffe
2710 ; GFX11-NEXT:  .LBB31_1: ; %atomicrmw.start
2711 ; GFX11-NEXT:    ; =>This Inner Loop Header: Depth=1
2712 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2713 ; GFX11-NEXT:    v_cmp_le_u64_e32 vcc, v[5:6], v[1:2]
2714 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v2, v6, vcc
2715 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v1, v5, vcc
2716 ; GFX11-NEXT:    global_atomic_cmpswap_b64 v[3:4], v[7:8], v[3:6], off offset:-128 glc
2717 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2718 ; GFX11-NEXT:    buffer_gl1_inv
2719 ; GFX11-NEXT:    buffer_gl0_inv
2720 ; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc, v[3:4], v[5:6]
2721 ; GFX11-NEXT:    v_mov_b32_e32 v6, v4
2722 ; GFX11-NEXT:    v_mov_b32_e32 v5, v3
2723 ; GFX11-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
2724 ; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
2725 ; GFX11-NEXT:    s_and_not1_b64 exec, exec, s[0:1]
2726 ; GFX11-NEXT:    s_cbranch_execnz .LBB31_1
2727 ; GFX11-NEXT:  ; %bb.2: ; %atomicrmw.end
2728 ; GFX11-NEXT:    s_endpgm
2729   %zext.offset = zext i32 %voffset to i64
2730   %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset
2731   %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -128
2732   %unused = atomicrmw umin ptr addrspace(1) %gep1, i64 %data seq_cst
2733   ret void
2736 attributes #0 = { argmemonly nounwind willreturn }