1 /* Common hooks for IBM RS/6000.
2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
25 #include "diagnostic-core.h"
27 #include "common/common-target.h"
28 #include "common/common-target-def.h"
33 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE. */
34 static const struct default_options rs6000_option_optimization_table[] =
36 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
37 { OPT_LEVELS_NONE, 0, NULL, 0 }
40 /* Implement TARGET_OPTION_INIT_STRUCT. */
43 rs6000_option_init_struct (struct gcc_options *opts)
45 if (DEFAULT_ABI == ABI_DARWIN)
46 /* The Darwin libraries never set errno, so we might as well
47 avoid calling them when that's the only reason we would. */
48 opts->x_flag_errno_math = 0;
50 /* Enable section anchors by default. */
52 opts->x_flag_section_anchors = 1;
55 /* Implement TARGET_OPTION_DEFAULT_PARAMS. */
58 rs6000_option_default_params (void)
60 /* Double growth factor to counter reduced min jump length. */
61 set_default_param_value (PARAM_MAX_GROW_COPY_BB_INSNS, 16);
64 /* If not otherwise specified by a target, make 'long double' equivalent to
67 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
68 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
71 /* Implement TARGET_HANDLE_OPTION. */
74 rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
75 const struct cl_decoded_option *decoded,
78 enum fpu_type_t fpu_type = FPU_NONE;
80 size_t code = decoded->opt_index;
81 const char *arg = decoded->arg;
82 int value = decoded->value;
87 opts->x_target_flags &= ~(MASK_POWER | MASK_POWER2
88 | MASK_MULTIPLE | MASK_STRING);
89 opts_set->x_target_flags |= (MASK_POWER | MASK_POWER2
90 | MASK_MULTIPLE | MASK_STRING);
93 opts->x_target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
94 | MASK_PPC_GFXOPT | MASK_POWERPC64);
95 opts_set->x_target_flags |= (MASK_POWERPC | MASK_PPC_GPOPT
96 | MASK_PPC_GFXOPT | MASK_POWERPC64);
99 opts->x_target_flags &= ~MASK_MINIMAL_TOC;
100 opts->x_TARGET_NO_FP_IN_TOC = 0;
101 opts->x_TARGET_NO_SUM_IN_TOC = 0;
102 opts_set->x_target_flags |= MASK_MINIMAL_TOC;
103 #ifdef TARGET_USES_SYSV4_OPT
104 /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
105 just the same as -mminimal-toc. */
106 opts->x_target_flags |= MASK_MINIMAL_TOC;
107 opts_set->x_target_flags |= MASK_MINIMAL_TOC;
111 #ifdef TARGET_USES_SYSV4_OPT
113 /* Make -mtoc behave like -mminimal-toc. */
114 opts->x_target_flags |= MASK_MINIMAL_TOC;
115 opts_set->x_target_flags |= MASK_MINIMAL_TOC;
119 #ifdef TARGET_USES_AIX64_OPT
124 opts->x_target_flags |= MASK_POWERPC64 | MASK_POWERPC;
125 opts->x_target_flags |= ~opts_set->x_target_flags & MASK_PPC_GFXOPT;
126 opts_set->x_target_flags |= MASK_POWERPC64 | MASK_POWERPC;
129 #ifdef TARGET_USES_AIX64_OPT
134 opts->x_target_flags &= ~MASK_POWERPC64;
135 opts_set->x_target_flags |= MASK_POWERPC64;
138 case OPT_mminimal_toc:
141 opts->x_TARGET_NO_FP_IN_TOC = 0;
142 opts->x_TARGET_NO_SUM_IN_TOC = 0;
149 opts->x_target_flags |= (MASK_MULTIPLE | MASK_STRING);
150 opts_set->x_target_flags |= (MASK_MULTIPLE | MASK_STRING);
157 opts->x_target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
158 opts_set->x_target_flags |= (MASK_POWER
164 case OPT_mpowerpc_gpopt:
165 case OPT_mpowerpc_gfxopt:
168 opts->x_target_flags |= MASK_POWERPC;
169 opts_set->x_target_flags |= MASK_POWERPC;
175 opts->x_rs6000_debug = 0;
177 while ((q = strtok (p, ",")) != NULL)
191 if (! strcmp (q, "all"))
192 mask = MASK_DEBUG_ALL;
193 else if (! strcmp (q, "stack"))
194 mask = MASK_DEBUG_STACK;
195 else if (! strcmp (q, "arg"))
196 mask = MASK_DEBUG_ARG;
197 else if (! strcmp (q, "reg"))
198 mask = MASK_DEBUG_REG;
199 else if (! strcmp (q, "addr"))
200 mask = MASK_DEBUG_ADDR;
201 else if (! strcmp (q, "cost"))
202 mask = MASK_DEBUG_COST;
203 else if (! strcmp (q, "target"))
204 mask = MASK_DEBUG_TARGET;
205 else if (! strcmp (q, "builtin"))
206 mask = MASK_DEBUG_BUILTIN;
208 error_at (loc, "unknown -mdebug-%s switch", q);
211 opts->x_rs6000_debug &= ~mask;
213 opts->x_rs6000_debug |= mask;
217 #ifdef TARGET_USES_SYSV4_OPT
218 case OPT_mrelocatable:
221 opts->x_target_flags |= MASK_MINIMAL_TOC;
222 opts_set->x_target_flags |= MASK_MINIMAL_TOC;
223 opts->x_TARGET_NO_FP_IN_TOC = 1;
227 case OPT_mrelocatable_lib:
230 opts->x_target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
231 opts_set->x_target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
232 opts->x_TARGET_NO_FP_IN_TOC = 1;
236 opts->x_target_flags &= ~MASK_RELOCATABLE;
237 opts_set->x_target_flags |= MASK_RELOCATABLE;
242 case OPT_mabi_altivec:
243 /* Enabling the AltiVec ABI turns off the SPE ABI. */
244 opts->x_rs6000_spe_abi = 0;
248 opts->x_rs6000_altivec_abi = 0;
251 case OPT_mlong_double_:
252 if (value != 64 && value != 128)
254 error_at (loc, "unknown switch -mlong-double-%s", arg);
255 opts->x_rs6000_long_double_type_size
256 = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
261 case OPT_msingle_float:
262 if (!TARGET_SINGLE_FPU)
264 "-msingle-float option equivalent to -mhard-float");
265 /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
266 opts->x_rs6000_double_float = 0;
267 opts->x_target_flags &= ~MASK_SOFT_FLOAT;
268 opts_set->x_target_flags |= MASK_SOFT_FLOAT;
271 case OPT_mdouble_float:
272 /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
273 opts->x_rs6000_single_float = 1;
274 opts->x_target_flags &= ~MASK_SOFT_FLOAT;
275 opts_set->x_target_flags |= MASK_SOFT_FLOAT;
278 case OPT_msimple_fpu:
279 if (!TARGET_SINGLE_FPU)
280 warning_at (loc, 0, "-msimple-fpu option ignored");
283 case OPT_mhard_float:
284 /* -mhard_float implies -msingle-float and -mdouble-float. */
285 opts->x_rs6000_single_float = opts->x_rs6000_double_float = 1;
288 case OPT_msoft_float:
289 /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
290 opts->x_rs6000_single_float = opts->x_rs6000_double_float = 0;
294 fpu_type = (enum fpu_type_t) value;
295 if (fpu_type != FPU_NONE)
297 /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on
299 opts->x_target_flags &= ~MASK_SOFT_FLOAT;
300 opts_set->x_target_flags |= MASK_SOFT_FLOAT;
301 opts->x_rs6000_xilinx_fpu = 1;
302 if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL)
303 opts->x_rs6000_single_float = 1;
304 if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL)
305 opts->x_rs6000_single_float = opts->x_rs6000_double_float = 1;
306 if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE)
307 opts->x_rs6000_simple_fpu = 1;
311 /* -mfpu=none is equivalent to -msoft-float. */
312 opts->x_target_flags |= MASK_SOFT_FLOAT;
313 opts_set->x_target_flags |= MASK_SOFT_FLOAT;
314 opts->x_rs6000_single_float = opts->x_rs6000_double_float = 0;
319 opts->x_rs6000_recip_name = (value) ? "default" : "none";
325 #undef TARGET_HANDLE_OPTION
326 #define TARGET_HANDLE_OPTION rs6000_handle_option
328 #undef TARGET_OPTION_INIT_STRUCT
329 #define TARGET_OPTION_INIT_STRUCT rs6000_option_init_struct
331 #undef TARGET_OPTION_DEFAULT_PARAMS
332 #define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
334 #undef TARGET_OPTION_OPTIMIZATION_TABLE
335 #define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
337 #undef TARGET_DEFAULT_TARGET_FLAGS
338 #define TARGET_DEFAULT_TARGET_FLAGS \
341 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;