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

Reply via email to