This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] S390: Support -mtune=native and -march=native.


On Tue, May 19, 2015 at 07:05:14AM +0100, Dominik Vogt wrote:
> The attached patch activates the -mtune=native and -march=native
> command line options on S390 and System z.  Most of the code is a
> modified copy of gcc/config/mips/driver-native.c.  ChangeLog
> attached.

Version 2 of the patch to enable the configure options
--with-arch=native and --with-tune=native.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt
IBM Germany

Attachment: ChangeLog
Description: Text document

>From 3cc593974d299bf2f2c7f5f47fa6ff3524115e04 Mon Sep 17 00:00:00 2001
From: Dominik Vogt <vogt@linux.vnet.ibm.com>
Date: Tue, 5 May 2015 12:49:23 +0100
Subject: [PATCH] S390: Support -mtune=native and -march=native.

---
 gcc/config.gcc                  |  2 +-
 gcc/config.host                 |  4 ++
 gcc/config/s390/driver-native.c | 91 +++++++++++++++++++++++++++++++++++++++++
 gcc/config/s390/s390-opts.h     |  1 +
 gcc/config/s390/s390.c          |  2 +
 gcc/config/s390/s390.h          | 14 ++++++-
 gcc/config/s390/s390.opt        |  3 ++
 gcc/config/s390/x-native        |  3 ++
 8 files changed, 117 insertions(+), 3 deletions(-)
 create mode 100644 gcc/config/s390/driver-native.c
 create mode 100644 gcc/config/s390/x-native

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 1fcc290..e23a34c 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -4099,7 +4099,7 @@ case "${target}" in
 		for which in arch tune; do
 			eval "val=\$with_$which"
 			case ${val} in
-			"" | g5 | g6 | z900 | z990 | z9-109 | z9-ec | z10 | z196 | zEC12 | z13)
+			"" | native | g5 | g6 | z900 | z990 | z9-109 | z9-ec | z10 | z196 | zEC12 | z13)
 				# OK
 				;;
 			*)
diff --git a/gcc/config.host b/gcc/config.host
index a8896d1..4e456a1 100644
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -172,6 +172,10 @@ case ${host} in
 	;;
     esac
     ;;
+  s390-*-* | s390x-*-*)
+    host_extra_gcc_objs="driver-native.o"
+    host_xmake_file="${host_xmake_file} s390/x-native"
+    ;;
   sparc*-*-solaris2*)
     case ${target} in
       sparc*-*-solaris2*)
diff --git a/gcc/config/s390/driver-native.c b/gcc/config/s390/driver-native.c
new file mode 100644
index 0000000..88c76bd
--- /dev/null
+++ b/gcc/config/s390/driver-native.c
@@ -0,0 +1,91 @@
+/* Subroutines for the gcc driver.
+   Copyright (C) 2015 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+
+/* 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 "arch" or "tune" as argument depending on if -march=native
+   or -mtune=native is to be substituted.
+
+   It returns a string containing new command line parameters to be
+   put at the place of the above two options, depending on what CPU
+   this is executed.  E.g. "-march=zEC12" on a zEC12 for -march=native.
+   If the routine can't detect a known processor, the -march or -mtune
+   option is discarded.
+
+   ARGC and ARGV are set depending on the actual arguments given
+   in the spec.  */
+const char *
+s390_host_detect_local_cpu (int argc, const char **argv)
+{
+  const char *cpu = NULL;
+  char buf[256];
+  FILE *f;
+  bool arch;
+
+  if (argc < 1)
+    return NULL;
+
+  arch = strcmp (argv[0], "arch") == 0;
+  if (!arch && strcmp (argv[0], "tune"))
+    return NULL;
+
+  f = fopen ("/proc/cpuinfo", "r");
+  if (f == NULL)
+    return NULL;
+
+  while (fgets (buf, sizeof (buf), f) != NULL)
+    if (strncmp (buf, "processor", sizeof ("processor") - 1) == 0)
+      {
+	if (strstr (buf, "machine = 9672") != NULL)
+	  cpu = "g5";
+	else if (strstr (buf, "machine = 2064") != NULL
+		 || strstr (buf, "machine = 2066") != NULL)
+	  cpu = "z900";
+	else if (strstr (buf, "machine = 2084") != NULL
+		 || strstr (buf, "machine = 2086") != NULL)
+	  cpu = "z990";
+	else if (strstr (buf, "machine = 2094") != NULL
+		 || strstr (buf, "machine = 2096") != NULL)
+	  cpu = "z9-109";
+	else if (strstr (buf, "machine = 2097") != NULL
+		 || strstr (buf, "machine = 2098") != NULL)
+	  cpu = "z10";
+	else if (strstr (buf, "machine = 2817") != NULL
+		 || strstr (buf, "machine = 2818") != NULL)
+	  cpu = "z196";
+	else if (strstr (buf, "machine = 2827") != NULL
+		 || strstr (buf, "machine = 2828") != NULL)
+	  cpu = "zEC12";
+	else if (strstr (buf, "machine = 2964") != NULL)
+	  cpu = "z13";
+	break;
+      }
+
+  fclose (f);
+
+  if (cpu == NULL)
+    return NULL;
+
+  return concat ("-m", argv[0], "=", cpu, NULL);
+}
diff --git a/gcc/config/s390/s390-opts.h b/gcc/config/s390/s390-opts.h
index 5bde333..f0ea532 100644
--- a/gcc/config/s390/s390-opts.h
+++ b/gcc/config/s390/s390-opts.h
@@ -36,6 +36,7 @@ enum processor_type
   PROCESSOR_2817_Z196,
   PROCESSOR_2827_ZEC12,
   PROCESSOR_2964_Z13,
+  PROCESSOR_NATIVE,
   PROCESSOR_max
 };
 
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 6648597..dfca516 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -13339,6 +13339,8 @@ s390_option_override (void)
     }
 
   /* Sanity checks.  */
+  if (s390_arch == PROCESSOR_NATIVE || s390_tune == PROCESSOR_NATIVE)
+    gcc_unreachable ();
   if (TARGET_ZARCH && !TARGET_CPU_ZARCH)
     error ("z/Architecture mode not supported on %s", s390_arch_string);
   if (TARGET_64BIT && !TARGET_ZARCH)
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index 6ddd8aa..82ec3d0 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -126,17 +126,27 @@ enum processor_flags
   { "arch", "%{!march=*:-march=%(VALUE)}" },			\
   { "tune", "%{!mtune=*:-mtune=%(VALUE)}" }
 
+extern const char *s390_host_detect_local_cpu (int argc, const char **argv);
+# define EXTRA_SPEC_FUNCTIONS \
+  { "local_cpu_detect", s390_host_detect_local_cpu },
+
+# define MARCH_MTUNE_NATIVE_SPECS				\
+  " %{march=native:%<march=native %:local_cpu_detect(arch)}"	\
+  " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+
 /* Defaulting rules.  */
 #ifdef DEFAULT_TARGET_64BIT
 #define DRIVER_SELF_SPECS					\
   "%{!m31:%{!m64:-m64}}",					\
   "%{!mesa:%{!mzarch:%{m31:-mesa}%{m64:-mzarch}}}",		\
-  "%{!march=*:%{mesa:-march=g5}%{mzarch:-march=z900}}"
+  "%{!march=*:%{mesa:-march=g5}%{mzarch:-march=z900}}",		\
+  MARCH_MTUNE_NATIVE_SPECS
 #else
 #define DRIVER_SELF_SPECS					\
   "%{!m31:%{!m64:-m31}}",					\
   "%{!mesa:%{!mzarch:%{m31:-mesa}%{m64:-mzarch}}}",		\
-  "%{!march=*:%{mesa:-march=g5}%{mzarch:-march=z900}}"
+  "%{!march=*:%{mesa:-march=g5}%{mzarch:-march=z900}}",		\
+  MARCH_MTUNE_NATIVE_SPECS
 #endif
 
 /* Constants needed to control the TEST DATA CLASS (TDC) instruction.  */
diff --git a/gcc/config/s390/s390.opt b/gcc/config/s390/s390.opt
index b841c4d..b21dc36 100644
--- a/gcc/config/s390/s390.opt
+++ b/gcc/config/s390/s390.opt
@@ -79,6 +79,9 @@ Enum(processor_type) String(zEC12) Value(PROCESSOR_2827_ZEC12)
 EnumValue
 Enum(processor_type) String(z13) Value(PROCESSOR_2964_Z13)
 
+EnumValue
+Enum(processor_type) String(native) Value(PROCESSOR_NATIVE) DriverOnly
+
 mbackchain
 Target Report Mask(BACKCHAIN)
 Maintain backchain pointer
diff --git a/gcc/config/s390/x-native b/gcc/config/s390/x-native
new file mode 100644
index 0000000..b33c8b6
--- /dev/null
+++ b/gcc/config/s390/x-native
@@ -0,0 +1,3 @@
+driver-native.o : $(srcdir)/config/s390/driver-native.c \
+  $(CONFIG_H) $(SYSTEM_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-- 
2.3.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]