[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / v_sat_pk_u8_i16.ll
blob934d9efba46564d5d607ca9f6723f691c6910af3
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
5 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -verify-machineinstrs < %s | FileCheck -check-prefixes=SDAG-GFX12 %s
7 ; RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-VI %s
8 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-GFX9 %s
9 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1101 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GFX11,GISEL-GFX11 %s
10 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefixes=GISEL-GFX12 %s
12 ; <GFX9 has no V_SAT_PK, GFX9+ has V_SAT_PK, GFX11 has V_SAT_PK with t16
14 declare i16 @llvm.smin.i16(i16, i16)
15 declare i16 @llvm.smax.i16(i16, i16)
17 declare <2 x i16> @llvm.smin.v2i16(<2 x i16>, <2 x i16>)
18 declare <2 x i16> @llvm.smax.v2i16(<2 x i16>, <2 x i16>)
20 define <2 x i16> @basic_smax_smin(i16 %src0, i16 %src1) {
21 ; SDAG-VI-LABEL: basic_smax_smin:
22 ; SDAG-VI:       ; %bb.0:
23 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
24 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
25 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
26 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
27 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
28 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
29 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
30 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
32 ; SDAG-GFX9-LABEL: basic_smax_smin:
33 ; SDAG-GFX9:       ; %bb.0:
34 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
35 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
36 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
37 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
38 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
39 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
40 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
42 ; SDAG-GFX11-LABEL: basic_smax_smin:
43 ; SDAG-GFX11:       ; %bb.0:
44 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
45 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
46 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
47 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
48 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
49 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
51 ; SDAG-GFX12-LABEL: basic_smax_smin:
52 ; SDAG-GFX12:       ; %bb.0:
53 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
54 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
55 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
56 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
57 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
58 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
59 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
60 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
61 ; SDAG-GFX12-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
62 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
64 ; GISEL-VI-LABEL: basic_smax_smin:
65 ; GISEL-VI:       ; %bb.0:
66 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
67 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
68 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
69 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
70 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
71 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
72 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
73 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
75 ; GISEL-GFX9-LABEL: basic_smax_smin:
76 ; GISEL-GFX9:       ; %bb.0:
77 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
78 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
79 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
80 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
81 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
82 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
83 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
85 ; GISEL-GFX11-LABEL: basic_smax_smin:
86 ; GISEL-GFX11:       ; %bb.0:
87 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
88 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
89 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
90 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
91 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
92 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
93 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
95 ; GISEL-GFX12-LABEL: basic_smax_smin:
96 ; GISEL-GFX12:       ; %bb.0:
97 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
98 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
99 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
100 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
101 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
102 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
103 ; GISEL-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
104 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
105 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v0, 0xffff, v0
106 ; GISEL-GFX12-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
107 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
109   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
110   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
111   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
112   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
113   %insert.0 = insertelement <2 x i16> poison, i16 %src0.clamp, i32 0
114   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
115   ret <2 x i16> %vec
118 ; Check that we don't emit a VALU instruction for SGPR inputs.
119 define amdgpu_kernel void @basic_smax_smin_sgpr(ptr addrspace(1) %out, i32 inreg %src0ext, i32 inreg %src1ext) {
120 ; SDAG-VI-LABEL: basic_smax_smin_sgpr:
121 ; SDAG-VI:       ; %bb.0:
122 ; SDAG-VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
123 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, 0xff
124 ; SDAG-VI-NEXT:    s_waitcnt lgkmcnt(0)
125 ; SDAG-VI-NEXT:    v_max_i16_e64 v1, s2, 0
126 ; SDAG-VI-NEXT:    v_max_i16_e64 v2, s3, 0
127 ; SDAG-VI-NEXT:    v_min_i16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
128 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
129 ; SDAG-VI-NEXT:    v_or_b32_e32 v2, v1, v0
130 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, s0
131 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, s1
132 ; SDAG-VI-NEXT:    flat_store_dword v[0:1], v2
133 ; SDAG-VI-NEXT:    s_endpgm
135 ; SDAG-GFX9-LABEL: basic_smax_smin_sgpr:
136 ; SDAG-GFX9:       ; %bb.0:
137 ; SDAG-GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
138 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
139 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v0, 0
140 ; SDAG-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
141 ; SDAG-GFX9-NEXT:    v_med3_i16 v2, s2, 0, v1
142 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, s3, 0, v1
143 ; SDAG-GFX9-NEXT:    v_and_b32_e32 v2, 0xffff, v2
144 ; SDAG-GFX9-NEXT:    v_lshl_or_b32 v1, v1, 16, v2
145 ; SDAG-GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
146 ; SDAG-GFX9-NEXT:    s_endpgm
148 ; SDAG-GFX11-LABEL: basic_smax_smin_sgpr:
149 ; SDAG-GFX11:       ; %bb.0:
150 ; SDAG-GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
151 ; SDAG-GFX11-NEXT:    v_mov_b32_e32 v2, 0
152 ; SDAG-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
153 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, s2, 0, 0xff
154 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, s3, 0, 0xff
155 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
156 ; SDAG-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
157 ; SDAG-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
158 ; SDAG-GFX11-NEXT:    global_store_b32 v2, v0, s[0:1]
159 ; SDAG-GFX11-NEXT:    s_endpgm
161 ; SDAG-GFX12-LABEL: basic_smax_smin_sgpr:
162 ; SDAG-GFX12:       ; %bb.0:
163 ; SDAG-GFX12-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
164 ; SDAG-GFX12-NEXT:    v_mov_b32_e32 v2, 0
165 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
166 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, s2, 0, 0xff
167 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, s3, 0, 0xff
168 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
169 ; SDAG-GFX12-NEXT:    v_and_b32_e32 v0, 0xffff, v0
170 ; SDAG-GFX12-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
171 ; SDAG-GFX12-NEXT:    global_store_b32 v2, v0, s[0:1]
172 ; SDAG-GFX12-NEXT:    s_endpgm
174 ; GISEL-VI-LABEL: basic_smax_smin_sgpr:
175 ; GISEL-VI:       ; %bb.0:
176 ; GISEL-VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
177 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, 0
178 ; GISEL-VI-NEXT:    s_sext_i32_i16 s5, 0xff
179 ; GISEL-VI-NEXT:    s_waitcnt lgkmcnt(0)
180 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
181 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
182 ; GISEL-VI-NEXT:    s_max_i32 s3, s3, s4
183 ; GISEL-VI-NEXT:    s_max_i32 s2, s2, s4
184 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
185 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
186 ; GISEL-VI-NEXT:    s_min_i32 s3, s3, s5
187 ; GISEL-VI-NEXT:    s_min_i32 s2, s2, s5
188 ; GISEL-VI-NEXT:    s_and_b32 s3, 0xffff, s3
189 ; GISEL-VI-NEXT:    s_and_b32 s2, 0xffff, s2
190 ; GISEL-VI-NEXT:    s_lshl_b32 s3, s3, 16
191 ; GISEL-VI-NEXT:    s_or_b32 s2, s2, s3
192 ; GISEL-VI-NEXT:    v_mov_b32_e32 v0, s0
193 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, s2
194 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, s1
195 ; GISEL-VI-NEXT:    flat_store_dword v[0:1], v2
196 ; GISEL-VI-NEXT:    s_endpgm
198 ; GISEL-GFX9-LABEL: basic_smax_smin_sgpr:
199 ; GISEL-GFX9:       ; %bb.0:
200 ; GISEL-GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24
201 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, 0
202 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s5, 0xff
203 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0
204 ; GISEL-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
205 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, s2
206 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s3
207 ; GISEL-GFX9-NEXT:    s_max_i32 s2, s2, s4
208 ; GISEL-GFX9-NEXT:    s_max_i32 s3, s3, s4
209 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s2, s2
210 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s3
211 ; GISEL-GFX9-NEXT:    s_min_i32 s2, s2, s5
212 ; GISEL-GFX9-NEXT:    s_min_i32 s3, s3, s5
213 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
214 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s2
215 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
216 ; GISEL-GFX9-NEXT:    s_endpgm
218 ; GISEL-GFX11-LABEL: basic_smax_smin_sgpr:
219 ; GISEL-GFX11:       ; %bb.0:
220 ; GISEL-GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
221 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, 0
222 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s5, 0xff
223 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v1, 0
224 ; GISEL-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
225 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s2, s2
226 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, s3
227 ; GISEL-GFX11-NEXT:    s_max_i32 s2, s2, s4
228 ; GISEL-GFX11-NEXT:    s_max_i32 s3, s3, s4
229 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s2, s2
230 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, s3
231 ; GISEL-GFX11-NEXT:    s_min_i32 s2, s2, s5
232 ; GISEL-GFX11-NEXT:    s_min_i32 s3, s3, s5
233 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
234 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
235 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v0, s2
236 ; GISEL-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
237 ; GISEL-GFX11-NEXT:    s_endpgm
239 ; GISEL-GFX12-LABEL: basic_smax_smin_sgpr:
240 ; GISEL-GFX12:       ; %bb.0:
241 ; GISEL-GFX12-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24
242 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s4, 0
243 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s5, 0xff
244 ; GISEL-GFX12-NEXT:    v_mov_b32_e32 v1, 0
245 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
246 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s2, s2
247 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s3, s3
248 ; GISEL-GFX12-NEXT:    s_max_i32 s2, s2, s4
249 ; GISEL-GFX12-NEXT:    s_max_i32 s3, s3, s4
250 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s2, s2
251 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s3, s3
252 ; GISEL-GFX12-NEXT:    s_min_i32 s2, s2, s5
253 ; GISEL-GFX12-NEXT:    s_min_i32 s3, s3, s5
254 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
255 ; GISEL-GFX12-NEXT:    s_pack_ll_b32_b16 s2, s2, s3
256 ; GISEL-GFX12-NEXT:    v_mov_b32_e32 v0, s2
257 ; GISEL-GFX12-NEXT:    global_store_b32 v1, v0, s[0:1]
258 ; GISEL-GFX12-NEXT:    s_endpgm
260   %src0 = trunc i32 %src0ext to i16
261   %src1 = trunc i32 %src1ext to i16
262   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
263   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
264   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
265   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
266   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
267   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
268   store <2 x i16> %vec, ptr addrspace(1) %out
269   ret void
272 define <2 x i16> @basic_smin_smax(i16 %src0, i16 %src1) {
273 ; SDAG-VI-LABEL: basic_smin_smax:
274 ; SDAG-VI:       ; %bb.0:
275 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
276 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
277 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
278 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
279 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
280 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
281 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
282 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
284 ; SDAG-GFX9-LABEL: basic_smin_smax:
285 ; SDAG-GFX9:       ; %bb.0:
286 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
287 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
288 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
289 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
290 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
291 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
292 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
294 ; SDAG-GFX11-LABEL: basic_smin_smax:
295 ; SDAG-GFX11:       ; %bb.0:
296 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
297 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
298 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
299 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
300 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
301 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
303 ; SDAG-GFX12-LABEL: basic_smin_smax:
304 ; SDAG-GFX12:       ; %bb.0:
305 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
306 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
307 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
308 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
309 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
310 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
311 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
312 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
313 ; SDAG-GFX12-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
314 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
316 ; GISEL-VI-LABEL: basic_smin_smax:
317 ; GISEL-VI:       ; %bb.0:
318 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
319 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
320 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
321 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
322 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
323 ; GISEL-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
324 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
325 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
327 ; GISEL-GFX9-LABEL: basic_smin_smax:
328 ; GISEL-GFX9:       ; %bb.0:
329 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
330 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
331 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
332 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
333 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
334 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
335 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
337 ; GISEL-GFX11-LABEL: basic_smin_smax:
338 ; GISEL-GFX11:       ; %bb.0:
339 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
340 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
341 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
342 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
343 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
344 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
345 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
347 ; GISEL-GFX12-LABEL: basic_smin_smax:
348 ; GISEL-GFX12:       ; %bb.0:
349 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
350 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
351 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
352 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
353 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
354 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
355 ; GISEL-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
356 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
357 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v0, 0xffff, v0
358 ; GISEL-GFX12-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
359 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
361   %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)
362   %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)
363   %src1.min = call i16 @llvm.smin.i16(i16 %src1, i16 255)
364   %src1.clamp = call i16 @llvm.smax.i16(i16 %src1.min, i16 0)
365   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
366   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
367   ret <2 x i16> %vec
370 define <2 x i16> @basic_smin_smax_combined(i16 %src0, i16 %src1) {
371 ; SDAG-VI-LABEL: basic_smin_smax_combined:
372 ; SDAG-VI:       ; %bb.0:
373 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
374 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
375 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
376 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
377 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
378 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
379 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
380 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
382 ; SDAG-GFX9-LABEL: basic_smin_smax_combined:
383 ; SDAG-GFX9:       ; %bb.0:
384 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
385 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
386 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
387 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
388 ; SDAG-GFX9-NEXT:    s_mov_b32 s4, 0x5040100
389 ; SDAG-GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4
390 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
392 ; SDAG-GFX11-LABEL: basic_smin_smax_combined:
393 ; SDAG-GFX11:       ; %bb.0:
394 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
395 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
396 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
397 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
398 ; SDAG-GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
399 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
401 ; SDAG-GFX12-LABEL: basic_smin_smax_combined:
402 ; SDAG-GFX12:       ; %bb.0:
403 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
404 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
405 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
406 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
407 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
408 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
409 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
410 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
411 ; SDAG-GFX12-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
412 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
414 ; GISEL-VI-LABEL: basic_smin_smax_combined:
415 ; GISEL-VI:       ; %bb.0:
416 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
417 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
418 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
419 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
420 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
421 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
422 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
423 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
425 ; GISEL-GFX9-LABEL: basic_smin_smax_combined:
426 ; GISEL-GFX9:       ; %bb.0:
427 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
428 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
429 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
430 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
431 ; GISEL-GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
432 ; GISEL-GFX9-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
433 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
435 ; GISEL-GFX11-LABEL: basic_smin_smax_combined:
436 ; GISEL-GFX11:       ; %bb.0:
437 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
438 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
439 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
440 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
441 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
442 ; GISEL-GFX11-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
443 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
445 ; GISEL-GFX12-LABEL: basic_smin_smax_combined:
446 ; GISEL-GFX12:       ; %bb.0:
447 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
448 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
449 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
450 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
451 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
452 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
453 ; GISEL-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
454 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
455 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v0, 0xffff, v0
456 ; GISEL-GFX12-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
457 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
459   %src0.min = call i16 @llvm.smin.i16(i16 %src0, i16 255)
460   %src0.clamp = call i16 @llvm.smax.i16(i16 %src0.min, i16 0)
461   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
462   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
463   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
464   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
465   ret <2 x i16> %vec
468 define <2 x i16> @vec_smax_smin(<2 x i16> %src) {
469 ; SDAG-VI-LABEL: vec_smax_smin:
470 ; SDAG-VI:       ; %bb.0:
471 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
472 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0
473 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
474 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
475 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
476 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
477 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
478 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
479 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
481 ; SDAG-GFX9-LABEL: vec_smax_smin:
482 ; SDAG-GFX9:       ; %bb.0:
483 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
484 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
485 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
486 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
487 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
489 ; SDAG-GFX11-LABEL: vec_smax_smin:
490 ; SDAG-GFX11:       ; %bb.0:
491 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
492 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
493 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
494 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
495 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
497 ; SDAG-GFX12-LABEL: vec_smax_smin:
498 ; SDAG-GFX12:       ; %bb.0:
499 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
500 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
501 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
502 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
503 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
504 ; SDAG-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
505 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
506 ; SDAG-GFX12-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
507 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
509 ; GISEL-VI-LABEL: vec_smax_smin:
510 ; GISEL-VI:       ; %bb.0:
511 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
512 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
513 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v0
514 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
515 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
516 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
517 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
518 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
519 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
521 ; GISEL-GFX9-LABEL: vec_smax_smin:
522 ; GISEL-GFX9:       ; %bb.0:
523 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
524 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
525 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
526 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v0, v1
527 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
529 ; GISEL-GFX11-LABEL: vec_smax_smin:
530 ; GISEL-GFX11:       ; %bb.0:
531 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
532 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
533 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
534 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
535 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
537 ; GISEL-GFX12-LABEL: vec_smax_smin:
538 ; GISEL-GFX12:       ; %bb.0:
539 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
540 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
541 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
542 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
543 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
544 ; GISEL-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
545 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
546 ; GISEL-GFX12-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
547 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
549   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
550   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
551   ret <2 x i16> %src.clamp
554 ; Check that we don't emit a VALU instruction for SGPR inputs.
555 define amdgpu_kernel void @vec_smax_smin_sgpr(ptr addrspace(1) %out, <2 x i16> inreg %src) {
556 ; SDAG-VI-LABEL: vec_smax_smin_sgpr:
557 ; SDAG-VI:       ; %bb.0:
558 ; SDAG-VI-NEXT:    s_load_dword s2, s[4:5], 0x2c
559 ; SDAG-VI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
560 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, 0xff
561 ; SDAG-VI-NEXT:    s_waitcnt lgkmcnt(0)
562 ; SDAG-VI-NEXT:    s_lshr_b32 s3, s2, 16
563 ; SDAG-VI-NEXT:    v_max_i16_e64 v1, s2, 0
564 ; SDAG-VI-NEXT:    v_max_i16_e64 v2, s3, 0
565 ; SDAG-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
566 ; SDAG-VI-NEXT:    v_min_i16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
567 ; SDAG-VI-NEXT:    v_or_b32_e32 v2, v1, v0
568 ; SDAG-VI-NEXT:    v_mov_b32_e32 v0, s0
569 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, s1
570 ; SDAG-VI-NEXT:    flat_store_dword v[0:1], v2
571 ; SDAG-VI-NEXT:    s_endpgm
573 ; SDAG-GFX9-LABEL: vec_smax_smin_sgpr:
574 ; SDAG-GFX9:       ; %bb.0:
575 ; SDAG-GFX9-NEXT:    s_load_dword s2, s[4:5], 0x2c
576 ; SDAG-GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
577 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v0, 0
578 ; SDAG-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
579 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v1, s2, 0
580 ; SDAG-GFX9-NEXT:    s_movk_i32 s2, 0xff
581 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v1, v1, s2 op_sel_hi:[1,0]
582 ; SDAG-GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
583 ; SDAG-GFX9-NEXT:    s_endpgm
585 ; SDAG-GFX11-LABEL: vec_smax_smin_sgpr:
586 ; SDAG-GFX11:       ; %bb.0:
587 ; SDAG-GFX11-NEXT:    s_clause 0x1
588 ; SDAG-GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x2c
589 ; SDAG-GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
590 ; SDAG-GFX11-NEXT:    v_mov_b32_e32 v1, 0
591 ; SDAG-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
592 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, s2, 0
593 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
594 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
595 ; SDAG-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
596 ; SDAG-GFX11-NEXT:    s_endpgm
598 ; SDAG-GFX12-LABEL: vec_smax_smin_sgpr:
599 ; SDAG-GFX12:       ; %bb.0:
600 ; SDAG-GFX12-NEXT:    s_load_b96 s[0:2], s[4:5], 0x24
601 ; SDAG-GFX12-NEXT:    v_mov_b32_e32 v1, 0
602 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
603 ; SDAG-GFX12-NEXT:    v_pk_max_i16 v0, s2, 0
604 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
605 ; SDAG-GFX12-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
606 ; SDAG-GFX12-NEXT:    global_store_b32 v1, v0, s[0:1]
607 ; SDAG-GFX12-NEXT:    s_endpgm
609 ; GISEL-VI-LABEL: vec_smax_smin_sgpr:
610 ; GISEL-VI:       ; %bb.0:
611 ; GISEL-VI-NEXT:    s_load_dword s2, s[4:5], 0x2c
612 ; GISEL-VI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
613 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, 0
614 ; GISEL-VI-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GISEL-VI-NEXT:    s_lshr_b32 s4, s2, 16
616 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
617 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, s4
618 ; GISEL-VI-NEXT:    s_max_i32 s2, s2, s3
619 ; GISEL-VI-NEXT:    s_max_i32 s3, s4, s3
620 ; GISEL-VI-NEXT:    s_sext_i32_i16 s4, 0xff
621 ; GISEL-VI-NEXT:    s_sext_i32_i16 s3, s3
622 ; GISEL-VI-NEXT:    s_sext_i32_i16 s2, s2
623 ; GISEL-VI-NEXT:    s_min_i32 s3, s3, s4
624 ; GISEL-VI-NEXT:    s_min_i32 s2, s2, s4
625 ; GISEL-VI-NEXT:    s_and_b32 s3, 0xffff, s3
626 ; GISEL-VI-NEXT:    s_and_b32 s2, 0xffff, s2
627 ; GISEL-VI-NEXT:    s_lshl_b32 s3, s3, 16
628 ; GISEL-VI-NEXT:    s_or_b32 s2, s2, s3
629 ; GISEL-VI-NEXT:    v_mov_b32_e32 v0, s0
630 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, s2
631 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, s1
632 ; GISEL-VI-NEXT:    flat_store_dword v[0:1], v2
633 ; GISEL-VI-NEXT:    s_endpgm
635 ; GISEL-GFX9-LABEL: vec_smax_smin_sgpr:
636 ; GISEL-GFX9:       ; %bb.0:
637 ; GISEL-GFX9-NEXT:    s_load_dword s2, s[4:5], 0x2c
638 ; GISEL-GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24
639 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, 0
640 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0
641 ; GISEL-GFX9-NEXT:    s_waitcnt lgkmcnt(0)
642 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, s2
643 ; GISEL-GFX9-NEXT:    s_ashr_i32 s2, s2, 16
644 ; GISEL-GFX9-NEXT:    s_max_i32 s3, s4, s3
645 ; GISEL-GFX9-NEXT:    s_max_i32 s2, s2, 0
646 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
647 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s3, s2
648 ; GISEL-GFX9-NEXT:    s_ashr_i32 s2, s2, 16
649 ; GISEL-GFX9-NEXT:    s_sext_i32_i16 s4, 0xff00ff
650 ; GISEL-GFX9-NEXT:    s_min_i32 s3, s3, s4
651 ; GISEL-GFX9-NEXT:    s_min_i32 s2, s2, 0xff
652 ; GISEL-GFX9-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
653 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v0, s2
654 ; GISEL-GFX9-NEXT:    global_store_dword v1, v0, s[0:1]
655 ; GISEL-GFX9-NEXT:    s_endpgm
657 ; GISEL-GFX11-LABEL: vec_smax_smin_sgpr:
658 ; GISEL-GFX11:       ; %bb.0:
659 ; GISEL-GFX11-NEXT:    s_clause 0x1
660 ; GISEL-GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x2c
661 ; GISEL-GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24
662 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, 0
663 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v1, 0
664 ; GISEL-GFX11-NEXT:    s_waitcnt lgkmcnt(0)
665 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, s2
666 ; GISEL-GFX11-NEXT:    s_ashr_i32 s2, s2, 16
667 ; GISEL-GFX11-NEXT:    s_max_i32 s3, s4, s3
668 ; GISEL-GFX11-NEXT:    s_max_i32 s2, s2, 0
669 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
670 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
671 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s3, 0xff00ff
672 ; GISEL-GFX11-NEXT:    s_sext_i32_i16 s4, s2
673 ; GISEL-GFX11-NEXT:    s_ashr_i32 s2, s2, 16
674 ; GISEL-GFX11-NEXT:    s_min_i32 s3, s4, s3
675 ; GISEL-GFX11-NEXT:    s_min_i32 s2, s2, 0xff
676 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
677 ; GISEL-GFX11-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
678 ; GISEL-GFX11-NEXT:    v_mov_b32_e32 v0, s2
679 ; GISEL-GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
680 ; GISEL-GFX11-NEXT:    s_endpgm
682 ; GISEL-GFX12-LABEL: vec_smax_smin_sgpr:
683 ; GISEL-GFX12:       ; %bb.0:
684 ; GISEL-GFX12-NEXT:    s_load_b96 s[0:2], s[4:5], 0x24
685 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s3, 0
686 ; GISEL-GFX12-NEXT:    v_mov_b32_e32 v1, 0
687 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
688 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s4, s2
689 ; GISEL-GFX12-NEXT:    s_ashr_i32 s2, s2, 16
690 ; GISEL-GFX12-NEXT:    s_max_i32 s3, s4, s3
691 ; GISEL-GFX12-NEXT:    s_max_i32 s2, s2, 0
692 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
693 ; GISEL-GFX12-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
694 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s3, 0xff00ff
695 ; GISEL-GFX12-NEXT:    s_sext_i32_i16 s4, s2
696 ; GISEL-GFX12-NEXT:    s_ashr_i32 s2, s2, 16
697 ; GISEL-GFX12-NEXT:    s_min_i32 s3, s4, s3
698 ; GISEL-GFX12-NEXT:    s_min_i32 s2, s2, 0xff
699 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
700 ; GISEL-GFX12-NEXT:    s_pack_ll_b32_b16 s2, s3, s2
701 ; GISEL-GFX12-NEXT:    v_mov_b32_e32 v0, s2
702 ; GISEL-GFX12-NEXT:    global_store_b32 v1, v0, s[0:1]
703 ; GISEL-GFX12-NEXT:    s_endpgm
705   %src.max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src, <2 x i16> <i16 0, i16 0>)
706   %src.clamp = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src.max, <2 x i16> <i16 255, i16 255>)
707   store <2 x i16> %src.clamp, ptr addrspace(1) %out
708   ret void
711 define <2 x i16> @vec_smin_smax(<2 x i16> %src) {
712 ; SDAG-VI-LABEL: vec_smin_smax:
713 ; SDAG-VI:       ; %bb.0:
714 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
715 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0xff
716 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
717 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
718 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
719 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
720 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
721 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
722 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
724 ; SDAG-GFX9-LABEL: vec_smin_smax:
725 ; SDAG-GFX9:       ; %bb.0:
726 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
727 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
728 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
729 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
730 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
732 ; SDAG-GFX11-LABEL: vec_smin_smax:
733 ; SDAG-GFX11:       ; %bb.0:
734 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
735 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
736 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
737 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
738 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
740 ; SDAG-GFX12-LABEL: vec_smin_smax:
741 ; SDAG-GFX12:       ; %bb.0:
742 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
743 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
744 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
745 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
746 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
747 ; SDAG-GFX12-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
748 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
749 ; SDAG-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
750 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
752 ; GISEL-VI-LABEL: vec_smin_smax:
753 ; GISEL-VI:       ; %bb.0:
754 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
755 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, 0xff
756 ; GISEL-VI-NEXT:    v_min_i16_e32 v2, 0xff, v0
757 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
758 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v2
759 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
760 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
761 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
762 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
764 ; GISEL-GFX9-LABEL: vec_smin_smax:
765 ; GISEL-GFX9:       ; %bb.0:
766 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
767 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
768 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v0, v1
769 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
770 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
772 ; GISEL-GFX11-LABEL: vec_smin_smax:
773 ; GISEL-GFX11:       ; %bb.0:
774 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
775 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
776 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
777 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
778 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
780 ; GISEL-GFX12-LABEL: vec_smin_smax:
781 ; GISEL-GFX12:       ; %bb.0:
782 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
783 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
784 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
785 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
786 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
787 ; GISEL-GFX12-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
788 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
789 ; GISEL-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
790 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
792   %src.min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %src, <2 x i16> <i16 255, i16 255>)
793   %src.clamp = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %src.min, <2 x i16> <i16 0, i16 0>)
794   ret <2 x i16> %src.clamp
796 define i16 @basic_smax_smin_bit_or(i16 %src0, i16 %src1) {
797 ; SDAG-VI-LABEL: basic_smax_smin_bit_or:
798 ; SDAG-VI:       ; %bb.0:
799 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
800 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
801 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
802 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
803 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
804 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
805 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
806 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
808 ; SDAG-GFX9-LABEL: basic_smax_smin_bit_or:
809 ; SDAG-GFX9:       ; %bb.0:
810 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
811 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
812 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
813 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
814 ; SDAG-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
815 ; SDAG-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
816 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
818 ; GFX11-LABEL: basic_smax_smin_bit_or:
819 ; GFX11:       ; %bb.0:
820 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
821 ; GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
822 ; GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
823 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
824 ; GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
825 ; GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
826 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
828 ; SDAG-GFX12-LABEL: basic_smax_smin_bit_or:
829 ; SDAG-GFX12:       ; %bb.0:
830 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
831 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
832 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
833 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
834 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
835 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
836 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
837 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
838 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
839 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
840 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
842 ; GISEL-VI-LABEL: basic_smax_smin_bit_or:
843 ; GISEL-VI:       ; %bb.0:
844 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
845 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
846 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
847 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
848 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
849 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
850 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
851 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
853 ; GISEL-GFX9-LABEL: basic_smax_smin_bit_or:
854 ; GISEL-GFX9:       ; %bb.0:
855 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
856 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
857 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
858 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
859 ; GISEL-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
860 ; GISEL-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
861 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
863 ; GISEL-GFX12-LABEL: basic_smax_smin_bit_or:
864 ; GISEL-GFX12:       ; %bb.0:
865 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
866 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
867 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
868 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
869 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
870 ; GISEL-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
871 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
872 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
873 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
874 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
875 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
877   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
878   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
879   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
880   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
881   %src0.and = and i16 %src0.clamp, 255
882   %src1.shl = shl i16 %src1.clamp, 8
883   %or = or i16 %src0.and, %src1.shl
884   ret i16 %or
886 define i16 @basic_umax_umin_bit_or(i16 %src0, i16 %src1) {
887 ; SDAG-VI-LABEL: basic_umax_umin_bit_or:
888 ; SDAG-VI:       ; %bb.0:
889 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
890 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
891 ; SDAG-VI-NEXT:    v_min_u16_e32 v0, 0xff, v0
892 ; SDAG-VI-NEXT:    v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
893 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
894 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
896 ; SDAG-GFX9-LABEL: basic_umax_umin_bit_or:
897 ; SDAG-GFX9:       ; %bb.0:
898 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
899 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
900 ; SDAG-GFX9-NEXT:    v_min_u16_e32 v0, 0xff, v0
901 ; SDAG-GFX9-NEXT:    v_min_u16_sdwa v1, v1, s4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
902 ; SDAG-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
903 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
905 ; GFX11-LABEL: basic_umax_umin_bit_or:
906 ; GFX11:       ; %bb.0:
907 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
908 ; GFX11-NEXT:    v_min_u16 v1, 0xff, v1
909 ; GFX11-NEXT:    v_min_u16 v0, 0xff, v0
910 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
911 ; GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
912 ; GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
913 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
915 ; SDAG-GFX12-LABEL: basic_umax_umin_bit_or:
916 ; SDAG-GFX12:       ; %bb.0:
917 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
918 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
919 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
920 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
921 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
922 ; SDAG-GFX12-NEXT:    v_min_u16 v1, 0xff, v1
923 ; SDAG-GFX12-NEXT:    v_min_u16 v0, 0xff, v0
924 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
925 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
926 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
927 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
929 ; GISEL-VI-LABEL: basic_umax_umin_bit_or:
930 ; GISEL-VI:       ; %bb.0:
931 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
932 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
933 ; GISEL-VI-NEXT:    v_min_u16_e32 v0, 0xff, v0
934 ; GISEL-VI-NEXT:    v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
935 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
936 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
938 ; GISEL-GFX9-LABEL: basic_umax_umin_bit_or:
939 ; GISEL-GFX9:       ; %bb.0:
940 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
941 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
942 ; GISEL-GFX9-NEXT:    v_min_u16_e32 v0, 0xff, v0
943 ; GISEL-GFX9-NEXT:    v_min_u16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
944 ; GISEL-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
945 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
947 ; GISEL-GFX12-LABEL: basic_umax_umin_bit_or:
948 ; GISEL-GFX12:       ; %bb.0:
949 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
950 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
951 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
952 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
953 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
954 ; GISEL-GFX12-NEXT:    v_min_u16 v1, 0xff, v1
955 ; GISEL-GFX12-NEXT:    v_min_u16 v0, 0xff, v0
956 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
957 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
958 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
959 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
961   %src0.max = call i16 @llvm.umax.i16(i16 %src0, i16 0)
962   %src0.clamp = call i16 @llvm.umin.i16(i16 %src0.max, i16 255)
963   %src1.max = call i16 @llvm.umax.i16(i16 %src1, i16 0)
964   %src1.clamp = call i16 @llvm.umin.i16(i16 %src1.max, i16 255)
965   %src0.and = and i16 %src0.clamp, 255
966   %src1.shl = shl i16 %src1.clamp, 8
967   %or = or i16 %src0.and, %src1.shl
968   ret i16 %or
970 define i16 @basic_smax_smin_vec_cast(i16 %src0, i16 %src1) {
971 ; SDAG-VI-LABEL: basic_smax_smin_vec_cast:
972 ; SDAG-VI:       ; %bb.0:
973 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
974 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
975 ; SDAG-VI-NEXT:    v_max_i16_e32 v1, 0, v1
976 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
977 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
978 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
979 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
980 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
982 ; SDAG-GFX9-LABEL: basic_smax_smin_vec_cast:
983 ; SDAG-GFX9:       ; %bb.0:
984 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
985 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
986 ; SDAG-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
987 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
988 ; SDAG-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
989 ; SDAG-GFX9-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
990 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
992 ; SDAG-GFX11-LABEL: basic_smax_smin_vec_cast:
993 ; SDAG-GFX11:       ; %bb.0:
994 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
995 ; SDAG-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
996 ; SDAG-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
997 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
998 ; SDAG-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
999 ; SDAG-GFX11-NEXT:    v_and_b32_e32 v0, 0xff, v0
1000 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1001 ; SDAG-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1002 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
1004 ; SDAG-GFX12-LABEL: basic_smax_smin_vec_cast:
1005 ; SDAG-GFX12:       ; %bb.0:
1006 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1007 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
1008 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
1009 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
1010 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
1011 ; SDAG-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
1012 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1013 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1014 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1015 ; SDAG-GFX12-NEXT:    v_and_b32_e32 v0, 0xff, v0
1016 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1017 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1018 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
1020 ; GISEL-VI-LABEL: basic_smax_smin_vec_cast:
1021 ; GISEL-VI:       ; %bb.0:
1022 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1023 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1024 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
1025 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v1
1026 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
1027 ; GISEL-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1028 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
1029 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
1031 ; GISEL-GFX9-LABEL: basic_smax_smin_vec_cast:
1032 ; GISEL-GFX9:       ; %bb.0:
1033 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1034 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
1035 ; GISEL-GFX9-NEXT:    v_med3_i16 v1, v1, 0, v2
1036 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
1037 ; GISEL-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
1038 ; GISEL-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
1039 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
1041 ; GISEL-GFX11-LABEL: basic_smax_smin_vec_cast:
1042 ; GISEL-GFX11:       ; %bb.0:
1043 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1044 ; GISEL-GFX11-NEXT:    v_med3_i16 v1, v1, 0, 0xff
1045 ; GISEL-GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1046 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1047 ; GISEL-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1048 ; GISEL-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1049 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
1051 ; GISEL-GFX12-LABEL: basic_smax_smin_vec_cast:
1052 ; GISEL-GFX12:       ; %bb.0:
1053 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1054 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
1055 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
1056 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
1057 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
1058 ; GISEL-GFX12-NEXT:    v_med3_i16 v1, v1, 0, 0xff
1059 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1060 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1061 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1062 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1063 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
1065   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
1066   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
1067   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
1068   %src1.clamp = call i16 @llvm.smin.i16(i16 %src1.max, i16 255)
1069   %insert.0 = insertelement <2 x i16> undef, i16 %src0.clamp, i32 0
1070   %vec = insertelement <2 x i16> %insert.0, i16 %src1.clamp, i32 1
1071   %vec.trunc = trunc <2 x i16> %vec to <2 x i8>
1072   %cast = bitcast <2 x i8> %vec.trunc to i16
1073   ret i16 %cast
1075 define i16 @basic_smax_smin_bit_shl(i16 %src0, i16 %src1) {
1076 ; SDAG-VI-LABEL: basic_smax_smin_bit_shl:
1077 ; SDAG-VI:       ; %bb.0:
1078 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1079 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1080 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
1081 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
1082 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1083 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
1084 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
1086 ; SDAG-GFX9-LABEL: basic_smax_smin_bit_shl:
1087 ; SDAG-GFX9:       ; %bb.0:
1088 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1089 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
1090 ; SDAG-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
1091 ; SDAG-GFX9-NEXT:    v_mov_b32_e32 v2, 0
1092 ; SDAG-GFX9-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1093 ; SDAG-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
1094 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
1096 ; GFX11-LABEL: basic_smax_smin_bit_shl:
1097 ; GFX11:       ; %bb.0:
1098 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1099 ; GFX11-NEXT:    v_max_i16 v1, v1, 0
1100 ; GFX11-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1101 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1102 ; GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1103 ; GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1104 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1106 ; SDAG-GFX12-LABEL: basic_smax_smin_bit_shl:
1107 ; SDAG-GFX12:       ; %bb.0:
1108 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1109 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
1110 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
1111 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
1112 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
1113 ; SDAG-GFX12-NEXT:    v_max_i16 v1, v1, 0
1114 ; SDAG-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1115 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1116 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1117 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1118 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
1120 ; GISEL-VI-LABEL: basic_smax_smin_bit_shl:
1121 ; GISEL-VI:       ; %bb.0:
1122 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1123 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1124 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
1125 ; GISEL-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
1126 ; GISEL-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1127 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v0, v1
1128 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
1130 ; GISEL-GFX9-LABEL: basic_smax_smin_bit_shl:
1131 ; GISEL-GFX9:       ; %bb.0:
1132 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1133 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0xff
1134 ; GISEL-GFX9-NEXT:    v_med3_i16 v0, v0, 0, v2
1135 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v2, 0
1136 ; GISEL-GFX9-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1137 ; GISEL-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
1138 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
1140 ; GISEL-GFX12-LABEL: basic_smax_smin_bit_shl:
1141 ; GISEL-GFX12:       ; %bb.0:
1142 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1143 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
1144 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
1145 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
1146 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
1147 ; GISEL-GFX12-NEXT:    v_max_i16 v1, v1, 0
1148 ; GISEL-GFX12-NEXT:    v_med3_i16 v0, v0, 0, 0xff
1149 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1150 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1151 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1152 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
1154   %src0.max = call i16 @llvm.smax.i16(i16 %src0, i16 0)
1155   %src0.clamp = call i16 @llvm.smin.i16(i16 %src0.max, i16 255)
1156   %src1.max = call i16 @llvm.smax.i16(i16 %src1, i16 0)
1157   %src1.shl = shl i16 %src1.max, 8
1158   %or = or i16 %src0.clamp, %src1.shl
1159   ret i16 %or
1161 define i16 @basic_smax_smin_vec_input(<2 x i16> %src) {
1162 ; SDAG-VI-LABEL: basic_smax_smin_vec_input:
1163 ; SDAG-VI:       ; %bb.0:
1164 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1165 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0xff
1166 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1167 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
1168 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0
1169 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1170 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1171 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
1172 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
1174 ; SDAG-GFX9-LABEL: basic_smax_smin_vec_input:
1175 ; SDAG-GFX9:       ; %bb.0:
1176 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1177 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
1178 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
1179 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
1180 ; SDAG-GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1181 ; SDAG-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
1182 ; SDAG-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
1183 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
1185 ; SDAG-GFX11-LABEL: basic_smax_smin_vec_input:
1186 ; SDAG-GFX11:       ; %bb.0:
1187 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1188 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
1189 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1190 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
1191 ; SDAG-GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1192 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1193 ; SDAG-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1194 ; SDAG-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1195 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
1197 ; SDAG-GFX12-LABEL: basic_smax_smin_vec_input:
1198 ; SDAG-GFX12:       ; %bb.0:
1199 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1200 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
1201 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
1202 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
1203 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
1204 ; SDAG-GFX12-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
1205 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1206 ; SDAG-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
1207 ; SDAG-GFX12-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1208 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1209 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1210 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1211 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
1213 ; GISEL-VI-LABEL: basic_smax_smin_vec_input:
1214 ; GISEL-VI:       ; %bb.0:
1215 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1216 ; GISEL-VI-NEXT:    v_mov_b32_e32 v1, 0xff
1217 ; GISEL-VI-NEXT:    v_min_i16_e32 v2, 0xff, v0
1218 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1219 ; GISEL-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1220 ; GISEL-VI-NEXT:    v_and_b32_e32 v0, 0xff, v0
1221 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v2
1222 ; GISEL-VI-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
1223 ; GISEL-VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1224 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
1226 ; GISEL-GFX9-LABEL: basic_smax_smin_vec_input:
1227 ; GISEL-GFX9:       ; %bb.0:
1228 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1229 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
1230 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v1, v0
1231 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, 0, v0
1232 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1233 ; GISEL-GFX9-NEXT:    v_and_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1234 ; GISEL-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
1235 ; GISEL-GFX9-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1236 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
1238 ; GISEL-GFX11-LABEL: basic_smax_smin_vec_input:
1239 ; GISEL-GFX11:       ; %bb.0:
1240 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1241 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
1242 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1243 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, 0, v0
1244 ; GISEL-GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1245 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xff, v0
1246 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1247 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v1, 0xff, v1
1248 ; GISEL-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1249 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1250 ; GISEL-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1251 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
1253 ; GISEL-GFX12-LABEL: basic_smax_smin_vec_input:
1254 ; GISEL-GFX12:       ; %bb.0:
1255 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1256 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
1257 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
1258 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
1259 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
1260 ; GISEL-GFX12-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
1261 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1262 ; GISEL-GFX12-NEXT:    v_pk_max_i16 v0, 0, v0
1263 ; GISEL-GFX12-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1264 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v0, 0xff, v0
1265 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1266 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v1, 0xff, v1
1267 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1268 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1269 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1270 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
1272   %smin = call <2 x i16> @llvm.smin.v2i16(<2 x i16> <i16 255, i16 255>, <2 x i16> %src)
1273   %smed = call <2 x i16> @llvm.smax.v2i16(<2 x i16> <i16 0, i16 0>, <2 x i16> %smin)
1274   %vec.trunc = trunc <2 x i16> %smed to <2 x i8>
1275   %cast = bitcast <2 x i8> %vec.trunc to i16
1276   ret i16 %cast
1278 define i16 @basic_smax_smin_vec_input_rev(<2 x i16> %src) {
1279 ; SDAG-VI-LABEL: basic_smax_smin_vec_input_rev:
1280 ; SDAG-VI:       ; %bb.0:
1281 ; SDAG-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1282 ; SDAG-VI-NEXT:    v_mov_b32_e32 v1, 0
1283 ; SDAG-VI-NEXT:    v_max_i16_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1284 ; SDAG-VI-NEXT:    v_max_i16_e32 v0, 0, v0
1285 ; SDAG-VI-NEXT:    v_mov_b32_e32 v2, 0xff
1286 ; SDAG-VI-NEXT:    v_min_i16_e32 v0, 0xff, v0
1287 ; SDAG-VI-NEXT:    v_min_i16_sdwa v1, v1, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1288 ; SDAG-VI-NEXT:    v_or_b32_e32 v0, v0, v1
1289 ; SDAG-VI-NEXT:    s_setpc_b64 s[30:31]
1291 ; SDAG-GFX9-LABEL: basic_smax_smin_vec_input_rev:
1292 ; SDAG-GFX9:       ; %bb.0:
1293 ; SDAG-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1294 ; SDAG-GFX9-NEXT:    v_pk_max_i16 v0, v0, 0
1295 ; SDAG-GFX9-NEXT:    s_movk_i32 s4, 0xff
1296 ; SDAG-GFX9-NEXT:    v_pk_min_i16 v0, v0, s4 op_sel_hi:[1,0]
1297 ; SDAG-GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1298 ; SDAG-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
1299 ; SDAG-GFX9-NEXT:    v_or_b32_e32 v0, v0, v1
1300 ; SDAG-GFX9-NEXT:    s_setpc_b64 s[30:31]
1302 ; SDAG-GFX11-LABEL: basic_smax_smin_vec_input_rev:
1303 ; SDAG-GFX11:       ; %bb.0:
1304 ; SDAG-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1305 ; SDAG-GFX11-NEXT:    v_pk_max_i16 v0, v0, 0
1306 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1307 ; SDAG-GFX11-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
1308 ; SDAG-GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1309 ; SDAG-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1310 ; SDAG-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1311 ; SDAG-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1312 ; SDAG-GFX11-NEXT:    s_setpc_b64 s[30:31]
1314 ; SDAG-GFX12-LABEL: basic_smax_smin_vec_input_rev:
1315 ; SDAG-GFX12:       ; %bb.0:
1316 ; SDAG-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1317 ; SDAG-GFX12-NEXT:    s_wait_expcnt 0x0
1318 ; SDAG-GFX12-NEXT:    s_wait_samplecnt 0x0
1319 ; SDAG-GFX12-NEXT:    s_wait_bvhcnt 0x0
1320 ; SDAG-GFX12-NEXT:    s_wait_kmcnt 0x0
1321 ; SDAG-GFX12-NEXT:    v_pk_max_i16 v0, v0, 0
1322 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1323 ; SDAG-GFX12-NEXT:    v_pk_min_i16 v0, 0xff, v0 op_sel_hi:[0,1]
1324 ; SDAG-GFX12-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1325 ; SDAG-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1326 ; SDAG-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1327 ; SDAG-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1328 ; SDAG-GFX12-NEXT:    s_setpc_b64 s[30:31]
1330 ; GISEL-VI-LABEL: basic_smax_smin_vec_input_rev:
1331 ; GISEL-VI:       ; %bb.0:
1332 ; GISEL-VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1333 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0
1334 ; GISEL-VI-NEXT:    v_max_i16_e32 v1, 0, v0
1335 ; GISEL-VI-NEXT:    v_max_i16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1336 ; GISEL-VI-NEXT:    v_mov_b32_e32 v2, 0xff
1337 ; GISEL-VI-NEXT:    v_min_i16_e32 v1, 0xff, v1
1338 ; GISEL-VI-NEXT:    v_min_i16_sdwa v0, v0, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
1339 ; GISEL-VI-NEXT:    v_or_b32_e32 v0, v1, v0
1340 ; GISEL-VI-NEXT:    s_setpc_b64 s[30:31]
1342 ; GISEL-GFX9-LABEL: basic_smax_smin_vec_input_rev:
1343 ; GISEL-GFX9:       ; %bb.0:
1344 ; GISEL-GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1345 ; GISEL-GFX9-NEXT:    v_pk_max_i16 v0, 0, v0
1346 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff00ff
1347 ; GISEL-GFX9-NEXT:    v_pk_min_i16 v0, v1, v0
1348 ; GISEL-GFX9-NEXT:    v_mov_b32_e32 v1, 0xff
1349 ; GISEL-GFX9-NEXT:    v_and_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1350 ; GISEL-GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
1351 ; GISEL-GFX9-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1352 ; GISEL-GFX9-NEXT:    s_setpc_b64 s[30:31]
1354 ; GISEL-GFX11-LABEL: basic_smax_smin_vec_input_rev:
1355 ; GISEL-GFX11:       ; %bb.0:
1356 ; GISEL-GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1357 ; GISEL-GFX11-NEXT:    v_pk_max_i16 v0, 0, v0
1358 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1359 ; GISEL-GFX11-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
1360 ; GISEL-GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1361 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v0, 0xff, v0
1362 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1363 ; GISEL-GFX11-NEXT:    v_and_b32_e32 v1, 0xff, v1
1364 ; GISEL-GFX11-NEXT:    v_lshlrev_b16 v1, 8, v1
1365 ; GISEL-GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1366 ; GISEL-GFX11-NEXT:    v_or_b32_e32 v0, v0, v1
1367 ; GISEL-GFX11-NEXT:    s_setpc_b64 s[30:31]
1369 ; GISEL-GFX12-LABEL: basic_smax_smin_vec_input_rev:
1370 ; GISEL-GFX12:       ; %bb.0:
1371 ; GISEL-GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
1372 ; GISEL-GFX12-NEXT:    s_wait_expcnt 0x0
1373 ; GISEL-GFX12-NEXT:    s_wait_samplecnt 0x0
1374 ; GISEL-GFX12-NEXT:    s_wait_bvhcnt 0x0
1375 ; GISEL-GFX12-NEXT:    s_wait_kmcnt 0x0
1376 ; GISEL-GFX12-NEXT:    v_pk_max_i16 v0, 0, v0
1377 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1378 ; GISEL-GFX12-NEXT:    v_pk_min_i16 v0, 0xff00ff, v0
1379 ; GISEL-GFX12-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
1380 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v0, 0xff, v0
1381 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1382 ; GISEL-GFX12-NEXT:    v_and_b32_e32 v1, 0xff, v1
1383 ; GISEL-GFX12-NEXT:    v_lshlrev_b16 v1, 8, v1
1384 ; GISEL-GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1385 ; GISEL-GFX12-NEXT:    v_or_b32_e32 v0, v0, v1
1386 ; GISEL-GFX12-NEXT:    s_setpc_b64 s[30:31]
1388   %smax = call <2 x i16> @llvm.smax.v2i16(<2 x i16> <i16 0, i16 0>, <2 x i16> %src)
1389   %smed = call <2 x i16> @llvm.smin.v2i16(<2 x i16> <i16 255, i16 255>, <2 x i16> %smax)
1390   %vec.trunc = trunc <2 x i16> %smed to <2 x i8>
1391   %cast = bitcast <2 x i8> %vec.trunc to i16
1392   ret i16 %cast