]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/targhooks.c
Remove enum before machine_mode
[thirdparty/gcc.git] / gcc / targhooks.c
CommitLineData
61f71b34 1/* Default target hook functions.
cbe34bb5 2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
61f71b34
DD
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
61f71b34
DD
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
61f71b34 19
dd37c5a0
DD
20/* The migration of target macros to target hooks works as follows:
21
22 1. Create a target hook that uses the existing target macros to
23 implement the same functionality.
24
25 2. Convert all the MI files to use the hook instead of the macro.
26
27 3. Repeat for a majority of the remaining target macros. This will
28 take some time.
29
30 4. Tell target maintainers to start migrating.
31
32 5. Eventually convert the backends to override the hook instead of
33 defining the macros. This will take some time too.
34
35 6. TBD when, poison the macros. Unmigrated targets will break at
36 this point.
37
38 Note that we expect steps 1-3 to be done by the people that
39 understand what the MI does with each macro, and step 5 to be done
40 by the target maintainers for their respective targets.
41
42 Note that steps 1 and 2 don't have to be done together, but no
43 target can override the new hook until step 2 is complete for it.
44
45 Once the macros are poisoned, we will revert to the old migration
46 rules - migrate the macro, callers, and targets all at once. This
47 comment can thus be removed at that point. */
48
61f71b34
DD
49#include "config.h"
50#include "system.h"
51#include "coretypes.h"
957060b5
AM
52#include "target.h"
53#include "function.h"
61f71b34
DD
54#include "rtl.h"
55#include "tree.h"
957060b5
AM
56#include "tree-ssa-alias.h"
57#include "gimple-expr.h"
4d0cdd0c 58#include "memmodel.h"
957060b5
AM
59#include "tm_p.h"
60#include "stringpool.h"
f90aa46c 61#include "tree-vrp.h"
957060b5 62#include "tree-ssanames.h"
357067f2 63#include "profile-count.h"
957060b5
AM
64#include "optabs.h"
65#include "regs.h"
957060b5
AM
66#include "recog.h"
67#include "diagnostic-core.h"
40e23961 68#include "fold-const.h"
d8a2d370
DN
69#include "stor-layout.h"
70#include "varasm.h"
36566b39 71#include "flags.h"
36566b39
PK
72#include "explow.h"
73#include "calls.h"
61f71b34 74#include "expr.h"
d84a4ef1 75#include "output.h"
8a99f6f9 76#include "reload.h"
a803773f
JM
77#include "intl.h"
78#include "opts.h"
45b0be94 79#include "gimplify.h"
e914c11a
JG
80#include "predict.h"
81#include "params.h"
c65699ef 82#include "real.h"
61f71b34 83
6dd53648 84
c6c3dba9 85bool
ef4bddc2 86default_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
c6c3dba9
PB
87 rtx addr ATTRIBUTE_UNUSED,
88 bool strict ATTRIBUTE_UNUSED)
89{
90#ifdef GO_IF_LEGITIMATE_ADDRESS
91 /* Defer to the old implementation using a goto. */
92 if (strict)
93 return strict_memory_address_p (mode, addr);
94 else
95 return memory_address_p (mode, addr);
96#else
97 gcc_unreachable ();
98#endif
99}
100
6773a41c
RO
101void
102default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
103{
104#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
c3284718 105 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
6773a41c
RO
106#endif
107}
108
215b063c
PB
109int
110default_unspec_may_trap_p (const_rtx x, unsigned flags)
111{
112 int i;
113
c84a808e
EB
114 /* Any floating arithmetic may trap. */
115 if ((SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math))
215b063c
PB
116 return 1;
117
118 for (i = 0; i < XVECLEN (x, 0); ++i)
119 {
120 if (may_trap_p_1 (XVECEXP (x, 0, i), flags))
121 return 1;
122 }
123
124 return 0;
125}
126
ef4bddc2 127machine_mode
cde0f3fd 128default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
ef4bddc2 129 machine_mode mode,
cde0f3fd
PB
130 int *punsignedp ATTRIBUTE_UNUSED,
131 const_tree funtype ATTRIBUTE_UNUSED,
132 int for_return ATTRIBUTE_UNUSED)
133{
5e617be8 134 if (type != NULL_TREE && for_return == 2)
666e3ceb 135 return promote_mode (type, mode, punsignedp);
cde0f3fd
PB
136 return mode;
137}
138
ef4bddc2 139machine_mode
cde0f3fd 140default_promote_function_mode_always_promote (const_tree type,
ef4bddc2 141 machine_mode mode,
cde0f3fd
PB
142 int *punsignedp,
143 const_tree funtype ATTRIBUTE_UNUSED,
144 int for_return ATTRIBUTE_UNUSED)
145{
146 return promote_mode (type, mode, punsignedp);
147}
148
ef4bddc2
RS
149machine_mode
150default_cc_modes_compatible (machine_mode m1, machine_mode m2)
e129d93a
ILT
151{
152 if (m1 == m2)
153 return m1;
154 return VOIDmode;
155}
156
61f71b34 157bool
586de218
KG
158default_return_in_memory (const_tree type,
159 const_tree fntype ATTRIBUTE_UNUSED)
61f71b34 160{
33d05111 161 return (TYPE_MODE (type) == BLKmode);
61f71b34
DD
162}
163
506d7b68
PB
164rtx
165default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
ef4bddc2 166 machine_mode mode ATTRIBUTE_UNUSED)
506d7b68
PB
167{
168 return x;
169}
170
14133a4d
KK
171bool
172default_legitimize_address_displacement (rtx *disp ATTRIBUTE_UNUSED,
173 rtx *offset ATTRIBUTE_UNUSED,
174 machine_mode mode ATTRIBUTE_UNUSED)
175{
176 return false;
177}
178
61f71b34
DD
179rtx
180default_expand_builtin_saveregs (void)
181{
61f71b34
DD
182 error ("__builtin_saveregs not supported by this target");
183 return const0_rtx;
61f71b34
DD
184}
185
186void
d5cc9181 187default_setup_incoming_varargs (cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 188 machine_mode mode ATTRIBUTE_UNUSED,
61f71b34
DD
189 tree type ATTRIBUTE_UNUSED,
190 int *pretend_arg_size ATTRIBUTE_UNUSED,
191 int second_time ATTRIBUTE_UNUSED)
192{
61f71b34
DD
193}
194
d6da68b9
KH
195/* The default implementation of TARGET_BUILTIN_SETJMP_FRAME_VALUE. */
196
197rtx
198default_builtin_setjmp_frame_value (void)
199{
200 return virtual_stack_vars_rtx;
201}
202
3a4d587b 203/* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false. */
8dfa8fcd 204
61f71b34 205bool
d5cc9181 206hook_bool_CUMULATIVE_ARGS_false (cumulative_args_t ca ATTRIBUTE_UNUSED)
61f71b34 207{
b602b7b6 208 return false;
61f71b34
DD
209}
210
211bool
d5cc9181 212default_pretend_outgoing_varargs_named (cumulative_args_t ca ATTRIBUTE_UNUSED)
61f71b34 213{
3a4d587b
AM
214 return (targetm.calls.setup_incoming_varargs
215 != default_setup_incoming_varargs);
61f71b34 216}
c6e8c921 217
ef4bddc2 218machine_mode
93f90be6
FJ
219default_eh_return_filter_mode (void)
220{
7b0518e3 221 return targetm.unwind_word_mode ();
93f90be6
FJ
222}
223
ef4bddc2 224machine_mode
c7ff6e7a
AK
225default_libgcc_cmp_return_mode (void)
226{
227 return word_mode;
228}
229
ef4bddc2 230machine_mode
c7ff6e7a
AK
231default_libgcc_shift_count_mode (void)
232{
233 return word_mode;
234}
235
ef4bddc2 236machine_mode
7b0518e3
UW
237default_unwind_word_mode (void)
238{
239 return word_mode;
240}
241
273a2526
RS
242/* The default implementation of TARGET_SHIFT_TRUNCATION_MASK. */
243
244unsigned HOST_WIDE_INT
ef4bddc2 245default_shift_truncation_mask (machine_mode mode)
273a2526
RS
246{
247 return SHIFT_COUNT_TRUNCATED ? GET_MODE_BITSIZE (mode) - 1 : 0;
248}
249
bc23502b
PB
250/* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL. */
251
252unsigned int
ef4bddc2 253default_min_divisions_for_recip_mul (machine_mode mode ATTRIBUTE_UNUSED)
bc23502b
PB
254{
255 return have_insn_for (DIV, mode) ? 3 : 2;
256}
257
b12cbf2c
AN
258/* The default implementation of TARGET_MODE_REP_EXTENDED. */
259
260int
ef4bddc2
RS
261default_mode_rep_extended (machine_mode mode ATTRIBUTE_UNUSED,
262 machine_mode mode_rep ATTRIBUTE_UNUSED)
b12cbf2c
AN
263{
264 return UNKNOWN;
265}
266
c6e8c921 267/* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true. */
0938c9e8 268
c6e8c921 269bool
d5cc9181 270hook_bool_CUMULATIVE_ARGS_true (cumulative_args_t a ATTRIBUTE_UNUSED)
c6e8c921
GK
271{
272 return true;
273}
4185ae53 274
c77cd3d1
UB
275/* Return machine mode for non-standard suffix
276 or VOIDmode if non-standard suffixes are unsupported. */
ef4bddc2 277machine_mode
c77cd3d1
UB
278default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED)
279{
280 return VOIDmode;
281}
4185ae53
PB
282
283/* The generic C++ ABI specifies this is a 64-bit value. */
284tree
285default_cxx_guard_type (void)
286{
287 return long_long_integer_type_node;
288}
46e995e0 289
46e995e0
PB
290/* Returns the size of the cookie to use when allocating an array
291 whose elements have the indicated TYPE. Assumes that it is already
292 known that a cookie is needed. */
293
294tree
295default_cxx_get_cookie_size (tree type)
296{
297 tree cookie_size;
298
299 /* We need to allocate an additional max (sizeof (size_t), alignof
300 (true_type)) bytes. */
301 tree sizetype_size;
302 tree type_align;
a1c496cb 303
46e995e0
PB
304 sizetype_size = size_in_bytes (sizetype);
305 type_align = size_int (TYPE_ALIGN_UNIT (type));
807e902e 306 if (tree_int_cst_lt (type_align, sizetype_size))
46e995e0
PB
307 cookie_size = sizetype_size;
308 else
309 cookie_size = type_align;
310
311 return cookie_size;
312}
8cd5a4e0 313
8cd5a4e0
RH
314/* Return true if a parameter must be passed by reference. This version
315 of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK. */
316
317bool
d5cc9181 318hook_pass_by_reference_must_pass_in_stack (cumulative_args_t c ATTRIBUTE_UNUSED,
ef4bddc2 319 machine_mode mode ATTRIBUTE_UNUSED, const_tree type ATTRIBUTE_UNUSED,
8cd5a4e0
RH
320 bool named_arg ATTRIBUTE_UNUSED)
321{
322 return targetm.calls.must_pass_in_stack (mode, type);
323}
951120ea 324
6cdd5672
RH
325/* Return true if a parameter follows callee copies conventions. This
326 version of the hook is true for all named arguments. */
327
328bool
d5cc9181 329hook_callee_copies_named (cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 330 machine_mode mode ATTRIBUTE_UNUSED,
586de218 331 const_tree type ATTRIBUTE_UNUSED, bool named)
6cdd5672
RH
332{
333 return named;
334}
951120ea 335
6e2188e0
NF
336/* Emit to STREAM the assembler syntax for insn operand X. */
337
338void
339default_print_operand (FILE *stream ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
340 int code ATTRIBUTE_UNUSED)
341{
342#ifdef PRINT_OPERAND
343 PRINT_OPERAND (stream, x, code);
344#else
345 gcc_unreachable ();
346#endif
347}
348
349/* Emit to STREAM the assembler syntax for an insn operand whose memory
350 address is X. */
351
352void
353default_print_operand_address (FILE *stream ATTRIBUTE_UNUSED,
cc8ca59e 354 machine_mode /*mode*/,
6e2188e0
NF
355 rtx x ATTRIBUTE_UNUSED)
356{
357#ifdef PRINT_OPERAND_ADDRESS
358 PRINT_OPERAND_ADDRESS (stream, x);
359#else
360 gcc_unreachable ();
361#endif
362}
363
364/* Return true if CODE is a valid punctuation character for the
365 `print_operand' hook. */
366
367bool
368default_print_operand_punct_valid_p (unsigned char code ATTRIBUTE_UNUSED)
369{
370#ifdef PRINT_OPERAND_PUNCT_VALID_P
371 return PRINT_OPERAND_PUNCT_VALID_P (code);
372#else
373 return false;
374#endif
375}
376
77754180
DK
377/* The default implementation of TARGET_MANGLE_ASSEMBLER_NAME. */
378tree
379default_mangle_assembler_name (const char *name ATTRIBUTE_UNUSED)
380{
381 const char *skipped = name + (*name == '*' ? 1 : 0);
382 const char *stripped = targetm.strip_name_encoding (skipped);
383 if (*name != '*' && user_label_prefix[0])
384 stripped = ACONCAT ((user_label_prefix, stripped, NULL));
385 return get_identifier (stripped);
386}
387
6dd53648
RH
388/* True if MODE is valid for the target. By "valid", we mean able to
389 be manipulated in non-trivial ways. In particular, this means all
390 the arithmetic is supported.
391
392 By default we guess this means that any C type is supported. If
393 we can't map the mode back to a type that would be available in C,
394 then reject it. Special case, here, is the double-word arithmetic
395 supported by optabs.c. */
396
397bool
ef4bddc2 398default_scalar_mode_supported_p (machine_mode mode)
6dd53648
RH
399{
400 int precision = GET_MODE_PRECISION (mode);
401
402 switch (GET_MODE_CLASS (mode))
403 {
404 case MODE_PARTIAL_INT:
405 case MODE_INT:
406 if (precision == CHAR_TYPE_SIZE)
407 return true;
408 if (precision == SHORT_TYPE_SIZE)
409 return true;
410 if (precision == INT_TYPE_SIZE)
411 return true;
412 if (precision == LONG_TYPE_SIZE)
413 return true;
414 if (precision == LONG_LONG_TYPE_SIZE)
415 return true;
416 if (precision == 2 * BITS_PER_WORD)
417 return true;
418 return false;
419
420 case MODE_FLOAT:
421 if (precision == FLOAT_TYPE_SIZE)
422 return true;
423 if (precision == DOUBLE_TYPE_SIZE)
424 return true;
425 if (precision == LONG_DOUBLE_TYPE_SIZE)
426 return true;
427 return false;
428
9a8ce21f 429 case MODE_DECIMAL_FLOAT:
ab22c1fa
CF
430 case MODE_FRACT:
431 case MODE_UFRACT:
432 case MODE_ACCUM:
433 case MODE_UACCUM:
9a8ce21f
JG
434 return false;
435
6dd53648 436 default:
1e128c5f 437 gcc_unreachable ();
6dd53648
RH
438 }
439}
6cdd5672 440
8cc4b7a2
JM
441/* Return true if libgcc supports floating-point mode MODE (known to
442 be supported as a scalar mode). */
443
444bool
ef4bddc2 445default_libgcc_floating_mode_supported_p (machine_mode mode)
8cc4b7a2
JM
446{
447 switch (mode)
448 {
449#ifdef HAVE_SFmode
450 case SFmode:
451#endif
452#ifdef HAVE_DFmode
453 case DFmode:
454#endif
455#ifdef HAVE_XFmode
456 case XFmode:
457#endif
458#ifdef HAVE_TFmode
459 case TFmode:
460#endif
461 return true;
462
463 default:
464 return false;
465 }
466}
467
c65699ef
JM
468/* Return the machine mode to use for the type _FloatN, if EXTENDED is
469 false, or _FloatNx, if EXTENDED is true, or VOIDmode if not
470 supported. */
471machine_mode
472default_floatn_mode (int n, bool extended)
473{
474 if (extended)
475 {
476 machine_mode cand1 = VOIDmode, cand2 = VOIDmode;
477 switch (n)
478 {
479 case 32:
480#ifdef HAVE_DFmode
481 cand1 = DFmode;
482#endif
483 break;
484
485 case 64:
486#ifdef HAVE_XFmode
487 cand1 = XFmode;
488#endif
489#ifdef HAVE_TFmode
490 cand2 = TFmode;
491#endif
492 break;
493
494 case 128:
495 break;
496
497 default:
498 /* Those are the only valid _FloatNx types. */
499 gcc_unreachable ();
500 }
501 if (cand1 != VOIDmode
502 && REAL_MODE_FORMAT (cand1)->ieee_bits > n
503 && targetm.scalar_mode_supported_p (cand1)
504 && targetm.libgcc_floating_mode_supported_p (cand1))
505 return cand1;
506 if (cand2 != VOIDmode
507 && REAL_MODE_FORMAT (cand2)->ieee_bits > n
508 && targetm.scalar_mode_supported_p (cand2)
509 && targetm.libgcc_floating_mode_supported_p (cand2))
510 return cand2;
511 }
512 else
513 {
514 machine_mode cand = VOIDmode;
515 switch (n)
516 {
517 case 16:
3479b7af
JG
518 /* Always enable _Float16 if we have basic support for the mode.
519 Targets can control the range and precision of operations on
520 the _Float16 type using TARGET_C_EXCESS_PRECISION. */
521#ifdef HAVE_HFmode
522 cand = HFmode;
523#endif
c65699ef
JM
524 break;
525
526 case 32:
527#ifdef HAVE_SFmode
528 cand = SFmode;
529#endif
530 break;
531
532 case 64:
533#ifdef HAVE_DFmode
534 cand = DFmode;
535#endif
536 break;
537
538 case 128:
539#ifdef HAVE_TFmode
540 cand = TFmode;
541#endif
542 break;
543
544 default:
545 break;
546 }
547 if (cand != VOIDmode
548 && REAL_MODE_FORMAT (cand)->ieee_bits == n
549 && targetm.scalar_mode_supported_p (cand)
550 && targetm.libgcc_floating_mode_supported_p (cand))
551 return cand;
552 }
553 return VOIDmode;
554}
555
2e681adf
JR
556/* Make some target macros useable by target-independent code. */
557bool
558targhook_words_big_endian (void)
559{
560 return !!WORDS_BIG_ENDIAN;
561}
562
563bool
564targhook_float_words_big_endian (void)
565{
566 return !!FLOAT_WORDS_BIG_ENDIAN;
567}
568
9193fb05
JM
569/* True if the target supports floating-point exceptions and rounding
570 modes. */
571
572bool
573default_float_exceptions_rounding_supported_p (void)
574{
575#ifdef HAVE_adddf3
576 return HAVE_adddf3;
577#else
578 return false;
579#endif
580}
581
0884546e
BE
582/* True if the target supports decimal floating point. */
583
584bool
585default_decimal_float_supported_p (void)
586{
587 return ENABLE_DECIMAL_FLOAT;
588}
589
ab22c1fa
CF
590/* True if the target supports fixed-point arithmetic. */
591
592bool
593default_fixed_point_supported_p (void)
594{
595 return ENABLE_FIXED_POINT;
596}
597
2f251a05
AI
598/* True if the target supports GNU indirect functions. */
599
600bool
601default_has_ifunc_p (void)
602{
603 return HAVE_GNU_INDIRECT_FUNCTION;
604}
605
e7e64a25
AS
606/* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
607 an error message.
b8698a0f 608
0fa2e4df 609 This function checks whether a given INSN is valid within a low-overhead
e7e64a25
AS
610 loop. If INSN is invalid it returns the reason for that, otherwise it
611 returns NULL. A called function may clobber any special registers required
612 for low-overhead looping. Additionally, some targets (eg, PPC) use the count
a71a498d
AS
613 register for branch on table instructions. We reject the doloop pattern in
614 these cases. */
615
e7e64a25 616const char *
ac44248e 617default_invalid_within_doloop (const rtx_insn *insn)
a71a498d
AS
618{
619 if (CALL_P (insn))
e7e64a25 620 return "Function call in loop.";
b8698a0f 621
39718607 622 if (tablejump_p (insn, NULL, NULL) || computed_jump_p (insn))
e7e64a25 623 return "Computed branch in the loop.";
b8698a0f 624
e7e64a25 625 return NULL;
a71a498d
AS
626}
627
2505a3f2
RG
628/* Mapping of builtin functions to vectorized variants. */
629
630tree
10766209
RS
631default_builtin_vectorized_function (unsigned int, tree, tree)
632{
633 return NULL_TREE;
634}
635
636/* Mapping of target builtin functions to vectorized variants. */
637
638tree
639default_builtin_md_vectorized_function (tree, tree, tree)
2505a3f2
RG
640{
641 return NULL_TREE;
642}
643
f57d17f1
TM
644/* Vectorized conversion. */
645
646tree
744aa42f 647default_builtin_vectorized_conversion (unsigned int code ATTRIBUTE_UNUSED,
88dd7150
RG
648 tree dest_type ATTRIBUTE_UNUSED,
649 tree src_type ATTRIBUTE_UNUSED)
f57d17f1
TM
650{
651 return NULL_TREE;
652}
653
35e1a5e7
IR
654/* Default vectorizer cost model values. */
655
656int
720f5239 657default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
a21892ad 658 tree vectype,
720f5239 659 int misalign ATTRIBUTE_UNUSED)
35e1a5e7
IR
660{
661 switch (type_of_cost)
662 {
663 case scalar_stmt:
664 case scalar_load:
665 case scalar_store:
666 case vector_stmt:
667 case vector_load:
668 case vector_store:
669 case vec_to_scalar:
670 case scalar_to_vec:
671 case cond_branch_not_taken:
672 case vec_perm:
8bd37302 673 case vec_promote_demote:
35e1a5e7
IR
674 return 1;
675
676 case unaligned_load:
720f5239 677 case unaligned_store:
35e1a5e7
IR
678 return 2;
679
680 case cond_branch_taken:
681 return 3;
682
a21892ad 683 case vec_construct:
fcea0bbb 684 return TYPE_VECTOR_SUBPARTS (vectype) - 1;
a21892ad 685
35e1a5e7
IR
686 default:
687 gcc_unreachable ();
688 }
689}
690
cc2137be
UB
691/* Reciprocal. */
692
693tree
ee62a5a6 694default_builtin_reciprocal (tree)
cc2137be
UB
695{
696 return NULL_TREE;
697}
698
6cdd5672
RH
699bool
700hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
d5cc9181 701 cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 702 machine_mode mode ATTRIBUTE_UNUSED,
586de218 703 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
6cdd5672
RH
704{
705 return false;
706}
707
708bool
709hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true (
d5cc9181 710 cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 711 machine_mode mode ATTRIBUTE_UNUSED,
586de218 712 const_tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
6cdd5672
RH
713{
714 return true;
715}
78a52f11
RH
716
717int
718hook_int_CUMULATIVE_ARGS_mode_tree_bool_0 (
d5cc9181 719 cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 720 machine_mode mode ATTRIBUTE_UNUSED,
78a52f11
RH
721 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
722{
723 return 0;
724}
4d3e6fae 725
3c07301f 726void
d5cc9181 727default_function_arg_advance (cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 728 machine_mode mode ATTRIBUTE_UNUSED,
3c07301f
NF
729 const_tree type ATTRIBUTE_UNUSED,
730 bool named ATTRIBUTE_UNUSED)
731{
3c07301f 732 gcc_unreachable ();
3c07301f
NF
733}
734
735rtx
d5cc9181 736default_function_arg (cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 737 machine_mode mode ATTRIBUTE_UNUSED,
3c07301f
NF
738 const_tree type ATTRIBUTE_UNUSED,
739 bool named ATTRIBUTE_UNUSED)
740{
3c07301f 741 gcc_unreachable ();
3c07301f
NF
742}
743
744rtx
d5cc9181 745default_function_incoming_arg (cumulative_args_t ca ATTRIBUTE_UNUSED,
ef4bddc2 746 machine_mode mode ATTRIBUTE_UNUSED,
3c07301f
NF
747 const_tree type ATTRIBUTE_UNUSED,
748 bool named ATTRIBUTE_UNUSED)
749{
3c07301f 750 gcc_unreachable ();
3c07301f
NF
751}
752
c2ed6cf8 753unsigned int
ef4bddc2 754default_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED,
c2ed6cf8
NF
755 const_tree type ATTRIBUTE_UNUSED)
756{
757 return PARM_BOUNDARY;
758}
759
123148b5 760unsigned int
ef4bddc2 761default_function_arg_round_boundary (machine_mode mode ATTRIBUTE_UNUSED,
123148b5
BS
762 const_tree type ATTRIBUTE_UNUSED)
763{
764 return PARM_BOUNDARY;
765}
766
b8698a0f 767void
912f2dac
DB
768hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
769{
770}
771
4d3e6fae
FJ
772const char *
773hook_invalid_arg_for_unprototyped_fn (
3101faab
KG
774 const_tree typelist ATTRIBUTE_UNUSED,
775 const_tree funcdecl ATTRIBUTE_UNUSED,
776 const_tree val ATTRIBUTE_UNUSED)
4d3e6fae
FJ
777{
778 return NULL;
779}
7d69de61
RH
780
781/* Initialize the stack protection decls. */
782
783/* Stack protection related decls living in libgcc. */
784static GTY(()) tree stack_chk_guard_decl;
785
786tree
787default_stack_protect_guard (void)
788{
789 tree t = stack_chk_guard_decl;
790
791 if (t == NULL)
792 {
623a6941
MK
793 rtx x;
794
c2255bc4
AH
795 t = build_decl (UNKNOWN_LOCATION,
796 VAR_DECL, get_identifier ("__stack_chk_guard"),
7d69de61
RH
797 ptr_type_node);
798 TREE_STATIC (t) = 1;
799 TREE_PUBLIC (t) = 1;
800 DECL_EXTERNAL (t) = 1;
801 TREE_USED (t) = 1;
802 TREE_THIS_VOLATILE (t) = 1;
803 DECL_ARTIFICIAL (t) = 1;
804 DECL_IGNORED_P (t) = 1;
805
623a6941
MK
806 /* Do not share RTL as the declaration is visible outside of
807 current function. */
808 x = DECL_RTL (t);
809 RTX_FLAG (x, used) = 1;
810
7d69de61
RH
811 stack_chk_guard_decl = t;
812 }
813
814 return t;
815}
816
817static GTY(()) tree stack_chk_fail_decl;
818
b8698a0f 819tree
7d69de61
RH
820default_external_stack_protect_fail (void)
821{
822 tree t = stack_chk_fail_decl;
823
824 if (t == NULL_TREE)
825 {
826 t = build_function_type_list (void_type_node, NULL_TREE);
c2255bc4
AH
827 t = build_decl (UNKNOWN_LOCATION,
828 FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t);
7d69de61
RH
829 TREE_STATIC (t) = 1;
830 TREE_PUBLIC (t) = 1;
831 DECL_EXTERNAL (t) = 1;
832 TREE_USED (t) = 1;
833 TREE_THIS_VOLATILE (t) = 1;
834 TREE_NOTHROW (t) = 1;
835 DECL_ARTIFICIAL (t) = 1;
836 DECL_IGNORED_P (t) = 1;
5b5cba1f
JM
837 DECL_VISIBILITY (t) = VISIBILITY_DEFAULT;
838 DECL_VISIBILITY_SPECIFIED (t) = 1;
7d69de61
RH
839
840 stack_chk_fail_decl = t;
841 }
842
5039610b 843 return build_call_expr (t, 0);
7d69de61
RH
844}
845
846tree
847default_hidden_stack_protect_fail (void)
848{
7ce918c5
JJ
849#ifndef HAVE_GAS_HIDDEN
850 return default_external_stack_protect_fail ();
851#else
7d69de61
RH
852 tree t = stack_chk_fail_decl;
853
7ce918c5
JJ
854 if (!flag_pic)
855 return default_external_stack_protect_fail ();
856
857 if (t == NULL_TREE)
7d69de61
RH
858 {
859 t = build_function_type_list (void_type_node, NULL_TREE);
c2255bc4 860 t = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
7d69de61
RH
861 get_identifier ("__stack_chk_fail_local"), t);
862 TREE_STATIC (t) = 1;
863 TREE_PUBLIC (t) = 1;
864 DECL_EXTERNAL (t) = 1;
865 TREE_USED (t) = 1;
866 TREE_THIS_VOLATILE (t) = 1;
867 TREE_NOTHROW (t) = 1;
868 DECL_ARTIFICIAL (t) = 1;
869 DECL_IGNORED_P (t) = 1;
870 DECL_VISIBILITY_SPECIFIED (t) = 1;
871 DECL_VISIBILITY (t) = VISIBILITY_HIDDEN;
872
873 stack_chk_fail_decl = t;
874 }
875
5039610b 876 return build_call_expr (t, 0);
7ce918c5 877#endif
7d69de61
RH
878}
879
8ddf681a 880bool
3101faab
KG
881hook_bool_const_rtx_commutative_p (const_rtx x,
882 int outer_code ATTRIBUTE_UNUSED)
8ddf681a
R
883{
884 return COMMUTATIVE_P (x);
885}
886
1d636cc6 887rtx
586de218
KG
888default_function_value (const_tree ret_type ATTRIBUTE_UNUSED,
889 const_tree fn_decl_or_type,
1d636cc6
RG
890 bool outgoing ATTRIBUTE_UNUSED)
891{
892 /* The old interface doesn't handle receiving the function type. */
893 if (fn_decl_or_type
894 && !DECL_P (fn_decl_or_type))
895 fn_decl_or_type = NULL;
896
1d636cc6
RG
897#ifdef FUNCTION_VALUE
898 return FUNCTION_VALUE (ret_type, fn_decl_or_type);
899#else
7fc6a96b 900 gcc_unreachable ();
1d636cc6
RG
901#endif
902}
903
390b17c2 904rtx
ef4bddc2 905default_libcall_value (machine_mode mode ATTRIBUTE_UNUSED,
7fc6a96b 906 const_rtx fun ATTRIBUTE_UNUSED)
390b17c2 907{
7fc6a96b 908#ifdef LIBCALL_VALUE
390b17c2 909 return LIBCALL_VALUE (mode);
7fc6a96b
AS
910#else
911 gcc_unreachable ();
912#endif
390b17c2
RE
913}
914
82f81f18
AS
915/* The default hook for TARGET_FUNCTION_VALUE_REGNO_P. */
916
917bool
918default_function_value_regno_p (const unsigned int regno ATTRIBUTE_UNUSED)
919{
920#ifdef FUNCTION_VALUE_REGNO_P
921 return FUNCTION_VALUE_REGNO_P (regno);
922#else
923 gcc_unreachable ();
924#endif
925}
926
150cdc9e
RH
927rtx
928default_internal_arg_pointer (void)
929{
930 /* If the reg that the virtual arg pointer will be translated into is
931 not a fixed reg or is the stack pointer, make a copy of the virtual
932 arg pointer, and address parms via the copy. The frame pointer is
933 considered fixed even though it is not marked as such. */
934 if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
935 || ! (fixed_regs[ARG_POINTER_REGNUM]
936 || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
937 return copy_to_reg (virtual_incoming_args_rtx);
938 else
939 return virtual_incoming_args_rtx;
940}
941
531ca746 942rtx
c21df29b 943default_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p)
531ca746 944{
531ca746
RH
945 if (incoming_p)
946 {
531ca746
RH
947#ifdef STATIC_CHAIN_INCOMING_REGNUM
948 return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
949#endif
950 }
951
531ca746
RH
952#ifdef STATIC_CHAIN_REGNUM
953 return gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
954#endif
955
2b4fa409
RH
956 {
957 static bool issued_error;
958 if (!issued_error)
959 {
960 issued_error = true;
961 sorry ("nested functions not supported on this target");
962 }
963
964 /* It really doesn't matter what we return here, so long at it
965 doesn't cause the rest of the compiler to crash. */
966 return gen_rtx_MEM (Pmode, stack_pointer_rtx);
967 }
531ca746
RH
968}
969
531ca746
RH
970void
971default_trampoline_init (rtx ARG_UNUSED (m_tramp), tree ARG_UNUSED (t_func),
972 rtx ARG_UNUSED (r_chain))
973{
531ca746 974 sorry ("nested function trampolines not supported on this target");
531ca746
RH
975}
976
079e7538
NF
977int
978default_return_pops_args (tree fundecl ATTRIBUTE_UNUSED,
979 tree funtype ATTRIBUTE_UNUSED,
980 int size ATTRIBUTE_UNUSED)
981{
982 return 0;
983}
984
a87cf97e 985reg_class_t
81f40b79
ILT
986default_branch_target_register_class (void)
987{
988 return NO_REGS;
989}
990
5074a1f8
VM
991reg_class_t
992default_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
31e2b5a3
WD
993 reg_class_t cl,
994 reg_class_t best_cl ATTRIBUTE_UNUSED)
5074a1f8
VM
995{
996 return cl;
997}
998
55a2c322
VM
999extern bool
1000default_lra_p (void)
1001{
794b71a4 1002 return true;
55a2c322
VM
1003}
1004
1005int
1006default_register_priority (int hard_regno ATTRIBUTE_UNUSED)
1007{
1008 return 0;
1009}
1010
3b9ceb4b
VM
1011extern bool
1012default_register_usage_leveling_p (void)
1013{
1014 return false;
1015}
1016
55a2c322
VM
1017extern bool
1018default_different_addr_displacement_p (void)
1019{
1020 return false;
1021}
1022
a87cf97e 1023reg_class_t
8a99f6f9 1024default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
a87cf97e 1025 reg_class_t reload_class_i ATTRIBUTE_UNUSED,
ef4bddc2 1026 machine_mode reload_mode ATTRIBUTE_UNUSED,
8a99f6f9
R
1027 secondary_reload_info *sri)
1028{
48c54229 1029 enum reg_class rclass = NO_REGS;
a87cf97e 1030 enum reg_class reload_class = (enum reg_class) reload_class_i;
8a99f6f9
R
1031
1032 if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
1033 {
1034 sri->icode = sri->prev_sri->t_icode;
1035 return NO_REGS;
1036 }
1037#ifdef SECONDARY_INPUT_RELOAD_CLASS
1038 if (in_p)
48c54229 1039 rclass = SECONDARY_INPUT_RELOAD_CLASS (reload_class, reload_mode, x);
8a99f6f9
R
1040#endif
1041#ifdef SECONDARY_OUTPUT_RELOAD_CLASS
1042 if (! in_p)
48c54229 1043 rclass = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class, reload_mode, x);
8a99f6f9 1044#endif
48c54229 1045 if (rclass != NO_REGS)
8a99f6f9 1046 {
f9621cc4
RS
1047 enum insn_code icode
1048 = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab,
1049 reload_mode);
8a99f6f9
R
1050
1051 if (icode != CODE_FOR_nothing
2ef6ce06 1052 && !insn_operand_matches (icode, in_p, x))
8a99f6f9
R
1053 icode = CODE_FOR_nothing;
1054 else if (icode != CODE_FOR_nothing)
1055 {
1056 const char *insn_constraint, *scratch_constraint;
8a99f6f9
R
1057 enum reg_class insn_class, scratch_class;
1058
1059 gcc_assert (insn_data[(int) icode].n_operands == 3);
1060 insn_constraint = insn_data[(int) icode].operand[!in_p].constraint;
1061 if (!*insn_constraint)
1062 insn_class = ALL_REGS;
1063 else
1064 {
1065 if (in_p)
1066 {
1067 gcc_assert (*insn_constraint == '=');
1068 insn_constraint++;
1069 }
8677664e
RS
1070 insn_class = (reg_class_for_constraint
1071 (lookup_constraint (insn_constraint)));
8a99f6f9
R
1072 gcc_assert (insn_class != NO_REGS);
1073 }
1074
1075 scratch_constraint = insn_data[(int) icode].operand[2].constraint;
11e30dd8
HPN
1076 /* The scratch register's constraint must start with "=&",
1077 except for an input reload, where only "=" is necessary,
1078 and where it might be beneficial to re-use registers from
1079 the input. */
8a99f6f9 1080 gcc_assert (scratch_constraint[0] == '='
11e30dd8
HPN
1081 && (in_p || scratch_constraint[1] == '&'));
1082 scratch_constraint++;
1083 if (*scratch_constraint == '&')
1084 scratch_constraint++;
8677664e
RS
1085 scratch_class = (reg_class_for_constraint
1086 (lookup_constraint (scratch_constraint)));
8a99f6f9
R
1087
1088 if (reg_class_subset_p (reload_class, insn_class))
1089 {
48c54229
KG
1090 gcc_assert (scratch_class == rclass);
1091 rclass = NO_REGS;
8a99f6f9
R
1092 }
1093 else
48c54229 1094 rclass = insn_class;
8a99f6f9
R
1095
1096 }
48c54229 1097 if (rclass == NO_REGS)
8a99f6f9
R
1098 sri->icode = icode;
1099 else
1100 sri->t_icode = icode;
1101 }
48c54229 1102 return rclass;
8a99f6f9
R
1103}
1104
9b580a0b
RH
1105/* By default, if flag_pic is true, then neither local nor global relocs
1106 should be placed in readonly memory. */
1107
1108int
1109default_reloc_rw_mask (void)
1110{
1111 return flag_pic ? 3 : 0;
1112}
1113
5234b8f5
DS
1114/* By default, do no modification. */
1115tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED,
1116 tree id)
1117{
1118 return id;
1119}
1120
5aea1e76
UW
1121/* Default to natural alignment for vector types. */
1122HOST_WIDE_INT
1123default_vector_alignment (const_tree type)
1124{
b6b552fd
BS
1125 HOST_WIDE_INT align = tree_to_shwi (TYPE_SIZE (type));
1126 if (align > MAX_OFILE_ALIGNMENT)
1127 align = MAX_OFILE_ALIGNMENT;
1128 return align;
5aea1e76
UW
1129}
1130
c2873892
RB
1131/* By default assume vectors of element TYPE require a multiple of the natural
1132 alignment of TYPE. TYPE is naturally aligned if IS_PACKED is false. */
5b900a4c 1133bool
a4cf4b64 1134default_builtin_vector_alignment_reachable (const_tree /*type*/, bool is_packed)
5b900a4c 1135{
a4cf4b64 1136 return ! is_packed;
5b900a4c
DN
1137}
1138
0601d0cf 1139/* By default, assume that a target supports any factor of misalignment
b8698a0f 1140 memory access if it supports movmisalign patten.
0601d0cf
RE
1141 is_packed is true if the memory access is defined in a packed struct. */
1142bool
ef4bddc2 1143default_builtin_support_vector_misalignment (machine_mode mode,
0601d0cf
RE
1144 const_tree type
1145 ATTRIBUTE_UNUSED,
1146 int misalignment
1147 ATTRIBUTE_UNUSED,
1148 bool is_packed
1149 ATTRIBUTE_UNUSED)
1150{
947131ba 1151 if (optab_handler (movmisalign_optab, mode) != CODE_FOR_nothing)
0601d0cf
RE
1152 return true;
1153 return false;
1154}
1155
26983c22
L
1156/* By default, only attempt to parallelize bitwise operations, and
1157 possibly adds/subtracts using bit-twiddling. */
1158
ef4bddc2
RS
1159machine_mode
1160default_preferred_simd_mode (machine_mode mode ATTRIBUTE_UNUSED)
26983c22 1161{
cc4b5170 1162 return word_mode;
26983c22
L
1163}
1164
767f865f
RG
1165/* By default only the size derived from the preferred vector mode
1166 is tried. */
1167
1168unsigned int
1169default_autovectorize_vector_sizes (void)
1170{
1171 return 0;
1172}
1173
9f47c7e5
IE
1174/* By defaults a vector of integers is used as a mask. */
1175
1176machine_mode
1177default_get_mask_mode (unsigned nunits, unsigned vector_size)
1178{
1179 unsigned elem_size = vector_size / nunits;
1180 machine_mode elem_mode
1181 = smallest_mode_for_size (elem_size * BITS_PER_UNIT, MODE_INT);
e219e495 1182 machine_mode vector_mode;
9f47c7e5
IE
1183
1184 gcc_assert (elem_size * nunits == vector_size);
1185
e219e495 1186 vector_mode = mode_for_vector (elem_mode, nunits);
df94599f
IE
1187 if (!VECTOR_MODE_P (vector_mode)
1188 || !targetm.vector_mode_supported_p (vector_mode))
e219e495
IE
1189 vector_mode = BLKmode;
1190
1191 return vector_mode;
9f47c7e5
IE
1192}
1193
92345349
BS
1194/* By default, the cost model accumulates three separate costs (prologue,
1195 loop body, and epilogue) for a vectorized loop or block. So allocate an
1196 array of three unsigned ints, set it to zero, and return its address. */
c3e7ee41
BS
1197
1198void *
1199default_init_cost (struct loop *loop_info ATTRIBUTE_UNUSED)
1200{
92345349
BS
1201 unsigned *cost = XNEWVEC (unsigned, 3);
1202 cost[vect_prologue] = cost[vect_body] = cost[vect_epilogue] = 0;
c3e7ee41
BS
1203 return cost;
1204}
1205
1206/* By default, the cost model looks up the cost of the given statement
1207 kind and mode, multiplies it by the occurrence count, accumulates
92345349 1208 it into the cost specified by WHERE, and returns the cost added. */
c3e7ee41
BS
1209
1210unsigned
1211default_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
92345349
BS
1212 struct _stmt_vec_info *stmt_info, int misalign,
1213 enum vect_cost_model_location where)
c3e7ee41
BS
1214{
1215 unsigned *cost = (unsigned *) data;
1216 unsigned retval = 0;
1217
d6d11272 1218 tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
58e5400a
BM
1219 int stmt_cost = targetm.vectorize.builtin_vectorization_cost (kind, vectype,
1220 misalign);
d6d11272
XDL
1221 /* Statements in an inner loop relative to the loop being
1222 vectorized are weighted more heavily. The value here is
1223 arbitrary and could potentially be improved with analysis. */
1224 if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info))
1225 count *= 50; /* FIXME. */
1226
1227 retval = (unsigned) (count * stmt_cost);
1228 cost[where] += retval;
c3e7ee41
BS
1229
1230 return retval;
1231}
1232
92345349 1233/* By default, the cost model just returns the accumulated costs. */
c3e7ee41 1234
92345349
BS
1235void
1236default_finish_cost (void *data, unsigned *prologue_cost,
1237 unsigned *body_cost, unsigned *epilogue_cost)
c3e7ee41 1238{
92345349
BS
1239 unsigned *cost = (unsigned *) data;
1240 *prologue_cost = cost[vect_prologue];
1241 *body_cost = cost[vect_body];
1242 *epilogue_cost = cost[vect_epilogue];
c3e7ee41
BS
1243}
1244
1245/* Free the cost data. */
1246
1247void
1248default_destroy_cost_data (void *data)
1249{
1250 free (data);
1251}
1252
d4ebfa65
BE
1253/* Determine whether or not a pointer mode is valid. Assume defaults
1254 of ptr_mode or Pmode - can be overridden. */
1255bool
ef4bddc2 1256default_valid_pointer_mode (machine_mode mode)
d4ebfa65
BE
1257{
1258 return (mode == ptr_mode || mode == Pmode);
1259}
1260
7352c013
RG
1261/* Determine whether the memory reference specified by REF may alias
1262 the C libraries errno location. */
1263bool
1264default_ref_may_alias_errno (ao_ref *ref)
1265{
1266 tree base = ao_ref_base (ref);
1267 /* The default implementation assumes the errno location is
1268 a declaration of type int or is always accessed via a
1269 pointer to int. We assume that accesses to errno are
1270 not deliberately obfuscated (even in conforming ways). */
1271 if (TYPE_UNSIGNED (TREE_TYPE (base))
1272 || TYPE_MODE (TREE_TYPE (base)) != TYPE_MODE (integer_type_node))
1273 return false;
1274 /* The default implementation assumes an errno location
1275 declaration is never defined in the current compilation unit. */
1276 if (DECL_P (base)
1277 && !TREE_STATIC (base))
1278 return true;
1279 else if (TREE_CODE (base) == MEM_REF
1280 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1281 {
1282 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1283 return !pi || pi->pt.anything || pi->pt.nonlocal;
1284 }
1285 return false;
1286}
1287
0f16c572
RH
1288/* Return the mode for a pointer to a given ADDRSPACE,
1289 defaulting to ptr_mode for all address spaces. */
d4ebfa65 1290
ef4bddc2 1291machine_mode
d4ebfa65
BE
1292default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
1293{
d4ebfa65
BE
1294 return ptr_mode;
1295}
1296
0f16c572
RH
1297/* Return the mode for an address in a given ADDRSPACE,
1298 defaulting to Pmode for all address spaces. */
d4ebfa65 1299
ef4bddc2 1300machine_mode
d4ebfa65
BE
1301default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
1302{
d4ebfa65
BE
1303 return Pmode;
1304}
1305
0f16c572
RH
1306/* Named address space version of valid_pointer_mode.
1307 To match the above, the same modes apply to all address spaces. */
d4ebfa65
BE
1308
1309bool
0f16c572
RH
1310default_addr_space_valid_pointer_mode (machine_mode mode,
1311 addr_space_t as ATTRIBUTE_UNUSED)
d4ebfa65 1312{
d4ebfa65
BE
1313 return targetm.valid_pointer_mode (mode);
1314}
1315
1316/* Some places still assume that all pointer or address modes are the
1317 standard Pmode and ptr_mode. These optimizations become invalid if
1318 the target actually supports multiple different modes. For now,
1319 we disable such optimizations on such targets, using this function. */
1320
1321bool
1322target_default_pointer_address_modes_p (void)
1323{
1324 if (targetm.addr_space.address_mode != default_addr_space_address_mode)
1325 return false;
1326 if (targetm.addr_space.pointer_mode != default_addr_space_pointer_mode)
1327 return false;
1328
1329 return true;
1330}
1331
0f16c572
RH
1332/* Named address space version of legitimate_address_p.
1333 By default, all address spaces have the same form. */
09e881c9
BE
1334
1335bool
ef4bddc2 1336default_addr_space_legitimate_address_p (machine_mode mode, rtx mem,
0f16c572
RH
1337 bool strict,
1338 addr_space_t as ATTRIBUTE_UNUSED)
09e881c9 1339{
09e881c9
BE
1340 return targetm.legitimate_address_p (mode, mem, strict);
1341}
1342
0f16c572
RH
1343/* Named address space version of LEGITIMIZE_ADDRESS.
1344 By default, all address spaces have the same form. */
09e881c9
BE
1345
1346rtx
0f16c572
RH
1347default_addr_space_legitimize_address (rtx x, rtx oldx, machine_mode mode,
1348 addr_space_t as ATTRIBUTE_UNUSED)
09e881c9 1349{
09e881c9
BE
1350 return targetm.legitimize_address (x, oldx, mode);
1351}
1352
1353/* The default hook for determining if one named address space is a subset of
1354 another and to return which address space to use as the common address
1355 space. */
1356
1357bool
1358default_addr_space_subset_p (addr_space_t subset, addr_space_t superset)
1359{
1360 return (subset == superset);
1361}
1362
6626f970
RH
1363/* The default hook for determining if 0 within a named address
1364 space is a valid address. */
1365
1366bool
1367default_addr_space_zero_address_valid (addr_space_t as ATTRIBUTE_UNUSED)
1368{
1369 return false;
1370}
1371
f736b911
RH
1372/* The default hook for debugging the address space is to return the
1373 address space number to indicate DW_AT_address_class. */
1374int
1375default_addr_space_debug (addr_space_t as)
1376{
1377 return as;
1378}
1379
ffc22840
GJL
1380/* The default hook implementation for TARGET_ADDR_SPACE_DIAGNOSE_USAGE.
1381 Don't complain about any address space. */
1382
1383void
1384default_addr_space_diagnose_usage (addr_space_t, location_t)
1385{
1386}
1387
1388
09e881c9
BE
1389/* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be
1390 called for targets with only a generic address space. */
1391
1392rtx
1393default_addr_space_convert (rtx op ATTRIBUTE_UNUSED,
1394 tree from_type ATTRIBUTE_UNUSED,
1395 tree to_type ATTRIBUTE_UNUSED)
1396{
1397 gcc_unreachable ();
1398}
1399
dbc42c44
AS
1400bool
1401default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
1402{
1403 return true;
1404}
1405
cbda7dc6
AS
1406/* The default implementation of TARGET_MODE_DEPENDENT_ADDRESS_P. */
1407
1408bool
5bfed9a9
GJL
1409default_mode_dependent_address_p (const_rtx addr ATTRIBUTE_UNUSED,
1410 addr_space_t addrspace ATTRIBUTE_UNUSED)
cbda7dc6 1411{
cbda7dc6 1412 return false;
cbda7dc6
AS
1413}
1414
ab442df7
MM
1415bool
1416default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl),
1417 tree ARG_UNUSED (name),
1418 tree ARG_UNUSED (args),
1419 int ARG_UNUSED (flags))
1420{
5779e713
MM
1421 warning (OPT_Wattributes,
1422 "target attribute is not supported on this machine");
1423
1424 return false;
1425}
1426
1427bool
1428default_target_option_pragma_parse (tree ARG_UNUSED (args),
1429 tree ARG_UNUSED (pop_target))
1430{
1aa5ba4e
DV
1431 /* If args is NULL the caller is handle_pragma_pop_options (). In that case,
1432 emit no warning because "#pragma GCC pop_target" is valid on targets that
1433 do not have the "target" pragma. */
1434 if (args)
1435 warning (OPT_Wpragmas,
1436 "#pragma GCC target is not supported for this machine");
5779e713 1437
ab442df7
MM
1438 return false;
1439}
1440
1441bool
5cec9f59 1442default_target_can_inline_p (tree caller, tree callee)
ab442df7
MM
1443{
1444 bool ret = false;
1445 tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee);
1446 tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller);
1447
1448 /* If callee has no option attributes, then it is ok to inline */
1449 if (!callee_opts)
1450 ret = true;
1451
1452 /* If caller has no option attributes, but callee does then it is not ok to
1453 inline */
1454 else if (!caller_opts)
1455 ret = false;
1456
dd5a833e
MS
1457 /* If both caller and callee have attributes, assume that if the
1458 pointer is different, the two functions have different target
1459 options since build_target_option_node uses a hash table for the
1460 options. */
ab442df7
MM
1461 else
1462 ret = (callee_opts == caller_opts);
1463
1464 return ret;
1465}
1466
e6ff3083
AS
1467/* If the machine does not have a case insn that compares the bounds,
1468 this means extra overhead for dispatch tables, which raises the
1469 threshold for using them. */
1470
0cd2402d
SB
1471unsigned int
1472default_case_values_threshold (void)
e6ff3083 1473{
8684d89d 1474 return (targetm.have_casesi () ? 4 : 5);
e6ff3083
AS
1475}
1476
2929029c
WG
1477bool
1478default_have_conditional_execution (void)
1479{
2929029c 1480 return HAVE_conditional_execution;
2929029c
WG
1481}
1482
9b2b7279
AM
1483/* By default we assume that c99 functions are present at the runtime,
1484 but sincos is not. */
1485bool
1486default_libc_has_function (enum function_class fn_class)
1487{
1488 if (fn_class == function_c94
1489 || fn_class == function_c99_misc
1490 || fn_class == function_c99_math_complex)
1491 return true;
1492
1493 return false;
1494}
1495
1496bool
1497gnu_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED)
1498{
1499 return true;
1500}
1501
1502bool
1503no_c99_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED)
1504{
1505 return false;
1506}
1507
0a35513e
AH
1508tree
1509default_builtin_tm_load_store (tree ARG_UNUSED (type))
1510{
1511 return NULL_TREE;
1512}
1513
f5c21ef3
AS
1514/* Compute cost of moving registers to/from memory. */
1515
1516int
ef4bddc2 1517default_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
a87cf97e 1518 reg_class_t rclass ATTRIBUTE_UNUSED,
f5c21ef3
AS
1519 bool in ATTRIBUTE_UNUSED)
1520{
1521#ifndef MEMORY_MOVE_COST
a87cf97e 1522 return (4 + memory_move_secondary_cost (mode, (enum reg_class) rclass, in));
f5c21ef3 1523#else
a87cf97e 1524 return MEMORY_MOVE_COST (mode, (enum reg_class) rclass, in);
f5c21ef3
AS
1525#endif
1526}
1527
de8f4b07
AS
1528/* Compute cost of moving data from a register of class FROM to one of
1529 TO, using MODE. */
1530
1531int
ef4bddc2 1532default_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
a87cf97e
JR
1533 reg_class_t from ATTRIBUTE_UNUSED,
1534 reg_class_t to ATTRIBUTE_UNUSED)
de8f4b07
AS
1535{
1536#ifndef REGISTER_MOVE_COST
1537 return 2;
1538#else
a87cf97e 1539 return REGISTER_MOVE_COST (mode, (enum reg_class) from, (enum reg_class) to);
de8f4b07
AS
1540#endif
1541}
1542
7cbed008 1543/* For hooks which use the MOVE_RATIO macro, this gives the legacy default
9c582551 1544 behavior. SPEED_P is true if we are compiling for speed. */
7cbed008 1545
5a6bc9c7 1546unsigned int
7cbed008
JG
1547get_move_ratio (bool speed_p ATTRIBUTE_UNUSED)
1548{
1549 unsigned int move_ratio;
1550#ifdef MOVE_RATIO
1551 move_ratio = (unsigned int) MOVE_RATIO (speed_p);
1552#else
1553#if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti)
1554 move_ratio = 2;
1555#else /* No movmem patterns, pick a default. */
1556 move_ratio = ((speed_p) ? 15 : 3);
1557#endif
1558#endif
1559 return move_ratio;
1560}
1561
1562/* Return TRUE if the move_by_pieces/set_by_pieces infrastructure should be
1563 used; return FALSE if the movmem/setmem optab should be expanded, or
1564 a call to memcpy emitted. */
1565
1566bool
445d7826 1567default_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
7cbed008
JG
1568 unsigned int alignment,
1569 enum by_pieces_operation op,
1570 bool speed_p)
1571{
1572 unsigned int max_size = 0;
1573 unsigned int ratio = 0;
1574
1575 switch (op)
1576 {
36b85e43
BS
1577 case CLEAR_BY_PIECES:
1578 max_size = STORE_MAX_PIECES;
1579 ratio = CLEAR_RATIO (speed_p);
1580 break;
1581 case MOVE_BY_PIECES:
1582 max_size = MOVE_MAX_PIECES;
1583 ratio = get_move_ratio (speed_p);
1584 break;
1585 case SET_BY_PIECES:
1586 max_size = STORE_MAX_PIECES;
1587 ratio = SET_RATIO (speed_p);
1588 break;
1589 case STORE_BY_PIECES:
1590 max_size = STORE_MAX_PIECES;
1591 ratio = get_move_ratio (speed_p);
1592 break;
1593 case COMPARE_BY_PIECES:
1594 max_size = COMPARE_MAX_PIECES;
1595 /* Pick a likely default, just as in get_move_ratio. */
1596 ratio = speed_p ? 15 : 3;
1597 break;
7cbed008
JG
1598 }
1599
36b85e43
BS
1600 return by_pieces_ninsns (size, alignment, max_size + 1, op) < ratio;
1601}
1602
1603/* This hook controls code generation for expanding a memcmp operation by
1604 pieces. Return 1 for the normal pattern of compare/jump after each pair
1605 of loads, or a higher number to reduce the number of branches. */
1606
1607int
1608default_compare_by_pieces_branch_ratio (machine_mode)
1609{
1610 return 1;
7cbed008
JG
1611}
1612
3c5273a9
KT
1613bool
1614default_profile_before_prologue (void)
1615{
1616#ifdef PROFILE_BEFORE_PROLOGUE
1617 return true;
1618#else
1619 return false;
1620#endif
1621}
1622
fba42e24
AS
1623/* The default implementation of TARGET_PREFERRED_RELOAD_CLASS. */
1624
1625reg_class_t
1626default_preferred_reload_class (rtx x ATTRIBUTE_UNUSED,
1627 reg_class_t rclass)
1628{
1629#ifdef PREFERRED_RELOAD_CLASS
1630 return (reg_class_t) PREFERRED_RELOAD_CLASS (x, (enum reg_class) rclass);
1631#else
1632 return rclass;
1633#endif
1634}
1635
abd26bfb
AS
1636/* The default implementation of TARGET_OUTPUT_PREFERRED_RELOAD_CLASS. */
1637
1638reg_class_t
1639default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED,
1640 reg_class_t rclass)
1641{
abd26bfb 1642 return rclass;
abd26bfb
AS
1643}
1644
5f286f4a
YQ
1645/* The default implementation of TARGET_PREFERRED_RENAME_CLASS. */
1646reg_class_t
1647default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED)
1648{
1649 return NO_REGS;
1650}
1651
07b8f0a8
AS
1652/* The default implementation of TARGET_CLASS_LIKELY_SPILLED_P. */
1653
1654bool
1655default_class_likely_spilled_p (reg_class_t rclass)
1656{
07b8f0a8 1657 return (reg_class_size[(int) rclass] == 1);
07b8f0a8
AS
1658}
1659
a8c44c52
AS
1660/* The default implementation of TARGET_CLASS_MAX_NREGS. */
1661
1662unsigned char
1663default_class_max_nregs (reg_class_t rclass ATTRIBUTE_UNUSED,
ef4bddc2 1664 machine_mode mode ATTRIBUTE_UNUSED)
a8c44c52
AS
1665{
1666#ifdef CLASS_MAX_NREGS
1667 return (unsigned char) CLASS_MAX_NREGS ((enum reg_class) rclass, mode);
1668#else
1669 return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
1670#endif
1671}
1672
f0a0390e
RH
1673/* Determine the debugging unwind mechanism for the target. */
1674
1675enum unwind_info_type
1676default_debug_unwind_info (void)
1677{
1678 /* If the target wants to force the use of dwarf2 unwind info, let it. */
1679 /* ??? Change all users to the hook, then poison this. */
1680#ifdef DWARF2_FRAME_INFO
1681 if (DWARF2_FRAME_INFO)
1682 return UI_DWARF2;
1683#endif
1684
1685 /* Otherwise, only turn it on if dwarf2 debugging is enabled. */
1686#ifdef DWARF2_DEBUGGING_INFO
1687 if (write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
1688 return UI_DWARF2;
1689#endif
1690
1691 return UI_NONE;
1692}
1693
ff050c66
MF
1694/* Determine the correct mode for a Dwarf frame register that represents
1695 register REGNO. */
1696
ef4bddc2 1697machine_mode
ff050c66
MF
1698default_dwarf_frame_reg_mode (int regno)
1699{
ef4bddc2 1700 machine_mode save_mode = reg_raw_mode[regno];
ff050c66
MF
1701
1702 if (HARD_REGNO_CALL_PART_CLOBBERED (regno, save_mode))
1703 save_mode = choose_hard_reg_mode (regno, 1, true);
1704 return save_mode;
1705}
1706
ffa88471
SE
1707/* To be used by targets where reg_raw_mode doesn't return the right
1708 mode for registers used in apply_builtin_return and apply_builtin_arg. */
1709
ef4bddc2 1710machine_mode
c3284718 1711default_get_reg_raw_mode (int regno)
ffa88471
SE
1712{
1713 return reg_raw_mode[regno];
1714}
1715
d56a43a0
AK
1716/* Return true if a leaf function should stay leaf even with profiling
1717 enabled. */
1718
1719bool
1720default_keep_leaf_when_profiled ()
1721{
1722 return false;
1723}
1724
a803773f
JM
1725/* Return true if the state of option OPTION should be stored in PCH files
1726 and checked by default_pch_valid_p. Store the option's current state
1727 in STATE if so. */
1728
1729static inline bool
1730option_affects_pch_p (int option, struct cl_option_state *state)
1731{
1732 if ((cl_options[option].flags & CL_TARGET) == 0)
1733 return false;
212bfe71
JR
1734 if ((cl_options[option].flags & CL_PCH_IGNORE) != 0)
1735 return false;
a803773f
JM
1736 if (option_flag_var (option, &global_options) == &target_flags)
1737 if (targetm.check_pch_target_flags)
1738 return false;
1739 return get_option_state (&global_options, option, state);
1740}
1741
1742/* Default version of get_pch_validity.
1743 By default, every flag difference is fatal; that will be mostly right for
1744 most targets, but completely right for very few. */
1745
1746void *
1747default_get_pch_validity (size_t *sz)
1748{
1749 struct cl_option_state state;
1750 size_t i;
1751 char *result, *r;
1752
1753 *sz = 2;
1754 if (targetm.check_pch_target_flags)
1755 *sz += sizeof (target_flags);
1756 for (i = 0; i < cl_options_count; i++)
1757 if (option_affects_pch_p (i, &state))
1758 *sz += state.size;
1759
1760 result = r = XNEWVEC (char, *sz);
1761 r[0] = flag_pic;
1762 r[1] = flag_pie;
1763 r += 2;
1764 if (targetm.check_pch_target_flags)
1765 {
1766 memcpy (r, &target_flags, sizeof (target_flags));
1767 r += sizeof (target_flags);
1768 }
1769
1770 for (i = 0; i < cl_options_count; i++)
1771 if (option_affects_pch_p (i, &state))
1772 {
1773 memcpy (r, state.data, state.size);
1774 r += state.size;
1775 }
1776
1777 return result;
1778}
1779
1780/* Return a message which says that a PCH file was created with a different
1781 setting of OPTION. */
1782
1783static const char *
1784pch_option_mismatch (const char *option)
1785{
582f770b
UB
1786 return xasprintf (_("created and used with differing settings of '%s'"),
1787 option);
a803773f
JM
1788}
1789
1790/* Default version of pch_valid_p. */
1791
1792const char *
1793default_pch_valid_p (const void *data_p, size_t len)
1794{
1795 struct cl_option_state state;
1796 const char *data = (const char *)data_p;
1797 size_t i;
1798
1799 /* -fpic and -fpie also usually make a PCH invalid. */
1800 if (data[0] != flag_pic)
1801 return _("created and used with different settings of -fpic");
1802 if (data[1] != flag_pie)
1803 return _("created and used with different settings of -fpie");
1804 data += 2;
1805
1806 /* Check target_flags. */
1807 if (targetm.check_pch_target_flags)
1808 {
1809 int tf;
1810 const char *r;
1811
1812 memcpy (&tf, data, sizeof (target_flags));
1813 data += sizeof (target_flags);
1814 len -= sizeof (target_flags);
1815 r = targetm.check_pch_target_flags (tf);
1816 if (r != NULL)
1817 return r;
1818 }
1819
1820 for (i = 0; i < cl_options_count; i++)
1821 if (option_affects_pch_p (i, &state))
1822 {
1823 if (memcmp (data, state.data, state.size) != 0)
1824 return pch_option_mismatch (cl_options[i].opt_text);
1825 data += state.size;
1826 len -= state.size;
1827 }
1828
1829 return NULL;
1830}
1831
42e37616
DM
1832/* Default version of cstore_mode. */
1833
ef4bddc2 1834machine_mode
42e37616
DM
1835default_cstore_mode (enum insn_code icode)
1836{
1837 return insn_data[(int) icode].operand[0].mode;
1838}
1839
d9886a9e
L
1840/* Default version of member_type_forces_blk. */
1841
1842bool
ef4bddc2 1843default_member_type_forces_blk (const_tree, machine_mode)
d9886a9e
L
1844{
1845 return false;
1846}
1847
d5e254e1
IE
1848rtx
1849default_load_bounds_for_arg (rtx addr ATTRIBUTE_UNUSED,
1850 rtx ptr ATTRIBUTE_UNUSED,
1851 rtx bnd ATTRIBUTE_UNUSED)
1852{
1853 gcc_unreachable ();
1854}
1855
1856void
1857default_store_bounds_for_arg (rtx val ATTRIBUTE_UNUSED,
1858 rtx addr ATTRIBUTE_UNUSED,
1859 rtx bounds ATTRIBUTE_UNUSED,
1860 rtx to ATTRIBUTE_UNUSED)
1861{
1862 gcc_unreachable ();
1863}
1864
1865rtx
1866default_load_returned_bounds (rtx slot ATTRIBUTE_UNUSED)
1867{
1868 gcc_unreachable ();
1869}
1870
1871void
1872default_store_returned_bounds (rtx slot ATTRIBUTE_UNUSED,
1873 rtx bounds ATTRIBUTE_UNUSED)
1874{
1875 gcc_unreachable ();
1876}
1877
f236ac95
RB
1878/* Default version of canonicalize_comparison. */
1879
1880void
1881default_canonicalize_comparison (int *, rtx *, rtx *, bool)
1882{
1883}
1884
267bac10
JM
1885/* Default implementation of TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */
1886
1887void
1888default_atomic_assign_expand_fenv (tree *, tree *, tree *)
1889{
1890}
1891
4a7cb16f
AM
1892#ifndef PAD_VARARGS_DOWN
1893#define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
1894#endif
1895
1896/* Build an indirect-ref expression over the given TREE, which represents a
1897 piece of a va_arg() expansion. */
1898tree
1899build_va_arg_indirect_ref (tree addr)
1900{
1901 addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr);
4a7cb16f
AM
1902 return addr;
1903}
1904
1905/* The "standard" implementation of va_arg: read the value from the
1906 current (padded) address and increment by the (padded) size. */
1907
1908tree
1909std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
1910 gimple_seq *post_p)
1911{
1912 tree addr, t, type_size, rounded_size, valist_tmp;
1913 unsigned HOST_WIDE_INT align, boundary;
1914 bool indirect;
1915
4a7cb16f
AM
1916 /* All of the alignment and movement below is for args-grow-up machines.
1917 As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
1918 implement their own specialized gimplify_va_arg_expr routines. */
6dad9361
TS
1919 if (ARGS_GROW_DOWNWARD)
1920 gcc_unreachable ();
4a7cb16f
AM
1921
1922 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
1923 if (indirect)
1924 type = build_pointer_type (type);
1925
1926 align = PARM_BOUNDARY / BITS_PER_UNIT;
1927 boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
1928
1929 /* When we align parameter on stack for caller, if the parameter
1930 alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
1931 aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee
1932 here with caller. */
1933 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
1934 boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
1935
1936 boundary /= BITS_PER_UNIT;
1937
1938 /* Hoist the valist value into a temporary for the moment. */
1939 valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
1940
1941 /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
1942 requires greater alignment, we must perform dynamic alignment. */
1943 if (boundary > align
1944 && !integer_zerop (TYPE_SIZE (type)))
1945 {
1946 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
1947 fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
1948 gimplify_and_add (t, pre_p);
1949
1950 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
1951 fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
1952 valist_tmp,
1953 build_int_cst (TREE_TYPE (valist), -boundary)));
1954 gimplify_and_add (t, pre_p);
1955 }
1956 else
1957 boundary = align;
1958
1959 /* If the actual alignment is less than the alignment of the type,
1960 adjust the type accordingly so that we don't assume strict alignment
1961 when dereferencing the pointer. */
1962 boundary *= BITS_PER_UNIT;
1963 if (boundary < TYPE_ALIGN (type))
1964 {
1965 type = build_variant_type_copy (type);
fe37c7af 1966 SET_TYPE_ALIGN (type, boundary);
4a7cb16f
AM
1967 }
1968
1969 /* Compute the rounded size of the type. */
1970 type_size = size_in_bytes (type);
1971 rounded_size = round_up (type_size, align);
1972
1973 /* Reduce rounded_size so it's sharable with the postqueue. */
1974 gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
1975
1976 /* Get AP. */
1977 addr = valist_tmp;
1978 if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
1979 {
1980 /* Small args are padded downward. */
1981 t = fold_build2_loc (input_location, GT_EXPR, sizetype,
1982 rounded_size, size_int (align));
1983 t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
1984 size_binop (MINUS_EXPR, rounded_size, type_size));
1985 addr = fold_build_pointer_plus (addr, t);
1986 }
1987
1988 /* Compute new value for AP. */
1989 t = fold_build_pointer_plus (valist_tmp, rounded_size);
1990 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
1991 gimplify_and_add (t, pre_p);
1992
1993 addr = fold_convert (build_pointer_type (type), addr);
1994
1995 if (indirect)
1996 addr = build_va_arg_indirect_ref (addr);
1997
1998 return build_va_arg_indirect_ref (addr);
1999}
2000
d5e254e1
IE
2001tree
2002default_chkp_bound_type (void)
2003{
2004 tree res = make_node (POINTER_BOUNDS_TYPE);
2005 TYPE_PRECISION (res) = TYPE_PRECISION (size_type_node) * 2;
2006 TYPE_NAME (res) = get_identifier ("__bounds_type");
2007 SET_TYPE_MODE (res, targetm.chkp_bound_mode ());
2008 layout_type (res);
2009 return res;
2010}
2011
b8506a8a 2012machine_mode
d5e254e1
IE
2013default_chkp_bound_mode (void)
2014{
2015 return VOIDmode;
2016}
2017
2018tree
2019default_builtin_chkp_function (unsigned int fcode ATTRIBUTE_UNUSED)
2020{
2021 return NULL_TREE;
2022}
2023
2024rtx
2025default_chkp_function_value_bounds (const_tree ret_type ATTRIBUTE_UNUSED,
2026 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
2027 bool outgoing ATTRIBUTE_UNUSED)
2028{
2029 gcc_unreachable ();
2030}
2031
2032tree
2033default_chkp_make_bounds_constant (HOST_WIDE_INT lb ATTRIBUTE_UNUSED,
2034 HOST_WIDE_INT ub ATTRIBUTE_UNUSED)
2035{
2036 return NULL_TREE;
2037}
2038
2039int
2040default_chkp_initialize_bounds (tree var ATTRIBUTE_UNUSED,
2041 tree lb ATTRIBUTE_UNUSED,
2042 tree ub ATTRIBUTE_UNUSED,
2043 tree *stmts ATTRIBUTE_UNUSED)
2044{
2045 return 0;
2046}
2047
2048void
2049default_setup_incoming_vararg_bounds (cumulative_args_t ca ATTRIBUTE_UNUSED,
b8506a8a 2050 machine_mode mode ATTRIBUTE_UNUSED,
d5e254e1
IE
2051 tree type ATTRIBUTE_UNUSED,
2052 int *pretend_arg_size ATTRIBUTE_UNUSED,
2053 int second_time ATTRIBUTE_UNUSED)
2054{
2055}
2056
1d0216c8
RS
2057/* An implementation of TARGET_CAN_USE_DOLOOP_P for targets that do
2058 not support nested low-overhead loops. */
2059
2060bool
807e902e 2061can_use_doloop_if_innermost (const widest_int &, const widest_int &,
1d0216c8
RS
2062 unsigned int loop_depth, bool)
2063{
2064 return loop_depth == 1;
2065}
4a7cb16f 2066
d95ab70a
RS
2067/* Default implementation of TARGET_OPTAB_SUPPORTED_P. */
2068
2069bool
2070default_optab_supported_p (int, machine_mode, machine_mode, optimization_type)
2071{
2072 return true;
2073}
2074
e914c11a
JG
2075/* Default implementation of TARGET_MAX_NOCE_IFCVT_SEQ_COST. */
2076
2077unsigned int
2078default_max_noce_ifcvt_seq_cost (edge e)
2079{
2080 bool predictable_p = predictable_edge_p (e);
2081
2082 enum compiler_param param
2083 = (predictable_p
2084 ? PARAM_MAX_RTL_IF_CONVERSION_PREDICTABLE_COST
2085 : PARAM_MAX_RTL_IF_CONVERSION_UNPREDICTABLE_COST);
2086
2087 /* If we have a parameter set, use that, otherwise take a guess using
2088 BRANCH_COST. */
2089 if (global_options_set.x_param_values[param])
2090 return PARAM_VALUE (param);
2091 else
2092 return BRANCH_COST (true, predictable_p) * COSTS_N_INSNS (3);
2093}
2094
894d8b41
EB
2095/* Default implementation of TARGET_MIN_ARITHMETIC_PRECISION. */
2096
2097unsigned int
2098default_min_arithmetic_precision (void)
2099{
2100 return WORD_REGISTER_OPERATIONS ? BITS_PER_WORD : BITS_PER_UNIT;
2101}
2102
42e02b20
JG
2103/* Default implementation of TARGET_C_EXCESS_PRECISION. */
2104
2105enum flt_eval_method
2106default_excess_precision (enum excess_precision_type ATTRIBUTE_UNUSED)
2107{
2108 return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
2109}
2110
7d69de61 2111#include "gt-targhooks.h"