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