diff mbox

S390: Support -mtune=native and -march=native.

Message ID 20150526110651.GA6116@linux.vnet.ibm.com
State New
Headers show

Commit Message

Dominik Vogt May 26, 2015, 11:06 a.m. UTC
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 ^_^  ^_^

Comments

Jakub Jelinek June 1, 2015, 11:50 a.m. UTC | #1
On Tue, May 26, 2015 at 12:06:51PM +0100, Dominik Vogt wrote:
> +  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";

Wouldn't it be better to just use const char *p = strstr (buf, "machine = ");
and then either strtoul the number after it and switch on it, or strcmp
it, rather than using up to 13 strstr calls that all need to skip
over the "processor" (you could even start after the matched keyword),
version and identification stuff?

	Jakub
DJ Delorie July 8, 2015, 8:18 p.m. UTC | #2
> Version 2 of the patch to enable the configure options
> --with-arch=native and --with-tune=native.

This patch broke cross-compiling with --target=s390-*

s390_host_detect_local_cpu is only defined if the --host is s390-*

but EXTRA_SPEC_FUNCTIONS refers to it when --target is s390-*
diff mbox

Patch

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