[clang] Added implementation for Maximum-across-vector (PR #190887)
Kartik Ohlan via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 7 19:08:40 PDT 2026
https://github.com/Ko496-glitch created https://github.com/llvm/llvm-project/pull/190887
Implemented helper function for static mlir::Value emitCommonNeonVecAcrossCall
Implemented vmax_v* and vmaxq*
>From 873f5e1d20aaf86c68a1303125da61da7c622f7c Mon Sep 17 00:00:00 2001
From: kartikohlan <kartik7ohlan at gmail.com>
Date: Tue, 7 Apr 2026 22:03:11 -0400
Subject: [PATCH] Added implementation for Maximim-across-vector
---
.../lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 45 ++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 81e7e14e4ea71..883f08df54fe8 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -206,7 +206,18 @@ static mlir::Value emitCommonNeonShift(CIRGenBuilderTy &builder,
builder.createBitcast(shifTgt, resTy), shiftAmt,
shiftLeft);
}
-
+static mlir::Value emitCommonNeonVecAcrossCall(CIRGenFunction &cgf,
+ llvm::StringRef intrincsName,
+ mlir::Type eltTy,
+ unsigned vecLen,
+ const clang::CallExpr *expr) {
+ CIRGenBuilderTy &builder = cgf.getBuilder();
+ mlir::Location loc = cgf.getLoc(expr->getExprLoc());
+ mlir::Value op = cgf.emitScalarExpr(expr->getArg(0));
+ cir::VectorType vTy = cir::VectorType::get(eltTy, vecLen);
+ llvm::SmallVector<mlir::Value, 1> args{op};
+ return emitNeonCall(cgf.cgm, builder, {vTy}, args, intrinsicName, eltTy, loc);
+}
static cir::VectorType getIntVecFromVecTy(CIRGenBuilderTy &builder,
cir::VectorType vecTy) {
if (!cir::isAnyFloatingPointType(vecTy.getElementType()))
@@ -2333,6 +2344,38 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
return mlir::Value{};
case NEON::BI__builtin_neon_vmaxnm_v:
case NEON::BI__builtin_neon_vmaxnmq_v:
+ case NEON::BI_builtin_neon_vmaxv_s8: {
+ return emitCommonNeonVecAcrossCall(*this, "aarch64.neon-smaxv", SInt8Ty, 8,
+ E);
+ }
+ case NEON::BI_builtin_neon_vmaxvq_s8: {
+ return emitCommonNeonVecAcrossCall(*this, "aarch64.neon.smaxv", SInt8Ty, 16,
+ E);
+ }
+ case NEON::BI_builtin_neon_vmaxv_s16: {
+ return emitCommonNeonVecAcrossCall(*this, "vector.reduce.smax", sInt16Ty, 4,
+ expr);
+ }
+ case NEON::BI_builtin_neon_vmaxq_s16: {
+ return emitCommonNeonVecAcrossCall(*this, "vector.reduce.smax", sInt16Ty, 8,
+ expr);
+ }
+ case NEON::BI_builtin_neon_vmaxv_u8: {
+ return emitCommonNeonVecAcrossCall(*this, "aarch64.neon.umaxv", uInt8Ty, 8,
+ expr);
+ }
+ case NEON::BI_builtin_neon_vmaxq_u8: {
+ return emitCommonNeonVecAcrossCall(*this, "aarch64.neon.umaxv", uInt8Ty, 16,
+ expr);
+ }
+ case NEON::BI_builtin_neon_vmaxv_u16: {
+ return emitCommonNeonVecAcrossCall(*this, "vector.reduce.umax", uInt16Ty, 4,
+ expr);
+ }
+ case NEON::BI_builtin_neon_vmaxvq_u16: {
+ return emitCommonNeonVecAcrossCall(*this, "vector.reduce.umax", uInt16Ty, 8,
+ expr);
+ }
intrName = "aarch64.neon.fmaxnm";
return emitNeonCall(cgm, builder, {ty, ty}, ops, intrName, ty, loc);
case NEON::BI__builtin_neon_vmaxnmh_f16:
More information about the cfe-commits
mailing list