Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / v_sat_pk_u8_i16.ll
blobee99fcc5863340276c42a9d863653bcb608da15a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=SDAG-VI %s
3 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=SDAG-GFX9 %s
4 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,SDAG-GFX11 %s
6 ; RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-VI %s
7 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-GFX9 %s
8 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GFX11,GISEL-GFX11 %s
10 ; <GFX9 has no V_SAT_PK, GFX9+ has V_SAT_PK, GFX11 has V_SAT_PK with t16
12 declare i16 @llvm.smin.i16(i16, i16)
13 declare i16 @llvm.smax.i16(i16, i16)
15 declare <2 x i16> @llvm.smin.v2i16(<2 x i16>, <2 x i16>)
16 declare <2 x i16> @llvm.smax.v2i16(<2 x i16>, <2 x i16>)
18 define <2 x i16> @basic_smax_smin(i16 %src0, i16 %src1) {
19 ; SDAG-VI-LABEL: basic_smax_smin:
20 ; SDAG-VI:       ; %bb.0:
21 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
22 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
23 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
24 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
25 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
26 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
27 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
28 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
30 ; SDAG-GFX9-LABEL: basic_smax_smin:
31 ; SDAG-GFX9:       ; %bb.0:
32 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
33 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
34 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
35 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
36 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
37 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
38 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
40 ; SDAG-GFX11-LABEL: basic_smax_smin:
41 ; SDAG-GFX11:       ; %bb.0:
42 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
43 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
44 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
45 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
46 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
47 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
49 ; GISEL-VI-LABEL: basic_smax_smin:
50 ; GISEL-VI:       ; %bb.0:
51 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
52 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
53 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
54 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
55 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
56 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
57 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
58 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
60 ; GISEL-GFX9-LABEL: basic_smax_smin:
61 ; GISEL-GFX9:       ; %bb.0:
62 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
63 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
64 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
65 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
66 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
67 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
68 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
70 ; GISEL-GFX11-LABEL: basic_smax_smin:
71 ; GISEL-GFX11:       ; %bb.0:
72 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
73 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
74 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
75 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
76 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
77 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
78 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
79   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
80   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
81   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
82   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
83   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
84   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
85   ret <2 x i16> %vec
88 ; Check that we don't emit a VALU instruction for SGPR inputs.
89 define amdgpu_kernel void @basic_smax_smin_sgpr(ptr addrspace(1) %out, i32 inreg %src0ext, i32 inreg %src1ext) {
90 ; SDAG-VI-LABEL: basic_smax_smin_sgpr:
91 ; SDAG-VI:       ; %bb.0:
92 ; SDAG-VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
93 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, 0xff
94 ; SDAG-VI-NEXT:    s_waitcnt lgkmcnt(0)
95 ; SDAG-VI-NEXT:    v_max_i16_e64 v1, s2, 0
96 ; SDAG-VI-NEXT:    v_max_i16_e64 v2, s3, 0
97 ; SDAG-VI-NEXT:    v_min_i16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
98 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
99 ; SDAG-VI-NEXT:    v_or_b32_e32 v2, v1, v0
100 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, s0
101 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, s1
102 ; SDAG-VI-NEXT:    flat_store_dword v[0:1], v2
103 ; SDAG-VI-NEXT:    s_endpgm
105 ; SDAG-GFX9-LABEL: basic_smax_smin_sgpr:
106 ; SDAG-GFX9:       ; %bb.0:
107 ; SDAG-GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
108 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
109 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v0, 0
110 ; SDAG-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
111 ; SDAG-GFX9-NEXT:    v_med3_i16 v2, s6, 0, v1
112 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, s7, 0, v1
113 ; SDAG-GFX9-NEXT:    v_and_b32_e32 v2, 0xffff, v2
114 ; SDAG-GFX9-NEXT:    v_lshl_or_b32 v1, v1, 16, v2
115 ; SDAG-GFX9-NEXT:    global_store_dword v0, v1, s[4:5]
116 ; SDAG-GFX9-NEXT:    s_endpgm
118 ; SDAG-GFX11-LABEL: basic_smax_smin_sgpr:
119 ; SDAG-GFX11:       ; %bb.0:
120 ; SDAG-GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
121 ; SDAG-GFX11-NEXT:    v_mov_b32_e32 v2, 0
122 ; SDAG-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
123 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, s2, 0, 0xff
124 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, s3, 0, 0xff
125 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
126 ; SDAG-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
127 ; SDAG-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
128 ; SDAG-GFX11-NEXT:    global_store_b32 v2, v0, s[0:1]
129 ; SDAG-GFX11-NEXT:    s_nop 0
130 ; SDAG-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
131 ; SDAG-GFX11-NEXT:    s_endpgm
133 ; GISEL-VI-LABEL: basic_smax_smin_sgpr:
134 ; GISEL-VI:       ; %bb.0:
135 ; GISEL-VI-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
136 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, 0
137 ; GISEL-VI-NEXT:    s_sext_i32_i16 s5, 0xff
138 ; GISEL-VI-NEXT:    s_waitcnt lgkmcnt(0)
139 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
140 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
141 ; GISEL-VI-NEXT:    s_max_i32 s3, s3, s4
142 ; GISEL-VI-NEXT:    s_max_i32 s2, s2, s4
143 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
144 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
145 ; GISEL-VI-NEXT:    s_min_i32 s3, s3, s5
146 ; GISEL-VI-NEXT:    s_min_i32 s2, s2, s5
147 ; GISEL-VI-NEXT:    s_and_b32 s3, 0xffff, s3
148 ; GISEL-VI-NEXT:    s_and_b32 s2, 0xffff, s2
149 ; GISEL-VI-NEXT:    s_lshl_b32 s3, s3, 16
150 ; GISEL-VI-NEXT:    s_or_b32 s2, s2, s3
151 ; GISEL-VI-NEXT:    v_mov_b32_e32 v0, s0
152 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, s2
153 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, s1
154 ; GISEL-VI-NEXT:    flat_store_dword v[0:1], v2
155 ; GISEL-VI-NEXT:    s_endpgm
157 ; GISEL-GFX9-LABEL: basic_smax_smin_sgpr:
158 ; GISEL-GFX9:       ; %bb.0:
159 ; GISEL-GFX9-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
160 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s0, 0
161 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s1, 0xff
162 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0
163 ; GISEL-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
164 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, s6
165 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s7
166 ; GISEL-GFX9-NEXT:    s_max_i32 s2, s2, s0
167 ; GISEL-GFX9-NEXT:    s_max_i32 s0, s3, s0
168 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, s2
169 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s0, s0
170 ; GISEL-GFX9-NEXT:    s_min_i32 s2, s2, s1
171 ; GISEL-GFX9-NEXT:    s_min_i32 s0, s0, s1
172 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s0, s2, s0
173 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s0
174 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[4:5]
175 ; GISEL-GFX9-NEXT:    s_endpgm
177 ; GISEL-GFX11-LABEL: basic_smax_smin_sgpr:
178 ; GISEL-GFX11:       ; %bb.0:
179 ; GISEL-GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
180 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, 0
181 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s5, 0xff
182 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v1, 0
183 ; GISEL-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
184 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s2, s2
185 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, s3
186 ; GISEL-GFX11-NEXT:    s_max_i32 s2, s2, s4
187 ; GISEL-GFX11-NEXT:    s_max_i32 s3, s3, s4
188 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s2, s2
189 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, s3
190 ; GISEL-GFX11-NEXT:    s_min_i32 s2, s2, s5
191 ; GISEL-GFX11-NEXT:    s_min_i32 s3, s3, s5
192 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
193 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
194 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v0, s2
195 ; GISEL-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
196 ; GISEL-GFX11-NEXT:    s_nop 0
197 ; GISEL-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
198 ; GISEL-GFX11-NEXT:    s_endpgm
199   %src0 = trunc i32 %src0ext to i16
200   %src1 = trunc i32 %src1ext to i16
201   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
202   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
203   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
204   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
205   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
206   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
207   store <2 x i16> %vec, ptr addrspace(1) %out
208   ret void
211 define <2 x i16> @basic_smin_smax(i16 %src0, i16 %src1) {
212 ; SDAG-VI-LABEL: basic_smin_smax:
213 ; SDAG-VI:       ; %bb.0:
214 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
215 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
216 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
217 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
218 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
219 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
220 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
221 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
223 ; SDAG-GFX9-LABEL: basic_smin_smax:
224 ; SDAG-GFX9:       ; %bb.0:
225 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
226 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
227 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
228 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
229 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
230 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
231 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
233 ; SDAG-GFX11-LABEL: basic_smin_smax:
234 ; SDAG-GFX11:       ; %bb.0:
235 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
236 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
237 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
238 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
239 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
240 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
242 ; GISEL-VI-LABEL: basic_smin_smax:
243 ; GISEL-VI:       ; %bb.0:
244 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
245 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
246 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
247 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
248 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
249 ; GISEL-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
250 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
251 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
253 ; GISEL-GFX9-LABEL: basic_smin_smax:
254 ; GISEL-GFX9:       ; %bb.0:
255 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
256 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
257 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
258 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
259 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
260 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
261 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
263 ; GISEL-GFX11-LABEL: basic_smin_smax:
264 ; GISEL-GFX11:       ; %bb.0:
265 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
266 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
267 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
268 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
269 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
270 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
271 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
272   %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)
273   %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)
274   %src1.min = call i16 @llvm.smin.i16(i16 %src1, i16 255)
275   %src1.clamp = call i16 @llvm.smax.i16(i16 %src1.min, i16 0)
276   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
277   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
278   ret <2 x i16> %vec
281 define <2 x i16> @basic_smin_smax_combined(i16 %src0, i16 %src1) {
282 ; SDAG-VI-LABEL: basic_smin_smax_combined:
283 ; SDAG-VI:       ; %bb.0:
284 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
285 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
286 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
287 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
288 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
289 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
290 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
291 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
293 ; SDAG-GFX9-LABEL: basic_smin_smax_combined:
294 ; SDAG-GFX9:       ; %bb.0:
295 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
296 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
297 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
298 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
299 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
300 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
301 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
303 ; SDAG-GFX11-LABEL: basic_smin_smax_combined:
304 ; SDAG-GFX11:       ; %bb.0:
305 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
306 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
307 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
308 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
309 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
310 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
312 ; GISEL-VI-LABEL: basic_smin_smax_combined:
313 ; GISEL-VI:       ; %bb.0:
314 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
315 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
316 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
317 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
318 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
319 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
320 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
321 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
323 ; GISEL-GFX9-LABEL: basic_smin_smax_combined:
324 ; GISEL-GFX9:       ; %bb.0:
325 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
326 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
327 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
328 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
329 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
330 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
331 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
333 ; GISEL-GFX11-LABEL: basic_smin_smax_combined:
334 ; GISEL-GFX11:       ; %bb.0:
335 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
336 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
337 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
338 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
339 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
340 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
341 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
342   %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)
343   %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)
344   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
345   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
346   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
347   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
348   ret <2 x i16> %vec
351 define <2 x i16> @vec_smax_smin(<2 x i16> %src) {
352 ; SDAG-VI-LABEL: vec_smax_smin:
353 ; SDAG-VI:       ; %bb.0:
354 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
355 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0
356 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
357 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
358 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
359 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
360 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
361 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
362 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
364 ; SDAG-GFX9-LABEL: vec_smax_smin:
365 ; SDAG-GFX9:       ; %bb.0:
366 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
367 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
368 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
369 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
370 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
372 ; SDAG-GFX11-LABEL: vec_smax_smin:
373 ; SDAG-GFX11:       ; %bb.0:
374 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
375 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
376 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
377 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
378 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
380 ; GISEL-VI-LABEL: vec_smax_smin:
381 ; GISEL-VI:       ; %bb.0:
382 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
383 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
384 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v0
385 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
386 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
387 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
388 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
389 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
390 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
392 ; GISEL-GFX9-LABEL: vec_smax_smin:
393 ; GISEL-GFX9:       ; %bb.0:
394 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
395 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
396 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
397 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v0, v1
398 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
400 ; GISEL-GFX11-LABEL: vec_smax_smin:
401 ; GISEL-GFX11:       ; %bb.0:
402 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
403 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
404 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
405 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
406 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
407   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
408   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
409   ret <2 x i16> %src.clamp
412 ; Check that we don't emit a VALU instruction for SGPR inputs.
413 define amdgpu_kernel void @vec_smax_smin_sgpr(ptr addrspace(1) %out, <2 x i16> inreg %src) {
414 ; SDAG-VI-LABEL: vec_smax_smin_sgpr:
415 ; SDAG-VI:       ; %bb.0:
416 ; SDAG-VI-NEXT:    s_load_dword s4, s[2:3], 0x2c
417 ; SDAG-VI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
418 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, 0xff
419 ; SDAG-VI-NEXT:    s_waitcnt lgkmcnt(0)
420 ; SDAG-VI-NEXT:    s_lshr_b32 s2, s4, 16
421 ; SDAG-VI-NEXT:    v_max_i16_e64 v1, s4, 0
422 ; SDAG-VI-NEXT:    v_max_i16_e64 v2, s2, 0
423 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
424 ; SDAG-VI-NEXT:    v_min_i16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
425 ; SDAG-VI-NEXT:    v_or_b32_e32 v2, v1, v0
426 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, s0
427 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, s1
428 ; SDAG-VI-NEXT:    flat_store_dword v[0:1], v2
429 ; SDAG-VI-NEXT:    s_endpgm
431 ; SDAG-GFX9-LABEL: vec_smax_smin_sgpr:
432 ; SDAG-GFX9:       ; %bb.0:
433 ; SDAG-GFX9-NEXT:    s_load_dword s4, s[2:3], 0x2c
434 ; SDAG-GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
435 ; SDAG-GFX9-NEXT:    s_movk_i32 s2, 0xff
436 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v0, 0
437 ; SDAG-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
438 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v1, s4, 0
439 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v1, v1, s2 op_sel_hi:[1,0]
440 ; SDAG-GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
441 ; SDAG-GFX9-NEXT:    s_endpgm
443 ; SDAG-GFX11-LABEL: vec_smax_smin_sgpr:
444 ; SDAG-GFX11:       ; %bb.0:
445 ; SDAG-GFX11-NEXT:    s_clause 0x1
446 ; SDAG-GFX11-NEXT:    s_load_b32 s4, s[2:3], 0x2c
447 ; SDAG-GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
448 ; SDAG-GFX11-NEXT:    v_mov_b32_e32 v1, 0
449 ; SDAG-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
450 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, s4, 0
451 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
452 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
453 ; SDAG-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
454 ; SDAG-GFX11-NEXT:    s_nop 0
455 ; SDAG-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
456 ; SDAG-GFX11-NEXT:    s_endpgm
458 ; GISEL-VI-LABEL: vec_smax_smin_sgpr:
459 ; GISEL-VI:       ; %bb.0:
460 ; GISEL-VI-NEXT:    s_load_dword s4, s[2:3], 0x2c
461 ; GISEL-VI-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
462 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, 0
463 ; GISEL-VI-NEXT:    s_waitcnt lgkmcnt(0)
464 ; GISEL-VI-NEXT:    s_lshr_b32 s3, s4, 16
465 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, s4
466 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
467 ; GISEL-VI-NEXT:    s_max_i32 s4, s4, s2
468 ; GISEL-VI-NEXT:    s_max_i32 s2, s3, s2
469 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s4
470 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, 0xff
471 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
472 ; GISEL-VI-NEXT:    s_min_i32 s2, s2, s4
473 ; GISEL-VI-NEXT:    s_min_i32 s3, s3, s4
474 ; GISEL-VI-NEXT:    s_and_b32 s2, 0xffff, s2
475 ; GISEL-VI-NEXT:    s_and_b32 s3, 0xffff, s3
476 ; GISEL-VI-NEXT:    s_lshl_b32 s2, s2, 16
477 ; GISEL-VI-NEXT:    s_or_b32 s2, s3, s2
478 ; GISEL-VI-NEXT:    v_mov_b32_e32 v0, s0
479 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, s2
480 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, s1
481 ; GISEL-VI-NEXT:    flat_store_dword v[0:1], v2
482 ; GISEL-VI-NEXT:    s_endpgm
484 ; GISEL-GFX9-LABEL: vec_smax_smin_sgpr:
485 ; GISEL-GFX9:       ; %bb.0:
486 ; GISEL-GFX9-NEXT:    s_load_dword s4, s[2:3], 0x2c
487 ; GISEL-GFX9-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
488 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, 0
489 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0
490 ; GISEL-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
491 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s4
492 ; GISEL-GFX9-NEXT:    s_ashr_i32 s4, s4, 16
493 ; GISEL-GFX9-NEXT:    s_max_i32 s2, s3, s2
494 ; GISEL-GFX9-NEXT:    s_max_i32 s3, s4, 0
495 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
496 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s2
497 ; GISEL-GFX9-NEXT:    s_ashr_i32 s2, s2, 16
498 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, 0xff00ff
499 ; GISEL-GFX9-NEXT:    s_min_i32 s3, s3, s4
500 ; GISEL-GFX9-NEXT:    s_min_i32 s2, s2, 0xff
501 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
502 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s2
503 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
504 ; GISEL-GFX9-NEXT:    s_endpgm
506 ; GISEL-GFX11-LABEL: vec_smax_smin_sgpr:
507 ; GISEL-GFX11:       ; %bb.0:
508 ; GISEL-GFX11-NEXT:    s_clause 0x1
509 ; GISEL-GFX11-NEXT:    s_load_b32 s4, s[2:3], 0x2c
510 ; GISEL-GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
511 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s2, 0
512 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v1, 0
513 ; GISEL-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
514 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, s4
515 ; GISEL-GFX11-NEXT:    s_ashr_i32 s4, s4, 16
516 ; GISEL-GFX11-NEXT:    s_max_i32 s2, s3, s2
517 ; GISEL-GFX11-NEXT:    s_max_i32 s3, s4, 0
518 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
519 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
520 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, 0xff00ff
521 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, s2
522 ; GISEL-GFX11-NEXT:    s_ashr_i32 s2, s2, 16
523 ; GISEL-GFX11-NEXT:    s_min_i32 s3, s4, s3
524 ; GISEL-GFX11-NEXT:    s_min_i32 s2, s2, 0xff
525 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
526 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
527 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v0, s2
528 ; GISEL-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
529 ; GISEL-GFX11-NEXT:    s_nop 0
530 ; GISEL-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
531 ; GISEL-GFX11-NEXT:    s_endpgm
532   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
533   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
534   store <2 x i16> %src.clamp, ptr addrspace(1) %out
535   ret void
538 define <2 x i16> @vec_smin_smax(<2 x i16> %src) {
539 ; SDAG-VI-LABEL: vec_smin_smax:
540 ; SDAG-VI:       ; %bb.0:
541 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
542 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0xff
543 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
544 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
545 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
546 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
547 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
548 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
549 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
551 ; SDAG-GFX9-LABEL: vec_smin_smax:
552 ; SDAG-GFX9:       ; %bb.0:
553 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
554 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
555 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
556 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
557 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
559 ; SDAG-GFX11-LABEL: vec_smin_smax:
560 ; SDAG-GFX11:       ; %bb.0:
561 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
562 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
563 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
564 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
565 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
567 ; GISEL-VI-LABEL: vec_smin_smax:
568 ; GISEL-VI:       ; %bb.0:
569 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
570 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, 0xff
571 ; GISEL-VI-NEXT:    v_min_i16_e32 v2, 0xff, v0
572 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
573 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v2
574 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
575 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
576 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
577 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
579 ; GISEL-GFX9-LABEL: vec_smin_smax:
580 ; GISEL-GFX9:       ; %bb.0:
581 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
582 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
583 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v0, v1
584 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
585 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
587 ; GISEL-GFX11-LABEL: vec_smin_smax:
588 ; GISEL-GFX11:       ; %bb.0:
589 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
590 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
591 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
592 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
593 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
594   %src.min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src, <2 x i16> <i16 255, i16 255>)
595   %src.clamp = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src.min, <2 x i16> <i16 0, i16 0>)
596   ret <2 x i16> %src.clamp
598 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
599 ; GFX11: {{.*}}