From: Dominik Vogt Date: Mon, 1 Jun 2015 11:38:44 +0000 (+0000) Subject: S390: Support -mtune=native and -march=native. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cb0edc3993d3b575fe0bcb2e48f492a144dd70e1;p=gcc.git S390: Support -mtune=native and -march=native. gcc/ChangeLog 2015-06-01 Dominik Vogt * 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.gcc: Likewise. * 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-SVN: r223934 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d61b465bdb2..72ef1e45d5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-06-01 Dominik Vogt + + * 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.gcc: Likewise. + * 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 + 2015-06-01 Ilya Enkovich PR target/65527 diff --git a/gcc/config.gcc b/gcc/config.gcc index 1fcc290a95f..e23a34c2528 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 a8896d1c382..4e456a1b539 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 00000000000..88c76bd0dd8 --- /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 +. */ + +#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 5bde33344d2..f0ea532df2c 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 90d43b1498c..47cb9e76eb2 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -13345,6 +13345,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 a9bf9b5b1cb..85a0d1af65a 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:%