From d8b6ea204758802d7b951c74a9cb1534de455e59 Mon Sep 17 00:00:00 2001 From: Guojin He Date: Thu, 12 Dec 2024 10:53:30 -0500 Subject: [PATCH] [CIR][CIRGen][Builtin][Neon] Lower neon_vaddlvq_s16 --- clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 16 +++++++++------- clang/test/CIR/CodeGen/AArch64/neon-arith.c | 11 +++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index 01269b92a45d..b112e260bca8 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -4291,11 +4291,16 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E, case NEON::BI__builtin_neon_vaddlvq_u8: { llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_u8 NYI"); } - case NEON::BI__builtin_neon_vaddlvq_u16: { - mlir::Type argTy = cir::VectorType::get(builder.getContext(), UInt16Ty, 8); + case NEON::BI__builtin_neon_vaddlvq_u16: + usgn = true; + [[fallthrough]]; + case NEON::BI__builtin_neon_vaddlvq_s16: { + mlir::Type argTy = cir::VectorType::get(builder.getContext(), + usgn ? UInt16Ty : SInt16Ty, 8); llvm::SmallVector argOps = {emitScalarExpr(E->getArg(0))}; - return emitNeonCall(builder, {argTy}, argOps, "aarch64.neon.uaddlv", - UInt32Ty, getLoc(E->getExprLoc())); + return emitNeonCall(builder, {argTy}, argOps, + usgn ? "aarch64.neon.uaddlv" : "aarch64.neon.saddlv", + usgn ? UInt32Ty : SInt32Ty, getLoc(E->getExprLoc())); } case NEON::BI__builtin_neon_vaddlv_s8: { llvm_unreachable("NEON::BI__builtin_neon_vaddlv_s8 NYI"); @@ -4306,9 +4311,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E, case NEON::BI__builtin_neon_vaddlvq_s8: { llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_s8 NYI"); } - case NEON::BI__builtin_neon_vaddlvq_s16: { - llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_s16 NYI"); - } case NEON::BI__builtin_neon_vsri_n_v: case NEON::BI__builtin_neon_vsriq_n_v: { llvm_unreachable("NEON::BI__builtin_neon_vsriq_n_v NYI"); diff --git a/clang/test/CIR/CodeGen/AArch64/neon-arith.c b/clang/test/CIR/CodeGen/AArch64/neon-arith.c index f44a4bb9e465..7616eda4ca83 100644 --- a/clang/test/CIR/CodeGen/AArch64/neon-arith.c +++ b/clang/test/CIR/CodeGen/AArch64/neon-arith.c @@ -894,6 +894,17 @@ uint32_t test_vaddlvq_u16(uint16x8_t a) { // LLVM: ret i32 [[VADDLV_I]] } +int32_t test_vaddlvq_s16(int16x8_t a) { + return vaddlvq_s16(a); + + // CIR-LABEL: vaddlvq_s16 + // CIR: cir.llvm.intrinsic "aarch64.neon.saddlv" {{%.*}}: (!cir.vector) -> !s32i + + // LLVM: {{.*}}test_vaddlvq_s16(<8 x i16>{{.*}}[[A:%.*]]) + // LLVM: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v8i16(<8 x i16> [[A]]) + // LLVM: ret i32 [[VADDLV_I]] +} + uint16_t test_vaddv_u16(uint16x4_t a) { return vaddv_u16(a);