Skip to content

Commit a0ba0c8

Browse files
committed
[CIR][AArch64] Implement NEON builtin vaddlvq_u8
1 parent aca5b07 commit a0ba0c8

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4431,7 +4431,11 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
44314431
llvm_unreachable("NEON::BI__builtin_neon_vmul_n_f64 NYI");
44324432
}
44334433
case NEON::BI__builtin_neon_vaddlvq_u8: {
4434-
llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_u8 NYI");
4434+
cir::VectorType vTy = cir::VectorType::get(UInt8Ty, 16);
4435+
Ops.push_back(emitScalarExpr(E->getArg(0)));
4436+
Ops[0] = emitNeonCall(builder, {vTy}, Ops, "aarch64.neon.uaddlv",
4437+
UInt32Ty, getLoc(E->getExprLoc()));
4438+
return builder.createIntCast(Ops[0], UInt16Ty);
44354439
}
44364440
case NEON::BI__builtin_neon_vaddlvq_u16:
44374441
usgn = true;

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6823,7 +6823,7 @@ int8x8_t test_vqshrn_n_s16(int16x8_t a) {
68236823
return vqshrn_n_s16(a, 3);
68246824

68256825
// CIR-LABEL: vqshrn_n_s16
6826-
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
6826+
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
68276827
// CIR-SAME: (!cir.vector<!s16i x 8>, !s32i) -> !cir.vector<!s8i x 8>
68286828

68296829
// LLVM:{{.*}}test_vqshrn_n_s16(<8 x i16>{{.*}}[[A:%.*]])
@@ -6834,7 +6834,7 @@ int16x4_t test_vqshrn_n_s32(int32x4_t a) {
68346834
return vqshrn_n_s32(a, 9);
68356835

68366836
// CIR-LABEL: vqshrn_n_s32
6837-
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
6837+
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
68386838
// CIR-SAME: (!cir.vector<!s32i x 4>, !s32i) -> !cir.vector<!s16i x 4>
68396839

68406840
// LLVM:{{.*}}test_vqshrn_n_s32(<4 x i32>{{.*}}[[A:%.*]])
@@ -6845,7 +6845,7 @@ int32x2_t test_vqshrn_n_s64(int64x2_t a) {
68456845
return vqshrn_n_s64(a, 19);
68466846

68476847
// CIR-LABEL: vqshrn_n_s64
6848-
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
6848+
// CIR: cir.llvm.intrinsic "aarch64.neon.sqshrn" {{%.*}}, {{%.*}} :
68496849
// CIR-SAME: (!cir.vector<!s64i x 2>, !s32i) -> !cir.vector<!s32i x 2>
68506850

68516851
// LLVM:{{.*}}test_vqshrn_n_s64(<2 x i64>{{.*}}[[A:%.*]])
@@ -6856,7 +6856,7 @@ uint8x8_t test_vqshrn_n_u16(uint16x8_t a) {
68566856
return vqshrn_n_u16(a, 3);
68576857

68586858
// CIR-LABEL: vqshrn_n_u16
6859-
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
6859+
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
68606860
// CIR-SAME: (!cir.vector<!u16i x 8>, !s32i) -> !cir.vector<!u8i x 8>
68616861

68626862
// LLVM:{{.*}}test_vqshrn_n_u16(<8 x i16>{{.*}}[[A:%.*]])
@@ -6867,7 +6867,7 @@ uint16x4_t test_vqshrn_n_u32(uint32x4_t a) {
68676867
return vqshrn_n_u32(a, 9);
68686868

68696869
// CIR-LABEL: vqshrn_n_u32
6870-
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
6870+
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
68716871
// CIR-SAME: (!cir.vector<!u32i x 4>, !s32i) -> !cir.vector<!u16i x 4>
68726872

68736873
// LLVM:{{.*}}test_vqshrn_n_u32(<4 x i32>{{.*}}[[A:%.*]])
@@ -6878,7 +6878,7 @@ uint32x2_t test_vqshrn_n_u64(uint64x2_t a) {
68786878
return vqshrn_n_u64(a, 19);
68796879

68806880
// CIR-LABEL: vqshrn_n_u64
6881-
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
6881+
// CIR: cir.llvm.intrinsic "aarch64.neon.uqshrn" {{%.*}}, {{%.*}} :
68826882
// CIR-SAME: (!cir.vector<!u64i x 2>, !s32i) -> !cir.vector<!u32i x 2>
68836883

68846884
// LLVM:{{.*}}test_vqshrn_n_u64(<2 x i64>{{.*}}[[A:%.*]])
@@ -19232,3 +19232,21 @@ float64x2_t test_vld1q_dup_f64(float64_t const * ptr) {
1923219232
// LLVM: [[VAL:%.*]] = load double, ptr [[PTR]], align 8
1923319233
// LLVM: [[VEC:%.*]] = insertelement <2 x double> poison, double [[VAL]], i64 0
1923419234
// LLVM: {{%.*}} = shufflevector <2 x double> [[VEC]], <2 x double> poison, <2 x i32> zeroinitializer
19235+
19236+
uint16_t test_vaddlvq_u8(uint8x16_t a) {
19237+
return vaddlvq_u8(a);
19238+
19239+
// CIR-LABEL: vaddlvq_u8
19240+
// CIR: {{%.*}} = cir.llvm.intrinsic "aarch64.neon.uaddlv" {{%.*}} : (!cir.vector<!u8i x 16>) -> !u32i
19241+
// CIR: {{%.*}} = cir.cast integral {{%.*}} : !u32i -> !u16i
19242+
19243+
// LLVM-LABEL: @test_vaddlvq_u8
19244+
// LLVM: {{%.*}} = call i32 @llvm.aarch64.neon.uaddlv.i32.v16i8(<16 x i8> {{%.*}})
19245+
// LLVM: {{%.*}} = trunc i32 {{%.*}} to i16
19246+
// LLVM: ret i16
19247+
19248+
// OGCG-LABEL: @test_vaddlvq_u8
19249+
// OGCG: {{%.*}} = call i32 @llvm.aarch64.neon.uaddlv.i32.v16i8(<16 x i8> {{%.*}})
19250+
// OGCG: {{%.*}} = trunc i32 {{%.*}} to i16
19251+
// OGCG: ret i16
19252+
}

0 commit comments

Comments
 (0)