[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/CarolineConcatto closed https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/paulwalker-arm approved this pull request. https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -744,3 +744,38 @@ // CHECK-SMEB16B16: __ARM_FEATURE_SME2 1 // CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1 // CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1 +// +// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8 %s +// CHECK-FP8: __ARM_FEATURE_FP8 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8FMA %s +// CHECK-FP8FMA: __ARM_FEATURE_FP8 1 +// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT2 %s +// CHECK-FP8DOT2: __ARM_FEATURE_FP8 1 +// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT4 %s +// CHECK-FP8DOT4: __ARM_FEATURE_FP8 1 +// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT2 %s +// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SME2 1 +// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SSVE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT4 %s +// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SME2 1 +// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SSVE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8FMA %s +// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SME2 1 +// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SSVE_FP8FMA 1 paulwalker-arm wrote: Can the three `_ssve-fp8...` options also check for `__ARM_FEATURE_FP8`? https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/paulwalker-arm edited https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/paulwalker-arm commented: Last question but otherwise this looks good to me. https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/CarolineConcatto updated
https://github.com/llvm/llvm-project/pull/140591
>From 22e44648ce4ec1c747406f7d98ae7c736d0e441c Mon Sep 17 00:00:00 2001
From: CarolineConcatto
Date: Mon, 19 May 2025 18:21:28 +
Subject: [PATCH 1/2] [Clang][AArch64]Add FP8 ACLE macros implementation
This patch implements the macros described in the ACLE[1]
[1]
https://github.com/ARM-software/acle/blob/main/main/acle.md#modal-8-bit-floating-point-extensions
---
clang/lib/Basic/Targets/AArch64.cpp | 59 +++
clang/lib/Basic/Targets/AArch64.h | 9 +++
.../Preprocessor/aarch64-target-features.c| 31 ++
3 files changed, 99 insertions(+)
diff --git a/clang/lib/Basic/Targets/AArch64.cpp
b/clang/lib/Basic/Targets/AArch64.cpp
index e1f6c7b834dc7..7267b17704a41 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -596,6 +596,33 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions
&Opts,
if (HasSMEB16B16)
Builder.defineMacro("__ARM_FEATURE_SME_B16B16", "1");
+ if (HasFP8)
+Builder.defineMacro("__ARM_FEATURE_FP8", "1");
+
+ if (HasFP8FMA)
+Builder.defineMacro("__ARM_FEATURE_FP8FMA", "1");
+
+ if (HasFP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT2", "1");
+
+ if (HasFP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT2", "1");
+
+ if (HasSSVE_FP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8FMA)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8FMA", "1");
+
+ if (HasSME_F8F32)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F32", "1");
+
+ if (HasSME_F8F16)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F16", "1");
+
if (HasCRC)
Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
@@ -885,6 +912,15 @@ bool AArch64TargetInfo::hasFeature(StringRef Feature)
const {
.Cases("ls64", "ls64_v", "ls64_accdata", HasLS64)
.Case("wfxt", HasWFxT)
.Case("rcpc3", HasRCPC3)
+ .Case("fp8", HasFP8)
+ .Case("fp8fma", HasFP8FMA)
+ .Case("fp8dot2", HasFP8DOT2)
+ .Case("fp8dot4", HasFP8DOT4)
+ .Case("ssve-fp8dot2", HasSSVE_FP8DOT2)
+ .Case("ssve-fp8dot4", HasSSVE_FP8DOT4)
+ .Case("ssve-fp8fma", HasSSVE_FP8FMA)
+ .Case("sme-f8f32", HasSME_F8F32)
+ .Case("sme-f8f16", HasSME_F8F16)
.Default(false);
}
@@ -1046,6 +1082,29 @@ bool
AArch64TargetInfo::handleTargetFeatures(std::vector &Features,
HasSVEB16B16 = true;
HasSMEB16B16 = true;
}
+
+if (Feature == "+fp8")
+ HasFP8 = true;
+if (Feature == "+fp8fma")
+ HasFP8FMA = true;
+if (Feature == "+fp8dot2")
+ HasFP8DOT2 = true;
+if (Feature == "+fp8dot4")
+ HasFP8DOT4 = true;
+if (Feature == "+ssve-fp8dot2")
+ HasSSVE_FP8DOT2 = true;
+if (Feature == "+ssve-fp8dot4")
+ HasSSVE_FP8DOT4 = true;
+if (Feature == "+ssve-fp8fma")
+ HasSSVE_FP8FMA = true;
+if (Feature == "+sme-f8f32") {
+ HasSME2 = true;
+ HasSME_F8F32 = true;
+}
+if (Feature == "+sme-f8f16") {
+ HasSME2 = true;
+ HasSME_F8F16 = true;
+}
if (Feature == "+sb")
HasSB = true;
if (Feature == "+predres")
diff --git a/clang/lib/Basic/Targets/AArch64.h
b/clang/lib/Basic/Targets/AArch64.h
index 6eeac69af20df..7230f22d5bb86 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -106,6 +106,15 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public
TargetInfo {
bool HasSMEF16F16 = false;
bool HasSMEB16B16 = false;
bool HasSME2p1 = false;
+ bool HasFP8 = false;
+ bool HasFP8FMA = false;
+ bool HasFP8DOT2 = false;
+ bool HasFP8DOT4 = false;
+ bool HasSSVE_FP8DOT2 = false;
+ bool HasSSVE_FP8DOT4 = false;
+ bool HasSSVE_FP8FMA = false;
+ bool HasSME_F8F32 = false;
+ bool HasSME_F8F16 = false;
bool HasSB = false;
bool HasPredRes = false;
bool HasSSBS = false;
diff --git a/clang/test/Preprocessor/aarch64-target-features.c
b/clang/test/Preprocessor/aarch64-target-features.c
index 3f801c4344940..52045d216262f 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -744,3 +744,34 @@
// CHECK-SMEB16B16: __ARM_FEATURE_SME2 1
// CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1
// CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1
+//
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8 %s
+// CHECK-FP8: __ARM_FEATURE_FP8 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8FMA %s
+// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8DOT2 %s
+// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -1046,6 +1082,29 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector &Features, HasSVEB16B16 = true; HasSMEB16B16 = true; } + +if (Feature == "+fp8") + HasFP8 = true; +if (Feature == "+fp8fma") + HasFP8FMA = true; +if (Feature == "+fp8dot2") + HasFP8DOT2 = true; +if (Feature == "+fp8dot4") + HasFP8DOT4 = true; +if (Feature == "+ssve-fp8dot2") + HasSSVE_FP8DOT2 = true; paulwalker-arm wrote: This and the other `SSVE` features should also set `HasSME2`? https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -1046,6 +1082,29 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector &Features, HasSVEB16B16 = true; HasSMEB16B16 = true; } + +if (Feature == "+fp8") + HasFP8 = true; +if (Feature == "+fp8fma") paulwalker-arm wrote: `fp8...` feature extensions should also set `HasFP8`? https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -744,3 +744,34 @@ // CHECK-SMEB16B16: __ARM_FEATURE_SME2 1 // CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1 // CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1 +// +// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8 %s +// CHECK-FP8: __ARM_FEATURE_FP8 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8FMA %s +// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT2 %s +// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT4 %s +// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT2 %s +// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SSVE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT4 %s +// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SSVE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8FMA %s +// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SSVE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+sme-f8f32 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SMEF8F32 %s +// CHECK-SMEF8F32: __ARM_FEATURE_LOCALLY_STREAMING 1 paulwalker-arm wrote: Ok, in which case this is likely an extension of the previous point. If the feature relationships have to be duplicated then it makes sense we verify `__ARM_FEATURE_LOCALLY_STREAMING` here. If they don't and `AArch64Features.td` ensures the expected SME feature flags get defined, then we don't need to reverify them here. https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -1046,6 +1082,29 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector &Features, HasSVEB16B16 = true; HasSMEB16B16 = true; } + +if (Feature == "+fp8") + HasFP8 = true; +if (Feature == "+fp8fma") paulwalker-arm wrote: I don't fully understand the effect of setting these bools and how the dependencies in `AArch64Features.td` correspond to setting the feature macros. What I'm mainly after is consistency and so for the SME2 extensions you're setting `HasSME2` as well. So I guess the question is why that is necessary? If it's not, then perhaps the way to go is to remove those rather than adding the ones I suggest. The most important part to verify is that all the feature macros a user would expect to be defined by a specific +feat are in fact defined. If that is managed by `AArch64Features.td` then great, if not then that would explain why the key feature dependencies are duplicated here. https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -1046,6 +1082,29 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector &Features, HasSVEB16B16 = true; HasSMEB16B16 = true; } + +if (Feature == "+fp8") + HasFP8 = true; +if (Feature == "+fp8fma") CarolineConcatto wrote: I could. I am not sure I should reproduce the same we have in lib/Target/AArch64/AArch64Features.td also here. Is that what you are suggestion here? At first glance it does not look like this is a representation of what we have in lib/Target/AArch64/AArch64Features.td https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -744,3 +744,34 @@ // CHECK-SMEB16B16: __ARM_FEATURE_SME2 1 // CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1 // CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1 +// +// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8 %s +// CHECK-FP8: __ARM_FEATURE_FP8 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8FMA %s +// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT2 %s +// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT4 %s +// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT2 %s +// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SSVE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT4 %s +// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SSVE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8FMA %s +// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SSVE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+sme-f8f32 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SMEF8F32 %s +// CHECK-SMEF8F32: __ARM_FEATURE_LOCALLY_STREAMING 1 CarolineConcatto wrote: Do you mean for the sme-f8f32 and sme-f8f16? If so I was just reproducing what was done for sme-b16b16 and sme-f16f16. https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
@@ -744,3 +744,34 @@ // CHECK-SMEB16B16: __ARM_FEATURE_SME2 1 // CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1 // CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1 +// +// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8 %s +// CHECK-FP8: __ARM_FEATURE_FP8 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8FMA %s +// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT2 %s +// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT4 %s +// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT2 %s +// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SSVE_FP8DOT2 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT4 %s +// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SSVE_FP8DOT4 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8FMA %s +// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SSVE_FP8FMA 1 + +// RUN: %clang --target=aarch64 -march=armv9-a+sme-f8f32 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SMEF8F32 %s +// CHECK-SMEF8F32: __ARM_FEATURE_LOCALLY_STREAMING 1 paulwalker-arm wrote: Are the two `__ARM_FEATURE_LOCALLY_STREAMING` checks relevant for the tests? https://github.com/llvm/llvm-project/pull/140591 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
llvmbot wrote:
@llvm/pr-subscribers-backend-aarch64
Author: None (CarolineConcatto)
Changes
This patch implements the macros described in the ACLE[1]
[1]
https://github.com/ARM-software/acle/blob/main/main/acle.md#modal-8-bit-floating-point-extensions
---
Full diff: https://github.com/llvm/llvm-project/pull/140591.diff
3 Files Affected:
- (modified) clang/lib/Basic/Targets/AArch64.cpp (+59)
- (modified) clang/lib/Basic/Targets/AArch64.h (+9)
- (modified) clang/test/Preprocessor/aarch64-target-features.c (+31)
``diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp
b/clang/lib/Basic/Targets/AArch64.cpp
index e1f6c7b834dc7..7267b17704a41 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -596,6 +596,33 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions
&Opts,
if (HasSMEB16B16)
Builder.defineMacro("__ARM_FEATURE_SME_B16B16", "1");
+ if (HasFP8)
+Builder.defineMacro("__ARM_FEATURE_FP8", "1");
+
+ if (HasFP8FMA)
+Builder.defineMacro("__ARM_FEATURE_FP8FMA", "1");
+
+ if (HasFP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT2", "1");
+
+ if (HasFP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT2", "1");
+
+ if (HasSSVE_FP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8FMA)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8FMA", "1");
+
+ if (HasSME_F8F32)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F32", "1");
+
+ if (HasSME_F8F16)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F16", "1");
+
if (HasCRC)
Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
@@ -885,6 +912,15 @@ bool AArch64TargetInfo::hasFeature(StringRef Feature)
const {
.Cases("ls64", "ls64_v", "ls64_accdata", HasLS64)
.Case("wfxt", HasWFxT)
.Case("rcpc3", HasRCPC3)
+ .Case("fp8", HasFP8)
+ .Case("fp8fma", HasFP8FMA)
+ .Case("fp8dot2", HasFP8DOT2)
+ .Case("fp8dot4", HasFP8DOT4)
+ .Case("ssve-fp8dot2", HasSSVE_FP8DOT2)
+ .Case("ssve-fp8dot4", HasSSVE_FP8DOT4)
+ .Case("ssve-fp8fma", HasSSVE_FP8FMA)
+ .Case("sme-f8f32", HasSME_F8F32)
+ .Case("sme-f8f16", HasSME_F8F16)
.Default(false);
}
@@ -1046,6 +1082,29 @@ bool
AArch64TargetInfo::handleTargetFeatures(std::vector &Features,
HasSVEB16B16 = true;
HasSMEB16B16 = true;
}
+
+if (Feature == "+fp8")
+ HasFP8 = true;
+if (Feature == "+fp8fma")
+ HasFP8FMA = true;
+if (Feature == "+fp8dot2")
+ HasFP8DOT2 = true;
+if (Feature == "+fp8dot4")
+ HasFP8DOT4 = true;
+if (Feature == "+ssve-fp8dot2")
+ HasSSVE_FP8DOT2 = true;
+if (Feature == "+ssve-fp8dot4")
+ HasSSVE_FP8DOT4 = true;
+if (Feature == "+ssve-fp8fma")
+ HasSSVE_FP8FMA = true;
+if (Feature == "+sme-f8f32") {
+ HasSME2 = true;
+ HasSME_F8F32 = true;
+}
+if (Feature == "+sme-f8f16") {
+ HasSME2 = true;
+ HasSME_F8F16 = true;
+}
if (Feature == "+sb")
HasSB = true;
if (Feature == "+predres")
diff --git a/clang/lib/Basic/Targets/AArch64.h
b/clang/lib/Basic/Targets/AArch64.h
index 6eeac69af20df..7230f22d5bb86 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -106,6 +106,15 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public
TargetInfo {
bool HasSMEF16F16 = false;
bool HasSMEB16B16 = false;
bool HasSME2p1 = false;
+ bool HasFP8 = false;
+ bool HasFP8FMA = false;
+ bool HasFP8DOT2 = false;
+ bool HasFP8DOT4 = false;
+ bool HasSSVE_FP8DOT2 = false;
+ bool HasSSVE_FP8DOT4 = false;
+ bool HasSSVE_FP8FMA = false;
+ bool HasSME_F8F32 = false;
+ bool HasSME_F8F16 = false;
bool HasSB = false;
bool HasPredRes = false;
bool HasSSBS = false;
diff --git a/clang/test/Preprocessor/aarch64-target-features.c
b/clang/test/Preprocessor/aarch64-target-features.c
index 3f801c4344940..52045d216262f 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -744,3 +744,34 @@
// CHECK-SMEB16B16: __ARM_FEATURE_SME2 1
// CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1
// CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1
+//
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8 %s
+// CHECK-FP8: __ARM_FEATURE_FP8 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8FMA %s
+// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8DOT2 %s
+// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8DOT4 %s
+// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1
+
+// RUN: %clang --target=aarch64 -march=
[clang] [Clang][AArch64]Add FP8 ACLE macros implementation (PR #140591)
https://github.com/CarolineConcatto created
https://github.com/llvm/llvm-project/pull/140591
This patch implements the macros described in the ACLE[1]
[1]
https://github.com/ARM-software/acle/blob/main/main/acle.md#modal-8-bit-floating-point-extensions
>From 22e44648ce4ec1c747406f7d98ae7c736d0e441c Mon Sep 17 00:00:00 2001
From: CarolineConcatto
Date: Mon, 19 May 2025 18:21:28 +
Subject: [PATCH] [Clang][AArch64]Add FP8 ACLE macros implementation
This patch implements the macros described in the ACLE[1]
[1]
https://github.com/ARM-software/acle/blob/main/main/acle.md#modal-8-bit-floating-point-extensions
---
clang/lib/Basic/Targets/AArch64.cpp | 59 +++
clang/lib/Basic/Targets/AArch64.h | 9 +++
.../Preprocessor/aarch64-target-features.c| 31 ++
3 files changed, 99 insertions(+)
diff --git a/clang/lib/Basic/Targets/AArch64.cpp
b/clang/lib/Basic/Targets/AArch64.cpp
index e1f6c7b834dc7..7267b17704a41 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -596,6 +596,33 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions
&Opts,
if (HasSMEB16B16)
Builder.defineMacro("__ARM_FEATURE_SME_B16B16", "1");
+ if (HasFP8)
+Builder.defineMacro("__ARM_FEATURE_FP8", "1");
+
+ if (HasFP8FMA)
+Builder.defineMacro("__ARM_FEATURE_FP8FMA", "1");
+
+ if (HasFP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT2", "1");
+
+ if (HasFP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8DOT2)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT2", "1");
+
+ if (HasSSVE_FP8DOT4)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT4", "1");
+
+ if (HasSSVE_FP8FMA)
+Builder.defineMacro("__ARM_FEATURE_SSVE_FP8FMA", "1");
+
+ if (HasSME_F8F32)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F32", "1");
+
+ if (HasSME_F8F16)
+Builder.defineMacro("__ARM_FEATURE_SME_F8F16", "1");
+
if (HasCRC)
Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
@@ -885,6 +912,15 @@ bool AArch64TargetInfo::hasFeature(StringRef Feature)
const {
.Cases("ls64", "ls64_v", "ls64_accdata", HasLS64)
.Case("wfxt", HasWFxT)
.Case("rcpc3", HasRCPC3)
+ .Case("fp8", HasFP8)
+ .Case("fp8fma", HasFP8FMA)
+ .Case("fp8dot2", HasFP8DOT2)
+ .Case("fp8dot4", HasFP8DOT4)
+ .Case("ssve-fp8dot2", HasSSVE_FP8DOT2)
+ .Case("ssve-fp8dot4", HasSSVE_FP8DOT4)
+ .Case("ssve-fp8fma", HasSSVE_FP8FMA)
+ .Case("sme-f8f32", HasSME_F8F32)
+ .Case("sme-f8f16", HasSME_F8F16)
.Default(false);
}
@@ -1046,6 +1082,29 @@ bool
AArch64TargetInfo::handleTargetFeatures(std::vector &Features,
HasSVEB16B16 = true;
HasSMEB16B16 = true;
}
+
+if (Feature == "+fp8")
+ HasFP8 = true;
+if (Feature == "+fp8fma")
+ HasFP8FMA = true;
+if (Feature == "+fp8dot2")
+ HasFP8DOT2 = true;
+if (Feature == "+fp8dot4")
+ HasFP8DOT4 = true;
+if (Feature == "+ssve-fp8dot2")
+ HasSSVE_FP8DOT2 = true;
+if (Feature == "+ssve-fp8dot4")
+ HasSSVE_FP8DOT4 = true;
+if (Feature == "+ssve-fp8fma")
+ HasSSVE_FP8FMA = true;
+if (Feature == "+sme-f8f32") {
+ HasSME2 = true;
+ HasSME_F8F32 = true;
+}
+if (Feature == "+sme-f8f16") {
+ HasSME2 = true;
+ HasSME_F8F16 = true;
+}
if (Feature == "+sb")
HasSB = true;
if (Feature == "+predres")
diff --git a/clang/lib/Basic/Targets/AArch64.h
b/clang/lib/Basic/Targets/AArch64.h
index 6eeac69af20df..7230f22d5bb86 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -106,6 +106,15 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public
TargetInfo {
bool HasSMEF16F16 = false;
bool HasSMEB16B16 = false;
bool HasSME2p1 = false;
+ bool HasFP8 = false;
+ bool HasFP8FMA = false;
+ bool HasFP8DOT2 = false;
+ bool HasFP8DOT4 = false;
+ bool HasSSVE_FP8DOT2 = false;
+ bool HasSSVE_FP8DOT4 = false;
+ bool HasSSVE_FP8FMA = false;
+ bool HasSME_F8F32 = false;
+ bool HasSME_F8F16 = false;
bool HasSB = false;
bool HasPredRes = false;
bool HasSSBS = false;
diff --git a/clang/test/Preprocessor/aarch64-target-features.c
b/clang/test/Preprocessor/aarch64-target-features.c
index 3f801c4344940..52045d216262f 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -744,3 +744,34 @@
// CHECK-SMEB16B16: __ARM_FEATURE_SME2 1
// CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1
// CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1
+//
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8 %s
+// CHECK-FP8: __ARM_FEATURE_FP8 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - |
FileCheck --check-prefix=CHECK-FP8FMA %s
+// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1
+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM
