xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/common/config/s390/s390-common.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* Common hooks for IBM S/390 and zSeries.
2    Copyright (C) 1999-2015 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
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/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "diagnostic-core.h"
24 #include "tm.h"
25 #include "common/common-target.h"
26 #include "common/common-target-def.h"
27 #include "opts.h"
28 #include "flags.h"
29 
30 EXPORTED_CONST int processor_flags_table[] =
31   {
32     /* g5 */     PF_IEEE_FLOAT,
33     /* g6 */     PF_IEEE_FLOAT,
34     /* z900 */   PF_IEEE_FLOAT | PF_ZARCH,
35     /* z990 */   PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT,
36     /* z9-109 */ PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
37                  | PF_EXTIMM,
38     /* z9-ec */  PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
39                  | PF_EXTIMM | PF_DFP,
40     /* z10 */    PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
41                  | PF_EXTIMM | PF_DFP | PF_Z10,
42     /* z196 */   PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
43                  | PF_EXTIMM | PF_DFP | PF_Z10 | PF_Z196,
44     /* zEC12 */  PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
45                  | PF_EXTIMM | PF_DFP | PF_Z10 | PF_Z196 | PF_ZEC12 | PF_TX,
46     /* z13 */    PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
47                  | PF_EXTIMM | PF_DFP | PF_Z10 | PF_Z196 | PF_ZEC12 | PF_TX
48                  | PF_Z13 | PF_VX
49   };
50 
51 /* Change optimizations to be performed, depending on the
52    optimization level.  */
53 
54 static const struct default_options s390_option_optimization_table[] =
55   {
56     { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
57 
58     /* Enable -fsched-pressure by default when optimizing.  */
59     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
60 
61     /* ??? There are apparently still problems with -fcaller-saves.  */
62     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
63 
64     /* Use MVCLE instructions to decrease code size if requested.  */
65     { OPT_LEVELS_SIZE, OPT_mmvcle, NULL, 1 },
66 
67     { OPT_LEVELS_NONE, 0, NULL, 0 }
68   };
69 
70 /* Implement TARGET_OPTION_INIT_STRUCT.  */
71 
72 static void
73 s390_option_init_struct (struct gcc_options *opts)
74 {
75   /* By default, always emit DWARF-2 unwind info.  This allows debugging
76      without maintaining a stack frame back-chain.  */
77   opts->x_flag_asynchronous_unwind_tables = 1;
78 }
79 
80 /* Implement TARGET_HANDLE_OPTION.  */
81 
82 static bool
83 s390_handle_option (struct gcc_options *opts,
84 		    struct gcc_options *opts_set ATTRIBUTE_UNUSED,
85   		    const struct cl_decoded_option *decoded,
86 		    location_t loc)
87 {
88   size_t code = decoded->opt_index;
89   const char *arg = decoded->arg;
90   int value = decoded->value;
91 
92   switch (code)
93     {
94     case OPT_march_:
95       opts->x_s390_arch_flags = processor_flags_table[value];
96       opts->x_s390_arch_string = arg;
97       return true;
98 
99     case OPT_mstack_guard_:
100       if (exact_log2 (value) == -1)
101 	error_at (loc, "stack guard value must be an exact power of 2");
102       return true;
103 
104     case OPT_mstack_size_:
105       if (exact_log2 (value) == -1)
106 	error_at (loc, "stack size must be an exact power of 2");
107       return true;
108 
109     case OPT_mtune_:
110       opts->x_s390_tune_flags = processor_flags_table[value];
111       return true;
112 
113     case OPT_mwarn_framesize_:
114       return sscanf (arg, HOST_WIDE_INT_PRINT_DEC,
115 		     &opts->x_s390_warn_framesize) == 1;
116 
117     default:
118       return true;
119     }
120 }
121 
122 #undef TARGET_DEFAULT_TARGET_FLAGS
123 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT)
124 
125 #undef TARGET_HANDLE_OPTION
126 #define TARGET_HANDLE_OPTION s390_handle_option
127 
128 #undef TARGET_OPTION_OPTIMIZATION_TABLE
129 #define TARGET_OPTION_OPTIMIZATION_TABLE s390_option_optimization_table
130 
131 #undef TARGET_OPTION_INIT_STRUCT
132 #define TARGET_OPTION_INIT_STRUCT s390_option_init_struct
133 
134 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
135