From 18b5701a6853f6b4a5b3a05ba5c79105a805b61b Mon Sep 17 00:00:00 2001 From: Bernard Ogden Date: Tue, 29 Oct 2013 09:47:51 +0000 Subject: [PATCH] ARM: Add -m[no-]crc to dis/enable CRC subtargetfeature from clang Allow users to disable or enable CRC subtarget feature. Differential Revision: http://llvm-reviews.chandlerc.com/D2037 llvm-svn: 193600 --- clang/docs/UsersManual.rst | 9 +++++++++ clang/include/clang/Driver/Options.td | 4 ++++ clang/lib/Basic/Targets.cpp | 8 +++++++- clang/lib/Driver/Tools.cpp | 9 +++++++++ clang/test/Driver/arm-mfpu.c | 1 + clang/test/Driver/armv8-crc.c | 8 ++++++++ clang/test/Preprocessor/arm-target-features.c | 3 +++ 7 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 clang/test/Driver/armv8-crc.c diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index 88b3b0f074f1..4dc8bbfec10d 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -1057,6 +1057,15 @@ are listed below. hardware division instructions. This only applies to the ARM architecture. +.. option:: -m[no-]crc + + Enable or disable CRC instructions. + + This option is used to indicate whether CRC instructions are to + be generated. This only applies to the ARM architecture. + + CRC instructions are enabled by default on ARMv8. + Controlling Size of Debug Information ------------------------------------- diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 2244a98ed907..0a805debb312 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1023,6 +1023,10 @@ def mno_thumb : Flag<["-"], "mno-thumb">, Group; def marm : Flag<["-"], "marm">, Alias; def ffixed_r9 : Flag<["-"], "ffixed-r9">, Group, HelpText<"Reserve the r9 register (ARM only)">; +def mcrc : Flag<["-"], "mcrc">, Group, + HelpText<"Allow use of CRC instructions (ARM only)">; +def mnocrc : Flag<["-"], "mnocrc">, Group, + HelpText<"Disallow use of CRC instructions (ARM only)">; def mvsx : Flag<["-"], "mvsx">, Group; def mno_vsx : Flag<["-"], "mno-vsx">, Group; diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 429e699a37ab..a2a1cb2cc867 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3633,6 +3633,8 @@ class ARMTargetInfo : public TargetInfo { unsigned SoftFloat : 1; unsigned SoftFloatABI : 1; + unsigned CRC : 1; + static const Builtin::Info BuiltinInfo[]; static bool shouldUseInlineAtomic(const llvm::Triple &T) { @@ -3784,6 +3786,7 @@ public: Features["neon"] = true; Features["hwdiv"] = true; Features["hwdiv-arm"] = true; + Features["crc"] = true; } else if (CPU == "cortex-r5" || CPU == "cortex-m3" || CPU == "cortex-m4" || // Enable the hwdiv extension for all v8a AArch32 cores by @@ -3798,6 +3801,7 @@ public: virtual bool handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { FPU = 0; + CRC = 0; SoftFloat = SoftFloatABI = false; HWDiv = 0; for (unsigned i = 0, e = Features.size(); i != e; ++i) { @@ -3819,6 +3823,8 @@ public: HWDiv |= HWDivThumb; else if (Features[i] == "+hwdiv-arm") HWDiv |= HWDivARM; + else if (Features[i] == "+crc") + CRC = 1; } if (!(FPU & NeonFPU) && FPMath == FP_Neon) { @@ -3970,7 +3976,7 @@ public: if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) Builder.defineMacro("__ARM_NEON__"); - if (CPUArchVer == 8) + if (CRC) Builder.defineMacro("__ARM_FEATURE_CRC32"); if (CPUArchVer >= 6 && CPUArch != "6M") { diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 397f641f1b6d..ffaac21b4ed5 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -773,6 +773,15 @@ static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, // implementation, although the same isn't true of VFP or VFP3. if (FloatABI == "soft") Features.push_back("-neon"); + + // En/disable crc + if (Arg *A = Args.getLastArg(options::OPT_mcrc, + options::OPT_mnocrc)) { + if (A->getOption().matches(options::OPT_mcrc)) + Features.push_back("+crc"); + else + Features.push_back("-crc"); + } } void Clang::AddARMTargetArgs(const ArgList &Args, diff --git a/clang/test/Driver/arm-mfpu.c b/clang/test/Driver/arm-mfpu.c index 7df3bdba853d..765b2982156a 100644 --- a/clang/test/Driver/arm-mfpu.c +++ b/clang/test/Driver/arm-mfpu.c @@ -55,6 +55,7 @@ // RUN: %clang -target armv8-linux-gnueabihf -mfpu=fp-armv8 %s -### 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-FP-ARMV8 %s +// CHECK-FP-ARMV8-NOT: "-target-feature" "+neon" // CHECK-FP-ARMV8: "-target-feature" "+fp-armv8" // CHECK-FP-ARMV8: "-target-feature" "-neon" // CHECK-FP-ARMV8: "-target-feature" "-crypto" diff --git a/clang/test/Driver/armv8-crc.c b/clang/test/Driver/armv8-crc.c new file mode 100644 index 000000000000..bee75355cd79 --- /dev/null +++ b/clang/test/Driver/armv8-crc.c @@ -0,0 +1,8 @@ +// RUN: %clang -target armv8 -mcrc -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-V8-CRC < %t %s +// CHECK-V8-CRC: "-target-feature" "+crc" + +// RUN: %clang -target armv8 -mnocrc -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-V8-NOCRC < %t %s +// CHECK-V8-NOCRC: "-target-feature" "-crc" + diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 2cb9be6054ad..ae93a3da7c08 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -27,6 +27,9 @@ // CHECK-V8-BAREHF-NEON-FP: __ARM_NEON__ 1 // CHECK-V8-BAREHF-NEON-FP: __VFP_FP__ 1 +// RUN: %clang -target armv8a -mnocrc -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-NOCRC %s +// CHECK-V8-NOCRC-NOT: __ARM_FEATURE_CRC32 1 + // Check that -mhwdiv works properly for armv8/thumbv8 (enabled by default). // RUN: %clang -target armv8 -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8 %s