Skip to content

Commit 53335ae

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower neon_vuzp_v and neon_vuzpq_v (#1314)
Lowering `builtin_neon_vuzp_v` and `builtin_neon_vuzpq_v` [Clang CGBuiltin Implementation](https://github.com/llvm/clangir/blob/2b1a638ea07ca10c5727ea835bfbe17b881175cc/clang/lib/CodeGen/CGBuiltin.cpp#L8606-L8622)
1 parent a7383c9 commit 53335ae

File tree

2 files changed

+247
-1
lines changed

2 files changed

+247
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4571,7 +4571,26 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
45714571
}
45724572
case NEON::BI__builtin_neon_vuzp_v:
45734573
case NEON::BI__builtin_neon_vuzpq_v: {
4574-
llvm_unreachable("NEON::BI__builtin_neon_vuzpq_v NYI");
4574+
Ops[1] = builder.createBitcast(Ops[1], ty);
4575+
Ops[2] = builder.createBitcast(Ops[2], ty);
4576+
// Adding a bitcast here as Ops[0] might be a void pointer.
4577+
mlir::Value baseAddr =
4578+
builder.createBitcast(Ops[0], builder.getPointerTo(ty));
4579+
mlir::Value sv;
4580+
mlir::Location loc = getLoc(E->getExprLoc());
4581+
4582+
for (unsigned vi = 0; vi != 2; ++vi) {
4583+
llvm::SmallVector<int64_t, 16> indices;
4584+
for (unsigned i = 0, e = vTy.getSize(); i != e; ++i) {
4585+
indices.push_back(2 * i + vi);
4586+
}
4587+
cir::ConstantOp idx = builder.getConstInt(loc, SInt32Ty, vi);
4588+
mlir::Value addr = builder.create<cir::PtrStrideOp>(
4589+
loc, baseAddr.getType(), baseAddr, idx);
4590+
sv = builder.createVecShuffle(loc, Ops[1], Ops[2], indices);
4591+
(void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
4592+
}
4593+
return sv;
45754594
}
45764595
case NEON::BI__builtin_neon_vzip_v:
45774596
case NEON::BI__builtin_neon_vzipq_v: {

clang/test/CIR/CodeGen/AArch64/neon-misc.c

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,233 @@ uint32x4x2_t test_vtrnq_u32(uint32x4_t a, uint32x4_t b) {
476476
// LLVM: ret %struct.uint32x4x2_t {{.*}}
477477
}
478478

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+
479706
uint8x8_t test_vqmovun_s16(int16x8_t a) {
480707
return vqmovun_s16(a);
481708

0 commit comments

Comments
 (0)