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