https://github.com/jthackray created https://github.com/llvm/llvm-project/pull/217577
Add support for `svset_neonq_mf8`, `svget_neonq_mf8` and `svdup_neonq_mf8` intrinsics, which are present in the ACLE but were not implemented in llvm. >From b953dc1c74c62a9f6353870dd5b97061b19b9cf1 Mon Sep 17 00:00:00 2001 From: Jonathan Thackray <[email protected]> Date: Thu, 20 Aug 2026 11:26:09 +0100 Subject: [PATCH] [AArch64][llvm][clang] Add missing sv{set,get,dup}_neonq_mf8 intrinsics Add support for `svset_neonq_mf8`, `svget_neonq_mf8` and `svdup_neonq_mf8` intrinsics, which are present in the ACLE but were not implemented in llvm. --- .../clang/Basic/BuiltinsAArch64NeonSVEBridge.def | 3 +++ .../Basic/BuiltinsAArch64NeonSVEBridge_cg.def | 3 +++ clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 3 +++ clang/lib/CodeGen/TargetBuiltins/ARM.cpp | 9 ++++++--- clang/lib/Headers/arm_neon_sve_bridge.h | 13 +++++++++++++ .../acle_neon_sve_bridge_dup_neonq.c | 16 ++++++++++++++++ .../acle_neon_sve_bridge_get_neonq.c | 15 ++++++++++++++- .../acle_neon_sve_bridge_set_neonq.c | 14 ++++++++++++++ 8 files changed, 72 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def index 926ae1f424292..5c5e9f9569193 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def +++ b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def @@ -11,6 +11,7 @@ TARGET_BUILTIN(__builtin_sve_svget_neonq_f16, "V8hq8h", "n", "sve") TARGET_BUILTIN(__builtin_sve_svget_neonq_f32, "V4fq4f", "n", "sve") TARGET_BUILTIN(__builtin_sve_svget_neonq_f64, "V2dq2d", "n", "sve") TARGET_BUILTIN(__builtin_sve_svget_neonq_bf16, "V8yq8y", "n", "sve") +TARGET_BUILTIN(__builtin_sve_svget_neonq_mf8, "V16mq16m", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_s8, "q16Scq16ScV16Sc", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_s16, "q8sq8sV8s", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_s32, "q4iq4iV4i", "n", "sve") @@ -23,6 +24,7 @@ TARGET_BUILTIN(__builtin_sve_svset_neonq_f16, "q8hq8hV8h", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_f32, "q4fq4fV4f", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_f64, "q2dq2dV2d", "n", "sve") TARGET_BUILTIN(__builtin_sve_svset_neonq_bf16, "q8yq8yV8y", "n", "sve") +TARGET_BUILTIN(__builtin_sve_svset_neonq_mf8, "q16mq16mV16m", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_s8, "q16ScV16Sc", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_s16, "q8sV8s", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_s32, "q4iV4i", "n", "sve") @@ -35,5 +37,6 @@ TARGET_BUILTIN(__builtin_sve_svdup_neonq_f16, "q8hV8h", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_f32, "q4fV4f", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_f64, "q2dV2d", "n", "sve") TARGET_BUILTIN(__builtin_sve_svdup_neonq_bf16, "q8yV8y", "n", "sve") +TARGET_BUILTIN(__builtin_sve_svdup_neonq_mf8, "q16mV16m", "n", "sve") #endif diff --git a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def index 7717ba67b4279..d0172456e9ac7 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def +++ b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def @@ -11,6 +11,7 @@ SVEMAP2(svget_neonq_f16, SVETypeFlags::EltTyFloat16), SVEMAP2(svget_neonq_f32, SVETypeFlags::EltTyFloat32), SVEMAP2(svget_neonq_f64, SVETypeFlags::EltTyFloat64), SVEMAP2(svget_neonq_bf16, SVETypeFlags::EltTyBFloat16), +SVEMAP2(svget_neonq_mf8, SVETypeFlags::EltTyMFloat8), SVEMAP2(svset_neonq_s8, SVETypeFlags::EltTyInt8), SVEMAP2(svset_neonq_s16, SVETypeFlags::EltTyInt16), SVEMAP2(svset_neonq_s32, SVETypeFlags::EltTyInt32), @@ -23,6 +24,7 @@ SVEMAP2(svset_neonq_f16, SVETypeFlags::EltTyFloat16), SVEMAP2(svset_neonq_f32, SVETypeFlags::EltTyFloat32), SVEMAP2(svset_neonq_f64, SVETypeFlags::EltTyFloat64), SVEMAP2(svset_neonq_bf16, SVETypeFlags::EltTyBFloat16), +SVEMAP2(svset_neonq_mf8, SVETypeFlags::EltTyMFloat8), SVEMAP2(svdup_neonq_s8, SVETypeFlags::EltTyInt8), SVEMAP2(svdup_neonq_s16, SVETypeFlags::EltTyInt16), SVEMAP2(svdup_neonq_s32, SVETypeFlags::EltTyInt32), @@ -35,5 +37,6 @@ SVEMAP2(svdup_neonq_f16, SVETypeFlags::EltTyFloat16), SVEMAP2(svdup_neonq_f32, SVETypeFlags::EltTyFloat32), SVEMAP2(svdup_neonq_f64, SVETypeFlags::EltTyFloat64), SVEMAP2(svdup_neonq_bf16, SVETypeFlags::EltTyBFloat16), +SVEMAP2(svdup_neonq_mf8, SVETypeFlags::EltTyMFloat8), #endif diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index f2bc4141f433e..8dc6faf66bd07 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -1692,6 +1692,7 @@ CIRGenFunction::emitAArch64SVEBuiltinExpr(unsigned builtinID, case SVE::BI__builtin_sve_svset_neonq_f32: case SVE::BI__builtin_sve_svset_neonq_f64: case SVE::BI__builtin_sve_svset_neonq_bf16: + case SVE::BI__builtin_sve_svset_neonq_mf8: case SVE::BI__builtin_sve_svget_neonq_s8: case SVE::BI__builtin_sve_svget_neonq_s16: case SVE::BI__builtin_sve_svget_neonq_s32: @@ -1704,6 +1705,7 @@ CIRGenFunction::emitAArch64SVEBuiltinExpr(unsigned builtinID, case SVE::BI__builtin_sve_svget_neonq_f32: case SVE::BI__builtin_sve_svget_neonq_f64: case SVE::BI__builtin_sve_svget_neonq_bf16: + case SVE::BI__builtin_sve_svget_neonq_mf8: case SVE::BI__builtin_sve_svdup_neonq_s8: case SVE::BI__builtin_sve_svdup_neonq_s16: case SVE::BI__builtin_sve_svdup_neonq_s32: @@ -1716,6 +1718,7 @@ CIRGenFunction::emitAArch64SVEBuiltinExpr(unsigned builtinID, case SVE::BI__builtin_sve_svdup_neonq_f32: case SVE::BI__builtin_sve_svdup_neonq_f64: case SVE::BI__builtin_sve_svdup_neonq_bf16: + case SVE::BI__builtin_sve_svdup_neonq_mf8: cgm.errorNYI(expr->getSourceRange(), std::string("unimplemented AArch64 builtin call: ") + getContext().BuiltinInfo.getName(builtinID)); diff --git a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp index 22e0dfc55157f..764511469f6db 100644 --- a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp @@ -4277,7 +4277,8 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, case SVE::BI__builtin_sve_svset_neonq_f16: case SVE::BI__builtin_sve_svset_neonq_f32: case SVE::BI__builtin_sve_svset_neonq_f64: - case SVE::BI__builtin_sve_svset_neonq_bf16: { + case SVE::BI__builtin_sve_svset_neonq_bf16: + case SVE::BI__builtin_sve_svset_neonq_mf8: { return Builder.CreateInsertVector(Ty, Ops[0], Ops[1], uint64_t(0)); } @@ -4292,7 +4293,8 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, case SVE::BI__builtin_sve_svget_neonq_f16: case SVE::BI__builtin_sve_svget_neonq_f32: case SVE::BI__builtin_sve_svget_neonq_f64: - case SVE::BI__builtin_sve_svget_neonq_bf16: { + case SVE::BI__builtin_sve_svget_neonq_bf16: + case SVE::BI__builtin_sve_svget_neonq_mf8: { return Builder.CreateExtractVector(Ty, Ops[0], uint64_t(0)); } @@ -4307,7 +4309,8 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, case SVE::BI__builtin_sve_svdup_neonq_f16: case SVE::BI__builtin_sve_svdup_neonq_f32: case SVE::BI__builtin_sve_svdup_neonq_f64: - case SVE::BI__builtin_sve_svdup_neonq_bf16: { + case SVE::BI__builtin_sve_svdup_neonq_bf16: + case SVE::BI__builtin_sve_svdup_neonq_mf8: { Value *Insert = Builder.CreateInsertVector(Ty, PoisonValue::get(Ty), Ops[0], uint64_t(0)); return Builder.CreateIntrinsic(Intrinsic::aarch64_sve_dupq_lane, {Ty}, diff --git a/clang/lib/Headers/arm_neon_sve_bridge.h b/clang/lib/Headers/arm_neon_sve_bridge.h index a9fbdbaf4bb9a..8faf860e799d3 100644 --- a/clang/lib/Headers/arm_neon_sve_bridge.h +++ b/clang/lib/Headers/arm_neon_sve_bridge.h @@ -172,6 +172,19 @@ svbfloat16_t svdup_neonq(bfloat16x8_t); __ai __attribute__((__clang_arm_builtin_alias(__builtin_sve_svdup_neonq_bf16))) svbfloat16_t svdup_neonq_bf16(bfloat16x8_t); +__aio __attribute__((__clang_arm_builtin_alias(__builtin_sve_svset_neonq_mf8))) +svmfloat8_t svset_neonq(svmfloat8_t, mfloat8x16_t); +__ai __attribute__((__clang_arm_builtin_alias(__builtin_sve_svset_neonq_mf8))) +svmfloat8_t svset_neonq_mf8(svmfloat8_t, mfloat8x16_t); +__aio __attribute__((__clang_arm_builtin_alias(__builtin_sve_svget_neonq_mf8))) +mfloat8x16_t svget_neonq(svmfloat8_t); +__ai __attribute__((__clang_arm_builtin_alias(__builtin_sve_svget_neonq_mf8))) +mfloat8x16_t svget_neonq_mf8(svmfloat8_t); +__aio __attribute__((__clang_arm_builtin_alias(__builtin_sve_svdup_neonq_mf8))) +svmfloat8_t svdup_neonq(mfloat8x16_t); +__ai __attribute__((__clang_arm_builtin_alias(__builtin_sve_svdup_neonq_mf8))) +svmfloat8_t svdup_neonq_mf8(mfloat8x16_t); + #undef __ai #undef __aio diff --git a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_dup_neonq.c b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_dup_neonq.c index e0d63178f3633..8c422449d46a3 100644 --- a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_dup_neonq.c +++ b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_dup_neonq.c @@ -208,3 +208,19 @@ svfloat64_t test_svdup_neonq_f64(float64x2_t n) { svbfloat16_t test_svdup_neonq_bf16(bfloat16x8_t n) { return SVE_ACLE_FUNC(svdup_neonq, _bf16, , )(n); } + +// CHECK-LABEL: @test_svdup_neonq_mf8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.vector.insert.nxv16i8.v16i8(<vscale x 16 x i8> poison, <16 x i8> [[N:%.*]], i64 0) +// CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dupq.lane.nxv16i8(<vscale x 16 x i8> [[TMP0]], i64 0) +// CHECK-NEXT: ret <vscale x 16 x i8> [[TMP1]] +// +// CPP-CHECK-LABEL: @_Z20test_svdup_neonq_mf814__Mfloat8x16_t( +// CPP-CHECK-NEXT: entry: +// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.vector.insert.nxv16i8.v16i8(<vscale x 16 x i8> poison, <16 x i8> [[N:%.*]], i64 0) +// CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dupq.lane.nxv16i8(<vscale x 16 x i8> [[TMP0]], i64 0) +// CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP1]] +// +svmfloat8_t test_svdup_neonq_mf8(mfloat8x16_t n) { + return SVE_ACLE_FUNC(svdup_neonq, _mf8, , )(n); +} diff --git a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_get_neonq.c b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_get_neonq.c index 744b3d55dc00d..d873776cddddb 100644 --- a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_get_neonq.c +++ b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_get_neonq.c @@ -70,7 +70,6 @@ int64x2_t test_svget_neonq_s64(svint64_t n) { return SVE_ACLE_FUNC(svget_neonq, _s64, , )(n); } -// // CHECK-LABEL: @test_svget_neonq_u8( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = tail call <16 x i8> @llvm.vector.extract.v16i8.nxv16i8(<vscale x 16 x i8> [[N:%.*]], i64 0) @@ -182,3 +181,17 @@ float64x2_t test_svget_neonq_f64(svfloat64_t n) { bfloat16x8_t test_svget_neonq_bf16(svbfloat16_t n) { return SVE_ACLE_FUNC(svget_neonq, _bf16, , )(n); } + +// CHECK-LABEL: @test_svget_neonq_mf8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = tail call <16 x i8> @llvm.vector.extract.v16i8.nxv16i8(<vscale x 16 x i8> [[N:%.*]], i64 0) +// CHECK-NEXT: ret <16 x i8> [[TMP0]] +// +// CPP-CHECK-LABEL: @_Z20test_svget_neonq_mf8u13__SVMfloat8_t( +// CPP-CHECK-NEXT: entry: +// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <16 x i8> @llvm.vector.extract.v16i8.nxv16i8(<vscale x 16 x i8> [[N:%.*]], i64 0) +// CPP-CHECK-NEXT: ret <16 x i8> [[TMP0]] +// +mfloat8x16_t test_svget_neonq_mf8(svmfloat8_t n) { + return SVE_ACLE_FUNC(svget_neonq, _mf8, , )(n); +} diff --git a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_set_neonq.c b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_set_neonq.c index d548182fbb0a6..109d66a046117 100644 --- a/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_set_neonq.c +++ b/clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_set_neonq.c @@ -181,3 +181,17 @@ svfloat64_t test_svset_neonq_f64(svfloat64_t s, float64x2_t n) { svbfloat16_t test_svset_neonq_bf16(svbfloat16_t s, bfloat16x8_t n) { return SVE_ACLE_FUNC(svset_neonq, _bf16, , )(s, n); } + +// CHECK-LABEL: @test_svset_neonq_mf8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.vector.insert.nxv16i8.v16i8(<vscale x 16 x i8> [[S:%.*]], <16 x i8> [[N:%.*]], i64 0) +// CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]] +// +// CPP-CHECK-LABEL: @_Z20test_svset_neonq_mf8u13__SVMfloat8_t14__Mfloat8x16_t( +// CPP-CHECK-NEXT: entry: +// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.vector.insert.nxv16i8.v16i8(<vscale x 16 x i8> [[S:%.*]], <16 x i8> [[N:%.*]], i64 0) +// CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]] +// +svmfloat8_t test_svset_neonq_mf8(svmfloat8_t s, mfloat8x16_t n) { + return SVE_ACLE_FUNC(svset_neonq, _mf8, , )(s, n); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
