1 /* Subroutines for the gcc driver.
2 Copyright (C) 2015-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
25 /* This will be called by the spec parser in gcc.c when it sees
26 a %:local_cpu_detect(args) construct. Currently it will be called
27 with either "arch" or "tune" as argument depending on if -march=native
28 or -mtune=native is to be substituted.
30 It returns a string containing new command line parameters to be
31 put at the place of the above two options, depending on what CPU
32 this is executed. E.g. "-march=zEC12" on a zEC12 for -march=native.
33 If the routine can't detect a known processor, the -march or -mtune
36 ARGC and ARGV are set depending on the actual arguments given
39 s390_host_detect_local_cpu (int argc
, const char **argv
)
41 const char *cpu
= NULL
;
45 const char *options
= "";
46 unsigned int has_features
;
47 unsigned int has_processor
;
48 unsigned int is_cpu_z9_109
= 0;
49 unsigned int has_highgprs
= 0;
50 unsigned int has_dfp
= 0;
51 unsigned int has_te
= 0;
52 unsigned int has_vx
= 0;
53 unsigned int has_opt_esa_zarch
= 0;
59 arch
= strcmp (argv
[0], "arch") == 0;
60 if (!arch
&& strcmp (argv
[0], "tune"))
62 for (i
= 1; i
< argc
; i
++)
63 if (strcmp (argv
[i
], "mesa_mzarch") == 0)
64 has_opt_esa_zarch
= 1;
66 f
= fopen ("/proc/cpuinfo", "r");
70 for (has_features
= 0, has_processor
= 0;
71 (has_features
== 0 || has_processor
== 0)
72 && fgets (buf
, sizeof (buf
), f
) != NULL
; )
74 if (has_processor
== 0 && strncmp (buf
, "processor", 9) == 0)
79 p
= strstr (buf
, "machine = ");
84 machine_id
= strtol (p
, NULL
, 16);
87 /* g5 and g6 default to z900 */
126 if (has_features
== 0 && strncmp (buf
, "features", 8) == 0)
130 p
= strchr (buf
, ':');
140 for (i
= 0; !ISSPACE (p
[i
]) && p
[i
] != 0; i
++)
142 if (i
== 3 && strncmp (p
, "dfp", 3) == 0)
144 else if (i
== 2 && strncmp (p
, "te", 2) == 0)
146 else if (i
== 2 && strncmp (p
, "vx", 2) == 0)
148 else if (i
== 8 && strncmp (p
, "highgprs", 8) == 0)
163 const char *opt_htm
= "";
164 const char *opt_vx
= "";
165 const char *opt_esa_zarch
= "";
167 /* We may switch off these cpu features but never switch the on
168 explicitly. This overrides options specified on the command line. */
170 opt_htm
= " -mno-htm";
173 /* However, we set -mzarch only if neither -mzarch nor -mesa are used on
174 the command line. This allows the user to switch to -mesa manually.
176 if (!has_opt_esa_zarch
&& has_highgprs
)
177 opt_esa_zarch
= " -mzarch";
178 options
= concat (options
, opt_htm
, opt_vx
, opt_esa_zarch
, NULL
);
180 if (has_dfp
&& is_cpu_z9_109
)
183 return concat ("-m", argv
[0], "=", cpu
, options
, NULL
);