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.
Ciao Dominik ^_^ ^_^ -- Dominik Vogt IBM Germany
gcc/ChangeLog: 2015-05-05 Dominik Vogt <v...@linux.vnet.ibm.com> * config/s390/driver-native.c: New file. * config/s390/x-native: New file. * config.host: Add new files for s390. * config/s390/s390.h (DRIVER_SELF_SPECS): Add support for -mtune=native and -march=native * config/s390/s390.opt (march): Likewise; add PROCESSOR_NATIVE * config/s390/s390-opts.h (enum processor_type): Ditto. * config/s390/s390.c (s390_option_override): Catch unhandled PROCESSOR_NATIVE
>From 591c2a1e6c82caee681386b8e18b5814d0a2116e Mon Sep 17 00:00:00 2001 From: Dominik Vogt <v...@linux.vnet.ibm.com> Date: Tue, 5 May 2015 12:49:23 +0100 Subject: [PATCH] S390: Support -mtune=native and -march=native. --- 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 ++ 7 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 gcc/config/s390/driver-native.c create mode 100644 gcc/config/s390/x-native 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 cb9ebc7..cf49d35 100644 --- a/gcc/config/s390/s390-opts.h +++ b/gcc/config/s390/s390-opts.h @@ -35,6 +35,7 @@ enum processor_type PROCESSOR_2097_Z10, PROCESSOR_2817_Z196, PROCESSOR_2827_ZEC12, + PROCESSOR_NATIVE, PROCESSOR_max }; diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 7d16048..fb1a0ce 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -11981,6 +11981,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 f887409..e972b4d 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 22f1ff5..3c05419 100644 --- a/gcc/config/s390/s390.opt +++ b/gcc/config/s390/s390.opt @@ -76,6 +76,9 @@ Enum(processor_type) String(z196) Value(PROCESSOR_2817_Z196) EnumValue Enum(processor_type) String(zEC12) Value(PROCESSOR_2827_ZEC12) +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