1 /* Subroutines for the gcc driver.
2 Copyright (C) 2015-2018 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/>. */
20 #define IN_TARGET_CODE 1
24 #include "coretypes.h"
27 /* This will be called by the spec parser in gcc.c when it sees
28 a %:local_cpu_detect(args) construct. Currently it will be called
29 with either "arch" or "tune" as argument depending on if -march=native
30 or -mtune=native is to be substituted.
32 It returns a string containing new command line parameters to be
33 put at the place of the above two options, depending on what CPU
34 this is executed. E.g. "-march=zEC12" on a zEC12 for -march=native.
35 If the routine can't detect a known processor, the -march or -mtune
38 ARGC and ARGV are set depending on the actual arguments given
41 s390_host_detect_local_cpu (int argc
, const char **argv
)
43 const char *cpu
= NULL
;
47 const char *options
= "";
48 unsigned int has_features
;
49 unsigned int has_processor
;
50 unsigned int is_cpu_z9_109
= 0;
51 unsigned int has_highgprs
= 0;
52 unsigned int has_dfp
= 0;
53 unsigned int has_te
= 0;
54 unsigned int has_vx
= 0;
55 unsigned int has_opt_esa_zarch
= 0;
61 arch
= strcmp (argv
[0], "arch") == 0;
62 if (!arch
&& strcmp (argv
[0], "tune"))
64 for (i
= 1; i
< argc
; i
++)
65 if (strcmp (argv
[i
], "mesa_mzarch") == 0)
66 has_opt_esa_zarch
= 1;
68 f
= fopen ("/proc/cpuinfo", "r");
72 for (has_features
= 0, has_processor
= 0;
73 (has_features
== 0 || has_processor
== 0)
74 && fgets (buf
, sizeof (buf
), f
) != NULL
; )
76 if (has_processor
== 0 && strncmp (buf
, "processor", 9) == 0)
81 p
= strstr (buf
, "machine = ");
86 machine_id
= strtol (p
, NULL
, 16);
89 /* g5 and g6 default to z900 */
128 if (has_features
== 0 && strncmp (buf
, "features", 8) == 0)
132 p
= strchr (buf
, ':');
142 for (i
= 0; !ISSPACE (p
[i
]) && p
[i
] != 0; i
++)
144 if (i
== 3 && strncmp (p
, "dfp", 3) == 0)
146 else if (i
== 2 && strncmp (p
, "te", 2) == 0)
148 else if (i
== 2 && strncmp (p
, "vx", 2) == 0)
150 else if (i
== 8 && strncmp (p
, "highgprs", 8) == 0)
165 const char *opt_htm
= "";
166 const char *opt_vx
= "";
167 const char *opt_esa_zarch
= "";
169 /* We may switch off these cpu features but never switch the on
170 explicitly. This overrides options specified on the command line. */
172 opt_htm
= " -mno-htm";
175 /* However, we set -mzarch only if neither -mzarch nor -mesa are used on
176 the command line. This allows the user to switch to -mesa manually.
178 if (!has_opt_esa_zarch
&& has_highgprs
)
179 opt_esa_zarch
= " -mzarch";
180 options
= concat (options
, opt_htm
, opt_vx
, opt_esa_zarch
, NULL
);
182 if (has_dfp
&& is_cpu_z9_109
)
185 return concat ("-m", argv
[0], "=", cpu
, options
, NULL
);