]> granicus.if.org Git - clang/commitdiff
ARM: Add -m[no-]crc to dis/enable CRC subtargetfeature from clang
authorBernard Ogden <bogden@arm.com>
Tue, 29 Oct 2013 09:47:51 +0000 (09:47 +0000)
committerBernard Ogden <bogden@arm.com>
Tue, 29 Oct 2013 09:47:51 +0000 (09:47 +0000)
Allow users to disable or enable CRC subtarget feature.

Differential Revision: http://llvm-reviews.chandlerc.com/D2037

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193600 91177308-0d34-0410-b5e6-96231b3b80d8

docs/UsersManual.rst
include/clang/Driver/Options.td
lib/Basic/Targets.cpp
lib/Driver/Tools.cpp
test/Driver/arm-mfpu.c
test/Driver/armv8-crc.c [new file with mode: 0644]
test/Preprocessor/arm-target-features.c

index 88b3b0f074f1abe59ecc6f4565c8e06a4186015d..4dc8bbfec10d1b9a918d2883b24a64c87b3a42f5 100644 (file)
@@ -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
 -------------------------------------
index 2244a98ed9072c1d0acd93febaefbe12b510d147..0a805debb312ae245fab18ee4f15c447f511a30c 100644 (file)
@@ -1023,6 +1023,10 @@ def mno_thumb : Flag<["-"], "mno-thumb">, Group<m_arm_Features_Group>;
 def marm : Flag<["-"], "marm">, Alias<mno_thumb>;
 def ffixed_r9 : Flag<["-"], "ffixed-r9">, Group<m_arm_Features_Group>,
   HelpText<"Reserve the r9 register (ARM only)">;
+def mcrc : Flag<["-"], "mcrc">, Group<m_arm_Features_Group>,
+  HelpText<"Allow use of CRC instructions (ARM only)">;
+def mnocrc : Flag<["-"], "mnocrc">, Group<m_arm_Features_Group>,
+  HelpText<"Disallow use of CRC instructions (ARM only)">;
 
 def mvsx : Flag<["-"], "mvsx">, Group<m_ppc_Features_Group>;
 def mno_vsx : Flag<["-"], "mno-vsx">, Group<m_ppc_Features_Group>;
index 429e699a37abf976763402398dbcd5d99ef12a7a..a2a1cb2cc867898e2d8a859830a1464ce48c9b76 100644 (file)
@@ -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<std::string> &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") {
index 397f641f1b6d48b3948306549a64afb31795f7e4..ffaac21b4ed53c4f60d0769dcd7c283dccb6be44 100644 (file)
@@ -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,
index 7df3bdba853d280cee169cde8746740ca39cb585..765b2982156af4fe3bf21251ae3bb5bf3f6cd4fd 100644 (file)
@@ -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/test/Driver/armv8-crc.c b/test/Driver/armv8-crc.c
new file mode 100644 (file)
index 0000000..bee7535
--- /dev/null
@@ -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"
+
index 2cb9be6054ad1703daab978b49664134c542885f..ae93a3da7c0847788bd5c116a53e1723072d0f3b 100644 (file)
@@ -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