xref: /dragonfly/contrib/gcc-8.0/gcc/targhooks.c (revision 38fd1498)
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