From 9c0c930ddea0d095a2af6b720aeb37aaab394af8 Mon Sep 17 00:00:00 2001 From: AmrDeveloper Date: Thu, 6 Mar 2025 20:30:06 +0100 Subject: [PATCH] [CIR][CIRGen][Builtin][Neon] Lower neon vaddlvq_s32 --- clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 3 ++- clang/test/CIR/CodeGen/AArch64/neon-misc.c | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index 96610d2df193..cb1ef8988024 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -2661,7 +2661,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr( case NEON::BI__builtin_neon_vaddlv_u32: llvm_unreachable(" neon_vaddlv_u32 NYI "); case NEON::BI__builtin_neon_vaddlvq_s32: - llvm_unreachable(" neon_vaddlvq_s32 NYI "); + return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.saddlv", resultTy, + loc); case NEON::BI__builtin_neon_vaddlvq_u32: return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy, loc); diff --git a/clang/test/CIR/CodeGen/AArch64/neon-misc.c b/clang/test/CIR/CodeGen/AArch64/neon-misc.c index eefca6dd4a7e..2aad156caa0c 100644 --- a/clang/test/CIR/CodeGen/AArch64/neon-misc.c +++ b/clang/test/CIR/CodeGen/AArch64/neon-misc.c @@ -2195,6 +2195,18 @@ uint64x2_t test_vpadalq_u32(uint64x2_t a, uint32x4_t b) { // LLVM: ret <2 x i64> [[TMP2]] } + +int64_t test_vaddlvq_s32(int32x4_t a) { + return vaddlvq_s32(a); + + // CIR-LABEL: vaddlvq_s32 + // CIR: = cir.llvm.intrinsic "aarch64.neon.saddlv" {{%.*}} : (!cir.vector) -> !s64i + + // LLVM: {{.*}}@test_vaddlvq_s32(<4 x i32>{{.*}}[[A:%.*]]) + // LLVM-NEXT: [[VADDLVQ_S32_I:%.*]] = call i64 @llvm.aarch64.neon.saddlv.i64.v4i32(<4 x i32> [[A]]) + // LLVM-NEXT: ret i64 [[VADDLVQ_S32_I]] +} + uint64_t test_vaddlvq_u32(uint32x4_t a) { return vaddlvq_u32(a);