simon_tatham created this revision. simon_tatham added reviewers: lenary, tmatheson, DavidSpickett, efriedma. Herald added a subscriber: kristof.beyls. Herald added a project: All. simon_tatham requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
On some R-profile CPUs, leaving out the FPU is an option. Clang will accept `-march=armv8-r+nofp`, but it's currently not possible to find out via the preprocessor whether it's in that mode (e.g. to change or disable inline asm statements in your code). The __ARM_FP macro, which has a bit set for each size of floating point number supported by the hardware, is the natural thing to test. But Clang was defining it unconditionally on AArch64. Now it checks for FP support before defining it at all. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D145781 Files: clang/lib/Basic/Targets/AArch64.cpp clang/lib/Basic/Targets/AArch64.h clang/test/Preprocessor/aarch64-target-features.c Index: clang/test/Preprocessor/aarch64-target-features.c =================================================================== --- clang/test/Preprocessor/aarch64-target-features.c +++ clang/test/Preprocessor/aarch64-target-features.c @@ -341,6 +341,10 @@ // CHECK-MARCH-2: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "-fp-armv8" "-target-feature" "-neon" "-target-feature" "-crc" "-target-feature" "-crypto" // CHECK-MARCH-3: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "-neon" +// While we're checking +nofp, also make sure it stops defining __ARM_FP +// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-r+nofp -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-NOFP %s +// CHECK-NOFP-NOT: #define __ARM_FP{{ }} + // Check +sm4: // // RUN: %clang -target aarch64 -march=armv8.2a+sm4 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-SM4 %s Index: clang/lib/Basic/Targets/AArch64.h =================================================================== --- clang/lib/Basic/Targets/AArch64.h +++ clang/lib/Basic/Targets/AArch64.h @@ -26,7 +26,7 @@ static const TargetInfo::GCCRegAlias GCCRegAliases[]; static const char *const GCCRegNames[]; - enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) }; + enum FPUModeEnum { FPUMode = (1 << 0), NeonMode = (1 << 1), SveMode = (1 << 2) }; unsigned FPU = FPUMode; bool HasCRC = false; @@ -73,6 +73,7 @@ bool HasWFxT = false; bool HasJSCVT = false; bool HasFCMA = false; + bool HasNoFP = false; bool HasNoNeon = false; bool HasNoSVE = false; bool HasFMV = true; Index: clang/lib/Basic/Targets/AArch64.cpp =================================================================== --- clang/lib/Basic/Targets/AArch64.cpp +++ clang/lib/Basic/Targets/AArch64.cpp @@ -373,7 +373,8 @@ Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4"); // 0xe implies support for half, single and double precision operations. - Builder.defineMacro("__ARM_FP", "0xE"); + if (FPU & FPUMode) + Builder.defineMacro("__ARM_FP", "0xE"); // PCS specifies this for SysV variants, which is all we support. Other ABIs // may choose __ARM_FP16_FORMAT_ALTERNATIVE. @@ -709,6 +710,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) { for (const auto &Feature : Features) { + if (Feature == "-fp-armv8") + HasNoFP = true; if (Feature == "-neon") HasNoNeon = true; if (Feature == "-sve") @@ -937,6 +940,11 @@ setDataLayout(); setArchFeatures(); + if (HasNoFP) { + FPU &= ~FPUMode; + FPU &= ~NeonMode; + FPU &= ~SveMode; + } if (HasNoNeon) { FPU &= ~NeonMode; FPU &= ~SveMode;
Index: clang/test/Preprocessor/aarch64-target-features.c =================================================================== --- clang/test/Preprocessor/aarch64-target-features.c +++ clang/test/Preprocessor/aarch64-target-features.c @@ -341,6 +341,10 @@ // CHECK-MARCH-2: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "-fp-armv8" "-target-feature" "-neon" "-target-feature" "-crc" "-target-feature" "-crypto" // CHECK-MARCH-3: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "-neon" +// While we're checking +nofp, also make sure it stops defining __ARM_FP +// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-r+nofp -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-NOFP %s +// CHECK-NOFP-NOT: #define __ARM_FP{{ }} + // Check +sm4: // // RUN: %clang -target aarch64 -march=armv8.2a+sm4 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-SM4 %s Index: clang/lib/Basic/Targets/AArch64.h =================================================================== --- clang/lib/Basic/Targets/AArch64.h +++ clang/lib/Basic/Targets/AArch64.h @@ -26,7 +26,7 @@ static const TargetInfo::GCCRegAlias GCCRegAliases[]; static const char *const GCCRegNames[]; - enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) }; + enum FPUModeEnum { FPUMode = (1 << 0), NeonMode = (1 << 1), SveMode = (1 << 2) }; unsigned FPU = FPUMode; bool HasCRC = false; @@ -73,6 +73,7 @@ bool HasWFxT = false; bool HasJSCVT = false; bool HasFCMA = false; + bool HasNoFP = false; bool HasNoNeon = false; bool HasNoSVE = false; bool HasFMV = true; Index: clang/lib/Basic/Targets/AArch64.cpp =================================================================== --- clang/lib/Basic/Targets/AArch64.cpp +++ clang/lib/Basic/Targets/AArch64.cpp @@ -373,7 +373,8 @@ Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4"); // 0xe implies support for half, single and double precision operations. - Builder.defineMacro("__ARM_FP", "0xE"); + if (FPU & FPUMode) + Builder.defineMacro("__ARM_FP", "0xE"); // PCS specifies this for SysV variants, which is all we support. Other ABIs // may choose __ARM_FP16_FORMAT_ALTERNATIVE. @@ -709,6 +710,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) { for (const auto &Feature : Features) { + if (Feature == "-fp-armv8") + HasNoFP = true; if (Feature == "-neon") HasNoNeon = true; if (Feature == "-sve") @@ -937,6 +940,11 @@ setDataLayout(); setArchFeatures(); + if (HasNoFP) { + FPU &= ~FPUMode; + FPU &= ~NeonMode; + FPU &= ~SveMode; + } if (HasNoNeon) { FPU &= ~NeonMode; FPU &= ~SveMode;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits