driver-alpha.c (IMPLVER_EV4_FAMILY, [...]): Define.
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Fri, 29 Jul 2011 15:34:33 +0000 (15:34 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 29 Jul 2011 15:34:33 +0000 (15:34 +0000)
* config/alpha/driver-alpha.c (IMPLVER_EV4_FAMILY,
IMPLVER_EV5_FAMILY, IMPLVER_EV6_FAMILY, IMPLVER_EV7_FAMILY): Define.
(AMASK_BWX, AMASK_FIX, AMASK_CIX, AMASK_MVI, AMASK_PRECISE,
AMASK_LOCKPFTCHOK): Define.
(host_detect_local_cpu): Remove buf, f, cpu_names.
Define cpu_types, implver, amask.
Use __builtin_alpha_implver, __builtin_alpha_amask to determine
native CPU.
* config.host: Also use driver-alpha.o, alpha/x-alpha on
alpha*-dec-osf*.
* config/alpha/osf5.h [__alpha__ || __alpha]
(host_detect_local_cpu): Declare.
(EXTRA_SPEC_FUNCTIONS, MCPU_MTUNE_NATIVE_SPECS)
(DRIVER_SELF_SPECS): Define.

From-SVN: r176926

gcc/ChangeLog
gcc/config.host
gcc/config/alpha/driver-alpha.c
gcc/config/alpha/osf5.h

index 2f7117403b6a6d682380946bbf7e57a681727386..b838758d2c327a1fc8b153349d301572f1d18a41 100644 (file)
@@ -1,3 +1,20 @@
+2011-07-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * config/alpha/driver-alpha.c (IMPLVER_EV4_FAMILY,
+       IMPLVER_EV5_FAMILY, IMPLVER_EV6_FAMILY, IMPLVER_EV7_FAMILY): Define.
+       (AMASK_BWX, AMASK_FIX, AMASK_CIX, AMASK_MVI, AMASK_PRECISE,
+       AMASK_LOCKPFTCHOK): Define.
+       (host_detect_local_cpu): Remove buf, f, cpu_names.
+       Define cpu_types, implver, amask.
+       Use __builtin_alpha_implver, __builtin_alpha_amask to determine
+       native CPU.
+       * config.host: Also use driver-alpha.o, alpha/x-alpha on
+       alpha*-dec-osf*.
+       * config/alpha/osf5.h [__alpha__ || __alpha]
+       (host_detect_local_cpu): Declare.
+       (EXTRA_SPEC_FUNCTIONS, MCPU_MTUNE_NATIVE_SPECS)
+       (DRIVER_SELF_SPECS): Define.
+
 2011-07-29  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/47715
index d55447cb80cfc18db9487bbb5e4300edefe19e91..771be8c283fbc0e43281773215286304892eac46 100644 (file)
@@ -100,9 +100,9 @@ case ${host} in
 esac
 
 case ${host} in
-  alpha*-*-linux*)
+  alpha*-*-linux* | alpha*-dec-osf*)
     case ${target} in
-      alpha*-*-linux*)
+      alpha*-*-linux* | alpha*-dec-osf*)
        host_extra_gcc_objs="driver-alpha.o"
        host_xmake_file="${host_xmake_file} alpha/x-alpha"
        ;;
index d787886d1729add4887e7ae770f63bbcb2d8da5e..daff281fcfb5efdb0ca0a3c0a691acaff2dc6e4a 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines for the gcc driver.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    Contributed by Arthur Loiret <aloiret@debian.org>
 
 This file is part of GCC.
@@ -23,6 +23,22 @@ along with GCC; see the file COPYING3.  If not see
 #include "coretypes.h"
 #include "tm.h"
 
