[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / AMDGPU / insert_vector_elt.v2i16.ll
bloba8a298045ff0833d5810df5fe94671f5fb29c011
1 ; RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-amdgpu-aa=0 -mattr=+flat-for-global,-fp64-fp16-denormals < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9,GFX89 %s
2 ; 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,CIVI,VI,GFX89 %s
3 ; 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 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0:
6 ; GCN: s_load_dword [[VEC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x0
8 ; CIVI: s_and_b32 [[ELT1:s[0-9]+]], [[VEC]], 0xffff0000{{$}}
9 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT1]], 0x3e7{{$}}
11 ; GFX9-NOT: lshr
12 ; GFX9: s_pack_lh_b32_b16 s{{[0-9]+}}, 0x3e7, [[VEC]]
13 define amdgpu_kernel void @s_insertelement_v2i16_0(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr) #0 {
14   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
15   %vecins = insertelement <2 x i16> %vec, i16 999, i32 0
16   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
17   ret void
20 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0_reg:
21 ; GCN-DAG: s_load_dword [[ELT_LOAD:s[0-9]+]], s[4:5],
22 ; GCN-DAG: s_load_dword [[VEC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x0
24 ; CIVI-DAG: s_and_b32 [[ELT0:s[0-9]+]], [[ELT_LOAD]], 0xffff{{$}}
25 ; CIVI-DAG: s_and_b32 [[ELT1:s[0-9]+]], [[VEC]], 0xffff0000{{$}}
26 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT0]], [[ELT1]]
28 ; GFX9-NOT: [[ELT0]]
29 ; GFX9-NOT: [[VEC]]
30 ; GFX9: s_pack_lh_b32_b16 s{{[0-9]+}}, [[ELT_LOAD]], [[VEC]]
31 define 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 {
32   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
33   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
34   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
35   ret void
38 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0_multi_use_hi_reg:
39 ; GCN-DAG: s_load_dword [[ELT_LOAD:s[0-9]+]], s[4:5],
40 ; GCN-DAG: s_load_dword [[VEC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x0
42 ; CI-DAG: s_and_b32 [[ELT0_MASKED:s[0-9]+]], [[ELT_LOAD]], 0xffff{{$}}
43 ; CI: s_lshr_b32 [[SHR:s[0-9]+]], [[VEC]], 16
44 ; CI: s_lshl_b32 [[ELT1:s[0-9]+]], [[SHR]], 16
45 ; CI-DAG: s_or_b32 s{{[0-9]+}}, [[ELT0_MASKED]], [[ELT1]]
46 ; CI-DAG: ; use [[SHR]]
49 ; FIXME: Should be able to void mask of upper bits
50 ; VI-DAG: s_and_b32 [[ELT_MASKED:s[0-9]+]], [[ELT_LOAD]], 0xffff{{$}}
51 ; VI-DAG: s_and_b32 [[VEC_HIMASK:s[0-9]+]], [[VEC]], 0xffff0000{{$}}
52 ; VI-DAG: s_or_b32 [[OR:s[0-9]+]], [[ELT_MASKED]], [[VEC_HIMASK]]
53 ; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VEC]], 16
55 ; VI-DAG: ; use [[SHR]]
58 ; GFX9: s_lshr_b32 [[ELT1:s[0-9]+]], [[VEC]], 16
59 ; GFX9-DAG: s_pack_ll_b32_b16 s{{[0-9]+}}, [[ELT_LOAD]], [[ELT1]]
60 ; GFX9-DAG: ; use [[ELT1]]
61 define 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 {
62   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
63   %elt1 = extractelement <2 x i16> %vec, i32 1
64   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
65   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
66   %use1 = zext i16 %elt1 to i32
67   call void asm sideeffect "; use $0", "s"(i32 %use1) #0
68   ret void
71 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0_reghi:
72 ; GCN-DAG: s_load_dword [[ELT_ARG:s[0-9]+]], s[4:5],
73 ; GCN-DAG: s_load_dword [[VEC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x0
75 ; CIVI: s_lshr_b32 [[ELT_HI:s[0-9]+]], [[ELT_ARG]], 16
76 ; CIVI-DAG: s_and_b32 [[ELT1:s[0-9]+]], [[VEC]], 0xffff0000{{$}}
77 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT_HI]], [[ELT1]]
79 ; GFX9-NOT: [[ELT0]]
80 ; GFX9-NOT: [[VEC]]
81 ; GFX9: s_pack_hh_b32_b16 s{{[0-9]+}}, [[ELT_ARG]], [[VEC]]
82 define 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 {
83   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
84   %elt.hi = lshr i32 %elt.arg, 16
85   %elt = trunc i32 %elt.hi to i16
86   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
87   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
88   ret void
91 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0_reghi_multi_use_1:
92 ; GCN: s_load_dword [[ELT_ARG:s[0-9]+]],
93 ; GCN: s_load_dword [[VEC:s[0-9]+]],
95 ; CIVI-DAG: s_lshr_b32 [[ELT1:s[0-9]+]], [[ELT_ARG]], 16
96 ; CIVI-DAG: s_and_b32 [[ELT0:s[0-9]+]], [[VEC]], 0xffff0000{{$}}
97 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT1]], [[ELT0]]
99 ; GFX9: s_lshr_b32 [[ELT1:s[0-9]+]], [[ELT_ARG]], 16
100 ; GFX9: s_pack_lh_b32_b16 s{{[0-9]+}}, [[ELT1]], [[VEC]]
101 ; GFX9: ; use [[ELT1]]
102 define 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 {
103   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
104   %elt.hi = lshr i32 %elt.arg, 16
105   %elt = trunc i32 %elt.hi to i16
106   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
107   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
108   %use1 = zext i16 %elt to i32
109   call void asm sideeffect "; use $0", "s"(i32 %use1) #0
110   ret void
113 ; GCN-LABEL: {{^}}s_insertelement_v2i16_0_reghi_both_multi_use_1:
114 ; GCN: s_load_dword [[ELT_ARG:s[0-9]+]],
115 ; GCN: s_load_dword [[VEC:s[0-9]+]],
117 ; CI-DAG: s_lshr_b32 [[ELT_HI:s[0-9]+]], [[ELT_ARG]], 16
118 ; CI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VEC]], 16
119 ; CI-DAG: s_lshl_b32 [[VEC_HI:s[0-9]+]], [[SHR]], 16
120 ; CI: s_or_b32 s{{[0-9]+}}, [[ELT_HI]], [[VEC_HI]]
123 ; VI-DAG: s_lshr_b32 [[ELT_HI:s[0-9]+]], [[ELT_ARG]], 16
124 ; VI-DAG: s_lshr_b32 [[VEC_HI:s[0-9]+]], [[VEC]], 16
125 ; VI: s_and_b32 [[MASK_HI:s[0-9]+]], [[VEC]], 0xffff0000
126 ; VI: s_or_b32 s{{[0-9]+}}, [[ELT_HI]], [[MASK_HI]]
128 ; GFX9-DAG: s_lshr_b32 [[ELT_HI:s[0-9]+]], [[ELT_ARG]], 16
129 ; GFX9-DAG: s_lshr_b32 [[VEC_HI:s[0-9]+]], [[VEC]], 16
130 ; GFX9: s_pack_ll_b32_b16 s{{[0-9]+}}, [[ELT_HI]], [[VEC_HI]]
131 ; GFX9: ; use [[ELT_HI]]
132 ; GFX9: ; use [[VEC_HI]]
133 define 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 {
134   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
135   %elt.hi = lshr i32 %elt.arg, 16
136   %elt = trunc i32 %elt.hi to i16
137   %vec.hi = extractelement <2 x i16> %vec, i32 1
138   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
139   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
140   %use1 = zext i16 %elt to i32
141   %vec.hi.use1 = zext i16 %vec.hi to i32
143   call void asm sideeffect "; use $0", "s"(i32 %use1) #0
144   call void asm sideeffect "; use $0", "s"(i32 %vec.hi.use1) #0
145   ret void
148 ; GCN-LABEL: {{^}}s_insertelement_v2i16_1:
149 ; GCN: s_load_dword [[VEC:s[0-9]+]]
151 ; GCN-NOT: s_lshr
153 ; CIVI: s_and_b32 [[ELT0:s[0-9]+]], [[VEC]], 0xffff{{$}}
154 ; CIVI: s_or_b32 [[INS:s[0-9]+]], [[ELT0]], 0x3e70000
156 ; GFX9: s_pack_ll_b32_b16 s{{[0-9]+}}, [[VEC]], 0x3e7
157 define amdgpu_kernel void @s_insertelement_v2i16_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(4)* %vec.ptr) #0 {
158   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
159   %vecins = insertelement <2 x i16> %vec, i16 999, i32 1
160   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
161   ret void
164 ; GCN-LABEL: {{^}}s_insertelement_v2i16_1_reg:
165 ; GCN-DAG: s_load_dword [[ELT1_LOAD:s[0-9]+]], s[4:5],
166 ; GCN-DAG: s_load_dword [[VEC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x0
168 ; CIVI: s_lshl_b32 [[ELT1:s[0-9]+]], [[ELT1_LOAD]], 16
169 ; CIVI: s_and_b32 [[ELT0:s[0-9]+]], [[VEC]], 0xffff{{$}}
170 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT0]], [[ELT1]]
172 ; GCN-NOT: shlr
173 ; GFX9: s_pack_ll_b32_b16 s{{[0-9]+}}, [[VEC]], [[ELT1_LOAD]]
174 define 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 {
175   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
176   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 1
177   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
178   ret void
181 ; GCN-LABEL: {{^}}s_insertelement_v2f16_0:
182 ; GCN: s_load_dword [[VEC:s[0-9]+]]
183 ; CIVI: s_and_b32 [[ELT1:s[0-9]+]], [[VEC:s[0-9]+]], 0xffff0000
184 ; CIVI: s_or_b32 s{{[0-9]+}}, [[ELT1]], 0x4500
186 ; GFX9: s_lshr_b32 [[ELT1:s[0-9]+]], [[VEC]], 16
187 ; GFX9: s_pack_ll_b32_b16 s{{[0-9]+}}, 0x4500, [[ELT1]]
188 define amdgpu_kernel void @s_insertelement_v2f16_0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(4)* %vec.ptr) #0 {
189   %vec = load <2 x half>, <2 x half> addrspace(4)* %vec.ptr
190   %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 0
191   store <2 x half> %vecins, <2 x half> addrspace(1)* %out
192   ret void
195 ; GCN-LABEL: {{^}}s_insertelement_v2f16_1:
196 ; GCN: s_load_dword [[VEC:s[0-9]+]]
197 ; GCN-NOT: s_lshr
199 ; CIVI: s_and_b32 [[ELT0:s[0-9]+]], [[VEC]], 0xffff{{$}}
200 ; CIVI: s_or_b32 [[INS:s[0-9]+]], [[ELT0]], 0x45000000
202 ; GFX9: s_pack_ll_b32_b16 s{{[0-9]+}}, [[VEC]], 0x4500
203 define amdgpu_kernel void @s_insertelement_v2f16_1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(4)* %vec.ptr) #0 {
204   %vec = load <2 x half>, <2 x half> addrspace(4)* %vec.ptr
205   %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 1
206   store <2 x half> %vecins, <2 x half> addrspace(1)* %out
207   ret void
210 ; GCN-LABEL: {{^}}v_insertelement_v2i16_0:
211 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
212 ; CIVI: v_and_b32_e32 [[ELT1:v[0-9]+]], 0xffff0000, [[VEC]]
213 ; CIVI: v_or_b32_e32 [[RES:v[0-9]+]], 0x3e7, [[ELT1]]
215 ; GFX9-DAG: s_movk_i32 [[ELT0:s[0-9]+]], 0x3e7{{$}}
216 ; GFX9-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0xffff{{$}}
217 ; GFX9: v_bfi_b32 [[RES:v[0-9]+]], [[MASK]], [[ELT0]], [[VEC]]
218 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
219 define amdgpu_kernel void @v_insertelement_v2i16_0(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
220   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
221   %tid.ext = sext i32 %tid to i64
222   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
223   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
224   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
225   %vecins = insertelement <2 x i16> %vec, i16 999, i32 0
226   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
227   ret void
230 ; GCN-LABEL: {{^}}v_insertelement_v2i16_0_reghi:
231 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
232 ; GCN-DAG: s_load_dword [[ELT0:s[0-9]+]]
234 ; CIVI-DAG: s_lshr_b32 [[ELT0_SHIFT:s[0-9]+]], [[ELT0]], 16
235 ; CIVI-DAG: v_and_b32_e32 [[ELT1:v[0-9]+]], 0xffff0000, [[VEC]]
236 ; CIVI: v_or_b32_e32 [[RES:v[0-9]+]], [[ELT0_SHIFT]], [[ELT1]]
238 ; GFX9-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0xffff0000{{$}}
239 ; GFX9-DAG: v_lshrrev_b32_e64 [[ELT0_SHIFT:v[0-9]+]], 16, [[ELT0]]
240 ; GFX9: v_and_or_b32 [[RES:v[0-9]+]], [[VEC]], [[MASK]], [[ELT0_SHIFT]]
242 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
243 define amdgpu_kernel void @v_insertelement_v2i16_0_reghi(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in, i32 %elt.arg) #0 {
244   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
245   %tid.ext = sext i32 %tid to i64
246   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
247   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
248   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
249   %elt.hi = lshr i32 %elt.arg, 16
250   %elt = trunc i32 %elt.hi to i16
251   %vecins = insertelement <2 x i16> %vec, i16 %elt, i32 0
252   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
253   ret void
256 ; GCN-LABEL: {{^}}v_insertelement_v2i16_0_inlineimm:
257 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
259 ; CIVI: v_and_b32_e32 [[ELT1:v[0-9]+]], 0xffff0000, [[VEC]]
260 ; CIVI: v_or_b32_e32 [[RES:v[0-9]+]], 53, [[ELT1]]
262 ; GFX9-DAG: v_mov_b32_e32 [[MASK:v[0-9]+]], 0xffff{{$}}
263 ; GFX9: v_bfi_b32 [[RES:v[0-9]+]], [[MASK]], 53, [[VEC]]
265 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
266 define amdgpu_kernel void @v_insertelement_v2i16_0_inlineimm(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
267   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
268   %tid.ext = sext i32 %tid to i64
269   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
270   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
271   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
272   %vecins = insertelement <2 x i16> %vec, i16 53, i32 0
273   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
274   ret void
277 ; FIXME: fold lshl_or c0, c1, v0 -> or (c0 << c1), v0
279 ; GCN-LABEL: {{^}}v_insertelement_v2i16_1:
280 ; VI: v_mov_b32_e32 [[K:v[0-9]+]], 0x3e70000
281 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
283 ; GFX9-DAG: s_movk_i32 [[K:s[0-9]+]], 0x3e7
284 ; GFX9-DAG: v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
285 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], [[K]], 16, [[ELT0]]
287 ; CI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, [[VEC]]
288 ; CI: v_or_b32_e32 [[RES:v[0-9]+]], 0x3e70000, [[AND]]
289 ; VI: v_or_b32_sdwa [[RES:v[0-9]+]], [[K]], [[VEC]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
291 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
292 define amdgpu_kernel void @v_insertelement_v2i16_1(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
293   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
294   %tid.ext = sext i32 %tid to i64
295   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
296   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
297   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
298   %vecins = insertelement <2 x i16> %vec, i16 999, i32 1
299   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
300   ret void
303 ; GCN-LABEL: {{^}}v_insertelement_v2i16_1_inlineimm:
304 ; VI: v_mov_b32_e32 [[K:v[0-9]+]], 0xfff10000
305 ; GCN: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
306 ; CI:   v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
307 ; GFX9: v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
308 ; CI: v_or_b32_e32 [[RES:v[0-9]+]], 0xfff10000, [[ELT0]]
309 ; VI: v_or_b32_sdwa [[RES:v[0-9]+]], [[K]], [[VEC]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
310 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], -15, 16, [[ELT0]]
311 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
312 define amdgpu_kernel void @v_insertelement_v2i16_1_inlineimm(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) #0 {
313   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
314   %tid.ext = sext i32 %tid to i64
315   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
316   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
317   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
318   %vecins = insertelement <2 x i16> %vec, i16 -15, i32 1
319   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
320   ret void
323 ; GCN-LABEL: {{^}}v_insertelement_v2f16_0:
324 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
326 ; CIVI: v_and_b32_e32 [[ELT1:v[0-9]+]], 0xffff0000, [[VEC]]
327 ; CIVI: v_or_b32_e32 [[RES:v[0-9]+]], 0x4500, [[ELT1]]
329 ; GFX9-DAG: v_mov_b32_e32 [[ELT0:v[0-9]+]], 0x4500{{$}}
330 ; GFX9-DAG: v_lshrrev_b32_e32 [[ELT1:v[0-9]+]], 16, [[VEC]]
331 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], [[ELT1]], 16, [[ELT0]]
333 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
334 define amdgpu_kernel void @v_insertelement_v2f16_0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
335   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
336   %tid.ext = sext i32 %tid to i64
337   %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
338   %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
339   %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
340   %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 0
341   store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
342   ret void
345 ; GCN-LABEL: {{^}}v_insertelement_v2f16_0_inlineimm:
346 ; GCN: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
348 ; CIVI: v_and_b32_e32 [[ELT1:v[0-9]+]], 0xffff0000, [[VEC]]
349 ; CIVI: v_or_b32_e32 [[RES:v[0-9]+]], 53, [[ELT1]]
351 ; GFX9: v_lshrrev_b32_e32 [[ELT1:v[0-9]+]], 16, [[VEC]]
352 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], [[ELT1]], 16, 53
353 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
354 define amdgpu_kernel void @v_insertelement_v2f16_0_inlineimm(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
355   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
356   %tid.ext = sext i32 %tid to i64
357   %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
358   %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
359   %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
360   %vecins = insertelement <2 x half> %vec, half 0xH0035, i32 0
361   store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
362   ret void
365 ; GCN-LABEL: {{^}}v_insertelement_v2f16_1:
366 ; VI: v_mov_b32_e32 [[K:v[0-9]+]], 0x45000000
367 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
369 ; GFX9-DAG: s_movk_i32 [[K:s[0-9]+]], 0x4500
370 ; GFX9-DAG: v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
371 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], [[K]], 16, [[ELT0]]
373 ; CI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, [[VEC]]
374 ; CI: v_or_b32_e32 [[RES:v[0-9]+]], 0x45000000, [[AND]]
376 ; VI: v_or_b32_sdwa [[RES:v[0-9]+]], [[K]], [[VEC]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
378 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
379 define amdgpu_kernel void @v_insertelement_v2f16_1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
380   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
381   %tid.ext = sext i32 %tid to i64
382   %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
383   %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
384   %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
385   %vecins = insertelement <2 x half> %vec, half 5.000000e+00, i32 1
386   store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
387   ret void
390 ; GCN-LABEL: {{^}}v_insertelement_v2f16_1_inlineimm:
391 ; VI: v_mov_b32_e32 [[K:v[0-9]+]], 0x230000
392 ; GCN: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
393 ; CI: v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
394 ; GFX9: v_and_b32_e32 [[ELT0:v[0-9]+]], 0xffff, [[VEC]]
395 ; CI: v_or_b32_e32 [[RES:v[0-9]+]], 0x230000, [[ELT0]]
396 ; VI: v_or_b32_sdwa [[RES:v[0-9]+]], [[K]], [[VEC]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
397 ; GFX9: v_lshl_or_b32 [[RES:v[0-9]+]], 35, 16, [[ELT0]]
398 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RES]]
399 define amdgpu_kernel void @v_insertelement_v2f16_1_inlineimm(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
400   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
401   %tid.ext = sext i32 %tid to i64
402   %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
403   %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
404   %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
405   %vecins = insertelement <2 x half> %vec, half 0xH0023, i32 1
406   store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
407   ret void
410 ; FIXME: Enable for others when argument load not split
411 ; GCN-LABEL: {{^}}s_insertelement_v2i16_dynamic:
412 ; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0x3e7
413 ; GCN: s_load_dword [[IDX:s[0-9]+]]
414 ; GCN: s_load_dword [[VEC:s[0-9]+]]
415 ; GCN-DAG: v_mov_b32_e32 [[VVEC:v[0-9]+]], [[VEC]]
416 ; GCN-DAG: s_lshl_b32 [[SCALED_IDX:s[0-9]+]], [[IDX]], 4
417 ; GCN-DAG: s_lshl_b32 [[MASK:s[0-9]+]], 0xffff, [[SCALED_IDX]]
418 ; GCN: v_bfi_b32 [[RESULT:v[0-9]+]], [[MASK]], [[K]], [[VVEC]]
419 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RESULT]]
420 define 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 {
421   %idx = load volatile i32, i32 addrspace(4)* %idx.ptr
422   %vec = load <2 x i16>, <2 x i16> addrspace(4)* %vec.ptr
423   %vecins = insertelement <2 x i16> %vec, i16 999, i32 %idx
424   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out
425   ret void
428 ; GCN-LABEL: {{^}}v_insertelement_v2i16_dynamic_sgpr:
429 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
430 ; GCN-DAG: s_load_dword [[IDX:s[0-9]+]]
431 ; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0x3e7
432 ; GCN-DAG: s_lshl_b32 [[SCALED_IDX:s[0-9]+]], [[IDX]], 4
433 ; GCN-DAG: s_lshl_b32 [[MASK:s[0-9]+]], 0xffff, [[SCALED_IDX]]
434 ; GCN: v_bfi_b32 [[RESULT:v[0-9]+]], [[MASK]], [[K]], [[VEC]]
435 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RESULT]]
436 define amdgpu_kernel void @v_insertelement_v2i16_dynamic_sgpr(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in, i32 %idx) #0 {
437   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
438   %tid.ext = sext i32 %tid to i64
439   %in.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i64 %tid.ext
440   %out.gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i64 %tid.ext
441   %vec = load <2 x i16>, <2 x i16> addrspace(1)* %in.gep
442   %vecins = insertelement <2 x i16> %vec, i16 999, i32 %idx
443   store <2 x i16> %vecins, <2 x i16> addrspace(1)* %out.gep
444   ret void
447 ; GCN-LABEL: {{^}}v_insertelement_v2f16_dynamic_vgpr:
448 ; GFX89-DAG: s_mov_b32 [[MASKK:s[0-9]+]], 0xffff{{$}}
449 ; GCN-DAG: s_mov_b32 [[K:s[0-9]+]], 0x12341234
451 ; GCN-DAG: {{flat|global}}_load_dword [[IDX:v[0-9]+]]
452 ; GCN-DAG: {{flat|global}}_load_dword [[VEC:v[0-9]+]]
454 ; GFX89-DAG: v_lshlrev_b32_e32 [[SCALED_IDX:v[0-9]+]], 4, [[IDX]]
455 ; GFX89-DAG: v_lshlrev_b32_e64 [[MASK:v[0-9]+]], [[SCALED_IDX]], [[MASKK]]
457 ; CI-DAG: v_lshlrev_b32_e32 [[SCALED_IDX:v[0-9]+]], 4, [[IDX]]
458 ; CI-DAG: v_lshl_b32_e32 [[MASK:v[0-9]+]], 0xffff, [[SCALED_IDX]]
460 ; GCN: v_bfi_b32 [[RESULT:v[0-9]+]], [[MASK]], [[K]], [[VEC]]
461 ; GCN: {{flat|global}}_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RESULT]]
462 define 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 {
463   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
464   %tid.ext = sext i32 %tid to i64
465   %in.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %in, i64 %tid.ext
466   %idx.gep = getelementptr inbounds i32, i32 addrspace(1)* %idx.ptr, i64 %tid.ext
467   %out.gep = getelementptr inbounds <2 x half>, <2 x half> addrspace(1)* %out, i64 %tid.ext
468   %idx = load i32, i32 addrspace(1)* %idx.gep
469   %vec = load <2 x half>, <2 x half> addrspace(1)* %in.gep
470   %vecins = insertelement <2 x half> %vec, half 0xH1234, i32 %idx
471   store <2 x half> %vecins, <2 x half> addrspace(1)* %out.gep
472   ret void
475 ; GCN-LABEL: {{^}}v_insertelement_v4f16_0:
476 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]], s[4:5],
477 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
479 ; GFX9-DAG: v_mov_b32_e32 [[BFI_MASK:v[0-9]+]], 0xffff{{$}}
480 ; GFX9: v_bfi_b32 v[[INS_LO:[0-9]+]], [[BFI_MASK]], [[VAL]], v[[LO]]
482 ; CIVI: s_and_b32 [[VAL_MASKED:s[0-9]+]], [[VAL]], 0xffff{{$}}
483 ; CIVI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff0000, v[[LO]]
484 ; CIVI: v_or_b32_e32 v[[INS_LO:[0-9]+]], [[VAL_MASKED]], [[AND]]
486 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[INS_LO]]:[[HI]]{{\]}}
487 define 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 {
488   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
489   %tid.ext = sext i32 %tid to i64
490   %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
491   %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
492   %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
493   %val.trunc = trunc i32 %val to i16
494   %val.cvt = bitcast i16 %val.trunc to half
495   %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 0
496   store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
497   ret void
500 ; GCN-LABEL: {{^}}v_insertelement_v4f16_1:
501 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]]
502 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
504 ; GFX9: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, v[[LO]]
505 ; GFX9: v_lshl_or_b32 v[[INS_HALF:[0-9]+]], [[VAL]], 16, [[AND]]
507 ; VI: s_lshl_b32 [[VAL_HI:s[0-9]+]], [[VAL]], 16
508 ; VI-DAG: v_mov_b32_e32 [[COPY_VAL:v[0-9]+]], [[VAL_HI]]
509 ; VI: v_or_b32_sdwa v[[INS_HALF:[0-9]+]], [[COPY_VAL]], v[[LO]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
511 ; CI: s_lshl_b32 [[VAL_HI:s[0-9]+]], [[VAL]], 16
512 ; CI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, v[[LO]]
513 ; CI: v_or_b32_e32 v[[INS_HALF:[0-9]+]], [[VAL_HI]], [[AND]]
515 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[INS_HALF]]:[[HI]]{{\]}}
516 define amdgpu_kernel void @v_insertelement_v4f16_1(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, i32 %val) #0 {
517   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
518   %tid.ext = sext i32 %tid to i64
519   %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
520   %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
521   %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
522   %val.trunc = trunc i32 %val to i16
523   %val.cvt = bitcast i16 %val.trunc to half
524   %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 1
525   store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
526   ret void
529 ; GCN-LABEL: {{^}}v_insertelement_v4f16_2:
530 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]], s[4:5],
531 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
533 ; GFX9-DAG: v_mov_b32_e32 [[BFI_MASK:v[0-9]+]], 0xffff{{$}}
534 ; GFX9: v_bfi_b32 v[[INS_HI:[0-9]+]], [[BFI_MASK]], [[VAL]], v[[HI]]
536 ; CIVI: s_and_b32 [[VAL_MASKED:s[0-9]+]], [[VAL]], 0xffff{{$}}
537 ; CIVI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff0000, v[[HI]]
538 ; CIVI: v_or_b32_e32 v[[INS_HI:[0-9]+]], [[VAL_MASKED]], [[AND]]
540 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[INS_HI]]{{\]}}
541 define 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 {
542   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
543   %tid.ext = sext i32 %tid to i64
544   %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
545   %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
546   %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
547   %val.trunc = trunc i32 %val to i16
548   %val.cvt = bitcast i16 %val.trunc to half
549   %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 2
550   store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
551   ret void
554 ; GCN-LABEL: {{^}}v_insertelement_v4f16_3:
555 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]]
556 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
558 ; GFX9: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, v[[HI]]
559 ; GFX9: v_lshl_or_b32 v[[INS_HI:[0-9]+]], [[VAL]], 16, [[AND]]
561 ; VI: s_lshl_b32 [[VAL_HI:s[0-9]+]], [[VAL]], 16
562 ; VI-DAG: v_mov_b32_e32 [[COPY_VAL:v[0-9]+]], [[VAL_HI]]
563 ; VI: v_or_b32_sdwa v[[INS_HI:[0-9]+]], [[COPY_VAL]], v[[HI]] dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_0
565 ; CI: s_lshl_b32 [[VAL_HI:s[0-9]+]], [[VAL]], 16
566 ; CI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff, v[[HI]]
567 ; CI: v_or_b32_e32 v[[INS_HI:[0-9]+]], [[VAL_HI]], [[AND]]
569 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[INS_HI]]{{\]}}
570 define amdgpu_kernel void @v_insertelement_v4f16_3(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in, i32 %val) #0 {
571   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
572   %tid.ext = sext i32 %tid to i64
573   %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
574   %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
575   %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
576   %val.trunc = trunc i32 %val to i16
577   %val.cvt = bitcast i16 %val.trunc to half
578   %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 3
579   store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
580   ret void
583 ; GCN-LABEL: {{^}}v_insertelement_v4i16_2:
584 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]]
585 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
587 ; GFX9-DAG: v_mov_b32_e32 [[BFI_MASK:v[0-9]+]], 0xffff{{$}}
588 ; GFX9: v_bfi_b32 v[[INS_HI:[0-9]+]], [[BFI_MASK]], [[VAL]], v[[HI]]
590 ; CIVI: s_and_b32 [[VAL_MASKED:s[0-9]+]], [[VAL]], 0xffff{{$}}
591 ; CIVI: v_and_b32_e32 [[AND:v[0-9]+]], 0xffff0000, v[[HI]]
592 ; CIVI: v_or_b32_e32 v[[INS_HI:[0-9]+]], [[VAL_MASKED]], [[AND]]
594 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[INS_HI]]{{\]}}
595 define amdgpu_kernel void @v_insertelement_v4i16_2(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in, i32 %val) #0 {
596   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
597   %tid.ext = sext i32 %tid to i64
598   %in.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i64 %tid.ext
599   %out.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i64 %tid.ext
600   %vec = load <4 x i16>, <4 x i16> addrspace(1)* %in.gep
601   %val.trunc = trunc i32 %val to i16
602   %val.cvt = bitcast i16 %val.trunc to i16
603   %vecins = insertelement <4 x i16> %vec, i16 %val.cvt, i32 2
604   store <4 x i16> %vecins, <4 x i16> addrspace(1)* %out.gep
605   ret void
608 ; FIXME: Better code on CI?
609 ; GCN-LABEL: {{^}}v_insertelement_v4i16_dynamic_vgpr:
610 ; GCN-DAG: {{flat|global}}_load_dword [[IDX:v[0-9]+]],
611 ; GCN-DAG: s_load_dword [[VAL:s[0-9]+]]
612 ; GCN-DAG: {{flat|global}}_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
614 ; GCN-DAG: s_mov_b32 s[[MASK_LO:[0-9]+]], 0xffff
615 ; GCN-DAG: s_mov_b32 s[[MASK_HI:[0-9]+]], 0
616 ; CIVI-DAG: s_and_b32 [[MASKED_VAL:s[0-9]+]], [[VAL]], s[[MASK_LO]]
617 ; VI-DAG: s_lshl_b32 [[SHIFTED_VAL:s[0-9]+]], [[MASKED_VAL]], 16
618 ; CI-DAG: s_lshl_b32 [[SHIFTED_VAL:s[0-9]+]], [[VAL]], 16
619 ; CIVI: s_or_b32 [[DUP_VAL:s[0-9]+]], [[MASKED_VAL]], [[SHIFTED_VAL]]
620 ; GCN-DAG: v_lshlrev_b32_e32 [[SCALED_IDX:v[0-9]+]], 4, [[IDX]]
621 ; GFX9-DAG: s_pack_ll_b32_b16 [[DUP_VAL:s[0-9]+]], [[VAL]], [[VAL]]
622 ; GFX89: v_lshlrev_b64 v[{{[0-9:]+}}], [[SCALED_IDX]], s{{\[}}[[MASK_LO]]:[[MASK_HI]]{{\]}}
623 ; CI: v_lshl_b64 v[{{[0-9:]+}}], s[{{[0-9:]+}}], [[SCALED_IDX]]
624 ; GCN: v_bfi_b32 v{{[0-9]+}}, v{{[0-9]+}}, [[DUP_VAL]], v{{[0-9]+}}
625 ; GCN: v_bfi_b32 v{{[0-9]+}}, v{{[0-9]+}}, [[DUP_VAL]], v{{[0-9]+}}
627 ; GCN: {{flat|global}}_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}
628 define amdgpu_kernel void @v_insertelement_v4i16_dynamic_vgpr(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in, i32 %val) #0 {
629   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
630   %tid.ext = sext i32 %tid to i64
631   %in.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i64 %tid.ext
632   %out.gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i64 %tid.ext
633   %idx.val = load volatile i32, i32 addrspace(1)* undef
634   %vec = load <4 x i16>, <4 x i16> addrspace(1)* %in.gep
635   %val.trunc = trunc i32 %val to i16
636   %val.cvt = bitcast i16 %val.trunc to i16
637   %vecins = insertelement <4 x i16> %vec, i16 %val.cvt, i32 %idx.val
638   store <4 x i16> %vecins, <4 x i16> addrspace(1)* %out.gep
639   ret void
642 ; GCN-LABEL: {{^}}v_insertelement_v4f16_dynamic_sgpr:
643 define 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 {
644   %tid = call i32 @llvm.amdgcn.workitem.id.x() #1
645   %tid.ext = sext i32 %tid to i64
646   %in.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %in, i64 %tid.ext
647   %out.gep = getelementptr inbounds <4 x half>, <4 x half> addrspace(1)* %out, i64 %tid.ext
648   %vec = load <4 x half>, <4 x half> addrspace(1)* %in.gep
649   %val.trunc = trunc i32 %val to i16
650   %val.cvt = bitcast i16 %val.trunc to half
651   %vecins = insertelement <4 x half> %vec, half %val.cvt, i32 %idxval
652   store <4 x half> %vecins, <4 x half> addrspace(1)* %out.gep
653   ret void
656 declare i32 @llvm.amdgcn.workitem.id.x() #1
658 attributes #0 = { nounwind }
659 attributes #1 = { nounwind readnone }