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
;
206 error_at (loc
, "unknown -mdebug-%s switch", q
);
209 opts
->x_rs6000_debug
&= ~mask
;
211 opts
->x_rs6000_debug
|= mask
;
215 #ifdef TARGET_USES_SYSV4_OPT
216 case OPT_mrelocatable
:
219 opts
->x_target_flags
|= MASK_MINIMAL_TOC
;
220 opts_set
->x_target_flags
|= MASK_MINIMAL_TOC
;
221 opts
->x_TARGET_NO_FP_IN_TOC
= 1;
225 case OPT_mrelocatable_lib
:
228 opts
->x_target_flags
|= MASK_RELOCATABLE
| MASK_MINIMAL_TOC
;
229 opts_set
->x_target_flags
|= MASK_RELOCATABLE
| MASK_MINIMAL_TOC
;
230 opts
->x_TARGET_NO_FP_IN_TOC
= 1;
234 opts
->x_target_flags
&= ~MASK_RELOCATABLE
;
235 opts_set
->x_target_flags
|= MASK_RELOCATABLE
;
240 case OPT_mabi_altivec
:
241 /* Enabling the AltiVec ABI turns off the SPE ABI. */
242 opts
->x_rs6000_spe_abi
= 0;
246 opts
->x_rs6000_altivec_abi
= 0;
249 case OPT_mlong_double_
:
250 if (value
!= 64 && value
!= 128)
252 error_at (loc
, "unknown switch -mlong-double-%s", arg
);
253 opts
->x_rs6000_long_double_type_size
254 = RS6000_DEFAULT_LONG_DOUBLE_SIZE
;
259 case OPT_msingle_float
:
260 if (!TARGET_SINGLE_FPU
)
262 "-msingle-float option equivalent to -mhard-float");
263 /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
264 opts
->x_rs6000_double_float
= 0;
265 opts
->x_target_flags
&= ~MASK_SOFT_FLOAT
;
266 opts_set
->x_target_flags
|= MASK_SOFT_FLOAT
;
269 case OPT_mdouble_float
:
270 /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
271 opts
->x_rs6000_single_float
= 1;
272 opts
->x_target_flags
&= ~MASK_SOFT_FLOAT
;
273 opts_set
->x_target_flags
|= MASK_SOFT_FLOAT
;
276 case OPT_msimple_fpu
:
277 if (!TARGET_SINGLE_FPU
)
278 warning_at (loc
, 0, "-msimple-fpu option ignored");
281 case OPT_mhard_float
:
282 /* -mhard_float implies -msingle-float and -mdouble-float. */
283 opts
->x_rs6000_single_float
= opts
->x_rs6000_double_float
= 1;
286 case OPT_msoft_float
:
287 /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
288 opts
->x_rs6000_single_float
= opts
->x_rs6000_double_float
= 0;
292 fpu_type
= (enum fpu_type_t
) value
;
293 if (fpu_type
!= FPU_NONE
)
295 /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on
297 opts
->x_target_flags
&= ~MASK_SOFT_FLOAT
;
298 opts_set
->x_target_flags
|= MASK_SOFT_FLOAT
;
299 opts
->x_rs6000_xilinx_fpu
= 1;
300 if (fpu_type
== FPU_SF_LITE
|| fpu_type
== FPU_SF_FULL
)
301 opts
->x_rs6000_single_float
= 1;
302 if (fpu_type
== FPU_DF_LITE
|| fpu_type
== FPU_DF_FULL
)
303 opts
->x_rs6000_single_float
= opts
->x_rs6000_double_float
= 1;
304 if (fpu_type
== FPU_SF_LITE
|| fpu_type
== FPU_DF_LITE
)
305 opts
->x_rs6000_simple_fpu
= 1;
309 /* -mfpu=none is equivalent to -msoft-float. */
310 opts
->x_target_flags
|= MASK_SOFT_FLOAT
;
311 opts_set
->x_target_flags
|= MASK_SOFT_FLOAT
;
312 opts
->x_rs6000_single_float
= opts
->x_rs6000_double_float
= 0;
317 opts
->x_rs6000_recip_name
= (value
) ? "default" : "none";
323 #undef TARGET_HANDLE_OPTION
324 #define TARGET_HANDLE_OPTION rs6000_handle_option
326 #undef TARGET_OPTION_INIT_STRUCT
327 #define TARGET_OPTION_INIT_STRUCT rs6000_option_init_struct
329 #undef TARGET_OPTION_DEFAULT_PARAMS
330 #define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
332 #undef TARGET_OPTION_OPTIMIZATION_TABLE
333 #define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
335 #undef TARGET_DEFAULT_TARGET_FLAGS
336 #define TARGET_DEFAULT_TARGET_FLAGS \
339 struct gcc_targetm_common targetm_common
= TARGETM_COMMON_INITIALIZER
;