Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.minnum.f16.ll
blobb7370ce0fde1abab82427fa8f02f1de38ecfd866
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-- -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=SI %s
3 ; RUN: llc -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
4 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s
5 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx1010 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX10PLUS,GFX10 %s
6 ; RUN: llc -mtriple=amdgcn-- -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GFX10PLUS,GFX11 %s
8 declare half @llvm.minnum.f16(half %a, half %b)
9 declare <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)
10 declare <3 x half> @llvm.minnum.v3f16(<3 x half> %a, <3 x half> %b)
11 declare <4 x half> @llvm.minnum.v4f16(<4 x half> %a, <4 x half> %b)
13 define amdgpu_kernel void @minnum_f16_ieee(
14 ; SI-LABEL: minnum_f16_ieee:
15 ; SI:       ; %bb.0: ; %entry
16 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
17 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
18 ; SI-NEXT:    s_mov_b32 s3, 0xf000
19 ; SI-NEXT:    s_mov_b32 s2, -1
20 ; SI-NEXT:    s_mov_b32 s14, s2
21 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
22 ; SI-NEXT:    s_mov_b32 s12, s6
23 ; SI-NEXT:    s_mov_b32 s13, s7
24 ; SI-NEXT:    s_mov_b32 s15, s3
25 ; SI-NEXT:    s_mov_b32 s10, s2
26 ; SI-NEXT:    s_mov_b32 s11, s3
27 ; SI-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
28 ; SI-NEXT:    s_waitcnt vmcnt(0)
29 ; SI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 glc
30 ; SI-NEXT:    s_waitcnt vmcnt(0)
31 ; SI-NEXT:    s_mov_b32 s0, s4
32 ; SI-NEXT:    s_mov_b32 s1, s5
33 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
34 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
35 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
36 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
37 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
38 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
39 ; SI-NEXT:    buffer_store_short v0, off, s[0:3], 0
40 ; SI-NEXT:    s_endpgm
42 ; VI-LABEL: minnum_f16_ieee:
43 ; VI:       ; %bb.0: ; %entry
44 ; VI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
45 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
46 ; VI-NEXT:    s_mov_b32 s3, 0xf000
47 ; VI-NEXT:    s_mov_b32 s2, -1
48 ; VI-NEXT:    s_mov_b32 s14, s2
49 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
50 ; VI-NEXT:    s_mov_b32 s12, s6
51 ; VI-NEXT:    s_mov_b32 s13, s7
52 ; VI-NEXT:    s_mov_b32 s15, s3
53 ; VI-NEXT:    s_mov_b32 s10, s2
54 ; VI-NEXT:    s_mov_b32 s11, s3
55 ; VI-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
56 ; VI-NEXT:    s_waitcnt vmcnt(0)
57 ; VI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 glc
58 ; VI-NEXT:    s_waitcnt vmcnt(0)
59 ; VI-NEXT:    s_mov_b32 s0, s4
60 ; VI-NEXT:    s_mov_b32 s1, s5
61 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
62 ; VI-NEXT:    v_max_f16_e32 v1, v1, v1
63 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
64 ; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
65 ; VI-NEXT:    s_endpgm
67 ; GFX9-LABEL: minnum_f16_ieee:
68 ; GFX9:       ; %bb.0: ; %entry
69 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
70 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
71 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
72 ; GFX9-NEXT:    s_mov_b32 s2, -1
73 ; GFX9-NEXT:    s_mov_b32 s14, s2
74 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
75 ; GFX9-NEXT:    s_mov_b32 s12, s6
76 ; GFX9-NEXT:    s_mov_b32 s13, s7
77 ; GFX9-NEXT:    s_mov_b32 s15, s3
78 ; GFX9-NEXT:    s_mov_b32 s10, s2
79 ; GFX9-NEXT:    s_mov_b32 s11, s3
80 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc
81 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
82 ; GFX9-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 glc
83 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
84 ; GFX9-NEXT:    s_mov_b32 s0, s4
85 ; GFX9-NEXT:    s_mov_b32 s1, s5
86 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
87 ; GFX9-NEXT:    v_max_f16_e32 v1, v1, v1
88 ; GFX9-NEXT:    v_min_f16_e32 v0, v0, v1
89 ; GFX9-NEXT:    buffer_store_short v0, off, s[0:3], 0
90 ; GFX9-NEXT:    s_endpgm
92 ; GFX10-LABEL: minnum_f16_ieee:
93 ; GFX10:       ; %bb.0: ; %entry
94 ; GFX10-NEXT:    s_clause 0x1
95 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
96 ; GFX10-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
97 ; GFX10-NEXT:    s_mov_b32 s2, -1
98 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
99 ; GFX10-NEXT:    s_mov_b32 s14, s2
100 ; GFX10-NEXT:    s_mov_b32 s15, s3
101 ; GFX10-NEXT:    s_mov_b32 s10, s2
102 ; GFX10-NEXT:    s_mov_b32 s11, s3
103 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
104 ; GFX10-NEXT:    s_mov_b32 s12, s6
105 ; GFX10-NEXT:    s_mov_b32 s13, s7
106 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[12:15], 0 glc dlc
107 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
108 ; GFX10-NEXT:    buffer_load_ushort v1, off, s[8:11], 0 glc dlc
109 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
110 ; GFX10-NEXT:    s_mov_b32 s0, s4
111 ; GFX10-NEXT:    s_mov_b32 s1, s5
112 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
113 ; GFX10-NEXT:    v_max_f16_e32 v1, v1, v1
114 ; GFX10-NEXT:    v_min_f16_e32 v0, v0, v1
115 ; GFX10-NEXT:    buffer_store_short v0, off, s[0:3], 0
116 ; GFX10-NEXT:    s_endpgm
118 ; GFX11-LABEL: minnum_f16_ieee:
119 ; GFX11:       ; %bb.0: ; %entry
120 ; GFX11-NEXT:    s_clause 0x1
121 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
122 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
123 ; GFX11-NEXT:    s_mov_b32 s10, -1
124 ; GFX11-NEXT:    s_mov_b32 s11, 0x31016000
125 ; GFX11-NEXT:    s_mov_b32 s14, s10
126 ; GFX11-NEXT:    s_mov_b32 s15, s11
127 ; GFX11-NEXT:    s_mov_b32 s2, s10
128 ; GFX11-NEXT:    s_mov_b32 s3, s11
129 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
130 ; GFX11-NEXT:    s_mov_b32 s12, s6
131 ; GFX11-NEXT:    s_mov_b32 s13, s7
132 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[12:15], 0 glc dlc
133 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
134 ; GFX11-NEXT:    buffer_load_u16 v1, off, s[0:3], 0 glc dlc
135 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
136 ; GFX11-NEXT:    s_mov_b32 s8, s4
137 ; GFX11-NEXT:    s_mov_b32 s9, s5
138 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
139 ; GFX11-NEXT:    v_max_f16_e32 v1, v1, v1
140 ; GFX11-NEXT:    v_min_f16_e32 v0, v0, v1
141 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[8:11], 0
142 ; GFX11-NEXT:    s_nop 0
143 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
144 ; GFX11-NEXT:    s_endpgm
145     ptr addrspace(1) %r,
146     ptr addrspace(1) %a,
147     ptr addrspace(1) %b) #0 {
148 entry:
149   %a.val = load volatile half, ptr addrspace(1) %a
150   %b.val = load volatile half, ptr addrspace(1) %b
151   %r.val = call half @llvm.minnum.f16(half %a.val, half %b.val)
152   store half %r.val, ptr addrspace(1) %r
153   ret void
156 define amdgpu_ps half @minnum_f16_no_ieee(half %a, half %b) #0 {
157 ; SI-LABEL: minnum_f16_no_ieee:
158 ; SI:       ; %bb.0:
159 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
160 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
161 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
162 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
163 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
164 ; SI-NEXT:    ; return to shader part epilog
166 ; VI-LABEL: minnum_f16_no_ieee:
167 ; VI:       ; %bb.0:
168 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
169 ; VI-NEXT:    ; return to shader part epilog
171 ; GFX9-LABEL: minnum_f16_no_ieee:
172 ; GFX9:       ; %bb.0:
173 ; GFX9-NEXT:    v_min_f16_e32 v0, v0, v1
174 ; GFX9-NEXT:    ; return to shader part epilog
176 ; GFX10PLUS-LABEL: minnum_f16_no_ieee:
177 ; GFX10PLUS:       ; %bb.0:
178 ; GFX10PLUS-NEXT:    v_min_f16_e32 v0, v0, v1
179 ; GFX10PLUS-NEXT:    ; return to shader part epilog
180   %r.val = call half @llvm.minnum.f16(half %a, half %b)
181   ret half %r.val
184 define amdgpu_kernel void @minnum_f16_imm_a(
185 ; SI-LABEL: minnum_f16_imm_a:
186 ; SI:       ; %bb.0: ; %entry
187 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
188 ; SI-NEXT:    s_mov_b32 s7, 0xf000
189 ; SI-NEXT:    s_mov_b32 s6, -1
190 ; SI-NEXT:    s_mov_b32 s10, s6
191 ; SI-NEXT:    s_mov_b32 s11, s7
192 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
193 ; SI-NEXT:    s_mov_b32 s8, s2
194 ; SI-NEXT:    s_mov_b32 s9, s3
195 ; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
196 ; SI-NEXT:    s_mov_b32 s4, s0
197 ; SI-NEXT:    s_mov_b32 s5, s1
198 ; SI-NEXT:    s_waitcnt vmcnt(0)
199 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
200 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
201 ; SI-NEXT:    v_min_f32_e32 v0, 0x40400000, v0
202 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
203 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
204 ; SI-NEXT:    s_endpgm
206 ; VI-LABEL: minnum_f16_imm_a:
207 ; VI:       ; %bb.0: ; %entry
208 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
209 ; VI-NEXT:    s_mov_b32 s7, 0xf000
210 ; VI-NEXT:    s_mov_b32 s6, -1
211 ; VI-NEXT:    s_mov_b32 s10, s6
212 ; VI-NEXT:    s_mov_b32 s11, s7
213 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
214 ; VI-NEXT:    s_mov_b32 s8, s2
215 ; VI-NEXT:    s_mov_b32 s9, s3
216 ; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
217 ; VI-NEXT:    s_mov_b32 s4, s0
218 ; VI-NEXT:    s_mov_b32 s5, s1
219 ; VI-NEXT:    s_waitcnt vmcnt(0)
220 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
221 ; VI-NEXT:    v_min_f16_e32 v0, 0x4200, v0
222 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
223 ; VI-NEXT:    s_endpgm
225 ; GFX9-LABEL: minnum_f16_imm_a:
226 ; GFX9:       ; %bb.0: ; %entry
227 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
228 ; GFX9-NEXT:    s_mov_b32 s7, 0xf000
229 ; GFX9-NEXT:    s_mov_b32 s6, -1
230 ; GFX9-NEXT:    s_mov_b32 s10, s6
231 ; GFX9-NEXT:    s_mov_b32 s11, s7
232 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
233 ; GFX9-NEXT:    s_mov_b32 s8, s2
234 ; GFX9-NEXT:    s_mov_b32 s9, s3
235 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
236 ; GFX9-NEXT:    s_mov_b32 s4, s0
237 ; GFX9-NEXT:    s_mov_b32 s5, s1
238 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
239 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
240 ; GFX9-NEXT:    v_min_f16_e32 v0, 0x4200, v0
241 ; GFX9-NEXT:    buffer_store_short v0, off, s[4:7], 0
242 ; GFX9-NEXT:    s_endpgm
244 ; GFX10-LABEL: minnum_f16_imm_a:
245 ; GFX10:       ; %bb.0: ; %entry
246 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
247 ; GFX10-NEXT:    s_mov_b32 s6, -1
248 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
249 ; GFX10-NEXT:    s_mov_b32 s10, s6
250 ; GFX10-NEXT:    s_mov_b32 s11, s7
251 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX10-NEXT:    s_mov_b32 s8, s2
253 ; GFX10-NEXT:    s_mov_b32 s9, s3
254 ; GFX10-NEXT:    s_mov_b32 s4, s0
255 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
256 ; GFX10-NEXT:    s_mov_b32 s5, s1
257 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
258 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
259 ; GFX10-NEXT:    v_min_f16_e32 v0, 0x4200, v0
260 ; GFX10-NEXT:    buffer_store_short v0, off, s[4:7], 0
261 ; GFX10-NEXT:    s_endpgm
263 ; GFX11-LABEL: minnum_f16_imm_a:
264 ; GFX11:       ; %bb.0: ; %entry
265 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
266 ; GFX11-NEXT:    s_mov_b32 s6, -1
267 ; GFX11-NEXT:    s_mov_b32 s7, 0x31016000
268 ; GFX11-NEXT:    s_mov_b32 s10, s6
269 ; GFX11-NEXT:    s_mov_b32 s11, s7
270 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
271 ; GFX11-NEXT:    s_mov_b32 s8, s2
272 ; GFX11-NEXT:    s_mov_b32 s9, s3
273 ; GFX11-NEXT:    s_mov_b32 s4, s0
274 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[8:11], 0
275 ; GFX11-NEXT:    s_mov_b32 s5, s1
276 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
277 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
278 ; GFX11-NEXT:    v_min_f16_e32 v0, 0x4200, v0
279 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[4:7], 0
280 ; GFX11-NEXT:    s_nop 0
281 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
282 ; GFX11-NEXT:    s_endpgm
283     ptr addrspace(1) %r,
284     ptr addrspace(1) %b) #0 {
285 entry:
286   %b.val = load half, ptr addrspace(1) %b
287   %r.val = call half @llvm.minnum.f16(half 3.0, half %b.val)
288   store half %r.val, ptr addrspace(1) %r
289   ret void
292 define amdgpu_kernel void @minnum_f16_imm_b(
293 ; SI-LABEL: minnum_f16_imm_b:
294 ; SI:       ; %bb.0: ; %entry
295 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
296 ; SI-NEXT:    s_mov_b32 s7, 0xf000
297 ; SI-NEXT:    s_mov_b32 s6, -1
298 ; SI-NEXT:    s_mov_b32 s10, s6
299 ; SI-NEXT:    s_mov_b32 s11, s7
300 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
301 ; SI-NEXT:    s_mov_b32 s8, s2
302 ; SI-NEXT:    s_mov_b32 s9, s3
303 ; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
304 ; SI-NEXT:    s_mov_b32 s4, s0
305 ; SI-NEXT:    s_mov_b32 s5, s1
306 ; SI-NEXT:    s_waitcnt vmcnt(0)
307 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
308 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
309 ; SI-NEXT:    v_min_f32_e32 v0, 4.0, v0
310 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
311 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0
312 ; SI-NEXT:    s_endpgm
314 ; VI-LABEL: minnum_f16_imm_b:
315 ; VI:       ; %bb.0: ; %entry
316 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
317 ; VI-NEXT:    s_mov_b32 s7, 0xf000
318 ; VI-NEXT:    s_mov_b32 s6, -1
319 ; VI-NEXT:    s_mov_b32 s10, s6
320 ; VI-NEXT:    s_mov_b32 s11, s7
321 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
322 ; VI-NEXT:    s_mov_b32 s8, s2
323 ; VI-NEXT:    s_mov_b32 s9, s3
324 ; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
325 ; VI-NEXT:    s_mov_b32 s4, s0
326 ; VI-NEXT:    s_mov_b32 s5, s1
327 ; VI-NEXT:    s_waitcnt vmcnt(0)
328 ; VI-NEXT:    v_max_f16_e32 v0, v0, v0
329 ; VI-NEXT:    v_min_f16_e32 v0, 4.0, v0
330 ; VI-NEXT:    buffer_store_short v0, off, s[4:7], 0
331 ; VI-NEXT:    s_endpgm
333 ; GFX9-LABEL: minnum_f16_imm_b:
334 ; GFX9:       ; %bb.0: ; %entry
335 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
336 ; GFX9-NEXT:    s_mov_b32 s7, 0xf000
337 ; GFX9-NEXT:    s_mov_b32 s6, -1
338 ; GFX9-NEXT:    s_mov_b32 s10, s6
339 ; GFX9-NEXT:    s_mov_b32 s11, s7
340 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
341 ; GFX9-NEXT:    s_mov_b32 s8, s2
342 ; GFX9-NEXT:    s_mov_b32 s9, s3
343 ; GFX9-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
344 ; GFX9-NEXT:    s_mov_b32 s4, s0
345 ; GFX9-NEXT:    s_mov_b32 s5, s1
346 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
347 ; GFX9-NEXT:    v_max_f16_e32 v0, v0, v0
348 ; GFX9-NEXT:    v_min_f16_e32 v0, 4.0, v0
349 ; GFX9-NEXT:    buffer_store_short v0, off, s[4:7], 0
350 ; GFX9-NEXT:    s_endpgm
352 ; GFX10-LABEL: minnum_f16_imm_b:
353 ; GFX10:       ; %bb.0: ; %entry
354 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
355 ; GFX10-NEXT:    s_mov_b32 s6, -1
356 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
357 ; GFX10-NEXT:    s_mov_b32 s10, s6
358 ; GFX10-NEXT:    s_mov_b32 s11, s7
359 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
360 ; GFX10-NEXT:    s_mov_b32 s8, s2
361 ; GFX10-NEXT:    s_mov_b32 s9, s3
362 ; GFX10-NEXT:    s_mov_b32 s4, s0
363 ; GFX10-NEXT:    buffer_load_ushort v0, off, s[8:11], 0
364 ; GFX10-NEXT:    s_mov_b32 s5, s1
365 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
366 ; GFX10-NEXT:    v_max_f16_e32 v0, v0, v0
367 ; GFX10-NEXT:    v_min_f16_e32 v0, 4.0, v0
368 ; GFX10-NEXT:    buffer_store_short v0, off, s[4:7], 0
369 ; GFX10-NEXT:    s_endpgm
371 ; GFX11-LABEL: minnum_f16_imm_b:
372 ; GFX11:       ; %bb.0: ; %entry
373 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
374 ; GFX11-NEXT:    s_mov_b32 s6, -1
375 ; GFX11-NEXT:    s_mov_b32 s7, 0x31016000
376 ; GFX11-NEXT:    s_mov_b32 s10, s6
377 ; GFX11-NEXT:    s_mov_b32 s11, s7
378 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
379 ; GFX11-NEXT:    s_mov_b32 s8, s2
380 ; GFX11-NEXT:    s_mov_b32 s9, s3
381 ; GFX11-NEXT:    s_mov_b32 s4, s0
382 ; GFX11-NEXT:    buffer_load_u16 v0, off, s[8:11], 0
383 ; GFX11-NEXT:    s_mov_b32 s5, s1
384 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
385 ; GFX11-NEXT:    v_max_f16_e32 v0, v0, v0
386 ; GFX11-NEXT:    v_min_f16_e32 v0, 4.0, v0
387 ; GFX11-NEXT:    buffer_store_b16 v0, off, s[4:7], 0
388 ; GFX11-NEXT:    s_nop 0
389 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
390 ; GFX11-NEXT:    s_endpgm
391     ptr addrspace(1) %r,
392     ptr addrspace(1) %a) #0 {
393 entry:
394   %a.val = load half, ptr addrspace(1) %a
395   %r.val = call half @llvm.minnum.f16(half %a.val, half 4.0)
396   store half %r.val, ptr addrspace(1) %r
397   ret void
400 define amdgpu_kernel void @minnum_v2f16_ieee(
401 ; SI-LABEL: minnum_v2f16_ieee:
402 ; SI:       ; %bb.0: ; %entry
403 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
404 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
405 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
406 ; SI-NEXT:    s_load_dword s2, s[6:7], 0x0
407 ; SI-NEXT:    s_load_dword s0, s[0:1], 0x0
408 ; SI-NEXT:    s_mov_b32 s7, 0xf000
409 ; SI-NEXT:    s_mov_b32 s6, -1
410 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
411 ; SI-NEXT:    s_lshr_b32 s1, s2, 16
412 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s0
413 ; SI-NEXT:    s_lshr_b32 s0, s0, 16
414 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s0
415 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s1
416 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s2
417 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
418 ; SI-NEXT:    v_mul_f32_e32 v2, 1.0, v2
419 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v3
420 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
421 ; SI-NEXT:    v_min_f32_e32 v2, v3, v2
422 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
423 ; SI-NEXT:    v_min_f32_e32 v0, v0, v1
424 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
425 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
426 ; SI-NEXT:    v_or_b32_e32 v0, v0, v1
427 ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
428 ; SI-NEXT:    s_endpgm
430 ; VI-LABEL: minnum_v2f16_ieee:
431 ; VI:       ; %bb.0: ; %entry
432 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
433 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
434 ; VI-NEXT:    s_mov_b32 s7, 0xf000
435 ; VI-NEXT:    s_mov_b32 s6, -1
436 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
437 ; VI-NEXT:    s_load_dword s8, s[4:5], 0x0
438 ; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
439 ; VI-NEXT:    s_mov_b32 s4, s0
440 ; VI-NEXT:    s_mov_b32 s5, s1
441 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
442 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
443 ; VI-NEXT:    v_max_f16_e64 v1, s2, s2
444 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
445 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
446 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
447 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
448 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
449 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
450 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
451 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
452 ; VI-NEXT:    s_endpgm
454 ; GFX9-LABEL: minnum_v2f16_ieee:
455 ; GFX9:       ; %bb.0: ; %entry
456 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
457 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
458 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
459 ; GFX9-NEXT:    s_mov_b32 s2, -1
460 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
461 ; GFX9-NEXT:    s_load_dword s10, s[8:9], 0x0
462 ; GFX9-NEXT:    s_load_dword s11, s[6:7], 0x0
463 ; GFX9-NEXT:    s_mov_b32 s0, s4
464 ; GFX9-NEXT:    s_mov_b32 s1, s5
465 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
466 ; GFX9-NEXT:    v_pk_max_f16 v0, s10, s10
467 ; GFX9-NEXT:    v_pk_max_f16 v1, s11, s11
468 ; GFX9-NEXT:    v_pk_min_f16 v0, v1, v0
469 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
470 ; GFX9-NEXT:    s_endpgm
472 ; GFX10-LABEL: minnum_v2f16_ieee:
473 ; GFX10:       ; %bb.0: ; %entry
474 ; GFX10-NEXT:    s_clause 0x1
475 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
476 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
477 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
478 ; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
479 ; GFX10-NEXT:    s_load_dword s1, s[6:7], 0x0
480 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
481 ; GFX10-NEXT:    s_mov_b32 s6, -1
482 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
483 ; GFX10-NEXT:    v_pk_max_f16 v0, s0, s0
484 ; GFX10-NEXT:    v_pk_max_f16 v1, s1, s1
485 ; GFX10-NEXT:    v_pk_min_f16 v0, v1, v0
486 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
487 ; GFX10-NEXT:    s_endpgm
489 ; GFX11-LABEL: minnum_v2f16_ieee:
490 ; GFX11:       ; %bb.0: ; %entry
491 ; GFX11-NEXT:    s_clause 0x1
492 ; GFX11-NEXT:    s_load_b64 s[4:5], s[0:1], 0x34
493 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
494 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
495 ; GFX11-NEXT:    s_load_b32 s4, s[4:5], 0x0
496 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
497 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
498 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
499 ; GFX11-NEXT:    v_pk_max_f16 v0, s4, s4
500 ; GFX11-NEXT:    v_pk_max_f16 v1, s2, s2
501 ; GFX11-NEXT:    s_mov_b32 s2, -1
502 ; GFX11-NEXT:    v_pk_min_f16 v0, v1, v0
503 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
504 ; GFX11-NEXT:    s_nop 0
505 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
506 ; GFX11-NEXT:    s_endpgm
507     ptr addrspace(1) %r,
508     ptr addrspace(1) %a,
509     ptr addrspace(1) %b) #0 {
510 entry:
511   %a.val = load <2 x half>, ptr addrspace(1) %a
512   %b.val = load <2 x half>, ptr addrspace(1) %b
513   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a.val, <2 x half> %b.val)
514   store <2 x half> %r.val, ptr addrspace(1) %r
515   ret void
518 define amdgpu_ps <2 x half> @minnum_v2f16_no_ieee(<2 x half> %a, <2 x half> %b) #0 {
519 ; SI-LABEL: minnum_v2f16_no_ieee:
520 ; SI:       ; %bb.0:
521 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
522 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
523 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
524 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
525 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
526 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
527 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
528 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
529 ; SI-NEXT:    v_min_f32_e32 v0, v0, v2
530 ; SI-NEXT:    v_min_f32_e32 v1, v1, v3
531 ; SI-NEXT:    ; return to shader part epilog
533 ; VI-LABEL: minnum_v2f16_no_ieee:
534 ; VI:       ; %bb.0:
535 ; VI-NEXT:    v_min_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
536 ; VI-NEXT:    v_min_f16_e32 v0, v0, v1
537 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
538 ; VI-NEXT:    ; return to shader part epilog
540 ; GFX9-LABEL: minnum_v2f16_no_ieee:
541 ; GFX9:       ; %bb.0:
542 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, v1
543 ; GFX9-NEXT:    ; return to shader part epilog
545 ; GFX10PLUS-LABEL: minnum_v2f16_no_ieee:
546 ; GFX10PLUS:       ; %bb.0:
547 ; GFX10PLUS-NEXT:    v_pk_min_f16 v0, v0, v1
548 ; GFX10PLUS-NEXT:    ; return to shader part epilog
549   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)
550   ret <2 x half> %r.val
553 define amdgpu_kernel void @minnum_v2f16_imm_a(
554 ; SI-LABEL: minnum_v2f16_imm_a:
555 ; SI:       ; %bb.0: ; %entry
556 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
557 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
558 ; SI-NEXT:    s_load_dword s2, s[2:3], 0x0
559 ; SI-NEXT:    s_mov_b32 s3, 0xf000
560 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
561 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s2
562 ; SI-NEXT:    s_lshr_b32 s2, s2, 16
563 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s2
564 ; SI-NEXT:    s_mov_b32 s2, -1
565 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
566 ; SI-NEXT:    v_min_f32_e32 v0, 0x40400000, v0
567 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
568 ; SI-NEXT:    v_min_f32_e32 v1, 4.0, v1
569 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
570 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
571 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
572 ; SI-NEXT:    v_or_b32_e32 v0, v0, v1
573 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
574 ; SI-NEXT:    s_endpgm
576 ; VI-LABEL: minnum_v2f16_imm_a:
577 ; VI:       ; %bb.0: ; %entry
578 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
579 ; VI-NEXT:    v_mov_b32_e32 v2, 0x4400
580 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
581 ; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
582 ; VI-NEXT:    s_mov_b32 s3, 0xf000
583 ; VI-NEXT:    s_mov_b32 s2, -1
584 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
585 ; VI-NEXT:    v_max_f16_e64 v0, s4, s4
586 ; VI-NEXT:    s_lshr_b32 s4, s4, 16
587 ; VI-NEXT:    v_max_f16_e64 v1, s4, s4
588 ; VI-NEXT:    v_min_f16_e32 v0, 0x4200, v0
589 ; VI-NEXT:    v_min_f16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
590 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
591 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
592 ; VI-NEXT:    s_endpgm
594 ; GFX9-LABEL: minnum_v2f16_imm_a:
595 ; GFX9:       ; %bb.0: ; %entry
596 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
597 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
598 ; GFX9-NEXT:    s_load_dword s4, s[2:3], 0x0
599 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
600 ; GFX9-NEXT:    s_mov_b32 s2, -1
601 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
602 ; GFX9-NEXT:    v_pk_max_f16 v0, s4, s4
603 ; GFX9-NEXT:    s_mov_b32 s4, 0x44004200
604 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, s4
605 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
606 ; GFX9-NEXT:    s_endpgm
608 ; GFX10-LABEL: minnum_v2f16_imm_a:
609 ; GFX10:       ; %bb.0: ; %entry
610 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
611 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
612 ; GFX10-NEXT:    s_load_dword s2, s[2:3], 0x0
613 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
614 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX10-NEXT:    v_pk_max_f16 v0, s2, s2
616 ; GFX10-NEXT:    s_mov_b32 s2, -1
617 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x44004200, v0
618 ; GFX10-NEXT:    buffer_store_dword v0, off, s[0:3], 0
619 ; GFX10-NEXT:    s_endpgm
621 ; GFX11-LABEL: minnum_v2f16_imm_a:
622 ; GFX11:       ; %bb.0: ; %entry
623 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
624 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
625 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
626 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
627 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
628 ; GFX11-NEXT:    v_pk_max_f16 v0, s2, s2
629 ; GFX11-NEXT:    s_mov_b32 s2, -1
630 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x44004200, v0
631 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
632 ; GFX11-NEXT:    s_nop 0
633 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
634 ; GFX11-NEXT:    s_endpgm
635     ptr addrspace(1) %r,
636     ptr addrspace(1) %b) #0 {
637 entry:
638   %b.val = load <2 x half>, ptr addrspace(1) %b
639   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> <half 3.0, half 4.0>, <2 x half> %b.val)
640   store <2 x half> %r.val, ptr addrspace(1) %r
641   ret void
644 define amdgpu_kernel void @minnum_v2f16_imm_b(
645 ; SI-LABEL: minnum_v2f16_imm_b:
646 ; SI:       ; %bb.0: ; %entry
647 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
648 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
649 ; SI-NEXT:    s_load_dword s2, s[2:3], 0x0
650 ; SI-NEXT:    s_mov_b32 s3, 0xf000
651 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
652 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s2
653 ; SI-NEXT:    s_lshr_b32 s2, s2, 16
654 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s2
655 ; SI-NEXT:    s_mov_b32 s2, -1
656 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
657 ; SI-NEXT:    v_min_f32_e32 v0, 4.0, v0
658 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
659 ; SI-NEXT:    v_min_f32_e32 v1, 0x40400000, v1
660 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
661 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
662 ; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
663 ; SI-NEXT:    v_or_b32_e32 v0, v0, v1
664 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
665 ; SI-NEXT:    s_endpgm
667 ; VI-LABEL: minnum_v2f16_imm_b:
668 ; VI:       ; %bb.0: ; %entry
669 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
670 ; VI-NEXT:    v_mov_b32_e32 v2, 0x4200
671 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
672 ; VI-NEXT:    s_load_dword s4, s[2:3], 0x0
673 ; VI-NEXT:    s_mov_b32 s3, 0xf000
674 ; VI-NEXT:    s_mov_b32 s2, -1
675 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
676 ; VI-NEXT:    v_max_f16_e64 v0, s4, s4
677 ; VI-NEXT:    s_lshr_b32 s4, s4, 16
678 ; VI-NEXT:    v_max_f16_e64 v1, s4, s4
679 ; VI-NEXT:    v_min_f16_e32 v0, 4.0, v0
680 ; VI-NEXT:    v_min_f16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
681 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
682 ; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
683 ; VI-NEXT:    s_endpgm
685 ; GFX9-LABEL: minnum_v2f16_imm_b:
686 ; GFX9:       ; %bb.0: ; %entry
687 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
688 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
689 ; GFX9-NEXT:    s_load_dword s4, s[2:3], 0x0
690 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
691 ; GFX9-NEXT:    s_mov_b32 s2, -1
692 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
693 ; GFX9-NEXT:    v_pk_max_f16 v0, s4, s4
694 ; GFX9-NEXT:    s_mov_b32 s4, 0x42004400
695 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, s4
696 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
697 ; GFX9-NEXT:    s_endpgm
699 ; GFX10-LABEL: minnum_v2f16_imm_b:
700 ; GFX10:       ; %bb.0: ; %entry
701 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
702 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
703 ; GFX10-NEXT:    s_load_dword s2, s[2:3], 0x0
704 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
705 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
706 ; GFX10-NEXT:    v_pk_max_f16 v0, s2, s2
707 ; GFX10-NEXT:    s_mov_b32 s2, -1
708 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x42004400, v0
709 ; GFX10-NEXT:    buffer_store_dword v0, off, s[0:3], 0
710 ; GFX10-NEXT:    s_endpgm
712 ; GFX11-LABEL: minnum_v2f16_imm_b:
713 ; GFX11:       ; %bb.0: ; %entry
714 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
715 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
716 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
717 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
718 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
719 ; GFX11-NEXT:    v_pk_max_f16 v0, s2, s2
720 ; GFX11-NEXT:    s_mov_b32 s2, -1
721 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x42004400, v0
722 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
723 ; GFX11-NEXT:    s_nop 0
724 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
725 ; GFX11-NEXT:    s_endpgm
726     ptr addrspace(1) %r,
727     ptr addrspace(1) %a) #0 {
728 entry:
729   %a.val = load <2 x half>, ptr addrspace(1) %a
730   %r.val = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a.val, <2 x half> <half 4.0, half 3.0>)
731   store <2 x half> %r.val, ptr addrspace(1) %r
732   ret void
735 ; FIXME: Scalarize with undef half
736 define amdgpu_kernel void @minnum_v3f16(
737 ; SI-LABEL: minnum_v3f16:
738 ; SI:       ; %bb.0: ; %entry
739 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
740 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xd
741 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
742 ; SI-NEXT:    s_load_dwordx2 s[2:3], s[6:7], 0x0
743 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
744 ; SI-NEXT:    s_mov_b32 s7, 0xf000
745 ; SI-NEXT:    s_mov_b32 s6, -1
746 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
747 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s3
748 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s2
749 ; SI-NEXT:    s_lshr_b32 s2, s2, 16
750 ; SI-NEXT:    s_lshr_b32 s3, s0, 16
751 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s3
752 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s2
753 ; SI-NEXT:    v_cvt_f32_f16_e32 v5, s0
754 ; SI-NEXT:    v_cvt_f32_f16_e32 v4, s1
755 ; SI-NEXT:    v_mul_f32_e32 v2, 1.0, v2
756 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v3
757 ; SI-NEXT:    v_min_f32_e32 v2, v3, v2
758 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v5
759 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
760 ; SI-NEXT:    v_min_f32_e32 v1, v1, v3
761 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v4
762 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
763 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
764 ; SI-NEXT:    v_min_f32_e32 v0, v0, v3
765 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
766 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
767 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
768 ; SI-NEXT:    v_or_b32_e32 v1, v1, v2
769 ; SI-NEXT:    buffer_store_short v0, off, s[4:7], 0 offset:4
770 ; SI-NEXT:    buffer_store_dword v1, off, s[4:7], 0
771 ; SI-NEXT:    s_endpgm
773 ; VI-LABEL: minnum_v3f16:
774 ; VI:       ; %bb.0: ; %entry
775 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
776 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
777 ; VI-NEXT:    s_mov_b32 s7, 0xf000
778 ; VI-NEXT:    s_mov_b32 s6, -1
779 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
780 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x0
781 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
782 ; VI-NEXT:    s_mov_b32 s4, s0
783 ; VI-NEXT:    s_mov_b32 s5, s1
784 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
785 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
786 ; VI-NEXT:    v_max_f16_e64 v1, s2, s2
787 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
788 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
789 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
790 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
791 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
792 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
793 ; VI-NEXT:    v_or_b32_e32 v0, v0, v1
794 ; VI-NEXT:    v_max_f16_e64 v1, s9, s9
795 ; VI-NEXT:    v_max_f16_e64 v2, s3, s3
796 ; VI-NEXT:    v_min_f16_e32 v1, v2, v1
797 ; VI-NEXT:    buffer_store_short v1, off, s[4:7], 0 offset:4
798 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
799 ; VI-NEXT:    s_endpgm
801 ; GFX9-LABEL: minnum_v3f16:
802 ; GFX9:       ; %bb.0: ; %entry
803 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
804 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
805 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
806 ; GFX9-NEXT:    s_mov_b32 s2, -1
807 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
808 ; GFX9-NEXT:    s_load_dwordx2 s[10:11], s[8:9], 0x0
809 ; GFX9-NEXT:    s_load_dwordx2 s[12:13], s[6:7], 0x0
810 ; GFX9-NEXT:    s_mov_b32 s0, s4
811 ; GFX9-NEXT:    s_mov_b32 s1, s5
812 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
813 ; GFX9-NEXT:    v_pk_max_f16 v0, s10, s10
814 ; GFX9-NEXT:    v_pk_max_f16 v1, s12, s12
815 ; GFX9-NEXT:    v_pk_max_f16 v2, s11, s11
816 ; GFX9-NEXT:    v_pk_min_f16 v0, v1, v0
817 ; GFX9-NEXT:    v_pk_max_f16 v1, s13, s13
818 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, v2
819 ; GFX9-NEXT:    buffer_store_short v1, off, s[0:3], 0 offset:4
820 ; GFX9-NEXT:    buffer_store_dword v0, off, s[0:3], 0
821 ; GFX9-NEXT:    s_endpgm
823 ; GFX10-LABEL: minnum_v3f16:
824 ; GFX10:       ; %bb.0: ; %entry
825 ; GFX10-NEXT:    s_clause 0x1
826 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
827 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
828 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
829 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
830 ; GFX10-NEXT:    s_load_dwordx2 s[8:9], s[6:7], 0x0
831 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
832 ; GFX10-NEXT:    s_mov_b32 s6, -1
833 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
834 ; GFX10-NEXT:    v_pk_max_f16 v1, s1, s1
835 ; GFX10-NEXT:    v_pk_max_f16 v2, s9, s9
836 ; GFX10-NEXT:    v_pk_max_f16 v0, s0, s0
837 ; GFX10-NEXT:    v_pk_max_f16 v3, s8, s8
838 ; GFX10-NEXT:    v_pk_min_f16 v1, v2, v1
839 ; GFX10-NEXT:    v_pk_min_f16 v0, v3, v0
840 ; GFX10-NEXT:    buffer_store_short v1, off, s[4:7], 0 offset:4
841 ; GFX10-NEXT:    buffer_store_dword v0, off, s[4:7], 0
842 ; GFX10-NEXT:    s_endpgm
844 ; GFX11-LABEL: minnum_v3f16:
845 ; GFX11:       ; %bb.0: ; %entry
846 ; GFX11-NEXT:    s_clause 0x1
847 ; GFX11-NEXT:    s_load_b64 s[4:5], s[0:1], 0x34
848 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
849 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
850 ; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x0
851 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
852 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
853 ; GFX11-NEXT:    v_pk_max_f16 v1, s5, s5
854 ; GFX11-NEXT:    v_pk_max_f16 v2, s3, s3
855 ; GFX11-NEXT:    v_pk_max_f16 v0, s4, s4
856 ; GFX11-NEXT:    v_pk_max_f16 v3, s2, s2
857 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
858 ; GFX11-NEXT:    s_mov_b32 s2, -1
859 ; GFX11-NEXT:    v_pk_min_f16 v1, v2, v1
860 ; GFX11-NEXT:    v_pk_min_f16 v0, v3, v0
861 ; GFX11-NEXT:    s_clause 0x1
862 ; GFX11-NEXT:    buffer_store_b16 v1, off, s[0:3], 0 offset:4
863 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
864 ; GFX11-NEXT:    s_nop 0
865 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
866 ; GFX11-NEXT:    s_endpgm
867     ptr addrspace(1) %r,
868     ptr addrspace(1) %a,
869     ptr addrspace(1) %b) #0 {
870 entry:
871   %a.val = load <3 x half>, ptr addrspace(1) %a
872   %b.val = load <3 x half>, ptr addrspace(1) %b
873   %r.val = call <3 x half> @llvm.minnum.v3f16(<3 x half> %a.val, <3 x half> %b.val)
874   store <3 x half> %r.val, ptr addrspace(1) %r
875   ret void
878 define amdgpu_kernel void @minnum_v4f16(
879 ; SI-LABEL: minnum_v4f16:
880 ; SI:       ; %bb.0: ; %entry
881 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
882 ; SI-NEXT:    s_mov_b32 s3, 0xf000
883 ; SI-NEXT:    s_mov_b32 s2, -1
884 ; SI-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
885 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
886 ; SI-NEXT:    s_load_dwordx2 s[6:7], s[6:7], 0x0
887 ; SI-NEXT:    s_mov_b32 s0, s4
888 ; SI-NEXT:    s_mov_b32 s1, s5
889 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0
890 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
891 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s6
892 ; SI-NEXT:    s_lshr_b32 s6, s6, 16
893 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s6
894 ; SI-NEXT:    s_lshr_b32 s6, s7, 16
895 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s6
896 ; SI-NEXT:    s_lshr_b32 s6, s5, 16
897 ; SI-NEXT:    v_cvt_f32_f16_e32 v5, s6
898 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s7
899 ; SI-NEXT:    v_cvt_f32_f16_e32 v4, s4
900 ; SI-NEXT:    s_lshr_b32 s4, s4, 16
901 ; SI-NEXT:    v_cvt_f32_f16_e32 v7, s5
902 ; SI-NEXT:    v_cvt_f32_f16_e32 v6, s4
903 ; SI-NEXT:    v_mul_f32_e32 v5, 1.0, v5
904 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v3
905 ; SI-NEXT:    v_min_f32_e32 v3, v3, v5
906 ; SI-NEXT:    v_mul_f32_e32 v5, 1.0, v7
907 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
908 ; SI-NEXT:    v_min_f32_e32 v1, v1, v5
909 ; SI-NEXT:    v_mul_f32_e32 v5, 1.0, v6
910 ; SI-NEXT:    v_mul_f32_e32 v2, 1.0, v2
911 ; SI-NEXT:    v_min_f32_e32 v2, v2, v5
912 ; SI-NEXT:    v_mul_f32_e32 v4, 1.0, v4
913 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
914 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
915 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
916 ; SI-NEXT:    v_min_f32_e32 v0, v0, v4
917 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
918 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
919 ; SI-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
920 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
921 ; SI-NEXT:    v_or_b32_e32 v1, v1, v3
922 ; SI-NEXT:    v_or_b32_e32 v0, v0, v2
923 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
924 ; SI-NEXT:    s_endpgm
926 ; VI-LABEL: minnum_v4f16:
927 ; VI:       ; %bb.0: ; %entry
928 ; VI-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
929 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
930 ; VI-NEXT:    s_mov_b32 s7, 0xf000
931 ; VI-NEXT:    s_mov_b32 s6, -1
932 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
933 ; VI-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x0
934 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
935 ; VI-NEXT:    s_mov_b32 s4, s0
936 ; VI-NEXT:    s_mov_b32 s5, s1
937 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
938 ; VI-NEXT:    v_max_f16_e64 v0, s9, s9
939 ; VI-NEXT:    v_max_f16_e64 v1, s3, s3
940 ; VI-NEXT:    s_lshr_b32 s0, s9, 16
941 ; VI-NEXT:    v_min_f16_e32 v0, v1, v0
942 ; VI-NEXT:    v_max_f16_e64 v1, s0, s0
943 ; VI-NEXT:    s_lshr_b32 s0, s3, 16
944 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
945 ; VI-NEXT:    v_min_f16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
946 ; VI-NEXT:    v_or_b32_e32 v1, v0, v1
947 ; VI-NEXT:    v_max_f16_e64 v0, s8, s8
948 ; VI-NEXT:    v_max_f16_e64 v2, s2, s2
949 ; VI-NEXT:    s_lshr_b32 s0, s8, 16
950 ; VI-NEXT:    v_min_f16_e32 v0, v2, v0
951 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
952 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
953 ; VI-NEXT:    v_max_f16_e64 v3, s0, s0
954 ; VI-NEXT:    v_min_f16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
955 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
956 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
957 ; VI-NEXT:    s_endpgm
959 ; GFX9-LABEL: minnum_v4f16:
960 ; GFX9:       ; %bb.0: ; %entry
961 ; GFX9-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0x34
962 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
963 ; GFX9-NEXT:    s_mov_b32 s3, 0xf000
964 ; GFX9-NEXT:    s_mov_b32 s2, -1
965 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
966 ; GFX9-NEXT:    s_load_dwordx2 s[10:11], s[8:9], 0x0
967 ; GFX9-NEXT:    s_load_dwordx2 s[12:13], s[6:7], 0x0
968 ; GFX9-NEXT:    s_mov_b32 s0, s4
969 ; GFX9-NEXT:    s_mov_b32 s1, s5
970 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
971 ; GFX9-NEXT:    v_pk_max_f16 v0, s11, s11
972 ; GFX9-NEXT:    v_pk_max_f16 v1, s13, s13
973 ; GFX9-NEXT:    v_pk_max_f16 v2, s10, s10
974 ; GFX9-NEXT:    v_pk_min_f16 v1, v1, v0
975 ; GFX9-NEXT:    v_pk_max_f16 v0, s12, s12
976 ; GFX9-NEXT:    v_pk_min_f16 v0, v0, v2
977 ; GFX9-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
978 ; GFX9-NEXT:    s_endpgm
980 ; GFX10-LABEL: minnum_v4f16:
981 ; GFX10:       ; %bb.0: ; %entry
982 ; GFX10-NEXT:    s_clause 0x1
983 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
984 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
985 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
986 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
987 ; GFX10-NEXT:    s_load_dwordx2 s[8:9], s[6:7], 0x0
988 ; GFX10-NEXT:    s_mov_b32 s7, 0x31016000
989 ; GFX10-NEXT:    s_mov_b32 s6, -1
990 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
991 ; GFX10-NEXT:    v_pk_max_f16 v0, s1, s1
992 ; GFX10-NEXT:    v_pk_max_f16 v1, s9, s9
993 ; GFX10-NEXT:    v_pk_max_f16 v2, s0, s0
994 ; GFX10-NEXT:    v_pk_max_f16 v3, s8, s8
995 ; GFX10-NEXT:    v_pk_min_f16 v1, v1, v0
996 ; GFX10-NEXT:    v_pk_min_f16 v0, v3, v2
997 ; GFX10-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
998 ; GFX10-NEXT:    s_endpgm
1000 ; GFX11-LABEL: minnum_v4f16:
1001 ; GFX11:       ; %bb.0: ; %entry
1002 ; GFX11-NEXT:    s_clause 0x1
1003 ; GFX11-NEXT:    s_load_b64 s[4:5], s[0:1], 0x34
1004 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1005 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1006 ; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x0
1007 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
1008 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1009 ; GFX11-NEXT:    v_pk_max_f16 v0, s5, s5
1010 ; GFX11-NEXT:    v_pk_max_f16 v1, s3, s3
1011 ; GFX11-NEXT:    v_pk_max_f16 v2, s4, s4
1012 ; GFX11-NEXT:    v_pk_max_f16 v3, s2, s2
1013 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
1014 ; GFX11-NEXT:    s_mov_b32 s2, -1
1015 ; GFX11-NEXT:    v_pk_min_f16 v1, v1, v0
1016 ; GFX11-NEXT:    v_pk_min_f16 v0, v3, v2
1017 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
1018 ; GFX11-NEXT:    s_nop 0
1019 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1020 ; GFX11-NEXT:    s_endpgm
1021     ptr addrspace(1) %r,
1022     ptr addrspace(1) %a,
1023     ptr addrspace(1) %b) #0 {
1024 entry:
1025   %a.val = load <4 x half>, ptr addrspace(1) %a
1026   %b.val = load <4 x half>, ptr addrspace(1) %b
1027   %r.val = call <4 x half> @llvm.minnum.v4f16(<4 x half> %a.val, <4 x half> %b.val)
1028   store <4 x half> %r.val, ptr addrspace(1) %r
1029   ret void
1032 define amdgpu_kernel void @fmin_v4f16_imm_a(
1033 ; SI-LABEL: fmin_v4f16_imm_a:
1034 ; SI:       ; %bb.0: ; %entry
1035 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1036 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1037 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
1038 ; SI-NEXT:    s_mov_b32 s3, 0xf000
1039 ; SI-NEXT:    s_mov_b32 s2, -1
1040 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
1041 ; SI-NEXT:    v_cvt_f32_f16_e32 v1, s5
1042 ; SI-NEXT:    s_lshr_b32 s5, s5, 16
1043 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, s4
1044 ; SI-NEXT:    v_cvt_f32_f16_e32 v2, s5
1045 ; SI-NEXT:    s_lshr_b32 s4, s4, 16
1046 ; SI-NEXT:    v_cvt_f32_f16_e32 v3, s4
1047 ; SI-NEXT:    v_mul_f32_e32 v1, 1.0, v1
1048 ; SI-NEXT:    v_mul_f32_e32 v2, 1.0, v2
1049 ; SI-NEXT:    v_min_f32_e32 v2, 4.0, v2
1050 ; SI-NEXT:    v_mul_f32_e32 v3, 1.0, v3
1051 ; SI-NEXT:    v_min_f32_e32 v1, 0x40400000, v1
1052 ; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
1053 ; SI-NEXT:    v_min_f32_e32 v3, 2.0, v3
1054 ; SI-NEXT:    v_mul_f32_e32 v0, 1.0, v0
1055 ; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
1056 ; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
1057 ; SI-NEXT:    v_min_f32_e32 v0, 0x41000000, v0
1058 ; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
1059 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1060 ; SI-NEXT:    v_or_b32_e32 v1, v1, v2
1061 ; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
1062 ; SI-NEXT:    v_or_b32_e32 v0, v0, v2
1063 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1064 ; SI-NEXT:    s_endpgm
1066 ; VI-LABEL: fmin_v4f16_imm_a:
1067 ; VI:       ; %bb.0: ; %entry
1068 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1069 ; VI-NEXT:    v_mov_b32_e32 v0, 0x4400
1070 ; VI-NEXT:    s_mov_b32 s7, 0xf000
1071 ; VI-NEXT:    s_mov_b32 s6, -1
1072 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1073 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
1074 ; VI-NEXT:    s_mov_b32 s4, s0
1075 ; VI-NEXT:    s_mov_b32 s5, s1
1076 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
1077 ; VI-NEXT:    s_lshr_b32 s0, s3, 16
1078 ; VI-NEXT:    v_max_f16_e64 v1, s3, s3
1079 ; VI-NEXT:    v_max_f16_e64 v3, s0, s0
1080 ; VI-NEXT:    v_max_f16_e64 v2, s2, s2
1081 ; VI-NEXT:    v_min_f16_e32 v1, 0x4200, v1
1082 ; VI-NEXT:    v_min_f16_sdwa v0, v3, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1083 ; VI-NEXT:    s_lshr_b32 s0, s2, 16
1084 ; VI-NEXT:    v_or_b32_e32 v1, v1, v0
1085 ; VI-NEXT:    v_min_f16_e32 v0, 0x4800, v2
1086 ; VI-NEXT:    v_max_f16_e64 v2, s0, s0
1087 ; VI-NEXT:    v_mov_b32_e32 v3, 0x4000
1088 ; VI-NEXT:    v_min_f16_sdwa v2, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1089 ; VI-NEXT:    v_or_b32_e32 v0, v0, v2
1090 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1091 ; VI-NEXT:    s_endpgm
1093 ; GFX9-LABEL: fmin_v4f16_imm_a:
1094 ; GFX9:       ; %bb.0: ; %entry
1095 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1096 ; GFX9-NEXT:    s_mov_b32 s8, 0x44004200
1097 ; GFX9-NEXT:    s_mov_b32 s9, 0x40004800
1098 ; GFX9-NEXT:    s_mov_b32 s7, 0xf000
1099 ; GFX9-NEXT:    s_mov_b32 s6, -1
1100 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1101 ; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
1102 ; GFX9-NEXT:    s_mov_b32 s4, s0
1103 ; GFX9-NEXT:    s_mov_b32 s5, s1
1104 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1105 ; GFX9-NEXT:    v_pk_max_f16 v0, s3, s3
1106 ; GFX9-NEXT:    v_pk_max_f16 v2, s2, s2
1107 ; GFX9-NEXT:    v_pk_min_f16 v1, v0, s8
1108 ; GFX9-NEXT:    v_pk_min_f16 v0, v2, s9
1109 ; GFX9-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
1110 ; GFX9-NEXT:    s_endpgm
1112 ; GFX10-LABEL: fmin_v4f16_imm_a:
1113 ; GFX10:       ; %bb.0: ; %entry
1114 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1115 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1116 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
1117 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1118 ; GFX10-NEXT:    v_pk_max_f16 v0, s3, s3
1119 ; GFX10-NEXT:    v_pk_max_f16 v2, s2, s2
1120 ; GFX10-NEXT:    s_mov_b32 s3, 0x31016000
1121 ; GFX10-NEXT:    s_mov_b32 s2, -1
1122 ; GFX10-NEXT:    v_pk_min_f16 v1, 0x44004200, v0
1123 ; GFX10-NEXT:    v_pk_min_f16 v0, 0x40004800, v2
1124 ; GFX10-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
1125 ; GFX10-NEXT:    s_endpgm
1127 ; GFX11-LABEL: fmin_v4f16_imm_a:
1128 ; GFX11:       ; %bb.0: ; %entry
1129 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1130 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1131 ; GFX11-NEXT:    s_load_b64 s[2:3], s[2:3], 0x0
1132 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1133 ; GFX11-NEXT:    v_pk_max_f16 v0, s3, s3
1134 ; GFX11-NEXT:    v_pk_max_f16 v2, s2, s2
1135 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
1136 ; GFX11-NEXT:    s_mov_b32 s2, -1
1137 ; GFX11-NEXT:    v_pk_min_f16 v1, 0x44004200, v0
1138 ; GFX11-NEXT:    v_pk_min_f16 v0, 0x40004800, v2
1139 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
1140 ; GFX11-NEXT:    s_nop 0
1141 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1142 ; GFX11-NEXT:    s_endpgm
1143     ptr addrspace(1) %r,
1144     ptr addrspace(1) %b) #0 {
1145 entry:
1146   %b.val = load <4 x half>, ptr addrspace(1) %b
1147   %r.val = call <4 x half> @llvm.minnum.v4f16(<4 x half> <half 8.0, half 2.0, half 3.0, half 4.0>, <4 x half> %b.val)
1148   store <4 x half> %r.val, ptr addrspace(1) %r
1149   ret void
1152 attributes #0 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }