[clang] [CIR][AArch64] Upstream addition-across-vector (incl. widening) NEON builtins (PR #193396)
Vicky Nguyen via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 30 21:40:41 PDT 2026
================
@@ -6576,65 +6569,32 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
Value *RHS = Builder.CreateBitCast(Ops[1], DoubleTy);
return Builder.CreateFMul(Ops[0], RHS);
}
- case NEON::BI__builtin_neon_vaddlv_u8: {
- Int = Intrinsic::aarch64_neon_uaddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int8Ty, 8);
- llvm::Type *Tys[2] = {Ty, VTy};
- Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- return Builder.CreateTrunc(Ops[0], Int16Ty);
- }
- case NEON::BI__builtin_neon_vaddlv_u16: {
- Int = Intrinsic::aarch64_neon_uaddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int16Ty, 4);
- llvm::Type *Tys[2] = {Ty, VTy};
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- }
- case NEON::BI__builtin_neon_vaddlvq_u8: {
- Int = Intrinsic::aarch64_neon_uaddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int8Ty, 16);
- llvm::Type *Tys[2] = {Ty, VTy};
- Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- return Builder.CreateTrunc(Ops[0], Int16Ty);
- }
- case NEON::BI__builtin_neon_vaddlvq_u16: {
- Int = Intrinsic::aarch64_neon_uaddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int16Ty, 8);
- llvm::Type *Tys[2] = {Ty, VTy};
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- }
- case NEON::BI__builtin_neon_vaddlv_s8: {
- Int = Intrinsic::aarch64_neon_saddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int8Ty, 8);
- llvm::Type *Tys[2] = {Ty, VTy};
- Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- return Builder.CreateTrunc(Ops[0], Int16Ty);
- }
- case NEON::BI__builtin_neon_vaddlv_s16: {
- Int = Intrinsic::aarch64_neon_saddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int16Ty, 4);
- llvm::Type *Tys[2] = {Ty, VTy};
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- }
- case NEON::BI__builtin_neon_vaddlvq_s8: {
- Int = Intrinsic::aarch64_neon_saddlv;
- Ty = Int32Ty;
- VTy = llvm::FixedVectorType::get(Int8Ty, 16);
- llvm::Type *Tys[2] = {Ty, VTy};
- Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
- return Builder.CreateTrunc(Ops[0], Int16Ty);
- }
+ 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: {
- Int = Intrinsic::aarch64_neon_saddlv;
+ switch (BuiltinID) {
+ 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:
+ Int = Intrinsic::aarch64_neon_uaddlv;
+ break;
+ default:
+ Int = Intrinsic::aarch64_neon_saddlv;
+ break;
+ }
----------------
iamvickynguyen wrote:
Got it! I split the signed and unsigned case groups.
https://github.com/llvm/llvm-project/pull/193396
More information about the cfe-commits
mailing list