Skip to content

Commit a5121e1

Browse files
AmrDeveloperlanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vzip_v and neon_vzipq_v (llvm#1320)
Lowering `builtin_neon_vzip_v` and `builtin_neon_vzipq_v` [Clang CGBuiltin Implementation](https://github.com/llvm/clangir/blob/2b1a638ea07ca10c5727ea835bfbe17b881175cc/clang/lib/CodeGen/CGBuiltin.cpp#L8628-L8644)
1 parent 88ef039 commit a5121e1

File tree

2 files changed

+248
-1
lines changed

2 files changed

+248
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4594,7 +4594,27 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
45944594
}
45954595
case NEON::BI__builtin_neon_vzip_v:
45964596
case NEON::BI__builtin_neon_vzipq_v: {
4597-
llvm_unreachable("NEON::BI__builtin_neon_vzipq_v NYI");
4597+
Ops[1] = builder.createBitcast(Ops[1], ty);
4598+
Ops[2] = builder.createBitcast(Ops[2], ty);
4599+
// Adding a bitcast here as Ops[0] might be a void pointer.
4600+
mlir::Value baseAddr =
4601+
builder.createBitcast(Ops[0], builder.getPointerTo(ty));
4602+
mlir::Value sv;
4603+
mlir::Location loc = getLoc(E->getExprLoc());
4604+
4605+
for (unsigned vi = 0; vi != 2; ++vi) {
4606+
llvm::SmallVector<int64_t, 16> indices;
4607+
for (unsigned i = 0, e = vTy.getSize(); i != e; i += 2) {
4608+
indices.push_back((i + vi * e) >> 1);
4609+
indices.push_back(((i + vi * e) >> 1) + e);
4610+
}
4611+
cir::ConstantOp idx = builder.getConstInt(loc, SInt32Ty, vi);
4612+
mlir::Value addr = builder.create<cir::PtrStrideOp>(
4613+
loc, baseAddr.getType(), baseAddr, idx);
4614+
sv = builder.createVecShuffle(loc, Ops[1], Ops[2], indices);
4615+
(void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
4616+
}
4617+
return sv;
45984618
}
45994619
case NEON::BI__builtin_neon_vqtbl1q_v: {
46004620
llvm_unreachable("NEON::BI__builtin_neon_vqtbl1q_v NYI");

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

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,233 @@ float32x4x2_t test_vuzpq_f32(float32x4_t a, float32x4_t b) {
704704
// LLVM-NEXT: ret %struct.float32x4x2_t [[RET]]
705705
}
706706

707+
uint8x8x2_t test_vzip_u8(uint8x8_t a, uint8x8_t b) {
708+
return vzip_u8(a, b);
709+
710+
// CIR-LABEL:vzip_u8
711+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u8i x 8>>
712+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
713+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 8>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u8i x 8>>
714+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u8i x 8>)
715+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<8> : !s32i, #cir.int<1> : !s32i, #cir.int<9> : !s32i,
716+
// CIR-SAME: #cir.int<2> : !s32i, #cir.int<10> : !s32i, #cir.int<3> : !s32i,
717+
// CIR-SAME: #cir.int<11> : !s32i] : !cir.vector<!u8i x 8>
718+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u8i x 8>, !cir.ptr<!cir.vector<!u8i x 8>>
719+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
720+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 8>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u8i x 8>>
721+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u8i x 8>)
722+
// CIR-SAME: [#cir.int<4> : !s32i, #cir.int<12> : !s32i, #cir.int<5> : !s32i, #cir.int<13> : !s32i,
723+
// CIR-SAME: #cir.int<6> : !s32i, #cir.int<14> : !s32i, #cir.int<7> : !s32i,
724+
// CIR-SAME: #cir.int<15> : !s32i] : !cir.vector<!u8i x 8>
725+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u8i x 8>, !cir.ptr<!cir.vector<!u8i x 8>>
726+
727+
// LLVM: {{.*}}test_vzip_u8(<8 x i8>{{.*}}[[A:%.*]], <8 x i8>{{.*}}[[B:%.*]])
728+
// LLVM: [[VTRN:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> [[B]],
729+
// LLVM-SAME: <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
730+
// LLVM: store <8 x i8> [[VTRN]], ptr [[RES:%.*]], align 8
731+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<8 x i8>, ptr [[RES]], i64 1
732+
// LLVM: [[VTRN1:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> [[B]], <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
733+
// LLVM: store <8 x i8> [[VTRN1]], ptr [[RES1]], align 8
734+
// LLVM-NEXT: [[RET:%.*]] = load %struct.uint8x8x2_t, ptr {{.*}}
735+
// LLVM-NEXT: ret %struct.uint8x8x2_t [[RET]]
736+
}
737+
738+
uint16x4x2_t test_vzip_u16(uint16x4_t a, uint16x4_t b) {
739+
return vzip_u16(a, b);
740+
741+
// CIR-LABEL: vzip_u16
742+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u16i x 4>>
743+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
744+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u16i x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u16i x 4>>
745+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u16i x 4>)
746+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<4> : !s32i, #cir.int<1> : !s32i, #cir.int<5> : !s32i] : !cir.vector<!u16i x 4>
747+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u16i x 4>, !cir.ptr<!cir.vector<!u16i x 4>>
748+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
749+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u16i x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u16i x 4>>
750+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u16i x 4>)
751+
// CIR-SAME: [#cir.int<2> : !s32i, #cir.int<6> : !s32i, #cir.int<3> : !s32i, #cir.int<7> : !s32i] :
752+
// CIR-SAME: !cir.vector<!u16i x 4>
753+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u16i x 4>, !cir.ptr<!cir.vector<!u16i x 4>>
754+
755+
// LLVM: {{.*}}test_vzip_u16(<4 x i16>{{.*}}[[A:%.*]], <4 x i16>{{.*}}[[B:%.*]])
756+
// LLVM: [[vzip:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> [[B]],
757+
// LLVM-SAME: <4 x i32> <i32 0, i32 4, i32 1, i32 5>
758+
// LLVM: store <4 x i16> [[vzip]], ptr [[RES:%.*]], align 8
759+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<4 x i16>, ptr [[RES]], i64 1
760+
// LLVM: [[vzip1:%.*]] = shufflevector <4 x i16> [[A]], <4 x i16> [[B]],
761+
// LLVM-SAME: <4 x i32> <i32 2, i32 6, i32 3, i32 7>
762+
// LLVM: store <4 x i16> [[vzip1]], ptr [[RES1]], align 8
763+
// LLVM-NEXT: [[RET:%.*]] = load %struct.uint16x4x2_t, ptr {{.*}}
764+
// LLVM-NEXT: ret %struct.uint16x4x2_t [[RET]]
765+
}
766+
767+
int32x2x2_t test_vzip_s32(int32x2_t a, int32x2_t b) {
768+
return vzip_s32(a, b);
769+
770+
// CIR-LABEL: vzip_s32
771+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!s32i x 2>>
772+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
773+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s32i x 2>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!s32i x 2>>
774+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!s32i x 2>)
775+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i] : !cir.vector<!s32i x 2>
776+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!s32i x 2>, !cir.ptr<!cir.vector<!s32i x 2>>
777+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
778+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s32i x 2>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!s32i x 2>>
779+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!s32i x 2>)
780+
// CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i] :
781+
// CIR-SAME: !cir.vector<!s32i x 2>
782+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!s32i x 2>, !cir.ptr<!cir.vector<!s32i x 2>>
783+
784+
// LLVM: {{.*}}test_vzip_s32(<2 x i32>{{.*}}[[A:%.*]], <2 x i32>{{.*}}[[B:%.*]])
785+
// LLVM: [[vzip:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> [[B]],
786+
// LLVM-SAME: <2 x i32> <i32 0, i32 2>
787+
// LLVM: store <2 x i32> [[vzip]], ptr [[RES:%.*]], align 8
788+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<2 x i32>, ptr [[RES]], i64 1
789+
// LLVM: [[vzip1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> [[B]],
790+
// LLVM-SAME: <2 x i32> <i32 1, i32 3>
791+
// LLVM: store <2 x i32> [[vzip1]], ptr [[RES1]], align 8
792+
// LLVM-NEXT: [[RET:%.*]] = load %struct.int32x2x2_t, ptr {{.*}}
793+
// LLVM-NEXT: ret %struct.int32x2x2_t [[RET]]
794+
}
795+
796+
float32x2x2_t test_vzip_f32(float32x2_t a, float32x2_t b) {
797+
return vzip_f32(a, b);
798+
799+
// CIR-LABEL: vzip_f32
800+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!cir.float x 2>>
801+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
802+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 2>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 2>>
803+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!cir.float x 2>)
804+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<2> : !s32i] : !cir.vector<!cir.float x 2>
805+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
806+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
807+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 2>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 2>>
808+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!cir.float x 2>)
809+
// CIR-SAME: [#cir.int<1> : !s32i, #cir.int<3> : !s32i] :
810+
// CIR-SAME: !cir.vector<!cir.float x 2>
811+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
812+
813+
// LLVM: {{.*}}test_vzip_f32(<2 x float>{{.*}}[[A:%.*]], <2 x float>{{.*}}[[B:%.*]])
814+
// LLVM: [[vzip:%.*]] = shufflevector <2 x float> [[A]], <2 x float> [[B]],
815+
// LLVM-SAME: <2 x i32> <i32 0, i32 2>
816+
// LLVM: store <2 x float> [[vzip]], ptr [[RES:%.*]], align 8
817+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<2 x float>, ptr [[RES]], i64 1
818+
// LLVM: [[vzip1:%.*]] = shufflevector <2 x float> [[A]], <2 x float> [[B]],
819+
// LLVM-SAME: <2 x i32> <i32 1, i32 3>
820+
// LLVM: store <2 x float> [[vzip1]], ptr [[RES1]], align 8
821+
// LLVM-NEXT: [[RET:%.*]] = load %struct.float32x2x2_t, ptr {{.*}}
822+
// LLVM-NEXT: ret %struct.float32x2x2_t [[RET]]
823+
}
824+
825+
uint8x16x2_t test_vzipq_u8(uint8x16_t a, uint8x16_t b) {
826+
return vzipq_u8(a, b);
827+
828+
// CIR-LABEL: vzipq_u8
829+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u8i x 16>>
830+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
831+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 16>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u8i x 16>>
832+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u8i x 16>)
833+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<16> : !s32i, #cir.int<1> : !s32i, #cir.int<17> : !s32i,
834+
// CIR-SAME: #cir.int<2> : !s32i, #cir.int<18> : !s32i, #cir.int<3> : !s32i, #cir.int<19> : !s32i,
835+
// CIR-SAME: #cir.int<4> : !s32i, #cir.int<20> : !s32i, #cir.int<5> : !s32i, #cir.int<21> : !s32i,
836+
// CIR-SAME: #cir.int<6> : !s32i, #cir.int<22> : !s32i, #cir.int<7> : !s32i, #cir.int<23> : !s32i] : !cir.vector<!u8i x 16>
837+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u8i x 16>, !cir.ptr<!cir.vector<!u8i x 16>>
838+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
839+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u8i x 16>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u8i x 16>>
840+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u8i x 16>)
841+
// CIR-SAME: [#cir.int<8> : !s32i, #cir.int<24> : !s32i, #cir.int<9> : !s32i, #cir.int<25> : !s32i,
842+
// CIR-SAME: #cir.int<10> : !s32i, #cir.int<26> : !s32i, #cir.int<11> : !s32i, #cir.int<27> : !s32i,
843+
// CIR-SAME: #cir.int<12> : !s32i, #cir.int<28> : !s32i, #cir.int<13> : !s32i, #cir.int<29> : !s32i,
844+
// CIR-SAME: #cir.int<14> : !s32i, #cir.int<30> : !s32i, #cir.int<15> : !s32i, #cir.int<31> : !s32i] : !cir.vector<!u8i x 16>
845+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u8i x 16>, !cir.ptr<!cir.vector<!u8i x 16>>
846+
847+
// LLVM: {{.*}}test_vzipq_u8(<16 x i8>{{.*}}[[A:%.*]], <16 x i8>{{.*}}[[B:%.*]])
848+
// LLVM: [[vzip:%.*]] = shufflevector <16 x i8> [[A]], <16 x i8> [[B]],
849+
// LLVM-SAME: <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19,
850+
// LLVM-SAME: i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
851+
// LLVM: store <16 x i8> [[vzip]], ptr [[RES:%.*]], align 16
852+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<16 x i8>, ptr [[RES]], i64 1
853+
// LLVM: [[vzip1:%.*]] = shufflevector <16 x i8> [[A]], <16 x i8> [[B]],
854+
// LLVM-SAME: <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27,
855+
// LLVM-SAME: i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
856+
// LLVM: store <16 x i8> [[vzip1]], ptr [[RES1]], align 16
857+
// LLVM-NEXT: [[RET:%.*]] = load %struct.uint8x16x2_t, ptr {{.*}}
858+
// LLVM-NEXT: ret %struct.uint8x16x2_t [[RET]]
859+
}
860+
861+
int16x8x2_t test_vzipq_s16(int16x8_t a, int16x8_t b) {
862+
return vzipq_s16(a, b);
863+
864+
// CIR-LABEL: vzipq_s16
865+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!s16i x 8>>
866+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
867+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s16i x 8>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!s16i x 8>>
868+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!s16i x 8>)
869+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<8> : !s32i, #cir.int<1> : !s32i, #cir.int<9> : !s32i,
870+
// CIR-SAME: #cir.int<2> : !s32i, #cir.int<10> : !s32i, #cir.int<3> : !s32i,
871+
// CIR-SAME: #cir.int<11> : !s32i] : !cir.vector<!s16i x 8>
872+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!s16i x 8>, !cir.ptr<!cir.vector<!s16i x 8>>
873+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
874+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!s16i x 8>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!s16i x 8>>
875+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!s16i x 8>)
876+
// CIR-SAME: [#cir.int<4> : !s32i, #cir.int<12> : !s32i, #cir.int<5> : !s32i, #cir.int<13> : !s32i,
877+
// CIR-SAME: #cir.int<6> : !s32i, #cir.int<14> : !s32i, #cir.int<7> : !s32i,
878+
// CIR-SAME: #cir.int<15> : !s32i] : !cir.vector<!s16i x 8>
879+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!s16i x 8>, !cir.ptr<!cir.vector<!s16i x 8>>
880+
881+
// LLVM: {{.*}}test_vzipq_s16(<8 x i16>{{.*}}[[A:%.*]], <8 x i16>{{.*}}[[B:%.*]])
882+
// LLVM: [[vzip:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]],
883+
// LLVM-SAME: <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
884+
// LLVM: store <8 x i16> [[vzip]], ptr [[RES:%.*]], align 16
885+
// LLVM: [[RES1:%.*]] = getelementptr {{.*}}<8 x i16>, ptr [[RES]], i64 1
886+
// LLVM: [[vzip1:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
887+
// LLVM: store <8 x i16> [[vzip1]], ptr [[RES1]], align 16
888+
// LLVM-NEXT: [[RET:%.*]] = load %struct.int16x8x2_t, ptr {{.*}}
889+
// LLVM-NEXT: ret %struct.int16x8x2_t [[RET]]
890+
}
891+
892+
uint32x4x2_t test_vzipq_u32(uint32x4_t a, uint32x4_t b) {
893+
return vzipq_u32(a, b);
894+
895+
// CIR-LABEL: vzipq_u32
896+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!u32i x 4>>
897+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
898+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u32i x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!u32i x 4>>
899+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!u32i x 4>)
900+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<4> : !s32i, #cir.int<1> : !s32i, #cir.int<5> : !s32i] :
901+
// CIR-SAME: !cir.vector<!u32i x 4>
902+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!u32i x 4>, !cir.ptr<!cir.vector<!u32i x 4>>
903+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
904+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!u32i x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!u32i x 4>>
905+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!u32i x 4>)
906+
// CIR-SAME: [#cir.int<2> : !s32i, #cir.int<6> : !s32i, #cir.int<3> : !s32i, #cir.int<7> : !s32i] :
907+
// CIR-SAME: !cir.vector<!u32i x 4>
908+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!u32i x 4>, !cir.ptr<!cir.vector<!u32i x 4>>
909+
// LLVM: [[RET:%.*]] = load %struct.uint32x4x2_t, ptr {{.*}}
910+
// LLVM: ret %struct.uint32x4x2_t [[RET]]
911+
}
912+
913+
float32x4x2_t test_vzipq_f32(float32x4_t a, float32x4_t b) {
914+
return vzipq_f32(a, b);
915+
916+
// CIR-LABEL: vzipq_f32
917+
// CIR: [[PTR:%.*]] = cir.cast(bitcast, {{%.*}} : !cir.ptr<!void>), !cir.ptr<!cir.vector<!cir.float x 4>>
918+
// CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
919+
// CIR: [[ADDR:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 4>>, [[ZERO]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 4>>
920+
// CIR: [[RES:%.*]] = cir.vec.shuffle([[INP1:%.*]], [[INP2:%.*]] : !cir.vector<!cir.float x 4>)
921+
// CIR-SAME: [#cir.int<0> : !s32i, #cir.int<4> : !s32i, #cir.int<1> : !s32i, #cir.int<5> : !s32i] :
922+
// CIR-SAME: !cir.vector<!cir.float x 4>
923+
// CIR: cir.store [[RES]], [[ADDR]] : !cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>
924+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
925+
// CIR: [[ADDR1:%.*]] = cir.ptr_stride([[PTR]] : !cir.ptr<!cir.vector<!cir.float x 4>>, [[ONE]] : !s32i), !cir.ptr<!cir.vector<!cir.float x 4>>
926+
// CIR: [[RES1:%.*]] = cir.vec.shuffle([[INP1]], [[INP2]] : !cir.vector<!cir.float x 4>)
927+
// CIR-SAME: [#cir.int<2> : !s32i, #cir.int<6> : !s32i, #cir.int<3> : !s32i, #cir.int<7> : !s32i] :
928+
// CIR-SAME: !cir.vector<!cir.float x 4>
929+
// CIR: cir.store [[RES1]], [[ADDR1]] : !cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>
930+
// LLVM: [[RET:%.*]] = load %struct.float32x4x2_t, ptr {{.*}}
931+
// LLVM: ret %struct.float32x4x2_t [[RET]]
932+
}
933+
707934
uint8x8_t test_vqmovun_s16(int16x8_t a) {
708935
return vqmovun_s16(a);
709936

0 commit comments

Comments
 (0)