[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / preserve-hi16.ll
blob0ad1c30b5b5a4fc55ce368b35e65f0de5953aa47
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=amdgcn -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX8 %s
3 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9ALL,GFX900 %s
4 ; RUN: llc -mtriple=amdgcn -mcpu=gfx906 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9ALL,GFX906 %s
5 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
6 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -mattr=+real-true16 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s
7 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -mattr=-real-true16 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s
9 define i16 @shl_i16(i16 %x, i16 %y) {
10 ; GFX8-LABEL: shl_i16:
11 ; GFX8:       ; %bb.0:
12 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
13 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, v1, v0
14 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
16 ; GFX9ALL-LABEL: shl_i16:
17 ; GFX9ALL:       ; %bb.0:
18 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
19 ; GFX9ALL-NEXT:    v_lshlrev_b16_e32 v0, v1, v0
20 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
22 ; GFX10-LABEL: shl_i16:
23 ; GFX10:       ; %bb.0:
24 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
25 ; GFX10-NEXT:    v_lshlrev_b16 v0, v1, v0
26 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
28 ; GFX11-TRUE16-LABEL: shl_i16:
29 ; GFX11-TRUE16:       ; %bb.0:
30 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
31 ; GFX11-TRUE16-NEXT:    v_lshlrev_b16 v0.l, v1.l, v0.l
32 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
34 ; GFX11-FAKE16-LABEL: shl_i16:
35 ; GFX11-FAKE16:       ; %bb.0:
36 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
37 ; GFX11-FAKE16-NEXT:    v_lshlrev_b16 v0, v1, v0
38 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
39   %res = shl i16 %x, %y
40   ret i16 %res
43 define i16 @lshr_i16(i16 %x, i16 %y) {
44 ; GFX8-LABEL: lshr_i16:
45 ; GFX8:       ; %bb.0:
46 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
47 ; GFX8-NEXT:    v_lshrrev_b16_e32 v0, v1, v0
48 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
50 ; GFX9ALL-LABEL: lshr_i16:
51 ; GFX9ALL:       ; %bb.0:
52 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
53 ; GFX9ALL-NEXT:    v_lshrrev_b16_e32 v0, v1, v0
54 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
56 ; GFX10-LABEL: lshr_i16:
57 ; GFX10:       ; %bb.0:
58 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
59 ; GFX10-NEXT:    v_lshrrev_b16 v0, v1, v0
60 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
62 ; GFX11-TRUE16-LABEL: lshr_i16:
63 ; GFX11-TRUE16:       ; %bb.0:
64 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
65 ; GFX11-TRUE16-NEXT:    v_lshrrev_b16 v0.l, v1.l, v0.l
66 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
68 ; GFX11-FAKE16-LABEL: lshr_i16:
69 ; GFX11-FAKE16:       ; %bb.0:
70 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
71 ; GFX11-FAKE16-NEXT:    v_lshrrev_b16 v0, v1, v0
72 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
73   %res = lshr i16 %x, %y
74   ret i16 %res
77 define i16 @ashr_i16(i16 %x, i16 %y) {
78 ; GFX8-LABEL: ashr_i16:
79 ; GFX8:       ; %bb.0:
80 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
81 ; GFX8-NEXT:    v_ashrrev_i16_e32 v0, v1, v0
82 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
84 ; GFX9ALL-LABEL: ashr_i16:
85 ; GFX9ALL:       ; %bb.0:
86 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
87 ; GFX9ALL-NEXT:    v_ashrrev_i16_e32 v0, v1, v0
88 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
90 ; GFX10-LABEL: ashr_i16:
91 ; GFX10:       ; %bb.0:
92 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
93 ; GFX10-NEXT:    v_ashrrev_i16 v0, v1, v0
94 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
96 ; GFX11-TRUE16-LABEL: ashr_i16:
97 ; GFX11-TRUE16:       ; %bb.0:
98 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
99 ; GFX11-TRUE16-NEXT:    v_ashrrev_i16 v0.l, v1.l, v0.l
100 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
102 ; GFX11-FAKE16-LABEL: ashr_i16:
103 ; GFX11-FAKE16:       ; %bb.0:
104 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
105 ; GFX11-FAKE16-NEXT:    v_ashrrev_i16 v0, v1, v0
106 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
107   %res = ashr i16 %x, %y
108   ret i16 %res
111 define i16 @add_u16(i16 %x, i16 %y) {
112 ; GFX8-LABEL: add_u16:
113 ; GFX8:       ; %bb.0:
114 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
115 ; GFX8-NEXT:    v_add_u16_e32 v0, v0, v1
116 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
118 ; GFX9ALL-LABEL: add_u16:
119 ; GFX9ALL:       ; %bb.0:
120 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
121 ; GFX9ALL-NEXT:    v_add_u16_e32 v0, v0, v1
122 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
124 ; GFX10-LABEL: add_u16:
125 ; GFX10:       ; %bb.0:
126 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
127 ; GFX10-NEXT:    v_add_nc_u16 v0, v0, v1
128 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
130 ; GFX11-TRUE16-LABEL: add_u16:
131 ; GFX11-TRUE16:       ; %bb.0:
132 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
133 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
134 ; GFX11-TRUE16-NEXT:    v_add_nc_u16 v0.l, v0.l, v0.h
135 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
137 ; GFX11-FAKE16-LABEL: add_u16:
138 ; GFX11-FAKE16:       ; %bb.0:
139 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
140 ; GFX11-FAKE16-NEXT:    v_add_nc_u16 v0, v0, v1
141 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
142   %res = add i16 %x, %y
143   ret i16 %res
146 define i16 @sub_u16(i16 %x, i16 %y) {
147 ; GFX8-LABEL: sub_u16:
148 ; GFX8:       ; %bb.0:
149 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
150 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
151 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
153 ; GFX9ALL-LABEL: sub_u16:
154 ; GFX9ALL:       ; %bb.0:
155 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
156 ; GFX9ALL-NEXT:    v_sub_u16_e32 v0, v0, v1
157 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
159 ; GFX10-LABEL: sub_u16:
160 ; GFX10:       ; %bb.0:
161 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
162 ; GFX10-NEXT:    v_sub_nc_u16 v0, v0, v1
163 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
165 ; GFX11-TRUE16-LABEL: sub_u16:
166 ; GFX11-TRUE16:       ; %bb.0:
167 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
168 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
169 ; GFX11-TRUE16-NEXT:    v_sub_nc_u16 v0.l, v0.l, v0.h
170 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
172 ; GFX11-FAKE16-LABEL: sub_u16:
173 ; GFX11-FAKE16:       ; %bb.0:
174 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
175 ; GFX11-FAKE16-NEXT:    v_sub_nc_u16 v0, v0, v1
176 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
177   %res = sub i16 %x, %y
178   ret i16 %res
181 define i16 @mul_lo_u16(i16 %x, i16 %y) {
182 ; GFX8-LABEL: mul_lo_u16:
183 ; GFX8:       ; %bb.0:
184 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
185 ; GFX8-NEXT:    v_mul_lo_u16_e32 v0, v0, v1
186 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
188 ; GFX9ALL-LABEL: mul_lo_u16:
189 ; GFX9ALL:       ; %bb.0:
190 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
191 ; GFX9ALL-NEXT:    v_mul_lo_u16_e32 v0, v0, v1
192 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
194 ; GFX10-LABEL: mul_lo_u16:
195 ; GFX10:       ; %bb.0:
196 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
197 ; GFX10-NEXT:    v_mul_lo_u16 v0, v0, v1
198 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
200 ; GFX11-TRUE16-LABEL: mul_lo_u16:
201 ; GFX11-TRUE16:       ; %bb.0:
202 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
203 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
204 ; GFX11-TRUE16-NEXT:    v_mul_lo_u16 v0.l, v0.l, v0.h
205 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
207 ; GFX11-FAKE16-LABEL: mul_lo_u16:
208 ; GFX11-FAKE16:       ; %bb.0:
209 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
210 ; GFX11-FAKE16-NEXT:    v_mul_lo_u16 v0, v0, v1
211 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
212   %res = mul i16 %x, %y
213   ret i16 %res
216 define i16 @min_u16(i16 %x, i16 %y) {
217 ; GFX8-LABEL: min_u16:
218 ; GFX8:       ; %bb.0:
219 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
220 ; GFX8-NEXT:    v_min_u16_e32 v0, v0, v1
221 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
223 ; GFX9ALL-LABEL: min_u16:
224 ; GFX9ALL:       ; %bb.0:
225 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
226 ; GFX9ALL-NEXT:    v_min_u16_e32 v0, v0, v1
227 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
229 ; GFX10-LABEL: min_u16:
230 ; GFX10:       ; %bb.0:
231 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
232 ; GFX10-NEXT:    v_min_u16 v0, v0, v1
233 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
235 ; GFX11-TRUE16-LABEL: min_u16:
236 ; GFX11-TRUE16:       ; %bb.0:
237 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
238 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
239 ; GFX11-TRUE16-NEXT:    v_min_u16 v0.l, v0.l, v0.h
240 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
242 ; GFX11-FAKE16-LABEL: min_u16:
243 ; GFX11-FAKE16:       ; %bb.0:
244 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
245 ; GFX11-FAKE16-NEXT:    v_min_u16 v0, v0, v1
246 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
247   %cmp = icmp ule i16 %x, %y
248   %res = select i1 %cmp, i16 %x, i16 %y
249   ret i16 %res
252 define i16 @min_i16(i16 %x, i16 %y) {
253 ; GFX8-LABEL: min_i16:
254 ; GFX8:       ; %bb.0:
255 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
256 ; GFX8-NEXT:    v_min_i16_e32 v0, v0, v1
257 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
259 ; GFX9ALL-LABEL: min_i16:
260 ; GFX9ALL:       ; %bb.0:
261 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
262 ; GFX9ALL-NEXT:    v_min_i16_e32 v0, v0, v1
263 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
265 ; GFX10-LABEL: min_i16:
266 ; GFX10:       ; %bb.0:
267 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
268 ; GFX10-NEXT:    v_min_i16 v0, v0, v1
269 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
271 ; GFX11-TRUE16-LABEL: min_i16:
272 ; GFX11-TRUE16:       ; %bb.0:
273 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
274 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
275 ; GFX11-TRUE16-NEXT:    v_min_i16 v0.l, v0.l, v0.h
276 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
278 ; GFX11-FAKE16-LABEL: min_i16:
279 ; GFX11-FAKE16:       ; %bb.0:
280 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
281 ; GFX11-FAKE16-NEXT:    v_min_i16 v0, v0, v1
282 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
283   %cmp = icmp sle i16 %x, %y
284   %res = select i1 %cmp, i16 %x, i16 %y
285   ret i16 %res
288 define i16 @max_u16(i16 %x, i16 %y) {
289 ; GFX8-LABEL: max_u16:
290 ; GFX8:       ; %bb.0:
291 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
292 ; GFX8-NEXT:    v_max_u16_e32 v0, v0, v1
293 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
295 ; GFX9ALL-LABEL: max_u16:
296 ; GFX9ALL:       ; %bb.0:
297 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
298 ; GFX9ALL-NEXT:    v_max_u16_e32 v0, v0, v1
299 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
301 ; GFX10-LABEL: max_u16:
302 ; GFX10:       ; %bb.0:
303 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
304 ; GFX10-NEXT:    v_max_u16 v0, v0, v1
305 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
307 ; GFX11-TRUE16-LABEL: max_u16:
308 ; GFX11-TRUE16:       ; %bb.0:
309 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
310 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
311 ; GFX11-TRUE16-NEXT:    v_max_u16 v0.l, v0.l, v0.h
312 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
314 ; GFX11-FAKE16-LABEL: max_u16:
315 ; GFX11-FAKE16:       ; %bb.0:
316 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
317 ; GFX11-FAKE16-NEXT:    v_max_u16 v0, v0, v1
318 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
319   %cmp = icmp uge i16 %x, %y
320   %res = select i1 %cmp, i16 %x, i16 %y
321   ret i16 %res
324 define i16 @max_i16(i16 %x, i16 %y) {
325 ; GFX8-LABEL: max_i16:
326 ; GFX8:       ; %bb.0:
327 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
328 ; GFX8-NEXT:    v_max_i16_e32 v0, v0, v1
329 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
331 ; GFX9ALL-LABEL: max_i16:
332 ; GFX9ALL:       ; %bb.0:
333 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
334 ; GFX9ALL-NEXT:    v_max_i16_e32 v0, v0, v1
335 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
337 ; GFX10-LABEL: max_i16:
338 ; GFX10:       ; %bb.0:
339 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
340 ; GFX10-NEXT:    v_max_i16 v0, v0, v1
341 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
343 ; GFX11-TRUE16-LABEL: max_i16:
344 ; GFX11-TRUE16:       ; %bb.0:
345 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
346 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
347 ; GFX11-TRUE16-NEXT:    v_max_i16 v0.l, v0.l, v0.h
348 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
350 ; GFX11-FAKE16-LABEL: max_i16:
351 ; GFX11-FAKE16:       ; %bb.0:
352 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353 ; GFX11-FAKE16-NEXT:    v_max_i16 v0, v0, v1
354 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
355   %cmp = icmp sge i16 %x, %y
356   %res = select i1 %cmp, i16 %x, i16 %y
357   ret i16 %res
360 define i32 @shl_i16_zext_i32(i16 %x, i16 %y) {
361 ; GFX8-LABEL: shl_i16_zext_i32:
362 ; GFX8:       ; %bb.0:
363 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
364 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, v1, v0
365 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
367 ; GFX9ALL-LABEL: shl_i16_zext_i32:
368 ; GFX9ALL:       ; %bb.0:
369 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
370 ; GFX9ALL-NEXT:    v_lshlrev_b16_e32 v0, v1, v0
371 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
373 ; GFX10-LABEL: shl_i16_zext_i32:
374 ; GFX10:       ; %bb.0:
375 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
376 ; GFX10-NEXT:    v_lshlrev_b16 v0, v1, v0
377 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
378 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
380 ; GFX11-TRUE16-LABEL: shl_i16_zext_i32:
381 ; GFX11-TRUE16:       ; %bb.0:
382 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
383 ; GFX11-TRUE16-NEXT:    v_lshlrev_b16 v0.l, v1.l, v0.l
384 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
385 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
387 ; GFX11-FAKE16-LABEL: shl_i16_zext_i32:
388 ; GFX11-FAKE16:       ; %bb.0:
389 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
390 ; GFX11-FAKE16-NEXT:    v_lshlrev_b16 v0, v1, v0
391 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
392 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
393   %res = shl i16 %x, %y
394   %zext = zext i16 %res to i32
395   ret i32 %zext
398 define i32 @lshr_i16_zext_i32(i16 %x, i16 %y) {
399 ; GFX8-LABEL: lshr_i16_zext_i32:
400 ; GFX8:       ; %bb.0:
401 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
402 ; GFX8-NEXT:    v_lshrrev_b16_e32 v0, v1, v0
403 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
405 ; GFX9ALL-LABEL: lshr_i16_zext_i32:
406 ; GFX9ALL:       ; %bb.0:
407 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
408 ; GFX9ALL-NEXT:    v_lshrrev_b16_e32 v0, v1, v0
409 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
411 ; GFX10-LABEL: lshr_i16_zext_i32:
412 ; GFX10:       ; %bb.0:
413 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
414 ; GFX10-NEXT:    v_lshrrev_b16 v0, v1, v0
415 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
416 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
418 ; GFX11-TRUE16-LABEL: lshr_i16_zext_i32:
419 ; GFX11-TRUE16:       ; %bb.0:
420 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
421 ; GFX11-TRUE16-NEXT:    v_lshrrev_b16 v0.l, v1.l, v0.l
422 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
423 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
425 ; GFX11-FAKE16-LABEL: lshr_i16_zext_i32:
426 ; GFX11-FAKE16:       ; %bb.0:
427 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
428 ; GFX11-FAKE16-NEXT:    v_lshrrev_b16 v0, v1, v0
429 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
430 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
431   %res = lshr i16 %x, %y
432   %zext = zext i16 %res to i32
433   ret i32 %zext
436 define i32 @ashr_i16_zext_i32(i16 %x, i16 %y) {
437 ; GFX8-LABEL: ashr_i16_zext_i32:
438 ; GFX8:       ; %bb.0:
439 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
440 ; GFX8-NEXT:    v_ashrrev_i16_e32 v0, v1, v0
441 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
443 ; GFX9ALL-LABEL: ashr_i16_zext_i32:
444 ; GFX9ALL:       ; %bb.0:
445 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
446 ; GFX9ALL-NEXT:    v_ashrrev_i16_e32 v0, v1, v0
447 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
449 ; GFX10-LABEL: ashr_i16_zext_i32:
450 ; GFX10:       ; %bb.0:
451 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
452 ; GFX10-NEXT:    v_ashrrev_i16 v0, v1, v0
453 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
454 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
456 ; GFX11-TRUE16-LABEL: ashr_i16_zext_i32:
457 ; GFX11-TRUE16:       ; %bb.0:
458 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
459 ; GFX11-TRUE16-NEXT:    v_ashrrev_i16 v0.l, v1.l, v0.l
460 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
461 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
463 ; GFX11-FAKE16-LABEL: ashr_i16_zext_i32:
464 ; GFX11-FAKE16:       ; %bb.0:
465 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
466 ; GFX11-FAKE16-NEXT:    v_ashrrev_i16 v0, v1, v0
467 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
468 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
469   %res = ashr i16 %x, %y
470   %zext = zext i16 %res to i32
471   ret i32 %zext
474 define i32 @add_u16_zext_i32(i16 %x, i16 %y) {
475 ; GFX8-LABEL: add_u16_zext_i32:
476 ; GFX8:       ; %bb.0:
477 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
478 ; GFX8-NEXT:    v_add_u16_e32 v0, v0, v1
479 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
481 ; GFX9ALL-LABEL: add_u16_zext_i32:
482 ; GFX9ALL:       ; %bb.0:
483 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
484 ; GFX9ALL-NEXT:    v_add_u16_e32 v0, v0, v1
485 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
487 ; GFX10-LABEL: add_u16_zext_i32:
488 ; GFX10:       ; %bb.0:
489 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
490 ; GFX10-NEXT:    v_add_nc_u16 v0, v0, v1
491 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
492 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
494 ; GFX11-TRUE16-LABEL: add_u16_zext_i32:
495 ; GFX11-TRUE16:       ; %bb.0:
496 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
497 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
498 ; GFX11-TRUE16-NEXT:    v_add_nc_u16 v0.l, v0.l, v0.h
499 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
500 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
502 ; GFX11-FAKE16-LABEL: add_u16_zext_i32:
503 ; GFX11-FAKE16:       ; %bb.0:
504 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
505 ; GFX11-FAKE16-NEXT:    v_add_nc_u16 v0, v0, v1
506 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
507 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
508   %res = add i16 %x, %y
509   %zext = zext i16 %res to i32
510   ret i32 %zext
513 define i32 @sub_u16_zext_i32(i16 %x, i16 %y) {
514 ; GFX8-LABEL: sub_u16_zext_i32:
515 ; GFX8:       ; %bb.0:
516 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
517 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
518 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
520 ; GFX9ALL-LABEL: sub_u16_zext_i32:
521 ; GFX9ALL:       ; %bb.0:
522 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
523 ; GFX9ALL-NEXT:    v_sub_u16_e32 v0, v0, v1
524 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
526 ; GFX10-LABEL: sub_u16_zext_i32:
527 ; GFX10:       ; %bb.0:
528 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
529 ; GFX10-NEXT:    v_sub_nc_u16 v0, v0, v1
530 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
531 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
533 ; GFX11-TRUE16-LABEL: sub_u16_zext_i32:
534 ; GFX11-TRUE16:       ; %bb.0:
535 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
536 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
537 ; GFX11-TRUE16-NEXT:    v_sub_nc_u16 v0.l, v0.l, v0.h
538 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
539 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
541 ; GFX11-FAKE16-LABEL: sub_u16_zext_i32:
542 ; GFX11-FAKE16:       ; %bb.0:
543 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
544 ; GFX11-FAKE16-NEXT:    v_sub_nc_u16 v0, v0, v1
545 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
546 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
547   %res = sub i16 %x, %y
548   %zext = zext i16 %res to i32
549   ret i32 %zext
552 define i32 @mul_lo_u16_zext_i32(i16 %x, i16 %y) {
553 ; GFX8-LABEL: mul_lo_u16_zext_i32:
554 ; GFX8:       ; %bb.0:
555 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
556 ; GFX8-NEXT:    v_mul_lo_u16_e32 v0, v0, v1
557 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
559 ; GFX9ALL-LABEL: mul_lo_u16_zext_i32:
560 ; GFX9ALL:       ; %bb.0:
561 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
562 ; GFX9ALL-NEXT:    v_mul_lo_u16_e32 v0, v0, v1
563 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
565 ; GFX10-LABEL: mul_lo_u16_zext_i32:
566 ; GFX10:       ; %bb.0:
567 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
568 ; GFX10-NEXT:    v_mul_lo_u16 v0, v0, v1
569 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
570 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
572 ; GFX11-TRUE16-LABEL: mul_lo_u16_zext_i32:
573 ; GFX11-TRUE16:       ; %bb.0:
574 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
575 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
576 ; GFX11-TRUE16-NEXT:    v_mul_lo_u16 v0.l, v0.l, v0.h
577 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
578 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
580 ; GFX11-FAKE16-LABEL: mul_lo_u16_zext_i32:
581 ; GFX11-FAKE16:       ; %bb.0:
582 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
583 ; GFX11-FAKE16-NEXT:    v_mul_lo_u16 v0, v0, v1
584 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
585 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
586   %res = mul i16 %x, %y
587   %zext = zext i16 %res to i32
588   ret i32 %zext
591 define i32 @min_u16_zext_i32(i16 %x, i16 %y) {
592 ; GFX8-LABEL: min_u16_zext_i32:
593 ; GFX8:       ; %bb.0:
594 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
595 ; GFX8-NEXT:    v_min_u16_e32 v0, v0, v1
596 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
598 ; GFX9ALL-LABEL: min_u16_zext_i32:
599 ; GFX9ALL:       ; %bb.0:
600 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
601 ; GFX9ALL-NEXT:    v_min_u16_e32 v0, v0, v1
602 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
604 ; GFX10-LABEL: min_u16_zext_i32:
605 ; GFX10:       ; %bb.0:
606 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
607 ; GFX10-NEXT:    v_min_u16 v0, v0, v1
608 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
609 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
611 ; GFX11-TRUE16-LABEL: min_u16_zext_i32:
612 ; GFX11-TRUE16:       ; %bb.0:
613 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
614 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
615 ; GFX11-TRUE16-NEXT:    v_min_u16 v0.l, v0.l, v0.h
616 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
617 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
619 ; GFX11-FAKE16-LABEL: min_u16_zext_i32:
620 ; GFX11-FAKE16:       ; %bb.0:
621 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
622 ; GFX11-FAKE16-NEXT:    v_min_u16 v0, v0, v1
623 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
624 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
625   %cmp = icmp ule i16 %x, %y
626   %res = select i1 %cmp, i16 %x, i16 %y
627   %zext = zext i16 %res to i32
628   ret i32 %zext
631 define i32 @min_i16_zext_i32(i16 %x, i16 %y) {
632 ; GFX8-LABEL: min_i16_zext_i32:
633 ; GFX8:       ; %bb.0:
634 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
635 ; GFX8-NEXT:    v_min_i16_e32 v0, v0, v1
636 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
638 ; GFX9ALL-LABEL: min_i16_zext_i32:
639 ; GFX9ALL:       ; %bb.0:
640 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
641 ; GFX9ALL-NEXT:    v_min_i16_e32 v0, v0, v1
642 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
644 ; GFX10-LABEL: min_i16_zext_i32:
645 ; GFX10:       ; %bb.0:
646 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
647 ; GFX10-NEXT:    v_min_i16 v0, v0, v1
648 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
649 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
651 ; GFX11-TRUE16-LABEL: min_i16_zext_i32:
652 ; GFX11-TRUE16:       ; %bb.0:
653 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
654 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
655 ; GFX11-TRUE16-NEXT:    v_min_i16 v0.l, v0.l, v0.h
656 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
657 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
659 ; GFX11-FAKE16-LABEL: min_i16_zext_i32:
660 ; GFX11-FAKE16:       ; %bb.0:
661 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
662 ; GFX11-FAKE16-NEXT:    v_min_i16 v0, v0, v1
663 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
664 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
665   %cmp = icmp sle i16 %x, %y
666   %res = select i1 %cmp, i16 %x, i16 %y
667   %zext = zext i16 %res to i32
668   ret i32 %zext
671 define i32 @max_u16_zext_i32(i16 %x, i16 %y) {
672 ; GFX8-LABEL: max_u16_zext_i32:
673 ; GFX8:       ; %bb.0:
674 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
675 ; GFX8-NEXT:    v_max_u16_e32 v0, v0, v1
676 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
678 ; GFX9ALL-LABEL: max_u16_zext_i32:
679 ; GFX9ALL:       ; %bb.0:
680 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
681 ; GFX9ALL-NEXT:    v_max_u16_e32 v0, v0, v1
682 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
684 ; GFX10-LABEL: max_u16_zext_i32:
685 ; GFX10:       ; %bb.0:
686 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
687 ; GFX10-NEXT:    v_max_u16 v0, v0, v1
688 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
689 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
691 ; GFX11-TRUE16-LABEL: max_u16_zext_i32:
692 ; GFX11-TRUE16:       ; %bb.0:
693 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
694 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
695 ; GFX11-TRUE16-NEXT:    v_max_u16 v0.l, v0.l, v0.h
696 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
697 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
699 ; GFX11-FAKE16-LABEL: max_u16_zext_i32:
700 ; GFX11-FAKE16:       ; %bb.0:
701 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
702 ; GFX11-FAKE16-NEXT:    v_max_u16 v0, v0, v1
703 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
704 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
705   %cmp = icmp uge i16 %x, %y
706   %res = select i1 %cmp, i16 %x, i16 %y
707   %zext = zext i16 %res to i32
708   ret i32 %zext
711 define i32 @max_i16_zext_i32(i16 %x, i16 %y) {
712 ; GFX8-LABEL: max_i16_zext_i32:
713 ; GFX8:       ; %bb.0:
714 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
715 ; GFX8-NEXT:    v_max_i16_e32 v0, v0, v1
716 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
718 ; GFX9ALL-LABEL: max_i16_zext_i32:
719 ; GFX9ALL:       ; %bb.0:
720 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
721 ; GFX9ALL-NEXT:    v_max_i16_e32 v0, v0, v1
722 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
724 ; GFX10-LABEL: max_i16_zext_i32:
725 ; GFX10:       ; %bb.0:
726 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
727 ; GFX10-NEXT:    v_max_i16 v0, v0, v1
728 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
729 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
731 ; GFX11-TRUE16-LABEL: max_i16_zext_i32:
732 ; GFX11-TRUE16:       ; %bb.0:
733 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
734 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
735 ; GFX11-TRUE16-NEXT:    v_max_i16 v0.l, v0.l, v0.h
736 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
737 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
739 ; GFX11-FAKE16-LABEL: max_i16_zext_i32:
740 ; GFX11-FAKE16:       ; %bb.0:
741 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
742 ; GFX11-FAKE16-NEXT:    v_max_i16 v0, v0, v1
743 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
744 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
745   %cmp = icmp sge i16 %x, %y
746   %res = select i1 %cmp, i16 %x, i16 %y
747   %zext = zext i16 %res to i32
748   ret i32 %zext
751 define i32 @zext_fadd_f16(half %x, half %y) {
752 ; GFX8-LABEL: zext_fadd_f16:
753 ; GFX8:       ; %bb.0:
754 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
755 ; GFX8-NEXT:    v_add_f16_e32 v0, v0, v1
756 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
758 ; GFX9ALL-LABEL: zext_fadd_f16:
759 ; GFX9ALL:       ; %bb.0:
760 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
761 ; GFX9ALL-NEXT:    v_add_f16_e32 v0, v0, v1
762 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
764 ; GFX10-LABEL: zext_fadd_f16:
765 ; GFX10:       ; %bb.0:
766 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
767 ; GFX10-NEXT:    v_add_f16_e32 v0, v0, v1
768 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
769 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
771 ; GFX11-TRUE16-LABEL: zext_fadd_f16:
772 ; GFX11-TRUE16:       ; %bb.0:
773 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
774 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
775 ; GFX11-TRUE16-NEXT:    v_add_f16_e32 v0.l, v0.l, v0.h
776 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
777 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
779 ; GFX11-FAKE16-LABEL: zext_fadd_f16:
780 ; GFX11-FAKE16:       ; %bb.0:
781 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
782 ; GFX11-FAKE16-NEXT:    v_add_f16_e32 v0, v0, v1
783 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
784 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
785   %add = fadd half %x, %y
786   %cast = bitcast half %add to i16
787   %zext = zext i16 %cast to i32
788   ret i32 %zext
791 define i32 @zext_fma_f16(half %x, half %y, half %z) {
792 ; GFX8-LABEL: zext_fma_f16:
793 ; GFX8:       ; %bb.0:
794 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
795 ; GFX8-NEXT:    v_fma_f16 v0, v0, v1, v2
796 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
798 ; GFX9ALL-LABEL: zext_fma_f16:
799 ; GFX9ALL:       ; %bb.0:
800 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
801 ; GFX9ALL-NEXT:    v_fma_f16 v0, v0, v1, v2
802 ; GFX9ALL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
803 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
805 ; GFX10-LABEL: zext_fma_f16:
806 ; GFX10:       ; %bb.0:
807 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
808 ; GFX10-NEXT:    v_fmac_f16_e32 v2, v0, v1
809 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v2
810 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
812 ; GFX11-TRUE16-LABEL: zext_fma_f16:
813 ; GFX11-TRUE16:       ; %bb.0:
814 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
815 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
816 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v2.l
817 ; GFX11-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, v0.h, v1.l
818 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
819 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
821 ; GFX11-FAKE16-LABEL: zext_fma_f16:
822 ; GFX11-FAKE16:       ; %bb.0:
823 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
824 ; GFX11-FAKE16-NEXT:    v_fmac_f16_e32 v2, v0, v1
825 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v2
826 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
827   %fma = call half @llvm.fma.f16(half %x, half %y, half %z)
828   %cast = bitcast half %fma to i16
829   %zext = zext i16 %cast to i32
830   ret i32 %zext
833 define i32 @zext_div_fixup_f16(half %x, half %y, half %z) {
834 ; GFX8-LABEL: zext_div_fixup_f16:
835 ; GFX8:       ; %bb.0:
836 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
837 ; GFX8-NEXT:    v_div_fixup_f16 v0, v0, v1, v2
838 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
840 ; GFX9ALL-LABEL: zext_div_fixup_f16:
841 ; GFX9ALL:       ; %bb.0:
842 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
843 ; GFX9ALL-NEXT:    v_div_fixup_f16 v0, v0, v1, v2
844 ; GFX9ALL-NEXT:    v_and_b32_e32 v0, 0xffff, v0
845 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
847 ; GFX10-LABEL: zext_div_fixup_f16:
848 ; GFX10:       ; %bb.0:
849 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
850 ; GFX10-NEXT:    v_div_fixup_f16 v0, v0, v1, v2
851 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
852 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
854 ; GFX11-TRUE16-LABEL: zext_div_fixup_f16:
855 ; GFX11-TRUE16:       ; %bb.0:
856 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
857 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
858 ; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v2.l
859 ; GFX11-TRUE16-NEXT:    v_div_fixup_f16 v0.l, v0.l, v0.h, v1.l
860 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
861 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
863 ; GFX11-FAKE16-LABEL: zext_div_fixup_f16:
864 ; GFX11-FAKE16:       ; %bb.0:
865 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
866 ; GFX11-FAKE16-NEXT:    v_div_fixup_f16 v0, v0, v1, v2
867 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
868 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
869   %div.fixup = call half @llvm.amdgcn.div.fixup.f16(half %x, half %y, half %z)
870   %cast = bitcast half %div.fixup to i16
871   %zext = zext i16 %cast to i32
872   ret i32 %zext
875 ; We technically could eliminate the and on gfx9 here but we don't try
876 ; to inspect the source of the fptrunc. We're only worried about cases
877 ; that lower to v_fma_mix* instructions.
878 define i32 @zext_fptrunc_f16(float %x) {
879 ; GFX8-LABEL: zext_fptrunc_f16:
880 ; GFX8:       ; %bb.0:
881 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
882 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
883 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
885 ; GFX9ALL-LABEL: zext_fptrunc_f16:
886 ; GFX9ALL:       ; %bb.0:
887 ; GFX9ALL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
888 ; GFX9ALL-NEXT:    v_cvt_f16_f32_e32 v0, v0
889 ; GFX9ALL-NEXT:    s_setpc_b64 s[30:31]
891 ; GFX10-LABEL: zext_fptrunc_f16:
892 ; GFX10:       ; %bb.0:
893 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
894 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
895 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
896 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
898 ; GFX11-TRUE16-LABEL: zext_fptrunc_f16:
899 ; GFX11-TRUE16:       ; %bb.0:
900 ; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
901 ; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v0.l, v0
902 ; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
903 ; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]
905 ; GFX11-FAKE16-LABEL: zext_fptrunc_f16:
906 ; GFX11-FAKE16:       ; %bb.0:
907 ; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
908 ; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v0
909 ; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
910 ; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]
911   %fptrunc = fptrunc float %x to half
912   %cast = bitcast half %fptrunc to i16
913   %zext = zext i16 %cast to i32
914   ret i32 %zext
917 define i32 @zext_fptrunc_fma_f16(float %x, float %y, float %z) {
918 ; GFX8-LABEL: zext_fptrunc_fma_f16:
919 ; GFX8:       ; %bb.0:
920 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
921 ; GFX8-NEXT:    v_fma_f32 v0, v0, v1, v2
922 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
923 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
925 ; GFX900-LABEL: zext_fptrunc_fma_f16:
926 ; GFX900:       ; %bb.0:
927 ; GFX900-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
928 ; GFX900-NEXT:    v_fma_f32 v0, v0, v1, v2
929 ; GFX900-NEXT:    v_cvt_f16_f32_e32 v0, v0
930 ; GFX900-NEXT:    s_setpc_b64 s[30:31]
932 ; GFX906-LABEL: zext_fptrunc_fma_f16:
933 ; GFX906:       ; %bb.0:
934 ; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
935 ; GFX906-NEXT:    v_fma_mixlo_f16 v0, v0, v1, v2
936 ; GFX906-NEXT:    v_and_b32_e32 v0, 0xffff, v0
937 ; GFX906-NEXT:    s_setpc_b64 s[30:31]
939 ; GFX10-LABEL: zext_fptrunc_fma_f16:
940 ; GFX10:       ; %bb.0:
941 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
942 ; GFX10-NEXT:    v_fma_mixlo_f16 v0, v0, v1, v2
943 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff, v0
944 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
946 ; GFX11-LABEL: zext_fptrunc_fma_f16:
947 ; GFX11:       ; %bb.0:
948 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
949 ; GFX11-NEXT:    v_fma_mixlo_f16 v0, v0, v1, v2
950 ; GFX11-NEXT:    v_and_b32_e32 v0, 0xffff, v0
951 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
952   %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
953   %fptrunc = fptrunc float %fma to half
954   %cast = bitcast half %fptrunc to i16
955   %zext = zext i16 %cast to i32
956   ret i32 %zext
959 declare half @llvm.amdgcn.div.fixup.f16(half, half, half)
960 declare half @llvm.fma.f16(half, half, half)
961 declare float @llvm.fma.f32(float, float, float)