Mercurial > hg > CbC > CbC_gcc
comparison gcc/targhooks.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* Default target hook functions. | 1 /* Default target hook functions. |
2 Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 | 2 Copyright (C) 2003-2017 Free Software Foundation, Inc. |
3 Free Software Foundation, Inc. | |
4 | 3 |
5 This file is part of GCC. | 4 This file is part of GCC. |
6 | 5 |
7 GCC is free software; you can redistribute it and/or modify it under | 6 GCC is free software; you can redistribute it and/or modify it under |
8 the terms of the GNU General Public License as published by the Free | 7 the terms of the GNU General Public License as published by the Free |
48 comment can thus be removed at that point. */ | 47 comment can thus be removed at that point. */ |
49 | 48 |
50 #include "config.h" | 49 #include "config.h" |
51 #include "system.h" | 50 #include "system.h" |
52 #include "coretypes.h" | 51 #include "coretypes.h" |
53 #include "tm.h" | 52 #include "target.h" |
54 #include "machmode.h" | 53 #include "function.h" |
55 #include "rtl.h" | 54 #include "rtl.h" |
56 #include "tree.h" | 55 #include "tree.h" |
56 #include "tree-ssa-alias.h" | |
57 #include "gimple-expr.h" | |
58 #include "memmodel.h" | |
59 #include "tm_p.h" | |
60 #include "stringpool.h" | |
61 #include "tree-vrp.h" | |
62 #include "tree-ssanames.h" | |
63 #include "profile-count.h" | |
64 #include "optabs.h" | |
65 #include "regs.h" | |
66 #include "recog.h" | |
67 #include "diagnostic-core.h" | |
68 #include "fold-const.h" | |
69 #include "stor-layout.h" | |
70 #include "varasm.h" | |
71 #include "flags.h" | |
72 #include "explow.h" | |
73 #include "calls.h" | |
57 #include "expr.h" | 74 #include "expr.h" |
58 #include "output.h" | 75 #include "output.h" |
59 #include "diagnostic-core.h" | 76 #include "common/common-target.h" |
60 #include "function.h" | |
61 #include "target.h" | |
62 #include "tm_p.h" | |
63 #include "target-def.h" | |
64 #include "ggc.h" | |
65 #include "hard-reg-set.h" | |
66 #include "regs.h" | |
67 #include "reload.h" | 77 #include "reload.h" |
68 #include "optabs.h" | |
69 #include "recog.h" | |
70 #include "intl.h" | 78 #include "intl.h" |
71 #include "opts.h" | 79 #include "opts.h" |
72 #include "tree-flow.h" | 80 #include "gimplify.h" |
73 #include "tree-ssa-alias.h" | 81 #include "predict.h" |
74 | 82 #include "params.h" |
75 | 83 #include "real.h" |
76 bool | 84 |
77 default_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, | 85 |
86 bool | |
87 default_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED, | |
78 rtx addr ATTRIBUTE_UNUSED, | 88 rtx addr ATTRIBUTE_UNUSED, |
79 bool strict ATTRIBUTE_UNUSED) | 89 bool strict ATTRIBUTE_UNUSED) |
80 { | 90 { |
81 #ifdef GO_IF_LEGITIMATE_ADDRESS | 91 #ifdef GO_IF_LEGITIMATE_ADDRESS |
82 /* Defer to the old implementation using a goto. */ | 92 /* Defer to the old implementation using a goto. */ |
91 | 101 |
92 void | 102 void |
93 default_external_libcall (rtx fun ATTRIBUTE_UNUSED) | 103 default_external_libcall (rtx fun ATTRIBUTE_UNUSED) |
94 { | 104 { |
95 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL | 105 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL |
96 ASM_OUTPUT_EXTERNAL_LIBCALL(asm_out_file, fun); | 106 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun); |
97 #endif | 107 #endif |
98 } | 108 } |
99 | 109 |
100 int | 110 int |
101 default_unspec_may_trap_p (const_rtx x, unsigned flags) | 111 default_unspec_may_trap_p (const_rtx x, unsigned flags) |
102 { | 112 { |
103 int i; | 113 int i; |
104 | 114 |
105 if (GET_CODE (x) == UNSPEC_VOLATILE | 115 /* Any floating arithmetic may trap. */ |
106 /* Any floating arithmetic may trap. */ | 116 if ((SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math)) |
107 || (SCALAR_FLOAT_MODE_P (GET_MODE (x)) | |
108 && flag_trapping_math)) | |
109 return 1; | 117 return 1; |
110 | 118 |
111 for (i = 0; i < XVECLEN (x, 0); ++i) | 119 for (i = 0; i < XVECLEN (x, 0); ++i) |
112 { | 120 { |
113 if (may_trap_p_1 (XVECEXP (x, 0, i), flags)) | 121 if (may_trap_p_1 (XVECEXP (x, 0, i), flags)) |
115 } | 123 } |
116 | 124 |
117 return 0; | 125 return 0; |
118 } | 126 } |
119 | 127 |
120 enum machine_mode | 128 machine_mode |
121 default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, | 129 default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, |
122 enum machine_mode mode, | 130 machine_mode mode, |
123 int *punsignedp ATTRIBUTE_UNUSED, | 131 int *punsignedp ATTRIBUTE_UNUSED, |
124 const_tree funtype ATTRIBUTE_UNUSED, | 132 const_tree funtype ATTRIBUTE_UNUSED, |
125 int for_return ATTRIBUTE_UNUSED) | 133 int for_return ATTRIBUTE_UNUSED) |
126 { | 134 { |
127 if (for_return == 2) | 135 if (type != NULL_TREE && for_return == 2) |
128 return promote_mode (type, mode, punsignedp); | 136 return promote_mode (type, mode, punsignedp); |
129 return mode; | 137 return mode; |
130 } | 138 } |
131 | 139 |
132 enum machine_mode | 140 machine_mode |
133 default_promote_function_mode_always_promote (const_tree type, | 141 default_promote_function_mode_always_promote (const_tree type, |
134 enum machine_mode mode, | 142 machine_mode mode, |
135 int *punsignedp, | 143 int *punsignedp, |
136 const_tree funtype ATTRIBUTE_UNUSED, | 144 const_tree funtype ATTRIBUTE_UNUSED, |
137 int for_return ATTRIBUTE_UNUSED) | 145 int for_return ATTRIBUTE_UNUSED) |
138 { | 146 { |
139 return promote_mode (type, mode, punsignedp); | 147 return promote_mode (type, mode, punsignedp); |
140 } | 148 } |
141 | 149 |
142 | 150 machine_mode |
143 enum machine_mode | 151 default_cc_modes_compatible (machine_mode m1, machine_mode m2) |
144 default_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2) | |
145 { | 152 { |
146 if (m1 == m2) | 153 if (m1 == m2) |
147 return m1; | 154 return m1; |
148 return VOIDmode; | 155 return VOIDmode; |
149 } | 156 } |
155 return (TYPE_MODE (type) == BLKmode); | 162 return (TYPE_MODE (type) == BLKmode); |
156 } | 163 } |
157 | 164 |
158 rtx | 165 rtx |
159 default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED, | 166 default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED, |
160 enum machine_mode mode ATTRIBUTE_UNUSED) | 167 machine_mode mode ATTRIBUTE_UNUSED) |
161 { | 168 { |
162 return x; | 169 return x; |
170 } | |
171 | |
172 bool | |
173 default_legitimize_address_displacement (rtx *disp ATTRIBUTE_UNUSED, | |
174 rtx *offset ATTRIBUTE_UNUSED, | |
175 machine_mode mode ATTRIBUTE_UNUSED) | |
176 { | |
177 return false; | |
178 } | |
179 | |
180 bool | |
181 default_const_not_ok_for_debug_p (rtx x) | |
182 { | |
183 if (GET_CODE (x) == UNSPEC) | |
184 return true; | |
185 return false; | |
163 } | 186 } |
164 | 187 |
165 rtx | 188 rtx |
166 default_expand_builtin_saveregs (void) | 189 default_expand_builtin_saveregs (void) |
167 { | 190 { |
168 error ("__builtin_saveregs not supported by this target"); | 191 error ("__builtin_saveregs not supported by this target"); |
169 return const0_rtx; | 192 return const0_rtx; |
170 } | 193 } |
171 | 194 |
172 void | 195 void |
173 default_setup_incoming_varargs (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 196 default_setup_incoming_varargs (cumulative_args_t ca ATTRIBUTE_UNUSED, |
174 enum machine_mode mode ATTRIBUTE_UNUSED, | 197 machine_mode mode ATTRIBUTE_UNUSED, |
175 tree type ATTRIBUTE_UNUSED, | 198 tree type ATTRIBUTE_UNUSED, |
176 int *pretend_arg_size ATTRIBUTE_UNUSED, | 199 int *pretend_arg_size ATTRIBUTE_UNUSED, |
177 int second_time ATTRIBUTE_UNUSED) | 200 int second_time ATTRIBUTE_UNUSED) |
178 { | 201 { |
179 } | 202 } |
187 } | 210 } |
188 | 211 |
189 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false. */ | 212 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false. */ |
190 | 213 |
191 bool | 214 bool |
192 hook_bool_CUMULATIVE_ARGS_false (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED) | 215 hook_bool_CUMULATIVE_ARGS_false (cumulative_args_t ca ATTRIBUTE_UNUSED) |
193 { | 216 { |
194 return false; | 217 return false; |
195 } | 218 } |
196 | 219 |
197 bool | 220 bool |
198 default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED) | 221 default_pretend_outgoing_varargs_named (cumulative_args_t ca ATTRIBUTE_UNUSED) |
199 { | 222 { |
200 return (targetm.calls.setup_incoming_varargs | 223 return (targetm.calls.setup_incoming_varargs |
201 != default_setup_incoming_varargs); | 224 != default_setup_incoming_varargs); |
202 } | 225 } |
203 | 226 |
204 enum machine_mode | 227 scalar_int_mode |
205 default_eh_return_filter_mode (void) | 228 default_eh_return_filter_mode (void) |
206 { | 229 { |
207 return targetm.unwind_word_mode (); | 230 return targetm.unwind_word_mode (); |
208 } | 231 } |
209 | 232 |
210 enum machine_mode | 233 scalar_int_mode |
211 default_libgcc_cmp_return_mode (void) | 234 default_libgcc_cmp_return_mode (void) |
212 { | 235 { |
213 return word_mode; | 236 return word_mode; |
214 } | 237 } |
215 | 238 |
216 enum machine_mode | 239 scalar_int_mode |
217 default_libgcc_shift_count_mode (void) | 240 default_libgcc_shift_count_mode (void) |
218 { | 241 { |
219 return word_mode; | 242 return word_mode; |
220 } | 243 } |
221 | 244 |
222 enum machine_mode | 245 scalar_int_mode |
223 default_unwind_word_mode (void) | 246 default_unwind_word_mode (void) |
224 { | 247 { |
225 return word_mode; | 248 return word_mode; |
226 } | 249 } |
227 | 250 |
228 /* The default implementation of TARGET_SHIFT_TRUNCATION_MASK. */ | 251 /* The default implementation of TARGET_SHIFT_TRUNCATION_MASK. */ |
229 | 252 |
230 unsigned HOST_WIDE_INT | 253 unsigned HOST_WIDE_INT |
231 default_shift_truncation_mask (enum machine_mode mode) | 254 default_shift_truncation_mask (machine_mode mode) |
232 { | 255 { |
233 return SHIFT_COUNT_TRUNCATED ? GET_MODE_BITSIZE (mode) - 1 : 0; | 256 return SHIFT_COUNT_TRUNCATED ? GET_MODE_UNIT_BITSIZE (mode) - 1 : 0; |
234 } | 257 } |
235 | 258 |
236 /* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL. */ | 259 /* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL. */ |
237 | 260 |
238 unsigned int | 261 unsigned int |
239 default_min_divisions_for_recip_mul (enum machine_mode mode ATTRIBUTE_UNUSED) | 262 default_min_divisions_for_recip_mul (machine_mode mode ATTRIBUTE_UNUSED) |
240 { | 263 { |
241 return have_insn_for (DIV, mode) ? 3 : 2; | 264 return have_insn_for (DIV, mode) ? 3 : 2; |
242 } | 265 } |
243 | 266 |
244 /* The default implementation of TARGET_MODE_REP_EXTENDED. */ | 267 /* The default implementation of TARGET_MODE_REP_EXTENDED. */ |
245 | 268 |
246 int | 269 int |
247 default_mode_rep_extended (enum machine_mode mode ATTRIBUTE_UNUSED, | 270 default_mode_rep_extended (scalar_int_mode, scalar_int_mode) |
248 enum machine_mode mode_rep ATTRIBUTE_UNUSED) | |
249 { | 271 { |
250 return UNKNOWN; | 272 return UNKNOWN; |
251 } | 273 } |
252 | 274 |
253 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true. */ | 275 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true. */ |
254 | 276 |
255 bool | 277 bool |
256 hook_bool_CUMULATIVE_ARGS_true (CUMULATIVE_ARGS * a ATTRIBUTE_UNUSED) | 278 hook_bool_CUMULATIVE_ARGS_true (cumulative_args_t a ATTRIBUTE_UNUSED) |
257 { | 279 { |
258 return true; | 280 return true; |
259 } | 281 } |
260 | 282 |
261 /* Return machine mode for non-standard suffix | 283 /* Return machine mode for non-standard suffix |
262 or VOIDmode if non-standard suffixes are unsupported. */ | 284 or VOIDmode if non-standard suffixes are unsupported. */ |
263 enum machine_mode | 285 machine_mode |
264 default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED) | 286 default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED) |
265 { | 287 { |
266 return VOIDmode; | 288 return VOIDmode; |
267 } | 289 } |
268 | 290 |
270 tree | 292 tree |
271 default_cxx_guard_type (void) | 293 default_cxx_guard_type (void) |
272 { | 294 { |
273 return long_long_integer_type_node; | 295 return long_long_integer_type_node; |
274 } | 296 } |
275 | |
276 | 297 |
277 /* Returns the size of the cookie to use when allocating an array | 298 /* Returns the size of the cookie to use when allocating an array |
278 whose elements have the indicated TYPE. Assumes that it is already | 299 whose elements have the indicated TYPE. Assumes that it is already |
279 known that a cookie is needed. */ | 300 known that a cookie is needed. */ |
280 | 301 |
288 tree sizetype_size; | 309 tree sizetype_size; |
289 tree type_align; | 310 tree type_align; |
290 | 311 |
291 sizetype_size = size_in_bytes (sizetype); | 312 sizetype_size = size_in_bytes (sizetype); |
292 type_align = size_int (TYPE_ALIGN_UNIT (type)); | 313 type_align = size_int (TYPE_ALIGN_UNIT (type)); |
293 if (INT_CST_LT_UNSIGNED (type_align, sizetype_size)) | 314 if (tree_int_cst_lt (type_align, sizetype_size)) |
294 cookie_size = sizetype_size; | 315 cookie_size = sizetype_size; |
295 else | 316 else |
296 cookie_size = type_align; | 317 cookie_size = type_align; |
297 | 318 |
298 return cookie_size; | 319 return cookie_size; |
300 | 321 |
301 /* Return true if a parameter must be passed by reference. This version | 322 /* Return true if a parameter must be passed by reference. This version |
302 of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK. */ | 323 of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK. */ |
303 | 324 |
304 bool | 325 bool |
305 hook_pass_by_reference_must_pass_in_stack (CUMULATIVE_ARGS *c ATTRIBUTE_UNUSED, | 326 hook_pass_by_reference_must_pass_in_stack (cumulative_args_t c ATTRIBUTE_UNUSED, |
306 enum machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED, | 327 machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED, |
307 bool named_arg ATTRIBUTE_UNUSED) | 328 bool named_arg ATTRIBUTE_UNUSED) |
308 { | 329 { |
309 return targetm.calls.must_pass_in_stack (mode, type); | 330 return targetm.calls.must_pass_in_stack (mode, type); |
310 } | 331 } |
311 | 332 |
312 /* Return true if a parameter follows callee copies conventions. This | 333 /* Return true if a parameter follows callee copies conventions. This |
313 version of the hook is true for all named arguments. */ | 334 version of the hook is true for all named arguments. */ |
314 | 335 |
315 bool | 336 bool |
316 hook_callee_copies_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 337 hook_callee_copies_named (cumulative_args_t ca ATTRIBUTE_UNUSED, |
317 enum machine_mode mode ATTRIBUTE_UNUSED, | 338 machine_mode mode ATTRIBUTE_UNUSED, |
318 const_tree type ATTRIBUTE_UNUSED, bool named) | 339 const_tree type ATTRIBUTE_UNUSED, bool named) |
319 { | 340 { |
320 return named; | 341 return named; |
321 } | 342 } |
322 | 343 |
336 /* Emit to STREAM the assembler syntax for an insn operand whose memory | 357 /* Emit to STREAM the assembler syntax for an insn operand whose memory |
337 address is X. */ | 358 address is X. */ |
338 | 359 |
339 void | 360 void |
340 default_print_operand_address (FILE *stream ATTRIBUTE_UNUSED, | 361 default_print_operand_address (FILE *stream ATTRIBUTE_UNUSED, |
362 machine_mode /*mode*/, | |
341 rtx x ATTRIBUTE_UNUSED) | 363 rtx x ATTRIBUTE_UNUSED) |
342 { | 364 { |
343 #ifdef PRINT_OPERAND_ADDRESS | 365 #ifdef PRINT_OPERAND_ADDRESS |
344 PRINT_OPERAND_ADDRESS (stream, x); | 366 PRINT_OPERAND_ADDRESS (stream, x); |
345 #else | 367 #else |
369 if (*name != '*' && user_label_prefix[0]) | 391 if (*name != '*' && user_label_prefix[0]) |
370 stripped = ACONCAT ((user_label_prefix, stripped, NULL)); | 392 stripped = ACONCAT ((user_label_prefix, stripped, NULL)); |
371 return get_identifier (stripped); | 393 return get_identifier (stripped); |
372 } | 394 } |
373 | 395 |
374 /* The default implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA. */ | |
375 | |
376 bool | |
377 default_asm_output_addr_const_extra (FILE *file ATTRIBUTE_UNUSED, | |
378 rtx x ATTRIBUTE_UNUSED) | |
379 { | |
380 #ifdef OUTPUT_ADDR_CONST_EXTRA | |
381 OUTPUT_ADDR_CONST_EXTRA (file, x, fail); | |
382 return true; | |
383 | |
384 fail: | |
385 #endif | |
386 return false; | |
387 } | |
388 | |
389 /* True if MODE is valid for the target. By "valid", we mean able to | 396 /* True if MODE is valid for the target. By "valid", we mean able to |
390 be manipulated in non-trivial ways. In particular, this means all | 397 be manipulated in non-trivial ways. In particular, this means all |
391 the arithmetic is supported. | 398 the arithmetic is supported. |
392 | 399 |
393 By default we guess this means that any C type is supported. If | 400 By default we guess this means that any C type is supported. If |
394 we can't map the mode back to a type that would be available in C, | 401 we can't map the mode back to a type that would be available in C, |
395 then reject it. Special case, here, is the double-word arithmetic | 402 then reject it. Special case, here, is the double-word arithmetic |
396 supported by optabs.c. */ | 403 supported by optabs.c. */ |
397 | 404 |
398 bool | 405 bool |
399 default_scalar_mode_supported_p (enum machine_mode mode) | 406 default_scalar_mode_supported_p (scalar_mode mode) |
400 { | 407 { |
401 int precision = GET_MODE_PRECISION (mode); | 408 int precision = GET_MODE_PRECISION (mode); |
402 | 409 |
403 switch (GET_MODE_CLASS (mode)) | 410 switch (GET_MODE_CLASS (mode)) |
404 { | 411 { |
437 default: | 444 default: |
438 gcc_unreachable (); | 445 gcc_unreachable (); |
439 } | 446 } |
440 } | 447 } |
441 | 448 |
449 /* Return true if libgcc supports floating-point mode MODE (known to | |
450 be supported as a scalar mode). */ | |
451 | |
452 bool | |
453 default_libgcc_floating_mode_supported_p (scalar_float_mode mode) | |
454 { | |
455 switch (mode) | |
456 { | |
457 #ifdef HAVE_SFmode | |
458 case E_SFmode: | |
459 #endif | |
460 #ifdef HAVE_DFmode | |
461 case E_DFmode: | |
462 #endif | |
463 #ifdef HAVE_XFmode | |
464 case E_XFmode: | |
465 #endif | |
466 #ifdef HAVE_TFmode | |
467 case E_TFmode: | |
468 #endif | |
469 return true; | |
470 | |
471 default: | |
472 return false; | |
473 } | |
474 } | |
475 | |
476 /* Return the machine mode to use for the type _FloatN, if EXTENDED is | |
477 false, or _FloatNx, if EXTENDED is true, or VOIDmode if not | |
478 supported. */ | |
479 opt_scalar_float_mode | |
480 default_floatn_mode (int n, bool extended) | |
481 { | |
482 if (extended) | |
483 { | |
484 opt_scalar_float_mode cand1, cand2; | |
485 scalar_float_mode mode; | |
486 switch (n) | |
487 { | |
488 case 32: | |
489 #ifdef HAVE_DFmode | |
490 cand1 = DFmode; | |
491 #endif | |
492 break; | |
493 | |
494 case 64: | |
495 #ifdef HAVE_XFmode | |
496 cand1 = XFmode; | |
497 #endif | |
498 #ifdef HAVE_TFmode | |
499 cand2 = TFmode; | |
500 #endif | |
501 break; | |
502 | |
503 case 128: | |
504 break; | |
505 | |
506 default: | |
507 /* Those are the only valid _FloatNx types. */ | |
508 gcc_unreachable (); | |
509 } | |
510 if (cand1.exists (&mode) | |
511 && REAL_MODE_FORMAT (mode)->ieee_bits > n | |
512 && targetm.scalar_mode_supported_p (mode) | |
513 && targetm.libgcc_floating_mode_supported_p (mode)) | |
514 return cand1; | |
515 if (cand2.exists (&mode) | |
516 && REAL_MODE_FORMAT (mode)->ieee_bits > n | |
517 && targetm.scalar_mode_supported_p (mode) | |
518 && targetm.libgcc_floating_mode_supported_p (mode)) | |
519 return cand2; | |
520 } | |
521 else | |
522 { | |
523 opt_scalar_float_mode cand; | |
524 scalar_float_mode mode; | |
525 switch (n) | |
526 { | |
527 case 16: | |
528 /* Always enable _Float16 if we have basic support for the mode. | |
529 Targets can control the range and precision of operations on | |
530 the _Float16 type using TARGET_C_EXCESS_PRECISION. */ | |
531 #ifdef HAVE_HFmode | |
532 cand = HFmode; | |
533 #endif | |
534 break; | |
535 | |
536 case 32: | |
537 #ifdef HAVE_SFmode | |
538 cand = SFmode; | |
539 #endif | |
540 break; | |
541 | |
542 case 64: | |
543 #ifdef HAVE_DFmode | |
544 cand = DFmode; | |
545 #endif | |
546 break; | |
547 | |
548 case 128: | |
549 #ifdef HAVE_TFmode | |
550 cand = TFmode; | |
551 #endif | |
552 break; | |
553 | |
554 default: | |
555 break; | |
556 } | |
557 if (cand.exists (&mode) | |
558 && REAL_MODE_FORMAT (mode)->ieee_bits == n | |
559 && targetm.scalar_mode_supported_p (mode) | |
560 && targetm.libgcc_floating_mode_supported_p (mode)) | |
561 return cand; | |
562 } | |
563 return opt_scalar_float_mode (); | |
564 } | |
565 | |
442 /* Make some target macros useable by target-independent code. */ | 566 /* Make some target macros useable by target-independent code. */ |
443 bool | 567 bool |
444 targhook_words_big_endian (void) | 568 targhook_words_big_endian (void) |
445 { | 569 { |
446 return !!WORDS_BIG_ENDIAN; | 570 return !!WORDS_BIG_ENDIAN; |
450 targhook_float_words_big_endian (void) | 574 targhook_float_words_big_endian (void) |
451 { | 575 { |
452 return !!FLOAT_WORDS_BIG_ENDIAN; | 576 return !!FLOAT_WORDS_BIG_ENDIAN; |
453 } | 577 } |
454 | 578 |
579 /* True if the target supports floating-point exceptions and rounding | |
580 modes. */ | |
581 | |
582 bool | |
583 default_float_exceptions_rounding_supported_p (void) | |
584 { | |
585 #ifdef HAVE_adddf3 | |
586 return HAVE_adddf3; | |
587 #else | |
588 return false; | |
589 #endif | |
590 } | |
591 | |
455 /* True if the target supports decimal floating point. */ | 592 /* True if the target supports decimal floating point. */ |
456 | 593 |
457 bool | 594 bool |
458 default_decimal_float_supported_p (void) | 595 default_decimal_float_supported_p (void) |
459 { | 596 { |
464 | 601 |
465 bool | 602 bool |
466 default_fixed_point_supported_p (void) | 603 default_fixed_point_supported_p (void) |
467 { | 604 { |
468 return ENABLE_FIXED_POINT; | 605 return ENABLE_FIXED_POINT; |
606 } | |
607 | |
608 /* True if the target supports GNU indirect functions. */ | |
609 | |
610 bool | |
611 default_has_ifunc_p (void) | |
612 { | |
613 return HAVE_GNU_INDIRECT_FUNCTION; | |
469 } | 614 } |
470 | 615 |
471 /* NULL if INSN insn is valid within a low-overhead loop, otherwise returns | 616 /* NULL if INSN insn is valid within a low-overhead loop, otherwise returns |
472 an error message. | 617 an error message. |
473 | 618 |
477 for low-overhead looping. Additionally, some targets (eg, PPC) use the count | 622 for low-overhead looping. Additionally, some targets (eg, PPC) use the count |
478 register for branch on table instructions. We reject the doloop pattern in | 623 register for branch on table instructions. We reject the doloop pattern in |
479 these cases. */ | 624 these cases. */ |
480 | 625 |
481 const char * | 626 const char * |
482 default_invalid_within_doloop (const_rtx insn) | 627 default_invalid_within_doloop (const rtx_insn *insn) |
483 { | 628 { |
484 if (CALL_P (insn)) | 629 if (CALL_P (insn)) |
485 return "Function call in loop."; | 630 return "Function call in loop."; |
486 | 631 |
487 if (JUMP_TABLE_DATA_P (insn)) | 632 if (tablejump_p (insn, NULL, NULL) || computed_jump_p (insn)) |
488 return "Computed branch in the loop."; | 633 return "Computed branch in the loop."; |
489 | 634 |
490 return NULL; | 635 return NULL; |
491 } | 636 } |
492 | 637 |
493 /* Mapping of builtin functions to vectorized variants. */ | 638 /* Mapping of builtin functions to vectorized variants. */ |
494 | 639 |
495 tree | 640 tree |
496 default_builtin_vectorized_function (tree fndecl ATTRIBUTE_UNUSED, | 641 default_builtin_vectorized_function (unsigned int, tree, tree) |
497 tree type_out ATTRIBUTE_UNUSED, | 642 { |
498 tree type_in ATTRIBUTE_UNUSED) | 643 return NULL_TREE; |
644 } | |
645 | |
646 /* Mapping of target builtin functions to vectorized variants. */ | |
647 | |
648 tree | |
649 default_builtin_md_vectorized_function (tree, tree, tree) | |
499 { | 650 { |
500 return NULL_TREE; | 651 return NULL_TREE; |
501 } | 652 } |
502 | 653 |
503 /* Vectorized conversion. */ | 654 /* Vectorized conversion. */ |
512 | 663 |
513 /* Default vectorizer cost model values. */ | 664 /* Default vectorizer cost model values. */ |
514 | 665 |
515 int | 666 int |
516 default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, | 667 default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, |
517 tree vectype ATTRIBUTE_UNUSED, | 668 tree vectype, |
518 int misalign ATTRIBUTE_UNUSED) | 669 int misalign ATTRIBUTE_UNUSED) |
519 { | 670 { |
520 switch (type_of_cost) | 671 switch (type_of_cost) |
521 { | 672 { |
522 case scalar_stmt: | 673 case scalar_stmt: |
527 case vector_store: | 678 case vector_store: |
528 case vec_to_scalar: | 679 case vec_to_scalar: |
529 case scalar_to_vec: | 680 case scalar_to_vec: |
530 case cond_branch_not_taken: | 681 case cond_branch_not_taken: |
531 case vec_perm: | 682 case vec_perm: |
683 case vec_promote_demote: | |
532 return 1; | 684 return 1; |
533 | 685 |
534 case unaligned_load: | 686 case unaligned_load: |
535 case unaligned_store: | 687 case unaligned_store: |
536 return 2; | 688 return 2; |
537 | 689 |
538 case cond_branch_taken: | 690 case cond_branch_taken: |
539 return 3; | 691 return 3; |
540 | 692 |
693 case vec_construct: | |
694 return TYPE_VECTOR_SUBPARTS (vectype) - 1; | |
695 | |
541 default: | 696 default: |
542 gcc_unreachable (); | 697 gcc_unreachable (); |
543 } | 698 } |
544 } | 699 } |
545 | 700 |
546 /* Reciprocal. */ | 701 /* Reciprocal. */ |
547 | 702 |
548 tree | 703 tree |
549 default_builtin_reciprocal (unsigned int fn ATTRIBUTE_UNUSED, | 704 default_builtin_reciprocal (tree) |
550 bool md_fn ATTRIBUTE_UNUSED, | |
551 bool sqrt ATTRIBUTE_UNUSED) | |
552 { | 705 { |
553 return NULL_TREE; | 706 return NULL_TREE; |
554 } | 707 } |
555 | 708 |
556 bool | 709 bool |
557 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false ( | 710 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false ( |
558 CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 711 cumulative_args_t ca ATTRIBUTE_UNUSED, |
559 enum machine_mode mode ATTRIBUTE_UNUSED, | 712 machine_mode mode ATTRIBUTE_UNUSED, |
560 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) | 713 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) |
561 { | 714 { |
562 return false; | 715 return false; |
563 } | 716 } |
564 | 717 |
565 bool | 718 bool |
566 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true ( | 719 hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true ( |
567 CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 720 cumulative_args_t ca ATTRIBUTE_UNUSED, |
568 enum machine_mode mode ATTRIBUTE_UNUSED, | 721 machine_mode mode ATTRIBUTE_UNUSED, |
569 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) | 722 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) |
570 { | 723 { |
571 return true; | 724 return true; |
572 } | 725 } |
573 | 726 |
574 int | 727 int |
575 hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 ( | 728 hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 ( |
576 CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 729 cumulative_args_t ca ATTRIBUTE_UNUSED, |
577 enum machine_mode mode ATTRIBUTE_UNUSED, | 730 machine_mode mode ATTRIBUTE_UNUSED, |
578 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) | 731 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED) |
579 { | 732 { |
580 return 0; | 733 return 0; |
581 } | 734 } |
582 | 735 |
583 void | 736 void |
584 default_function_arg_advance (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 737 default_function_arg_advance (cumulative_args_t ca ATTRIBUTE_UNUSED, |
585 enum machine_mode mode ATTRIBUTE_UNUSED, | 738 machine_mode mode ATTRIBUTE_UNUSED, |
586 const_tree type ATTRIBUTE_UNUSED, | 739 const_tree type ATTRIBUTE_UNUSED, |
587 bool named ATTRIBUTE_UNUSED) | 740 bool named ATTRIBUTE_UNUSED) |
588 { | 741 { |
589 #ifdef FUNCTION_ARG_ADVANCE | |
590 CUMULATIVE_ARGS args = *ca; | |
591 FUNCTION_ARG_ADVANCE (args, mode, CONST_CAST_TREE (type), named); | |
592 *ca = args; | |
593 #else | |
594 gcc_unreachable (); | 742 gcc_unreachable (); |
595 #endif | 743 } |
744 | |
745 /* Default implementation of TARGET_FUNCTION_ARG_OFFSET. */ | |
746 | |
747 HOST_WIDE_INT | |
748 default_function_arg_offset (machine_mode, const_tree) | |
749 { | |
750 return 0; | |
751 } | |
752 | |
753 /* Default implementation of TARGET_FUNCTION_ARG_PADDING: usually pad | |
754 upward, but pad short args downward on big-endian machines. */ | |
755 | |
756 pad_direction | |
757 default_function_arg_padding (machine_mode mode, const_tree type) | |
758 { | |
759 if (!BYTES_BIG_ENDIAN) | |
760 return PAD_UPWARD; | |
761 | |
762 unsigned HOST_WIDE_INT size; | |
763 if (mode == BLKmode) | |
764 { | |
765 if (!type || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) | |
766 return PAD_UPWARD; | |
767 size = int_size_in_bytes (type); | |
768 } | |
769 else | |
770 size = GET_MODE_SIZE (mode); | |
771 | |
772 if (size < (PARM_BOUNDARY / BITS_PER_UNIT)) | |
773 return PAD_DOWNWARD; | |
774 | |
775 return PAD_UPWARD; | |
596 } | 776 } |
597 | 777 |
598 rtx | 778 rtx |
599 default_function_arg (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 779 default_function_arg (cumulative_args_t ca ATTRIBUTE_UNUSED, |
600 enum machine_mode mode ATTRIBUTE_UNUSED, | 780 machine_mode mode ATTRIBUTE_UNUSED, |
601 const_tree type ATTRIBUTE_UNUSED, | 781 const_tree type ATTRIBUTE_UNUSED, |
602 bool named ATTRIBUTE_UNUSED) | 782 bool named ATTRIBUTE_UNUSED) |
603 { | 783 { |
604 #ifdef FUNCTION_ARG | |
605 return FUNCTION_ARG (*ca, mode, CONST_CAST_TREE (type), named); | |
606 #else | |
607 gcc_unreachable (); | 784 gcc_unreachable (); |
608 #endif | |
609 } | 785 } |
610 | 786 |
611 rtx | 787 rtx |
612 default_function_incoming_arg (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED, | 788 default_function_incoming_arg (cumulative_args_t ca ATTRIBUTE_UNUSED, |
613 enum machine_mode mode ATTRIBUTE_UNUSED, | 789 machine_mode mode ATTRIBUTE_UNUSED, |
614 const_tree type ATTRIBUTE_UNUSED, | 790 const_tree type ATTRIBUTE_UNUSED, |
615 bool named ATTRIBUTE_UNUSED) | 791 bool named ATTRIBUTE_UNUSED) |
616 { | 792 { |
617 #ifdef FUNCTION_INCOMING_ARG | |
618 return FUNCTION_INCOMING_ARG (*ca, mode, CONST_CAST_TREE (type), named); | |
619 #else | |
620 gcc_unreachable (); | 793 gcc_unreachable (); |
621 #endif | |
622 } | 794 } |
623 | 795 |
624 unsigned int | 796 unsigned int |
625 default_function_arg_boundary (enum machine_mode mode ATTRIBUTE_UNUSED, | 797 default_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED, |
626 const_tree type ATTRIBUTE_UNUSED) | 798 const_tree type ATTRIBUTE_UNUSED) |
799 { | |
800 return PARM_BOUNDARY; | |
801 } | |
802 | |
803 unsigned int | |
804 default_function_arg_round_boundary (machine_mode mode ATTRIBUTE_UNUSED, | |
805 const_tree type ATTRIBUTE_UNUSED) | |
627 { | 806 { |
628 return PARM_BOUNDARY; | 807 return PARM_BOUNDARY; |
629 } | 808 } |
630 | 809 |
631 void | 810 void |
764 gcc_unreachable (); | 943 gcc_unreachable (); |
765 #endif | 944 #endif |
766 } | 945 } |
767 | 946 |
768 rtx | 947 rtx |
769 default_libcall_value (enum machine_mode mode ATTRIBUTE_UNUSED, | 948 default_libcall_value (machine_mode mode ATTRIBUTE_UNUSED, |
770 const_rtx fun ATTRIBUTE_UNUSED) | 949 const_rtx fun ATTRIBUTE_UNUSED) |
771 { | 950 { |
772 #ifdef LIBCALL_VALUE | 951 #ifdef LIBCALL_VALUE |
773 return LIBCALL_VALUE (mode); | 952 return LIBCALL_VALUE (mode); |
774 #else | 953 #else |
802 else | 981 else |
803 return virtual_incoming_args_rtx; | 982 return virtual_incoming_args_rtx; |
804 } | 983 } |
805 | 984 |
806 rtx | 985 rtx |
807 default_static_chain (const_tree fndecl, bool incoming_p) | 986 default_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p) |
808 { | 987 { |
809 if (!DECL_STATIC_CHAIN (fndecl)) | |
810 return NULL; | |
811 | |
812 if (incoming_p) | 988 if (incoming_p) |
813 { | 989 { |
814 #ifdef STATIC_CHAIN_INCOMING_REGNUM | 990 #ifdef STATIC_CHAIN_INCOMING_REGNUM |
815 return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM); | 991 return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM); |
816 #endif | 992 #endif |
853 default_branch_target_register_class (void) | 1029 default_branch_target_register_class (void) |
854 { | 1030 { |
855 return NO_REGS; | 1031 return NO_REGS; |
856 } | 1032 } |
857 | 1033 |
858 #ifdef IRA_COVER_CLASSES | 1034 reg_class_t |
859 const reg_class_t * | 1035 default_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED, |
860 default_ira_cover_classes (void) | 1036 reg_class_t cl, |
861 { | 1037 reg_class_t best_cl ATTRIBUTE_UNUSED) |
862 static reg_class_t classes[] = IRA_COVER_CLASSES; | 1038 { |
863 return classes; | 1039 return cl; |
864 } | 1040 } |
865 #endif | 1041 |
1042 extern bool | |
1043 default_lra_p (void) | |
1044 { | |
1045 return true; | |
1046 } | |
1047 | |
1048 int | |
1049 default_register_priority (int hard_regno ATTRIBUTE_UNUSED) | |
1050 { | |
1051 return 0; | |
1052 } | |
1053 | |
1054 extern bool | |
1055 default_register_usage_leveling_p (void) | |
1056 { | |
1057 return false; | |
1058 } | |
1059 | |
1060 extern bool | |
1061 default_different_addr_displacement_p (void) | |
1062 { | |
1063 return false; | |
1064 } | |
866 | 1065 |
867 reg_class_t | 1066 reg_class_t |
868 default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED, | 1067 default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED, |
869 reg_class_t reload_class_i ATTRIBUTE_UNUSED, | 1068 reg_class_t reload_class_i ATTRIBUTE_UNUSED, |
870 enum machine_mode reload_mode ATTRIBUTE_UNUSED, | 1069 machine_mode reload_mode ATTRIBUTE_UNUSED, |
871 secondary_reload_info *sri) | 1070 secondary_reload_info *sri) |
872 { | 1071 { |
873 enum reg_class rclass = NO_REGS; | 1072 enum reg_class rclass = NO_REGS; |
874 enum reg_class reload_class = (enum reg_class) reload_class_i; | 1073 enum reg_class reload_class = (enum reg_class) reload_class_i; |
875 | 1074 |
891 enum insn_code icode | 1090 enum insn_code icode |
892 = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab, | 1091 = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab, |
893 reload_mode); | 1092 reload_mode); |
894 | 1093 |
895 if (icode != CODE_FOR_nothing | 1094 if (icode != CODE_FOR_nothing |
896 && insn_data[(int) icode].operand[in_p].predicate | 1095 && !insn_operand_matches (icode, in_p, x)) |
897 && ! insn_data[(int) icode].operand[in_p].predicate (x, reload_mode)) | |
898 icode = CODE_FOR_nothing; | 1096 icode = CODE_FOR_nothing; |
899 else if (icode != CODE_FOR_nothing) | 1097 else if (icode != CODE_FOR_nothing) |
900 { | 1098 { |
901 const char *insn_constraint, *scratch_constraint; | 1099 const char *insn_constraint, *scratch_constraint; |
902 char insn_letter, scratch_letter; | |
903 enum reg_class insn_class, scratch_class; | 1100 enum reg_class insn_class, scratch_class; |
904 | 1101 |
905 gcc_assert (insn_data[(int) icode].n_operands == 3); | 1102 gcc_assert (insn_data[(int) icode].n_operands == 3); |
906 insn_constraint = insn_data[(int) icode].operand[!in_p].constraint; | 1103 insn_constraint = insn_data[(int) icode].operand[!in_p].constraint; |
907 if (!*insn_constraint) | 1104 if (!*insn_constraint) |
911 if (in_p) | 1108 if (in_p) |
912 { | 1109 { |
913 gcc_assert (*insn_constraint == '='); | 1110 gcc_assert (*insn_constraint == '='); |
914 insn_constraint++; | 1111 insn_constraint++; |
915 } | 1112 } |
916 insn_letter = *insn_constraint; | 1113 insn_class = (reg_class_for_constraint |
917 insn_class | 1114 (lookup_constraint (insn_constraint))); |
918 = (insn_letter == 'r' ? GENERAL_REGS | |
919 : REG_CLASS_FROM_CONSTRAINT ((unsigned char) insn_letter, | |
920 insn_constraint)); | |
921 gcc_assert (insn_class != NO_REGS); | 1115 gcc_assert (insn_class != NO_REGS); |
922 } | 1116 } |
923 | 1117 |
924 scratch_constraint = insn_data[(int) icode].operand[2].constraint; | 1118 scratch_constraint = insn_data[(int) icode].operand[2].constraint; |
925 /* The scratch register's constraint must start with "=&", | 1119 /* The scratch register's constraint must start with "=&", |
929 gcc_assert (scratch_constraint[0] == '=' | 1123 gcc_assert (scratch_constraint[0] == '=' |
930 && (in_p || scratch_constraint[1] == '&')); | 1124 && (in_p || scratch_constraint[1] == '&')); |
931 scratch_constraint++; | 1125 scratch_constraint++; |
932 if (*scratch_constraint == '&') | 1126 if (*scratch_constraint == '&') |
933 scratch_constraint++; | 1127 scratch_constraint++; |
934 scratch_letter = *scratch_constraint; | 1128 scratch_class = (reg_class_for_constraint |
935 scratch_class | 1129 (lookup_constraint (scratch_constraint))); |
936 = (scratch_letter == 'r' ? GENERAL_REGS | |
937 : REG_CLASS_FROM_CONSTRAINT ((unsigned char) scratch_letter, | |
938 scratch_constraint)); | |
939 | 1130 |
940 if (reg_class_subset_p (reload_class, insn_class)) | 1131 if (reg_class_subset_p (reload_class, insn_class)) |
941 { | 1132 { |
942 gcc_assert (scratch_class == rclass); | 1133 gcc_assert (scratch_class == rclass); |
943 rclass = NO_REGS; | 1134 rclass = NO_REGS; |
952 sri->t_icode = icode; | 1143 sri->t_icode = icode; |
953 } | 1144 } |
954 return rclass; | 1145 return rclass; |
955 } | 1146 } |
956 | 1147 |
957 bool | 1148 /* The default implementation of TARGET_SECONDARY_MEMORY_NEEDED_MODE. */ |
958 default_handle_c_option (size_t code ATTRIBUTE_UNUSED, | 1149 |
959 const char *arg ATTRIBUTE_UNUSED, | 1150 machine_mode |
960 int value ATTRIBUTE_UNUSED) | 1151 default_secondary_memory_needed_mode (machine_mode mode) |
961 { | 1152 { |
962 return false; | 1153 if (!targetm.lra_p () |
1154 && GET_MODE_BITSIZE (mode) < BITS_PER_WORD | |
1155 && INTEGRAL_MODE_P (mode)) | |
1156 return mode_for_size (BITS_PER_WORD, GET_MODE_CLASS (mode), 0).require (); | |
1157 return mode; | |
963 } | 1158 } |
964 | 1159 |
965 /* By default, if flag_pic is true, then neither local nor global relocs | 1160 /* By default, if flag_pic is true, then neither local nor global relocs |
966 should be placed in readonly memory. */ | 1161 should be placed in readonly memory. */ |
967 | 1162 |
976 tree id) | 1171 tree id) |
977 { | 1172 { |
978 return id; | 1173 return id; |
979 } | 1174 } |
980 | 1175 |
981 bool | 1176 /* The default implementation of TARGET_STATIC_RTX_ALIGNMENT. */ |
982 default_builtin_vector_alignment_reachable (const_tree type, bool is_packed) | 1177 |
983 { | 1178 HOST_WIDE_INT |
984 if (is_packed) | 1179 default_static_rtx_alignment (machine_mode mode) |
985 return false; | 1180 { |
986 | 1181 return GET_MODE_ALIGNMENT (mode); |
987 /* Assuming that types whose size is > pointer-size are not guaranteed to be | 1182 } |
988 naturally aligned. */ | 1183 |
989 if (tree_int_cst_compare (TYPE_SIZE (type), bitsize_int (POINTER_SIZE)) > 0) | 1184 /* The default implementation of TARGET_CONSTANT_ALIGNMENT. */ |
990 return false; | 1185 |
991 | 1186 HOST_WIDE_INT |
992 /* Assuming that types whose size is <= pointer-size | 1187 default_constant_alignment (const_tree, HOST_WIDE_INT align) |
993 are naturally aligned. */ | 1188 { |
994 return true; | 1189 return align; |
1190 } | |
1191 | |
1192 /* An implementation of TARGET_CONSTANT_ALIGNMENT that aligns strings | |
1193 to at least BITS_PER_WORD but otherwise makes no changes. */ | |
1194 | |
1195 HOST_WIDE_INT | |
1196 constant_alignment_word_strings (const_tree exp, HOST_WIDE_INT align) | |
1197 { | |
1198 if (TREE_CODE (exp) == STRING_CST) | |
1199 return MAX (align, BITS_PER_WORD); | |
1200 return align; | |
1201 } | |
1202 | |
1203 /* Default to natural alignment for vector types. */ | |
1204 HOST_WIDE_INT | |
1205 default_vector_alignment (const_tree type) | |
1206 { | |
1207 HOST_WIDE_INT align = tree_to_shwi (TYPE_SIZE (type)); | |
1208 if (align > MAX_OFILE_ALIGNMENT) | |
1209 align = MAX_OFILE_ALIGNMENT; | |
1210 return align; | |
1211 } | |
1212 | |
1213 /* The default implementation of | |
1214 TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT. */ | |
1215 | |
1216 HOST_WIDE_INT | |
1217 default_preferred_vector_alignment (const_tree type) | |
1218 { | |
1219 return TYPE_ALIGN (type); | |
1220 } | |
1221 | |
1222 /* By default assume vectors of element TYPE require a multiple of the natural | |
1223 alignment of TYPE. TYPE is naturally aligned if IS_PACKED is false. */ | |
1224 bool | |
1225 default_builtin_vector_alignment_reachable (const_tree /*type*/, bool is_packed) | |
1226 { | |
1227 return ! is_packed; | |
995 } | 1228 } |
996 | 1229 |
997 /* By default, assume that a target supports any factor of misalignment | 1230 /* By default, assume that a target supports any factor of misalignment |
998 memory access if it supports movmisalign patten. | 1231 memory access if it supports movmisalign patten. |
999 is_packed is true if the memory access is defined in a packed struct. */ | 1232 is_packed is true if the memory access is defined in a packed struct. */ |
1000 bool | 1233 bool |
1001 default_builtin_support_vector_misalignment (enum machine_mode mode, | 1234 default_builtin_support_vector_misalignment (machine_mode mode, |
1002 const_tree type | 1235 const_tree type |
1003 ATTRIBUTE_UNUSED, | 1236 ATTRIBUTE_UNUSED, |
1004 int misalignment | 1237 int misalignment |
1005 ATTRIBUTE_UNUSED, | 1238 ATTRIBUTE_UNUSED, |
1006 bool is_packed | 1239 bool is_packed |
1012 } | 1245 } |
1013 | 1246 |
1014 /* By default, only attempt to parallelize bitwise operations, and | 1247 /* By default, only attempt to parallelize bitwise operations, and |
1015 possibly adds/subtracts using bit-twiddling. */ | 1248 possibly adds/subtracts using bit-twiddling. */ |
1016 | 1249 |
1017 enum machine_mode | 1250 machine_mode |
1018 default_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED) | 1251 default_preferred_simd_mode (scalar_mode) |
1019 { | 1252 { |
1020 return word_mode; | 1253 return word_mode; |
1021 } | 1254 } |
1022 | 1255 |
1023 /* By default only the size derived from the preferred vector mode | 1256 /* By default only the size derived from the preferred vector mode |
1027 default_autovectorize_vector_sizes (void) | 1260 default_autovectorize_vector_sizes (void) |
1028 { | 1261 { |
1029 return 0; | 1262 return 0; |
1030 } | 1263 } |
1031 | 1264 |
1265 /* By defaults a vector of integers is used as a mask. */ | |
1266 | |
1267 opt_machine_mode | |
1268 default_get_mask_mode (unsigned nunits, unsigned vector_size) | |
1269 { | |
1270 unsigned elem_size = vector_size / nunits; | |
1271 scalar_int_mode elem_mode | |
1272 = smallest_int_mode_for_size (elem_size * BITS_PER_UNIT); | |
1273 machine_mode vector_mode; | |
1274 | |
1275 gcc_assert (elem_size * nunits == vector_size); | |
1276 | |
1277 if (mode_for_vector (elem_mode, nunits).exists (&vector_mode) | |
1278 && VECTOR_MODE_P (vector_mode) | |
1279 && targetm.vector_mode_supported_p (vector_mode)) | |
1280 return vector_mode; | |
1281 | |
1282 return opt_machine_mode (); | |
1283 } | |
1284 | |
1285 /* By default, the cost model accumulates three separate costs (prologue, | |
1286 loop body, and epilogue) for a vectorized loop or block. So allocate an | |
1287 array of three unsigned ints, set it to zero, and return its address. */ | |
1288 | |
1289 void * | |
1290 default_init_cost (struct loop *loop_info ATTRIBUTE_UNUSED) | |
1291 { | |
1292 unsigned *cost = XNEWVEC (unsigned, 3); | |
1293 cost[vect_prologue] = cost[vect_body] = cost[vect_epilogue] = 0; | |
1294 return cost; | |
1295 } | |
1296 | |
1297 /* By default, the cost model looks up the cost of the given statement | |
1298 kind and mode, multiplies it by the occurrence count, accumulates | |
1299 it into the cost specified by WHERE, and returns the cost added. */ | |
1300 | |
1301 unsigned | |
1302 default_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind, | |
1303 struct _stmt_vec_info *stmt_info, int misalign, | |
1304 enum vect_cost_model_location where) | |
1305 { | |
1306 unsigned *cost = (unsigned *) data; | |
1307 unsigned retval = 0; | |
1308 | |
1309 tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; | |
1310 int stmt_cost = targetm.vectorize.builtin_vectorization_cost (kind, vectype, | |
1311 misalign); | |
1312 /* Statements in an inner loop relative to the loop being | |
1313 vectorized are weighted more heavily. The value here is | |
1314 arbitrary and could potentially be improved with analysis. */ | |
1315 if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info)) | |
1316 count *= 50; /* FIXME. */ | |
1317 | |
1318 retval = (unsigned) (count * stmt_cost); | |
1319 cost[where] += retval; | |
1320 | |
1321 return retval; | |
1322 } | |
1323 | |
1324 /* By default, the cost model just returns the accumulated costs. */ | |
1325 | |
1326 void | |
1327 default_finish_cost (void *data, unsigned *prologue_cost, | |
1328 unsigned *body_cost, unsigned *epilogue_cost) | |
1329 { | |
1330 unsigned *cost = (unsigned *) data; | |
1331 *prologue_cost = cost[vect_prologue]; | |
1332 *body_cost = cost[vect_body]; | |
1333 *epilogue_cost = cost[vect_epilogue]; | |
1334 } | |
1335 | |
1336 /* Free the cost data. */ | |
1337 | |
1338 void | |
1339 default_destroy_cost_data (void *data) | |
1340 { | |
1341 free (data); | |
1342 } | |
1343 | |
1032 /* Determine whether or not a pointer mode is valid. Assume defaults | 1344 /* Determine whether or not a pointer mode is valid. Assume defaults |
1033 of ptr_mode or Pmode - can be overridden. */ | 1345 of ptr_mode or Pmode - can be overridden. */ |
1034 bool | 1346 bool |
1035 default_valid_pointer_mode (enum machine_mode mode) | 1347 default_valid_pointer_mode (scalar_int_mode mode) |
1036 { | 1348 { |
1037 return (mode == ptr_mode || mode == Pmode); | 1349 return (mode == ptr_mode || mode == Pmode); |
1038 } | 1350 } |
1039 | 1351 |
1040 /* Determine whether the memory reference specified by REF may alias | 1352 /* Determine whether the memory reference specified by REF may alias |
1062 return !pi || pi->pt.anything || pi->pt.nonlocal; | 1374 return !pi || pi->pt.anything || pi->pt.nonlocal; |
1063 } | 1375 } |
1064 return false; | 1376 return false; |
1065 } | 1377 } |
1066 | 1378 |
1067 /* Return the mode for a pointer to a given ADDRSPACE, defaulting to ptr_mode | 1379 /* Return the mode for a pointer to a given ADDRSPACE, |
1068 for the generic address space only. */ | 1380 defaulting to ptr_mode for all address spaces. */ |
1069 | 1381 |
1070 enum machine_mode | 1382 scalar_int_mode |
1071 default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) | 1383 default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) |
1072 { | 1384 { |
1073 gcc_assert (ADDR_SPACE_GENERIC_P (addrspace)); | |
1074 return ptr_mode; | 1385 return ptr_mode; |
1075 } | 1386 } |
1076 | 1387 |
1077 /* Return the mode for an address in a given ADDRSPACE, defaulting to Pmode | 1388 /* Return the mode for an address in a given ADDRSPACE, |
1078 for the generic address space only. */ | 1389 defaulting to Pmode for all address spaces. */ |
1079 | 1390 |
1080 enum machine_mode | 1391 scalar_int_mode |
1081 default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) | 1392 default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED) |
1082 { | 1393 { |
1083 gcc_assert (ADDR_SPACE_GENERIC_P (addrspace)); | |
1084 return Pmode; | 1394 return Pmode; |
1085 } | 1395 } |
1086 | 1396 |
1087 /* Named address space version of valid_pointer_mode. */ | 1397 /* Named address space version of valid_pointer_mode. |
1088 | 1398 To match the above, the same modes apply to all address spaces. */ |
1089 bool | 1399 |
1090 default_addr_space_valid_pointer_mode (enum machine_mode mode, addr_space_t as) | 1400 bool |
1091 { | 1401 default_addr_space_valid_pointer_mode (scalar_int_mode mode, |
1092 if (!ADDR_SPACE_GENERIC_P (as)) | 1402 addr_space_t as ATTRIBUTE_UNUSED) |
1093 return (mode == targetm.addr_space.pointer_mode (as) | 1403 { |
1094 || mode == targetm.addr_space.address_mode (as)); | |
1095 | |
1096 return targetm.valid_pointer_mode (mode); | 1404 return targetm.valid_pointer_mode (mode); |
1097 } | 1405 } |
1098 | 1406 |
1099 /* Some places still assume that all pointer or address modes are the | 1407 /* Some places still assume that all pointer or address modes are the |
1100 standard Pmode and ptr_mode. These optimizations become invalid if | 1408 standard Pmode and ptr_mode. These optimizations become invalid if |
1110 return false; | 1418 return false; |
1111 | 1419 |
1112 return true; | 1420 return true; |
1113 } | 1421 } |
1114 | 1422 |
1115 /* Named address space version of legitimate_address_p. */ | 1423 /* Named address space version of legitimate_address_p. |
1116 | 1424 By default, all address spaces have the same form. */ |
1117 bool | 1425 |
1118 default_addr_space_legitimate_address_p (enum machine_mode mode, rtx mem, | 1426 bool |
1119 bool strict, addr_space_t as) | 1427 default_addr_space_legitimate_address_p (machine_mode mode, rtx mem, |
1120 { | 1428 bool strict, |
1121 if (!ADDR_SPACE_GENERIC_P (as)) | 1429 addr_space_t as ATTRIBUTE_UNUSED) |
1122 gcc_unreachable (); | 1430 { |
1123 | |
1124 return targetm.legitimate_address_p (mode, mem, strict); | 1431 return targetm.legitimate_address_p (mode, mem, strict); |
1125 } | 1432 } |
1126 | 1433 |
1127 /* Named address space version of LEGITIMIZE_ADDRESS. */ | 1434 /* Named address space version of LEGITIMIZE_ADDRESS. |
1435 By default, all address spaces have the same form. */ | |
1128 | 1436 |
1129 rtx | 1437 rtx |
1130 default_addr_space_legitimize_address (rtx x, rtx oldx, | 1438 default_addr_space_legitimize_address (rtx x, rtx oldx, machine_mode mode, |
1131 enum machine_mode mode, addr_space_t as) | 1439 addr_space_t as ATTRIBUTE_UNUSED) |
1132 { | 1440 { |
1133 if (!ADDR_SPACE_GENERIC_P (as)) | |
1134 return x; | |
1135 | |
1136 return targetm.legitimize_address (x, oldx, mode); | 1441 return targetm.legitimize_address (x, oldx, mode); |
1137 } | 1442 } |
1138 | 1443 |
1139 /* The default hook for determining if one named address space is a subset of | 1444 /* The default hook for determining if one named address space is a subset of |
1140 another and to return which address space to use as the common address | 1445 another and to return which address space to use as the common address |
1143 bool | 1448 bool |
1144 default_addr_space_subset_p (addr_space_t subset, addr_space_t superset) | 1449 default_addr_space_subset_p (addr_space_t subset, addr_space_t superset) |
1145 { | 1450 { |
1146 return (subset == superset); | 1451 return (subset == superset); |
1147 } | 1452 } |
1453 | |
1454 /* The default hook for determining if 0 within a named address | |
1455 space is a valid address. */ | |
1456 | |
1457 bool | |
1458 default_addr_space_zero_address_valid (addr_space_t as ATTRIBUTE_UNUSED) | |
1459 { | |
1460 return false; | |
1461 } | |
1462 | |
1463 /* The default hook for debugging the address space is to return the | |
1464 address space number to indicate DW_AT_address_class. */ | |
1465 int | |
1466 default_addr_space_debug (addr_space_t as) | |
1467 { | |
1468 return as; | |
1469 } | |
1470 | |
1471 /* The default hook implementation for TARGET_ADDR_SPACE_DIAGNOSE_USAGE. | |
1472 Don't complain about any address space. */ | |
1473 | |
1474 void | |
1475 default_addr_space_diagnose_usage (addr_space_t, location_t) | |
1476 { | |
1477 } | |
1478 | |
1148 | 1479 |
1149 /* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be | 1480 /* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be |
1150 called for targets with only a generic address space. */ | 1481 called for targets with only a generic address space. */ |
1151 | 1482 |
1152 rtx | 1483 rtx |
1155 tree to_type ATTRIBUTE_UNUSED) | 1486 tree to_type ATTRIBUTE_UNUSED) |
1156 { | 1487 { |
1157 gcc_unreachable (); | 1488 gcc_unreachable (); |
1158 } | 1489 } |
1159 | 1490 |
1491 /* The defualt implementation of TARGET_HARD_REGNO_NREGS. */ | |
1492 | |
1493 unsigned int | |
1494 default_hard_regno_nregs (unsigned int, machine_mode mode) | |
1495 { | |
1496 return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD); | |
1497 } | |
1498 | |
1160 bool | 1499 bool |
1161 default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED) | 1500 default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED) |
1162 { | 1501 { |
1163 return true; | 1502 return true; |
1164 } | 1503 } |
1165 | 1504 |
1166 /* The default implementation of TARGET_MODE_DEPENDENT_ADDRESS_P. */ | 1505 /* The default implementation of TARGET_MODE_DEPENDENT_ADDRESS_P. */ |
1167 | 1506 |
1168 bool | 1507 bool |
1169 default_mode_dependent_address_p (const_rtx addr ATTRIBUTE_UNUSED) | 1508 default_mode_dependent_address_p (const_rtx addr ATTRIBUTE_UNUSED, |
1170 { | 1509 addr_space_t addrspace ATTRIBUTE_UNUSED) |
1171 #ifdef GO_IF_MODE_DEPENDENT_ADDRESS | 1510 { |
1172 | |
1173 GO_IF_MODE_DEPENDENT_ADDRESS (CONST_CAST_RTX (addr), win); | |
1174 return false; | 1511 return false; |
1175 /* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS. */ | |
1176 win: ATTRIBUTE_UNUSED_LABEL | |
1177 return true; | |
1178 | |
1179 #else | |
1180 | |
1181 return false; | |
1182 | |
1183 #endif | |
1184 } | 1512 } |
1185 | 1513 |
1186 bool | 1514 bool |
1187 default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl), | 1515 default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl), |
1188 tree ARG_UNUSED (name), | 1516 tree ARG_UNUSED (name), |
1197 | 1525 |
1198 bool | 1526 bool |
1199 default_target_option_pragma_parse (tree ARG_UNUSED (args), | 1527 default_target_option_pragma_parse (tree ARG_UNUSED (args), |
1200 tree ARG_UNUSED (pop_target)) | 1528 tree ARG_UNUSED (pop_target)) |
1201 { | 1529 { |
1202 warning (OPT_Wpragmas, | 1530 /* If args is NULL the caller is handle_pragma_pop_options (). In that case, |
1203 "#pragma GCC target is not supported for this machine"); | 1531 emit no warning because "#pragma GCC pop_target" is valid on targets that |
1532 do not have the "target" pragma. */ | |
1533 if (args) | |
1534 warning (OPT_Wpragmas, | |
1535 "#pragma GCC target is not supported for this machine"); | |
1204 | 1536 |
1205 return false; | 1537 return false; |
1206 } | 1538 } |
1207 | 1539 |
1208 bool | 1540 bool |
1209 default_target_can_inline_p (tree caller, tree callee) | 1541 default_target_can_inline_p (tree caller, tree callee) |
1210 { | 1542 { |
1211 bool ret = false; | |
1212 tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee); | 1543 tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee); |
1213 tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller); | 1544 tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller); |
1214 | 1545 if (! callee_opts) |
1215 /* If callee has no option attributes, then it is ok to inline */ | 1546 callee_opts = target_option_default_node; |
1216 if (!callee_opts) | 1547 if (! caller_opts) |
1217 ret = true; | 1548 caller_opts = target_option_default_node; |
1218 | 1549 |
1219 /* If caller has no option attributes, but callee does then it is not ok to | 1550 /* If both caller and callee have attributes, assume that if the |
1220 inline */ | 1551 pointer is different, the two functions have different target |
1221 else if (!caller_opts) | 1552 options since build_target_option_node uses a hash table for the |
1222 ret = false; | 1553 options. */ |
1223 | 1554 return callee_opts == caller_opts; |
1224 /* If both caller and callee have attributes, assume that if the pointer is | 1555 } |
1225 different, the the two functions have different target options since | |
1226 build_target_option_node uses a hash table for the options. */ | |
1227 else | |
1228 ret = (callee_opts == caller_opts); | |
1229 | |
1230 return ret; | |
1231 } | |
1232 | |
1233 #ifndef HAVE_casesi | |
1234 # define HAVE_casesi 0 | |
1235 #endif | |
1236 | 1556 |
1237 /* If the machine does not have a case insn that compares the bounds, | 1557 /* If the machine does not have a case insn that compares the bounds, |
1238 this means extra overhead for dispatch tables, which raises the | 1558 this means extra overhead for dispatch tables, which raises the |
1239 threshold for using them. */ | 1559 threshold for using them. */ |
1240 | 1560 |
1241 unsigned int default_case_values_threshold (void) | 1561 unsigned int |
1242 { | 1562 default_case_values_threshold (void) |
1243 return (HAVE_casesi ? 4 : 5); | 1563 { |
1564 return (targetm.have_casesi () ? 4 : 5); | |
1244 } | 1565 } |
1245 | 1566 |
1246 bool | 1567 bool |
1247 default_have_conditional_execution (void) | 1568 default_have_conditional_execution (void) |
1248 { | 1569 { |
1249 #ifdef HAVE_conditional_execution | |
1250 return HAVE_conditional_execution; | 1570 return HAVE_conditional_execution; |
1251 #else | 1571 } |
1572 | |
1573 /* By default we assume that c99 functions are present at the runtime, | |
1574 but sincos is not. */ | |
1575 bool | |
1576 default_libc_has_function (enum function_class fn_class) | |
1577 { | |
1578 if (fn_class == function_c94 | |
1579 || fn_class == function_c99_misc | |
1580 || fn_class == function_c99_math_complex) | |
1581 return true; | |
1582 | |
1252 return false; | 1583 return false; |
1253 #endif | 1584 } |
1585 | |
1586 bool | |
1587 gnu_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED) | |
1588 { | |
1589 return true; | |
1590 } | |
1591 | |
1592 bool | |
1593 no_c99_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED) | |
1594 { | |
1595 return false; | |
1596 } | |
1597 | |
1598 tree | |
1599 default_builtin_tm_load_store (tree ARG_UNUSED (type)) | |
1600 { | |
1601 return NULL_TREE; | |
1254 } | 1602 } |
1255 | 1603 |
1256 /* Compute cost of moving registers to/from memory. */ | 1604 /* Compute cost of moving registers to/from memory. */ |
1257 | 1605 |
1258 int | 1606 int |
1259 default_memory_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, | 1607 default_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED, |
1260 reg_class_t rclass ATTRIBUTE_UNUSED, | 1608 reg_class_t rclass ATTRIBUTE_UNUSED, |
1261 bool in ATTRIBUTE_UNUSED) | 1609 bool in ATTRIBUTE_UNUSED) |
1262 { | 1610 { |
1263 #ifndef MEMORY_MOVE_COST | 1611 #ifndef MEMORY_MOVE_COST |
1264 return (4 + memory_move_secondary_cost (mode, (enum reg_class) rclass, in)); | 1612 return (4 + memory_move_secondary_cost (mode, (enum reg_class) rclass, in)); |
1269 | 1617 |
1270 /* Compute cost of moving data from a register of class FROM to one of | 1618 /* Compute cost of moving data from a register of class FROM to one of |
1271 TO, using MODE. */ | 1619 TO, using MODE. */ |
1272 | 1620 |
1273 int | 1621 int |
1274 default_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, | 1622 default_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED, |
1275 reg_class_t from ATTRIBUTE_UNUSED, | 1623 reg_class_t from ATTRIBUTE_UNUSED, |
1276 reg_class_t to ATTRIBUTE_UNUSED) | 1624 reg_class_t to ATTRIBUTE_UNUSED) |
1277 { | 1625 { |
1278 #ifndef REGISTER_MOVE_COST | 1626 #ifndef REGISTER_MOVE_COST |
1279 return 2; | 1627 return 2; |
1280 #else | 1628 #else |
1281 return REGISTER_MOVE_COST (mode, (enum reg_class) from, (enum reg_class) to); | 1629 return REGISTER_MOVE_COST (mode, (enum reg_class) from, (enum reg_class) to); |
1282 #endif | 1630 #endif |
1283 } | 1631 } |
1284 | 1632 |
1633 /* The default implementation of TARGET_SLOW_UNALIGNED_ACCESS. */ | |
1634 | |
1635 bool | |
1636 default_slow_unaligned_access (machine_mode, unsigned int) | |
1637 { | |
1638 return STRICT_ALIGNMENT; | |
1639 } | |
1640 | |
1641 /* For hooks which use the MOVE_RATIO macro, this gives the legacy default | |
1642 behavior. SPEED_P is true if we are compiling for speed. */ | |
1643 | |
1644 unsigned int | |
1645 get_move_ratio (bool speed_p ATTRIBUTE_UNUSED) | |
1646 { | |
1647 unsigned int move_ratio; | |
1648 #ifdef MOVE_RATIO | |
1649 move_ratio = (unsigned int) MOVE_RATIO (speed_p); | |
1650 #else | |
1651 #if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti) | |
1652 move_ratio = 2; | |
1653 #else /* No movmem patterns, pick a default. */ | |
1654 move_ratio = ((speed_p) ? 15 : 3); | |
1655 #endif | |
1656 #endif | |
1657 return move_ratio; | |
1658 } | |
1659 | |
1660 /* Return TRUE if the move_by_pieces/set_by_pieces infrastructure should be | |
1661 used; return FALSE if the movmem/setmem optab should be expanded, or | |
1662 a call to memcpy emitted. */ | |
1663 | |
1664 bool | |
1665 default_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size, | |
1666 unsigned int alignment, | |
1667 enum by_pieces_operation op, | |
1668 bool speed_p) | |
1669 { | |
1670 unsigned int max_size = 0; | |
1671 unsigned int ratio = 0; | |
1672 | |
1673 switch (op) | |
1674 { | |
1675 case CLEAR_BY_PIECES: | |
1676 max_size = STORE_MAX_PIECES; | |
1677 ratio = CLEAR_RATIO (speed_p); | |
1678 break; | |
1679 case MOVE_BY_PIECES: | |
1680 max_size = MOVE_MAX_PIECES; | |
1681 ratio = get_move_ratio (speed_p); | |
1682 break; | |
1683 case SET_BY_PIECES: | |
1684 max_size = STORE_MAX_PIECES; | |
1685 ratio = SET_RATIO (speed_p); | |
1686 break; | |
1687 case STORE_BY_PIECES: | |
1688 max_size = STORE_MAX_PIECES; | |
1689 ratio = get_move_ratio (speed_p); | |
1690 break; | |
1691 case COMPARE_BY_PIECES: | |
1692 max_size = COMPARE_MAX_PIECES; | |
1693 /* Pick a likely default, just as in get_move_ratio. */ | |
1694 ratio = speed_p ? 15 : 3; | |
1695 break; | |
1696 } | |
1697 | |
1698 return by_pieces_ninsns (size, alignment, max_size + 1, op) < ratio; | |
1699 } | |
1700 | |
1701 /* This hook controls code generation for expanding a memcmp operation by | |
1702 pieces. Return 1 for the normal pattern of compare/jump after each pair | |
1703 of loads, or a higher number to reduce the number of branches. */ | |
1704 | |
1705 int | |
1706 default_compare_by_pieces_branch_ratio (machine_mode) | |
1707 { | |
1708 return 1; | |
1709 } | |
1710 | |
1711 /* Write PATCH_AREA_SIZE NOPs into the asm outfile FILE around a function | |
1712 entry. If RECORD_P is true and the target supports named sections, | |
1713 the location of the NOPs will be recorded in a special object section | |
1714 called "__patchable_function_entries". This routine may be called | |
1715 twice per function to put NOPs before and after the function | |
1716 entry. */ | |
1717 | |
1718 void | |
1719 default_print_patchable_function_entry (FILE *file, | |
1720 unsigned HOST_WIDE_INT patch_area_size, | |
1721 bool record_p) | |
1722 { | |
1723 const char *nop_templ = 0; | |
1724 int code_num; | |
1725 rtx_insn *my_nop = make_insn_raw (gen_nop ()); | |
1726 | |
1727 /* We use the template alone, relying on the (currently sane) assumption | |
1728 that the NOP template does not have variable operands. */ | |
1729 code_num = recog_memoized (my_nop); | |
1730 nop_templ = get_insn_template (code_num, my_nop); | |
1731 | |
1732 if (record_p && targetm_common.have_named_sections) | |
1733 { | |
1734 char buf[256]; | |
1735 static int patch_area_number; | |
1736 section *previous_section = in_section; | |
1737 | |
1738 patch_area_number++; | |
1739 ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE", patch_area_number); | |
1740 | |
1741 switch_to_section (get_section ("__patchable_function_entries", | |
1742 0, NULL)); | |
1743 fputs (integer_asm_op (POINTER_SIZE_UNITS, false), file); | |
1744 assemble_name_raw (file, buf); | |
1745 fputc ('\n', file); | |
1746 | |
1747 switch_to_section (previous_section); | |
1748 ASM_OUTPUT_LABEL (file, buf); | |
1749 } | |
1750 | |
1751 unsigned i; | |
1752 for (i = 0; i < patch_area_size; ++i) | |
1753 fprintf (file, "\t%s\n", nop_templ); | |
1754 } | |
1755 | |
1285 bool | 1756 bool |
1286 default_profile_before_prologue (void) | 1757 default_profile_before_prologue (void) |
1287 { | 1758 { |
1288 #ifdef PROFILE_BEFORE_PROLOGUE | 1759 #ifdef PROFILE_BEFORE_PROLOGUE |
1289 return true; | 1760 return true; |
1309 | 1780 |
1310 reg_class_t | 1781 reg_class_t |
1311 default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED, | 1782 default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED, |
1312 reg_class_t rclass) | 1783 reg_class_t rclass) |
1313 { | 1784 { |
1314 #ifdef PREFERRED_OUTPUT_RELOAD_CLASS | |
1315 return PREFERRED_OUTPUT_RELOAD_CLASS (x, (enum reg_class) rclass); | |
1316 #else | |
1317 return rclass; | 1785 return rclass; |
1318 #endif | |
1319 } | 1786 } |
1320 | 1787 |
1321 /* The default implementation of TARGET_PREFERRED_RENAME_CLASS. */ | 1788 /* The default implementation of TARGET_PREFERRED_RENAME_CLASS. */ |
1322 reg_class_t | 1789 reg_class_t |
1323 default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED) | 1790 default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED) |
1329 | 1796 |
1330 bool | 1797 bool |
1331 default_class_likely_spilled_p (reg_class_t rclass) | 1798 default_class_likely_spilled_p (reg_class_t rclass) |
1332 { | 1799 { |
1333 return (reg_class_size[(int) rclass] == 1); | 1800 return (reg_class_size[(int) rclass] == 1); |
1801 } | |
1802 | |
1803 /* The default implementation of TARGET_CLASS_MAX_NREGS. */ | |
1804 | |
1805 unsigned char | |
1806 default_class_max_nregs (reg_class_t rclass ATTRIBUTE_UNUSED, | |
1807 machine_mode mode ATTRIBUTE_UNUSED) | |
1808 { | |
1809 #ifdef CLASS_MAX_NREGS | |
1810 return (unsigned char) CLASS_MAX_NREGS ((enum reg_class) rclass, mode); | |
1811 #else | |
1812 return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD); | |
1813 #endif | |
1334 } | 1814 } |
1335 | 1815 |
1336 /* Determine the debugging unwind mechanism for the target. */ | 1816 /* Determine the debugging unwind mechanism for the target. */ |
1337 | 1817 |
1338 enum unwind_info_type | 1818 enum unwind_info_type |
1352 #endif | 1832 #endif |
1353 | 1833 |
1354 return UI_NONE; | 1834 return UI_NONE; |
1355 } | 1835 } |
1356 | 1836 |
1357 /* Determine the exception handling mechanism for the target. */ | 1837 /* Determine the correct mode for a Dwarf frame register that represents |
1358 | 1838 register REGNO. */ |
1359 enum unwind_info_type | 1839 |
1360 default_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) | 1840 machine_mode |
1361 { | 1841 default_dwarf_frame_reg_mode (int regno) |
1362 /* Obey the configure switch to turn on sjlj exceptions. */ | 1842 { |
1363 #ifdef CONFIG_SJLJ_EXCEPTIONS | 1843 machine_mode save_mode = reg_raw_mode[regno]; |
1364 if (CONFIG_SJLJ_EXCEPTIONS) | 1844 |
1365 return UI_SJLJ; | 1845 if (targetm.hard_regno_call_part_clobbered (regno, save_mode)) |
1366 #endif | 1846 save_mode = choose_hard_reg_mode (regno, 1, true); |
1367 | 1847 return save_mode; |
1368 /* ??? Change all users to the hook, then poison this. */ | |
1369 #ifdef DWARF2_UNWIND_INFO | |
1370 if (DWARF2_UNWIND_INFO) | |
1371 return UI_DWARF2; | |
1372 #endif | |
1373 | |
1374 return UI_SJLJ; | |
1375 } | |
1376 | |
1377 /* To be used by targets that force dwarf2 unwind enabled. */ | |
1378 | |
1379 enum unwind_info_type | |
1380 dwarf2_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) | |
1381 { | |
1382 /* Obey the configure switch to turn on sjlj exceptions. */ | |
1383 #ifdef CONFIG_SJLJ_EXCEPTIONS | |
1384 if (CONFIG_SJLJ_EXCEPTIONS) | |
1385 return UI_SJLJ; | |
1386 #endif | |
1387 | |
1388 return UI_DWARF2; | |
1389 } | |
1390 | |
1391 /* To be used by targets that force sjlj unwind enabled. */ | |
1392 | |
1393 enum unwind_info_type | |
1394 sjlj_except_unwind_info (struct gcc_options *opts ATTRIBUTE_UNUSED) | |
1395 { | |
1396 return UI_SJLJ; | |
1397 } | 1848 } |
1398 | 1849 |
1399 /* To be used by targets where reg_raw_mode doesn't return the right | 1850 /* To be used by targets where reg_raw_mode doesn't return the right |
1400 mode for registers used in apply_builtin_return and apply_builtin_arg. */ | 1851 mode for registers used in apply_builtin_return and apply_builtin_arg. */ |
1401 | 1852 |
1402 enum machine_mode | 1853 machine_mode |
1403 default_get_reg_raw_mode(int regno) | 1854 default_get_reg_raw_mode (int regno) |
1404 { | 1855 { |
1405 return reg_raw_mode[regno]; | 1856 return reg_raw_mode[regno]; |
1857 } | |
1858 | |
1859 /* Return true if a leaf function should stay leaf even with profiling | |
1860 enabled. */ | |
1861 | |
1862 bool | |
1863 default_keep_leaf_when_profiled () | |
1864 { | |
1865 return false; | |
1406 } | 1866 } |
1407 | 1867 |
1408 /* Return true if the state of option OPTION should be stored in PCH files | 1868 /* Return true if the state of option OPTION should be stored in PCH files |
1409 and checked by default_pch_valid_p. Store the option's current state | 1869 and checked by default_pch_valid_p. Store the option's current state |
1410 in STATE if so. */ | 1870 in STATE if so. */ |
1411 | 1871 |
1412 static inline bool | 1872 static inline bool |
1413 option_affects_pch_p (int option, struct cl_option_state *state) | 1873 option_affects_pch_p (int option, struct cl_option_state *state) |
1414 { | 1874 { |
1415 if ((cl_options[option].flags & CL_TARGET) == 0) | 1875 if ((cl_options[option].flags & CL_TARGET) == 0) |
1876 return false; | |
1877 if ((cl_options[option].flags & CL_PCH_IGNORE) != 0) | |
1416 return false; | 1878 return false; |
1417 if (option_flag_var (option, &global_options) == &target_flags) | 1879 if (option_flag_var (option, &global_options) == &target_flags) |
1418 if (targetm.check_pch_target_flags) | 1880 if (targetm.check_pch_target_flags) |
1419 return false; | 1881 return false; |
1420 return get_option_state (&global_options, option, state); | 1882 return get_option_state (&global_options, option, state); |
1462 setting of OPTION. */ | 1924 setting of OPTION. */ |
1463 | 1925 |
1464 static const char * | 1926 static const char * |
1465 pch_option_mismatch (const char *option) | 1927 pch_option_mismatch (const char *option) |
1466 { | 1928 { |
1467 char *r; | 1929 return xasprintf (_("created and used with differing settings of '%s'"), |
1468 | 1930 option); |
1469 asprintf (&r, _("created and used with differing settings of '%s'"), option); | |
1470 if (r == NULL) | |
1471 return _("out of memory"); | |
1472 return r; | |
1473 } | 1931 } |
1474 | 1932 |
1475 /* Default version of pch_valid_p. */ | 1933 /* Default version of pch_valid_p. */ |
1476 | 1934 |
1477 const char * | 1935 const char * |
1512 } | 1970 } |
1513 | 1971 |
1514 return NULL; | 1972 return NULL; |
1515 } | 1973 } |
1516 | 1974 |
1517 const struct default_options empty_optimization_table[] = | 1975 /* Default version of cstore_mode. */ |
1518 { | 1976 |
1519 { OPT_LEVELS_NONE, 0, NULL, 0 } | 1977 scalar_int_mode |
1520 }; | 1978 default_cstore_mode (enum insn_code icode) |
1979 { | |
1980 return as_a <scalar_int_mode> (insn_data[(int) icode].operand[0].mode); | |
1981 } | |
1982 | |
1983 /* Default version of member_type_forces_blk. */ | |
1984 | |
1985 bool | |
1986 default_member_type_forces_blk (const_tree, machine_mode) | |
1987 { | |
1988 return false; | |
1989 } | |
1990 | |
1991 rtx | |
1992 default_load_bounds_for_arg (rtx addr ATTRIBUTE_UNUSED, | |
1993 rtx ptr ATTRIBUTE_UNUSED, | |
1994 rtx bnd ATTRIBUTE_UNUSED) | |
1995 { | |
1996 gcc_unreachable (); | |
1997 } | |
1998 | |
1999 void | |
2000 default_store_bounds_for_arg (rtx val ATTRIBUTE_UNUSED, | |
2001 rtx addr ATTRIBUTE_UNUSED, | |
2002 rtx bounds ATTRIBUTE_UNUSED, | |
2003 rtx to ATTRIBUTE_UNUSED) | |
2004 { | |
2005 gcc_unreachable (); | |
2006 } | |
2007 | |
2008 rtx | |
2009 default_load_returned_bounds (rtx slot ATTRIBUTE_UNUSED) | |
2010 { | |
2011 gcc_unreachable (); | |
2012 } | |
2013 | |
2014 void | |
2015 default_store_returned_bounds (rtx slot ATTRIBUTE_UNUSED, | |
2016 rtx bounds ATTRIBUTE_UNUSED) | |
2017 { | |
2018 gcc_unreachable (); | |
2019 } | |
2020 | |
2021 /* Default version of canonicalize_comparison. */ | |
2022 | |
2023 void | |
2024 default_canonicalize_comparison (int *, rtx *, rtx *, bool) | |
2025 { | |
2026 } | |
2027 | |
2028 /* Default implementation of TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */ | |
2029 | |
2030 void | |
2031 default_atomic_assign_expand_fenv (tree *, tree *, tree *) | |
2032 { | |
2033 } | |
2034 | |
2035 #ifndef PAD_VARARGS_DOWN | |
2036 #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN | |
2037 #endif | |
2038 | |
2039 /* Build an indirect-ref expression over the given TREE, which represents a | |
2040 piece of a va_arg() expansion. */ | |
2041 tree | |
2042 build_va_arg_indirect_ref (tree addr) | |
2043 { | |
2044 addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr); | |
2045 return addr; | |
2046 } | |
2047 | |
2048 /* The "standard" implementation of va_arg: read the value from the | |
2049 current (padded) address and increment by the (padded) size. */ | |
2050 | |
2051 tree | |
2052 std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, | |
2053 gimple_seq *post_p) | |
2054 { | |
2055 tree addr, t, type_size, rounded_size, valist_tmp; | |
2056 unsigned HOST_WIDE_INT align, boundary; | |
2057 bool indirect; | |
2058 | |
2059 /* All of the alignment and movement below is for args-grow-up machines. | |
2060 As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all | |
2061 implement their own specialized gimplify_va_arg_expr routines. */ | |
2062 if (ARGS_GROW_DOWNWARD) | |
2063 gcc_unreachable (); | |
2064 | |
2065 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false); | |
2066 if (indirect) | |
2067 type = build_pointer_type (type); | |
2068 | |
2069 align = PARM_BOUNDARY / BITS_PER_UNIT; | |
2070 boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type); | |
2071 | |
2072 /* When we align parameter on stack for caller, if the parameter | |
2073 alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be | |
2074 aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee | |
2075 here with caller. */ | |
2076 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT) | |
2077 boundary = MAX_SUPPORTED_STACK_ALIGNMENT; | |
2078 | |
2079 boundary /= BITS_PER_UNIT; | |
2080 | |
2081 /* Hoist the valist value into a temporary for the moment. */ | |
2082 valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL); | |
2083 | |
2084 /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually | |
2085 requires greater alignment, we must perform dynamic alignment. */ | |
2086 if (boundary > align | |
2087 && !integer_zerop (TYPE_SIZE (type))) | |
2088 { | |
2089 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, | |
2090 fold_build_pointer_plus_hwi (valist_tmp, boundary - 1)); | |
2091 gimplify_and_add (t, pre_p); | |
2092 | |
2093 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, | |
2094 fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist), | |
2095 valist_tmp, | |
2096 build_int_cst (TREE_TYPE (valist), -boundary))); | |
2097 gimplify_and_add (t, pre_p); | |
2098 } | |
2099 else | |
2100 boundary = align; | |
2101 | |
2102 /* If the actual alignment is less than the alignment of the type, | |
2103 adjust the type accordingly so that we don't assume strict alignment | |
2104 when dereferencing the pointer. */ | |
2105 boundary *= BITS_PER_UNIT; | |
2106 if (boundary < TYPE_ALIGN (type)) | |
2107 { | |
2108 type = build_variant_type_copy (type); | |
2109 SET_TYPE_ALIGN (type, boundary); | |
2110 } | |
2111 | |
2112 /* Compute the rounded size of the type. */ | |
2113 type_size = size_in_bytes (type); | |
2114 rounded_size = round_up (type_size, align); | |
2115 | |
2116 /* Reduce rounded_size so it's sharable with the postqueue. */ | |
2117 gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue); | |
2118 | |
2119 /* Get AP. */ | |
2120 addr = valist_tmp; | |
2121 if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size)) | |
2122 { | |
2123 /* Small args are padded downward. */ | |
2124 t = fold_build2_loc (input_location, GT_EXPR, sizetype, | |
2125 rounded_size, size_int (align)); | |
2126 t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node, | |
2127 size_binop (MINUS_EXPR, rounded_size, type_size)); | |
2128 addr = fold_build_pointer_plus (addr, t); | |
2129 } | |
2130 | |
2131 /* Compute new value for AP. */ | |
2132 t = fold_build_pointer_plus (valist_tmp, rounded_size); | |
2133 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); | |
2134 gimplify_and_add (t, pre_p); | |
2135 | |
2136 addr = fold_convert (build_pointer_type (type), addr); | |
2137 | |
2138 if (indirect) | |
2139 addr = build_va_arg_indirect_ref (addr); | |
2140 | |
2141 return build_va_arg_indirect_ref (addr); | |
2142 } | |
2143 | |
2144 tree | |
2145 default_chkp_bound_type (void) | |
2146 { | |
2147 tree res = make_node (POINTER_BOUNDS_TYPE); | |
2148 TYPE_PRECISION (res) = TYPE_PRECISION (size_type_node) * 2; | |
2149 TYPE_NAME (res) = get_identifier ("__bounds_type"); | |
2150 SET_TYPE_MODE (res, targetm.chkp_bound_mode ()); | |
2151 layout_type (res); | |
2152 return res; | |
2153 } | |
2154 | |
2155 machine_mode | |
2156 default_chkp_bound_mode (void) | |
2157 { | |
2158 return VOIDmode; | |
2159 } | |
2160 | |
2161 tree | |
2162 default_builtin_chkp_function (unsigned int fcode ATTRIBUTE_UNUSED) | |
2163 { | |
2164 return NULL_TREE; | |
2165 } | |
2166 | |
2167 rtx | |
2168 default_chkp_function_value_bounds (const_tree ret_type ATTRIBUTE_UNUSED, | |
2169 const_tree fn_decl_or_type ATTRIBUTE_UNUSED, | |
2170 bool outgoing ATTRIBUTE_UNUSED) | |
2171 { | |
2172 gcc_unreachable (); | |
2173 } | |
2174 | |
2175 tree | |
2176 default_chkp_make_bounds_constant (HOST_WIDE_INT lb ATTRIBUTE_UNUSED, | |
2177 HOST_WIDE_INT ub ATTRIBUTE_UNUSED) | |
2178 { | |
2179 return NULL_TREE; | |
2180 } | |
2181 | |
2182 int | |
2183 default_chkp_initialize_bounds (tree var ATTRIBUTE_UNUSED, | |
2184 tree lb ATTRIBUTE_UNUSED, | |
2185 tree ub ATTRIBUTE_UNUSED, | |
2186 tree *stmts ATTRIBUTE_UNUSED) | |
2187 { | |
2188 return 0; | |
2189 } | |
2190 | |
2191 void | |
2192 default_setup_incoming_vararg_bounds (cumulative_args_t ca ATTRIBUTE_UNUSED, | |
2193 machine_mode mode ATTRIBUTE_UNUSED, | |
2194 tree type ATTRIBUTE_UNUSED, | |
2195 int *pretend_arg_size ATTRIBUTE_UNUSED, | |
2196 int second_time ATTRIBUTE_UNUSED) | |
2197 { | |
2198 } | |
2199 | |
2200 /* An implementation of TARGET_CAN_USE_DOLOOP_P for targets that do | |
2201 not support nested low-overhead loops. */ | |
2202 | |
2203 bool | |
2204 can_use_doloop_if_innermost (const widest_int &, const widest_int &, | |
2205 unsigned int loop_depth, bool) | |
2206 { | |
2207 return loop_depth == 1; | |
2208 } | |
2209 | |
2210 /* Default implementation of TARGET_OPTAB_SUPPORTED_P. */ | |
2211 | |
2212 bool | |
2213 default_optab_supported_p (int, machine_mode, machine_mode, optimization_type) | |
2214 { | |
2215 return true; | |
2216 } | |
2217 | |
2218 /* Default implementation of TARGET_MAX_NOCE_IFCVT_SEQ_COST. */ | |
2219 | |
2220 unsigned int | |
2221 default_max_noce_ifcvt_seq_cost (edge e) | |
2222 { | |
2223 bool predictable_p = predictable_edge_p (e); | |
2224 | |
2225 enum compiler_param param | |
2226 = (predictable_p | |
2227 ? PARAM_MAX_RTL_IF_CONVERSION_PREDICTABLE_COST | |
2228 : PARAM_MAX_RTL_IF_CONVERSION_UNPREDICTABLE_COST); | |
2229 | |
2230 /* If we have a parameter set, use that, otherwise take a guess using | |
2231 BRANCH_COST. */ | |
2232 if (global_options_set.x_param_values[param]) | |
2233 return PARAM_VALUE (param); | |
2234 else | |
2235 return BRANCH_COST (true, predictable_p) * COSTS_N_INSNS (3); | |
2236 } | |
2237 | |
2238 /* Default implementation of TARGET_MIN_ARITHMETIC_PRECISION. */ | |
2239 | |
2240 unsigned int | |
2241 default_min_arithmetic_precision (void) | |
2242 { | |
2243 return WORD_REGISTER_OPERATIONS ? BITS_PER_WORD : BITS_PER_UNIT; | |
2244 } | |
2245 | |
2246 /* Default implementation of TARGET_C_EXCESS_PRECISION. */ | |
2247 | |
2248 enum flt_eval_method | |
2249 default_excess_precision (enum excess_precision_type ATTRIBUTE_UNUSED) | |
2250 { | |
2251 return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT; | |
2252 } | |
2253 | |
2254 bool | |
2255 default_stack_clash_protection_final_dynamic_probe (rtx residual ATTRIBUTE_UNUSED) | |
2256 { | |
2257 return 0; | |
2258 } | |
1521 | 2259 |
1522 #include "gt-targhooks.h" | 2260 #include "gt-targhooks.h" |