[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / v_sat_pk_u8_i16.ll
blobb9cdd478090e5865d6e73e006931983e6b63bd60
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=SDAG-VI %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=SDAG-GFX9 %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx1101 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,SDAG-GFX11 %s
6 ; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-VI %s
7 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-GFX9 %s
8 ; RUN: llc -march=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_max_i16_e32 v1, 0, v1
54 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
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[0:1], 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[0:3], s[0:1], 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, s2, 0, v1
112 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, s3, 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[0:1]
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[0:1], 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[0:1], 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[0:3], s[0:1], 0x24
160 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, 0
161 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s5, 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, s2
165 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s3
166 ; GISEL-GFX9-NEXT:    s_max_i32 s2, s2, s4
167 ; GISEL-GFX9-NEXT:    s_max_i32 s3, s3, s4
168 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, s2
169 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s3
170 ; GISEL-GFX9-NEXT:    s_min_i32 s2, s2, s5
171 ; GISEL-GFX9-NEXT:    s_min_i32 s3, s3, s5
172 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
173 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s2
174 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
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[0:1], 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_min_i16_e32 v0, 0xff, v0
316 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
317 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
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 ; GFX11-LABEL: vec_smax_smin:
373 ; GFX11:       ; %bb.0:
374 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
375 ; GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
376 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
377 ; GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
378 ; 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]
399   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
400   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
401   ret <2 x i16> %src.clamp
404 ; Check that we don't emit a VALU instruction for SGPR inputs.
405 define amdgpu_kernel void @vec_smax_smin_sgpr(ptr addrspace(1) %out, <2 x i16> inreg %src) {
406 ; SDAG-VI-LABEL: vec_smax_smin_sgpr:
407 ; SDAG-VI:       ; %bb.0:
408 ; SDAG-VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
409 ; SDAG-VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
410 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, 0xff
411 ; SDAG-VI-NEXT:    s_waitcnt lgkmcnt(0)
412 ; SDAG-VI-NEXT:    s_lshr_b32 s3, s2, 16
413 ; SDAG-VI-NEXT:    v_max_i16_e64 v1, s2, 0
414 ; SDAG-VI-NEXT:    v_max_i16_e64 v2, s3, 0
415 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
416 ; SDAG-VI-NEXT:    v_min_i16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
417 ; SDAG-VI-NEXT:    v_or_b32_e32 v2, v1, v0
418 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, s0
419 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, s1
420 ; SDAG-VI-NEXT:    flat_store_dword v[0:1], v2
421 ; SDAG-VI-NEXT:    s_endpgm
423 ; SDAG-GFX9-LABEL: vec_smax_smin_sgpr:
424 ; SDAG-GFX9:       ; %bb.0:
425 ; SDAG-GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
426 ; SDAG-GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
427 ; SDAG-GFX9-NEXT:    s_movk_i32 s0, 0xff
428 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v0, 0
429 ; SDAG-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
430 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v1, s4, 0
431 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v1, v1, s0 op_sel_hi:[1,0]
432 ; SDAG-GFX9-NEXT:    global_store_dword v0, v1, s[2:3]
433 ; SDAG-GFX9-NEXT:    s_endpgm
435 ; SDAG-GFX11-LABEL: vec_smax_smin_sgpr:
436 ; SDAG-GFX11:       ; %bb.0:
437 ; SDAG-GFX11-NEXT:    s_clause 0x1
438 ; SDAG-GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
439 ; SDAG-GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
440 ; SDAG-GFX11-NEXT:    v_mov_b32_e32 v1, 0
441 ; SDAG-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
442 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, s2, 0
443 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
444 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
445 ; SDAG-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
446 ; SDAG-GFX11-NEXT:    s_nop 0
447 ; SDAG-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
448 ; SDAG-GFX11-NEXT:    s_endpgm
450 ; GISEL-VI-LABEL: vec_smax_smin_sgpr:
451 ; GISEL-VI:       ; %bb.0:
452 ; GISEL-VI-NEXT:    s_load_dword s2, s[0:1], 0x2c
453 ; GISEL-VI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
454 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, 0
455 ; GISEL-VI-NEXT:    s_waitcnt lgkmcnt(0)
456 ; GISEL-VI-NEXT:    s_lshr_b32 s4, s2, 16
457 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
458 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, s4
459 ; GISEL-VI-NEXT:    s_max_i32 s2, s2, s3
460 ; GISEL-VI-NEXT:    s_max_i32 s3, s4, s3
461 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, 0xff
462 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
463 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
464 ; GISEL-VI-NEXT:    s_min_i32 s3, s3, s4
465 ; GISEL-VI-NEXT:    s_min_i32 s2, s2, s4
466 ; GISEL-VI-NEXT:    s_and_b32 s3, 0xffff, s3
467 ; GISEL-VI-NEXT:    s_and_b32 s2, 0xffff, s2
468 ; GISEL-VI-NEXT:    s_lshl_b32 s3, s3, 16
469 ; GISEL-VI-NEXT:    s_or_b32 s2, s2, s3
470 ; GISEL-VI-NEXT:    v_mov_b32_e32 v0, s0
471 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, s2
472 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, s1
473 ; GISEL-VI-NEXT:    flat_store_dword v[0:1], v2
474 ; GISEL-VI-NEXT:    s_endpgm
476 ; GISEL-GFX9-LABEL: vec_smax_smin_sgpr:
477 ; GISEL-GFX9:       ; %bb.0:
478 ; GISEL-GFX9-NEXT:    s_load_dword s4, s[0:1], 0x2c
479 ; GISEL-GFX9-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
480 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s0, 0
481 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0
482 ; GISEL-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
483 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s1, s4
484 ; GISEL-GFX9-NEXT:    s_ashr_i32 s4, s4, 16
485 ; GISEL-GFX9-NEXT:    s_max_i32 s0, s1, s0
486 ; GISEL-GFX9-NEXT:    s_max_i32 s1, s4, 0
487 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s1
488 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s1, s0
489 ; GISEL-GFX9-NEXT:    s_ashr_i32 s0, s0, 16
490 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, 0xff00ff
491 ; GISEL-GFX9-NEXT:    s_min_i32 s1, s1, s4
492 ; GISEL-GFX9-NEXT:    s_min_i32 s0, s0, 0xff
493 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s0, s1, s0
494 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s0
495 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[2:3]
496 ; GISEL-GFX9-NEXT:    s_endpgm
498 ; GISEL-GFX11-LABEL: vec_smax_smin_sgpr:
499 ; GISEL-GFX11:       ; %bb.0:
500 ; GISEL-GFX11-NEXT:    s_clause 0x1
501 ; GISEL-GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
502 ; GISEL-GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
503 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, 0
504 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v1, 0
505 ; GISEL-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
506 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, s2
507 ; GISEL-GFX11-NEXT:    s_ashr_i32 s2, s2, 16
508 ; GISEL-GFX11-NEXT:    s_max_i32 s3, s4, s3
509 ; GISEL-GFX11-NEXT:    s_max_i32 s2, s2, 0
510 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
511 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
512 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, 0xff00ff
513 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, s2
514 ; GISEL-GFX11-NEXT:    s_ashr_i32 s2, s2, 16
515 ; GISEL-GFX11-NEXT:    s_min_i32 s3, s4, s3
516 ; GISEL-GFX11-NEXT:    s_min_i32 s2, s2, 0xff
517 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
518 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
519 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v0, s2
520 ; GISEL-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
521 ; GISEL-GFX11-NEXT:    s_nop 0
522 ; GISEL-GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
523 ; GISEL-GFX11-NEXT:    s_endpgm
524   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
525   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
526   store <2 x i16> %src.clamp, ptr addrspace(1) %out
527   ret void
530 define <2 x i16> @vec_smin_smax(<2 x i16> %src) {
531 ; SDAG-VI-LABEL: vec_smin_smax:
532 ; SDAG-VI:       ; %bb.0:
533 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
534 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0xff
535 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
536 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
537 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
538 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
539 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
540 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
541 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
543 ; SDAG-GFX9-LABEL: vec_smin_smax:
544 ; SDAG-GFX9:       ; %bb.0:
545 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
546 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
547 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
548 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
549 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
551 ; GFX11-LABEL: vec_smin_smax:
552 ; GFX11:       ; %bb.0:
553 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
554 ; GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
555 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
556 ; GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
557 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
559 ; GISEL-VI-LABEL: vec_smin_smax:
560 ; GISEL-VI:       ; %bb.0:
561 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
562 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
563 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v0
564 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
565 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
566 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
567 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
568 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
569 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
571 ; GISEL-GFX9-LABEL: vec_smin_smax:
572 ; GISEL-GFX9:       ; %bb.0:
573 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
574 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
575 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v0, v1
576 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
577 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
578   %src.min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src, <2 x i16> <i16 255, i16 255>)
579   %src.clamp = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src.min, <2 x i16> <i16 0, i16 0>)
580   ret <2 x i16> %src.clamp