@@ -352,6 +352,81 @@ entry:
352352 ret void
353353}
354354
355+ define void @buildvector_v32i8_partial (ptr %dst , i8 %a0 , i8 %a1 , i8 %a2 , i8 %a5 , i8 %a7 , i8 %a8 , i8 %a15 , i8 %a17 , i8 %a18 , i8 %a20 , i8 %a22 , i8 %a23 , i8 %a27 , i8 %a28 , i8 %a31 ) nounwind {
356+ ; CHECK-LABEL: buildvector_v32i8_partial:
357+ ; CHECK: # %bb.0: # %entry
358+ ; CHECK-NEXT: addi.d $sp, $sp, -96
359+ ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
360+ ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
361+ ; CHECK-NEXT: addi.d $fp, $sp, 96
362+ ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
363+ ; CHECK-NEXT: ld.b $t0, $fp, 0
364+ ; CHECK-NEXT: ld.b $t1, $fp, 8
365+ ; CHECK-NEXT: ld.b $t2, $fp, 16
366+ ; CHECK-NEXT: ld.b $t3, $fp, 24
367+ ; CHECK-NEXT: ld.b $t4, $fp, 56
368+ ; CHECK-NEXT: ld.b $t5, $fp, 48
369+ ; CHECK-NEXT: ld.b $t6, $fp, 40
370+ ; CHECK-NEXT: ld.b $t7, $fp, 32
371+ ; CHECK-NEXT: st.b $t4, $sp, 63
372+ ; CHECK-NEXT: st.b $t5, $sp, 60
373+ ; CHECK-NEXT: st.b $t6, $sp, 59
374+ ; CHECK-NEXT: st.b $t7, $sp, 55
375+ ; CHECK-NEXT: st.b $t3, $sp, 54
376+ ; CHECK-NEXT: st.b $t2, $sp, 52
377+ ; CHECK-NEXT: st.b $t1, $sp, 50
378+ ; CHECK-NEXT: st.b $t0, $sp, 49
379+ ; CHECK-NEXT: st.b $a7, $sp, 47
380+ ; CHECK-NEXT: st.b $a6, $sp, 40
381+ ; CHECK-NEXT: st.b $a5, $sp, 39
382+ ; CHECK-NEXT: st.b $a4, $sp, 37
383+ ; CHECK-NEXT: st.b $a3, $sp, 34
384+ ; CHECK-NEXT: st.b $a2, $sp, 33
385+ ; CHECK-NEXT: st.b $a1, $sp, 32
386+ ; CHECK-NEXT: xvld $xr0, $sp, 32
387+ ; CHECK-NEXT: xvst $xr0, $a0, 0
388+ ; CHECK-NEXT: addi.d $sp, $fp, -96
389+ ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
390+ ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
391+ ; CHECK-NEXT: addi.d $sp, $sp, 96
392+ ; CHECK-NEXT: ret
393+ entry:
394+ %ins0 = insertelement <32 x i8 > undef , i8 %a0 , i32 0
395+ %ins1 = insertelement <32 x i8 > %ins0 , i8 %a1 , i32 1
396+ %ins2 = insertelement <32 x i8 > %ins1 , i8 %a2 , i32 2
397+ %ins3 = insertelement <32 x i8 > %ins2 , i8 undef , i32 3
398+ %ins4 = insertelement <32 x i8 > %ins3 , i8 undef , i32 4
399+ %ins5 = insertelement <32 x i8 > %ins4 , i8 %a5 , i32 5
400+ %ins6 = insertelement <32 x i8 > %ins5 , i8 undef , i32 6
401+ %ins7 = insertelement <32 x i8 > %ins6 , i8 %a7 , i32 7
402+ %ins8 = insertelement <32 x i8 > %ins7 , i8 %a8 , i32 8
403+ %ins9 = insertelement <32 x i8 > %ins8 , i8 undef , i32 9
404+ %ins10 = insertelement <32 x i8 > %ins9 , i8 undef , i32 10
405+ %ins11 = insertelement <32 x i8 > %ins10 , i8 undef , i32 11
406+ %ins12 = insertelement <32 x i8 > %ins11 , i8 undef , i32 12
407+ %ins13 = insertelement <32 x i8 > %ins12 , i8 undef , i32 13
408+ %ins14 = insertelement <32 x i8 > %ins13 , i8 undef , i32 14
409+ %ins15 = insertelement <32 x i8 > %ins14 , i8 %a15 , i32 15
410+ %ins16 = insertelement <32 x i8 > %ins15 , i8 undef , i32 16
411+ %ins17 = insertelement <32 x i8 > %ins16 , i8 %a17 , i32 17
412+ %ins18 = insertelement <32 x i8 > %ins17 , i8 %a18 , i32 18
413+ %ins19 = insertelement <32 x i8 > %ins18 , i8 undef , i32 19
414+ %ins20 = insertelement <32 x i8 > %ins19 , i8 %a20 , i32 20
415+ %ins21 = insertelement <32 x i8 > %ins20 , i8 undef , i32 21
416+ %ins22 = insertelement <32 x i8 > %ins21 , i8 %a22 , i32 22
417+ %ins23 = insertelement <32 x i8 > %ins22 , i8 %a23 , i32 23
418+ %ins24 = insertelement <32 x i8 > %ins23 , i8 undef , i32 24
419+ %ins25 = insertelement <32 x i8 > %ins24 , i8 undef , i32 25
420+ %ins26 = insertelement <32 x i8 > %ins25 , i8 undef , i32 26
421+ %ins27 = insertelement <32 x i8 > %ins26 , i8 %a27 , i32 27
422+ %ins28 = insertelement <32 x i8 > %ins27 , i8 %a28 , i32 28
423+ %ins29 = insertelement <32 x i8 > %ins28 , i8 undef , i32 29
424+ %ins30 = insertelement <32 x i8 > %ins29 , i8 undef , i32 30
425+ %ins31 = insertelement <32 x i8 > %ins30 , i8 %a31 , i32 31
426+ store <32 x i8 > %ins31 , ptr %dst
427+ ret void
428+ }
429+
355430define void @buildvector_v16i16 (ptr %dst , i16 %a0 , i16 %a1 , i16 %a2 , i16 %a3 , i16 %a4 , i16 %a5 , i16 %a6 , i16 %a7 , i16 %a8 , i16 %a9 , i16 %a10 , i16 %a11 , i16 %a12 , i16 %a13 , i16 %a14 , i16 %a15 ) nounwind {
356431; CHECK-LABEL: buildvector_v16i16:
357432; CHECK: # %bb.0: # %entry
@@ -419,6 +494,49 @@ entry:
419494 ret void
420495}
421496
497+ define void @buildvector_v16i16_partial (ptr %dst , i16 %a0 , i16 %a2 , i16 %a5 , i16 %a6 , i16 %a7 , i16 %a12 , i16 %a13 ) nounwind {
498+ ; CHECK-LABEL: buildvector_v16i16_partial:
499+ ; CHECK: # %bb.0: # %entry
500+ ; CHECK-NEXT: addi.d $sp, $sp, -96
501+ ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
502+ ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
503+ ; CHECK-NEXT: addi.d $fp, $sp, 96
504+ ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
505+ ; CHECK-NEXT: st.h $a7, $sp, 58
506+ ; CHECK-NEXT: st.h $a6, $sp, 56
507+ ; CHECK-NEXT: st.h $a5, $sp, 46
508+ ; CHECK-NEXT: st.h $a4, $sp, 44
509+ ; CHECK-NEXT: st.h $a3, $sp, 42
510+ ; CHECK-NEXT: st.h $a2, $sp, 36
511+ ; CHECK-NEXT: st.h $a1, $sp, 32
512+ ; CHECK-NEXT: xvld $xr0, $sp, 32
513+ ; CHECK-NEXT: xvst $xr0, $a0, 0
514+ ; CHECK-NEXT: addi.d $sp, $fp, -96
515+ ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
516+ ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
517+ ; CHECK-NEXT: addi.d $sp, $sp, 96
518+ ; CHECK-NEXT: ret
519+ entry:
520+ %ins0 = insertelement <16 x i16 > undef , i16 %a0 , i32 0
521+ %ins1 = insertelement <16 x i16 > %ins0 , i16 undef , i32 1
522+ %ins2 = insertelement <16 x i16 > %ins1 , i16 %a2 , i32 2
523+ %ins3 = insertelement <16 x i16 > %ins2 , i16 undef , i32 3
524+ %ins4 = insertelement <16 x i16 > %ins3 , i16 undef , i32 4
525+ %ins5 = insertelement <16 x i16 > %ins4 , i16 %a5 , i32 5
526+ %ins6 = insertelement <16 x i16 > %ins5 , i16 %a6 , i32 6
527+ %ins7 = insertelement <16 x i16 > %ins6 , i16 %a7 , i32 7
528+ %ins8 = insertelement <16 x i16 > %ins7 , i16 undef , i32 8
529+ %ins9 = insertelement <16 x i16 > %ins8 , i16 undef , i32 9
530+ %ins10 = insertelement <16 x i16 > %ins9 , i16 undef , i32 10
531+ %ins11 = insertelement <16 x i16 > %ins10 , i16 undef , i32 11
532+ %ins12 = insertelement <16 x i16 > %ins11 , i16 %a12 , i32 12
533+ %ins13 = insertelement <16 x i16 > %ins12 , i16 %a13 , i32 13
534+ %ins14 = insertelement <16 x i16 > %ins13 , i16 undef , i32 14
535+ %ins15 = insertelement <16 x i16 > %ins14 , i16 undef , i32 15
536+ store <16 x i16 > %ins15 , ptr %dst
537+ ret void
538+ }
539+
422540define void @buildvector_v8i32 (ptr %dst , i32 %a0 , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 , i32 %a5 , i32 %a6 , i32 %a7 ) nounwind {
423541; CHECK-LABEL: buildvector_v8i32:
424542; CHECK: # %bb.0: # %entry
@@ -446,6 +564,38 @@ entry:
446564 ret void
447565}
448566
567+ define void @buildvector_v8i32_partial (ptr %dst , i32 %a2 , i32 %a4 , i32 %a5 , i32 %a6 ) nounwind {
568+ ; CHECK-LABEL: buildvector_v8i32_partial:
569+ ; CHECK: # %bb.0: # %entry
570+ ; CHECK-NEXT: addi.d $sp, $sp, -96
571+ ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
572+ ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
573+ ; CHECK-NEXT: addi.d $fp, $sp, 96
574+ ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
575+ ; CHECK-NEXT: st.w $a4, $sp, 56
576+ ; CHECK-NEXT: st.w $a3, $sp, 52
577+ ; CHECK-NEXT: st.w $a2, $sp, 48
578+ ; CHECK-NEXT: st.w $a1, $sp, 40
579+ ; CHECK-NEXT: xvld $xr0, $sp, 32
580+ ; CHECK-NEXT: xvst $xr0, $a0, 0
581+ ; CHECK-NEXT: addi.d $sp, $fp, -96
582+ ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
583+ ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
584+ ; CHECK-NEXT: addi.d $sp, $sp, 96
585+ ; CHECK-NEXT: ret
586+ entry:
587+ %ins0 = insertelement <8 x i32 > undef , i32 undef , i32 0
588+ %ins1 = insertelement <8 x i32 > %ins0 , i32 undef , i32 1
589+ %ins2 = insertelement <8 x i32 > %ins1 , i32 %a2 , i32 2
590+ %ins3 = insertelement <8 x i32 > %ins2 , i32 undef , i32 3
591+ %ins4 = insertelement <8 x i32 > %ins3 , i32 %a4 , i32 4
592+ %ins5 = insertelement <8 x i32 > %ins4 , i32 %a5 , i32 5
593+ %ins6 = insertelement <8 x i32 > %ins5 , i32 %a6 , i32 6
594+ %ins7 = insertelement <8 x i32 > %ins6 , i32 undef , i32 7
595+ store <8 x i32 > %ins7 , ptr %dst
596+ ret void
597+ }
598+
449599define void @buildvector_v4i64 (ptr %dst , i64 %a0 , i64 %a1 , i64 %a2 , i64 %a3 ) nounwind {
450600; CHECK-LABEL: buildvector_v4i64:
451601; CHECK: # %bb.0: # %entry
@@ -464,6 +614,25 @@ entry:
464614 ret void
465615}
466616
617+ define void @buildvector_v4i64_partial (ptr %dst , i64 %a1 , i64 %a2 ) nounwind {
618+ ; CHECK-LABEL: buildvector_v4i64_partial:
619+ ; CHECK: # %bb.0: # %entry
620+ ; CHECK-NEXT: xvinsgr2vr.d $xr0, $a2, 0
621+ ; CHECK-NEXT: xvpermi.d $xr0, $xr0, 68
622+ ; CHECK-NEXT: xvinsgr2vr.d $xr1, $a1, 0
623+ ; CHECK-NEXT: xvpermi.d $xr1, $xr1, 68
624+ ; CHECK-NEXT: xvpackev.d $xr0, $xr1, $xr0
625+ ; CHECK-NEXT: xvst $xr0, $a0, 0
626+ ; CHECK-NEXT: ret
627+ entry:
628+ %ins0 = insertelement <4 x i64 > undef , i64 undef , i32 0
629+ %ins1 = insertelement <4 x i64 > %ins0 , i64 %a1 , i32 1
630+ %ins2 = insertelement <4 x i64 > %ins1 , i64 %a2 , i32 2
631+ %ins3 = insertelement <4 x i64 > %ins2 , i64 undef , i32 3
632+ store <4 x i64 > %ins3 , ptr %dst
633+ ret void
634+ }
635+
467636define void @buildvector_v8f32 (ptr %dst , float %a0 , float %a1 , float %a2 , float %a3 , float %a4 , float %a5 , float %a6 , float %a7 ) nounwind {
468637; CHECK-LABEL: buildvector_v8f32:
469638; CHECK: # %bb.0: # %entry
@@ -497,6 +666,38 @@ entry:
497666 ret void
498667}
499668
669+ define void @buildvector_v8f32_partial (ptr %dst , float %a1 , float %a2 , float %a5 , float %a7 ) nounwind {
670+ ; CHECK-LABEL: buildvector_v8f32_partial:
671+ ; CHECK: # %bb.0: # %entry
672+ ; CHECK-NEXT: addi.d $sp, $sp, -96
673+ ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
674+ ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
675+ ; CHECK-NEXT: addi.d $fp, $sp, 96
676+ ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
677+ ; CHECK-NEXT: fst.s $fa3, $sp, 60
678+ ; CHECK-NEXT: fst.s $fa2, $sp, 52
679+ ; CHECK-NEXT: fst.s $fa1, $sp, 40
680+ ; CHECK-NEXT: fst.s $fa0, $sp, 36
681+ ; CHECK-NEXT: xvld $xr0, $sp, 32
682+ ; CHECK-NEXT: xvst $xr0, $a0, 0
683+ ; CHECK-NEXT: addi.d $sp, $fp, -96
684+ ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
685+ ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
686+ ; CHECK-NEXT: addi.d $sp, $sp, 96
687+ ; CHECK-NEXT: ret
688+ entry:
689+ %ins0 = insertelement <8 x float > undef , float undef , i32 0
690+ %ins1 = insertelement <8 x float > %ins0 , float %a1 , i32 1
691+ %ins2 = insertelement <8 x float > %ins1 , float %a2 , i32 2
692+ %ins3 = insertelement <8 x float > %ins2 , float undef , i32 3
693+ %ins4 = insertelement <8 x float > %ins3 , float undef , i32 4
694+ %ins5 = insertelement <8 x float > %ins4 , float %a5 , i32 5
695+ %ins6 = insertelement <8 x float > %ins5 , float undef , i32 6
696+ %ins7 = insertelement <8 x float > %ins6 , float %a7 , i32 7
697+ store <8 x float > %ins7 , ptr %dst
698+ ret void
699+ }
700+
500701define void @buildvector_v4f64 (ptr %dst , double %a0 , double %a1 , double %a2 , double %a3 ) nounwind {
501702; CHECK-LABEL: buildvector_v4f64:
502703; CHECK: # %bb.0: # %entry
@@ -517,3 +718,22 @@ entry:
517718 store <4 x double > %ins3 , ptr %dst
518719 ret void
519720}
721+
722+ define void @buildvector_v4f64_partial (ptr %dst , double %a0 , double %a3 ) nounwind {
723+ ; CHECK-LABEL: buildvector_v4f64_partial:
724+ ; CHECK: # %bb.0: # %entry
725+ ; CHECK-NEXT: # kill: def $f1_64 killed $f1_64 def $xr1
726+ ; CHECK-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
727+ ; CHECK-NEXT: xvpermi.d $xr0, $xr0, 68
728+ ; CHECK-NEXT: xvpermi.d $xr1, $xr1, 68
729+ ; CHECK-NEXT: xvpackev.d $xr0, $xr1, $xr0
730+ ; CHECK-NEXT: xvst $xr0, $a0, 0
731+ ; CHECK-NEXT: ret
732+ entry:
733+ %ins0 = insertelement <4 x double > undef , double %a0 , i32 0
734+ %ins1 = insertelement <4 x double > %ins0 , double undef , i32 1
735+ %ins2 = insertelement <4 x double > %ins1 , double undef , i32 2
736+ %ins3 = insertelement <4 x double > %ins2 , double %a3 , i32 3
737+ store <4 x double > %ins3 , ptr %dst
738+ ret void
739+ }
0 commit comments