1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX9 %s
3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX8 %s
4
5define void @undef_lo_v2i16(i16 %arg0) {
6; GFX9-LABEL: undef_lo_v2i16:
7; GFX9:       ; %bb.0:
8; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
10; GFX9-NEXT:    ;;#ASMSTART
11; GFX9-NEXT:    ; use v0
12; GFX9-NEXT:    ;;#ASMEND
13; GFX9-NEXT:    s_setpc_b64 s[30:31]
14;
15; GFX8-LABEL: undef_lo_v2i16:
16; GFX8:       ; %bb.0:
17; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
19; GFX8-NEXT:    ;;#ASMSTART
20; GFX8-NEXT:    ; use v0
21; GFX8-NEXT:    ;;#ASMEND
22; GFX8-NEXT:    s_setpc_b64 s[30:31]
23  %undef.lo = insertelement <2 x i16> undef, i16 %arg0, i32 1
24  call void asm sideeffect "; use $0", "v"(<2 x i16> %undef.lo);
25  ret void
26}
27
28define void @undef_lo_v2f16(half %arg0) {
29; GFX9-LABEL: undef_lo_v2f16:
30; GFX9:       ; %bb.0:
31; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
32; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
33; GFX9-NEXT:    ;;#ASMSTART
34; GFX9-NEXT:    ; use v0
35; GFX9-NEXT:    ;;#ASMEND
36; GFX9-NEXT:    s_setpc_b64 s[30:31]
37;
38; GFX8-LABEL: undef_lo_v2f16:
39; GFX8:       ; %bb.0:
40; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
41; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
42; GFX8-NEXT:    ;;#ASMSTART
43; GFX8-NEXT:    ; use v0
44; GFX8-NEXT:    ;;#ASMEND
45; GFX8-NEXT:    s_setpc_b64 s[30:31]
46  %undef.lo = insertelement <2 x half> undef, half %arg0, i32 1
47  call void asm sideeffect "; use $0", "v"(<2 x half> %undef.lo);
48  ret void
49}
50
51define void @undef_lo_op_v2f16(half %arg0) {
52; GFX9-LABEL: undef_lo_op_v2f16:
53; GFX9:       ; %bb.0:
54; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
55; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
56; GFX9-NEXT:    v_pk_add_f16 v0, v0, 1.0 op_sel_hi:[1,0]
57; GFX9-NEXT:    ;;#ASMSTART
58; GFX9-NEXT:    ; use v0
59; GFX9-NEXT:    ;;#ASMEND
60; GFX9-NEXT:    s_setpc_b64 s[30:31]
61;
62; GFX8-LABEL: undef_lo_op_v2f16:
63; GFX8:       ; %bb.0:
64; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
65; GFX8-NEXT:    v_mov_b32_e32 v1, 0x3c00
66; GFX8-NEXT:    v_add_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
67; GFX8-NEXT:    v_or_b32_e32 v0, 0x7e00, v0
68; GFX8-NEXT:    ;;#ASMSTART
69; GFX8-NEXT:    ; use v0
70; GFX8-NEXT:    ;;#ASMEND
71; GFX8-NEXT:    s_setpc_b64 s[30:31]
72  %undef.lo = insertelement <2 x half> undef, half %arg0, i32 1
73  %op = fadd <2 x half> %undef.lo, <half 1.0, half 1.0>
74  call void asm sideeffect "; use $0", "v"(<2 x half> %op);
75  ret void
76}
77
78define void @undef_lo_op_v2i16(i16 %arg0) {
79; GFX9-LABEL: undef_lo_op_v2i16:
80; GFX9:       ; %bb.0:
81; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
82; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
83; GFX9-NEXT:    s_movk_i32 s4, 0x63
84; GFX9-NEXT:    v_pk_add_u16 v0, v0, s4 op_sel_hi:[1,0]
85; GFX9-NEXT:    ;;#ASMSTART
86; GFX9-NEXT:    ; use v0
87; GFX9-NEXT:    ;;#ASMEND
88; GFX9-NEXT:    s_setpc_b64 s[30:31]
89;
90; GFX8-LABEL: undef_lo_op_v2i16:
91; GFX8:       ; %bb.0:
92; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
93; GFX8-NEXT:    v_mov_b32_e32 v1, 0x63
94; GFX8-NEXT:    v_add_u16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
95; GFX8-NEXT:    ;;#ASMSTART
96; GFX8-NEXT:    ; use v0
97; GFX8-NEXT:    ;;#ASMEND
98; GFX8-NEXT:    s_setpc_b64 s[30:31]
99  %undef.lo = insertelement <2 x i16> undef, i16 %arg0, i32 1
100  %op = add <2 x i16> %undef.lo, <i16 99, i16 99>
101  call void asm sideeffect "; use $0", "v"(<2 x i16> %op);
102  ret void
103}
104
105define void @undef_lo3_v4i16(i16 %arg0) {
106; GFX9-LABEL: undef_lo3_v4i16:
107; GFX9:       ; %bb.0:
108; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
109; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
110; GFX9-NEXT:    ;;#ASMSTART
111; GFX9-NEXT:    ; use v[0:1]
112; GFX9-NEXT:    ;;#ASMEND
113; GFX9-NEXT:    s_setpc_b64 s[30:31]
114;
115; GFX8-LABEL: undef_lo3_v4i16:
116; GFX8:       ; %bb.0:
117; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
118; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
119; GFX8-NEXT:    ;;#ASMSTART
120; GFX8-NEXT:    ; use v[0:1]
121; GFX8-NEXT:    ;;#ASMEND
122; GFX8-NEXT:    s_setpc_b64 s[30:31]
123  %undef.lo = insertelement <4 x i16> undef, i16 %arg0, i32 1
124  call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.lo);
125  ret void
126}
127
128define void @undef_lo3_v4f16(half %arg0) {
129; GFX9-LABEL: undef_lo3_v4f16:
130; GFX9:       ; %bb.0:
131; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
133; GFX9-NEXT:    ;;#ASMSTART
134; GFX9-NEXT:    ; use v[0:1]
135; GFX9-NEXT:    ;;#ASMEND
136; GFX9-NEXT:    s_setpc_b64 s[30:31]
137;
138; GFX8-LABEL: undef_lo3_v4f16:
139; GFX8:       ; %bb.0:
140; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
141; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
142; GFX8-NEXT:    ;;#ASMSTART
143; GFX8-NEXT:    ; use v[0:1]
144; GFX8-NEXT:    ;;#ASMEND
145; GFX8-NEXT:    s_setpc_b64 s[30:31]
146  %undef.lo = insertelement <4 x half> undef, half %arg0, i32 1
147  call void asm sideeffect "; use $0", "v"(<4 x half> %undef.lo);
148  ret void
149}
150
151define void @undef_lo2_v4i16(<2 x i16> %arg0) {
152; GFX9-LABEL: undef_lo2_v4i16:
153; GFX9:       ; %bb.0:
154; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
155; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
156; GFX9-NEXT:    v_mov_b32_e32 v2, 0xffff0000
157; GFX9-NEXT:    v_and_or_b32 v0, v0, v2, v1
158; GFX9-NEXT:    ;;#ASMSTART
159; GFX9-NEXT:    ; use v[0:1]
160; GFX9-NEXT:    ;;#ASMEND
161; GFX9-NEXT:    s_setpc_b64 s[30:31]
162;
163; GFX8-LABEL: undef_lo2_v4i16:
164; GFX8:       ; %bb.0:
165; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
166; GFX8-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
167; GFX8-NEXT:    v_alignbit_b32 v0, v1, v0, 16
168; GFX8-NEXT:    ;;#ASMSTART
169; GFX8-NEXT:    ; use v[0:1]
170; GFX8-NEXT:    ;;#ASMEND
171; GFX8-NEXT:    s_setpc_b64 s[30:31]
172  %undef.lo = shufflevector <2 x i16> %arg0, <2 x i16> undef, <4 x i32> <i32 1, i32 1, i32 2, i32 3>
173  call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.lo);
174  ret void
175}
176
177define void @undef_lo2_v4f16(<2 x half> %arg0) {
178; GFX9-LABEL: undef_lo2_v4f16:
179; GFX9:       ; %bb.0:
180; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
181; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
182; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v0
183; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
184; GFX9-NEXT:    ;;#ASMSTART
185; GFX9-NEXT:    ; use v[0:1]
186; GFX9-NEXT:    ;;#ASMEND
187; GFX9-NEXT:    s_setpc_b64 s[30:31]
188;
189; GFX8-LABEL: undef_lo2_v4f16:
190; GFX8:       ; %bb.0:
191; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
192; GFX8-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
193; GFX8-NEXT:    v_alignbit_b32 v0, v1, v0, 16
194; GFX8-NEXT:    ;;#ASMSTART
195; GFX8-NEXT:    ; use v[0:1]
196; GFX8-NEXT:    ;;#ASMEND
197; GFX8-NEXT:    s_setpc_b64 s[30:31]
198  %undef.lo = shufflevector <2 x half> %arg0, <2 x half> undef, <4 x i32> <i32 1, i32 1, i32 2, i32 3>
199  call void asm sideeffect "; use $0", "v"(<4 x half> %undef.lo);
200  ret void
201}
202
203define void @undef_hi_v2i16(i16 %arg0) {
204; GFX9-LABEL: undef_hi_v2i16:
205; GFX9:       ; %bb.0:
206; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
207; GFX9-NEXT:    ;;#ASMSTART
208; GFX9-NEXT:    ; use v0
209; GFX9-NEXT:    ;;#ASMEND
210; GFX9-NEXT:    s_setpc_b64 s[30:31]
211;
212; GFX8-LABEL: undef_hi_v2i16:
213; GFX8:       ; %bb.0:
214; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
215; GFX8-NEXT:    ;;#ASMSTART
216; GFX8-NEXT:    ; use v0
217; GFX8-NEXT:    ;;#ASMEND
218; GFX8-NEXT:    s_setpc_b64 s[30:31]
219  %undef.hi = insertelement <2 x i16> undef, i16 %arg0, i32 0
220  call void asm sideeffect "; use $0", "v"(<2 x i16> %undef.hi);
221  ret void
222}
223
224define void @undef_hi_v2f16(half %arg0) {
225; GFX9-LABEL: undef_hi_v2f16:
226; GFX9:       ; %bb.0:
227; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
228; GFX9-NEXT:    ;;#ASMSTART
229; GFX9-NEXT:    ; use v0
230; GFX9-NEXT:    ;;#ASMEND
231; GFX9-NEXT:    s_setpc_b64 s[30:31]
232;
233; GFX8-LABEL: undef_hi_v2f16:
234; GFX8:       ; %bb.0:
235; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
236; GFX8-NEXT:    ;;#ASMSTART
237; GFX8-NEXT:    ; use v0
238; GFX8-NEXT:    ;;#ASMEND
239; GFX8-NEXT:    s_setpc_b64 s[30:31]
240  %undef.hi = insertelement <2 x half> undef, half %arg0, i32 0
241  call void asm sideeffect "; use $0", "v"(<2 x half> %undef.hi);
242  ret void
243}
244
245define void @undef_hi_op_v2f16(half %arg0) {
246; GFX9-LABEL: undef_hi_op_v2f16:
247; GFX9:       ; %bb.0:
248; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
249; GFX9-NEXT:    v_pk_add_f16 v0, v0, 1.0 op_sel_hi:[1,0]
250; GFX9-NEXT:    ;;#ASMSTART
251; GFX9-NEXT:    ; use v0
252; GFX9-NEXT:    ;;#ASMEND
253; GFX9-NEXT:    s_setpc_b64 s[30:31]
254;
255; GFX8-LABEL: undef_hi_op_v2f16:
256; GFX8:       ; %bb.0:
257; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258; GFX8-NEXT:    v_add_f16_e32 v0, 1.0, v0
259; GFX8-NEXT:    v_or_b32_e32 v0, 0x7e000000, v0
260; GFX8-NEXT:    ;;#ASMSTART
261; GFX8-NEXT:    ; use v0
262; GFX8-NEXT:    ;;#ASMEND
263; GFX8-NEXT:    s_setpc_b64 s[30:31]
264  %undef.hi = insertelement <2 x half> undef, half %arg0, i32 0
265  %op = fadd <2 x half> %undef.hi, <half 1.0, half 1.0>
266  call void asm sideeffect "; use $0", "v"(<2 x half> %op);
267  ret void
268}
269
270define void @undef_hi_op_v2i16(i16 %arg0) {
271; GFX9-LABEL: undef_hi_op_v2i16:
272; GFX9:       ; %bb.0:
273; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
274; GFX9-NEXT:    s_movk_i32 s4, 0x63
275; GFX9-NEXT:    v_pk_add_u16 v0, v0, s4 op_sel_hi:[1,0]
276; GFX9-NEXT:    ;;#ASMSTART
277; GFX9-NEXT:    ; use v0
278; GFX9-NEXT:    ;;#ASMEND
279; GFX9-NEXT:    s_setpc_b64 s[30:31]
280;
281; GFX8-LABEL: undef_hi_op_v2i16:
282; GFX8:       ; %bb.0:
283; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
284; GFX8-NEXT:    v_add_u16_e32 v0, 0x63, v0
285; GFX8-NEXT:    ;;#ASMSTART
286; GFX8-NEXT:    ; use v0
287; GFX8-NEXT:    ;;#ASMEND
288; GFX8-NEXT:    s_setpc_b64 s[30:31]
289  %undef.hi = insertelement <2 x i16> undef, i16 %arg0, i32 0
290  %op = add <2 x i16> %undef.hi, <i16 99, i16 99>
291  call void asm sideeffect "; use $0", "v"(<2 x i16> %op);
292  ret void
293}
294
295define void @undef_hi3_v4i16(i16 %arg0) {
296; GFX9-LABEL: undef_hi3_v4i16:
297; GFX9:       ; %bb.0:
298; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
299; GFX9-NEXT:    ;;#ASMSTART
300; GFX9-NEXT:    ; use v[0:1]
301; GFX9-NEXT:    ;;#ASMEND
302; GFX9-NEXT:    s_setpc_b64 s[30:31]
303;
304; GFX8-LABEL: undef_hi3_v4i16:
305; GFX8:       ; %bb.0:
306; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
307; GFX8-NEXT:    ;;#ASMSTART
308; GFX8-NEXT:    ; use v[0:1]
309; GFX8-NEXT:    ;;#ASMEND
310; GFX8-NEXT:    s_setpc_b64 s[30:31]
311  %undef.hi = insertelement <4 x i16> undef, i16 %arg0, i32 0
312  call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.hi);
313  ret void
314}
315
316define void @undef_hi3_v4f16(half %arg0) {
317; GFX9-LABEL: undef_hi3_v4f16:
318; GFX9:       ; %bb.0:
319; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
320; GFX9-NEXT:    ;;#ASMSTART
321; GFX9-NEXT:    ; use v[0:1]
322; GFX9-NEXT:    ;;#ASMEND
323; GFX9-NEXT:    s_setpc_b64 s[30:31]
324;
325; GFX8-LABEL: undef_hi3_v4f16:
326; GFX8:       ; %bb.0:
327; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
328; GFX8-NEXT:    ;;#ASMSTART
329; GFX8-NEXT:    ; use v[0:1]
330; GFX8-NEXT:    ;;#ASMEND
331; GFX8-NEXT:    s_setpc_b64 s[30:31]
332  %undef.hi = insertelement <4 x half> undef, half %arg0, i32 0
333  call void asm sideeffect "; use $0", "v"(<4 x half> %undef.hi);
334  ret void
335}
336
337define void @undef_hi2_v4i16(<2 x i16> %arg0) {
338; GFX9-LABEL: undef_hi2_v4i16:
339; GFX9:       ; %bb.0:
340; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
341; GFX9-NEXT:    ;;#ASMSTART
342; GFX9-NEXT:    ; use v[0:1]
343; GFX9-NEXT:    ;;#ASMEND
344; GFX9-NEXT:    s_setpc_b64 s[30:31]
345;
346; GFX8-LABEL: undef_hi2_v4i16:
347; GFX8:       ; %bb.0:
348; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
349; GFX8-NEXT:    ;;#ASMSTART
350; GFX8-NEXT:    ; use v[0:1]
351; GFX8-NEXT:    ;;#ASMEND
352; GFX8-NEXT:    s_setpc_b64 s[30:31]
353  %undef.hi = shufflevector <2 x i16> %arg0, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
354  call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.hi);
355  ret void
356}
357
358define void @undef_hi2_v4f16(<2 x half> %arg0) {
359; GFX9-LABEL: undef_hi2_v4f16:
360; GFX9:       ; %bb.0:
361; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
362; GFX9-NEXT:    ;;#ASMSTART
363; GFX9-NEXT:    ; use v[0:1]
364; GFX9-NEXT:    ;;#ASMEND
365; GFX9-NEXT:    s_setpc_b64 s[30:31]
366;
367; GFX8-LABEL: undef_hi2_v4f16:
368; GFX8:       ; %bb.0:
369; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
370; GFX8-NEXT:    ;;#ASMSTART
371; GFX8-NEXT:    ; use v[0:1]
372; GFX8-NEXT:    ;;#ASMEND
373; GFX8-NEXT:    s_setpc_b64 s[30:31]
374  %undef.hi = shufflevector <2 x half> %arg0, <2 x half> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
375  call void asm sideeffect "; use $0", "v"(<4 x half> %undef.hi);
376  ret void
377}
378
379