Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-insert.ll
blob776a1e9bab6b2617ad3a225d9754d1b7756776b5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
5 define <4 x i32> @insertelt_v4i32_0(<4 x i32> %a, i32 %y) {
6 ; CHECK-LABEL: insertelt_v4i32_0:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, tu, ma
9 ; CHECK-NEXT:    vmv.s.x v8, a0
10 ; CHECK-NEXT:    ret
11   %b = insertelement <4 x i32> %a, i32 %y, i32 0
12   ret <4 x i32> %b
15 define <4 x i32> @insertelt_v4i32_3(<4 x i32> %a, i32 %y) {
16 ; CHECK-LABEL: insertelt_v4i32_3:
17 ; CHECK:       # %bb.0:
18 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
19 ; CHECK-NEXT:    vmv.s.x v9, a0
20 ; CHECK-NEXT:    vslideup.vi v8, v9, 3
21 ; CHECK-NEXT:    ret
22   %b = insertelement <4 x i32> %a, i32 %y, i32 3
23   ret <4 x i32> %b
26 define <4 x i32> @insertelt_v4i32_idx(<4 x i32> %a, i32 %y, i32 zeroext %idx) {
27 ; CHECK-LABEL: insertelt_v4i32_idx:
28 ; CHECK:       # %bb.0:
29 ; CHECK-NEXT:    addi a2, a1, 1
30 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
31 ; CHECK-NEXT:    vmv.s.x v9, a0
32 ; CHECK-NEXT:    vsetvli zero, a2, e32, m1, tu, ma
33 ; CHECK-NEXT:    vslideup.vx v8, v9, a1
34 ; CHECK-NEXT:    ret
35   %b = insertelement <4 x i32> %a, i32 %y, i32 %idx
36   ret <4 x i32> %b
39 define <32 x i32> @insertelt_v32i32_0(<32 x i32> %a, i32 %y) {
40 ; CHECK-LABEL: insertelt_v32i32_0:
41 ; CHECK:       # %bb.0:
42 ; CHECK-NEXT:    li a1, 32
43 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, ma
44 ; CHECK-NEXT:    vmv.s.x v8, a0
45 ; CHECK-NEXT:    ret
46   %b = insertelement <32 x i32> %a, i32 %y, i32 0
47   ret <32 x i32> %b
50 ; FIXME: Should only require an m2 slideup
51 define <32 x i32> @insertelt_v32i32_4(<32 x i32> %a, i32 %y) {
52 ; CHECK-LABEL: insertelt_v32i32_4:
53 ; CHECK:       # %bb.0:
54 ; CHECK-NEXT:    vsetivli zero, 5, e32, m2, tu, ma
55 ; CHECK-NEXT:    vmv.s.x v16, a0
56 ; CHECK-NEXT:    vslideup.vi v8, v16, 4
57 ; CHECK-NEXT:    ret
58   %b = insertelement <32 x i32> %a, i32 %y, i32 4
59   ret <32 x i32> %b
62 define <32 x i32> @insertelt_v32i32_31(<32 x i32> %a, i32 %y) {
63 ; CHECK-LABEL: insertelt_v32i32_31:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    li a1, 32
66 ; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
67 ; CHECK-NEXT:    vmv.s.x v16, a0
68 ; CHECK-NEXT:    vslideup.vi v8, v16, 31
69 ; CHECK-NEXT:    ret
70   %b = insertelement <32 x i32> %a, i32 %y, i32 31
71   ret <32 x i32> %b
74 define <32 x i32> @insertelt_v32i32_idx(<32 x i32> %a, i32 %y, i32 zeroext %idx) {
75 ; CHECK-LABEL: insertelt_v32i32_idx:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    li a2, 32
78 ; CHECK-NEXT:    vsetvli zero, a2, e32, m1, ta, ma
79 ; CHECK-NEXT:    vmv.s.x v16, a0
80 ; CHECK-NEXT:    addi a0, a1, 1
81 ; CHECK-NEXT:    vsetvli zero, a0, e32, m8, tu, ma
82 ; CHECK-NEXT:    vslideup.vx v8, v16, a1
83 ; CHECK-NEXT:    ret
84   %b = insertelement <32 x i32> %a, i32 %y, i32 %idx
85   ret <32 x i32> %b
88 define <64 x i32> @insertelt_v64i32_0(<64 x i32> %a, i32 %y) {
89 ; CHECK-LABEL: insertelt_v64i32_0:
90 ; CHECK:       # %bb.0:
91 ; CHECK-NEXT:    li a1, 32
92 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, ma
93 ; CHECK-NEXT:    vmv.s.x v8, a0
94 ; CHECK-NEXT:    ret
95   %b = insertelement <64 x i32> %a, i32 %y, i32 0
96   ret <64 x i32> %b
99 define <64 x i32> @insertelt_v64i32_63(<64 x i32> %a, i32 %y) {
100 ; CHECK-LABEL: insertelt_v64i32_63:
101 ; CHECK:       # %bb.0:
102 ; CHECK-NEXT:    li a1, 32
103 ; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
104 ; CHECK-NEXT:    vmv.s.x v24, a0
105 ; CHECK-NEXT:    vslideup.vi v16, v24, 31
106 ; CHECK-NEXT:    ret
107   %b = insertelement <64 x i32> %a, i32 %y, i32 63
108   ret <64 x i32> %b
111 define <64 x i32> @insertelt_v64i32_idx(<64 x i32> %a, i32 %y, i32 zeroext %idx) {
112 ; RV32-LABEL: insertelt_v64i32_idx:
113 ; RV32:       # %bb.0:
114 ; RV32-NEXT:    addi sp, sp, -384
115 ; RV32-NEXT:    .cfi_def_cfa_offset 384
116 ; RV32-NEXT:    sw ra, 380(sp) # 4-byte Folded Spill
117 ; RV32-NEXT:    sw s0, 376(sp) # 4-byte Folded Spill
118 ; RV32-NEXT:    .cfi_offset ra, -4
119 ; RV32-NEXT:    .cfi_offset s0, -8
120 ; RV32-NEXT:    addi s0, sp, 384
121 ; RV32-NEXT:    .cfi_def_cfa s0, 0
122 ; RV32-NEXT:    andi sp, sp, -128
123 ; RV32-NEXT:    andi a1, a1, 63
124 ; RV32-NEXT:    slli a1, a1, 2
125 ; RV32-NEXT:    mv a2, sp
126 ; RV32-NEXT:    add a1, a2, a1
127 ; RV32-NEXT:    addi a3, sp, 128
128 ; RV32-NEXT:    li a4, 32
129 ; RV32-NEXT:    vsetvli zero, a4, e32, m8, ta, ma
130 ; RV32-NEXT:    vse32.v v16, (a3)
131 ; RV32-NEXT:    vse32.v v8, (a2)
132 ; RV32-NEXT:    sw a0, 0(a1)
133 ; RV32-NEXT:    vle32.v v8, (a2)
134 ; RV32-NEXT:    vle32.v v16, (a3)
135 ; RV32-NEXT:    addi sp, s0, -384
136 ; RV32-NEXT:    lw ra, 380(sp) # 4-byte Folded Reload
137 ; RV32-NEXT:    lw s0, 376(sp) # 4-byte Folded Reload
138 ; RV32-NEXT:    addi sp, sp, 384
139 ; RV32-NEXT:    ret
141 ; RV64-LABEL: insertelt_v64i32_idx:
142 ; RV64:       # %bb.0:
143 ; RV64-NEXT:    addi sp, sp, -384
144 ; RV64-NEXT:    .cfi_def_cfa_offset 384
145 ; RV64-NEXT:    sd ra, 376(sp) # 8-byte Folded Spill
146 ; RV64-NEXT:    sd s0, 368(sp) # 8-byte Folded Spill
147 ; RV64-NEXT:    .cfi_offset ra, -8
148 ; RV64-NEXT:    .cfi_offset s0, -16
149 ; RV64-NEXT:    addi s0, sp, 384
150 ; RV64-NEXT:    .cfi_def_cfa s0, 0
151 ; RV64-NEXT:    andi sp, sp, -128
152 ; RV64-NEXT:    andi a1, a1, 63
153 ; RV64-NEXT:    slli a1, a1, 2
154 ; RV64-NEXT:    mv a2, sp
155 ; RV64-NEXT:    add a1, a2, a1
156 ; RV64-NEXT:    addi a3, sp, 128
157 ; RV64-NEXT:    li a4, 32
158 ; RV64-NEXT:    vsetvli zero, a4, e32, m8, ta, ma
159 ; RV64-NEXT:    vse32.v v16, (a3)
160 ; RV64-NEXT:    vse32.v v8, (a2)
161 ; RV64-NEXT:    sw a0, 0(a1)
162 ; RV64-NEXT:    vle32.v v8, (a2)
163 ; RV64-NEXT:    vle32.v v16, (a3)
164 ; RV64-NEXT:    addi sp, s0, -384
165 ; RV64-NEXT:    ld ra, 376(sp) # 8-byte Folded Reload
166 ; RV64-NEXT:    ld s0, 368(sp) # 8-byte Folded Reload
167 ; RV64-NEXT:    addi sp, sp, 384
168 ; RV64-NEXT:    ret
169   %b = insertelement <64 x i32> %a, i32 %y, i32 %idx
170   ret <64 x i32> %b
173 ; FIXME: This codegen needs to be improved. These tests previously asserted
174 ; type legalizing the i64 type on RV32.
176 define <4 x i64> @insertelt_v4i64(<4 x i64> %a, i64 %y) {
177 ; RV32-LABEL: insertelt_v4i64:
178 ; RV32:       # %bb.0:
179 ; RV32-NEXT:    vsetivli zero, 2, e32, m2, ta, ma
180 ; RV32-NEXT:    vslide1down.vx v10, v8, a0
181 ; RV32-NEXT:    vslide1down.vx v10, v10, a1
182 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
183 ; RV32-NEXT:    vslideup.vi v8, v10, 3
184 ; RV32-NEXT:    ret
186 ; RV64-LABEL: insertelt_v4i64:
187 ; RV64:       # %bb.0:
188 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
189 ; RV64-NEXT:    vmv.s.x v10, a0
190 ; RV64-NEXT:    vslideup.vi v8, v10, 3
191 ; RV64-NEXT:    ret
192   %b = insertelement <4 x i64> %a, i64 %y, i32 3
193   ret <4 x i64> %b
196 define void @insertelt_v4i64_store(ptr %x, i64 %y) {
197 ; RV32-LABEL: insertelt_v4i64_store:
198 ; RV32:       # %bb.0:
199 ; RV32-NEXT:    sw a2, 28(a0)
200 ; RV32-NEXT:    sw a1, 24(a0)
201 ; RV32-NEXT:    ret
203 ; RV64-LABEL: insertelt_v4i64_store:
204 ; RV64:       # %bb.0:
205 ; RV64-NEXT:    sd a1, 24(a0)
206 ; RV64-NEXT:    ret
207   %a = load <4 x i64>, ptr %x
208   %b = insertelement <4 x i64> %a, i64 %y, i32 3
209   store <4 x i64> %b, ptr %x
210   ret void
213 ; This uses a non-power of 2 type so that it isn't an MVT.
214 ; The align keeps the type legalizer from using a 256 bit load so we must split
215 ; it. This some operations that weren't support for scalable vectors when
216 ; this test was written.
217 define <3 x i64> @insertelt_v3i64(<3 x i64> %a, i64 %y) {
218 ; RV32-LABEL: insertelt_v3i64:
219 ; RV32:       # %bb.0:
220 ; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
221 ; RV32-NEXT:    vslidedown.vi v9, v8, 3
222 ; RV32-NEXT:    vmv.x.s a2, v9
223 ; RV32-NEXT:    vslidedown.vi v9, v8, 2
224 ; RV32-NEXT:    vmv.x.s a3, v9
225 ; RV32-NEXT:    vslidedown.vi v9, v8, 1
226 ; RV32-NEXT:    vmv.x.s a4, v9
227 ; RV32-NEXT:    vmv.x.s a5, v8
228 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
229 ; RV32-NEXT:    vmv.v.x v8, a5
230 ; RV32-NEXT:    vslide1down.vx v8, v8, a4
231 ; RV32-NEXT:    vslide1down.vx v8, v8, a3
232 ; RV32-NEXT:    vslide1down.vx v8, v8, a2
233 ; RV32-NEXT:    vslide1down.vx v8, v8, a0
234 ; RV32-NEXT:    vslide1down.vx v8, v8, a1
235 ; RV32-NEXT:    vslidedown.vi v8, v8, 2
236 ; RV32-NEXT:    ret
238 ; RV64-LABEL: insertelt_v3i64:
239 ; RV64:       # %bb.0:
240 ; RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
241 ; RV64-NEXT:    vslidedown.vi v9, v8, 1
242 ; RV64-NEXT:    vmv.x.s a1, v9
243 ; RV64-NEXT:    vmv.x.s a2, v8
244 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
245 ; RV64-NEXT:    vmv.v.x v8, a2
246 ; RV64-NEXT:    vslide1down.vx v8, v8, a1
247 ; RV64-NEXT:    vslide1down.vx v8, v8, a0
248 ; RV64-NEXT:    vslidedown.vi v8, v8, 1
249 ; RV64-NEXT:    ret
250   %b = insertelement <3 x i64> %a, i64 %y, i32 2
251   ret <3 x i64> %b
254 define void @insertelt_v3i64_store(ptr %x, i64 %y) {
255 ; RV32-LABEL: insertelt_v3i64_store:
256 ; RV32:       # %bb.0:
257 ; RV32-NEXT:    sw a2, 20(a0)
258 ; RV32-NEXT:    sw a1, 16(a0)
259 ; RV32-NEXT:    ret
261 ; RV64-LABEL: insertelt_v3i64_store:
262 ; RV64:       # %bb.0:
263 ; RV64-NEXT:    sd a1, 16(a0)
264 ; RV64-NEXT:    ret
265   %a = load <3 x i64>, ptr %x, align 8
266   %b = insertelement <3 x i64> %a, i64 %y, i32 2
267   store <3 x i64> %b, ptr %x
268   ret void
271 define <16 x i8> @insertelt_v16i8(<16 x i8> %a, i8 %y) {
272 ; CHECK-LABEL: insertelt_v16i8:
273 ; CHECK:       # %bb.0:
274 ; CHECK-NEXT:    vsetivli zero, 15, e8, m1, tu, ma
275 ; CHECK-NEXT:    vmv.s.x v9, a0
276 ; CHECK-NEXT:    vslideup.vi v8, v9, 14
277 ; CHECK-NEXT:    ret
278   %b = insertelement <16 x i8> %a, i8 %y, i32 14
279   ret <16 x i8> %b
282 define void @insertelt_v16i8_store(ptr %x, i8 %y) {
283 ; CHECK-LABEL: insertelt_v16i8_store:
284 ; CHECK:       # %bb.0:
285 ; CHECK-NEXT:    sb a1, 14(a0)
286 ; CHECK-NEXT:    ret
287   %a = load <16 x i8>, ptr %x
288   %b = insertelement <16 x i8> %a, i8 %y, i32 14
289   store <16 x i8> %b, ptr %x
290   ret void
293 define <32 x i16> @insertelt_v32i16(<32 x i16> %a, i16 %y, i32 %idx) {
294 ; RV32-LABEL: insertelt_v32i16:
295 ; RV32:       # %bb.0:
296 ; RV32-NEXT:    li a2, 32
297 ; RV32-NEXT:    vsetvli zero, a2, e16, m1, ta, ma
298 ; RV32-NEXT:    vmv.s.x v12, a0
299 ; RV32-NEXT:    addi a0, a1, 1
300 ; RV32-NEXT:    vsetvli zero, a0, e16, m4, tu, ma
301 ; RV32-NEXT:    vslideup.vx v8, v12, a1
302 ; RV32-NEXT:    ret
304 ; RV64-LABEL: insertelt_v32i16:
305 ; RV64:       # %bb.0:
306 ; RV64-NEXT:    li a2, 32
307 ; RV64-NEXT:    vsetvli zero, a2, e16, m1, ta, ma
308 ; RV64-NEXT:    vmv.s.x v12, a0
309 ; RV64-NEXT:    slli a1, a1, 32
310 ; RV64-NEXT:    srli a1, a1, 32
311 ; RV64-NEXT:    addi a0, a1, 1
312 ; RV64-NEXT:    vsetvli zero, a0, e16, m4, tu, ma
313 ; RV64-NEXT:    vslideup.vx v8, v12, a1
314 ; RV64-NEXT:    ret
315   %b = insertelement <32 x i16> %a, i16 %y, i32 %idx
316   ret <32 x i16> %b
319 define void @insertelt_v32i16_store(ptr %x, i16 %y, i32 %idx) {
320 ; CHECK-LABEL: insertelt_v32i16_store:
321 ; CHECK:       # %bb.0:
322 ; CHECK-NEXT:    andi a2, a2, 31
323 ; CHECK-NEXT:    slli a2, a2, 1
324 ; CHECK-NEXT:    add a0, a0, a2
325 ; CHECK-NEXT:    sh a1, 0(a0)
326 ; CHECK-NEXT:    ret
327   %a = load <32 x i16>, ptr %x
328   %b = insertelement <32 x i16> %a, i16 %y, i32 %idx
329   store <32 x i16> %b, ptr %x
330   ret void
333 define <8 x float> @insertelt_v8f32(<8 x float> %a, float %y, i32 %idx) {
334 ; RV32-LABEL: insertelt_v8f32:
335 ; RV32:       # %bb.0:
336 ; RV32-NEXT:    vsetivli zero, 8, e32, m1, ta, ma
337 ; RV32-NEXT:    vfmv.s.f v10, fa0
338 ; RV32-NEXT:    addi a1, a0, 1
339 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, tu, ma
340 ; RV32-NEXT:    vslideup.vx v8, v10, a0
341 ; RV32-NEXT:    ret
343 ; RV64-LABEL: insertelt_v8f32:
344 ; RV64:       # %bb.0:
345 ; RV64-NEXT:    vsetivli zero, 8, e32, m1, ta, ma
346 ; RV64-NEXT:    vfmv.s.f v10, fa0
347 ; RV64-NEXT:    slli a0, a0, 32
348 ; RV64-NEXT:    srli a0, a0, 32
349 ; RV64-NEXT:    addi a1, a0, 1
350 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, tu, ma
351 ; RV64-NEXT:    vslideup.vx v8, v10, a0
352 ; RV64-NEXT:    ret
353   %b = insertelement <8 x float> %a, float %y, i32 %idx
354   ret <8 x float> %b
357 define void @insertelt_v8f32_store(ptr %x, float %y, i32 %idx) {
358 ; CHECK-LABEL: insertelt_v8f32_store:
359 ; CHECK:       # %bb.0:
360 ; CHECK-NEXT:    andi a1, a1, 7
361 ; CHECK-NEXT:    slli a1, a1, 2
362 ; CHECK-NEXT:    add a0, a0, a1
363 ; CHECK-NEXT:    fsw fa0, 0(a0)
364 ; CHECK-NEXT:    ret
365   %a = load <8 x float>, ptr %x
366   %b = insertelement <8 x float> %a, float %y, i32 %idx
367   store <8 x float> %b, ptr %x
368   ret void
371 define <8 x i64> @insertelt_v8i64_0(<8 x i64> %a, ptr %x) {
372 ; CHECK-LABEL: insertelt_v8i64_0:
373 ; CHECK:       # %bb.0:
374 ; CHECK-NEXT:    li a0, -1
375 ; CHECK-NEXT:    vsetivli zero, 8, e64, m1, tu, ma
376 ; CHECK-NEXT:    vmv.s.x v8, a0
377 ; CHECK-NEXT:    ret
378   %b = insertelement <8 x i64> %a, i64 -1, i32 0
379   ret <8 x i64> %b
382 define void @insertelt_v8i64_0_store(ptr %x) {
383 ; RV32-LABEL: insertelt_v8i64_0_store:
384 ; RV32:       # %bb.0:
385 ; RV32-NEXT:    li a1, -1
386 ; RV32-NEXT:    sw a1, 4(a0)
387 ; RV32-NEXT:    sw a1, 0(a0)
388 ; RV32-NEXT:    ret
390 ; RV64-LABEL: insertelt_v8i64_0_store:
391 ; RV64:       # %bb.0:
392 ; RV64-NEXT:    li a1, -1
393 ; RV64-NEXT:    sd a1, 0(a0)
394 ; RV64-NEXT:    ret
395   %a = load <8 x i64>, ptr %x
396   %b = insertelement <8 x i64> %a, i64 -1, i32 0
397   store <8 x i64> %b, ptr %x
398   ret void
401 define <8 x i64> @insertelt_v8i64(<8 x i64> %a, i32 %idx) {
402 ; RV32-LABEL: insertelt_v8i64:
403 ; RV32:       # %bb.0:
404 ; RV32-NEXT:    vsetivli zero, 8, e64, m1, ta, ma
405 ; RV32-NEXT:    vmv.v.i v12, -1
406 ; RV32-NEXT:    addi a1, a0, 1
407 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, tu, ma
408 ; RV32-NEXT:    vslideup.vx v8, v12, a0
409 ; RV32-NEXT:    ret
411 ; RV64-LABEL: insertelt_v8i64:
412 ; RV64:       # %bb.0:
413 ; RV64-NEXT:    vsetivli zero, 8, e64, m1, ta, ma
414 ; RV64-NEXT:    vmv.v.i v12, -1
415 ; RV64-NEXT:    slli a0, a0, 32
416 ; RV64-NEXT:    srli a0, a0, 32
417 ; RV64-NEXT:    addi a1, a0, 1
418 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, tu, ma
419 ; RV64-NEXT:    vslideup.vx v8, v12, a0
420 ; RV64-NEXT:    ret
421   %b = insertelement <8 x i64> %a, i64 -1, i32 %idx
422   ret <8 x i64> %b
425 define void @insertelt_v8i64_store(ptr %x, i32 %idx) {
426 ; RV32-LABEL: insertelt_v8i64_store:
427 ; RV32:       # %bb.0:
428 ; RV32-NEXT:    andi a1, a1, 7
429 ; RV32-NEXT:    slli a1, a1, 3
430 ; RV32-NEXT:    add a0, a0, a1
431 ; RV32-NEXT:    li a1, -1
432 ; RV32-NEXT:    sw a1, 4(a0)
433 ; RV32-NEXT:    sw a1, 0(a0)
434 ; RV32-NEXT:    ret
436 ; RV64-LABEL: insertelt_v8i64_store:
437 ; RV64:       # %bb.0:
438 ; RV64-NEXT:    andi a1, a1, 7
439 ; RV64-NEXT:    slli a1, a1, 3
440 ; RV64-NEXT:    add a0, a0, a1
441 ; RV64-NEXT:    li a1, -1
442 ; RV64-NEXT:    sd a1, 0(a0)
443 ; RV64-NEXT:    ret
444   %a = load <8 x i64>, ptr %x
445   %b = insertelement <8 x i64> %a, i64 -1, i32 %idx
446   store <8 x i64> %b, ptr %x
447   ret void
450 define <8 x i64> @insertelt_c6_v8i64_0(<8 x i64> %a, ptr %x) {
451 ; CHECK-LABEL: insertelt_c6_v8i64_0:
452 ; CHECK:       # %bb.0:
453 ; CHECK-NEXT:    li a0, 6
454 ; CHECK-NEXT:    vsetivli zero, 8, e64, m1, tu, ma
455 ; CHECK-NEXT:    vmv.s.x v8, a0
456 ; CHECK-NEXT:    ret
457   %b = insertelement <8 x i64> %a, i64 6, i32 0
458   ret <8 x i64> %b
461 define void @insertelt_c6_v8i64_0_store(ptr %x) {
462 ; RV32-LABEL: insertelt_c6_v8i64_0_store:
463 ; RV32:       # %bb.0:
464 ; RV32-NEXT:    sw zero, 4(a0)
465 ; RV32-NEXT:    li a1, 6
466 ; RV32-NEXT:    sw a1, 0(a0)
467 ; RV32-NEXT:    ret
469 ; RV64-LABEL: insertelt_c6_v8i64_0_store:
470 ; RV64:       # %bb.0:
471 ; RV64-NEXT:    li a1, 6
472 ; RV64-NEXT:    sd a1, 0(a0)
473 ; RV64-NEXT:    ret
474   %a = load <8 x i64>, ptr %x
475   %b = insertelement <8 x i64> %a, i64 6, i32 0
476   store <8 x i64> %b, ptr %x
477   ret void
480 define <8 x i64> @insertelt_c6_v8i64(<8 x i64> %a, i32 %idx) {
481 ; RV32-LABEL: insertelt_c6_v8i64:
482 ; RV32:       # %bb.0:
483 ; RV32-NEXT:    vsetivli zero, 8, e64, m1, ta, ma
484 ; RV32-NEXT:    vmv.v.i v12, 6
485 ; RV32-NEXT:    addi a1, a0, 1
486 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, tu, ma
487 ; RV32-NEXT:    vslideup.vx v8, v12, a0
488 ; RV32-NEXT:    ret
490 ; RV64-LABEL: insertelt_c6_v8i64:
491 ; RV64:       # %bb.0:
492 ; RV64-NEXT:    vsetivli zero, 8, e64, m1, ta, ma
493 ; RV64-NEXT:    vmv.v.i v12, 6
494 ; RV64-NEXT:    slli a0, a0, 32
495 ; RV64-NEXT:    srli a0, a0, 32
496 ; RV64-NEXT:    addi a1, a0, 1
497 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, tu, ma
498 ; RV64-NEXT:    vslideup.vx v8, v12, a0
499 ; RV64-NEXT:    ret
500   %b = insertelement <8 x i64> %a, i64 6, i32 %idx
501   ret <8 x i64> %b
504 define void @insertelt_c6_v8i64_store(ptr %x, i32 %idx) {
505 ; RV32-LABEL: insertelt_c6_v8i64_store:
506 ; RV32:       # %bb.0:
507 ; RV32-NEXT:    andi a1, a1, 7
508 ; RV32-NEXT:    slli a1, a1, 3
509 ; RV32-NEXT:    add a0, a0, a1
510 ; RV32-NEXT:    sw zero, 4(a0)
511 ; RV32-NEXT:    li a1, 6
512 ; RV32-NEXT:    sw a1, 0(a0)
513 ; RV32-NEXT:    ret
515 ; RV64-LABEL: insertelt_c6_v8i64_store:
516 ; RV64:       # %bb.0:
517 ; RV64-NEXT:    andi a1, a1, 7
518 ; RV64-NEXT:    slli a1, a1, 3
519 ; RV64-NEXT:    add a0, a0, a1
520 ; RV64-NEXT:    li a1, 6
521 ; RV64-NEXT:    sd a1, 0(a0)
522 ; RV64-NEXT:    ret
523   %a = load <8 x i64>, ptr %x
524   %b = insertelement <8 x i64> %a, i64 6, i32 %idx
525   store <8 x i64> %b, ptr %x
526   ret void
529 ; Test that using a insertelement at element 0 by a later operation doesn't
530 ; crash the compiler.
531 define void @insertelt_c6_v8i64_0_add(ptr %x, ptr %y) {
532 ; CHECK-LABEL: insertelt_c6_v8i64_0_add:
533 ; CHECK:       # %bb.0:
534 ; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
535 ; CHECK-NEXT:    vle64.v v8, (a0)
536 ; CHECK-NEXT:    vle64.v v12, (a1)
537 ; CHECK-NEXT:    li a1, 6
538 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, tu, ma
539 ; CHECK-NEXT:    vmv.s.x v8, a1
540 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
541 ; CHECK-NEXT:    vadd.vv v8, v8, v12
542 ; CHECK-NEXT:    vse64.v v8, (a0)
543 ; CHECK-NEXT:    ret
544   %a = load <8 x i64>, ptr %x
545   %b = insertelement <8 x i64> %a, i64 6, i32 0
546   %c = load <8 x i64>, ptr %y
547   %d = add <8 x i64> %b, %c
548   store <8 x i64> %d, ptr %x
549   ret void
552 ; The next batch of tests cover inserts into high LMUL vectors when the
553 ; exact VLEM is known.  FIXME: These can directly access the sub-registers
555 define <16 x i32> @insertelt_c0_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
556 ; CHECK-LABEL: insertelt_c0_v16xi32_exact:
557 ; CHECK:       # %bb.0:
558 ; CHECK-NEXT:    vsetivli zero, 16, e32, m1, tu, ma
559 ; CHECK-NEXT:    vmv.s.x v8, a0
560 ; CHECK-NEXT:    ret
561   %v = insertelement <16 x i32> %vin, i32 %a, i32 0
562   ret <16 x i32> %v
565 define <16 x i32> @insertelt_c1_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
566 ; CHECK-LABEL: insertelt_c1_v16xi32_exact:
567 ; CHECK:       # %bb.0:
568 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
569 ; CHECK-NEXT:    vmv.s.x v12, a0
570 ; CHECK-NEXT:    vslideup.vi v8, v12, 1
571 ; CHECK-NEXT:    ret
572   %v = insertelement <16 x i32> %vin, i32 %a, i32 1
573   ret <16 x i32> %v
576 define <16 x i32> @insertelt_c2_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
577 ; CHECK-LABEL: insertelt_c2_v16xi32_exact:
578 ; CHECK:       # %bb.0:
579 ; CHECK-NEXT:    vsetivli zero, 3, e32, m1, tu, ma
580 ; CHECK-NEXT:    vmv.s.x v12, a0
581 ; CHECK-NEXT:    vslideup.vi v8, v12, 2
582 ; CHECK-NEXT:    ret
583   %v = insertelement <16 x i32> %vin, i32 %a, i32 2
584   ret <16 x i32> %v
587 define <16 x i32> @insertelt_c3_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
588 ; CHECK-LABEL: insertelt_c3_v16xi32_exact:
589 ; CHECK:       # %bb.0:
590 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, tu, ma
591 ; CHECK-NEXT:    vmv.s.x v12, a0
592 ; CHECK-NEXT:    vslideup.vi v8, v12, 3
593 ; CHECK-NEXT:    ret
594   %v = insertelement <16 x i32> %vin, i32 %a, i32 3
595   ret <16 x i32> %v
598 define <16 x i32> @insertelt_c12_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
599 ; CHECK-LABEL: insertelt_c12_v16xi32_exact:
600 ; CHECK:       # %bb.0:
601 ; CHECK-NEXT:    vsetivli zero, 16, e32, m1, tu, ma
602 ; CHECK-NEXT:    vmv.s.x v11, a0
603 ; CHECK-NEXT:    ret
604   %v = insertelement <16 x i32> %vin, i32 %a, i32 12
605   ret <16 x i32> %v
608 define <16 x i32> @insertelt_c13_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
609 ; CHECK-LABEL: insertelt_c13_v16xi32_exact:
610 ; CHECK:       # %bb.0:
611 ; CHECK-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
612 ; CHECK-NEXT:    vmv.s.x v12, a0
613 ; CHECK-NEXT:    vslideup.vi v11, v12, 1
614 ; CHECK-NEXT:    ret
615   %v = insertelement <16 x i32> %vin, i32 %a, i32 13
616   ret <16 x i32> %v
619 define <16 x i32> @insertelt_c14_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
620 ; CHECK-LABEL: insertelt_c14_v16xi32_exact:
621 ; CHECK:       # %bb.0:
622 ; CHECK-NEXT:    vsetivli zero, 3, e32, m1, tu, ma
623 ; CHECK-NEXT:    vmv.s.x v12, a0
624 ; CHECK-NEXT:    vslideup.vi v11, v12, 2
625 ; CHECK-NEXT:    ret
626   %v = insertelement <16 x i32> %vin, i32 %a, i32 14
627   ret <16 x i32> %v
630 define <16 x i32> @insertelt_c15_v16xi32_exact(<16 x i32> %vin, i32 %a) vscale_range(2,2) {
631 ; CHECK-LABEL: insertelt_c15_v16xi32_exact:
632 ; CHECK:       # %bb.0:
633 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, tu, ma
634 ; CHECK-NEXT:    vmv.s.x v12, a0
635 ; CHECK-NEXT:    vslideup.vi v11, v12, 3
636 ; CHECK-NEXT:    ret
637   %v = insertelement <16 x i32> %vin, i32 %a, i32 15
638   ret <16 x i32> %v
641 define <8 x i64> @insertelt_c4_v8xi64_exact(<8 x i64> %vin, i64 %a) vscale_range(2,2) {
642 ; RV32-LABEL: insertelt_c4_v8xi64_exact:
643 ; RV32:       # %bb.0:
644 ; RV32-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
645 ; RV32-NEXT:    vslide1down.vx v10, v10, a0
646 ; RV32-NEXT:    vslide1down.vx v10, v10, a1
647 ; RV32-NEXT:    ret
649 ; RV64-LABEL: insertelt_c4_v8xi64_exact:
650 ; RV64:       # %bb.0:
651 ; RV64-NEXT:    vsetivli zero, 8, e64, m1, tu, ma
652 ; RV64-NEXT:    vmv.s.x v10, a0
653 ; RV64-NEXT:    ret
654   %v = insertelement <8 x i64> %vin, i64 %a, i32 4
655   ret <8 x i64> %v
658 define <8 x i64> @insertelt_c5_v8xi64_exact(<8 x i64> %vin, i64 %a) vscale_range(2,2) {
659 ; RV32-LABEL: insertelt_c5_v8xi64_exact:
660 ; RV32:       # %bb.0:
661 ; RV32-NEXT:    vsetivli zero, 2, e32, m1, ta, ma
662 ; RV32-NEXT:    vslide1down.vx v12, v8, a0
663 ; RV32-NEXT:    vslide1down.vx v12, v12, a1
664 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, tu, ma
665 ; RV32-NEXT:    vslideup.vi v10, v12, 1
666 ; RV32-NEXT:    ret
668 ; RV64-LABEL: insertelt_c5_v8xi64_exact:
669 ; RV64:       # %bb.0:
670 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, tu, ma
671 ; RV64-NEXT:    vmv.s.x v12, a0
672 ; RV64-NEXT:    vslideup.vi v10, v12, 1
673 ; RV64-NEXT:    ret
674   %v = insertelement <8 x i64> %vin, i64 %a, i32 5
675   ret <8 x i64> %v