+/* Chip family type IDs, returned by implver instruction.  */
+#define IMPLVER_EV4_FAMILY     0               /* LCA/EV4/EV45 */
+#define IMPLVER_EV5_FAMILY     1               /* EV5/EV56/PCA56 */
+#define IMPLVER_EV6_FAMILY     2               /* EV6 */
+#define IMPLVER_EV7_FAMILY     3               /* EV7 */
+
+/* Bit defines for amask instruction.  */
+#define AMASK_BWX          0x1          /* byte/word extension.  */
+#define AMASK_FIX          0x2          /* sqrt and f <-> i conversions 
+                                          extension.  */
+#define AMASK_CIX          0x4          /* count extension.  */
+#define AMASK_MVI          0x100        /* multimedia extension.  */
+#define AMASK_PRECISE      0x200        /* Precise arithmetic traps.  */
+#define AMASK_LOCKPFTCHOK  0x1000       /* Safe to prefetch lock cache
+                                          block.  */
+
 /* This will be called by the spec parser in gcc.c when it sees
    a %:local_cpu_detect(args) construct.  Currently it will be called
    with either "cpu" or "tune" as argument depending on if -mcpu=native
@@ -39,34 +55,23 @@ along with GCC; see the file COPYING3.  If not see
 const char *
 host_detect_local_cpu (int argc, const char **argv)
 {
-  const char *cpu = NULL;
-  char buf[128];
-  FILE *f;
-
-  static const struct cpu_names {
-   const char *const name;
-   const char *const cpu;
-  } cpu_names[] = {
-    { "EV79",  "ev67" },
-    { "EV7",   "ev67" },
-    { "EV69",  "ev67" },
-    { "EV68CX",        "ev67" },
-    { "EV68CB",        "ev67" },
-    { "EV68AL",        "ev67" },
-    { "EV67",  "ev67" },
-    { "EV6",   "ev6" },
-    { "PCA57", "pca56" },
-    { "PCA56", "pca56" },
-    { "EV56",  "ev56" },
-    { "EV5",   "ev5" },
-    { "LCA45", "ev45" },
-    { "EV45",  "ev45" },
-    { "LCA4",  "ev4" },
-    { "EV4",   "ev4" },
-/*  { "EV3",   "ev3" },  */
-    { 0, 0 }
+  static const struct cpu_types {
+    long implver;
+    long amask;
+    const char *const cpu;
+  } cpu_types[] = {
+    { IMPLVER_EV7_FAMILY, AMASK_BWX|AMASK_MVI|AMASK_FIX|AMASK_CIX, "ev67" },
+    { IMPLVER_EV6_FAMILY, AMASK_BWX|AMASK_MVI|AMASK_FIX|AMASK_CIX, "ev67" },
+    { IMPLVER_EV6_FAMILY, AMASK_BWX|AMASK_MVI|AMASK_FIX, "ev6" },
+    { IMPLVER_EV5_FAMILY, AMASK_BWX|AMASK_MVI, "pca56" },
+    { IMPLVER_EV5_FAMILY, AMASK_BWX, "ev56" },
+    { IMPLVER_EV5_FAMILY, 0, "ev5" },
+    { IMPLVER_EV4_FAMILY, 0, "ev4" },
+    { 0, 0, NULL }
   };
-
+  long implver;
+  long amask;
+  const char *cpu;
   int i;
 
   if (argc < 1)
@@ -75,24 +80,18 @@ host_detect_local_cpu (int argc, const char **argv)
   if (strcmp (argv[0], "cpu") && strcmp (argv[0], "tune"))
     return NULL;
 
-  f = fopen ("/proc/cpuinfo", "r");
-  if (f == NULL)
-    return NULL;
+  implver = __builtin_alpha_implver ();
+  amask = __builtin_alpha_amask (~0L);
+  cpu = NULL;
 
-  while (fgets (buf, sizeof (buf), f) != NULL)
-    if (strncmp (buf, "cpu model", sizeof ("cpu model") - 1) == 0)
+  for (i = 0; cpu_types[i].cpu != NULL; i++)
+    if (implver == cpu_types[i].implver
+       && (~amask & cpu_types[i].amask) == cpu_types[i].amask)
       {
-        for (i = 0; cpu_names [i].name; i++)
-          if (strstr (buf, cpu_names [i].name) != NULL)
-           {
-             cpu = cpu_names [i].cpu;
-             break;
-           }
+       cpu = cpu_types[i].cpu;
        break;
       }
 
-  fclose (f);
-
   if (cpu == NULL)
     return NULL;
 
index 2c649e2c74ad283e81909cb022c24244d4a855fa..ee21f4b9c21a48a260a40ae9de38853ab1dc92cc 100644 (file)
@@ -80,6 +80,22 @@ along with GCC; see the file COPYING3.  If not see
 #define CPP_SPEC \
 "%{pthread|threads:-D_REENTRANT} %{threads:-D_PTHREAD_USE_D4}"
 
+/* -mcpu=native handling only makes sense with compiler running on
+   an Alpha chip.  */
+#if defined(__alpha__) || defined(__alpha)
+extern const char *host_detect_local_cpu (int argc, const char **argv);
+# define EXTRA_SPEC_FUNCTIONS                                          \
+  { "local_cpu_detect", host_detect_local_cpu },
+
+# define MCPU_MTUNE_NATIVE_SPECS                                       \
+   " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}"             \
+   " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+#else
+# define MCPU_MTUNE_NATIVE_SPECS ""
+#endif
+
+#define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS
+
 /* Under DEC OSF/1 V4, -p and -pg require -lprof1, and -lprof1 requires 
    -lpdf.  */