1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-amdgpu-aa=0 -mattr=+flat-for-global -denormal-fp-math=preserve-sign < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,GFX9 %s
3; RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -enable-amdgpu-aa=0 -mattr=+flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,CIVI,VI %s
4; RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-amdgpu-aa=0 -mattr=+flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CIVI,CI %s
5
6define amdgpu_kernel void @s_insertelement_v2i16_0(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr) #0 {
7; GFX9-LABEL: s_insertelement_v2i16_0:
8; GFX9:       ; %bb.0:
9; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
11; GFX9-NEXT:    v_mov_b32_e32 v0, s0
12; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
13; GFX9-NEXT:    v_mov_b32_e32 v1, s1
14; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
15; GFX9-NEXT:    s_pack_lh_b32_b16 s0, 0x3e7, s0
16; GFX9-NEXT:    v_mov_b32_e32 v2, s0
17; GFX9-NEXT:    global_store_dword v[0:1], v2, off
18; GFX9-NEXT:    s_endpgm
19;
20; CIVI-LABEL: s_insertelement_v2i16_0:
21; CIVI:       ; %bb.0:
22; CIVI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
23; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
24; CIVI-NEXT:    v_mov_b32_e32 v0, s0
25; CIVI-NEXT:    s_load_dword s0, s[2:3], 0x0
26; CIVI-NEXT:    v_mov_b32_e32 v1, s1
27; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
28; CIVI-NEXT:    s_and_b32 s0, s0, 0xffff0000
29; CIVI-NEXT:    s_or_b32 s0, s0, 0x3e7
30; CIVI-NEXT:    v_mov_b32_e32 v2, s0
31; CIVI-NEXT:    flat_store_dword v[0:1], v2
32; CIVI-NEXT:    s_endpgm
33  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
34  %vecins = insertelement <2 x i16> %vec, i16 999, i32 0
35  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
36  ret void
37}
38
39
40define amdgpu_kernel void @s_insertelement_v2i16_0_reg(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, [8 x i32], i16 %elt) #0 {
41; GFX9-LABEL: s_insertelement_v2i16_0_reg:
42; GFX9:       ; %bb.0:
43; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
44; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
45; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
46; GFX9-NEXT:    v_mov_b32_e32 v0, s0
47; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
48; GFX9-NEXT:    v_mov_b32_e32 v1, s1
49; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
50; GFX9-NEXT:    s_pack_lh_b32_b16 s0, s4, s0
51; GFX9-NEXT:    v_mov_b32_e32 v2, s0
52; GFX9-NEXT:    global_store_dword v[0:1], v2, off
53; GFX9-NEXT:    s_endpgm
54;
55; VI-LABEL: s_insertelement_v2i16_0_reg:
56; VI:       ; %bb.0:
57; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
58; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
59; VI-NEXT:    s_waitcnt lgkmcnt(0)
60; VI-NEXT:    v_mov_b32_e32 v0, s0
61; VI-NEXT:    s_load_dword s0, s[2:3], 0x0
62; VI-NEXT:    v_mov_b32_e32 v1, s1
63; VI-NEXT:    s_and_b32 s1, s4, 0xffff
64; VI-NEXT:    s_waitcnt lgkmcnt(0)
65; VI-NEXT:    s_and_b32 s0, s0, 0xffff0000
66; VI-NEXT:    s_or_b32 s0, s1, s0
67; VI-NEXT:    v_mov_b32_e32 v2, s0
68; VI-NEXT:    flat_store_dword v[0:1], v2
69; VI-NEXT:    s_endpgm
70;
71; CI-LABEL: s_insertelement_v2i16_0_reg:
72; CI:       ; %bb.0:
73; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
74; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
75; CI-NEXT:    s_waitcnt lgkmcnt(0)
76; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
77; CI-NEXT:    v_mov_b32_e32 v0, s0
78; CI-NEXT:    v_mov_b32_e32 v1, s1
79; CI-NEXT:    s_and_b32 s1, s4, 0xffff
80; CI-NEXT:    s_waitcnt lgkmcnt(0)
81; CI-NEXT:    s_and_b32 s0, s2, 0xffff0000
82; CI-NEXT:    s_or_b32 s0, s1, s0
83; CI-NEXT:    v_mov_b32_e32 v2, s0
84; CI-NEXT:    flat_store_dword v[0:1], v2
85; CI-NEXT:    s_endpgm
86  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
87  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
88  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
89  ret void
90}
91
92define amdgpu_kernel void @s_insertelement_v2i16_0_multi_use_hi_reg(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, [8 x i32], i16 %elt) #0 {
93; GFX9-LABEL: s_insertelement_v2i16_0_multi_use_hi_reg:
94; GFX9:       ; %bb.0:
95; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
96; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
97; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
98; GFX9-NEXT:    s_load_dword s2, s[2:3], 0x0
99; GFX9-NEXT:    v_mov_b32_e32 v0, s0
100; GFX9-NEXT:    v_mov_b32_e32 v1, s1
101; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
102; GFX9-NEXT:    s_lshr_b32 s0, s2, 16
103; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s4, s0
104; GFX9-NEXT:    v_mov_b32_e32 v2, s1
105; GFX9-NEXT:    global_store_dword v[0:1], v2, off
106; GFX9-NEXT:    ;;#ASMSTART
107; GFX9-NEXT:    ; use s0
108; GFX9-NEXT:    ;;#ASMEND
109; GFX9-NEXT:    s_endpgm
110;
111; VI-LABEL: s_insertelement_v2i16_0_multi_use_hi_reg:
112; VI:       ; %bb.0:
113; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
114; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
115; VI-NEXT:    s_waitcnt lgkmcnt(0)
116; VI-NEXT:    v_mov_b32_e32 v0, s0
117; VI-NEXT:    s_load_dword s0, s[2:3], 0x0
118; VI-NEXT:    v_mov_b32_e32 v1, s1
119; VI-NEXT:    s_and_b32 s1, s4, 0xffff
120; VI-NEXT:    s_waitcnt lgkmcnt(0)
121; VI-NEXT:    s_lshr_b32 s2, s0, 16
122; VI-NEXT:    s_and_b32 s0, s0, 0xffff0000
123; VI-NEXT:    s_or_b32 s0, s1, s0
124; VI-NEXT:    v_mov_b32_e32 v2, s0
125; VI-NEXT:    flat_store_dword v[0:1], v2
126; VI-NEXT:    ;;#ASMSTART
127; VI-NEXT:    ; use s2
128; VI-NEXT:    ;;#ASMEND
129; VI-NEXT:    s_endpgm
130;
131; CI-LABEL: s_insertelement_v2i16_0_multi_use_hi_reg:
132; CI:       ; %bb.0:
133; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
134; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
135; CI-NEXT:    s_waitcnt lgkmcnt(0)
136; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
137; CI-NEXT:    v_mov_b32_e32 v1, s1
138; CI-NEXT:    v_mov_b32_e32 v0, s0
139; CI-NEXT:    s_and_b32 s0, s4, 0xffff
140; CI-NEXT:    s_waitcnt lgkmcnt(0)
141; CI-NEXT:    s_lshr_b32 s1, s2, 16
142; CI-NEXT:    s_lshl_b32 s2, s1, 16
143; CI-NEXT:    s_or_b32 s0, s0, s2
144; CI-NEXT:    v_mov_b32_e32 v2, s0
145; CI-NEXT:    flat_store_dword v[0:1], v2
146; CI-NEXT:    ;;#ASMSTART
147; CI-NEXT:    ; use s1
148; CI-NEXT:    ;;#ASMEND
149; CI-NEXT:    s_endpgm
150  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
151  %elt1 = extractelement <2 x i16> %vec, i32 1
152  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
153  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
154  %use1 = zext i16 %elt1 to i32
155  call void asm sideeffect "; use $0", "s"(i32 %use1) #0
156  ret void
157}
158
159define amdgpu_kernel void @s_insertelement_v2i16_0_reghi(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, [8 x i32], i32 %elt.arg) #0 {
160; GFX9-LABEL: s_insertelement_v2i16_0_reghi:
161; GFX9:       ; %bb.0:
162; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
163; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
164; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
165; GFX9-NEXT:    v_mov_b32_e32 v0, s0
166; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
167; GFX9-NEXT:    v_mov_b32_e32 v1, s1
168; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
169; GFX9-NEXT:    s_pack_hh_b32_b16 s0, s4, s0
170; GFX9-NEXT:    v_mov_b32_e32 v2, s0
171; GFX9-NEXT:    global_store_dword v[0:1], v2, off
172; GFX9-NEXT:    s_endpgm
173;
174; VI-LABEL: s_insertelement_v2i16_0_reghi:
175; VI:       ; %bb.0:
176; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
177; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
178; VI-NEXT:    s_waitcnt lgkmcnt(0)
179; VI-NEXT:    v_mov_b32_e32 v0, s0
180; VI-NEXT:    s_load_dword s0, s[2:3], 0x0
181; VI-NEXT:    v_mov_b32_e32 v1, s1
182; VI-NEXT:    s_lshr_b32 s1, s4, 16
183; VI-NEXT:    s_waitcnt lgkmcnt(0)
184; VI-NEXT:    s_and_b32 s0, s0, 0xffff0000
185; VI-NEXT:    s_or_b32 s0, s1, s0
186; VI-NEXT:    v_mov_b32_e32 v2, s0
187; VI-NEXT:    flat_store_dword v[0:1], v2
188; VI-NEXT:    s_endpgm
189;
190; CI-LABEL: s_insertelement_v2i16_0_reghi:
191; CI:       ; %bb.0:
192; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
193; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
194; CI-NEXT:    s_waitcnt lgkmcnt(0)
195; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
196; CI-NEXT:    v_mov_b32_e32 v0, s0
197; CI-NEXT:    v_mov_b32_e32 v1, s1
198; CI-NEXT:    s_lshr_b32 s1, s4, 16
199; CI-NEXT:    s_waitcnt lgkmcnt(0)
200; CI-NEXT:    s_and_b32 s0, s2, 0xffff0000
201; CI-NEXT:    s_or_b32 s0, s1, s0
202; CI-NEXT:    v_mov_b32_e32 v2, s0
203; CI-NEXT:    flat_store_dword v[0:1], v2
204; CI-NEXT:    s_endpgm
205  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
206  %elt.hi = lshr i32 %elt.arg, 16
207  %elt = trunc i32 %elt.hi to i16
208  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
209  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
210  ret void
211}
212
213define amdgpu_kernel void @s_insertelement_v2i16_0_reghi_multi_use_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, i32 %elt.arg) #0 {
214; GFX9-LABEL: s_insertelement_v2i16_0_reghi_multi_use_1:
215; GFX9:       ; %bb.0:
216; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
217; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
218; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
219; GFX9-NEXT:    s_load_dword s2, s[2:3], 0x0
220; GFX9-NEXT:    v_mov_b32_e32 v0, s0
221; GFX9-NEXT:    s_lshr_b32 s0, s4, 16
222; GFX9-NEXT:    v_mov_b32_e32 v1, s1
223; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
224; GFX9-NEXT:    s_pack_lh_b32_b16 s1, s0, s2
225; GFX9-NEXT:    v_mov_b32_e32 v2, s1
226; GFX9-NEXT:    global_store_dword v[0:1], v2, off
227; GFX9-NEXT:    ;;#ASMSTART
228; GFX9-NEXT:    ; use s0
229; GFX9-NEXT:    ;;#ASMEND
230; GFX9-NEXT:    s_endpgm
231;
232; VI-LABEL: s_insertelement_v2i16_0_reghi_multi_use_1:
233; VI:       ; %bb.0:
234; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
235; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
236; VI-NEXT:    s_waitcnt lgkmcnt(0)
237; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
238; VI-NEXT:    v_mov_b32_e32 v0, s0
239; VI-NEXT:    v_mov_b32_e32 v1, s1
240; VI-NEXT:    s_lshr_b32 s0, s4, 16
241; VI-NEXT:    s_waitcnt lgkmcnt(0)
242; VI-NEXT:    s_and_b32 s1, s2, 0xffff0000
243; VI-NEXT:    s_or_b32 s1, s0, s1
244; VI-NEXT:    v_mov_b32_e32 v2, s1
245; VI-NEXT:    flat_store_dword v[0:1], v2
246; VI-NEXT:    ;;#ASMSTART
247; VI-NEXT:    ; use s0
248; VI-NEXT:    ;;#ASMEND
249; VI-NEXT:    s_endpgm
250;
251; CI-LABEL: s_insertelement_v2i16_0_reghi_multi_use_1:
252; CI:       ; %bb.0:
253; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
254; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
255; CI-NEXT:    s_waitcnt lgkmcnt(0)
256; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
257; CI-NEXT:    v_mov_b32_e32 v0, s0
258; CI-NEXT:    v_mov_b32_e32 v1, s1
259; CI-NEXT:    s_lshr_b32 s0, s4, 16
260; CI-NEXT:    s_waitcnt lgkmcnt(0)
261; CI-NEXT:    s_and_b32 s1, s2, 0xffff0000
262; CI-NEXT:    s_or_b32 s1, s0, s1
263; CI-NEXT:    v_mov_b32_e32 v2, s1
264; CI-NEXT:    flat_store_dword v[0:1], v2
265; CI-NEXT:    ;;#ASMSTART
266; CI-NEXT:    ; use s0
267; CI-NEXT:    ;;#ASMEND
268; CI-NEXT:    s_endpgm
269  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
270  %elt.hi = lshr i32 %elt.arg, 16
271  %elt = trunc i32 %elt.hi to i16
272  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
273  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
274  %use1 = zext i16 %elt to i32
275  call void asm sideeffect "; use $0", "s"(i32 %use1) #0
276  ret void
277}
278
279define amdgpu_kernel void @s_insertelement_v2i16_0_reghi_both_multi_use_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, i32 %elt.arg) #0 {
280; GFX9-LABEL: s_insertelement_v2i16_0_reghi_both_multi_use_1:
281; GFX9:       ; %bb.0:
282; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
283; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
284; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
285; GFX9-NEXT:    v_mov_b32_e32 v0, s0
286; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
287; GFX9-NEXT:    v_mov_b32_e32 v1, s1
288; GFX9-NEXT:    s_lshr_b32 s1, s4, 16
289; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
290; GFX9-NEXT:    s_lshr_b32 s0, s0, 16
291; GFX9-NEXT:    s_pack_ll_b32_b16 s2, s1, s0
292; GFX9-NEXT:    v_mov_b32_e32 v2, s2
293; GFX9-NEXT:    global_store_dword v[0:1], v2, off
294; GFX9-NEXT:    ;;#ASMSTART
295; GFX9-NEXT:    ; use s1
296; GFX9-NEXT:    ;;#ASMEND
297; GFX9-NEXT:    ;;#ASMSTART
298; GFX9-NEXT:    ; use s0
299; GFX9-NEXT:    ;;#ASMEND
300; GFX9-NEXT:    s_endpgm
301;
302; VI-LABEL: s_insertelement_v2i16_0_reghi_both_multi_use_1:
303; VI:       ; %bb.0:
304; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
305; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
306; VI-NEXT:    s_waitcnt lgkmcnt(0)
307; VI-NEXT:    v_mov_b32_e32 v0, s0
308; VI-NEXT:    s_load_dword s0, s[2:3], 0x0
309; VI-NEXT:    v_mov_b32_e32 v1, s1
310; VI-NEXT:    s_lshr_b32 s1, s4, 16
311; VI-NEXT:    s_waitcnt lgkmcnt(0)
312; VI-NEXT:    s_lshr_b32 s2, s0, 16
313; VI-NEXT:    s_and_b32 s0, s0, 0xffff0000
314; VI-NEXT:    s_or_b32 s0, s1, s0
315; VI-NEXT:    v_mov_b32_e32 v2, s0
316; VI-NEXT:    flat_store_dword v[0:1], v2
317; VI-NEXT:    ;;#ASMSTART
318; VI-NEXT:    ; use s1
319; VI-NEXT:    ;;#ASMEND
320; VI-NEXT:    ;;#ASMSTART
321; VI-NEXT:    ; use s2
322; VI-NEXT:    ;;#ASMEND
323; VI-NEXT:    s_endpgm
324;
325; CI-LABEL: s_insertelement_v2i16_0_reghi_both_multi_use_1:
326; CI:       ; %bb.0:
327; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
328; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
329; CI-NEXT:    s_waitcnt lgkmcnt(0)
330; CI-NEXT:    v_mov_b32_e32 v0, s0
331; CI-NEXT:    s_load_dword s0, s[2:3], 0x0
332; CI-NEXT:    v_mov_b32_e32 v2, s4
333; CI-NEXT:    v_mov_b32_e32 v1, s1
334; CI-NEXT:    s_lshr_b32 s1, s4, 16
335; CI-NEXT:    s_waitcnt lgkmcnt(0)
336; CI-NEXT:    s_lshr_b32 s0, s0, 16
337; CI-NEXT:    v_alignbit_b32 v2, s0, v2, 16
338; CI-NEXT:    flat_store_dword v[0:1], v2
339; CI-NEXT:    ;;#ASMSTART
340; CI-NEXT:    ; use s1
341; CI-NEXT:    ;;#ASMEND
342; CI-NEXT:    ;;#ASMSTART
343; CI-NEXT:    ; use s0
344; CI-NEXT:    ;;#ASMEND
345; CI-NEXT:    s_endpgm
346  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
347  %elt.hi = lshr i32 %elt.arg, 16
348  %elt = trunc i32 %elt.hi to i16
349  %vec.hi = extractelement <2 x i16> %vec, i32 1
350  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
351  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
352  %use1 = zext i16 %elt to i32
353  %vec.hi.use1 = zext i16 %vec.hi to i32
354
355  call void asm sideeffect "; use $0", "s"(i32 %use1) #0
356  call void asm sideeffect "; use $0", "s"(i32 %vec.hi.use1) #0
357  ret void
358}
359
360define amdgpu_kernel void @s_insertelement_v2i16_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr) #0 {
361; GFX9-LABEL: s_insertelement_v2i16_1:
362; GFX9:       ; %bb.0:
363; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
364; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
365; GFX9-NEXT:    v_mov_b32_e32 v0, s0
366; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
367; GFX9-NEXT:    v_mov_b32_e32 v1, s1
368; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
369; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, 0x3e7
370; GFX9-NEXT:    v_mov_b32_e32 v2, s0
371; GFX9-NEXT:    global_store_dword v[0:1], v2, off
372; GFX9-NEXT:    s_endpgm
373;
374; CIVI-LABEL: s_insertelement_v2i16_1:
375; CIVI:       ; %bb.0:
376; CIVI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
377; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
378; CIVI-NEXT:    v_mov_b32_e32 v0, s0
379; CIVI-NEXT:    s_load_dword s0, s[2:3], 0x0
380; CIVI-NEXT:    v_mov_b32_e32 v1, s1
381; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
382; CIVI-NEXT:    s_and_b32 s0, s0, 0xffff
383; CIVI-NEXT:    s_or_b32 s0, s0, 0x3e70000
384; CIVI-NEXT:    v_mov_b32_e32 v2, s0
385; CIVI-NEXT:    flat_store_dword v[0:1], v2
386; CIVI-NEXT:    s_endpgm
387  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
388  %vecins = insertelement <2 x i16> %vec, i16 999, i32 1
389  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
390  ret void
391}
392
393define amdgpu_kernel void @s_insertelement_v2i16_1_reg(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, [8 x i32], i16 %elt) #0 {
394; GFX9-LABEL: s_insertelement_v2i16_1_reg:
395; GFX9:       ; %bb.0:
396; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
397; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
398; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
399; GFX9-NEXT:    v_mov_b32_e32 v0, s0
400; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
401; GFX9-NEXT:    v_mov_b32_e32 v1, s1
402; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
403; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s4
404; GFX9-NEXT:    v_mov_b32_e32 v2, s0
405; GFX9-NEXT:    global_store_dword v[0:1], v2, off
406; GFX9-NEXT:    s_endpgm
407;
408; VI-LABEL: s_insertelement_v2i16_1_reg:
409; VI:       ; %bb.0:
410; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
411; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
412; VI-NEXT:    s_waitcnt lgkmcnt(0)
413; VI-NEXT:    v_mov_b32_e32 v0, s0
414; VI-NEXT:    s_load_dword s0, s[2:3], 0x0
415; VI-NEXT:    v_mov_b32_e32 v1, s1
416; VI-NEXT:    s_lshl_b32 s1, s4, 16
417; VI-NEXT:    s_waitcnt lgkmcnt(0)
418; VI-NEXT:    s_and_b32 s0, s0, 0xffff
419; VI-NEXT:    s_or_b32 s0, s0, s1
420; VI-NEXT:    v_mov_b32_e32 v2, s0
421; VI-NEXT:    flat_store_dword v[0:1], v2
422; VI-NEXT:    s_endpgm
423;
424; CI-LABEL: s_insertelement_v2i16_1_reg:
425; CI:       ; %bb.0:
426; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
427; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
428; CI-NEXT:    s_waitcnt lgkmcnt(0)
429; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
430; CI-NEXT:    v_mov_b32_e32 v0, s0
431; CI-NEXT:    v_mov_b32_e32 v1, s1
432; CI-NEXT:    s_lshl_b32 s1, s4, 16
433; CI-NEXT:    s_waitcnt lgkmcnt(0)
434; CI-NEXT:    s_and_b32 s0, s2, 0xffff
435; CI-NEXT:    s_or_b32 s0, s0, s1
436; CI-NEXT:    v_mov_b32_e32 v2, s0
437; CI-NEXT:    flat_store_dword v[0:1], v2
438; CI-NEXT:    s_endpgm
439  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
440  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 1
441  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
442  ret void
443}
444
445define amdgpu_kernel void @s_insertelement_v2f16_0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(4)* %vec.ptr) #0 {
446; GFX9-LABEL: s_insertelement_v2f16_0:
447; GFX9:       ; %bb.0:
448; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
449; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
450; GFX9-NEXT:    v_mov_b32_e32 v0, s0
451; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
452; GFX9-NEXT:    v_mov_b32_e32 v1, s1
453; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
454; GFX9-NEXT:    s_lshr_b32 s0, s0, 16
455; GFX9-NEXT:    s_pack_ll_b32_b16 s0, 0x4500, s0
456; GFX9-NEXT:    v_mov_b32_e32 v2, s0
457; GFX9-NEXT:    global_store_dword v[0:1], v2, off
458; GFX9-NEXT:    s_endpgm
459;
460; CIVI-LABEL: s_insertelement_v2f16_0:
461; CIVI:       ; %bb.0:
462; CIVI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
463; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
464; CIVI-NEXT:    v_mov_b32_e32 v0, s0
465; CIVI-NEXT:    s_load_dword s0, s[2:3], 0x0
466; CIVI-NEXT:    v_mov_b32_e32 v1, s1
467; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
468; CIVI-NEXT:    s_and_b32 s0, s0, 0xffff0000
469; CIVI-NEXT:    s_or_b32 s0, s0, 0x4500
470; CIVI-NEXT:    v_mov_b32_e32 v2, s0
471; CIVI-NEXT:    flat_store_dword v[0:1], v2
472; CIVI-NEXT:    s_endpgm
473  %vec = load <2 x half>, <2 x half> addrspace(4)* %vec.ptr
474  %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 0
475  store <2 x half> %vecins, <2 x half> addrspace(1)* %out
476  ret void
477}
478
479define amdgpu_kernel void @s_insertelement_v2f16_1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(4)* %vec.ptr) #0 {
480; GFX9-LABEL: s_insertelement_v2f16_1:
481; GFX9:       ; %bb.0:
482; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
483; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
484; GFX9-NEXT:    v_mov_b32_e32 v0, s0
485; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
486; GFX9-NEXT:    v_mov_b32_e32 v1, s1
487; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
488; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, 0x4500
489; GFX9-NEXT:    v_mov_b32_e32 v2, s0
490; GFX9-NEXT:    global_store_dword v[0:1], v2, off
491; GFX9-NEXT:    s_endpgm
492;
493; CIVI-LABEL: s_insertelement_v2f16_1:
494; CIVI:       ; %bb.0:
495; CIVI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
496; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
497; CIVI-NEXT:    v_mov_b32_e32 v0, s0
498; CIVI-NEXT:    s_load_dword s0, s[2:3], 0x0
499; CIVI-NEXT:    v_mov_b32_e32 v1, s1
500; CIVI-NEXT:    s_waitcnt lgkmcnt(0)
501; CIVI-NEXT:    s_and_b32 s0, s0, 0xffff
502; CIVI-NEXT:    s_or_b32 s0, s0, 0x45000000
503; CIVI-NEXT:    v_mov_b32_e32 v2, s0
504; CIVI-NEXT:    flat_store_dword v[0:1], v2
505; CIVI-NEXT:    s_endpgm
506  %vec = load <2 x half>, <2 x half> addrspace(4)* %vec.ptr
507  %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 1
508  store <2 x half> %vecins, <2 x half> addrspace(1)* %out
509  ret void
510}
511
512define amdgpu_kernel void @v_insertelement_v2i16_0(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
513; GFX9-LABEL: v_insertelement_v2i16_0:
514; GFX9:       ; %bb.0:
515; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
516; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
517; GFX9-NEXT:    v_mov_b32_e32 v2, 0xffff
518; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
519; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
520; GFX9-NEXT:    s_movk_i32 s2, 0x3e7
521; GFX9-NEXT:    s_waitcnt vmcnt(0)
522; GFX9-NEXT:    v_bfi_b32 v1, v2, s2, v1
523; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
524; GFX9-NEXT:    s_endpgm
525;
526; VI-LABEL: v_insertelement_v2i16_0:
527; VI:       ; %bb.0:
528; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
529; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
530; VI-NEXT:    s_waitcnt lgkmcnt(0)
531; VI-NEXT:    v_mov_b32_e32 v1, s3
532; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
533; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
534; VI-NEXT:    flat_load_dword v0, v[0:1]
535; VI-NEXT:    v_mov_b32_e32 v3, s1
536; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
537; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
538; VI-NEXT:    s_waitcnt vmcnt(0)
539; VI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
540; VI-NEXT:    v_or_b32_e32 v0, 0x3e7, v0
541; VI-NEXT:    flat_store_dword v[2:3], v0
542; VI-NEXT:    s_endpgm
543;
544; CI-LABEL: v_insertelement_v2i16_0:
545; CI:       ; %bb.0:
546; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
547; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
548; CI-NEXT:    s_waitcnt lgkmcnt(0)
549; CI-NEXT:    v_mov_b32_e32 v1, s3
550; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
551; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
552; CI-NEXT:    flat_load_dword v0, v[0:1]
553; CI-NEXT:    v_mov_b32_e32 v3, s1
554; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
555; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
556; CI-NEXT:    s_waitcnt vmcnt(0)
557; CI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
558; CI-NEXT:    v_or_b32_e32 v0, 0x3e7, v0
559; CI-NEXT:    flat_store_dword v[2:3], v0
560; CI-NEXT:    s_endpgm
561  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
562  %tid.ext = sext i32 %tid to i64
563  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
564  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
565  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
566  %vecins = insertelement <2 x i16> %vec, i16 999, i32 0
567  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
568  ret void
569}
570
571define amdgpu_kernel void @v_insertelement_v2i16_0_reghi(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in, i32 %elt.arg) #0 {
572; GFX9-LABEL: v_insertelement_v2i16_0_reghi:
573; GFX9:       ; %bb.0:
574; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
575; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
576; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
577; GFX9-NEXT:    v_mov_b32_e32 v3, 0xffff0000
578; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
579; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
580; GFX9-NEXT:    v_lshrrev_b32_e64 v2, 16, s4
581; GFX9-NEXT:    s_waitcnt vmcnt(0)
582; GFX9-NEXT:    v_and_or_b32 v1, v1, v3, v2
583; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
584; GFX9-NEXT:    s_endpgm
585;
586; VI-LABEL: v_insertelement_v2i16_0_reghi:
587; VI:       ; %bb.0:
588; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
589; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
590; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
591; VI-NEXT:    s_waitcnt lgkmcnt(0)
592; VI-NEXT:    v_mov_b32_e32 v1, s3
593; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
594; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
595; VI-NEXT:    flat_load_dword v0, v[0:1]
596; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
597; VI-NEXT:    v_mov_b32_e32 v3, s1
598; VI-NEXT:    s_lshr_b32 s0, s4, 16
599; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
600; VI-NEXT:    s_waitcnt vmcnt(0)
601; VI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
602; VI-NEXT:    v_or_b32_e32 v0, s0, v0
603; VI-NEXT:    flat_store_dword v[2:3], v0
604; VI-NEXT:    s_endpgm
605;
606; CI-LABEL: v_insertelement_v2i16_0_reghi:
607; CI:       ; %bb.0:
608; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
609; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
610; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
611; CI-NEXT:    s_waitcnt lgkmcnt(0)
612; CI-NEXT:    v_mov_b32_e32 v1, s3
613; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
614; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
615; CI-NEXT:    flat_load_dword v3, v[0:1]
616; CI-NEXT:    v_add_i32_e32 v0, vcc, s0, v2
617; CI-NEXT:    v_mov_b32_e32 v1, s1
618; CI-NEXT:    s_lshr_b32 s0, s4, 16
619; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
620; CI-NEXT:    s_waitcnt vmcnt(0)
621; CI-NEXT:    v_and_b32_e32 v2, 0xffff0000, v3
622; CI-NEXT:    v_or_b32_e32 v2, s0, v2
623; CI-NEXT:    flat_store_dword v[0:1], v2
624; CI-NEXT:    s_endpgm
625  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
626  %tid.ext = sext i32 %tid to i64
627  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
628  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
629  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
630  %elt.hi = lshr i32 %elt.arg, 16
631  %elt = trunc i32 %elt.hi to i16
632  %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
633  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
634  ret void
635}
636
637define amdgpu_kernel void @v_insertelement_v2i16_0_inlineimm(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
638; GFX9-LABEL: v_insertelement_v2i16_0_inlineimm:
639; GFX9:       ; %bb.0:
640; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
641; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
642; GFX9-NEXT:    v_mov_b32_e32 v2, 0xffff
643; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
644; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
645; GFX9-NEXT:    s_waitcnt vmcnt(0)
646; GFX9-NEXT:    v_bfi_b32 v1, v2, 53, v1
647; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
648; GFX9-NEXT:    s_endpgm
649;
650; VI-LABEL: v_insertelement_v2i16_0_inlineimm:
651; VI:       ; %bb.0:
652; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
653; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
654; VI-NEXT:    s_waitcnt lgkmcnt(0)
655; VI-NEXT:    v_mov_b32_e32 v1, s3
656; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
657; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
658; VI-NEXT:    flat_load_dword v0, v[0:1]
659; VI-NEXT:    v_mov_b32_e32 v3, s1
660; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
661; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
662; VI-NEXT:    s_waitcnt vmcnt(0)
663; VI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
664; VI-NEXT:    v_or_b32_e32 v0, 53, v0
665; VI-NEXT:    flat_store_dword v[2:3], v0
666; VI-NEXT:    s_endpgm
667;
668; CI-LABEL: v_insertelement_v2i16_0_inlineimm:
669; CI:       ; %bb.0:
670; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
671; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
672; CI-NEXT:    s_waitcnt lgkmcnt(0)
673; CI-NEXT:    v_mov_b32_e32 v1, s3
674; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
675; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
676; CI-NEXT:    flat_load_dword v0, v[0:1]
677; CI-NEXT:    v_mov_b32_e32 v3, s1
678; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
679; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
680; CI-NEXT:    s_waitcnt vmcnt(0)
681; CI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
682; CI-NEXT:    v_or_b32_e32 v0, 53, v0
683; CI-NEXT:    flat_store_dword v[2:3], v0
684; CI-NEXT:    s_endpgm
685  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
686  %tid.ext = sext i32 %tid to i64
687  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
688  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
689  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
690  %vecins = insertelement <2 x i16> %vec, i16 53, i32 0
691  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
692  ret void
693}
694
695; FIXME: fold lshl_or c0, c1, v0 -> or (c0 << c1), v0
696define amdgpu_kernel void @v_insertelement_v2i16_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
697; GFX9-LABEL: v_insertelement_v2i16_1:
698; GFX9:       ; %bb.0:
699; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
700; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
701; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
702; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
703; GFX9-NEXT:    s_movk_i32 s2, 0x3e7
704; GFX9-NEXT:    s_waitcnt vmcnt(0)
705; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
706; GFX9-NEXT:    v_lshl_or_b32 v1, s2, 16, v1
707; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
708; GFX9-NEXT:    s_endpgm
709;
710; VI-LABEL: v_insertelement_v2i16_1:
711; VI:       ; %bb.0:
712; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
713; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
714; VI-NEXT:    s_waitcnt lgkmcnt(0)
715; VI-NEXT:    v_mov_b32_e32 v1, s3
716; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
717; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
718; VI-NEXT:    flat_load_dword v0, v[0:1]
719; VI-NEXT:    v_mov_b32_e32 v1, 0x3e70000
720; VI-NEXT:    v_mov_b32_e32 v3, s1
721; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
722; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
723; VI-NEXT:    s_waitcnt vmcnt(0)
724; VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
725; VI-NEXT:    flat_store_dword v[2:3], v0
726; VI-NEXT:    s_endpgm
727;
728; CI-LABEL: v_insertelement_v2i16_1:
729; CI:       ; %bb.0:
730; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
731; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
732; CI-NEXT:    s_waitcnt lgkmcnt(0)
733; CI-NEXT:    v_mov_b32_e32 v1, s3
734; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
735; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
736; CI-NEXT:    flat_load_dword v0, v[0:1]
737; CI-NEXT:    v_mov_b32_e32 v3, s1
738; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
739; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
740; CI-NEXT:    s_waitcnt vmcnt(0)
741; CI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
742; CI-NEXT:    v_or_b32_e32 v0, 0x3e70000, v0
743; CI-NEXT:    flat_store_dword v[2:3], v0
744; CI-NEXT:    s_endpgm
745  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
746  %tid.ext = sext i32 %tid to i64
747  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
748  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
749  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
750  %vecins = insertelement <2 x i16> %vec, i16 999, i32 1
751  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
752  ret void
753}
754
755define amdgpu_kernel void @v_insertelement_v2i16_1_inlineimm(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
756; GFX9-LABEL: v_insertelement_v2i16_1_inlineimm:
757; GFX9:       ; %bb.0:
758; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
759; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
760; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
761; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
762; GFX9-NEXT:    s_waitcnt vmcnt(0)
763; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
764; GFX9-NEXT:    v_lshl_or_b32 v1, -15, 16, v1
765; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
766; GFX9-NEXT:    s_endpgm
767;
768; VI-LABEL: v_insertelement_v2i16_1_inlineimm:
769; VI:       ; %bb.0:
770; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
771; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
772; VI-NEXT:    s_waitcnt lgkmcnt(0)
773; VI-NEXT:    v_mov_b32_e32 v1, s3
774; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
775; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
776; VI-NEXT:    flat_load_dword v0, v[0:1]
777; VI-NEXT:    v_mov_b32_e32 v1, 0xfff10000
778; VI-NEXT:    v_mov_b32_e32 v3, s1
779; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
780; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
781; VI-NEXT:    s_waitcnt vmcnt(0)
782; VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
783; VI-NEXT:    flat_store_dword v[2:3], v0
784; VI-NEXT:    s_endpgm
785;
786; CI-LABEL: v_insertelement_v2i16_1_inlineimm:
787; CI:       ; %bb.0:
788; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
789; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
790; CI-NEXT:    s_waitcnt lgkmcnt(0)
791; CI-NEXT:    v_mov_b32_e32 v1, s3
792; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
793; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
794; CI-NEXT:    flat_load_dword v0, v[0:1]
795; CI-NEXT:    v_mov_b32_e32 v3, s1
796; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
797; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
798; CI-NEXT:    s_waitcnt vmcnt(0)
799; CI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
800; CI-NEXT:    v_or_b32_e32 v0, 0xfff10000, v0
801; CI-NEXT:    flat_store_dword v[2:3], v0
802; CI-NEXT:    s_endpgm
803  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
804  %tid.ext = sext i32 %tid to i64
805  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
806  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
807  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
808  %vecins = insertelement <2 x i16> %vec, i16 -15, i32 1
809  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
810  ret void
811}
812
813define amdgpu_kernel void @v_insertelement_v2f16_0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
814; GFX9-LABEL: v_insertelement_v2f16_0:
815; GFX9:       ; %bb.0:
816; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
817; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
818; GFX9-NEXT:    v_mov_b32_e32 v2, 0x4500
819; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
820; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
821; GFX9-NEXT:    s_waitcnt vmcnt(0)
822; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
823; GFX9-NEXT:    v_lshl_or_b32 v1, v1, 16, v2
824; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
825; GFX9-NEXT:    s_endpgm
826;
827; VI-LABEL: v_insertelement_v2f16_0:
828; VI:       ; %bb.0:
829; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
830; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
831; VI-NEXT:    s_waitcnt lgkmcnt(0)
832; VI-NEXT:    v_mov_b32_e32 v1, s3
833; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
834; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
835; VI-NEXT:    flat_load_dword v0, v[0:1]
836; VI-NEXT:    v_mov_b32_e32 v3, s1
837; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
838; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
839; VI-NEXT:    s_waitcnt vmcnt(0)
840; VI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
841; VI-NEXT:    v_or_b32_e32 v0, 0x4500, v0
842; VI-NEXT:    flat_store_dword v[2:3], v0
843; VI-NEXT:    s_endpgm
844;
845; CI-LABEL: v_insertelement_v2f16_0:
846; CI:       ; %bb.0:
847; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
848; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
849; CI-NEXT:    s_waitcnt lgkmcnt(0)
850; CI-NEXT:    v_mov_b32_e32 v1, s3
851; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
852; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
853; CI-NEXT:    flat_load_dword v0, v[0:1]
854; CI-NEXT:    v_mov_b32_e32 v3, s1
855; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
856; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
857; CI-NEXT:    s_waitcnt vmcnt(0)
858; CI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
859; CI-NEXT:    v_or_b32_e32 v0, 0x4500, v0
860; CI-NEXT:    flat_store_dword v[2:3], v0
861; CI-NEXT:    s_endpgm
862  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
863  %tid.ext = sext i32 %tid to i64
864  %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
865  %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
866  %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
867  %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 0
868  store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
869  ret void
870}
871
872define amdgpu_kernel void @v_insertelement_v2f16_0_inlineimm(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
873; GFX9-LABEL: v_insertelement_v2f16_0_inlineimm:
874; GFX9:       ; %bb.0:
875; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
876; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
877; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
878; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
879; GFX9-NEXT:    s_waitcnt vmcnt(0)
880; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
881; GFX9-NEXT:    v_lshl_or_b32 v1, v1, 16, 53
882; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
883; GFX9-NEXT:    s_endpgm
884;
885; VI-LABEL: v_insertelement_v2f16_0_inlineimm:
886; VI:       ; %bb.0:
887; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
888; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
889; VI-NEXT:    s_waitcnt lgkmcnt(0)
890; VI-NEXT:    v_mov_b32_e32 v1, s3
891; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
892; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
893; VI-NEXT:    flat_load_dword v0, v[0:1]
894; VI-NEXT:    v_mov_b32_e32 v3, s1
895; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
896; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
897; VI-NEXT:    s_waitcnt vmcnt(0)
898; VI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
899; VI-NEXT:    v_or_b32_e32 v0, 53, v0
900; VI-NEXT:    flat_store_dword v[2:3], v0
901; VI-NEXT:    s_endpgm
902;
903; CI-LABEL: v_insertelement_v2f16_0_inlineimm:
904; CI:       ; %bb.0:
905; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
906; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
907; CI-NEXT:    s_waitcnt lgkmcnt(0)
908; CI-NEXT:    v_mov_b32_e32 v1, s3
909; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
910; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
911; CI-NEXT:    flat_load_dword v0, v[0:1]
912; CI-NEXT:    v_mov_b32_e32 v3, s1
913; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
914; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
915; CI-NEXT:    s_waitcnt vmcnt(0)
916; CI-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
917; CI-NEXT:    v_or_b32_e32 v0, 53, v0
918; CI-NEXT:    flat_store_dword v[2:3], v0
919; CI-NEXT:    s_endpgm
920  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
921  %tid.ext = sext i32 %tid to i64
922  %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
923  %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
924  %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
925  %vecins = insertelement <2 x half> %vec, half 0xH0035, i32 0
926  store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
927  ret void
928}
929
930define amdgpu_kernel void @v_insertelement_v2f16_1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
931; GFX9-LABEL: v_insertelement_v2f16_1:
932; GFX9:       ; %bb.0:
933; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
934; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
935; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
936; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
937; GFX9-NEXT:    s_movk_i32 s2, 0x4500
938; GFX9-NEXT:    s_waitcnt vmcnt(0)
939; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
940; GFX9-NEXT:    v_lshl_or_b32 v1, s2, 16, v1
941; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
942; GFX9-NEXT:    s_endpgm
943;
944; VI-LABEL: v_insertelement_v2f16_1:
945; VI:       ; %bb.0:
946; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
947; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
948; VI-NEXT:    s_waitcnt lgkmcnt(0)
949; VI-NEXT:    v_mov_b32_e32 v1, s3
950; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
951; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
952; VI-NEXT:    flat_load_dword v0, v[0:1]
953; VI-NEXT:    v_mov_b32_e32 v1, 0x45000000
954; VI-NEXT:    v_mov_b32_e32 v3, s1
955; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
956; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
957; VI-NEXT:    s_waitcnt vmcnt(0)
958; VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
959; VI-NEXT:    flat_store_dword v[2:3], v0
960; VI-NEXT:    s_endpgm
961;
962; CI-LABEL: v_insertelement_v2f16_1:
963; CI:       ; %bb.0:
964; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
965; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
966; CI-NEXT:    s_waitcnt lgkmcnt(0)
967; CI-NEXT:    v_mov_b32_e32 v1, s3
968; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
969; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
970; CI-NEXT:    flat_load_dword v0, v[0:1]
971; CI-NEXT:    v_mov_b32_e32 v3, s1
972; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
973; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
974; CI-NEXT:    s_waitcnt vmcnt(0)
975; CI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
976; CI-NEXT:    v_or_b32_e32 v0, 0x45000000, v0
977; CI-NEXT:    flat_store_dword v[2:3], v0
978; CI-NEXT:    s_endpgm
979  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
980  %tid.ext = sext i32 %tid to i64
981  %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
982  %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
983  %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
984  %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 1
985  store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
986  ret void
987}
988
989define amdgpu_kernel void @v_insertelement_v2f16_1_inlineimm(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
990; GFX9-LABEL: v_insertelement_v2f16_1_inlineimm:
991; GFX9:       ; %bb.0:
992; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
993; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
994; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
995; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
996; GFX9-NEXT:    s_waitcnt vmcnt(0)
997; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
998; GFX9-NEXT:    v_lshl_or_b32 v1, 35, 16, v1
999; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1000; GFX9-NEXT:    s_endpgm
1001;
1002; VI-LABEL: v_insertelement_v2f16_1_inlineimm:
1003; VI:       ; %bb.0:
1004; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1005; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1006; VI-NEXT:    s_waitcnt lgkmcnt(0)
1007; VI-NEXT:    v_mov_b32_e32 v1, s3
1008; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1009; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1010; VI-NEXT:    flat_load_dword v0, v[0:1]
1011; VI-NEXT:    v_mov_b32_e32 v1, 0x230000
1012; VI-NEXT:    v_mov_b32_e32 v3, s1
1013; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1014; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1015; VI-NEXT:    s_waitcnt vmcnt(0)
1016; VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1017; VI-NEXT:    flat_store_dword v[2:3], v0
1018; VI-NEXT:    s_endpgm
1019;
1020; CI-LABEL: v_insertelement_v2f16_1_inlineimm:
1021; CI:       ; %bb.0:
1022; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1023; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1024; CI-NEXT:    s_waitcnt lgkmcnt(0)
1025; CI-NEXT:    v_mov_b32_e32 v1, s3
1026; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1027; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1028; CI-NEXT:    flat_load_dword v0, v[0:1]
1029; CI-NEXT:    v_mov_b32_e32 v3, s1
1030; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1031; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1032; CI-NEXT:    s_waitcnt vmcnt(0)
1033; CI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1034; CI-NEXT:    v_or_b32_e32 v0, 0x230000, v0
1035; CI-NEXT:    flat_store_dword v[2:3], v0
1036; CI-NEXT:    s_endpgm
1037  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1038  %tid.ext = sext i32 %tid to i64
1039  %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
1040  %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
1041  %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
1042  %vecins = insertelement <2 x half> %vec, half 0xH0023, i32 1
1043  store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
1044  ret void
1045}
1046
1047; FIXME: Enable for others when argument load not split
1048define amdgpu_kernel void @s_insertelement_v2i16_dynamic(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr, i32 addrspace(4)* %idx.ptr) #0 {
1049; GFX9-LABEL: s_insertelement_v2i16_dynamic:
1050; GFX9:       ; %bb.0:
1051; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1052; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x10
1053; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1054; GFX9-NEXT:    v_mov_b32_e32 v0, s0
1055; GFX9-NEXT:    s_load_dword s0, s[4:5], 0x0
1056; GFX9-NEXT:    s_load_dword s2, s[2:3], 0x0
1057; GFX9-NEXT:    v_mov_b32_e32 v1, s1
1058; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1059; GFX9-NEXT:    s_lshl_b32 s0, s0, 4
1060; GFX9-NEXT:    s_lshl_b32 s0, 0xffff, s0
1061; GFX9-NEXT:    s_andn2_b32 s1, s2, s0
1062; GFX9-NEXT:    s_and_b32 s0, s0, 0x3e703e7
1063; GFX9-NEXT:    s_or_b32 s0, s0, s1
1064; GFX9-NEXT:    v_mov_b32_e32 v2, s0
1065; GFX9-NEXT:    global_store_dword v[0:1], v2, off
1066; GFX9-NEXT:    s_endpgm
1067;
1068; VI-LABEL: s_insertelement_v2i16_dynamic:
1069; VI:       ; %bb.0:
1070; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1071; VI-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x10
1072; VI-NEXT:    s_waitcnt lgkmcnt(0)
1073; VI-NEXT:    v_mov_b32_e32 v0, s0
1074; VI-NEXT:    s_load_dword s0, s[4:5], 0x0
1075; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
1076; VI-NEXT:    v_mov_b32_e32 v1, s1
1077; VI-NEXT:    s_waitcnt lgkmcnt(0)
1078; VI-NEXT:    s_lshl_b32 s0, s0, 4
1079; VI-NEXT:    s_lshl_b32 s0, 0xffff, s0
1080; VI-NEXT:    s_andn2_b32 s1, s2, s0
1081; VI-NEXT:    s_and_b32 s0, s0, 0x3e703e7
1082; VI-NEXT:    s_or_b32 s0, s0, s1
1083; VI-NEXT:    v_mov_b32_e32 v2, s0
1084; VI-NEXT:    flat_store_dword v[0:1], v2
1085; VI-NEXT:    s_endpgm
1086;
1087; CI-LABEL: s_insertelement_v2i16_dynamic:
1088; CI:       ; %bb.0:
1089; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1090; CI-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x4
1091; CI-NEXT:    s_waitcnt lgkmcnt(0)
1092; CI-NEXT:    v_mov_b32_e32 v0, s0
1093; CI-NEXT:    s_load_dword s0, s[4:5], 0x0
1094; CI-NEXT:    s_load_dword s2, s[2:3], 0x0
1095; CI-NEXT:    v_mov_b32_e32 v1, s1
1096; CI-NEXT:    s_waitcnt lgkmcnt(0)
1097; CI-NEXT:    s_lshl_b32 s0, s0, 4
1098; CI-NEXT:    s_lshl_b32 s0, 0xffff, s0
1099; CI-NEXT:    s_andn2_b32 s1, s2, s0
1100; CI-NEXT:    s_and_b32 s0, s0, 0x3e703e7
1101; CI-NEXT:    s_or_b32 s0, s0, s1
1102; CI-NEXT:    v_mov_b32_e32 v2, s0
1103; CI-NEXT:    flat_store_dword v[0:1], v2
1104; CI-NEXT:    s_endpgm
1105  %idx = load volatile i32, i32 addrspace(4)* %idx.ptr
1106  %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
1107  %vecins = insertelement <2 x i16> %vec, i16 999, i32 %idx
1108  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
1109  ret void
1110}
1111
1112define amdgpu_kernel void @v_insertelement_v2i16_dynamic_sgpr(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in, i32 %idx) #0 {
1113; GFX9-LABEL: v_insertelement_v2i16_dynamic_sgpr:
1114; GFX9:       ; %bb.0:
1115; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1116; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
1117; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1118; GFX9-NEXT:    v_mov_b32_e32 v2, 0x3e703e7
1119; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1120; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1121; GFX9-NEXT:    s_lshl_b32 s2, s4, 4
1122; GFX9-NEXT:    s_lshl_b32 s2, 0xffff, s2
1123; GFX9-NEXT:    s_waitcnt vmcnt(0)
1124; GFX9-NEXT:    v_bfi_b32 v1, s2, v2, v1
1125; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1126; GFX9-NEXT:    s_endpgm
1127;
1128; VI-LABEL: v_insertelement_v2i16_dynamic_sgpr:
1129; VI:       ; %bb.0:
1130; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1131; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
1132; VI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1133; VI-NEXT:    s_waitcnt lgkmcnt(0)
1134; VI-NEXT:    v_mov_b32_e32 v1, s3
1135; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1136; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1137; VI-NEXT:    flat_load_dword v0, v[0:1]
1138; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1139; VI-NEXT:    s_lshl_b32 s0, s4, 4
1140; VI-NEXT:    v_mov_b32_e32 v3, s1
1141; VI-NEXT:    s_lshl_b32 s0, 0xffff, s0
1142; VI-NEXT:    v_mov_b32_e32 v1, 0x3e703e7
1143; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1144; VI-NEXT:    s_waitcnt vmcnt(0)
1145; VI-NEXT:    v_bfi_b32 v0, s0, v1, v0
1146; VI-NEXT:    flat_store_dword v[2:3], v0
1147; VI-NEXT:    s_endpgm
1148;
1149; CI-LABEL: v_insertelement_v2i16_dynamic_sgpr:
1150; CI:       ; %bb.0:
1151; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1152; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
1153; CI-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1154; CI-NEXT:    s_waitcnt lgkmcnt(0)
1155; CI-NEXT:    v_mov_b32_e32 v1, s3
1156; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1157; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1158; CI-NEXT:    flat_load_dword v0, v[0:1]
1159; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1160; CI-NEXT:    s_lshl_b32 s0, s4, 4
1161; CI-NEXT:    v_mov_b32_e32 v3, s1
1162; CI-NEXT:    s_lshl_b32 s0, 0xffff, s0
1163; CI-NEXT:    v_mov_b32_e32 v1, 0x3e703e7
1164; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1165; CI-NEXT:    s_waitcnt vmcnt(0)
1166; CI-NEXT:    v_bfi_b32 v0, s0, v1, v0
1167; CI-NEXT:    flat_store_dword v[2:3], v0
1168; CI-NEXT:    s_endpgm
1169  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1170  %tid.ext = sext i32 %tid to i64
1171  %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
1172  %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
1173  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
1174  %vecins = insertelement <2 x i16> %vec, i16 999, i32 %idx
1175  store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
1176  ret void
1177}
1178
1179define amdgpu_kernel void @v_insertelement_v2f16_dynamic_vgpr(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in, i32 addrspace(1)* %idx.ptr) #0 {
1180; GFX9-LABEL: v_insertelement_v2f16_dynamic_vgpr:
1181; GFX9:       ; %bb.0:
1182; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1183; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x10
1184; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1185; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1186; GFX9-NEXT:    global_load_dword v1, v0, s[4:5]
1187; GFX9-NEXT:    global_load_dword v2, v0, s[2:3]
1188; GFX9-NEXT:    s_mov_b32 s2, 0xffff
1189; GFX9-NEXT:    s_waitcnt vmcnt(1)
1190; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
1191; GFX9-NEXT:    v_lshlrev_b32_e64 v1, v1, s2
1192; GFX9-NEXT:    s_mov_b32 s2, 0x12341234
1193; GFX9-NEXT:    s_waitcnt vmcnt(0)
1194; GFX9-NEXT:    v_bfi_b32 v1, v1, s2, v2
1195; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1196; GFX9-NEXT:    s_endpgm
1197;
1198; VI-LABEL: v_insertelement_v2f16_dynamic_vgpr:
1199; VI:       ; %bb.0:
1200; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1201; VI-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x10
1202; VI-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
1203; VI-NEXT:    s_waitcnt lgkmcnt(0)
1204; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v4
1205; VI-NEXT:    v_mov_b32_e32 v1, s3
1206; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1207; VI-NEXT:    v_mov_b32_e32 v3, s5
1208; VI-NEXT:    v_add_u32_e32 v2, vcc, s4, v4
1209; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1210; VI-NEXT:    flat_load_dword v2, v[2:3]
1211; VI-NEXT:    flat_load_dword v3, v[0:1]
1212; VI-NEXT:    s_mov_b32 s2, 0xffff
1213; VI-NEXT:    v_add_u32_e32 v0, vcc, s0, v4
1214; VI-NEXT:    v_mov_b32_e32 v1, s1
1215; VI-NEXT:    s_mov_b32 s0, 0x12341234
1216; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1217; VI-NEXT:    s_waitcnt vmcnt(1)
1218; VI-NEXT:    v_lshlrev_b32_e32 v2, 4, v2
1219; VI-NEXT:    v_lshlrev_b32_e64 v2, v2, s2
1220; VI-NEXT:    s_waitcnt vmcnt(0)
1221; VI-NEXT:    v_bfi_b32 v2, v2, s0, v3
1222; VI-NEXT:    flat_store_dword v[0:1], v2
1223; VI-NEXT:    s_endpgm
1224;
1225; CI-LABEL: v_insertelement_v2f16_dynamic_vgpr:
1226; CI:       ; %bb.0:
1227; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1228; CI-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x4
1229; CI-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
1230; CI-NEXT:    s_waitcnt lgkmcnt(0)
1231; CI-NEXT:    v_mov_b32_e32 v1, s3
1232; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v4
1233; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1234; CI-NEXT:    v_mov_b32_e32 v3, s5
1235; CI-NEXT:    v_add_i32_e32 v2, vcc, s4, v4
1236; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1237; CI-NEXT:    flat_load_dword v2, v[2:3]
1238; CI-NEXT:    flat_load_dword v3, v[0:1]
1239; CI-NEXT:    v_add_i32_e32 v0, vcc, s0, v4
1240; CI-NEXT:    v_mov_b32_e32 v1, s1
1241; CI-NEXT:    s_mov_b32 s0, 0x12341234
1242; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1243; CI-NEXT:    s_waitcnt vmcnt(1)
1244; CI-NEXT:    v_lshlrev_b32_e32 v2, 4, v2
1245; CI-NEXT:    v_lshl_b32_e32 v2, 0xffff, v2
1246; CI-NEXT:    s_waitcnt vmcnt(0)
1247; CI-NEXT:    v_bfi_b32 v2, v2, s0, v3
1248; CI-NEXT:    flat_store_dword v[0:1], v2
1249; CI-NEXT:    s_endpgm
1250  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1251  %tid.ext = sext i32 %tid to i64
1252  %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
1253  %idx.gep = getelementptr inbounds i32, i32 addrspace(1)* %idx.ptr, i64 %tid.ext
1254  %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
1255  %idx = load i32, i32 addrspace(1)* %idx.gep
1256  %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
1257  %vecins = insertelement <2 x half> %vec, half 0xH1234, i32 %idx
1258  store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
1259  ret void
1260}
1261
1262define amdgpu_kernel void @v_insertelement_v4f16_0(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, [8 x i32], i32 %val) #0 {
1263; GFX9-LABEL: v_insertelement_v4f16_0:
1264; GFX9:       ; %bb.0:
1265; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1266; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
1267; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1268; GFX9-NEXT:    v_mov_b32_e32 v3, 0xffff
1269; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1270; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1271; GFX9-NEXT:    s_waitcnt vmcnt(0)
1272; GFX9-NEXT:    v_bfi_b32 v0, v3, s4, v0
1273; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1274; GFX9-NEXT:    s_endpgm
1275;
1276; VI-LABEL: v_insertelement_v4f16_0:
1277; VI:       ; %bb.0:
1278; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1279; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
1280; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1281; VI-NEXT:    s_waitcnt lgkmcnt(0)
1282; VI-NEXT:    v_mov_b32_e32 v1, s3
1283; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1284; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1285; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1286; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1287; VI-NEXT:    v_mov_b32_e32 v3, s1
1288; VI-NEXT:    s_mov_b32 s0, 0xffff
1289; VI-NEXT:    v_mov_b32_e32 v4, s4
1290; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1291; VI-NEXT:    s_waitcnt vmcnt(0)
1292; VI-NEXT:    v_bfi_b32 v0, s0, v4, v0
1293; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1294; VI-NEXT:    s_endpgm
1295;
1296; CI-LABEL: v_insertelement_v4f16_0:
1297; CI:       ; %bb.0:
1298; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1299; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
1300; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1301; CI-NEXT:    s_waitcnt lgkmcnt(0)
1302; CI-NEXT:    v_mov_b32_e32 v1, s3
1303; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1304; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1305; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1306; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1307; CI-NEXT:    v_mov_b32_e32 v3, s1
1308; CI-NEXT:    s_mov_b32 s0, 0xffff
1309; CI-NEXT:    v_mov_b32_e32 v4, s4
1310; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1311; CI-NEXT:    s_waitcnt vmcnt(0)
1312; CI-NEXT:    v_bfi_b32 v0, s0, v4, v0
1313; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1314; CI-NEXT:    s_endpgm
1315  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1316  %tid.ext = sext i32 %tid to i64
1317  %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
1318  %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
1319  %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
1320  %val.trunc = trunc i32 %val to i16
1321  %val.cvt = bitcast i16 %val.trunc to half
1322  %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 0
1323  store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
1324  ret void
1325}
1326
1327define amdgpu_kernel void @v_insertelement_v4f16_1(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, i32 %val) #0 {
1328; GFX9-LABEL: v_insertelement_v4f16_1:
1329; GFX9:       ; %bb.0:
1330; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1331; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
1332; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1333; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1334; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1335; GFX9-NEXT:    s_waitcnt vmcnt(0)
1336; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1337; GFX9-NEXT:    v_lshl_or_b32 v0, s4, 16, v0
1338; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1339; GFX9-NEXT:    s_endpgm
1340;
1341; VI-LABEL: v_insertelement_v4f16_1:
1342; VI:       ; %bb.0:
1343; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1344; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
1345; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1346; VI-NEXT:    s_waitcnt lgkmcnt(0)
1347; VI-NEXT:    v_mov_b32_e32 v1, s3
1348; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1349; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1350; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1351; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1352; VI-NEXT:    s_lshl_b32 s0, s4, 16
1353; VI-NEXT:    v_mov_b32_e32 v3, s1
1354; VI-NEXT:    v_mov_b32_e32 v4, s0
1355; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1356; VI-NEXT:    s_waitcnt vmcnt(0)
1357; VI-NEXT:    v_or_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1358; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1359; VI-NEXT:    s_endpgm
1360;
1361; CI-LABEL: v_insertelement_v4f16_1:
1362; CI:       ; %bb.0:
1363; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1364; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
1365; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1366; CI-NEXT:    s_waitcnt lgkmcnt(0)
1367; CI-NEXT:    v_mov_b32_e32 v1, s3
1368; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1369; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1370; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1371; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1372; CI-NEXT:    v_mov_b32_e32 v3, s1
1373; CI-NEXT:    s_lshl_b32 s0, s4, 16
1374; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1375; CI-NEXT:    s_waitcnt vmcnt(0)
1376; CI-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1377; CI-NEXT:    v_or_b32_e32 v0, s0, v0
1378; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1379; CI-NEXT:    s_endpgm
1380  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1381  %tid.ext = sext i32 %tid to i64
1382  %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
1383  %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
1384  %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
1385  %val.trunc = trunc i32 %val to i16
1386  %val.cvt = bitcast i16 %val.trunc to half
1387  %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 1
1388  store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
1389  ret void
1390}
1391
1392define amdgpu_kernel void @v_insertelement_v4f16_2(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, [8 x i32], i32 %val) #0 {
1393; GFX9-LABEL: v_insertelement_v4f16_2:
1394; GFX9:       ; %bb.0:
1395; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1396; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x30
1397; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1398; GFX9-NEXT:    v_mov_b32_e32 v3, 0xffff
1399; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1400; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1401; GFX9-NEXT:    s_waitcnt vmcnt(0)
1402; GFX9-NEXT:    v_bfi_b32 v1, v3, s4, v1
1403; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1404; GFX9-NEXT:    s_endpgm
1405;
1406; VI-LABEL: v_insertelement_v4f16_2:
1407; VI:       ; %bb.0:
1408; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1409; VI-NEXT:    s_load_dword s4, s[4:5], 0x30
1410; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1411; VI-NEXT:    s_waitcnt lgkmcnt(0)
1412; VI-NEXT:    v_mov_b32_e32 v1, s3
1413; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1414; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1415; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1416; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1417; VI-NEXT:    v_mov_b32_e32 v3, s1
1418; VI-NEXT:    s_mov_b32 s0, 0xffff
1419; VI-NEXT:    v_mov_b32_e32 v4, s4
1420; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1421; VI-NEXT:    s_waitcnt vmcnt(0)
1422; VI-NEXT:    v_bfi_b32 v1, s0, v4, v1
1423; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1424; VI-NEXT:    s_endpgm
1425;
1426; CI-LABEL: v_insertelement_v4f16_2:
1427; CI:       ; %bb.0:
1428; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1429; CI-NEXT:    s_load_dword s4, s[4:5], 0xc
1430; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1431; CI-NEXT:    s_waitcnt lgkmcnt(0)
1432; CI-NEXT:    v_mov_b32_e32 v1, s3
1433; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1434; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1435; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1436; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1437; CI-NEXT:    v_mov_b32_e32 v3, s1
1438; CI-NEXT:    s_mov_b32 s0, 0xffff
1439; CI-NEXT:    v_mov_b32_e32 v4, s4
1440; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1441; CI-NEXT:    s_waitcnt vmcnt(0)
1442; CI-NEXT:    v_bfi_b32 v1, s0, v4, v1
1443; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1444; CI-NEXT:    s_endpgm
1445  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1446  %tid.ext = sext i32 %tid to i64
1447  %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
1448  %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
1449  %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
1450  %val.trunc = trunc i32 %val to i16
1451  %val.cvt = bitcast i16 %val.trunc to half
1452  %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 2
1453  store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
1454  ret void
1455}
1456
1457define amdgpu_kernel void @v_insertelement_v4f16_3(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, i32 %val) #0 {
1458; GFX9-LABEL: v_insertelement_v4f16_3:
1459; GFX9:       ; %bb.0:
1460; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1461; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
1462; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1463; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1464; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1465; GFX9-NEXT:    s_waitcnt vmcnt(0)
1466; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1467; GFX9-NEXT:    v_lshl_or_b32 v1, s4, 16, v1
1468; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1469; GFX9-NEXT:    s_endpgm
1470;
1471; VI-LABEL: v_insertelement_v4f16_3:
1472; VI:       ; %bb.0:
1473; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1474; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
1475; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1476; VI-NEXT:    s_waitcnt lgkmcnt(0)
1477; VI-NEXT:    v_mov_b32_e32 v1, s3
1478; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1479; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1480; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1481; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1482; VI-NEXT:    s_lshl_b32 s0, s4, 16
1483; VI-NEXT:    v_mov_b32_e32 v3, s1
1484; VI-NEXT:    v_mov_b32_e32 v4, s0
1485; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1486; VI-NEXT:    s_waitcnt vmcnt(0)
1487; VI-NEXT:    v_or_b32_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
1488; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1489; VI-NEXT:    s_endpgm
1490;
1491; CI-LABEL: v_insertelement_v4f16_3:
1492; CI:       ; %bb.0:
1493; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1494; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
1495; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1496; CI-NEXT:    s_waitcnt lgkmcnt(0)
1497; CI-NEXT:    v_mov_b32_e32 v1, s3
1498; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1499; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1500; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1501; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1502; CI-NEXT:    v_mov_b32_e32 v3, s1
1503; CI-NEXT:    s_lshl_b32 s0, s4, 16
1504; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1505; CI-NEXT:    s_waitcnt vmcnt(0)
1506; CI-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1507; CI-NEXT:    v_or_b32_e32 v1, s0, v1
1508; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1509; CI-NEXT:    s_endpgm
1510  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1511  %tid.ext = sext i32 %tid to i64
1512  %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
1513  %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
1514  %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
1515  %val.trunc = trunc i32 %val to i16
1516  %val.cvt = bitcast i16 %val.trunc to half
1517  %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 3
1518  store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
1519  ret void
1520}
1521
1522define amdgpu_kernel void @v_insertelement_v4i16_2(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in, i32 %val) #0 {
1523; GFX9-LABEL: v_insertelement_v4i16_2:
1524; GFX9:       ; %bb.0:
1525; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1526; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
1527; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1528; GFX9-NEXT:    v_mov_b32_e32 v3, 0xffff
1529; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1530; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1531; GFX9-NEXT:    s_waitcnt vmcnt(0)
1532; GFX9-NEXT:    v_bfi_b32 v1, v3, s4, v1
1533; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1534; GFX9-NEXT:    s_endpgm
1535;
1536; VI-LABEL: v_insertelement_v4i16_2:
1537; VI:       ; %bb.0:
1538; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1539; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
1540; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1541; VI-NEXT:    s_waitcnt lgkmcnt(0)
1542; VI-NEXT:    v_mov_b32_e32 v1, s3
1543; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1544; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1545; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1546; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1547; VI-NEXT:    v_mov_b32_e32 v3, s1
1548; VI-NEXT:    s_mov_b32 s0, 0xffff
1549; VI-NEXT:    v_mov_b32_e32 v4, s4
1550; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1551; VI-NEXT:    s_waitcnt vmcnt(0)
1552; VI-NEXT:    v_bfi_b32 v1, s0, v4, v1
1553; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1554; VI-NEXT:    s_endpgm
1555;
1556; CI-LABEL: v_insertelement_v4i16_2:
1557; CI:       ; %bb.0:
1558; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1559; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
1560; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1561; CI-NEXT:    s_waitcnt lgkmcnt(0)
1562; CI-NEXT:    v_mov_b32_e32 v1, s3
1563; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1564; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1565; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1566; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1567; CI-NEXT:    v_mov_b32_e32 v3, s1
1568; CI-NEXT:    s_mov_b32 s0, 0xffff
1569; CI-NEXT:    v_mov_b32_e32 v4, s4
1570; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1571; CI-NEXT:    s_waitcnt vmcnt(0)
1572; CI-NEXT:    v_bfi_b32 v1, s0, v4, v1
1573; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1574; CI-NEXT:    s_endpgm
1575  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1576  %tid.ext = sext i32 %tid to i64
1577  %in.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i64 %tid.ext
1578  %out.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i64 %tid.ext
1579  %vec = load <4 x i16>, <4 x i16> addrspace(1)* %in.gep
1580  %val.trunc = trunc i32 %val to i16
1581  %val.cvt = bitcast i16 %val.trunc to i16
1582  %vecins = insertelement <4 x i16> %vec, i16 %val.cvt, i32 2
1583  store <4 x i16> %vecins, <4 x i16> addrspace(1)* %out.gep
1584  ret void
1585}
1586
1587; FIXME: Better code on CI?
1588define amdgpu_kernel void @v_insertelement_v4i16_dynamic_vgpr(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in, i32 %val) #0 {
1589; GFX9-LABEL: v_insertelement_v4i16_dynamic_vgpr:
1590; GFX9:       ; %bb.0:
1591; GFX9-NEXT:    global_load_dword v2, v[0:1], off
1592; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1593; GFX9-NEXT:    s_load_dword s4, s[4:5], 0x10
1594; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1595; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1596; GFX9-NEXT:    global_load_dwordx2 v[0:1], v4, s[2:3]
1597; GFX9-NEXT:    s_mov_b32 s3, 0
1598; GFX9-NEXT:    s_mov_b32 s2, 0xffff
1599; GFX9-NEXT:    s_waitcnt vmcnt(1)
1600; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 4, v2
1601; GFX9-NEXT:    v_lshlrev_b64 v[2:3], v2, s[2:3]
1602; GFX9-NEXT:    s_pack_ll_b32_b16 s2, s4, s4
1603; GFX9-NEXT:    s_waitcnt vmcnt(0)
1604; GFX9-NEXT:    v_bfi_b32 v1, v3, s2, v1
1605; GFX9-NEXT:    v_bfi_b32 v0, v2, s2, v0
1606; GFX9-NEXT:    global_store_dwordx2 v4, v[0:1], s[0:1]
1607; GFX9-NEXT:    s_endpgm
1608;
1609; VI-LABEL: v_insertelement_v4i16_dynamic_vgpr:
1610; VI:       ; %bb.0:
1611; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1612; VI-NEXT:    s_load_dword s4, s[4:5], 0x10
1613; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1614; VI-NEXT:    s_waitcnt lgkmcnt(0)
1615; VI-NEXT:    v_mov_b32_e32 v1, s3
1616; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1617; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1618; VI-NEXT:    flat_load_dword v4, v[0:1]
1619; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1620; VI-NEXT:    s_mov_b32 s2, 0xffff
1621; VI-NEXT:    v_mov_b32_e32 v3, s1
1622; VI-NEXT:    s_mov_b32 s3, 0
1623; VI-NEXT:    s_and_b32 s1, s4, s2
1624; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1625; VI-NEXT:    s_lshl_b32 s0, s1, 16
1626; VI-NEXT:    s_or_b32 s0, s1, s0
1627; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1628; VI-NEXT:    s_waitcnt vmcnt(1)
1629; VI-NEXT:    v_lshlrev_b32_e32 v4, 4, v4
1630; VI-NEXT:    v_lshlrev_b64 v[4:5], v4, s[2:3]
1631; VI-NEXT:    s_waitcnt vmcnt(0)
1632; VI-NEXT:    v_bfi_b32 v1, v5, s0, v1
1633; VI-NEXT:    v_bfi_b32 v0, v4, s0, v0
1634; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1635; VI-NEXT:    s_endpgm
1636;
1637; CI-LABEL: v_insertelement_v4i16_dynamic_vgpr:
1638; CI:       ; %bb.0:
1639; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1640; CI-NEXT:    s_load_dword s4, s[4:5], 0x4
1641; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1642; CI-NEXT:    s_waitcnt lgkmcnt(0)
1643; CI-NEXT:    v_mov_b32_e32 v1, s3
1644; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1645; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1646; CI-NEXT:    flat_load_dword v4, v[0:1]
1647; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1648; CI-NEXT:    s_mov_b32 s3, 0
1649; CI-NEXT:    s_mov_b32 s2, 0xffff
1650; CI-NEXT:    v_mov_b32_e32 v3, s1
1651; CI-NEXT:    s_lshl_b32 s1, s4, 16
1652; CI-NEXT:    s_and_b32 s4, s4, s2
1653; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1654; CI-NEXT:    s_or_b32 s0, s4, s1
1655; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1656; CI-NEXT:    s_waitcnt vmcnt(1)
1657; CI-NEXT:    v_lshlrev_b32_e32 v4, 4, v4
1658; CI-NEXT:    v_lshl_b64 v[4:5], s[2:3], v4
1659; CI-NEXT:    s_waitcnt vmcnt(0)
1660; CI-NEXT:    v_bfi_b32 v1, v5, s0, v1
1661; CI-NEXT:    v_bfi_b32 v0, v4, s0, v0
1662; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1663; CI-NEXT:    s_endpgm
1664  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1665  %tid.ext = sext i32 %tid to i64
1666  %in.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i64 %tid.ext
1667  %out.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i64 %tid.ext
1668  %idx.val = load volatile i32, i32 addrspace(1)* undef
1669  %vec = load <4 x i16>, <4 x i16> addrspace(1)* %in.gep
1670  %val.trunc = trunc i32 %val to i16
1671  %val.cvt = bitcast i16 %val.trunc to i16
1672  %vecins = insertelement <4 x i16> %vec, i16 %val.cvt, i32 %idx.val
1673  store <4 x i16> %vecins, <4 x i16> addrspace(1)* %out.gep
1674  ret void
1675}
1676
1677define amdgpu_kernel void @v_insertelement_v4f16_dynamic_sgpr(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, i32 %val, i32 %idxval) #0 {
1678; GFX9-LABEL: v_insertelement_v4f16_dynamic_sgpr:
1679; GFX9:       ; %bb.0:
1680; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1681; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x10
1682; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1683; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1684; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
1685; GFX9-NEXT:    s_pack_ll_b32_b16 s4, s4, s4
1686; GFX9-NEXT:    s_mov_b32 s3, 0
1687; GFX9-NEXT:    s_mov_b32 s2, 0xffff
1688; GFX9-NEXT:    s_lshl_b32 s5, s5, 4
1689; GFX9-NEXT:    s_lshl_b64 s[2:3], s[2:3], s5
1690; GFX9-NEXT:    v_mov_b32_e32 v3, s4
1691; GFX9-NEXT:    v_mov_b32_e32 v4, s4
1692; GFX9-NEXT:    s_waitcnt vmcnt(0)
1693; GFX9-NEXT:    v_bfi_b32 v1, s3, v3, v1
1694; GFX9-NEXT:    v_bfi_b32 v0, s2, v4, v0
1695; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
1696; GFX9-NEXT:    s_endpgm
1697;
1698; VI-LABEL: v_insertelement_v4f16_dynamic_sgpr:
1699; VI:       ; %bb.0:
1700; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1701; VI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x10
1702; VI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1703; VI-NEXT:    s_waitcnt lgkmcnt(0)
1704; VI-NEXT:    v_mov_b32_e32 v1, s3
1705; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1706; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1707; VI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1708; VI-NEXT:    s_mov_b32 s2, 0xffff
1709; VI-NEXT:    v_mov_b32_e32 v3, s1
1710; VI-NEXT:    s_mov_b32 s3, 0
1711; VI-NEXT:    s_lshl_b32 s1, s5, 4
1712; VI-NEXT:    s_and_b32 s4, s4, s2
1713; VI-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
1714; VI-NEXT:    s_lshl_b64 s[0:1], s[2:3], s1
1715; VI-NEXT:    s_lshl_b32 s2, s4, 16
1716; VI-NEXT:    s_or_b32 s2, s4, s2
1717; VI-NEXT:    v_mov_b32_e32 v4, s2
1718; VI-NEXT:    v_mov_b32_e32 v5, s2
1719; VI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1720; VI-NEXT:    s_waitcnt vmcnt(0)
1721; VI-NEXT:    v_bfi_b32 v1, s1, v4, v1
1722; VI-NEXT:    v_bfi_b32 v0, s0, v5, v0
1723; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1724; VI-NEXT:    s_endpgm
1725;
1726; CI-LABEL: v_insertelement_v4f16_dynamic_sgpr:
1727; CI:       ; %bb.0:
1728; CI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1729; CI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x4
1730; CI-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1731; CI-NEXT:    s_waitcnt lgkmcnt(0)
1732; CI-NEXT:    v_mov_b32_e32 v1, s3
1733; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v2
1734; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1735; CI-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1736; CI-NEXT:    s_mov_b32 s2, 0xffff
1737; CI-NEXT:    v_mov_b32_e32 v3, s1
1738; CI-NEXT:    s_and_b32 s6, s4, s2
1739; CI-NEXT:    s_mov_b32 s3, 0
1740; CI-NEXT:    s_lshl_b32 s1, s5, 4
1741; CI-NEXT:    s_lshl_b32 s4, s4, 16
1742; CI-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
1743; CI-NEXT:    s_lshl_b64 s[0:1], s[2:3], s1
1744; CI-NEXT:    s_or_b32 s2, s6, s4
1745; CI-NEXT:    v_mov_b32_e32 v4, s2
1746; CI-NEXT:    v_mov_b32_e32 v5, s2
1747; CI-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1748; CI-NEXT:    s_waitcnt vmcnt(0)
1749; CI-NEXT:    v_bfi_b32 v1, s1, v4, v1
1750; CI-NEXT:    v_bfi_b32 v0, s0, v5, v0
1751; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
1752; CI-NEXT:    s_endpgm
1753  %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
1754  %tid.ext = sext i32 %tid to i64
1755  %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
1756  %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
1757  %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
1758  %val.trunc = trunc i32 %val to i16
1759  %val.cvt = bitcast i16 %val.trunc to half
1760  %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 %idxval
1761  store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
1762  ret void
1763}
1764
1765declare i32 @llvm.amdgcn.workitem.id.x() #1
1766
1767attributes #0 = { nounwind }
1768attributes #1 = { nounwind readnone }
1769