Skip to content

Commit 888d48c

Browse files
[LLVM][AArch64]CFINV - Add UNPREDICTABLE behaviour if CRm is not zero
Now CFINV follows AXFLAGS behaviour for CRm. It looks like (0) in the instruction encoding means that the behaviour is UNPREDICTABLE if that bit is not zero.
1 parent e3950a0 commit 888d48c

File tree

3 files changed

+163
-0
lines changed

3 files changed

+163
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
From f31b5b2fa13f047ebef3f5a3dab35382379b8914 Mon Sep 17 00:00:00 2001
2+
From: CarolineConcatto <[email protected]>
3+
Date: Mon, 19 May 2025 18:21:28 +0000
4+
Subject: [PATCH] Add FP8 ACLE macros implementation
5+
6+
This patch implements the macros described in the ACLE[1]
7+
8+
[1] https://github.com/ARM-software/acle/blob/main/main/acle.md#modal-8-bit-floating-point-extensions
9+
---
10+
clang/lib/Basic/Targets/AArch64.cpp | 59 +++++++++++++++++++
11+
clang/lib/Basic/Targets/AArch64.h | 9 +++
12+
.../Preprocessor/aarch64-target-features.c | 31 ++++++++++
13+
3 files changed, 99 insertions(+)
14+
15+
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
16+
index e1f6c7b834dc..7267b17704a4 100644
17+
--- a/clang/lib/Basic/Targets/AArch64.cpp
18+
+++ b/clang/lib/Basic/Targets/AArch64.cpp
19+
@@ -596,6 +596,33 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
20+
if (HasSMEB16B16)
21+
Builder.defineMacro("__ARM_FEATURE_SME_B16B16", "1");
22+
23+
+ if (HasFP8)
24+
+ Builder.defineMacro("__ARM_FEATURE_FP8", "1");
25+
+
26+
+ if (HasFP8FMA)
27+
+ Builder.defineMacro("__ARM_FEATURE_FP8FMA", "1");
28+
+
29+
+ if (HasFP8DOT2)
30+
+ Builder.defineMacro("__ARM_FEATURE_FP8DOT2", "1");
31+
+
32+
+ if (HasFP8DOT4)
33+
+ Builder.defineMacro("__ARM_FEATURE_FP8DOT4", "1");
34+
+
35+
+ if (HasSSVE_FP8DOT2)
36+
+ Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT2", "1");
37+
+
38+
+ if (HasSSVE_FP8DOT4)
39+
+ Builder.defineMacro("__ARM_FEATURE_SSVE_FP8DOT4", "1");
40+
+
41+
+ if (HasSSVE_FP8FMA)
42+
+ Builder.defineMacro("__ARM_FEATURE_SSVE_FP8FMA", "1");
43+
+
44+
+ if (HasSME_F8F32)
45+
+ Builder.defineMacro("__ARM_FEATURE_SME_F8F32", "1");
46+
+
47+
+ if (HasSME_F8F16)
48+
+ Builder.defineMacro("__ARM_FEATURE_SME_F8F16", "1");
49+
+
50+
if (HasCRC)
51+
Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
52+
53+
@@ -885,6 +912,15 @@ bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
54+
.Cases("ls64", "ls64_v", "ls64_accdata", HasLS64)
55+
.Case("wfxt", HasWFxT)
56+
.Case("rcpc3", HasRCPC3)
57+
+ .Case("fp8", HasFP8)
58+
+ .Case("fp8fma", HasFP8FMA)
59+
+ .Case("fp8dot2", HasFP8DOT2)
60+
+ .Case("fp8dot4", HasFP8DOT4)
61+
+ .Case("ssve-fp8dot2", HasSSVE_FP8DOT2)
62+
+ .Case("ssve-fp8dot4", HasSSVE_FP8DOT4)
63+
+ .Case("ssve-fp8fma", HasSSVE_FP8FMA)
64+
+ .Case("sme-f8f32", HasSME_F8F32)
65+
+ .Case("sme-f8f16", HasSME_F8F16)
66+
.Default(false);
67+
}
68+
69+
@@ -1046,6 +1082,29 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
70+
HasSVEB16B16 = true;
71+
HasSMEB16B16 = true;
72+
}
73+
+
74+
+ if (Feature == "+fp8")
75+
+ HasFP8 = true;
76+
+ if (Feature == "+fp8fma")
77+
+ HasFP8FMA = true;
78+
+ if (Feature == "+fp8dot2")
79+
+ HasFP8DOT2 = true;
80+
+ if (Feature == "+fp8dot4")
81+
+ HasFP8DOT4 = true;
82+
+ if (Feature == "+ssve-fp8dot2")
83+
+ HasSSVE_FP8DOT2 = true;
84+
+ if (Feature == "+ssve-fp8dot4")
85+
+ HasSSVE_FP8DOT4 = true;
86+
+ if (Feature == "+ssve-fp8fma")
87+
+ HasSSVE_FP8FMA = true;
88+
+ if (Feature == "+sme-f8f32") {
89+
+ HasSME2 = true;
90+
+ HasSME_F8F32 = true;
91+
+ }
92+
+ if (Feature == "+sme-f8f16") {
93+
+ HasSME2 = true;
94+
+ HasSME_F8F16 = true;
95+
+ }
96+
if (Feature == "+sb")
97+
HasSB = true;
98+
if (Feature == "+predres")
99+
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
100+
index 6eeac69af20d..7230f22d5bb8 100644
101+
--- a/clang/lib/Basic/Targets/AArch64.h
102+
+++ b/clang/lib/Basic/Targets/AArch64.h
103+
@@ -106,6 +106,15 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
104+
bool HasSMEF16F16 = false;
105+
bool HasSMEB16B16 = false;
106+
bool HasSME2p1 = false;
107+
+ bool HasFP8 = false;
108+
+ bool HasFP8FMA = false;
109+
+ bool HasFP8DOT2 = false;
110+
+ bool HasFP8DOT4 = false;
111+
+ bool HasSSVE_FP8DOT2 = false;
112+
+ bool HasSSVE_FP8DOT4 = false;
113+
+ bool HasSSVE_FP8FMA = false;
114+
+ bool HasSME_F8F32 = false;
115+
+ bool HasSME_F8F16 = false;
116+
bool HasSB = false;
117+
bool HasPredRes = false;
118+
bool HasSSBS = false;
119+
diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c
120+
index 3f801c434494..52045d216262 100644
121+
--- a/clang/test/Preprocessor/aarch64-target-features.c
122+
+++ b/clang/test/Preprocessor/aarch64-target-features.c
123+
@@ -744,3 +744,34 @@
124+
// CHECK-SMEB16B16: __ARM_FEATURE_SME2 1
125+
// CHECK-SMEB16B16: __ARM_FEATURE_SME_B16B16 1
126+
// CHECK-SMEB16B16: __ARM_FEATURE_SVE_B16B16 1
127+
+//
128+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8 %s
129+
+// CHECK-FP8: __ARM_FEATURE_FP8 1
130+
+
131+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8FMA %s
132+
+// CHECK-FP8FMA: __ARM_FEATURE_FP8FMA 1
133+
+
134+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT2 %s
135+
+// CHECK-FP8DOT2: __ARM_FEATURE_FP8DOT2 1
136+
+
137+
+// RUN: %clang --target=aarch64 -march=armv9-a+fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FP8DOT4 %s
138+
+// CHECK-FP8DOT4: __ARM_FEATURE_FP8DOT4 1
139+
+
140+
+// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT2 %s
141+
+// CHECK-SSVE-FP8DOT2: __ARM_FEATURE_SSVE_FP8DOT2 1
142+
+
143+
+// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8dot4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8DOT4 %s
144+
+// CHECK-SSVE-FP8DOT4: __ARM_FEATURE_SSVE_FP8DOT4 1
145+
+
146+
+// RUN: %clang --target=aarch64 -march=armv9-a+ssve-fp8fma -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SSVE-FP8FMA %s
147+
+// CHECK-SSVE-FP8FMA: __ARM_FEATURE_SSVE_FP8FMA 1
148+
+
149+
+// RUN: %clang --target=aarch64 -march=armv9-a+sme-f8f32 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SMEF8F32 %s
150+
+// CHECK-SMEF8F32: __ARM_FEATURE_LOCALLY_STREAMING 1
151+
+// CHECK-SMEF8F32: __ARM_FEATURE_SME2 1
152+
+// CHECK-SMEF8F32: __ARM_FEATURE_SME_F8F32 1
153+
+
154+
+// RUN: %clang --target=aarch64 -march=armv9-a+sme-f8f16 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SMEF8F16 %s
155+
+// CHECK-SMEF8F16: __ARM_FEATURE_LOCALLY_STREAMING 1
156+
+// CHECK-SMEF8F16: __ARM_FEATURE_SME2 1
157+
+// CHECK-SMEF8F16: __ARM_FEATURE_SME_F8F16 1
158+
--
159+
2.43.0
160+

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,7 @@ def FJCVTZS : BaseFPToIntegerUnscaled<0b01, 0b11, 0b110, FPR64, GPR32,
20962096
let Predicates = [HasFlagM], Defs = [NZCV], Uses = [NZCV] in {
20972097
def CFINV : SimpleSystemI<0, (ins), "cfinv", "">, Sched<[WriteSys]> {
20982098
let Inst{20-5} = 0b0000001000000000;
2099+
let Unpredictable{11-8} = 0b1111;
20992100
}
21002101
def SETF8 : BaseFlagManipulation<0, 0, (ins GPR32:$Rn), "setf8", "{\t$Rn}">;
21012102
def SETF16 : BaseFlagManipulation<0, 1, (ins GPR32:$Rn), "setf16", "{\t$Rn}">;

llvm/test/MC/Disassembler/AArch64/armv8.4a-flag.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
# RUN: llvm-mc -triple aarch64-none-linux-gnu -mattr=+v8r --disassemble < %s | FileCheck %s
33

44
[0x1f,0x40,0x00,0xd5]
5+
[0x1f,0x4f,0x00,0xd5]
56
[0x2d,0x08,0x00,0x3a]
67
[0x2d,0x48,0x00,0x3a]
78
[0x2f,0x84,0x1f,0xba]
89

10+
#CHECK: cfinv
911
#CHECK: cfinv
1012
#CHECK: setf8 w1
1113
#CHECK: setf16 w1

0 commit comments

Comments
 (0)