[clang] [CIR][AArch64] Upstream addition-across-vector (incl. widening) NEON builtins (PR #193396)
Andrzej Warzyński via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 01:52:17 PDT 2026
================
@@ -2719,6 +2732,32 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
std::string("unimplemented AArch64 builtin call: ") +
getContext().BuiltinInfo.getName(builtinID));
return mlir::Value{};
+ case NEON::BI__builtin_neon_vaddlv_u8:
+ case NEON::BI__builtin_neon_vaddlvq_u8:
+ case NEON::BI__builtin_neon_vaddlv_u16:
+ case NEON::BI__builtin_neon_vaddlvq_u16:
+ case NEON::BI__builtin_neon_vaddlv_s8:
+ case NEON::BI__builtin_neon_vaddlvq_s8:
+ case NEON::BI__builtin_neon_vaddlv_s16:
+ case NEON::BI__builtin_neon_vaddlvq_s16: {
+ mlir::Type argTy = convertType(expr->getArg(0)->getType());
+ mlir::Type userRetTy = convertType(expr->getType());
+ auto eltTy = mlir::cast<cir::IntType>(
+ mlir::cast<cir::VectorType>(argTy).getElementType());
+ bool isUnsigned = !eltTy.isSigned();
----------------
banach-space wrote:
Thanks for checking!
> (arg->getIntegerConstantExpr() is false [CIRGenBuiltinAArch64.cpp#L2167](https://github.com/llvm/llvm-project/blob/main/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp#L2167))
Ah, of course, we only use that for the **overloaded** builtins that take an immediate argument to discriminate the input type (and that's always the last argument). For example (from arm_neon.h in the build directory):
```C
__ai __attribute__((target("neon"))) uint16x4_t vbsl_u16(uint16x4_t __p0, uint16x4_t __p1, uint16x4_t __p2) {
uint16x4_t __ret;
__ret = (uint16x4_t) __builtin_neon_vbsl_v((int8x8_t)__p0, (int8x8_t)__p1, (int8x8_t)__p2, 17);
return __ret;
}
```
In here, `17` encodes the type (`uint16x4_t `). That would probably qualify as `ClassB` in NeonEmitter.cpp.
Great detective work! 🙏🏻
https://github.com/llvm/llvm-project/pull/193396
More information about the cfe-commits
mailing list