https://github.com/mstorsjo created https://github.com/llvm/llvm-project/pull/134366
Previously, FPU features were not collected when forming a list of features for the Assembler. This fixes a regression from 8fa0f0efce5fb81eb422e6d7eec74c66dafef4a3, which caused VFPv4 to be unavailable if assembling for an armv7s-apple-darwin target. From 6d04e18124344a81a699db618e401e707411d020 Mon Sep 17 00:00:00 2001 From: Jack Styles <jack.sty...@arm.com> Date: Fri, 7 Mar 2025 15:49:00 +0000 Subject: [PATCH] [Clang] [ARM] Ensure FPU Features are collected when using the Clang Assembler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, FPU features were not collected when forming a list of features for the Assembler. This fixes a regression from 8fa0f0efce5fb81eb422e6d7eec74c66dafef4a3, which caused VFPv4 to be unavailable if assembling for an armv7s-apple-darwin target. Co-authored-by: Martin Storsjö <mar...@martin.st> --- clang/docs/ReleaseNotes.rst | 4 ++ clang/lib/Driver/ToolChains/Arch/ARM.cpp | 17 ++++---- clang/test/Driver/arm-fpu-selection.s | 32 +++++++++++++++ clang/test/Driver/armv7-default-neon.s | 8 ++++ clang/test/Driver/armv7s-default-vfpv4.s | 6 +++ clang/test/Driver/armv8.1m.main.s | 51 ++++++++++++++++-------- 6 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 clang/test/Driver/arm-fpu-selection.s create mode 100644 clang/test/Driver/armv7-default-neon.s create mode 100644 clang/test/Driver/armv7s-default-vfpv4.s diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index c4e82678949ff..2267f0d06e834 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -38,6 +38,9 @@ Potentially Breaking Changes - Fix missing diagnostics for uses of declarations when performing typename access, such as when performing member access on a '[[deprecated]]' type alias. (#GH58547) +- For ARM targets, when using cc1as, the features included in the selected CPU or + Arch's FPU are now loaded and utilized. If you wish not to use a specific feature, + this will need appending to the command line used. C/C++ Language Potentially Breaking Changes ------------------------------------------- @@ -440,6 +443,7 @@ X86 Support Arm and AArch64 Support ^^^^^^^^^^^^^^^^^^^^^^^ +- For ARM targets, cc1as now considers the FPU's features for the selected CPU or Arch. Android Support ^^^^^^^^^^^^^^^ diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index e50cb3836f2c9..ff0e52aa285b1 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -679,20 +679,17 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, CPUArgFPUKind != llvm::ARM::FK_INVALID ? CPUArgFPUKind : ArchArgFPUKind; (void)llvm::ARM::getFPUFeatures(FPUKind, Features); } else { - bool Generic = true; - if (!ForAS) { - std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); - if (CPU != "generic") - Generic = false; - llvm::ARM::ArchKind ArchKind = - arm::getLLVMArchKindForARM(CPU, ArchName, Triple); - FPUKind = llvm::ARM::getDefaultFPU(CPU, ArchKind); - (void)llvm::ARM::getFPUFeatures(FPUKind, Features); - } + std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); + bool Generic = CPU == "generic"; if (Generic && (Triple.isOSWindows() || Triple.isOSDarwin()) && getARMSubArchVersionNumber(Triple) >= 7) { FPUKind = llvm::ARM::parseFPU("neon"); (void)llvm::ARM::getFPUFeatures(FPUKind, Features); + } else { + llvm::ARM::ArchKind ArchKind = + arm::getLLVMArchKindForARM(CPU, ArchName, Triple); + FPUKind = llvm::ARM::getDefaultFPU(CPU, ArchKind); + (void)llvm::ARM::getFPUFeatures(FPUKind, Features); } } diff --git a/clang/test/Driver/arm-fpu-selection.s b/clang/test/Driver/arm-fpu-selection.s new file mode 100644 index 0000000000000..c40e0f5b25852 --- /dev/null +++ b/clang/test/Driver/arm-fpu-selection.s @@ -0,0 +1,32 @@ +// REQUIRES: arm-registered-target +// Ensures that when targeting an ARM target with an Asm file, clang +// collects the features from the FPU. This is critical in the +// activation of NEON for supported targets. The Cortex-R52 will be +// used and tested for VFP and NEON Support + +// RUN: %clang -target arm-none-eabi -mcpu=cortex-r52 -c %s -o /dev/null | count 0 +// RUN: %clang -target arm-none-eabi -mcpu=cortex-r52 -c %s -o /dev/null -### 2>&1 | FileCheck --check-prefix=CHECK-TARGET-FEATURES %s + +// Check that NEON and VFPV5 have been activated when using Cortex-R52 when using cc1as +// CHECK-TARGET-FEATURES: "-target-feature" "+vfp2sp" +// CHECK-TARGET-FEATURES: "-target-feature" "+vfp3" +// CHECK-TARGET-FEATURES: "-target-feature" "+fp-armv8" +// CHECK-TARGET-FEATURES: "-target-feature" "+fp-armv8d16" +// CHECK-TARGET-FEATURES: "-target-feature" "+fp-armv8d16sp" +// CHECK-TARGET-FEATURES: "-target-feature" "+fp-armv8sp" +// CHECK-TARGET-FEATURES: "-target-feature" "+neon" + + vadd.f32 s0, s1, s2 + vadd.f64 d0, d1, d2 + vcvt.u32.f32 s0, s0, #1 + vcvt.u32.f64 d0, d0, #1 + vcvtb.f32.f16 s0, s1 + vcvtb.f64.f16 d0, s1 + vfma.f32 s0, s1, s2 + vfma.f64 d0, d1, d2 + vcvta.u32.f32 s0, s1 + vcvta.u32.f64 s0, d1 + vadd.f32 q0, q1, q2 + vcvt.f32.f16 q0, d1 + vfma.f32 q0, q1, q2 + vcvta.u32.f32 q0, q1 diff --git a/clang/test/Driver/armv7-default-neon.s b/clang/test/Driver/armv7-default-neon.s new file mode 100644 index 0000000000000..1b72cd65590bf --- /dev/null +++ b/clang/test/Driver/armv7-default-neon.s @@ -0,0 +1,8 @@ +// Ensure that we can assemble NEON by just specifying an armv7 +// Apple or Windows target. + +// REQUIRES: arm-registered-target +// RUN: %clang -c -target armv7-apple-darwin -o /dev/null %s +// RUN: %clang -c -target armv7-windows -o /dev/null %s + +vadd.i32 q0, q0, q0 diff --git a/clang/test/Driver/armv7s-default-vfpv4.s b/clang/test/Driver/armv7s-default-vfpv4.s new file mode 100644 index 0000000000000..bb7d8e860c400 --- /dev/null +++ b/clang/test/Driver/armv7s-default-vfpv4.s @@ -0,0 +1,6 @@ +// Ensure that we can assemble VFPv4 by just specifying an armv7s target. + +// REQUIRES: arm-registered-target +// RUN: %clang -c -target armv7s-apple-darwin -o /dev/null %s + +vfma.f32 q1, q2, q3 diff --git a/clang/test/Driver/armv8.1m.main.s b/clang/test/Driver/armv8.1m.main.s index 8fc94cf772fae..a660e56c2d1e7 100644 --- a/clang/test/Driver/armv8.1m.main.s +++ b/clang/test/Driver/armv8.1m.main.s @@ -8,21 +8,21 @@ # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+fp -o /dev/null %s 2>%t # RUN: FileCheck --check-prefix=ERROR-V81M_FP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+nofp -o /dev/null %s 2>%t -# RUN: FileCheck --check-prefix=ERROR-V81M_FP < %t %s +# RUN: FileCheck --check-prefix=ERROR-V81M_NOFP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+fp.dp -o /dev/null %s 2>%t # RUN: FileCheck --check-prefix=ERROR-V81M_FPDP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+nofp.dp -o /dev/null %s 2>%t -# RUN: FileCheck --check-prefix=ERROR-V81M_FPDP < %t %s +# RUN: FileCheck --check-prefix=ERROR-V81M_NOFPDP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+mve -o /dev/null %s 2>%t # RUN: FileCheck --check-prefix=ERROR-V81M_MVE < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+nomve -o /dev/null %s 2>%t -# RUN: FileCheck --check-prefix=ERROR-V81M_MVE < %t %s +# RUN: FileCheck --check-prefix=ERROR-V81M_NOMVE < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+mve+fp -o /dev/null %s 2>%t # RUN: FileCheck --check-prefix=ERROR-V81M_MVE_FP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+mve.fp -o /dev/null %s 2>%t # RUN: FileCheck --check-prefix=ERROR-V81M_MVEFP < %t %s # RUN: not %clang -c -target arm-none-none-eabi -march=armv8.1-m.main+nomve.fp -o /dev/null %s 2>%t -# RUN: FileCheck --check-prefix=ERROR-V81M_MVEFP < %t %s +# RUN: FileCheck --check-prefix=ERROR-V81M_NOMVEFP < %t %s .syntax unified .thumb @@ -35,28 +35,41 @@ qadd r0, r1, r2 # ERROR-V8M: :[[@LINE-1]]:1: error # ERROR-V81M: :[[@LINE-2]]:1: error # ERROR-V81M_FP: :[[@LINE-3]]:1: error -# ERROR-V81M_FPDP: :[[@LINE-4]]:1: error +# ERROR-V81M_NOFP: :[[@LINE-4]]:1: error +# ERROR-V81M_FPDP: :[[@LINE-5]]:1: error +# ERROR-V81M_NOFPDP: :[[@LINE-6]]:1: error +# ERROR-V81M_NOMVE: :[[@LINE-7]]:1: error +# ERROR-V81M_NOMVEFP: :[[@LINE-8]]:1: error vadd.f16 s0, s1, s2 # ERROR-V8M: :[[@LINE-1]]:1: error -# ERROR-V81M: :[[@LINE-2]]:1: error -# ERROR-V81M_DSP: :[[@LINE-3]]:1: error -# ERROR-V81M_MVE: :[[@LINE-4]]:1: error +# ERROR-V81M_NOFP: :[[@LINE-2]]:1: error vabs.f32 s0, s1 -# ERROR-V8M: :[[@LINE-1]]:1: error -# ERROR-V81M: :[[@LINE-2]]:1: error -# ERROR-V81M_DSP: :[[@LINE-3]]:1: error -# ERROR-V81M_MVE: :[[@LINE-4]]:1: error +# ERROR-V81M_NOFP: :[[@LINE-1]]:1: error -vcmp.f64 d0,d1 +vabs.s32 q0, q1 # ERROR-V8M: :[[@LINE-1]]:1: error # ERROR-V81M: :[[@LINE-2]]:1: error # ERROR-V81M_DSP: :[[@LINE-3]]:1: error # ERROR-V81M_FP: :[[@LINE-4]]:1: error -# ERROR-V81M_MVE: :[[@LINE-5]]:1: error -# ERROR-V81M_MVE_FP: :[[@LINE-6]]:1: error -# ERROR-V81M_MVEFP: :[[@LINE-7]]:1: error +# ERROR-V81M_NOFP: :[[@LINE-5]]:1: error +# ERROR-V81M_FPDP: :[[@LINE-6]]:1: error +# ERROR-V81M_NOFPDP: :[[@LINE-7]]:1: error +# ERROR-V81M_NOMVE: :[[@LINE-8]]:1: error +# ERROR-V81M_NOMVEFP: :[[@LINE-9]]:1: error + +vcmp.f64 d0,d1 +# ERROR-V81M: :[[@LINE-1]]:1: error +# ERROR-V81M_DSP: :[[@LINE-2]]:1: error +# ERROR-V81M_FP: :[[@LINE-3]]:1: error +# ERROR-V81M_NOFP: :[[@LINE-4]]:1: error +# ERROR-V81M_NOFPDP: :[[@LINE-5]]:1: error +# ERROR-V81M_MVE: :[[@LINE-6]]:1: error +# ERROR-V81M_NOMVE: :[[@LINE-7]]:1: error +# ERROR-V81M_MVE_FP: :[[@LINE-8]]:1: error +# ERROR-V81M_MVEFP: :[[@LINE-9]]:1: error +# ERROR-V81M_NOMVEFP: :[[@LINE-10]]:1: error asrl r0, r1, r2 # ERROR-V8M: :[[@LINE-1]]:1: error @@ -64,6 +77,9 @@ asrl r0, r1, r2 # ERROR-V81M_DSP: :[[@LINE-3]]:1: error # ERROR-V81M_FP: :[[@LINE-4]]:1: error # ERROR-V81M_FPDP: :[[@LINE-5]]:1: error +# ERROR-V81M_NOFPDP: :[[@LINE-6]]:1: error +# ERROR-V81M_NOMVE: :[[@LINE-7]]:1: error +# ERROR-V81M_NOMVEFP: :[[@LINE-8]]:1: error vcadd.i8 q0, q1, q2, #90 # ERROR-V8M: :[[@LINE-1]]:1: error @@ -71,3 +87,6 @@ vcadd.i8 q0, q1, q2, #90 # ERROR-V81M_DSP: :[[@LINE-3]]:1: error # ERROR-V81M_FP: :[[@LINE-4]]:1: error # ERROR-V81M_FPDP: :[[@LINE-5]]:1: error +# ERROR-V81M_NOFPDP: :[[@LINE-6]]:1: error +# ERROR-V81M_NOMVE: :[[@LINE-7]]:1: error +# ERROR-V81M_NOMVEFP: :[[@LINE-8]]:1: error _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits