@@ -476,6 +476,233 @@ uint32x4x2_t test_vtrnq_u32(uint32x4_t a, uint32x4_t b) {
476
476
// LLVM: ret %struct.uint32x4x2_t {{.*}}
477
477
}
478
478
479
+ uint8x8x2_t test_vuzp_u8 (uint8x8_t a , uint8x8_t b ) {
480
+ return vuzp_u8 (a , b );
481
+
482
+ // CIR-LABEL:vuzp_u8
483
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u8i x 8>>
484
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
485
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 8>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u8i x 8>>
486
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u8i x 8>)
487
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i,
488
+ // CIR-SAME: #cir.int<8> : !s32i, #cir.int<10> : !s32i, #cir.int<12> : !s32i,
489
+ // CIR-SAME: #cir.int<14> : !s32i] : !cir.vector<!u8i x 8>
490
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u8i x 8>, !cir.ptr<!cir.vector<!u8i x 8>>
491
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
492
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 8>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u8i x 8>>
493
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u8i x 8>)
494
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i,
495
+ // CIR-SAME: #cir.int<9> : !s32i, #cir.int<11> : !s32i, #cir.int<13> : !s32i, #cir.int<15> : !s32i] :
496
+ // CIR-SAME: !cir.vector<!u8i x 8>
497
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u8i x 8>, !cir.ptr<!cir.vector<!u8i x 8>>
498
+
499
+ // LLVM: {{.*}}test_vuzp_u8(<8 x i8>{{.*}}[[A:%.*]], <8 x i8>{{.*}}[[B:%.*]])
500
+ // LLVM: [[VTRN:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> [[B]],
501
+ // LLVM-SAME: <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
502
+ // LLVM: store <8 x i8> [[VTRN]], ptr [[RES:%.*]], align 8
503
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<8 x i8>, ptr [[RES]], i64 1
504
+ // LLVM: [[VTRN1:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> [[B]], <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
505
+ // LLVM: store <8 x i8> [[VTRN1]], ptr [[RES1]], align 8
506
+ // LLVM-NEXT: [[RET:%.*]] = load %struct.uint8x8x2_t, ptr {{.*}}
507
+ // LLVM-NEXT: ret %struct.uint8x8x2_t [[RET]]
508
+ }
509
+
510
+ uint16x4x2_t test_vuzp_u16 (uint16x4_t a , uint16x4_t b ) {
511
+ return vuzp_u16 (a , b );
512
+
513
+ // CIR-LABEL: vuzp_u16
514
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u16i x 4>>
515
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
516
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u16i x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u16i x 4>>
517
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u16i x 4>)
518
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i] : !cir.vector<!u16i x 4>
519
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u16i x 4>, !cir.ptr<!cir.vector<!u16i x 4>>
520
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
521
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u16i x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u16i x 4>>
522
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u16i x 4>)
523
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i] :
524
+ // CIR-SAME: !cir.vector<!u16i x 4>
525
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u16i x 4>, !cir.ptr<!cir.vector<!u16i x 4>>
526
+
527
+ // LLVM: {{.*}}test_vuzp_u16(<4 x i16>{{.*}}[[A:%.*]], <4 x i16>{{.*}}[[B:%.*]])
528
+ // LLVM: [[vuzp:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> [[B]],
529
+ // LLVM-SAME: <4 x i32> <i32 0, i32 2, i32 4, i32 6>
530
+ // LLVM: store <4 x i16> [[vuzp]], ptr [[RES:%.*]], align 8
531
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<4 x i16>, ptr [[RES]], i64 1
532
+ // LLVM: [[vuzp1:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> [[B]],
533
+ // LLVM-SAME: <4 x i32> <i32 1, i32 3, i32 5, i32 7>
534
+ // LLVM: store <4 x i16> [[vuzp1]], ptr [[RES1]], align 8
535
+ // LLVM-NEXT: [[RET:%.*]] = load %struct.uint16x4x2_t, ptr {{.*}}
536
+ // LLVM-NEXT: ret %struct.uint16x4x2_t [[RET]]
537
+ }
538
+
539
+ int32x2x2_t test_vuzp_s32 (int32x2_t a , int32x2_t b ) {
540
+ return vuzp_s32 (a , b );
541
+
542
+ // CIR-LABEL: vuzp_s32
543
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!s32i x 2>>
544
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
545
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s32i x 2>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!s32i x 2>>
546
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!s32i x 2>)
547
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i] : !cir.vector<!s32i x 2>
548
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!s32i x 2>, !cir.ptr<!cir.vector<!s32i x 2>>
549
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
550
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s32i x 2>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!s32i x 2>>
551
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!s32i x 2>)
552
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i] :
553
+ // CIR-SAME: !cir.vector<!s32i x 2>
554
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!s32i x 2>, !cir.ptr<!cir.vector<!s32i x 2>>
555
+
556
+ // LLVM: {{.*}}test_vuzp_s32(<2 x i32>{{.*}}[[A:%.*]], <2 x i32>{{.*}}[[B:%.*]])
557
+ // LLVM: [[vuzp:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> [[B]],
558
+ // LLVM-SAME: <2 x i32> <i32 0, i32 2>
559
+ // LLVM: store <2 x i32> [[vuzp]], ptr [[RES:%.*]], align 8
560
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<2 x i32>, ptr [[RES]], i64 1
561
+ // LLVM: [[vuzp1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> [[B]],
562
+ // LLVM-SAME: <2 x i32> <i32 1, i32 3>
563
+ // LLVM: store <2 x i32> [[vuzp1]], ptr [[RES1]], align 8
564
+ // LLVM-NEXT: [[RET:%.*]] = load %struct.int32x2x2_t, ptr {{.*}}
565
+ // LLVM-NEXT: ret %struct.int32x2x2_t [[RET]]
566
+ }
567
+
568
+ float32x2x2_t test_vuzp_f32 (float32x2_t a , float32x2_t b ) {
569
+ return vuzp_f32 (a , b );
570
+
571
+ // CIR-LABEL: vuzp_f32
572
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!cir.float x 2>>
573
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
574
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 2>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 2>>
575
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!cir.float x 2>)
576
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i] : !cir.vector<!cir.float x 2>
577
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
578
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
579
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 2>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 2>>
580
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!cir.float x 2>)
581
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i] :
582
+ // CIR-SAME: !cir.vector<!cir.float x 2>
583
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
584
+
585
+ // LLVM: {{.*}}test_vuzp_f32(<2 x float>{{.*}}[[A:%.*]], <2 x float>{{.*}}[[B:%.*]])
586
+ // LLVM: [[vuzp:%.*]] = shufflevector <2 x float> [[A]], <2 x float> [[B]],
587
+ // LLVM-SAME: <2 x i32> <i32 0, i32 2>
588
+ // LLVM: store <2 x float> [[vuzp]], ptr [[RES:%.*]], align 8
589
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<2 x float>, ptr [[RES]], i64 1
590
+ // LLVM: [[vuzp1:%.*]] = shufflevector <2 x float> [[A]], <2 x float> [[B]],
591
+ // LLVM-SAME: <2 x i32> <i32 1, i32 3>
592
+ // LLVM: store <2 x float> [[vuzp1]], ptr [[RES1]], align 8
593
+ // LLVM-NEXT: [[RET:%.*]] = load %struct.float32x2x2_t, ptr {{.*}}
594
+ // LLVM-NEXT: ret %struct.float32x2x2_t [[RET]]
595
+ }
596
+
597
+ uint8x16x2_t test_vuzpq_u8 (uint8x16_t a , uint8x16_t b ) {
598
+ return vuzpq_u8 (a , b );
599
+
600
+ // CIR-LABEL: vuzpq_u8
601
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u8i x 16>>
602
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
603
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 16>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u8i x 16>>
604
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u8i x 16>)
605
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i,
606
+ // CIR-SAME: #cir.int<8> : !s32i, #cir.int<10> : !s32i, #cir.int<12> : !s32i, #cir.int<14> : !s32i,
607
+ // CIR-SAME: #cir.int<16> : !s32i, #cir.int<18> : !s32i, #cir.int<20> : !s32i, #cir.int<22> : !s32i,
608
+ // CIR-SAME: #cir.int<24> : !s32i, #cir.int<26> : !s32i, #cir.int<28> : !s32i, #cir.int<30> : !s32i] : !cir.vector<!u8i x 16>
609
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u8i x 16>, !cir.ptr<!cir.vector<!u8i x 16>>
610
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
611
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 16>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u8i x 16>>
612
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u8i x 16>)
613
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i,
614
+ // CIR-SAME: #cir.int<9> : !s32i, #cir.int<11> : !s32i, #cir.int<13> : !s32i, #cir.int<15> : !s32i,
615
+ // CIR-SAME: #cir.int<17> : !s32i, #cir.int<19> : !s32i, #cir.int<21> : !s32i, #cir.int<23> : !s32i,
616
+ // CIR-SAME: #cir.int<25> : !s32i, #cir.int<27> : !s32i, #cir.int<29> : !s32i, #cir.int<31> : !s32i] : !cir.vector<!u8i x 16>
617
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u8i x 16>, !cir.ptr<!cir.vector<!u8i x 16>>
618
+
619
+ // LLVM: {{.*}}test_vuzpq_u8(<16 x i8>{{.*}}[[A:%.*]], <16 x i8>{{.*}}[[B:%.*]])
620
+ // LLVM: [[vuzp:%.*]] = shufflevector <16 x i8> [[A]], <16 x i8> [[B]],
621
+ // LLVM-SAME: <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14,
622
+ // LLVM-SAME: i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
623
+ // LLVM: store <16 x i8> [[vuzp]], ptr [[RES:%.*]], align 16
624
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<16 x i8>, ptr [[RES]], i64 1
625
+ // LLVM: [[vuzp1:%.*]] = shufflevector <16 x i8> [[A]], <16 x i8> [[B]],
626
+ // LLVM-SAME: <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15,
627
+ // LLVM-SAME: i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
628
+ // LLVM: store <16 x i8> [[vuzp1]], ptr [[RES1]], align 16
629
+ // LLVM-NEXT: [[RET:%.*]] = load %struct.uint8x16x2_t, ptr {{.*}}
630
+ // LLVM-NEXT: ret %struct.uint8x16x2_t [[RET]]
631
+ }
632
+
633
+ int16x8x2_t test_vuzpq_s16 (int16x8_t a , int16x8_t b ) {
634
+ return vuzpq_s16 (a , b );
635
+
636
+ // CIR-LABEL: vuzpq_s16
637
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!s16i x 8>>
638
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
639
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s16i x 8>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!s16i x 8>>
640
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!s16i x 8>)
641
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i,
642
+ // CIR-SAME: #cir.int<8> : !s32i, #cir.int<10> : !s32i, #cir.int<12> : !s32i,
643
+ // CIR-SAME: #cir.int<14> : !s32i] : !cir.vector<!s16i x 8>
644
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!s16i x 8>, !cir.ptr<!cir.vector<!s16i x 8>>
645
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
646
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s16i x 8>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!s16i x 8>>
647
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!s16i x 8>)
648
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i,
649
+ // CIR-SAME: #cir.int<9> : !s32i, #cir.int<11> : !s32i, #cir.int<13> : !s32i,
650
+ // CIR-SAME: #cir.int<15> : !s32i] : !cir.vector<!s16i x 8>
651
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!s16i x 8>, !cir.ptr<!cir.vector<!s16i x 8>>
652
+
653
+ // LLVM: {{.*}}test_vuzpq_s16(<8 x i16>{{.*}}[[A:%.*]], <8 x i16>{{.*}}[[B:%.*]])
654
+ // LLVM: [[vuzp:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]],
655
+ // LLVM-SAME: <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
656
+ // LLVM: store <8 x i16> [[vuzp]], ptr [[RES:%.*]], align 16
657
+ // LLVM: [[RES1:%.*]] = getelementptr {{.*}}<8 x i16>, ptr [[RES]], i64 1
658
+ // LLVM: [[vuzp1:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
659
+ // LLVM: store <8 x i16> [[vuzp1]], ptr [[RES1]], align 16
660
+ // LLVM: [[RET:%.*]] = load %struct.int16x8x2_t, ptr {{.*}}
661
+ // LLVM-NEXT: ret %struct.int16x8x2_t [[RET]]
662
+ }
663
+
664
+ uint32x4x2_t test_vuzpq_u32 (uint32x4_t a , uint32x4_t b ) {
665
+ return vuzpq_u32 (a , b );
666
+
667
+ // CIR-LABEL: vuzpq_u32
668
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u32i x 4>>
669
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
670
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u32i x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u32i x 4>>
671
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u32i x 4>)
672
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i] :
673
+ // CIR-SAME: !cir.vector<!u32i x 4>
674
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u32i x 4>, !cir.ptr<!cir.vector<!u32i x 4>>
675
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
676
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u32i x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u32i x 4>>
677
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u32i x 4>)
678
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i] :
679
+ // CIR-SAME: !cir.vector<!u32i x 4>
680
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u32i x 4>, !cir.ptr<!cir.vector<!u32i x 4>>
681
+ // LLVM: [[RET:%.*]] = load %struct.uint32x4x2_t, ptr {{.*}}
682
+ // LLVM-NEXT: ret %struct.uint32x4x2_t [[RET]]
683
+ }
684
+
685
+ float32x4x2_t test_vuzpq_f32 (float32x4_t a , float32x4_t b ) {
686
+ return vuzpq_f32 (a , b );
687
+
688
+ // CIR-LABEL: vuzpq_f32
689
+ // CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!cir.float x 4>>
690
+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
691
+ // CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 4>>
692
+ // CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!cir.float x 4>)
693
+ // CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i, #cir.int<4> : !s32i, #cir.int<6> : !s32i] :
694
+ // CIR-SAME: !cir.vector<!cir.float x 4>
695
+ // CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>
696
+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
697
+ // CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 4>>
698
+ // CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!cir.float x 4>)
699
+ // CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i, #cir.int<5> : !s32i, #cir.int<7> : !s32i] :
700
+ // CIR-SAME: !cir.vector<!cir.float x 4>
701
+ // CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>
702
+ // LLVM: [[RET:%.*]] = load %struct.float32x4x2_t, ptr {{.*}}
703
+ // LLVM-NEXT: ret %struct.float32x4x2_t [[RET]]
704
+ }
705
+
479
706
uint8x8_t test_vqmovun_s16 (int16x8_t a ) {
480
707
return vqmovun_s16 (a );
481
708
0 commit comments