1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-- -mcpu=tahiti -verify-machineinstrs  | FileCheck %s -check-prefixes=GCN,SI
3; RUN: llc < %s -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s -check-prefixes=GCN,VI
4
5define amdgpu_kernel void @select_f16(
6; SI-LABEL: select_f16:
7; SI:       ; %bb.0: ; %entry
8; SI-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x9
9; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x11
10; SI-NEXT:    s_mov_b32 s15, 0xf000
11; SI-NEXT:    s_mov_b32 s14, -1
12; SI-NEXT:    s_mov_b32 s22, s14
13; SI-NEXT:    s_waitcnt lgkmcnt(0)
14; SI-NEXT:    s_mov_b32 s20, s6
15; SI-NEXT:    s_mov_b32 s21, s7
16; SI-NEXT:    s_mov_b32 s23, s15
17; SI-NEXT:    s_mov_b32 s16, s10
18; SI-NEXT:    s_mov_b32 s17, s11
19; SI-NEXT:    s_mov_b32 s2, s14
20; SI-NEXT:    s_mov_b32 s3, s15
21; SI-NEXT:    s_mov_b32 s18, s14
22; SI-NEXT:    s_mov_b32 s19, s15
23; SI-NEXT:    s_mov_b32 s10, s14
24; SI-NEXT:    s_mov_b32 s11, s15
25; SI-NEXT:    buffer_load_ushort v0, off, s[20:23], 0
26; SI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0
27; SI-NEXT:    buffer_load_ushort v2, off, s[16:19], 0
28; SI-NEXT:    buffer_load_ushort v3, off, s[0:3], 0
29; SI-NEXT:    s_mov_b32 s12, s4
30; SI-NEXT:    s_mov_b32 s13, s5
31; SI-NEXT:    s_waitcnt vmcnt(3)
32; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
33; SI-NEXT:    s_waitcnt vmcnt(2)
34; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
35; SI-NEXT:    s_waitcnt vmcnt(1)
36; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
37; SI-NEXT:    s_waitcnt vmcnt(0)
38; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
39; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
40; SI-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
41; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
42; SI-NEXT:    buffer_store_short v0, off, s[12:15], 0
43; SI-NEXT:    s_endpgm
44;
45; VI-LABEL: select_f16:
46; VI:       ; %bb.0: ; %entry
47; VI-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x24
48; VI-NEXT:    s_load_dwordx2 s[12:13], s[0:1], 0x44
49; VI-NEXT:    s_mov_b32 s3, 0xf000
50; VI-NEXT:    s_mov_b32 s2, -1
51; VI-NEXT:    s_mov_b32 s14, s2
52; VI-NEXT:    s_waitcnt lgkmcnt(0)
53; VI-NEXT:    s_mov_b32 s0, s4
54; VI-NEXT:    s_mov_b32 s1, s5
55; VI-NEXT:    s_mov_b32 s4, s6
56; VI-NEXT:    s_mov_b32 s5, s7
57; VI-NEXT:    s_mov_b32 s6, s2
58; VI-NEXT:    s_mov_b32 s7, s3
59; VI-NEXT:    s_mov_b32 s16, s10
60; VI-NEXT:    s_mov_b32 s17, s11
61; VI-NEXT:    s_mov_b32 s15, s3
62; VI-NEXT:    s_mov_b32 s18, s2
63; VI-NEXT:    s_mov_b32 s19, s3
64; VI-NEXT:    s_mov_b32 s10, s2
65; VI-NEXT:    s_mov_b32 s11, s3
66; VI-NEXT:    buffer_load_ushort v0, off, s[4:7], 0
67; VI-NEXT:    buffer_load_ushort v1, off, s[8:11], 0
68; VI-NEXT:    buffer_load_ushort v2, off, s[16:19], 0
69; VI-NEXT:    buffer_load_ushort v3, off, s[12:15], 0
70; VI-NEXT:    s_waitcnt vmcnt(2)
71; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v0, v1
72; VI-NEXT:    s_waitcnt vmcnt(0)
73; VI-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
74; VI-NEXT:    buffer_store_short v0, off, s[0:3], 0
75; VI-NEXT:    s_endpgm
76    half addrspace(1)* %r,
77    half addrspace(1)* %a,
78    half addrspace(1)* %b,
79    half addrspace(1)* %c,
80    half addrspace(1)* %d) {
81entry:
82  %a.val = load volatile half, half addrspace(1)* %a
83  %b.val = load volatile half, half addrspace(1)* %b
84  %c.val = load volatile half, half addrspace(1)* %c
85  %d.val = load volatile half, half addrspace(1)* %d
86  %fcmp = fcmp olt half %a.val, %b.val
87  %r.val = select i1 %fcmp, half %c.val, half %d.val
88  store half %r.val, half addrspace(1)* %r
89  ret void
90}
91
92define amdgpu_kernel void @select_f16_imm_a(
93; SI-LABEL: select_f16_imm_a:
94; SI:       ; %bb.0: ; %entry
95; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
96; SI-NEXT:    s_mov_b32 s11, 0xf000
97; SI-NEXT:    s_mov_b32 s10, -1
98; SI-NEXT:    s_mov_b32 s18, s10
99; SI-NEXT:    s_mov_b32 s19, s11
100; SI-NEXT:    s_waitcnt lgkmcnt(0)
101; SI-NEXT:    s_mov_b32 s16, s2
102; SI-NEXT:    s_mov_b32 s17, s3
103; SI-NEXT:    s_mov_b32 s12, s6
104; SI-NEXT:    s_mov_b32 s13, s7
105; SI-NEXT:    s_mov_b32 s14, s10
106; SI-NEXT:    s_mov_b32 s15, s11
107; SI-NEXT:    s_mov_b32 s6, s10
108; SI-NEXT:    s_mov_b32 s7, s11
109; SI-NEXT:    buffer_load_ushort v0, off, s[16:19], 0
110; SI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
111; SI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
112; SI-NEXT:    s_mov_b32 s8, s0
113; SI-NEXT:    s_mov_b32 s9, s1
114; SI-NEXT:    s_waitcnt vmcnt(2)
115; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
116; SI-NEXT:    s_waitcnt vmcnt(1)
117; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
118; SI-NEXT:    s_waitcnt vmcnt(0)
119; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
120; SI-NEXT:    v_cmp_lt_f32_e32 vcc, 0.5, v0
121; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
122; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
123; SI-NEXT:    buffer_store_short v0, off, s[8:11], 0
124; SI-NEXT:    s_endpgm
125;
126; VI-LABEL: select_f16_imm_a:
127; VI:       ; %bb.0: ; %entry
128; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
129; VI-NEXT:    s_mov_b32 s11, 0xf000
130; VI-NEXT:    s_mov_b32 s10, -1
131; VI-NEXT:    s_mov_b32 s14, s10
132; VI-NEXT:    s_mov_b32 s15, s11
133; VI-NEXT:    s_waitcnt lgkmcnt(0)
134; VI-NEXT:    s_mov_b32 s8, s0
135; VI-NEXT:    s_mov_b32 s9, s1
136; VI-NEXT:    s_mov_b32 s0, s2
137; VI-NEXT:    s_mov_b32 s1, s3
138; VI-NEXT:    s_mov_b32 s2, s10
139; VI-NEXT:    s_mov_b32 s3, s11
140; VI-NEXT:    s_mov_b32 s12, s6
141; VI-NEXT:    s_mov_b32 s13, s7
142; VI-NEXT:    s_mov_b32 s6, s10
143; VI-NEXT:    s_mov_b32 s7, s11
144; VI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
145; VI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
146; VI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
147; VI-NEXT:    s_waitcnt vmcnt(2)
148; VI-NEXT:    v_cmp_lt_f16_e32 vcc, 0.5, v0
149; VI-NEXT:    s_waitcnt vmcnt(0)
150; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
151; VI-NEXT:    buffer_store_short v0, off, s[8:11], 0
152; VI-NEXT:    s_endpgm
153    half addrspace(1)* %r,
154    half addrspace(1)* %b,
155    half addrspace(1)* %c,
156    half addrspace(1)* %d) {
157entry:
158  %b.val = load volatile half, half addrspace(1)* %b
159  %c.val = load volatile half, half addrspace(1)* %c
160  %d.val = load volatile half, half addrspace(1)* %d
161  %fcmp = fcmp olt half 0xH3800, %b.val
162  %r.val = select i1 %fcmp, half %c.val, half %d.val
163  store half %r.val, half addrspace(1)* %r
164  ret void
165}
166
167define amdgpu_kernel void @select_f16_imm_b(
168; SI-LABEL: select_f16_imm_b:
169; SI:       ; %bb.0: ; %entry
170; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
171; SI-NEXT:    s_mov_b32 s11, 0xf000
172; SI-NEXT:    s_mov_b32 s10, -1
173; SI-NEXT:    s_mov_b32 s18, s10
174; SI-NEXT:    s_mov_b32 s19, s11
175; SI-NEXT:    s_waitcnt lgkmcnt(0)
176; SI-NEXT:    s_mov_b32 s16, s2
177; SI-NEXT:    s_mov_b32 s17, s3
178; SI-NEXT:    s_mov_b32 s12, s6
179; SI-NEXT:    s_mov_b32 s13, s7
180; SI-NEXT:    s_mov_b32 s14, s10
181; SI-NEXT:    s_mov_b32 s15, s11
182; SI-NEXT:    s_mov_b32 s6, s10
183; SI-NEXT:    s_mov_b32 s7, s11
184; SI-NEXT:    buffer_load_ushort v0, off, s[16:19], 0
185; SI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
186; SI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
187; SI-NEXT:    s_mov_b32 s8, s0
188; SI-NEXT:    s_mov_b32 s9, s1
189; SI-NEXT:    s_waitcnt vmcnt(2)
190; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
191; SI-NEXT:    s_waitcnt vmcnt(1)
192; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
193; SI-NEXT:    s_waitcnt vmcnt(0)
194; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
195; SI-NEXT:    v_cmp_gt_f32_e32 vcc, 0.5, v0
196; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
197; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
198; SI-NEXT:    buffer_store_short v0, off, s[8:11], 0
199; SI-NEXT:    s_endpgm
200;
201; VI-LABEL: select_f16_imm_b:
202; VI:       ; %bb.0: ; %entry
203; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
204; VI-NEXT:    s_mov_b32 s11, 0xf000
205; VI-NEXT:    s_mov_b32 s10, -1
206; VI-NEXT:    s_mov_b32 s14, s10
207; VI-NEXT:    s_mov_b32 s15, s11
208; VI-NEXT:    s_waitcnt lgkmcnt(0)
209; VI-NEXT:    s_mov_b32 s8, s0
210; VI-NEXT:    s_mov_b32 s9, s1
211; VI-NEXT:    s_mov_b32 s0, s2
212; VI-NEXT:    s_mov_b32 s1, s3
213; VI-NEXT:    s_mov_b32 s2, s10
214; VI-NEXT:    s_mov_b32 s3, s11
215; VI-NEXT:    s_mov_b32 s12, s6
216; VI-NEXT:    s_mov_b32 s13, s7
217; VI-NEXT:    s_mov_b32 s6, s10
218; VI-NEXT:    s_mov_b32 s7, s11
219; VI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
220; VI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
221; VI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
222; VI-NEXT:    s_waitcnt vmcnt(2)
223; VI-NEXT:    v_cmp_gt_f16_e32 vcc, 0.5, v0
224; VI-NEXT:    s_waitcnt vmcnt(0)
225; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
226; VI-NEXT:    buffer_store_short v0, off, s[8:11], 0
227; VI-NEXT:    s_endpgm
228    half addrspace(1)* %r,
229    half addrspace(1)* %a,
230    half addrspace(1)* %c,
231    half addrspace(1)* %d) {
232entry:
233  %a.val = load volatile half, half addrspace(1)* %a
234  %c.val = load volatile half, half addrspace(1)* %c
235  %d.val = load volatile half, half addrspace(1)* %d
236  %fcmp = fcmp olt half %a.val, 0xH3800
237  %r.val = select i1 %fcmp, half %c.val, half %d.val
238  store half %r.val, half addrspace(1)* %r
239  ret void
240}
241
242define amdgpu_kernel void @select_f16_imm_c(
243; SI-LABEL: select_f16_imm_c:
244; SI:       ; %bb.0: ; %entry
245; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
246; SI-NEXT:    s_mov_b32 s11, 0xf000
247; SI-NEXT:    s_mov_b32 s10, -1
248; SI-NEXT:    s_mov_b32 s18, s10
249; SI-NEXT:    s_mov_b32 s19, s11
250; SI-NEXT:    s_waitcnt lgkmcnt(0)
251; SI-NEXT:    s_mov_b32 s16, s2
252; SI-NEXT:    s_mov_b32 s17, s3
253; SI-NEXT:    s_mov_b32 s12, s6
254; SI-NEXT:    s_mov_b32 s13, s7
255; SI-NEXT:    s_mov_b32 s14, s10
256; SI-NEXT:    s_mov_b32 s15, s11
257; SI-NEXT:    s_mov_b32 s6, s10
258; SI-NEXT:    s_mov_b32 s7, s11
259; SI-NEXT:    buffer_load_ushort v0, off, s[16:19], 0
260; SI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
261; SI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
262; SI-NEXT:    s_mov_b32 s8, s0
263; SI-NEXT:    s_mov_b32 s9, s1
264; SI-NEXT:    s_waitcnt vmcnt(2)
265; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
266; SI-NEXT:    s_waitcnt vmcnt(1)
267; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
268; SI-NEXT:    s_waitcnt vmcnt(0)
269; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
270; SI-NEXT:    v_cmp_nlt_f32_e32 vcc, v0, v1
271; SI-NEXT:    v_cndmask_b32_e32 v0, 0.5, v2, vcc
272; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
273; SI-NEXT:    buffer_store_short v0, off, s[8:11], 0
274; SI-NEXT:    s_endpgm
275;
276; VI-LABEL: select_f16_imm_c:
277; VI:       ; %bb.0: ; %entry
278; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
279; VI-NEXT:    s_mov_b32 s11, 0xf000
280; VI-NEXT:    s_mov_b32 s10, -1
281; VI-NEXT:    s_mov_b32 s14, s10
282; VI-NEXT:    s_mov_b32 s15, s11
283; VI-NEXT:    s_waitcnt lgkmcnt(0)
284; VI-NEXT:    s_mov_b32 s8, s0
285; VI-NEXT:    s_mov_b32 s9, s1
286; VI-NEXT:    s_mov_b32 s0, s2
287; VI-NEXT:    s_mov_b32 s1, s3
288; VI-NEXT:    s_mov_b32 s2, s10
289; VI-NEXT:    s_mov_b32 s3, s11
290; VI-NEXT:    s_mov_b32 s12, s6
291; VI-NEXT:    s_mov_b32 s13, s7
292; VI-NEXT:    s_mov_b32 s6, s10
293; VI-NEXT:    s_mov_b32 s7, s11
294; VI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
295; VI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
296; VI-NEXT:    buffer_load_ushort v3, off, s[12:15], 0
297; VI-NEXT:    v_mov_b32_e32 v2, 0x3800
298; VI-NEXT:    s_waitcnt vmcnt(1)
299; VI-NEXT:    v_cmp_nlt_f16_e32 vcc, v0, v1
300; VI-NEXT:    s_waitcnt vmcnt(0)
301; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v3, vcc
302; VI-NEXT:    buffer_store_short v0, off, s[8:11], 0
303; VI-NEXT:    s_endpgm
304    half addrspace(1)* %r,
305    half addrspace(1)* %a,
306    half addrspace(1)* %b,
307    half addrspace(1)* %d) {
308entry:
309  %a.val = load volatile half, half addrspace(1)* %a
310  %b.val = load volatile half, half addrspace(1)* %b
311  %d.val = load volatile half, half addrspace(1)* %d
312  %fcmp = fcmp olt half %a.val, %b.val
313  %r.val = select i1 %fcmp, half 0xH3800, half %d.val
314  store half %r.val, half addrspace(1)* %r
315  ret void
316}
317
318define amdgpu_kernel void @select_f16_imm_d(
319; SI-LABEL: select_f16_imm_d:
320; SI:       ; %bb.0: ; %entry
321; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
322; SI-NEXT:    s_mov_b32 s11, 0xf000
323; SI-NEXT:    s_mov_b32 s10, -1
324; SI-NEXT:    s_mov_b32 s18, s10
325; SI-NEXT:    s_mov_b32 s19, s11
326; SI-NEXT:    s_waitcnt lgkmcnt(0)
327; SI-NEXT:    s_mov_b32 s16, s2
328; SI-NEXT:    s_mov_b32 s17, s3
329; SI-NEXT:    s_mov_b32 s12, s6
330; SI-NEXT:    s_mov_b32 s13, s7
331; SI-NEXT:    s_mov_b32 s14, s10
332; SI-NEXT:    s_mov_b32 s15, s11
333; SI-NEXT:    s_mov_b32 s6, s10
334; SI-NEXT:    s_mov_b32 s7, s11
335; SI-NEXT:    buffer_load_ushort v0, off, s[16:19], 0
336; SI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
337; SI-NEXT:    buffer_load_ushort v2, off, s[12:15], 0
338; SI-NEXT:    s_mov_b32 s8, s0
339; SI-NEXT:    s_mov_b32 s9, s1
340; SI-NEXT:    s_waitcnt vmcnt(2)
341; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
342; SI-NEXT:    s_waitcnt vmcnt(1)
343; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
344; SI-NEXT:    s_waitcnt vmcnt(0)
345; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
346; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
347; SI-NEXT:    v_cndmask_b32_e32 v0, 0.5, v2, vcc
348; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
349; SI-NEXT:    buffer_store_short v0, off, s[8:11], 0
350; SI-NEXT:    s_endpgm
351;
352; VI-LABEL: select_f16_imm_d:
353; VI:       ; %bb.0: ; %entry
354; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
355; VI-NEXT:    s_mov_b32 s11, 0xf000
356; VI-NEXT:    s_mov_b32 s10, -1
357; VI-NEXT:    s_mov_b32 s14, s10
358; VI-NEXT:    s_mov_b32 s15, s11
359; VI-NEXT:    s_waitcnt lgkmcnt(0)
360; VI-NEXT:    s_mov_b32 s8, s0
361; VI-NEXT:    s_mov_b32 s9, s1
362; VI-NEXT:    s_mov_b32 s0, s2
363; VI-NEXT:    s_mov_b32 s1, s3
364; VI-NEXT:    s_mov_b32 s2, s10
365; VI-NEXT:    s_mov_b32 s3, s11
366; VI-NEXT:    s_mov_b32 s12, s6
367; VI-NEXT:    s_mov_b32 s13, s7
368; VI-NEXT:    s_mov_b32 s6, s10
369; VI-NEXT:    s_mov_b32 s7, s11
370; VI-NEXT:    buffer_load_ushort v0, off, s[0:3], 0
371; VI-NEXT:    buffer_load_ushort v1, off, s[4:7], 0
372; VI-NEXT:    buffer_load_ushort v3, off, s[12:15], 0
373; VI-NEXT:    v_mov_b32_e32 v2, 0x3800
374; VI-NEXT:    s_waitcnt vmcnt(1)
375; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v0, v1
376; VI-NEXT:    s_waitcnt vmcnt(0)
377; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v3, vcc
378; VI-NEXT:    buffer_store_short v0, off, s[8:11], 0
379; VI-NEXT:    s_endpgm
380    half addrspace(1)* %r,
381    half addrspace(1)* %a,
382    half addrspace(1)* %b,
383    half addrspace(1)* %c) {
384entry:
385  %a.val = load volatile half, half addrspace(1)* %a
386  %b.val = load volatile half, half addrspace(1)* %b
387  %c.val = load volatile half, half addrspace(1)* %c
388  %fcmp = fcmp olt half %a.val, %b.val
389  %r.val = select i1 %fcmp, half %c.val, half 0xH3800
390  store half %r.val, half addrspace(1)* %r
391  ret void
392}
393
394define amdgpu_kernel void @select_v2f16(
395; SI-LABEL: select_v2f16:
396; SI:       ; %bb.0: ; %entry
397; SI-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x9
398; SI-NEXT:    s_load_dwordx2 s[12:13], s[0:1], 0x11
399; SI-NEXT:    s_mov_b32 s3, 0xf000
400; SI-NEXT:    s_mov_b32 s2, -1
401; SI-NEXT:    s_mov_b32 s22, s2
402; SI-NEXT:    s_waitcnt lgkmcnt(0)
403; SI-NEXT:    s_mov_b32 s20, s6
404; SI-NEXT:    s_mov_b32 s21, s7
405; SI-NEXT:    s_mov_b32 s23, s3
406; SI-NEXT:    s_mov_b32 s16, s10
407; SI-NEXT:    s_mov_b32 s17, s11
408; SI-NEXT:    s_mov_b32 s14, s2
409; SI-NEXT:    s_mov_b32 s15, s3
410; SI-NEXT:    s_mov_b32 s18, s2
411; SI-NEXT:    s_mov_b32 s19, s3
412; SI-NEXT:    s_mov_b32 s10, s2
413; SI-NEXT:    s_mov_b32 s11, s3
414; SI-NEXT:    buffer_load_dword v0, off, s[20:23], 0
415; SI-NEXT:    buffer_load_dword v1, off, s[8:11], 0
416; SI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
417; SI-NEXT:    buffer_load_dword v3, off, s[16:19], 0
418; SI-NEXT:    s_mov_b32 s0, s4
419; SI-NEXT:    s_mov_b32 s1, s5
420; SI-NEXT:    s_waitcnt vmcnt(3)
421; SI-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
422; SI-NEXT:    s_waitcnt vmcnt(2)
423; SI-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
424; SI-NEXT:    s_waitcnt vmcnt(1)
425; SI-NEXT:    v_cvt_f32_f16_e32 v4, v2
426; SI-NEXT:    s_waitcnt vmcnt(0)
427; SI-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
428; SI-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
429; SI-NEXT:    v_cvt_f32_f16_e32 v5, v5
430; SI-NEXT:    v_cvt_f32_f16_e32 v6, v6
431; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
432; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
433; SI-NEXT:    v_cvt_f32_f16_e32 v7, v7
434; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
435; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
436; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v5, v6
437; SI-NEXT:    v_cndmask_b32_e32 v2, v2, v7, vcc
438; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
439; SI-NEXT:    v_cndmask_b32_e32 v0, v4, v3, vcc
440; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
441; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
442; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
443; SI-NEXT:    v_or_b32_e32 v0, v0, v1
444; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
445; SI-NEXT:    s_endpgm
446;
447; VI-LABEL: select_v2f16:
448; VI:       ; %bb.0: ; %entry
449; VI-NEXT:    s_load_dwordx8 s[4:11], s[0:1], 0x24
450; VI-NEXT:    s_load_dwordx2 s[12:13], s[0:1], 0x44
451; VI-NEXT:    s_mov_b32 s3, 0xf000
452; VI-NEXT:    s_mov_b32 s2, -1
453; VI-NEXT:    s_mov_b32 s14, s2
454; VI-NEXT:    s_waitcnt lgkmcnt(0)
455; VI-NEXT:    s_mov_b32 s0, s4
456; VI-NEXT:    s_mov_b32 s1, s5
457; VI-NEXT:    s_mov_b32 s4, s6
458; VI-NEXT:    s_mov_b32 s5, s7
459; VI-NEXT:    s_mov_b32 s6, s2
460; VI-NEXT:    s_mov_b32 s7, s3
461; VI-NEXT:    s_mov_b32 s16, s10
462; VI-NEXT:    s_mov_b32 s17, s11
463; VI-NEXT:    s_mov_b32 s15, s3
464; VI-NEXT:    s_mov_b32 s18, s2
465; VI-NEXT:    s_mov_b32 s19, s3
466; VI-NEXT:    s_mov_b32 s10, s2
467; VI-NEXT:    s_mov_b32 s11, s3
468; VI-NEXT:    buffer_load_dword v0, off, s[4:7], 0
469; VI-NEXT:    buffer_load_dword v1, off, s[8:11], 0
470; VI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
471; VI-NEXT:    buffer_load_dword v3, off, s[16:19], 0
472; VI-NEXT:    s_waitcnt vmcnt(3)
473; VI-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
474; VI-NEXT:    s_waitcnt vmcnt(2)
475; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v0, v1
476; VI-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
477; VI-NEXT:    s_waitcnt vmcnt(0)
478; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v3, vcc
479; VI-NEXT:    v_lshrrev_b32_e32 v4, 16, v2
480; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
481; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v6, v5
482; VI-NEXT:    v_cndmask_b32_e32 v1, v4, v1, vcc
483; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
484; VI-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
485; VI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
486; VI-NEXT:    s_endpgm
487    <2 x half> addrspace(1)* %r,
488    <2 x half> addrspace(1)* %a,
489    <2 x half> addrspace(1)* %b,
490    <2 x half> addrspace(1)* %c,
491    <2 x half> addrspace(1)* %d) {
492entry:
493  %a.val = load <2 x half>, <2 x half> addrspace(1)* %a
494  %b.val = load <2 x half>, <2 x half> addrspace(1)* %b
495  %c.val = load <2 x half>, <2 x half> addrspace(1)* %c
496  %d.val = load <2 x half>, <2 x half> addrspace(1)* %d
497  %fcmp = fcmp olt <2 x half> %a.val, %b.val
498  %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val
499  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
500  ret void
501}
502
503define amdgpu_kernel void @select_v2f16_imm_a(
504; SI-LABEL: select_v2f16_imm_a:
505; SI:       ; %bb.0: ; %entry
506; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
507; SI-NEXT:    s_mov_b32 s11, 0xf000
508; SI-NEXT:    s_mov_b32 s10, -1
509; SI-NEXT:    s_mov_b32 s14, s10
510; SI-NEXT:    s_mov_b32 s15, s11
511; SI-NEXT:    s_waitcnt lgkmcnt(0)
512; SI-NEXT:    s_mov_b32 s12, s6
513; SI-NEXT:    s_mov_b32 s13, s7
514; SI-NEXT:    s_mov_b32 s16, s2
515; SI-NEXT:    s_mov_b32 s17, s3
516; SI-NEXT:    s_mov_b32 s18, s10
517; SI-NEXT:    s_mov_b32 s19, s11
518; SI-NEXT:    s_mov_b32 s6, s10
519; SI-NEXT:    s_mov_b32 s7, s11
520; SI-NEXT:    buffer_load_dword v0, off, s[16:19], 0
521; SI-NEXT:    buffer_load_dword v1, off, s[4:7], 0
522; SI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
523; SI-NEXT:    s_mov_b32 s2, 0x3f200000
524; SI-NEXT:    s_mov_b32 s8, s0
525; SI-NEXT:    s_mov_b32 s9, s1
526; SI-NEXT:    s_waitcnt vmcnt(2)
527; SI-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
528; SI-NEXT:    s_waitcnt vmcnt(1)
529; SI-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
530; SI-NEXT:    s_waitcnt vmcnt(0)
531; SI-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
532; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
533; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
534; SI-NEXT:    v_cvt_f32_f16_e32 v4, v4
535; SI-NEXT:    v_cvt_f32_f16_e32 v5, v5
536; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
537; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
538; SI-NEXT:    v_cmp_lt_f32_e32 vcc, s2, v3
539; SI-NEXT:    v_cndmask_b32_e32 v3, v5, v4, vcc
540; SI-NEXT:    v_cmp_lt_f32_e32 vcc, 0.5, v0
541; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
542; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
543; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
544; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v3
545; SI-NEXT:    v_or_b32_e32 v0, v0, v1
546; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
547; SI-NEXT:    s_endpgm
548;
549; VI-LABEL: select_v2f16_imm_a:
550; VI:       ; %bb.0: ; %entry
551; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
552; VI-NEXT:    s_mov_b32 s11, 0xf000
553; VI-NEXT:    s_mov_b32 s10, -1
554; VI-NEXT:    s_mov_b32 s14, s10
555; VI-NEXT:    s_mov_b32 s15, s11
556; VI-NEXT:    s_waitcnt lgkmcnt(0)
557; VI-NEXT:    s_mov_b32 s8, s0
558; VI-NEXT:    s_mov_b32 s9, s1
559; VI-NEXT:    s_mov_b32 s12, s6
560; VI-NEXT:    s_mov_b32 s13, s7
561; VI-NEXT:    s_mov_b32 s0, s2
562; VI-NEXT:    s_mov_b32 s1, s3
563; VI-NEXT:    s_mov_b32 s2, s10
564; VI-NEXT:    s_mov_b32 s3, s11
565; VI-NEXT:    s_mov_b32 s6, s10
566; VI-NEXT:    s_mov_b32 s7, s11
567; VI-NEXT:    buffer_load_dword v0, off, s[0:3], 0
568; VI-NEXT:    buffer_load_dword v1, off, s[4:7], 0
569; VI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
570; VI-NEXT:    s_movk_i32 s0, 0x3900
571; VI-NEXT:    s_waitcnt vmcnt(2)
572; VI-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
573; VI-NEXT:    v_cmp_lt_f16_e32 vcc, 0.5, v0
574; VI-NEXT:    s_waitcnt vmcnt(0)
575; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
576; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
577; VI-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
578; VI-NEXT:    v_cmp_lt_f16_e32 vcc, s0, v3
579; VI-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
580; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
581; VI-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
582; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
583; VI-NEXT:    s_endpgm
584    <2 x half> addrspace(1)* %r,
585    <2 x half> addrspace(1)* %b,
586    <2 x half> addrspace(1)* %c,
587    <2 x half> addrspace(1)* %d) {
588entry:
589  %b.val = load <2 x half>, <2 x half> addrspace(1)* %b
590  %c.val = load <2 x half>, <2 x half> addrspace(1)* %c
591  %d.val = load <2 x half>, <2 x half> addrspace(1)* %d
592  %fcmp = fcmp olt <2 x half> <half 0xH3800, half 0xH3900>, %b.val
593  %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val
594  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
595  ret void
596}
597
598define amdgpu_kernel void @select_v2f16_imm_b(
599; SI-LABEL: select_v2f16_imm_b:
600; SI:       ; %bb.0: ; %entry
601; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
602; SI-NEXT:    s_mov_b32 s11, 0xf000
603; SI-NEXT:    s_mov_b32 s10, -1
604; SI-NEXT:    s_mov_b32 s14, s10
605; SI-NEXT:    s_mov_b32 s15, s11
606; SI-NEXT:    s_waitcnt lgkmcnt(0)
607; SI-NEXT:    s_mov_b32 s12, s6
608; SI-NEXT:    s_mov_b32 s13, s7
609; SI-NEXT:    s_mov_b32 s16, s2
610; SI-NEXT:    s_mov_b32 s17, s3
611; SI-NEXT:    s_mov_b32 s18, s10
612; SI-NEXT:    s_mov_b32 s19, s11
613; SI-NEXT:    s_mov_b32 s6, s10
614; SI-NEXT:    s_mov_b32 s7, s11
615; SI-NEXT:    buffer_load_dword v0, off, s[16:19], 0
616; SI-NEXT:    buffer_load_dword v1, off, s[4:7], 0
617; SI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
618; SI-NEXT:    s_mov_b32 s2, 0x3f200000
619; SI-NEXT:    s_mov_b32 s8, s0
620; SI-NEXT:    s_mov_b32 s9, s1
621; SI-NEXT:    s_waitcnt vmcnt(2)
622; SI-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
623; SI-NEXT:    s_waitcnt vmcnt(1)
624; SI-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
625; SI-NEXT:    s_waitcnt vmcnt(0)
626; SI-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
627; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
628; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
629; SI-NEXT:    v_cvt_f32_f16_e32 v4, v4
630; SI-NEXT:    v_cvt_f32_f16_e32 v5, v5
631; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
632; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2
633; SI-NEXT:    v_cmp_gt_f32_e32 vcc, s2, v3
634; SI-NEXT:    v_cndmask_b32_e32 v3, v5, v4, vcc
635; SI-NEXT:    v_cmp_gt_f32_e32 vcc, 0.5, v0
636; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
637; SI-NEXT:    v_cvt_f16_f32_e32 v3, v3
638; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
639; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v3
640; SI-NEXT:    v_or_b32_e32 v0, v0, v1
641; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
642; SI-NEXT:    s_endpgm
643;
644; VI-LABEL: select_v2f16_imm_b:
645; VI:       ; %bb.0: ; %entry
646; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
647; VI-NEXT:    s_mov_b32 s11, 0xf000
648; VI-NEXT:    s_mov_b32 s10, -1
649; VI-NEXT:    s_mov_b32 s14, s10
650; VI-NEXT:    s_mov_b32 s15, s11
651; VI-NEXT:    s_waitcnt lgkmcnt(0)
652; VI-NEXT:    s_mov_b32 s8, s0
653; VI-NEXT:    s_mov_b32 s9, s1
654; VI-NEXT:    s_mov_b32 s12, s6
655; VI-NEXT:    s_mov_b32 s13, s7
656; VI-NEXT:    s_mov_b32 s0, s2
657; VI-NEXT:    s_mov_b32 s1, s3
658; VI-NEXT:    s_mov_b32 s2, s10
659; VI-NEXT:    s_mov_b32 s3, s11
660; VI-NEXT:    s_mov_b32 s6, s10
661; VI-NEXT:    s_mov_b32 s7, s11
662; VI-NEXT:    buffer_load_dword v0, off, s[0:3], 0
663; VI-NEXT:    buffer_load_dword v1, off, s[4:7], 0
664; VI-NEXT:    buffer_load_dword v2, off, s[12:15], 0
665; VI-NEXT:    s_movk_i32 s0, 0x3900
666; VI-NEXT:    s_waitcnt vmcnt(2)
667; VI-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
668; VI-NEXT:    v_cmp_gt_f16_e32 vcc, 0.5, v0
669; VI-NEXT:    s_waitcnt vmcnt(0)
670; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
671; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
672; VI-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
673; VI-NEXT:    v_cmp_gt_f16_e32 vcc, s0, v3
674; VI-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
675; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
676; VI-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
677; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
678; VI-NEXT:    s_endpgm
679    <2 x half> addrspace(1)* %r,
680    <2 x half> addrspace(1)* %a,
681    <2 x half> addrspace(1)* %c,
682    <2 x half> addrspace(1)* %d) {
683entry:
684  %a.val = load <2 x half>, <2 x half> addrspace(1)* %a
685  %c.val = load <2 x half>, <2 x half> addrspace(1)* %c
686  %d.val = load <2 x half>, <2 x half> addrspace(1)* %d
687  %fcmp = fcmp olt <2 x half> %a.val, <half 0xH3800, half 0xH3900>
688  %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val
689  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
690  ret void
691}
692
693define amdgpu_kernel void @select_v2f16_imm_c(
694; SI-LABEL: select_v2f16_imm_c:
695; SI:       ; %bb.0: ; %entry
696; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
697; SI-NEXT:    s_mov_b32 s11, 0xf000
698; SI-NEXT:    s_mov_b32 s10, -1
699; SI-NEXT:    s_mov_b32 s18, s10
700; SI-NEXT:    s_mov_b32 s19, s11
701; SI-NEXT:    s_waitcnt lgkmcnt(0)
702; SI-NEXT:    s_mov_b32 s12, s6
703; SI-NEXT:    s_mov_b32 s13, s7
704; SI-NEXT:    s_mov_b32 s6, s10
705; SI-NEXT:    s_mov_b32 s7, s11
706; SI-NEXT:    s_mov_b32 s16, s2
707; SI-NEXT:    s_mov_b32 s17, s3
708; SI-NEXT:    s_mov_b32 s14, s10
709; SI-NEXT:    s_mov_b32 s15, s11
710; SI-NEXT:    buffer_load_dword v0, off, s[16:19], 0
711; SI-NEXT:    buffer_load_dword v1, off, s[12:15], 0
712; SI-NEXT:    buffer_load_dword v3, off, s[4:7], 0
713; SI-NEXT:    v_mov_b32_e32 v2, 0x3f200000
714; SI-NEXT:    s_mov_b32 s8, s0
715; SI-NEXT:    s_mov_b32 s9, s1
716; SI-NEXT:    s_waitcnt vmcnt(2)
717; SI-NEXT:    v_cvt_f32_f16_e32 v4, v0
718; SI-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
719; SI-NEXT:    s_waitcnt vmcnt(0)
720; SI-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
721; SI-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
722; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
723; SI-NEXT:    v_cvt_f32_f16_e32 v5, v5
724; SI-NEXT:    v_cvt_f32_f16_e32 v6, v6
725; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
726; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
727; SI-NEXT:    v_cmp_nlt_f32_e32 vcc, v0, v5
728; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
729; SI-NEXT:    v_cmp_nlt_f32_e32 vcc, v4, v3
730; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
731; SI-NEXT:    v_cndmask_b32_e32 v1, 0.5, v1, vcc
732; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1
733; SI-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
734; SI-NEXT:    v_or_b32_e32 v0, v1, v0
735; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
736; SI-NEXT:    s_endpgm
737;
738; VI-LABEL: select_v2f16_imm_c:
739; VI:       ; %bb.0: ; %entry
740; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
741; VI-NEXT:    s_mov_b32 s11, 0xf000
742; VI-NEXT:    s_mov_b32 s10, -1
743; VI-NEXT:    s_mov_b32 s14, s10
744; VI-NEXT:    s_mov_b32 s15, s11
745; VI-NEXT:    s_waitcnt lgkmcnt(0)
746; VI-NEXT:    s_mov_b32 s8, s0
747; VI-NEXT:    s_mov_b32 s9, s1
748; VI-NEXT:    s_mov_b32 s12, s6
749; VI-NEXT:    s_mov_b32 s13, s7
750; VI-NEXT:    s_mov_b32 s0, s2
751; VI-NEXT:    s_mov_b32 s1, s3
752; VI-NEXT:    s_mov_b32 s6, s10
753; VI-NEXT:    s_mov_b32 s7, s11
754; VI-NEXT:    s_mov_b32 s2, s10
755; VI-NEXT:    s_mov_b32 s3, s11
756; VI-NEXT:    buffer_load_dword v0, off, s[0:3], 0
757; VI-NEXT:    buffer_load_dword v1, off, s[12:15], 0
758; VI-NEXT:    buffer_load_dword v4, off, s[4:7], 0
759; VI-NEXT:    v_mov_b32_e32 v2, 0x3800
760; VI-NEXT:    v_mov_b32_e32 v3, 0x3900
761; VI-NEXT:    s_waitcnt vmcnt(2)
762; VI-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
763; VI-NEXT:    s_waitcnt vmcnt(0)
764; VI-NEXT:    v_cmp_nlt_f16_e32 vcc, v0, v4
765; VI-NEXT:    v_lshrrev_b32_e32 v5, 16, v4
766; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
767; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
768; VI-NEXT:    v_cmp_nlt_f16_e32 vcc, v6, v5
769; VI-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
770; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
771; VI-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
772; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
773; VI-NEXT:    s_endpgm
774    <2 x half> addrspace(1)* %r,
775    <2 x half> addrspace(1)* %a,
776    <2 x half> addrspace(1)* %b,
777    <2 x half> addrspace(1)* %d) {
778entry:
779  %a.val = load <2 x half>, <2 x half> addrspace(1)* %a
780  %b.val = load <2 x half>, <2 x half> addrspace(1)* %b
781  %d.val = load <2 x half>, <2 x half> addrspace(1)* %d
782  %fcmp = fcmp olt <2 x half> %a.val, %b.val
783  %r.val = select <2 x i1> %fcmp, <2 x half> <half 0xH3800, half 0xH3900>, <2 x half> %d.val
784  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
785  ret void
786}
787
788define amdgpu_kernel void @select_v2f16_imm_d(
789; SI-LABEL: select_v2f16_imm_d:
790; SI:       ; %bb.0: ; %entry
791; SI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
792; SI-NEXT:    s_mov_b32 s11, 0xf000
793; SI-NEXT:    s_mov_b32 s10, -1
794; SI-NEXT:    s_mov_b32 s18, s10
795; SI-NEXT:    s_mov_b32 s19, s11
796; SI-NEXT:    s_waitcnt lgkmcnt(0)
797; SI-NEXT:    s_mov_b32 s12, s6
798; SI-NEXT:    s_mov_b32 s13, s7
799; SI-NEXT:    s_mov_b32 s6, s10
800; SI-NEXT:    s_mov_b32 s7, s11
801; SI-NEXT:    s_mov_b32 s16, s2
802; SI-NEXT:    s_mov_b32 s17, s3
803; SI-NEXT:    s_mov_b32 s14, s10
804; SI-NEXT:    s_mov_b32 s15, s11
805; SI-NEXT:    buffer_load_dword v0, off, s[16:19], 0
806; SI-NEXT:    buffer_load_dword v1, off, s[12:15], 0
807; SI-NEXT:    buffer_load_dword v3, off, s[4:7], 0
808; SI-NEXT:    v_mov_b32_e32 v2, 0x3f200000
809; SI-NEXT:    s_mov_b32 s8, s0
810; SI-NEXT:    s_mov_b32 s9, s1
811; SI-NEXT:    s_waitcnt vmcnt(2)
812; SI-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
813; SI-NEXT:    s_waitcnt vmcnt(1)
814; SI-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
815; SI-NEXT:    s_waitcnt vmcnt(0)
816; SI-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
817; SI-NEXT:    v_cvt_f32_f16_e32 v4, v4
818; SI-NEXT:    v_cvt_f32_f16_e32 v5, v5
819; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
820; SI-NEXT:    v_cvt_f32_f16_e32 v6, v6
821; SI-NEXT:    v_cvt_f32_f16_e32 v3, v3
822; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1
823; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v4, v5
824; SI-NEXT:    v_cndmask_b32_e32 v2, v2, v6, vcc
825; SI-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v3
826; SI-NEXT:    v_cndmask_b32_e32 v0, 0.5, v1, vcc
827; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2
828; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0
829; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v2
830; SI-NEXT:    v_or_b32_e32 v0, v0, v1
831; SI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
832; SI-NEXT:    s_endpgm
833;
834; VI-LABEL: select_v2f16_imm_d:
835; VI:       ; %bb.0: ; %entry
836; VI-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x24
837; VI-NEXT:    s_mov_b32 s11, 0xf000
838; VI-NEXT:    s_mov_b32 s10, -1
839; VI-NEXT:    s_mov_b32 s14, s10
840; VI-NEXT:    s_mov_b32 s15, s11
841; VI-NEXT:    s_waitcnt lgkmcnt(0)
842; VI-NEXT:    s_mov_b32 s8, s0
843; VI-NEXT:    s_mov_b32 s9, s1
844; VI-NEXT:    s_mov_b32 s12, s6
845; VI-NEXT:    s_mov_b32 s13, s7
846; VI-NEXT:    s_mov_b32 s0, s2
847; VI-NEXT:    s_mov_b32 s1, s3
848; VI-NEXT:    s_mov_b32 s6, s10
849; VI-NEXT:    s_mov_b32 s7, s11
850; VI-NEXT:    s_mov_b32 s2, s10
851; VI-NEXT:    s_mov_b32 s3, s11
852; VI-NEXT:    buffer_load_dword v0, off, s[0:3], 0
853; VI-NEXT:    buffer_load_dword v1, off, s[12:15], 0
854; VI-NEXT:    buffer_load_dword v4, off, s[4:7], 0
855; VI-NEXT:    v_mov_b32_e32 v2, 0x3800
856; VI-NEXT:    v_mov_b32_e32 v3, 0x3900
857; VI-NEXT:    s_waitcnt vmcnt(2)
858; VI-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
859; VI-NEXT:    s_waitcnt vmcnt(0)
860; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v0, v4
861; VI-NEXT:    v_lshrrev_b32_e32 v5, 16, v4
862; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc
863; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
864; VI-NEXT:    v_cmp_lt_f16_e32 vcc, v6, v5
865; VI-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
866; VI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
867; VI-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
868; VI-NEXT:    buffer_store_dword v0, off, s[8:11], 0
869; VI-NEXT:    s_endpgm
870    <2 x half> addrspace(1)* %r,
871    <2 x half> addrspace(1)* %a,
872    <2 x half> addrspace(1)* %b,
873    <2 x half> addrspace(1)* %c) {
874entry:
875  %a.val = load <2 x half>, <2 x half> addrspace(1)* %a
876  %b.val = load <2 x half>, <2 x half> addrspace(1)* %b
877  %c.val = load <2 x half>, <2 x half> addrspace(1)* %c
878  %fcmp = fcmp olt <2 x half> %a.val, %b.val
879  %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> <half 0xH3800, half 0xH3900>
880  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
881  ret void
882}
883