From c83b2793b5d2a67af97995351b0efdc58a1d961e Mon Sep 17 00:00:00 2001 From: AmrDeveloper Date: Thu, 6 Mar 2025 20:44:34 +0100 Subject: [PATCH] [CIR][CIRGen][Builtin][Neon] Lower neon vaddlv_u32 --- clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 3 ++- clang/test/CIR/CodeGen/AArch64/neon.c | 17 +++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index 96610d2df193..9908dcf02e83 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -2659,7 +2659,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr( case NEON::BI__builtin_neon_vaddlv_s32: llvm_unreachable(" neon_vaddlv_s32 NYI "); case NEON::BI__builtin_neon_vaddlv_u32: - llvm_unreachable(" neon_vaddlv_u32 NYI "); + return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy, + loc); case NEON::BI__builtin_neon_vaddlvq_s32: llvm_unreachable(" neon_vaddlvq_s32 NYI "); case NEON::BI__builtin_neon_vaddlvq_u32: diff --git a/clang/test/CIR/CodeGen/AArch64/neon.c b/clang/test/CIR/CodeGen/AArch64/neon.c index 1d31dc7ab5b4..0d9559d8a22e 100644 --- a/clang/test/CIR/CodeGen/AArch64/neon.c +++ b/clang/test/CIR/CodeGen/AArch64/neon.c @@ -19217,12 +19217,17 @@ uint32_t test_vaddv_u32(uint32x2_t a) { // return vaddlv_s32(a); // } -// NYI-LABEL: @test_vaddlv_u32( -// NYI: [[VADDLV_U32_I:%.*]] = call i64 @llvm.aarch64.neon.uaddlv.i64.v2i32(<2 x i32> %a) -// NYI: ret i64 [[VADDLV_U32_I]] -// uint64_t test_vaddlv_u32(uint32x2_t a) { -// return vaddlv_u32(a); -// } +uint64_t test_vaddlv_u32(uint32x2_t a) { + return vaddlv_u32(a); + + // CIR-LABEL: vaddlv_u32 + // CIR: cir.llvm.intrinsic "aarch64.neon.uaddlv" {{%.*}} : (!cir.vector) -> !u64i + + // LLVM-LABEL: test_vaddlv_u32 + // LLVM-SAME: (<2 x i32> [[a:%.*]]) + // LLVM: [[VADDLV_U32_I:%.*]] = call i64 @llvm.aarch64.neon.uaddlv.i64.v2i32(<2 x i32> [[a]]) + // LLVM: ret i64 [[VADDLV_U32_I]] +} uint8x8_t test_vmovn_u16(uint16x8_t a) { return vmovn_u16(a);