Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / clamp.ll
blob94482d7f0d809b3c98fa3104146e7fa68ef38d0b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX6 %s
3 ; RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s
4 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9 %s
5 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
6 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX12 %s
8 define amdgpu_kernel void @v_clamp_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
9 ; GFX6-LABEL: v_clamp_f32:
10 ; GFX6:       ; %bb.0:
11 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
12 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
13 ; GFX6-NEXT:    s_mov_b32 s6, 0
14 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
15 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
16 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
17 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
18 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
19 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
20 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
21 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
22 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
23 ; GFX6-NEXT:    s_endpgm
25 ; GFX8-LABEL: v_clamp_f32:
26 ; GFX8:       ; %bb.0:
27 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
28 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
29 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
30 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
31 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
32 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
33 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
34 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
35 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
36 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
37 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
38 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
39 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
40 ; GFX8-NEXT:    s_endpgm
42 ; GFX9-LABEL: v_clamp_f32:
43 ; GFX9:       ; %bb.0:
44 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
45 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
46 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
47 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
48 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
49 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
50 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
51 ; GFX9-NEXT:    s_endpgm
53 ; GFX11-LABEL: v_clamp_f32:
54 ; GFX11:       ; %bb.0:
55 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
56 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
57 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
58 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
59 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
60 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
61 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
62 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
63 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
64 ; GFX11-NEXT:    s_nop 0
65 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
66 ; GFX11-NEXT:    s_endpgm
68 ; GFX12-LABEL: v_clamp_f32:
69 ; GFX12:       ; %bb.0:
70 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
71 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
72 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
73 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
74 ; GFX12-NEXT:    s_wait_kmcnt 0x0
75 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
76 ; GFX12-NEXT:    s_wait_loadcnt 0x0
77 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
78 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
79 ; GFX12-NEXT:    s_nop 0
80 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
81 ; GFX12-NEXT:    s_endpgm
82   %tid = call i32 @llvm.amdgcn.workitem.id.x()
83   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
84   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
85   %a = load float, ptr addrspace(1) %gep0
86   %max = call float @llvm.maxnum.f32(float %a, float 0.0)
87   %med = call float @llvm.minnum.f32(float %max, float 1.0)
89   store float %med, ptr addrspace(1) %out.gep
90   ret void
93 define amdgpu_kernel void @v_clamp_neg_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
94 ; GFX6-LABEL: v_clamp_neg_f32:
95 ; GFX6:       ; %bb.0:
96 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
97 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
98 ; GFX6-NEXT:    s_mov_b32 s6, 0
99 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
100 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
101 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
102 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
103 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
104 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
105 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
106 ; GFX6-NEXT:    v_max_f32_e64 v2, -v2, -v2 clamp
107 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
108 ; GFX6-NEXT:    s_endpgm
110 ; GFX8-LABEL: v_clamp_neg_f32:
111 ; GFX8:       ; %bb.0:
112 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
113 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
114 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
115 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
116 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
117 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
118 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
119 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
120 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
121 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
122 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
123 ; GFX8-NEXT:    v_max_f32_e64 v2, -v3, -v3 clamp
124 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
125 ; GFX8-NEXT:    s_endpgm
127 ; GFX9-LABEL: v_clamp_neg_f32:
128 ; GFX9:       ; %bb.0:
129 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
130 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
131 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
132 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
133 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
134 ; GFX9-NEXT:    v_max_f32_e64 v1, -v1, -v1 clamp
135 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
136 ; GFX9-NEXT:    s_endpgm
138 ; GFX11-LABEL: v_clamp_neg_f32:
139 ; GFX11:       ; %bb.0:
140 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
141 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
142 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
143 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
144 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
145 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
146 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
147 ; GFX11-NEXT:    v_max_f32_e64 v1, -v1, -v1 clamp
148 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
149 ; GFX11-NEXT:    s_nop 0
150 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
151 ; GFX11-NEXT:    s_endpgm
153 ; GFX12-LABEL: v_clamp_neg_f32:
154 ; GFX12:       ; %bb.0:
155 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
156 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
157 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
158 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
159 ; GFX12-NEXT:    s_wait_kmcnt 0x0
160 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
161 ; GFX12-NEXT:    s_wait_loadcnt 0x0
162 ; GFX12-NEXT:    v_max_num_f32_e64 v1, -v1, -v1 clamp
163 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
164 ; GFX12-NEXT:    s_nop 0
165 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
166 ; GFX12-NEXT:    s_endpgm
167   %tid = call i32 @llvm.amdgcn.workitem.id.x()
168   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
169   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
170   %a = load float, ptr addrspace(1) %gep0
171   %fneg.a = fneg float %a
172   %max = call float @llvm.maxnum.f32(float %fneg.a, float 0.0)
173   %med = call float @llvm.minnum.f32(float %max, float 1.0)
175   store float %med, ptr addrspace(1) %out.gep
176   ret void
179 define amdgpu_kernel void @v_clamp_negabs_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
180 ; GFX6-LABEL: v_clamp_negabs_f32:
181 ; GFX6:       ; %bb.0:
182 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
183 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
184 ; GFX6-NEXT:    s_mov_b32 s6, 0
185 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
186 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
187 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
188 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
189 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
190 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
191 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
192 ; GFX6-NEXT:    v_max_f32_e64 v2, -|v2|, -|v2| clamp
193 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
194 ; GFX6-NEXT:    s_endpgm
196 ; GFX8-LABEL: v_clamp_negabs_f32:
197 ; GFX8:       ; %bb.0:
198 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
199 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
200 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
201 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
202 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
203 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
204 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
205 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
206 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
207 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
208 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
209 ; GFX8-NEXT:    v_max_f32_e64 v2, -|v3|, -|v3| clamp
210 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
211 ; GFX8-NEXT:    s_endpgm
213 ; GFX9-LABEL: v_clamp_negabs_f32:
214 ; GFX9:       ; %bb.0:
215 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
216 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
217 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
218 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
219 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
220 ; GFX9-NEXT:    v_max_f32_e64 v1, -|v1|, -|v1| clamp
221 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
222 ; GFX9-NEXT:    s_endpgm
224 ; GFX11-LABEL: v_clamp_negabs_f32:
225 ; GFX11:       ; %bb.0:
226 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
227 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
228 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
229 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
230 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
231 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
232 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
233 ; GFX11-NEXT:    v_max_f32_e64 v1, -|v1|, -|v1| clamp
234 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
235 ; GFX11-NEXT:    s_nop 0
236 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
237 ; GFX11-NEXT:    s_endpgm
239 ; GFX12-LABEL: v_clamp_negabs_f32:
240 ; GFX12:       ; %bb.0:
241 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
242 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
243 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
244 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
245 ; GFX12-NEXT:    s_wait_kmcnt 0x0
246 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
247 ; GFX12-NEXT:    s_wait_loadcnt 0x0
248 ; GFX12-NEXT:    v_max_num_f32_e64 v1, -|v1|, -|v1| clamp
249 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
250 ; GFX12-NEXT:    s_nop 0
251 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
252 ; GFX12-NEXT:    s_endpgm
253   %tid = call i32 @llvm.amdgcn.workitem.id.x()
254   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
255   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
256   %a = load float, ptr addrspace(1) %gep0
257   %fabs.a = call float @llvm.fabs.f32(float %a)
258   %fneg.fabs.a = fneg float %fabs.a
260   %max = call float @llvm.maxnum.f32(float %fneg.fabs.a, float 0.0)
261   %med = call float @llvm.minnum.f32(float %max, float 1.0)
263   store float %med, ptr addrspace(1) %out.gep
264   ret void
267 define amdgpu_kernel void @v_clamp_negzero_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
268 ; GFX6-LABEL: v_clamp_negzero_f32:
269 ; GFX6:       ; %bb.0:
270 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
271 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
272 ; GFX6-NEXT:    s_mov_b32 s6, 0
273 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
274 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
275 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
276 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
277 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
278 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
279 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
280 ; GFX6-NEXT:    v_add_f32_e32 v2, 0.5, v2
281 ; GFX6-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
282 ; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
283 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
284 ; GFX6-NEXT:    s_endpgm
286 ; GFX8-LABEL: v_clamp_negzero_f32:
287 ; GFX8:       ; %bb.0:
288 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
289 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
290 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
291 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
292 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
293 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
294 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
295 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
296 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
297 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
298 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
299 ; GFX8-NEXT:    v_add_f32_e32 v2, 0.5, v3
300 ; GFX8-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
301 ; GFX8-NEXT:    v_min_f32_e32 v2, 1.0, v2
302 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
303 ; GFX8-NEXT:    s_endpgm
305 ; GFX9-LABEL: v_clamp_negzero_f32:
306 ; GFX9:       ; %bb.0:
307 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
308 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
309 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
310 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
311 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
312 ; GFX9-NEXT:    v_add_f32_e32 v1, 0.5, v1
313 ; GFX9-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
314 ; GFX9-NEXT:    v_min_f32_e32 v1, 1.0, v1
315 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
316 ; GFX9-NEXT:    s_endpgm
318 ; GFX11-LABEL: v_clamp_negzero_f32:
319 ; GFX11:       ; %bb.0:
320 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
321 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
322 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
323 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
324 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
325 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
326 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
327 ; GFX11-NEXT:    v_add_f32_e32 v1, 0.5, v1
328 ; GFX11-NEXT:    v_maxmin_f32 v1, v1, 0x80000000, 1.0
329 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
330 ; GFX11-NEXT:    s_nop 0
331 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
332 ; GFX11-NEXT:    s_endpgm
334 ; GFX12-LABEL: v_clamp_negzero_f32:
335 ; GFX12:       ; %bb.0:
336 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
337 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
338 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
339 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
340 ; GFX12-NEXT:    s_wait_kmcnt 0x0
341 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
342 ; GFX12-NEXT:    s_wait_loadcnt 0x0
343 ; GFX12-NEXT:    v_add_f32_e32 v1, 0.5, v1
344 ; GFX12-NEXT:    v_maxmin_num_f32 v1, v1, 0x80000000, 1.0
345 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
346 ; GFX12-NEXT:    s_nop 0
347 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
348 ; GFX12-NEXT:    s_endpgm
349   %tid = call i32 @llvm.amdgcn.workitem.id.x()
350   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
351   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
352   %a = load float, ptr addrspace(1) %gep0
353   %add = fadd nnan float %a, 0.5
354   %max = call float @llvm.maxnum.f32(float %add, float -0.0)
355   %med = call float @llvm.minnum.f32(float %max, float 1.0)
357   store float %med, ptr addrspace(1) %out.gep
358   ret void
361 ; FIXME: Weird inconsistency in how -0.0 is treated. Accepted if clamp
362 ; matched through med3, not if directly. Is this correct?
363 define amdgpu_kernel void @v_clamp_negzero_maybe_snan_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
364 ; GFX6-LABEL: v_clamp_negzero_maybe_snan_f32:
365 ; GFX6:       ; %bb.0:
366 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
367 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
368 ; GFX6-NEXT:    s_mov_b32 s6, 0
369 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
370 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
371 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
372 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
373 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
374 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
375 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
376 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
377 ; GFX6-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
378 ; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
379 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
380 ; GFX6-NEXT:    s_endpgm
382 ; GFX8-LABEL: v_clamp_negzero_maybe_snan_f32:
383 ; GFX8:       ; %bb.0:
384 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
385 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
386 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
387 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
388 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
389 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
390 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
391 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
392 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
393 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
394 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
395 ; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
396 ; GFX8-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
397 ; GFX8-NEXT:    v_min_f32_e32 v2, 1.0, v2
398 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
399 ; GFX8-NEXT:    s_endpgm
401 ; GFX9-LABEL: v_clamp_negzero_maybe_snan_f32:
402 ; GFX9:       ; %bb.0:
403 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
404 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
405 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
406 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
407 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
408 ; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
409 ; GFX9-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
410 ; GFX9-NEXT:    v_min_f32_e32 v1, 1.0, v1
411 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
412 ; GFX9-NEXT:    s_endpgm
414 ; GFX11-LABEL: v_clamp_negzero_maybe_snan_f32:
415 ; GFX11:       ; %bb.0:
416 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
417 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
418 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
419 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
420 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
421 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
422 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
423 ; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
424 ; GFX11-NEXT:    v_maxmin_f32 v1, v1, 0x80000000, 1.0
425 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
426 ; GFX11-NEXT:    s_nop 0
427 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
428 ; GFX11-NEXT:    s_endpgm
430 ; GFX12-LABEL: v_clamp_negzero_maybe_snan_f32:
431 ; GFX12:       ; %bb.0:
432 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
433 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
434 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
435 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
436 ; GFX12-NEXT:    s_wait_kmcnt 0x0
437 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
438 ; GFX12-NEXT:    s_wait_loadcnt 0x0
439 ; GFX12-NEXT:    v_max_num_f32_e32 v1, v1, v1
440 ; GFX12-NEXT:    v_maxmin_num_f32 v1, v1, 0x80000000, 1.0
441 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
442 ; GFX12-NEXT:    s_nop 0
443 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
444 ; GFX12-NEXT:    s_endpgm
445   %tid = call i32 @llvm.amdgcn.workitem.id.x()
446   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
447   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
448   %a = load float, ptr addrspace(1) %gep0
449   %max = call float @llvm.maxnum.f32(float %a, float -0.0)
450   %med = call float @llvm.minnum.f32(float %max, float 1.0)
452   store float %med, ptr addrspace(1) %out.gep
453   ret void
456 define amdgpu_kernel void @v_clamp_multi_use_max_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
457 ; GFX6-LABEL: v_clamp_multi_use_max_f32:
458 ; GFX6:       ; %bb.0:
459 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
460 ; GFX6-NEXT:    s_mov_b32 s6, 0
461 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
462 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
463 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
464 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
465 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
466 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
467 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
468 ; GFX6-NEXT:    s_mov_b32 s6, -1
469 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
470 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
471 ; GFX6-NEXT:    v_max_f32_e32 v2, 0, v2
472 ; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v2
473 ; GFX6-NEXT:    buffer_store_dword v3, v[0:1], s[0:3], 0 addr64
474 ; GFX6-NEXT:    buffer_store_dword v2, off, s[4:7], 0
475 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
476 ; GFX6-NEXT:    s_endpgm
478 ; GFX8-LABEL: v_clamp_multi_use_max_f32:
479 ; GFX8:       ; %bb.0:
480 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
481 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
482 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
483 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
484 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
485 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
486 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
487 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
488 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
489 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
490 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
491 ; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
492 ; GFX8-NEXT:    v_max_f32_e32 v2, 0, v2
493 ; GFX8-NEXT:    v_min_f32_e32 v3, 1.0, v2
494 ; GFX8-NEXT:    flat_store_dword v[0:1], v3
495 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
496 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
497 ; GFX8-NEXT:    s_endpgm
499 ; GFX9-LABEL: v_clamp_multi_use_max_f32:
500 ; GFX9:       ; %bb.0:
501 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
502 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
503 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
504 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
505 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
506 ; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
507 ; GFX9-NEXT:    v_max_f32_e32 v1, 0, v1
508 ; GFX9-NEXT:    v_min_f32_e32 v2, 1.0, v1
509 ; GFX9-NEXT:    global_store_dword v0, v2, s[4:5]
510 ; GFX9-NEXT:    global_store_dword v[0:1], v1, off
511 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
512 ; GFX9-NEXT:    s_endpgm
514 ; GFX11-LABEL: v_clamp_multi_use_max_f32:
515 ; GFX11:       ; %bb.0:
516 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
517 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
518 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
519 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
520 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
521 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
522 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
523 ; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
524 ; GFX11-NEXT:    v_max_f32_e32 v1, 0, v1
525 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
526 ; GFX11-NEXT:    v_min_f32_e32 v2, 1.0, v1
527 ; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1]
528 ; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
529 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
530 ; GFX11-NEXT:    s_nop 0
531 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
532 ; GFX11-NEXT:    s_endpgm
534 ; GFX12-LABEL: v_clamp_multi_use_max_f32:
535 ; GFX12:       ; %bb.0:
536 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
537 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
538 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
539 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
540 ; GFX12-NEXT:    s_wait_kmcnt 0x0
541 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
542 ; GFX12-NEXT:    s_wait_loadcnt 0x0
543 ; GFX12-NEXT:    v_max_num_f32_e32 v1, v1, v1
544 ; GFX12-NEXT:    v_max_num_f32_e32 v1, 0, v1
545 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
546 ; GFX12-NEXT:    v_min_num_f32_e32 v2, 1.0, v1
547 ; GFX12-NEXT:    global_store_b32 v0, v2, s[0:1]
548 ; GFX12-NEXT:    s_wait_storecnt 0x0
549 ; GFX12-NEXT:    global_store_b32 v[0:1], v1, off scope:SCOPE_SYS
550 ; GFX12-NEXT:    s_wait_storecnt 0x0
551 ; GFX12-NEXT:    s_nop 0
552 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
553 ; GFX12-NEXT:    s_endpgm
554   %tid = call i32 @llvm.amdgcn.workitem.id.x()
555   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
556   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
557   %a = load float, ptr addrspace(1) %gep0
558   %max = call float @llvm.maxnum.f32(float %a, float 0.0)
559   %med = call float @llvm.minnum.f32(float %max, float 1.0)
561   store float %med, ptr addrspace(1) %out.gep
562   store volatile float %max, ptr addrspace(1) undef
563   ret void
566 define amdgpu_kernel void @v_clamp_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
567 ; GFX6-LABEL: v_clamp_f16:
568 ; GFX6:       ; %bb.0:
569 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
570 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
571 ; GFX6-NEXT:    s_mov_b32 s6, 0
572 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
573 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
574 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
575 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
576 ; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
577 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
578 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
579 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
580 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
581 ; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
582 ; GFX6-NEXT:    s_endpgm
584 ; GFX8-LABEL: v_clamp_f16:
585 ; GFX8:       ; %bb.0:
586 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
587 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
588 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
589 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
590 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
591 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
592 ; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
593 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
594 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
595 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
596 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
597 ; GFX8-NEXT:    v_max_f16_e64 v2, v3, v3 clamp
598 ; GFX8-NEXT:    flat_store_short v[0:1], v2
599 ; GFX8-NEXT:    s_endpgm
601 ; GFX9-LABEL: v_clamp_f16:
602 ; GFX9:       ; %bb.0:
603 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
604 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
605 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
606 ; GFX9-NEXT:    global_load_ushort v1, v0, s[6:7]
607 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
608 ; GFX9-NEXT:    v_max_f16_e64 v1, v1, v1 clamp
609 ; GFX9-NEXT:    global_store_short v0, v1, s[4:5]
610 ; GFX9-NEXT:    s_endpgm
612 ; GFX11-LABEL: v_clamp_f16:
613 ; GFX11:       ; %bb.0:
614 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
615 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
616 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
617 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
618 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
619 ; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
620 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
621 ; GFX11-NEXT:    v_max_f16_e64 v1, v1, v1 clamp
622 ; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
623 ; GFX11-NEXT:    s_nop 0
624 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
625 ; GFX11-NEXT:    s_endpgm
627 ; GFX12-LABEL: v_clamp_f16:
628 ; GFX12:       ; %bb.0:
629 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
630 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
631 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
632 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
633 ; GFX12-NEXT:    s_wait_kmcnt 0x0
634 ; GFX12-NEXT:    global_load_u16 v1, v0, s[2:3]
635 ; GFX12-NEXT:    s_wait_loadcnt 0x0
636 ; GFX12-NEXT:    v_max_num_f16_e64 v1, v1, v1 clamp
637 ; GFX12-NEXT:    global_store_b16 v0, v1, s[0:1]
638 ; GFX12-NEXT:    s_nop 0
639 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
640 ; GFX12-NEXT:    s_endpgm
641   %tid = call i32 @llvm.amdgcn.workitem.id.x()
642   %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid
643   %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid
644   %a = load half, ptr addrspace(1) %gep0
645   %max = call half @llvm.maxnum.f16(half %a, half 0.0)
646   %med = call half @llvm.minnum.f16(half %max, half 1.0)
648   store half %med, ptr addrspace(1) %out.gep
649   ret void
652 define amdgpu_kernel void @v_clamp_neg_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
653 ; GFX6-LABEL: v_clamp_neg_f16:
654 ; GFX6:       ; %bb.0:
655 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
656 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
657 ; GFX6-NEXT:    s_mov_b32 s6, 0
658 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
659 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
660 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
661 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
662 ; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
663 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
664 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
665 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -v2 clamp
666 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
667 ; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
668 ; GFX6-NEXT:    s_endpgm
670 ; GFX8-LABEL: v_clamp_neg_f16:
671 ; GFX8:       ; %bb.0:
672 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
673 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
674 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
675 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
676 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
677 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
678 ; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
679 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
680 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
681 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
682 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
683 ; GFX8-NEXT:    v_max_f16_e64 v2, -v3, -v3 clamp
684 ; GFX8-NEXT:    flat_store_short v[0:1], v2
685 ; GFX8-NEXT:    s_endpgm
687 ; GFX9-LABEL: v_clamp_neg_f16:
688 ; GFX9:       ; %bb.0:
689 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
690 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
691 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
692 ; GFX9-NEXT:    global_load_ushort v1, v0, s[6:7]
693 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
694 ; GFX9-NEXT:    v_max_f16_e64 v1, -v1, -v1 clamp
695 ; GFX9-NEXT:    global_store_short v0, v1, s[4:5]
696 ; GFX9-NEXT:    s_endpgm
698 ; GFX11-LABEL: v_clamp_neg_f16:
699 ; GFX11:       ; %bb.0:
700 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
701 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
702 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
703 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
704 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
705 ; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
706 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
707 ; GFX11-NEXT:    v_max_f16_e64 v1, -v1, -v1 clamp
708 ; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
709 ; GFX11-NEXT:    s_nop 0
710 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
711 ; GFX11-NEXT:    s_endpgm
713 ; GFX12-LABEL: v_clamp_neg_f16:
714 ; GFX12:       ; %bb.0:
715 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
716 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
717 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
718 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
719 ; GFX12-NEXT:    s_wait_kmcnt 0x0
720 ; GFX12-NEXT:    global_load_u16 v1, v0, s[2:3]
721 ; GFX12-NEXT:    s_wait_loadcnt 0x0
722 ; GFX12-NEXT:    v_max_num_f16_e64 v1, -v1, -v1 clamp
723 ; GFX12-NEXT:    global_store_b16 v0, v1, s[0:1]
724 ; GFX12-NEXT:    s_nop 0
725 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
726 ; GFX12-NEXT:    s_endpgm
727   %tid = call i32 @llvm.amdgcn.workitem.id.x()
728   %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid
729   %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid
730   %a = load half, ptr addrspace(1) %gep0
731   %fneg.a = fneg half %a
732   %max = call half @llvm.maxnum.f16(half %fneg.a, half 0.0)
733   %med = call half @llvm.minnum.f16(half %max, half 1.0)
735   store half %med, ptr addrspace(1) %out.gep
736   ret void
739 define amdgpu_kernel void @v_clamp_negabs_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
740 ; GFX6-LABEL: v_clamp_negabs_f16:
741 ; GFX6:       ; %bb.0:
742 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
743 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
744 ; GFX6-NEXT:    s_mov_b32 s6, 0
745 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
746 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
747 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
748 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
749 ; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
750 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
751 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
752 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -|v2| clamp
753 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
754 ; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
755 ; GFX6-NEXT:    s_endpgm
757 ; GFX8-LABEL: v_clamp_negabs_f16:
758 ; GFX8:       ; %bb.0:
759 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
760 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
761 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
762 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
763 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
764 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
765 ; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
766 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
767 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
768 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
769 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
770 ; GFX8-NEXT:    v_max_f16_e64 v2, -|v3|, -|v3| clamp
771 ; GFX8-NEXT:    flat_store_short v[0:1], v2
772 ; GFX8-NEXT:    s_endpgm
774 ; GFX9-LABEL: v_clamp_negabs_f16:
775 ; GFX9:       ; %bb.0:
776 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
777 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
778 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
779 ; GFX9-NEXT:    global_load_ushort v1, v0, s[6:7]
780 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
781 ; GFX9-NEXT:    v_max_f16_e64 v1, -|v1|, -|v1| clamp
782 ; GFX9-NEXT:    global_store_short v0, v1, s[4:5]
783 ; GFX9-NEXT:    s_endpgm
785 ; GFX11-LABEL: v_clamp_negabs_f16:
786 ; GFX11:       ; %bb.0:
787 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
788 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
789 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
790 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
791 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
792 ; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
793 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
794 ; GFX11-NEXT:    v_max_f16_e64 v1, -|v1|, -|v1| clamp
795 ; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
796 ; GFX11-NEXT:    s_nop 0
797 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
798 ; GFX11-NEXT:    s_endpgm
800 ; GFX12-LABEL: v_clamp_negabs_f16:
801 ; GFX12:       ; %bb.0:
802 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
803 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
804 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
805 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
806 ; GFX12-NEXT:    s_wait_kmcnt 0x0
807 ; GFX12-NEXT:    global_load_u16 v1, v0, s[2:3]
808 ; GFX12-NEXT:    s_wait_loadcnt 0x0
809 ; GFX12-NEXT:    v_max_num_f16_e64 v1, -|v1|, -|v1| clamp
810 ; GFX12-NEXT:    global_store_b16 v0, v1, s[0:1]
811 ; GFX12-NEXT:    s_nop 0
812 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
813 ; GFX12-NEXT:    s_endpgm
814   %tid = call i32 @llvm.amdgcn.workitem.id.x()
815   %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid
816   %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid
817   %a = load half, ptr addrspace(1) %gep0
818   %fabs.a = call half @llvm.fabs.f16(half %a)
819   %fneg.fabs.a = fneg half %fabs.a
821   %max = call half @llvm.maxnum.f16(half %fneg.fabs.a, half 0.0)
822   %med = call half @llvm.minnum.f16(half %max, half 1.0)
824   store half %med, ptr addrspace(1) %out.gep
825   ret void
828 define amdgpu_kernel void @v_clamp_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
829 ; GFX6-LABEL: v_clamp_f64:
830 ; GFX6:       ; %bb.0:
831 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
832 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
833 ; GFX6-NEXT:    s_mov_b32 s6, 0
834 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
835 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
836 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
837 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
838 ; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
839 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
840 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
841 ; GFX6-NEXT:    v_max_f64 v[2:3], v[2:3], v[2:3] clamp
842 ; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
843 ; GFX6-NEXT:    s_endpgm
845 ; GFX8-LABEL: v_clamp_f64:
846 ; GFX8:       ; %bb.0:
847 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
848 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
849 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
850 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
851 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
852 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
853 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
854 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
855 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
856 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
857 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
858 ; GFX8-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
859 ; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
860 ; GFX8-NEXT:    s_endpgm
862 ; GFX9-LABEL: v_clamp_f64:
863 ; GFX9:       ; %bb.0:
864 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
865 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
866 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
867 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[6:7]
868 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
869 ; GFX9-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
870 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
871 ; GFX9-NEXT:    s_endpgm
873 ; GFX11-LABEL: v_clamp_f64:
874 ; GFX11:       ; %bb.0:
875 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
876 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
877 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
878 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
879 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
880 ; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
881 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
882 ; GFX11-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
883 ; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
884 ; GFX11-NEXT:    s_nop 0
885 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
886 ; GFX11-NEXT:    s_endpgm
888 ; GFX12-LABEL: v_clamp_f64:
889 ; GFX12:       ; %bb.0:
890 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
891 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
892 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
893 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
894 ; GFX12-NEXT:    s_wait_kmcnt 0x0
895 ; GFX12-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
896 ; GFX12-NEXT:    s_wait_loadcnt 0x0
897 ; GFX12-NEXT:    v_max_num_f64_e64 v[0:1], v[0:1], v[0:1] clamp
898 ; GFX12-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
899 ; GFX12-NEXT:    s_nop 0
900 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
901 ; GFX12-NEXT:    s_endpgm
902   %tid = call i32 @llvm.amdgcn.workitem.id.x()
903   %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid
904   %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid
905   %a = load double, ptr addrspace(1) %gep0
906   %max = call double @llvm.maxnum.f64(double %a, double 0.0)
907   %med = call double @llvm.minnum.f64(double %max, double 1.0)
909   store double %med, ptr addrspace(1) %out.gep
910   ret void
913 define amdgpu_kernel void @v_clamp_neg_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
914 ; GFX6-LABEL: v_clamp_neg_f64:
915 ; GFX6:       ; %bb.0:
916 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
917 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
918 ; GFX6-NEXT:    s_mov_b32 s6, 0
919 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
920 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
921 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
922 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
923 ; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
924 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
925 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
926 ; GFX6-NEXT:    v_max_f64 v[2:3], -v[2:3], -v[2:3] clamp
927 ; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
928 ; GFX6-NEXT:    s_endpgm
930 ; GFX8-LABEL: v_clamp_neg_f64:
931 ; GFX8:       ; %bb.0:
932 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
933 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
934 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
935 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
936 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
937 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
938 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
939 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
940 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
941 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
942 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
943 ; GFX8-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
944 ; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
945 ; GFX8-NEXT:    s_endpgm
947 ; GFX9-LABEL: v_clamp_neg_f64:
948 ; GFX9:       ; %bb.0:
949 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
950 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
951 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
952 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[6:7]
953 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
954 ; GFX9-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
955 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
956 ; GFX9-NEXT:    s_endpgm
958 ; GFX11-LABEL: v_clamp_neg_f64:
959 ; GFX11:       ; %bb.0:
960 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
961 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
962 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
963 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
964 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
965 ; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
966 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
967 ; GFX11-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
968 ; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
969 ; GFX11-NEXT:    s_nop 0
970 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
971 ; GFX11-NEXT:    s_endpgm
973 ; GFX12-LABEL: v_clamp_neg_f64:
974 ; GFX12:       ; %bb.0:
975 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
976 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
977 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
978 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
979 ; GFX12-NEXT:    s_wait_kmcnt 0x0
980 ; GFX12-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
981 ; GFX12-NEXT:    s_wait_loadcnt 0x0
982 ; GFX12-NEXT:    v_max_num_f64_e64 v[0:1], -v[0:1], -v[0:1] clamp
983 ; GFX12-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
984 ; GFX12-NEXT:    s_nop 0
985 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
986 ; GFX12-NEXT:    s_endpgm
987   %tid = call i32 @llvm.amdgcn.workitem.id.x()
988   %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid
989   %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid
990   %a = load double, ptr addrspace(1) %gep0
991   %fneg.a = fneg double %a
992   %max = call double @llvm.maxnum.f64(double %fneg.a, double 0.0)
993   %med = call double @llvm.minnum.f64(double %max, double 1.0)
995   store double %med, ptr addrspace(1) %out.gep
996   ret void
999 define amdgpu_kernel void @v_clamp_negabs_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1000 ; GFX6-LABEL: v_clamp_negabs_f64:
1001 ; GFX6:       ; %bb.0:
1002 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1003 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1004 ; GFX6-NEXT:    s_mov_b32 s6, 0
1005 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1006 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1007 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1008 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1009 ; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
1010 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1011 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1012 ; GFX6-NEXT:    v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]| clamp
1013 ; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
1014 ; GFX6-NEXT:    s_endpgm
1016 ; GFX8-LABEL: v_clamp_negabs_f64:
1017 ; GFX8:       ; %bb.0:
1018 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1019 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1020 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1021 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1022 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1023 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1024 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1025 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
1026 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1027 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1028 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1029 ; GFX8-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
1030 ; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1031 ; GFX8-NEXT:    s_endpgm
1033 ; GFX9-LABEL: v_clamp_negabs_f64:
1034 ; GFX9:       ; %bb.0:
1035 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1036 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1037 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1038 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[6:7]
1039 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1040 ; GFX9-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
1041 ; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[4:5]
1042 ; GFX9-NEXT:    s_endpgm
1044 ; GFX11-LABEL: v_clamp_negabs_f64:
1045 ; GFX11:       ; %bb.0:
1046 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1047 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1048 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1049 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1050 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1051 ; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
1052 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1053 ; GFX11-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
1054 ; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
1055 ; GFX11-NEXT:    s_nop 0
1056 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1057 ; GFX11-NEXT:    s_endpgm
1059 ; GFX12-LABEL: v_clamp_negabs_f64:
1060 ; GFX12:       ; %bb.0:
1061 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1062 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1063 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1064 ; GFX12-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1065 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1066 ; GFX12-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
1067 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1068 ; GFX12-NEXT:    v_max_num_f64_e64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
1069 ; GFX12-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
1070 ; GFX12-NEXT:    s_nop 0
1071 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1072 ; GFX12-NEXT:    s_endpgm
1073   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1074   %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid
1075   %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid
1076   %a = load double, ptr addrspace(1) %gep0
1077   %fabs.a = call double @llvm.fabs.f64(double %a)
1078   %fneg.fabs.a = fneg double %fabs.a
1080   %max = call double @llvm.maxnum.f64(double %fneg.fabs.a, double 0.0)
1081   %med = call double @llvm.minnum.f64(double %max, double 1.0)
1083   store double %med, ptr addrspace(1) %out.gep
1084   ret void
1087 define amdgpu_kernel void @v_clamp_med3_aby_negzero_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1088 ; GFX6-LABEL: v_clamp_med3_aby_negzero_f32:
1089 ; GFX6:       ; %bb.0:
1090 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1091 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1092 ; GFX6-NEXT:    s_mov_b32 s6, 0
1093 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1094 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1095 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1096 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1097 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1098 ; GFX6-NEXT:    s_brev_b32 s4, 1
1099 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1100 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1101 ; GFX6-NEXT:    v_med3_f32 v2, s4, 1.0, v2
1102 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1103 ; GFX6-NEXT:    s_endpgm
1105 ; GFX8-LABEL: v_clamp_med3_aby_negzero_f32:
1106 ; GFX8:       ; %bb.0:
1107 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1108 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1109 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1110 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1111 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1112 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1113 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1114 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1115 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1116 ; GFX8-NEXT:    s_brev_b32 s0, 1
1117 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1118 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1119 ; GFX8-NEXT:    v_med3_f32 v2, s0, 1.0, v3
1120 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1121 ; GFX8-NEXT:    s_endpgm
1123 ; GFX9-LABEL: v_clamp_med3_aby_negzero_f32:
1124 ; GFX9:       ; %bb.0:
1125 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1126 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1127 ; GFX9-NEXT:    s_brev_b32 s0, 1
1128 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1129 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1130 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1131 ; GFX9-NEXT:    v_med3_f32 v1, s0, 1.0, v1
1132 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1133 ; GFX9-NEXT:    s_endpgm
1135 ; GFX11-LABEL: v_clamp_med3_aby_negzero_f32:
1136 ; GFX11:       ; %bb.0:
1137 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1138 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1139 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1140 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1141 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1142 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1143 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1144 ; GFX11-NEXT:    v_med3_f32 v1, 0x80000000, 1.0, v1
1145 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1146 ; GFX11-NEXT:    s_nop 0
1147 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1148 ; GFX11-NEXT:    s_endpgm
1150 ; GFX12-LABEL: v_clamp_med3_aby_negzero_f32:
1151 ; GFX12:       ; %bb.0:
1152 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1153 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1154 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1155 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1156 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1157 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1158 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1159 ; GFX12-NEXT:    v_med3_num_f32 v1, 0x80000000, 1.0, v1
1160 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1161 ; GFX12-NEXT:    s_nop 0
1162 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1163 ; GFX12-NEXT:    s_endpgm
1164   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1165   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1166   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1167   %a = load float, ptr addrspace(1) %gep0
1168   %med = call float @llvm.amdgcn.fmed3.f32(float -0.0, float 1.0, float %a)
1169   store float %med, ptr addrspace(1) %out.gep
1170   ret void
1173 define amdgpu_kernel void @v_clamp_med3_aby_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1174 ; GFX6-LABEL: v_clamp_med3_aby_f32:
1175 ; GFX6:       ; %bb.0:
1176 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1177 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1178 ; GFX6-NEXT:    s_mov_b32 s6, 0
1179 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1180 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1181 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1182 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1183 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1184 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1185 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1186 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1187 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1188 ; GFX6-NEXT:    s_endpgm
1190 ; GFX8-LABEL: v_clamp_med3_aby_f32:
1191 ; GFX8:       ; %bb.0:
1192 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1193 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1194 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1195 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1196 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1197 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1198 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1199 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1200 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1201 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1202 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1203 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1204 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1205 ; GFX8-NEXT:    s_endpgm
1207 ; GFX9-LABEL: v_clamp_med3_aby_f32:
1208 ; GFX9:       ; %bb.0:
1209 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1210 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1211 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1212 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1213 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1214 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1215 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1216 ; GFX9-NEXT:    s_endpgm
1218 ; GFX11-LABEL: v_clamp_med3_aby_f32:
1219 ; GFX11:       ; %bb.0:
1220 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1221 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1222 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1223 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1224 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1225 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1226 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1227 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1228 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1229 ; GFX11-NEXT:    s_nop 0
1230 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1231 ; GFX11-NEXT:    s_endpgm
1233 ; GFX12-LABEL: v_clamp_med3_aby_f32:
1234 ; GFX12:       ; %bb.0:
1235 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1236 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1237 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1238 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1239 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1240 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1241 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1242 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1243 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1244 ; GFX12-NEXT:    s_nop 0
1245 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1246 ; GFX12-NEXT:    s_endpgm
1247   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1248   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1249   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1250   %a = load float, ptr addrspace(1) %gep0
1251   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)
1252   store float %med, ptr addrspace(1) %out.gep
1253   ret void
1256 define amdgpu_kernel void @v_clamp_med3_bay_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1257 ; GFX6-LABEL: v_clamp_med3_bay_f32:
1258 ; GFX6:       ; %bb.0:
1259 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1260 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1261 ; GFX6-NEXT:    s_mov_b32 s6, 0
1262 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1263 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1264 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1265 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1266 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1267 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1268 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1269 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1270 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1271 ; GFX6-NEXT:    s_endpgm
1273 ; GFX8-LABEL: v_clamp_med3_bay_f32:
1274 ; GFX8:       ; %bb.0:
1275 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1276 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1277 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1278 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1279 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1280 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1281 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1282 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1283 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1284 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1285 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1286 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1287 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1288 ; GFX8-NEXT:    s_endpgm
1290 ; GFX9-LABEL: v_clamp_med3_bay_f32:
1291 ; GFX9:       ; %bb.0:
1292 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1293 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1294 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1295 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1296 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1297 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1298 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1299 ; GFX9-NEXT:    s_endpgm
1301 ; GFX11-LABEL: v_clamp_med3_bay_f32:
1302 ; GFX11:       ; %bb.0:
1303 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1304 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1305 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1306 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1307 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1308 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1309 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1310 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1311 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1312 ; GFX11-NEXT:    s_nop 0
1313 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1314 ; GFX11-NEXT:    s_endpgm
1316 ; GFX12-LABEL: v_clamp_med3_bay_f32:
1317 ; GFX12:       ; %bb.0:
1318 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1319 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1320 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1321 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1322 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1323 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1324 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1325 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1326 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1327 ; GFX12-NEXT:    s_nop 0
1328 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1329 ; GFX12-NEXT:    s_endpgm
1330   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1331   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1332   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1333   %a = load float, ptr addrspace(1) %gep0
1334   %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)
1335   store float %med, ptr addrspace(1) %out.gep
1336   ret void
1339 define amdgpu_kernel void @v_clamp_med3_yab_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1340 ; GFX6-LABEL: v_clamp_med3_yab_f32:
1341 ; GFX6:       ; %bb.0:
1342 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1343 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1344 ; GFX6-NEXT:    s_mov_b32 s6, 0
1345 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1346 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1347 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1348 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1349 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1350 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1351 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1352 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1353 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1354 ; GFX6-NEXT:    s_endpgm
1356 ; GFX8-LABEL: v_clamp_med3_yab_f32:
1357 ; GFX8:       ; %bb.0:
1358 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1359 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1360 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1361 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1362 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1363 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1364 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1365 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1366 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1367 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1368 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1369 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1370 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1371 ; GFX8-NEXT:    s_endpgm
1373 ; GFX9-LABEL: v_clamp_med3_yab_f32:
1374 ; GFX9:       ; %bb.0:
1375 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1376 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1377 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1378 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1379 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1380 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1381 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1382 ; GFX9-NEXT:    s_endpgm
1384 ; GFX11-LABEL: v_clamp_med3_yab_f32:
1385 ; GFX11:       ; %bb.0:
1386 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1387 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1388 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1389 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1390 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1391 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1392 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1393 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1394 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1395 ; GFX11-NEXT:    s_nop 0
1396 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1397 ; GFX11-NEXT:    s_endpgm
1399 ; GFX12-LABEL: v_clamp_med3_yab_f32:
1400 ; GFX12:       ; %bb.0:
1401 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1402 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1403 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1404 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1405 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1406 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1407 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1408 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1409 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1410 ; GFX12-NEXT:    s_nop 0
1411 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1412 ; GFX12-NEXT:    s_endpgm
1413   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1414   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1415   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1416   %a = load float, ptr addrspace(1) %gep0
1417   %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)
1418   store float %med, ptr addrspace(1) %out.gep
1419   ret void
1422 define amdgpu_kernel void @v_clamp_med3_yba_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1423 ; GFX6-LABEL: v_clamp_med3_yba_f32:
1424 ; GFX6:       ; %bb.0:
1425 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1426 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1427 ; GFX6-NEXT:    s_mov_b32 s6, 0
1428 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1429 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1430 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1431 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1432 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1433 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1434 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1435 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1436 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1437 ; GFX6-NEXT:    s_endpgm
1439 ; GFX8-LABEL: v_clamp_med3_yba_f32:
1440 ; GFX8:       ; %bb.0:
1441 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1442 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1443 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1444 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1445 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1446 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1447 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1448 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1449 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1450 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1451 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1452 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1453 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1454 ; GFX8-NEXT:    s_endpgm
1456 ; GFX9-LABEL: v_clamp_med3_yba_f32:
1457 ; GFX9:       ; %bb.0:
1458 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1459 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1460 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1461 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1462 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1463 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1464 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1465 ; GFX9-NEXT:    s_endpgm
1467 ; GFX11-LABEL: v_clamp_med3_yba_f32:
1468 ; GFX11:       ; %bb.0:
1469 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1470 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1471 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1472 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1473 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1474 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1475 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1476 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1477 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1478 ; GFX11-NEXT:    s_nop 0
1479 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1480 ; GFX11-NEXT:    s_endpgm
1482 ; GFX12-LABEL: v_clamp_med3_yba_f32:
1483 ; GFX12:       ; %bb.0:
1484 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1485 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1486 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1487 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1488 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1489 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1490 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1491 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1492 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1493 ; GFX12-NEXT:    s_nop 0
1494 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1495 ; GFX12-NEXT:    s_endpgm
1496   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1497   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1498   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1499   %a = load float, ptr addrspace(1) %gep0
1500   %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)
1501   store float %med, ptr addrspace(1) %out.gep
1502   ret void
1505 define amdgpu_kernel void @v_clamp_med3_ayb_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1506 ; GFX6-LABEL: v_clamp_med3_ayb_f32:
1507 ; GFX6:       ; %bb.0:
1508 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1509 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1510 ; GFX6-NEXT:    s_mov_b32 s6, 0
1511 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1512 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1513 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1514 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1515 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1516 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1517 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1518 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1519 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1520 ; GFX6-NEXT:    s_endpgm
1522 ; GFX8-LABEL: v_clamp_med3_ayb_f32:
1523 ; GFX8:       ; %bb.0:
1524 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1525 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1526 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1527 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1528 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1529 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1530 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1531 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1532 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1533 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1534 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1535 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1536 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1537 ; GFX8-NEXT:    s_endpgm
1539 ; GFX9-LABEL: v_clamp_med3_ayb_f32:
1540 ; GFX9:       ; %bb.0:
1541 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1542 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1543 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1544 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1545 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1546 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1547 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1548 ; GFX9-NEXT:    s_endpgm
1550 ; GFX11-LABEL: v_clamp_med3_ayb_f32:
1551 ; GFX11:       ; %bb.0:
1552 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1553 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1554 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1555 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1556 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1557 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1558 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1559 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1560 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1561 ; GFX11-NEXT:    s_nop 0
1562 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1563 ; GFX11-NEXT:    s_endpgm
1565 ; GFX12-LABEL: v_clamp_med3_ayb_f32:
1566 ; GFX12:       ; %bb.0:
1567 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1568 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1569 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1570 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1571 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1572 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1573 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1574 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1575 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1576 ; GFX12-NEXT:    s_nop 0
1577 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1578 ; GFX12-NEXT:    s_endpgm
1579   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1580   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1581   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1582   %a = load float, ptr addrspace(1) %gep0
1583   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)
1584   store float %med, ptr addrspace(1) %out.gep
1585   ret void
1588 define amdgpu_kernel void @v_clamp_med3_bya_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
1589 ; GFX6-LABEL: v_clamp_med3_bya_f32:
1590 ; GFX6:       ; %bb.0:
1591 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
1592 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1593 ; GFX6-NEXT:    s_mov_b32 s6, 0
1594 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1595 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1596 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1597 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1598 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1599 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1600 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1601 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1602 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1603 ; GFX6-NEXT:    s_endpgm
1605 ; GFX8-LABEL: v_clamp_med3_bya_f32:
1606 ; GFX8:       ; %bb.0:
1607 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
1608 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1609 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1610 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1611 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1612 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1613 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1614 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1615 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1616 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1617 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1618 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1619 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1620 ; GFX8-NEXT:    s_endpgm
1622 ; GFX9-LABEL: v_clamp_med3_bya_f32:
1623 ; GFX9:       ; %bb.0:
1624 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1625 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1626 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1627 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
1628 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1629 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1630 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
1631 ; GFX9-NEXT:    s_endpgm
1633 ; GFX11-LABEL: v_clamp_med3_bya_f32:
1634 ; GFX11:       ; %bb.0:
1635 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1636 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1637 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1638 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1639 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1640 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1641 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1642 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1643 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1644 ; GFX11-NEXT:    s_nop 0
1645 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1646 ; GFX11-NEXT:    s_endpgm
1648 ; GFX12-LABEL: v_clamp_med3_bya_f32:
1649 ; GFX12:       ; %bb.0:
1650 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
1651 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1652 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1653 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1654 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1655 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
1656 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1657 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
1658 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1659 ; GFX12-NEXT:    s_nop 0
1660 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1661 ; GFX12-NEXT:    s_endpgm
1662   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1663   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
1664   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1665   %a = load float, ptr addrspace(1) %gep0
1666   %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)
1667   store float %med, ptr addrspace(1) %out.gep
1668   ret void
1671 define amdgpu_kernel void @v_clamp_constants_to_one_f32(ptr addrspace(1) %out) #0 {
1672 ; GFX6-LABEL: v_clamp_constants_to_one_f32:
1673 ; GFX6:       ; %bb.0:
1674 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1675 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1676 ; GFX6-NEXT:    s_mov_b32 s2, 0
1677 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1678 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1679 ; GFX6-NEXT:    v_mov_b32_e32 v2, 1.0
1680 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1681 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1682 ; GFX6-NEXT:    s_endpgm
1684 ; GFX8-LABEL: v_clamp_constants_to_one_f32:
1685 ; GFX8:       ; %bb.0:
1686 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1687 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1688 ; GFX8-NEXT:    v_mov_b32_e32 v2, 1.0
1689 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1690 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1691 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1692 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1693 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1694 ; GFX8-NEXT:    s_endpgm
1696 ; GFX9-LABEL: v_clamp_constants_to_one_f32:
1697 ; GFX9:       ; %bb.0:
1698 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1699 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1700 ; GFX9-NEXT:    v_mov_b32_e32 v1, 1.0
1701 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1702 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1703 ; GFX9-NEXT:    s_endpgm
1705 ; GFX11-LABEL: v_clamp_constants_to_one_f32:
1706 ; GFX11:       ; %bb.0:
1707 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1708 ; GFX11-NEXT:    v_dual_mov_b32 v1, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0
1709 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1710 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1711 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1712 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1713 ; GFX11-NEXT:    s_nop 0
1714 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1715 ; GFX11-NEXT:    s_endpgm
1717 ; GFX12-LABEL: v_clamp_constants_to_one_f32:
1718 ; GFX12:       ; %bb.0:
1719 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1720 ; GFX12-NEXT:    v_dual_mov_b32 v1, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0
1721 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1722 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1723 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1724 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1725 ; GFX12-NEXT:    s_nop 0
1726 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1727 ; GFX12-NEXT:    s_endpgm
1728   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1729   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1730   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 4.0)
1731   store float %med, ptr addrspace(1) %out.gep
1732   ret void
1735 define amdgpu_kernel void @v_clamp_constants_to_zero_f32(ptr addrspace(1) %out) #0 {
1736 ; GFX6-LABEL: v_clamp_constants_to_zero_f32:
1737 ; GFX6:       ; %bb.0:
1738 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1739 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1740 ; GFX6-NEXT:    s_mov_b32 s2, 0
1741 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1742 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1743 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1744 ; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1745 ; GFX6-NEXT:    s_endpgm
1747 ; GFX8-LABEL: v_clamp_constants_to_zero_f32:
1748 ; GFX8:       ; %bb.0:
1749 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1750 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1751 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0
1752 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1753 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1754 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1755 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1756 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1757 ; GFX8-NEXT:    s_endpgm
1759 ; GFX9-LABEL: v_clamp_constants_to_zero_f32:
1760 ; GFX9:       ; %bb.0:
1761 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1762 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1763 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1764 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1765 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1766 ; GFX9-NEXT:    s_endpgm
1768 ; GFX11-LABEL: v_clamp_constants_to_zero_f32:
1769 ; GFX11:       ; %bb.0:
1770 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1771 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
1772 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1773 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1774 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1775 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1776 ; GFX11-NEXT:    s_nop 0
1777 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1778 ; GFX11-NEXT:    s_endpgm
1780 ; GFX12-LABEL: v_clamp_constants_to_zero_f32:
1781 ; GFX12:       ; %bb.0:
1782 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1783 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
1784 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1785 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1786 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1787 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1788 ; GFX12-NEXT:    s_nop 0
1789 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1790 ; GFX12-NEXT:    s_endpgm
1791   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1792   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1793   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float -4.0)
1794   store float %med, ptr addrspace(1) %out.gep
1795   ret void
1798 define amdgpu_kernel void @v_clamp_constant_preserve_f32(ptr addrspace(1) %out) #0 {
1799 ; GFX6-LABEL: v_clamp_constant_preserve_f32:
1800 ; GFX6:       ; %bb.0:
1801 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1802 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1803 ; GFX6-NEXT:    s_mov_b32 s2, 0
1804 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1805 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1806 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0.5
1807 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1808 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1809 ; GFX6-NEXT:    s_endpgm
1811 ; GFX8-LABEL: v_clamp_constant_preserve_f32:
1812 ; GFX8:       ; %bb.0:
1813 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1814 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1815 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0.5
1816 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1817 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1818 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1819 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1820 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1821 ; GFX8-NEXT:    s_endpgm
1823 ; GFX9-LABEL: v_clamp_constant_preserve_f32:
1824 ; GFX9:       ; %bb.0:
1825 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1826 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1827 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0.5
1828 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1829 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1830 ; GFX9-NEXT:    s_endpgm
1832 ; GFX11-LABEL: v_clamp_constant_preserve_f32:
1833 ; GFX11:       ; %bb.0:
1834 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1835 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0.5 :: v_dual_and_b32 v0, 0x3ff, v0
1836 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1837 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1838 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1839 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1840 ; GFX11-NEXT:    s_nop 0
1841 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1842 ; GFX11-NEXT:    s_endpgm
1844 ; GFX12-LABEL: v_clamp_constant_preserve_f32:
1845 ; GFX12:       ; %bb.0:
1846 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1847 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0.5 :: v_dual_and_b32 v0, 0x3ff, v0
1848 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1849 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1850 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1851 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1852 ; GFX12-NEXT:    s_nop 0
1853 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1854 ; GFX12-NEXT:    s_endpgm
1855   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1856   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1857   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0.5)
1858   store float %med, ptr addrspace(1) %out.gep
1859   ret void
1862 define amdgpu_kernel void @v_clamp_constant_preserve_denorm_f32(ptr addrspace(1) %out) #0 {
1863 ; GFX6-LABEL: v_clamp_constant_preserve_denorm_f32:
1864 ; GFX6:       ; %bb.0:
1865 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1866 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1867 ; GFX6-NEXT:    s_mov_b32 s2, 0
1868 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1869 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1870 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7fffff
1871 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1872 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1873 ; GFX6-NEXT:    s_endpgm
1875 ; GFX8-LABEL: v_clamp_constant_preserve_denorm_f32:
1876 ; GFX8:       ; %bb.0:
1877 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1878 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1879 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7fffff
1880 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1881 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1882 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1883 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1884 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1885 ; GFX8-NEXT:    s_endpgm
1887 ; GFX9-LABEL: v_clamp_constant_preserve_denorm_f32:
1888 ; GFX9:       ; %bb.0:
1889 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1890 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1891 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7fffff
1892 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1893 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1894 ; GFX9-NEXT:    s_endpgm
1896 ; GFX11-LABEL: v_clamp_constant_preserve_denorm_f32:
1897 ; GFX11:       ; %bb.0:
1898 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1899 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1900 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1901 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0x7fffff :: v_dual_lshlrev_b32 v0, 2, v0
1902 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1903 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1904 ; GFX11-NEXT:    s_nop 0
1905 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1906 ; GFX11-NEXT:    s_endpgm
1908 ; GFX12-LABEL: v_clamp_constant_preserve_denorm_f32:
1909 ; GFX12:       ; %bb.0:
1910 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1911 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1912 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1913 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0x7fffff :: v_dual_lshlrev_b32 v0, 2, v0
1914 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1915 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1916 ; GFX12-NEXT:    s_nop 0
1917 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1918 ; GFX12-NEXT:    s_endpgm
1919   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1920   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1921   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 8388607 to float))
1922   store float %med, ptr addrspace(1) %out.gep
1923   ret void
1926 define amdgpu_kernel void @v_clamp_constant_qnan_f32(ptr addrspace(1) %out) #0 {
1927 ; GFX6-LABEL: v_clamp_constant_qnan_f32:
1928 ; GFX6:       ; %bb.0:
1929 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1930 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1931 ; GFX6-NEXT:    s_mov_b32 s2, 0
1932 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1933 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1934 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1935 ; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1936 ; GFX6-NEXT:    s_endpgm
1938 ; GFX8-LABEL: v_clamp_constant_qnan_f32:
1939 ; GFX8:       ; %bb.0:
1940 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1941 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1942 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0
1943 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1944 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1945 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1946 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1947 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1948 ; GFX8-NEXT:    s_endpgm
1950 ; GFX9-LABEL: v_clamp_constant_qnan_f32:
1951 ; GFX9:       ; %bb.0:
1952 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
1953 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1954 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1955 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1956 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1957 ; GFX9-NEXT:    s_endpgm
1959 ; GFX11-LABEL: v_clamp_constant_qnan_f32:
1960 ; GFX11:       ; %bb.0:
1961 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1962 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
1963 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1964 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1965 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1966 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1967 ; GFX11-NEXT:    s_nop 0
1968 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1969 ; GFX11-NEXT:    s_endpgm
1971 ; GFX12-LABEL: v_clamp_constant_qnan_f32:
1972 ; GFX12:       ; %bb.0:
1973 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
1974 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
1975 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1976 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1977 ; GFX12-NEXT:    s_wait_kmcnt 0x0
1978 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
1979 ; GFX12-NEXT:    s_nop 0
1980 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1981 ; GFX12-NEXT:    s_endpgm
1982   %tid = call i32 @llvm.amdgcn.workitem.id.x()
1983   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
1984   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)
1985   store float %med, ptr addrspace(1) %out.gep
1986   ret void
1989 define amdgpu_kernel void @v_clamp_constant_snan_f32(ptr addrspace(1) %out) #0 {
1990 ; GFX6-LABEL: v_clamp_constant_snan_f32:
1991 ; GFX6:       ; %bb.0:
1992 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
1993 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1994 ; GFX6-NEXT:    s_mov_b32 s2, 0
1995 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1996 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1997 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1998 ; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1999 ; GFX6-NEXT:    s_endpgm
2001 ; GFX8-LABEL: v_clamp_constant_snan_f32:
2002 ; GFX8:       ; %bb.0:
2003 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
2004 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2005 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0
2006 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2007 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2008 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
2009 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2010 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2011 ; GFX8-NEXT:    s_endpgm
2013 ; GFX9-LABEL: v_clamp_constant_snan_f32:
2014 ; GFX9:       ; %bb.0:
2015 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
2016 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2017 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0
2018 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2019 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2020 ; GFX9-NEXT:    s_endpgm
2022 ; GFX11-LABEL: v_clamp_constant_snan_f32:
2023 ; GFX11:       ; %bb.0:
2024 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
2025 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
2026 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2027 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2028 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2029 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2030 ; GFX11-NEXT:    s_nop 0
2031 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2032 ; GFX11-NEXT:    s_endpgm
2034 ; GFX12-LABEL: v_clamp_constant_snan_f32:
2035 ; GFX12:       ; %bb.0:
2036 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
2037 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
2038 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2039 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2040 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2041 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2042 ; GFX12-NEXT:    s_nop 0
2043 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2044 ; GFX12-NEXT:    s_endpgm
2045   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2046   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2047   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))
2048   store float %med, ptr addrspace(1) %out.gep
2049   ret void
2052 ; ---------------------------------------------------------------------
2053 ; Test non-default behaviors enabling snans and disabling dx10_clamp
2054 ; ---------------------------------------------------------------------
2056 define amdgpu_kernel void @v_clamp_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2057 ; GFX6-LABEL: v_clamp_f32_no_dx10_clamp:
2058 ; GFX6:       ; %bb.0:
2059 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2060 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2061 ; GFX6-NEXT:    s_mov_b32 s6, 0
2062 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2063 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2064 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2065 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2066 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2067 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2068 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2069 ; GFX6-NEXT:    v_add_f32_e32 v2, 0.5, v2
2070 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2071 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2072 ; GFX6-NEXT:    s_endpgm
2074 ; GFX8-LABEL: v_clamp_f32_no_dx10_clamp:
2075 ; GFX8:       ; %bb.0:
2076 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2077 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2078 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2079 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2080 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2081 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2082 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2083 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2084 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2085 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2086 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2087 ; GFX8-NEXT:    v_add_f32_e32 v2, 0.5, v3
2088 ; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2089 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2090 ; GFX8-NEXT:    s_endpgm
2092 ; GFX9-LABEL: v_clamp_f32_no_dx10_clamp:
2093 ; GFX9:       ; %bb.0:
2094 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2095 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2096 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2097 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2098 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2099 ; GFX9-NEXT:    v_add_f32_e32 v1, 0.5, v1
2100 ; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2101 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2102 ; GFX9-NEXT:    s_endpgm
2104 ; GFX11-LABEL: v_clamp_f32_no_dx10_clamp:
2105 ; GFX11:       ; %bb.0:
2106 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2107 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2108 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
2109 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2110 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2111 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2112 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2113 ; GFX11-NEXT:    v_add_f32_e32 v1, 0.5, v1
2114 ; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2115 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2116 ; GFX11-NEXT:    s_nop 0
2117 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2118 ; GFX11-NEXT:    s_endpgm
2120 ; GFX12-LABEL: v_clamp_f32_no_dx10_clamp:
2121 ; GFX12:       ; %bb.0:
2122 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2123 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2124 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2125 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2126 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2127 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2128 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2129 ; GFX12-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
2130 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2131 ; GFX12-NEXT:    s_nop 0
2132 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2133 ; GFX12-NEXT:    s_endpgm
2134   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2135   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2136   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2137   %a = load float, ptr addrspace(1) %gep0
2138   %a.nnan = fadd nnan float %a, 0.5
2139   %max = call float @llvm.maxnum.f32(float %a.nnan, float 0.0)
2140   %med = call float @llvm.minnum.f32(float %max, float 1.0)
2142   store float %med, ptr addrspace(1) %out.gep
2143   ret void
2146 define amdgpu_kernel void @v_clamp_f32_snan_dx10clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #3 {
2147 ; GFX6-LABEL: v_clamp_f32_snan_dx10clamp:
2148 ; GFX6:       ; %bb.0:
2149 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2150 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2151 ; GFX6-NEXT:    s_mov_b32 s6, 0
2152 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2153 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2154 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2155 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2156 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2157 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2158 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2159 ; GFX6-NEXT:    v_add_f32_e64 v2, v2, 0.5 clamp
2160 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2161 ; GFX6-NEXT:    s_endpgm
2163 ; GFX8-LABEL: v_clamp_f32_snan_dx10clamp:
2164 ; GFX8:       ; %bb.0:
2165 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2166 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2167 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2168 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2169 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2170 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2171 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2172 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2173 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2174 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2175 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2176 ; GFX8-NEXT:    v_add_f32_e64 v2, v3, 0.5 clamp
2177 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2178 ; GFX8-NEXT:    s_endpgm
2180 ; GFX9-LABEL: v_clamp_f32_snan_dx10clamp:
2181 ; GFX9:       ; %bb.0:
2182 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2183 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2184 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2185 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2186 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2187 ; GFX9-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
2188 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2189 ; GFX9-NEXT:    s_endpgm
2191 ; GFX11-LABEL: v_clamp_f32_snan_dx10clamp:
2192 ; GFX11:       ; %bb.0:
2193 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2194 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2195 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2196 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2197 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2198 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2199 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2200 ; GFX11-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
2201 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2202 ; GFX11-NEXT:    s_nop 0
2203 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2204 ; GFX11-NEXT:    s_endpgm
2206 ; GFX12-LABEL: v_clamp_f32_snan_dx10clamp:
2207 ; GFX12:       ; %bb.0:
2208 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2209 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2210 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2211 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2212 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2213 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2214 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2215 ; GFX12-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
2216 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2217 ; GFX12-NEXT:    s_nop 0
2218 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2219 ; GFX12-NEXT:    s_endpgm
2220   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2221   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2222   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2223   %a = load float, ptr addrspace(1) %gep0
2224   %add = fadd float %a, 0.5
2225   %max = call float @llvm.maxnum.f32(float %add, float 0.0)
2226   %med = call float @llvm.minnum.f32(float %max, float 1.0)
2228   store float %med, ptr addrspace(1) %out.gep
2229   ret void
2232 define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #4 {
2233 ; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp:
2234 ; GFX6:       ; %bb.0:
2235 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2236 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2237 ; GFX6-NEXT:    s_mov_b32 s6, 0
2238 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2239 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2240 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2241 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2242 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2243 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2244 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2245 ; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
2246 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2247 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2248 ; GFX6-NEXT:    s_endpgm
2250 ; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp:
2251 ; GFX8:       ; %bb.0:
2252 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2253 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2254 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2255 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2256 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2257 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2258 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2259 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2260 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2261 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2262 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2263 ; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
2264 ; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2265 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2266 ; GFX8-NEXT:    s_endpgm
2268 ; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp:
2269 ; GFX9:       ; %bb.0:
2270 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2271 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2272 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2273 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2274 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2275 ; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
2276 ; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2277 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2278 ; GFX9-NEXT:    s_endpgm
2280 ; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp:
2281 ; GFX11:       ; %bb.0:
2282 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2283 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2284 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
2285 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2286 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2287 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2288 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2289 ; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
2290 ; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2291 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2292 ; GFX11-NEXT:    s_nop 0
2293 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2294 ; GFX11-NEXT:    s_endpgm
2296 ; GFX12-LABEL: v_clamp_f32_snan_no_dx10clamp:
2297 ; GFX12:       ; %bb.0:
2298 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2299 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2300 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2301 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2302 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2303 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2304 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2305 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2306 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2307 ; GFX12-NEXT:    s_nop 0
2308 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2309 ; GFX12-NEXT:    s_endpgm
2310   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2311   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2312   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2313   %a = load float, ptr addrspace(1) %gep0
2314   %max = call float @llvm.maxnum.f32(float %a, float 0.0)
2315   %med = call float @llvm.minnum.f32(float %max, float 1.0)
2317   store float %med, ptr addrspace(1) %out.gep
2318   ret void
2321 define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp_nnan_src(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #4 {
2322 ; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
2323 ; GFX6:       ; %bb.0:
2324 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2325 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2326 ; GFX6-NEXT:    s_mov_b32 s6, 0
2327 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2328 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2329 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2330 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2331 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2332 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2333 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2334 ; GFX6-NEXT:    v_add_f32_e32 v2, 1.0, v2
2335 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2336 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2337 ; GFX6-NEXT:    s_endpgm
2339 ; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
2340 ; GFX8:       ; %bb.0:
2341 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2342 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2343 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2344 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2345 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2346 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2347 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2348 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2349 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2350 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2351 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2352 ; GFX8-NEXT:    v_add_f32_e32 v2, 1.0, v3
2353 ; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2354 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2355 ; GFX8-NEXT:    s_endpgm
2357 ; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
2358 ; GFX9:       ; %bb.0:
2359 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2360 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2361 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2362 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2363 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2364 ; GFX9-NEXT:    v_add_f32_e32 v1, 1.0, v1
2365 ; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2366 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2367 ; GFX9-NEXT:    s_endpgm
2369 ; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
2370 ; GFX11:       ; %bb.0:
2371 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2372 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2373 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
2374 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2375 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2376 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2377 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2378 ; GFX11-NEXT:    v_add_f32_e32 v1, 1.0, v1
2379 ; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2380 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2381 ; GFX11-NEXT:    s_nop 0
2382 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2383 ; GFX11-NEXT:    s_endpgm
2385 ; GFX12-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
2386 ; GFX12:       ; %bb.0:
2387 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2388 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2389 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2390 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2391 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2392 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2393 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2394 ; GFX12-NEXT:    v_add_f32_e64 v1, v1, 1.0 clamp
2395 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2396 ; GFX12-NEXT:    s_nop 0
2397 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2398 ; GFX12-NEXT:    s_endpgm
2399   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2400   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2401   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2402   %a = load float, ptr addrspace(1) %gep0
2403   %add  = fadd nnan float %a, 1.0
2404   %max = call float @llvm.maxnum.f32(float %add, float 0.0)
2405   %med = call float @llvm.minnum.f32(float %max, float 1.0)
2407   store float %med, ptr addrspace(1) %out.gep
2408   ret void
2411 define amdgpu_kernel void @v_clamp_med3_aby_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2412 ; GFX6-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
2413 ; GFX6:       ; %bb.0:
2414 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2415 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2416 ; GFX6-NEXT:    s_mov_b32 s6, 0
2417 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2418 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2419 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2420 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2421 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2422 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2423 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2424 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
2425 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2426 ; GFX6-NEXT:    s_endpgm
2428 ; GFX8-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
2429 ; GFX8:       ; %bb.0:
2430 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2431 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2432 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2433 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2434 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2435 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2436 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2437 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2438 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2439 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2440 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2441 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
2442 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2443 ; GFX8-NEXT:    s_endpgm
2445 ; GFX9-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
2446 ; GFX9:       ; %bb.0:
2447 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2448 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2449 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2450 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2451 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2452 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
2453 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2454 ; GFX9-NEXT:    s_endpgm
2456 ; GFX11-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
2457 ; GFX11:       ; %bb.0:
2458 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2459 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2460 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2461 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2462 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2463 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2464 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2465 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
2466 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2467 ; GFX11-NEXT:    s_nop 0
2468 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2469 ; GFX11-NEXT:    s_endpgm
2471 ; GFX12-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
2472 ; GFX12:       ; %bb.0:
2473 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2474 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2475 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2476 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2477 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2478 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2479 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2480 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2481 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2482 ; GFX12-NEXT:    s_nop 0
2483 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2484 ; GFX12-NEXT:    s_endpgm
2485   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2486   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2487   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2488   %a = load float, ptr addrspace(1) %gep0
2489   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)
2490   store float %med, ptr addrspace(1) %out.gep
2491   ret void
2494 define amdgpu_kernel void @v_clamp_med3_bay_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2495 ; GFX6-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
2496 ; GFX6:       ; %bb.0:
2497 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2498 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2499 ; GFX6-NEXT:    s_mov_b32 s6, 0
2500 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2501 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2502 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2503 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2504 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2505 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2506 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2507 ; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
2508 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2509 ; GFX6-NEXT:    s_endpgm
2511 ; GFX8-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
2512 ; GFX8:       ; %bb.0:
2513 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2514 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2515 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2516 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2517 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2518 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2519 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2520 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2521 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2522 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2523 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2524 ; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
2525 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2526 ; GFX8-NEXT:    s_endpgm
2528 ; GFX9-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
2529 ; GFX9:       ; %bb.0:
2530 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2531 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2532 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2533 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2534 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2535 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
2536 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2537 ; GFX9-NEXT:    s_endpgm
2539 ; GFX11-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
2540 ; GFX11:       ; %bb.0:
2541 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2542 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2543 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2544 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2545 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2546 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2547 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2548 ; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
2549 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2550 ; GFX11-NEXT:    s_nop 0
2551 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2552 ; GFX11-NEXT:    s_endpgm
2554 ; GFX12-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
2555 ; GFX12:       ; %bb.0:
2556 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2557 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2558 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2559 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2560 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2561 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2562 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2563 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2564 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2565 ; GFX12-NEXT:    s_nop 0
2566 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2567 ; GFX12-NEXT:    s_endpgm
2568   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2569   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2570   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2571   %a = load float, ptr addrspace(1) %gep0
2572   %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)
2573   store float %med, ptr addrspace(1) %out.gep
2574   ret void
2577 define amdgpu_kernel void @v_clamp_med3_yab_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2578 ; GFX6-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2579 ; GFX6:       ; %bb.0:
2580 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2581 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2582 ; GFX6-NEXT:    s_mov_b32 s6, 0
2583 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2584 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2585 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2586 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2587 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2588 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2589 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2590 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2591 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2592 ; GFX6-NEXT:    s_endpgm
2594 ; GFX8-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2595 ; GFX8:       ; %bb.0:
2596 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2597 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2598 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2599 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2600 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2601 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2602 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2603 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2604 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2605 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2606 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2607 ; GFX8-NEXT:    v_med3_f32 v2, v3, 0, 1.0
2608 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2609 ; GFX8-NEXT:    s_endpgm
2611 ; GFX9-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2612 ; GFX9:       ; %bb.0:
2613 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2614 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2615 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2616 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2617 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2618 ; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2619 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2620 ; GFX9-NEXT:    s_endpgm
2622 ; GFX11-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2623 ; GFX11:       ; %bb.0:
2624 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2625 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2626 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2627 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2628 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2629 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2630 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2631 ; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2632 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2633 ; GFX11-NEXT:    s_nop 0
2634 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2635 ; GFX11-NEXT:    s_endpgm
2637 ; GFX12-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2638 ; GFX12:       ; %bb.0:
2639 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2640 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2641 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2642 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2643 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2644 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2645 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2646 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2647 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2648 ; GFX12-NEXT:    s_nop 0
2649 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2650 ; GFX12-NEXT:    s_endpgm
2651   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2652   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2653   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2654   %a = load float, ptr addrspace(1) %gep0
2655   %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)
2656   store float %med, ptr addrspace(1) %out.gep
2657   ret void
2660 define amdgpu_kernel void @v_clamp_med3_yba_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2661 ; GFX6-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2662 ; GFX6:       ; %bb.0:
2663 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2664 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2665 ; GFX6-NEXT:    s_mov_b32 s6, 0
2666 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2667 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2668 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2669 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2670 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2671 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2672 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2673 ; GFX6-NEXT:    v_med3_f32 v2, v2, 1.0, 0
2674 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2675 ; GFX6-NEXT:    s_endpgm
2677 ; GFX8-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2678 ; GFX8:       ; %bb.0:
2679 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2680 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2681 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2682 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2683 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2684 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2685 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2686 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2687 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2688 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2689 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2690 ; GFX8-NEXT:    v_med3_f32 v2, v3, 1.0, 0
2691 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2692 ; GFX8-NEXT:    s_endpgm
2694 ; GFX9-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2695 ; GFX9:       ; %bb.0:
2696 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2697 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2698 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2699 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2700 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2701 ; GFX9-NEXT:    v_med3_f32 v1, v1, 1.0, 0
2702 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2703 ; GFX9-NEXT:    s_endpgm
2705 ; GFX11-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2706 ; GFX11:       ; %bb.0:
2707 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2708 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2709 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2710 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2711 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2712 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2713 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2714 ; GFX11-NEXT:    v_med3_f32 v1, v1, 1.0, 0
2715 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2716 ; GFX11-NEXT:    s_nop 0
2717 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2718 ; GFX11-NEXT:    s_endpgm
2720 ; GFX12-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2721 ; GFX12:       ; %bb.0:
2722 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2723 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2724 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2725 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2726 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2727 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2728 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2729 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2730 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2731 ; GFX12-NEXT:    s_nop 0
2732 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2733 ; GFX12-NEXT:    s_endpgm
2734   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2735   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2736   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2737   %a = load float, ptr addrspace(1) %gep0
2738   %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)
2739   store float %med, ptr addrspace(1) %out.gep
2740   ret void
2743 define amdgpu_kernel void @v_clamp_med3_ayb_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2744 ; GFX6-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2745 ; GFX6:       ; %bb.0:
2746 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2747 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2748 ; GFX6-NEXT:    s_mov_b32 s6, 0
2749 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2750 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2751 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2752 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2753 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2754 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2755 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2756 ; GFX6-NEXT:    v_med3_f32 v2, 0, v2, 1.0
2757 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2758 ; GFX6-NEXT:    s_endpgm
2760 ; GFX8-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2761 ; GFX8:       ; %bb.0:
2762 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2763 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2764 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2765 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2766 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2767 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2768 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2769 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2770 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2771 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2772 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2773 ; GFX8-NEXT:    v_med3_f32 v2, 0, v3, 1.0
2774 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2775 ; GFX8-NEXT:    s_endpgm
2777 ; GFX9-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2778 ; GFX9:       ; %bb.0:
2779 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2780 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2781 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2782 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2783 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2784 ; GFX9-NEXT:    v_med3_f32 v1, 0, v1, 1.0
2785 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2786 ; GFX9-NEXT:    s_endpgm
2788 ; GFX11-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2789 ; GFX11:       ; %bb.0:
2790 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2791 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2792 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2793 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2794 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2795 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2796 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2797 ; GFX11-NEXT:    v_med3_f32 v1, 0, v1, 1.0
2798 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2799 ; GFX11-NEXT:    s_nop 0
2800 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2801 ; GFX11-NEXT:    s_endpgm
2803 ; GFX12-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2804 ; GFX12:       ; %bb.0:
2805 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2806 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2807 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2808 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2809 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2810 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2811 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2812 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2813 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2814 ; GFX12-NEXT:    s_nop 0
2815 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2816 ; GFX12-NEXT:    s_endpgm
2817   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2818   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2819   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2820   %a = load float, ptr addrspace(1) %gep0
2821   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)
2822   store float %med, ptr addrspace(1) %out.gep
2823   ret void
2826 define amdgpu_kernel void @v_clamp_med3_bya_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {
2827 ; GFX6-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2828 ; GFX6:       ; %bb.0:
2829 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
2830 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2831 ; GFX6-NEXT:    s_mov_b32 s6, 0
2832 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2833 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2834 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2835 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2836 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2837 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2838 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2839 ; GFX6-NEXT:    v_med3_f32 v2, 1.0, v2, 0
2840 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2841 ; GFX6-NEXT:    s_endpgm
2843 ; GFX8-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2844 ; GFX8:       ; %bb.0:
2845 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
2846 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2847 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2848 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2849 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2850 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2851 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2852 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2853 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2854 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2855 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2856 ; GFX8-NEXT:    v_med3_f32 v2, 1.0, v3, 0
2857 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2858 ; GFX8-NEXT:    s_endpgm
2860 ; GFX9-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2861 ; GFX9:       ; %bb.0:
2862 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2863 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2864 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2865 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
2866 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2867 ; GFX9-NEXT:    v_med3_f32 v1, 1.0, v1, 0
2868 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
2869 ; GFX9-NEXT:    s_endpgm
2871 ; GFX11-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2872 ; GFX11:       ; %bb.0:
2873 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2874 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2875 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2876 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2877 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2878 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2879 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2880 ; GFX11-NEXT:    v_med3_f32 v1, 1.0, v1, 0
2881 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2882 ; GFX11-NEXT:    s_nop 0
2883 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2884 ; GFX11-NEXT:    s_endpgm
2886 ; GFX12-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2887 ; GFX12:       ; %bb.0:
2888 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
2889 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2890 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2891 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2892 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2893 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
2894 ; GFX12-NEXT:    s_wait_loadcnt 0x0
2895 ; GFX12-NEXT:    v_max_num_f32_e64 v1, v1, v1 clamp
2896 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2897 ; GFX12-NEXT:    s_nop 0
2898 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2899 ; GFX12-NEXT:    s_endpgm
2900   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2901   %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid
2902   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2903   %a = load float, ptr addrspace(1) %gep0
2904   %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)
2905   store float %med, ptr addrspace(1) %out.gep
2906   ret void
2909 define amdgpu_kernel void @v_clamp_constant_qnan_f32_no_dx10_clamp(ptr addrspace(1) %out) #2 {
2910 ; GFX6-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2911 ; GFX6:       ; %bb.0:
2912 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
2913 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2914 ; GFX6-NEXT:    s_mov_b32 s2, 0
2915 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2916 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2917 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7fc00000
2918 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2919 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2920 ; GFX6-NEXT:    s_endpgm
2922 ; GFX8-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2923 ; GFX8:       ; %bb.0:
2924 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
2925 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2926 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7fc00000
2927 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2928 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2929 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
2930 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2931 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2932 ; GFX8-NEXT:    s_endpgm
2934 ; GFX9-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2935 ; GFX9:       ; %bb.0:
2936 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
2937 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2938 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7fc00000
2939 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2940 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2941 ; GFX9-NEXT:    s_endpgm
2943 ; GFX11-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2944 ; GFX11:       ; %bb.0:
2945 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
2946 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
2947 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2948 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0x7fc00000 :: v_dual_lshlrev_b32 v0, 2, v0
2949 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2950 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2951 ; GFX11-NEXT:    s_nop 0
2952 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2953 ; GFX11-NEXT:    s_endpgm
2955 ; GFX12-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2956 ; GFX12:       ; %bb.0:
2957 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
2958 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
2959 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2960 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2961 ; GFX12-NEXT:    s_wait_kmcnt 0x0
2962 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
2963 ; GFX12-NEXT:    s_nop 0
2964 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2965 ; GFX12-NEXT:    s_endpgm
2966   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2967   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
2968   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)
2969   store float %med, ptr addrspace(1) %out.gep
2970   ret void
2973 define amdgpu_kernel void @v_clamp_constant_snan_f32_no_dx10_clamp(ptr addrspace(1) %out) #2 {
2974 ; GFX6-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2975 ; GFX6:       ; %bb.0:
2976 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x9
2977 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2978 ; GFX6-NEXT:    s_mov_b32 s2, 0
2979 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2980 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2981 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7f800001
2982 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2983 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2984 ; GFX6-NEXT:    s_endpgm
2986 ; GFX8-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2987 ; GFX8:       ; %bb.0:
2988 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
2989 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2990 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7f800001
2991 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2992 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2993 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
2994 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2995 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2996 ; GFX8-NEXT:    s_endpgm
2998 ; GFX9-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2999 ; GFX9:       ; %bb.0:
3000 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
3001 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3002 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7f800001
3003 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3004 ; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
3005 ; GFX9-NEXT:    s_endpgm
3007 ; GFX11-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
3008 ; GFX11:       ; %bb.0:
3009 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
3010 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3011 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3012 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0x7f800001 :: v_dual_lshlrev_b32 v0, 2, v0
3013 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3014 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3015 ; GFX11-NEXT:    s_nop 0
3016 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3017 ; GFX11-NEXT:    s_endpgm
3019 ; GFX12-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
3020 ; GFX12:       ; %bb.0:
3021 ; GFX12-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
3022 ; GFX12-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0
3023 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3024 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3025 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3026 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3027 ; GFX12-NEXT:    s_nop 0
3028 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3029 ; GFX12-NEXT:    s_endpgm
3030   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3031   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid
3032   %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))
3033   store float %med, ptr addrspace(1) %out.gep
3034   ret void
3037 define amdgpu_kernel void @v_clamp_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3038 ; GFX6-LABEL: v_clamp_v2f16:
3039 ; GFX6:       ; %bb.0:
3040 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3041 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3042 ; GFX6-NEXT:    s_mov_b32 s6, 0
3043 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3044 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3045 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3046 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3047 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3048 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3049 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3050 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3051 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3052 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3053 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3054 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3055 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3056 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3057 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3058 ; GFX6-NEXT:    s_endpgm
3060 ; GFX8-LABEL: v_clamp_v2f16:
3061 ; GFX8:       ; %bb.0:
3062 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3063 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3064 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3065 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3066 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3067 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3068 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3069 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3070 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3071 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3072 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3073 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3074 ; GFX8-NEXT:    v_max_f16_e64 v3, v3, v3 clamp
3075 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3076 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3077 ; GFX8-NEXT:    s_endpgm
3079 ; GFX9-LABEL: v_clamp_v2f16:
3080 ; GFX9:       ; %bb.0:
3081 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3082 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3083 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3084 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3085 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3086 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3087 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3088 ; GFX9-NEXT:    s_endpgm
3090 ; GFX11-LABEL: v_clamp_v2f16:
3091 ; GFX11:       ; %bb.0:
3092 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3093 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3094 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3095 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3096 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3097 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3098 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3099 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3100 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3101 ; GFX11-NEXT:    s_nop 0
3102 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3103 ; GFX11-NEXT:    s_endpgm
3105 ; GFX12-LABEL: v_clamp_v2f16:
3106 ; GFX12:       ; %bb.0:
3107 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3108 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3109 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3110 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3111 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3112 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3113 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3114 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 clamp
3115 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3116 ; GFX12-NEXT:    s_nop 0
3117 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3118 ; GFX12-NEXT:    s_endpgm
3119   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3120   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3121   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3122   %a = load <2 x half>, ptr addrspace(1) %gep0
3123   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> zeroinitializer)
3124   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3126   store <2 x half> %med, ptr addrspace(1) %out.gep
3127   ret void
3130 define amdgpu_kernel void @v_clamp_v2f16_undef_elt(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3131 ; GFX6-LABEL: v_clamp_v2f16_undef_elt:
3132 ; GFX6:       ; %bb.0:
3133 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3134 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3135 ; GFX6-NEXT:    s_mov_b32 s6, 0
3136 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3137 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3138 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3139 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3140 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3141 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x7fc00000
3142 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3143 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3144 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3145 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3146 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
3147 ; GFX6-NEXT:    v_max_f32_e32 v2, 0x7fc00000, v2
3148 ; GFX6-NEXT:    v_med3_f32 v3, v3, 0, v4
3149 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3150 ; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
3151 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3152 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3153 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3154 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3155 ; GFX6-NEXT:    s_endpgm
3157 ; GFX8-LABEL: v_clamp_v2f16_undef_elt:
3158 ; GFX8:       ; %bb.0:
3159 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3160 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3161 ; GFX8-NEXT:    v_mov_b32_e32 v4, 0x7e00
3162 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3163 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3164 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3165 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3166 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3167 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3168 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3169 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3170 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3171 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3172 ; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
3173 ; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
3174 ; GFX8-NEXT:    v_max_f16_e32 v3, 0x7e00, v3
3175 ; GFX8-NEXT:    v_min_f16_e32 v3, 1.0, v3
3176 ; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3177 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3178 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3179 ; GFX8-NEXT:    s_endpgm
3181 ; GFX9-LABEL: v_clamp_v2f16_undef_elt:
3182 ; GFX9:       ; %bb.0:
3183 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3184 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3185 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3186 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3187 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3188 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3189 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3190 ; GFX9-NEXT:    s_endpgm
3192 ; GFX11-LABEL: v_clamp_v2f16_undef_elt:
3193 ; GFX11:       ; %bb.0:
3194 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3195 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3196 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3197 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3198 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3199 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3200 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3201 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3202 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3203 ; GFX11-NEXT:    s_nop 0
3204 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3205 ; GFX11-NEXT:    s_endpgm
3207 ; GFX12-LABEL: v_clamp_v2f16_undef_elt:
3208 ; GFX12:       ; %bb.0:
3209 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3210 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3211 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3212 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3213 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3214 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3215 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3216 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 clamp
3217 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3218 ; GFX12-NEXT:    s_nop 0
3219 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3220 ; GFX12-NEXT:    s_endpgm
3221   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3222   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3223   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3224   %a = load <2 x half>, ptr addrspace(1) %gep0
3225   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>)
3226   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>)
3228   store <2 x half> %med, ptr addrspace(1) %out.gep
3229   ret void
3232 define amdgpu_kernel void @v_clamp_v2f16_not_zero(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3233 ; GFX6-LABEL: v_clamp_v2f16_not_zero:
3234 ; GFX6:       ; %bb.0:
3235 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3236 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3237 ; GFX6-NEXT:    s_mov_b32 s6, 0
3238 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3239 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3240 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3241 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3242 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3243 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3244 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3245 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3246 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3247 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3248 ; GFX6-NEXT:    v_max_f32_e32 v2, 2.0, v2
3249 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3250 ; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
3251 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3252 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3253 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3254 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3255 ; GFX6-NEXT:    s_endpgm
3257 ; GFX8-LABEL: v_clamp_v2f16_not_zero:
3258 ; GFX8:       ; %bb.0:
3259 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3260 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3261 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3262 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3263 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3264 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3265 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3266 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3267 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3268 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3269 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3270 ; GFX8-NEXT:    v_max_f16_e32 v2, v3, v3
3271 ; GFX8-NEXT:    v_max_f16_e32 v2, 2.0, v2
3272 ; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3273 ; GFX8-NEXT:    v_min_f16_e32 v2, 1.0, v2
3274 ; GFX8-NEXT:    v_or_b32_e32 v2, v2, v3
3275 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3276 ; GFX8-NEXT:    s_endpgm
3278 ; GFX9-LABEL: v_clamp_v2f16_not_zero:
3279 ; GFX9:       ; %bb.0:
3280 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3281 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3282 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3283 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3284 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3285 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1
3286 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, 2.0
3287 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]
3288 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3289 ; GFX9-NEXT:    s_endpgm
3291 ; GFX11-LABEL: v_clamp_v2f16_not_zero:
3292 ; GFX11:       ; %bb.0:
3293 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3294 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3295 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3296 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3297 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3298 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3299 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3300 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
3301 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, 2.0
3302 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3303 ; GFX11-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]
3304 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3305 ; GFX11-NEXT:    s_nop 0
3306 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3307 ; GFX11-NEXT:    s_endpgm
3309 ; GFX12-LABEL: v_clamp_v2f16_not_zero:
3310 ; GFX12:       ; %bb.0:
3311 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3312 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3313 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3314 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3315 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3316 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3317 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3318 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
3319 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, 2.0
3320 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3321 ; GFX12-NEXT:    v_pk_min_num_f16 v1, v1, 1.0 op_sel_hi:[1,0]
3322 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3323 ; GFX12-NEXT:    s_nop 0
3324 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3325 ; GFX12-NEXT:    s_endpgm
3326   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3327   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3328   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3329   %a = load <2 x half>, ptr addrspace(1) %gep0
3330   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 2.0, half 0.0>)
3331   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3333   store <2 x half> %med, ptr addrspace(1) %out.gep
3334   ret void
3337 define amdgpu_kernel void @v_clamp_v2f16_not_one(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3338 ; GFX6-LABEL: v_clamp_v2f16_not_one:
3339 ; GFX6:       ; %bb.0:
3340 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3341 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3342 ; GFX6-NEXT:    s_mov_b32 s6, 0
3343 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3344 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3345 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3346 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3347 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3348 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3349 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3350 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3351 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3352 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3353 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3354 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 0
3355 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3356 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3357 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3358 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3359 ; GFX6-NEXT:    s_endpgm
3361 ; GFX8-LABEL: v_clamp_v2f16_not_one:
3362 ; GFX8:       ; %bb.0:
3363 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3364 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3365 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3366 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3367 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3368 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3369 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3370 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3371 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3372 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3373 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3374 ; GFX8-NEXT:    v_max_f16_e32 v2, v3, v3
3375 ; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
3376 ; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3377 ; GFX8-NEXT:    v_min_f16_e32 v2, 0, v2
3378 ; GFX8-NEXT:    v_or_b32_e32 v2, v2, v3
3379 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3380 ; GFX8-NEXT:    s_endpgm
3382 ; GFX9-LABEL: v_clamp_v2f16_not_one:
3383 ; GFX9:       ; %bb.0:
3384 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3385 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3386 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3387 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3388 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3389 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1
3390 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, 0
3391 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]
3392 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3393 ; GFX9-NEXT:    s_endpgm
3395 ; GFX11-LABEL: v_clamp_v2f16_not_one:
3396 ; GFX11:       ; %bb.0:
3397 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3398 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3399 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3400 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3401 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3402 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3403 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3404 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
3405 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, 0
3406 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3407 ; GFX11-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]
3408 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3409 ; GFX11-NEXT:    s_nop 0
3410 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3411 ; GFX11-NEXT:    s_endpgm
3413 ; GFX12-LABEL: v_clamp_v2f16_not_one:
3414 ; GFX12:       ; %bb.0:
3415 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3416 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3417 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3418 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3419 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3420 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3421 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3422 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1
3423 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, 0
3424 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3425 ; GFX12-NEXT:    v_pk_min_num_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]
3426 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3427 ; GFX12-NEXT:    s_nop 0
3428 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3429 ; GFX12-NEXT:    s_endpgm
3430   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3431   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3432   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3433   %a = load <2 x half>, ptr addrspace(1) %gep0
3434   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half 0.0>)
3435   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 0.0, half 1.0>)
3437   store <2 x half> %med, ptr addrspace(1) %out.gep
3438   ret void
3441 define amdgpu_kernel void @v_clamp_neg_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3442 ; GFX6-LABEL: v_clamp_neg_v2f16:
3443 ; GFX6:       ; %bb.0:
3444 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3445 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3446 ; GFX6-NEXT:    s_mov_b32 s6, 0
3447 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3448 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3449 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3450 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3451 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3452 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3453 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3454 ; GFX6-NEXT:    v_xor_b32_e32 v2, 0x80008000, v2
3455 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3456 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3457 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3458 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3459 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3460 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3461 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3462 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3463 ; GFX6-NEXT:    s_endpgm
3465 ; GFX8-LABEL: v_clamp_neg_v2f16:
3466 ; GFX8:       ; %bb.0:
3467 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3468 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3469 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3470 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3471 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3472 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3473 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3474 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3475 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3476 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3477 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3478 ; GFX8-NEXT:    v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3479 ; GFX8-NEXT:    v_max_f16_e64 v3, -v3, -v3 clamp
3480 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3481 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3482 ; GFX8-NEXT:    s_endpgm
3484 ; GFX9-LABEL: v_clamp_neg_v2f16:
3485 ; GFX9:       ; %bb.0:
3486 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3487 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3488 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3489 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3490 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3491 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3492 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3493 ; GFX9-NEXT:    s_endpgm
3495 ; GFX11-LABEL: v_clamp_neg_v2f16:
3496 ; GFX11:       ; %bb.0:
3497 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3498 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3499 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3500 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3501 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3502 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3503 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3504 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3505 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3506 ; GFX11-NEXT:    s_nop 0
3507 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3508 ; GFX11-NEXT:    s_endpgm
3510 ; GFX12-LABEL: v_clamp_neg_v2f16:
3511 ; GFX12:       ; %bb.0:
3512 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3513 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3514 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3515 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3516 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3517 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3518 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3519 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3520 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3521 ; GFX12-NEXT:    s_nop 0
3522 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3523 ; GFX12-NEXT:    s_endpgm
3524   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3525   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3526   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3527   %a = load <2 x half>, ptr addrspace(1) %gep0
3528   %fneg.a = fneg <2 x half> %a
3529   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.a, <2 x half> zeroinitializer)
3530   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3532   store <2 x half> %med, ptr addrspace(1) %out.gep
3533   ret void
3536 define amdgpu_kernel void @v_clamp_negabs_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3537 ; GFX6-LABEL: v_clamp_negabs_v2f16:
3538 ; GFX6:       ; %bb.0:
3539 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3540 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3541 ; GFX6-NEXT:    s_mov_b32 s6, 0
3542 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3543 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3544 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3545 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3546 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3547 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3548 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3549 ; GFX6-NEXT:    v_or_b32_e32 v2, 0x80008000, v2
3550 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3551 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3552 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3553 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3554 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3555 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3556 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3557 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3558 ; GFX6-NEXT:    s_endpgm
3560 ; GFX8-LABEL: v_clamp_negabs_v2f16:
3561 ; GFX8:       ; %bb.0:
3562 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3563 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3564 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3565 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3566 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3567 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3568 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3569 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3570 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3571 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3572 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3573 ; GFX8-NEXT:    v_max_f16_sdwa v2, -|v3|, -|v3| clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3574 ; GFX8-NEXT:    v_max_f16_e64 v3, -|v3|, -|v3| clamp
3575 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3576 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3577 ; GFX8-NEXT:    s_endpgm
3579 ; GFX9-LABEL: v_clamp_negabs_v2f16:
3580 ; GFX9:       ; %bb.0:
3581 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3582 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3583 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3584 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3585 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3586 ; GFX9-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1
3587 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3588 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3589 ; GFX9-NEXT:    s_endpgm
3591 ; GFX11-LABEL: v_clamp_negabs_v2f16:
3592 ; GFX11:       ; %bb.0:
3593 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3594 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3595 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3596 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3597 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3598 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3599 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3600 ; GFX11-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1
3601 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3602 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3603 ; GFX11-NEXT:    s_nop 0
3604 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3605 ; GFX11-NEXT:    s_endpgm
3607 ; GFX12-LABEL: v_clamp_negabs_v2f16:
3608 ; GFX12:       ; %bb.0:
3609 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3610 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3611 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)
3612 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3613 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3614 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3615 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3616 ; GFX12-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1
3617 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
3618 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3619 ; GFX12-NEXT:    s_nop 0
3620 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3621 ; GFX12-NEXT:    s_endpgm
3622   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3623   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3624   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3625   %a = load <2 x half>, ptr addrspace(1) %gep0
3626   %fabs.a = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a)
3627   %fneg.fabs.a = fneg <2 x half> %fabs.a
3629   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.fabs.a, <2 x half> zeroinitializer)
3630   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3632   store <2 x half> %med, ptr addrspace(1) %out.gep
3633   ret void
3636 define amdgpu_kernel void @v_clamp_neglo_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3637 ; GFX6-LABEL: v_clamp_neglo_v2f16:
3638 ; GFX6:       ; %bb.0:
3639 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3640 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3641 ; GFX6-NEXT:    s_mov_b32 s6, 0
3642 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3643 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3644 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3645 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3646 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3647 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3648 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3649 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3650 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3651 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2
3652 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -v2 clamp
3653 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3654 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3655 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3656 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3657 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3658 ; GFX6-NEXT:    s_endpgm
3660 ; GFX8-LABEL: v_clamp_neglo_v2f16:
3661 ; GFX8:       ; %bb.0:
3662 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3663 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3664 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3665 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3666 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3667 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3668 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3669 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3670 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3671 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3672 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3673 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3674 ; GFX8-NEXT:    v_max_f16_e64 v3, -v3, -v3 clamp
3675 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3676 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3677 ; GFX8-NEXT:    s_endpgm
3679 ; GFX9-LABEL: v_clamp_neglo_v2f16:
3680 ; GFX9:       ; %bb.0:
3681 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3682 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3683 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3684 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3685 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3686 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp
3687 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3688 ; GFX9-NEXT:    s_endpgm
3690 ; GFX11-LABEL: v_clamp_neglo_v2f16:
3691 ; GFX11:       ; %bb.0:
3692 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3693 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3694 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3695 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3696 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3697 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3698 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3699 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp
3700 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3701 ; GFX11-NEXT:    s_nop 0
3702 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3703 ; GFX11-NEXT:    s_endpgm
3705 ; GFX12-LABEL: v_clamp_neglo_v2f16:
3706 ; GFX12:       ; %bb.0:
3707 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3708 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3709 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3710 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3711 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3712 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3713 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3714 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] clamp
3715 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3716 ; GFX12-NEXT:    s_nop 0
3717 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3718 ; GFX12-NEXT:    s_endpgm
3719   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3720   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3721   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3722   %a = load <2 x half>, ptr addrspace(1) %gep0
3723   %lo = extractelement <2 x half> %a, i32 0
3724   %neg.lo = fneg half %lo
3725   %neg.lo.vec = insertelement <2 x half> %a, half %neg.lo, i32 0
3726   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.lo.vec, <2 x half> zeroinitializer)
3727   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3729   store <2 x half> %med, ptr addrspace(1) %out.gep
3730   ret void
3733 define amdgpu_kernel void @v_clamp_neghi_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3734 ; GFX6-LABEL: v_clamp_neghi_v2f16:
3735 ; GFX6:       ; %bb.0:
3736 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3737 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3738 ; GFX6-NEXT:    s_mov_b32 s6, 0
3739 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3740 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3741 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3742 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3743 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3744 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3745 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3746 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3747 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, -v3 clamp
3748 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3749 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3750 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3751 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3752 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3753 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3754 ; GFX6-NEXT:    s_endpgm
3756 ; GFX8-LABEL: v_clamp_neghi_v2f16:
3757 ; GFX8:       ; %bb.0:
3758 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3759 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3760 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3761 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3762 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3763 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3764 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3765 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3766 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3767 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3768 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3769 ; GFX8-NEXT:    v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3770 ; GFX8-NEXT:    v_max_f16_e64 v3, v3, v3 clamp
3771 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3772 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3773 ; GFX8-NEXT:    s_endpgm
3775 ; GFX9-LABEL: v_clamp_neghi_v2f16:
3776 ; GFX9:       ; %bb.0:
3777 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3778 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3779 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3780 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3781 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3782 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp
3783 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3784 ; GFX9-NEXT:    s_endpgm
3786 ; GFX11-LABEL: v_clamp_neghi_v2f16:
3787 ; GFX11:       ; %bb.0:
3788 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3789 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3790 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3791 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3792 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3793 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3794 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3795 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp
3796 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3797 ; GFX11-NEXT:    s_nop 0
3798 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3799 ; GFX11-NEXT:    s_endpgm
3801 ; GFX12-LABEL: v_clamp_neghi_v2f16:
3802 ; GFX12:       ; %bb.0:
3803 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3804 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3805 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3806 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3807 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3808 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3809 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3810 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 neg_hi:[1,1] clamp
3811 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3812 ; GFX12-NEXT:    s_nop 0
3813 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3814 ; GFX12-NEXT:    s_endpgm
3815   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3816   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3817   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3818   %a = load <2 x half>, ptr addrspace(1) %gep0
3819   %hi = extractelement <2 x half> %a, i32 1
3820   %neg.hi = fneg half %hi
3821   %neg.hi.vec = insertelement <2 x half> %a, half %neg.hi, i32 1
3822   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.hi.vec, <2 x half> zeroinitializer)
3823   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3825   store <2 x half> %med, ptr addrspace(1) %out.gep
3826   ret void
3829 define amdgpu_kernel void @v_clamp_v2f16_shuffle(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3830 ; GFX6-LABEL: v_clamp_v2f16_shuffle:
3831 ; GFX6:       ; %bb.0:
3832 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3833 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3834 ; GFX6-NEXT:    s_mov_b32 s6, 0
3835 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3836 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3837 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3838 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3839 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3840 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3841 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3842 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3843 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3844 ; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3845 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3846 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3847 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3848 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
3849 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3850 ; GFX6-NEXT:    s_endpgm
3852 ; GFX8-LABEL: v_clamp_v2f16_shuffle:
3853 ; GFX8:       ; %bb.0:
3854 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3855 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3856 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3857 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3858 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3859 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3860 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3861 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3862 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3863 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3864 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3865 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3866 ; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3867 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3868 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3869 ; GFX8-NEXT:    s_endpgm
3871 ; GFX9-LABEL: v_clamp_v2f16_shuffle:
3872 ; GFX9:       ; %bb.0:
3873 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3874 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3875 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3876 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3877 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3878 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp
3879 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3880 ; GFX9-NEXT:    s_endpgm
3882 ; GFX11-LABEL: v_clamp_v2f16_shuffle:
3883 ; GFX11:       ; %bb.0:
3884 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3885 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3886 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3887 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3888 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3889 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3890 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3891 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp
3892 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3893 ; GFX11-NEXT:    s_nop 0
3894 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3895 ; GFX11-NEXT:    s_endpgm
3897 ; GFX12-LABEL: v_clamp_v2f16_shuffle:
3898 ; GFX12:       ; %bb.0:
3899 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3900 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3901 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3902 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3903 ; GFX12-NEXT:    s_wait_kmcnt 0x0
3904 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
3905 ; GFX12-NEXT:    s_wait_loadcnt 0x0
3906 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp
3907 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
3908 ; GFX12-NEXT:    s_nop 0
3909 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3910 ; GFX12-NEXT:    s_endpgm
3911   %tid = call i32 @llvm.amdgcn.workitem.id.x()
3912   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
3913   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
3914   %a = load <2 x half>, ptr addrspace(1) %gep0
3915   %shuf = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 0>
3916   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %shuf, <2 x half> zeroinitializer)
3917   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3919   store <2 x half> %med, ptr addrspace(1) %out.gep
3920   ret void
3923 define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts0(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
3924 ; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts0:
3925 ; GFX6:       ; %bb.0:
3926 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
3927 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3928 ; GFX6-NEXT:    s_mov_b32 s6, 0
3929 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3930 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3931 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3932 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3933 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3934 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x7fc00000
3935 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3936 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3937 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3938 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
3939 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3940 ; GFX6-NEXT:    v_max_f32_e32 v3, 0x7fc00000, v3
3941 ; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v3
3942 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3943 ; GFX6-NEXT:    v_med3_f32 v2, v2, 0, v4
3944 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3945 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3946 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3947 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3948 ; GFX6-NEXT:    s_endpgm
3950 ; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts0:
3951 ; GFX8:       ; %bb.0:
3952 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
3953 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3954 ; GFX8-NEXT:    v_mov_b32_e32 v4, 0x3c00
3955 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3956 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3957 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3958 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3959 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3960 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3961 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3962 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3963 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
3964 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3965 ; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
3966 ; GFX8-NEXT:    v_max_f16_e32 v2, 0x7e00, v2
3967 ; GFX8-NEXT:    v_max_f16_e32 v3, 0, v3
3968 ; GFX8-NEXT:    v_min_f16_e32 v3, 0x7e00, v3
3969 ; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3970 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3971 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
3972 ; GFX8-NEXT:    s_endpgm
3974 ; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts0:
3975 ; GFX9:       ; %bb.0:
3976 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
3977 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3978 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3979 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
3980 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3981 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3982 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
3983 ; GFX9-NEXT:    s_endpgm
3985 ; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts0:
3986 ; GFX11:       ; %bb.0:
3987 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
3988 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
3989 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3990 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3991 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3992 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3993 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3994 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3995 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3996 ; GFX11-NEXT:    s_nop 0
3997 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
3998 ; GFX11-NEXT:    s_endpgm
4000 ; GFX12-LABEL: v_clamp_v2f16_undef_limit_elts0:
4001 ; GFX12:       ; %bb.0:
4002 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
4003 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
4004 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4005 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4006 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4007 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
4008 ; GFX12-NEXT:    s_wait_loadcnt 0x0
4009 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 clamp
4010 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
4011 ; GFX12-NEXT:    s_nop 0
4012 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4013 ; GFX12-NEXT:    s_endpgm
4014   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4015   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
4016   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
4017   %a = load <2 x half>, ptr addrspace(1) %gep0
4018   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half undef>)
4019   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half undef, half 1.0>)
4021   store <2 x half> %med, ptr addrspace(1) %out.gep
4022   ret void
4025 define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts1(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {
4026 ; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts1:
4027 ; GFX6:       ; %bb.0:
4028 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
4029 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
4030 ; GFX6-NEXT:    s_mov_b32 s6, 0
4031 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4032 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
4033 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4034 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
4035 ; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
4036 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x7fc00000
4037 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
4038 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4039 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
4040 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
4041 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
4042 ; GFX6-NEXT:    v_max_f32_e32 v2, 0x7fc00000, v2
4043 ; GFX6-NEXT:    v_med3_f32 v3, v3, 0, v4
4044 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
4045 ; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
4046 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
4047 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
4048 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
4049 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
4050 ; GFX6-NEXT:    s_endpgm
4052 ; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts1:
4053 ; GFX8:       ; %bb.0:
4054 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
4055 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
4056 ; GFX8-NEXT:    v_mov_b32_e32 v4, 0x7e00
4057 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4058 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
4059 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
4060 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4061 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
4062 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
4063 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
4064 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4065 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
4066 ; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
4067 ; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
4068 ; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
4069 ; GFX8-NEXT:    v_max_f16_e32 v3, 0x7e00, v3
4070 ; GFX8-NEXT:    v_min_f16_e32 v3, 1.0, v3
4071 ; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
4072 ; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
4073 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
4074 ; GFX8-NEXT:    s_endpgm
4076 ; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts1:
4077 ; GFX9:       ; %bb.0:
4078 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
4079 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4080 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4081 ; GFX9-NEXT:    global_load_dword v1, v0, s[6:7]
4082 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4083 ; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
4084 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
4085 ; GFX9-NEXT:    s_endpgm
4087 ; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts1:
4088 ; GFX11:       ; %bb.0:
4089 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
4090 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
4091 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4092 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4093 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4094 ; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
4095 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4096 ; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
4097 ; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
4098 ; GFX11-NEXT:    s_nop 0
4099 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4100 ; GFX11-NEXT:    s_endpgm
4102 ; GFX12-LABEL: v_clamp_v2f16_undef_limit_elts1:
4103 ; GFX12:       ; %bb.0:
4104 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
4105 ; GFX12-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
4106 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4107 ; GFX12-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
4108 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4109 ; GFX12-NEXT:    global_load_b32 v1, v0, s[2:3]
4110 ; GFX12-NEXT:    s_wait_loadcnt 0x0
4111 ; GFX12-NEXT:    v_pk_max_num_f16 v1, v1, v1 clamp
4112 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1]
4113 ; GFX12-NEXT:    s_nop 0
4114 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4115 ; GFX12-NEXT:    s_endpgm
4116   %tid = call i32 @llvm.amdgcn.workitem.id.x()
4117   %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid
4118   %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid
4119   %a = load <2 x half>, ptr addrspace(1) %gep0
4120   %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>)
4121   %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>)
4123   store <2 x half> %med, ptr addrspace(1) %out.gep
4124   ret void
4127 define amdgpu_kernel void @v_clamp_diff_source_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0
4128 ; GFX6-LABEL: v_clamp_diff_source_f32:
4129 ; GFX6:       ; %bb.0:
4130 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x9
4131 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4132 ; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
4133 ; GFX6-NEXT:    s_load_dword s2, s[2:3], 0x2
4134 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
4135 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4136 ; GFX6-NEXT:    v_mov_b32_e32 v0, s5
4137 ; GFX6-NEXT:    v_mov_b32_e32 v1, s2
4138 ; GFX6-NEXT:    v_add_f32_e32 v0, s4, v0
4139 ; GFX6-NEXT:    v_add_f32_e32 v1, s4, v1
4140 ; GFX6-NEXT:    v_max_f32_e64 v0, v0, v1 clamp
4141 ; GFX6-NEXT:    s_mov_b32 s2, -1
4142 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:12
4143 ; GFX6-NEXT:    s_endpgm
4145 ; GFX8-LABEL: v_clamp_diff_source_f32:
4146 ; GFX8:       ; %bb.0:
4147 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
4148 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4149 ; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
4150 ; GFX8-NEXT:    s_load_dword s2, s[2:3], 0x8
4151 ; GFX8-NEXT:    s_add_u32 s0, s0, 12
4152 ; GFX8-NEXT:    s_addc_u32 s1, s1, 0
4153 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
4154 ; GFX8-NEXT:    v_mov_b32_e32 v0, s5
4155 ; GFX8-NEXT:    v_mov_b32_e32 v1, s2
4156 ; GFX8-NEXT:    v_add_f32_e32 v0, s4, v0
4157 ; GFX8-NEXT:    v_add_f32_e32 v1, s4, v1
4158 ; GFX8-NEXT:    v_max_f32_e64 v2, v0, v1 clamp
4159 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
4160 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
4161 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
4162 ; GFX8-NEXT:    s_endpgm
4164 ; GFX9-LABEL: v_clamp_diff_source_f32:
4165 ; GFX9:       ; %bb.0:
4166 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
4167 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0
4168 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4169 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[6:7], 0x0
4170 ; GFX9-NEXT:    s_load_dword s2, s[6:7], 0x8
4171 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4172 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
4173 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
4174 ; GFX9-NEXT:    v_add_f32_e32 v1, s0, v1
4175 ; GFX9-NEXT:    v_add_f32_e32 v2, s0, v2
4176 ; GFX9-NEXT:    v_max_f32_e64 v1, v1, v2 clamp
4177 ; GFX9-NEXT:    global_store_dword v0, v1, s[4:5] offset:12
4178 ; GFX9-NEXT:    s_endpgm
4180 ; GFX11-LABEL: v_clamp_diff_source_f32:
4181 ; GFX11:       ; %bb.0:
4182 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
4183 ; GFX11-NEXT:    v_mov_b32_e32 v2, 0
4184 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4185 ; GFX11-NEXT:    s_clause 0x1
4186 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x0
4187 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x8
4188 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4189 ; GFX11-NEXT:    v_add_f32_e64 v0, s4, s5
4190 ; GFX11-NEXT:    v_add_f32_e64 v1, s4, s2
4191 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4192 ; GFX11-NEXT:    v_max_f32_e64 v0, v0, v1 clamp
4193 ; GFX11-NEXT:    global_store_b32 v2, v0, s[0:1] offset:12
4194 ; GFX11-NEXT:    s_nop 0
4195 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4196 ; GFX11-NEXT:    s_endpgm
4198 ; GFX12-LABEL: v_clamp_diff_source_f32:
4199 ; GFX12:       ; %bb.0:
4200 ; GFX12-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
4201 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
4202 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4203 ; GFX12-NEXT:    s_load_b96 s[4:6], s[2:3], 0x0
4204 ; GFX12-NEXT:    s_wait_kmcnt 0x0
4205 ; GFX12-NEXT:    s_add_f32 s2, s4, s5
4206 ; GFX12-NEXT:    s_add_f32 s3, s4, s6
4207 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_3) | instskip(NEXT) | instid1(SALU_CYCLE_3)
4208 ; GFX12-NEXT:    s_max_num_f32 s2, s2, s3
4209 ; GFX12-NEXT:    v_max_num_f32_e64 v1, s2, s2 clamp
4210 ; GFX12-NEXT:    global_store_b32 v0, v1, s[0:1] offset:12
4211 ; GFX12-NEXT:    s_nop 0
4212 ; GFX12-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4213 ; GFX12-NEXT:    s_endpgm
4215   %gep1 = getelementptr float, ptr addrspace(1) %aptr, i32 1
4216   %gep2 = getelementptr float, ptr addrspace(1) %aptr, i32 2
4217   %l0 = load float, ptr addrspace(1) %aptr
4218   %l1 = load float, ptr addrspace(1) %gep1
4219   %l2 = load float, ptr addrspace(1) %gep2
4220   %a = fadd nsz float %l0, %l1
4221   %b = fadd nsz float %l0, %l2
4222   %res = call nsz float @llvm.maxnum.f32(float %a, float %b)
4223   %max = call nsz float @llvm.maxnum.f32(float %res, float 0.0)
4224   %min = call nsz float @llvm.minnum.f32(float %max, float 1.0)
4225   %out.gep = getelementptr float, ptr addrspace(1) %out, i32 3
4226   store float %min, ptr addrspace(1) %out.gep
4227   ret void
4230 declare i32 @llvm.amdgcn.workitem.id.x() #1
4231 declare float @llvm.fabs.f32(float) #1
4232 declare float @llvm.minnum.f32(float, float) #1
4233 declare float @llvm.maxnum.f32(float, float) #1
4234 declare float @llvm.amdgcn.fmed3.f32(float, float, float) #1
4235 declare double @llvm.fabs.f64(double) #1
4236 declare double @llvm.minnum.f64(double, double) #1
4237 declare double @llvm.maxnum.f64(double, double) #1
4238 declare half @llvm.fabs.f16(half) #1
4239 declare half @llvm.minnum.f16(half, half) #1
4240 declare half @llvm.maxnum.f16(half, half) #1
4241 declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #1
4242 declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) #1
4243 declare <2 x half> @llvm.maxnum.v2f16(<2 x half>, <2 x half>) #1
4245 attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
4246 attributes #1 = { nounwind readnone }
4247 attributes #2 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }
4248 attributes #3 = { nounwind "amdgpu-dx10-clamp"="true" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }
4249 attributes #4 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }