LCOV - code coverage report
Current view: top level - gcc - targhooks.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 53.7 % 877 471
Test Date: 2024-12-21 13:15:12 Functions: 48.2 % 195 94
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Default target hook functions.
       2                 :             :    Copyright (C) 2003-2024 Free Software Foundation, Inc.
       3                 :             : 
       4                 :             : This file is part of GCC.
       5                 :             : 
       6                 :             : GCC is free software; you can redistribute it and/or modify it under
       7                 :             : the terms of the GNU General Public License as published by the Free
       8                 :             : Software Foundation; either version 3, or (at your option) any later
       9                 :             : version.
      10                 :             : 
      11                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14                 :             : for more details.
      15                 :             : 
      16                 :             : You should have received a copy of the GNU General Public License
      17                 :             : along with GCC; see the file COPYING3.  If not see
      18                 :             : <http://www.gnu.org/licenses/>.  */
      19                 :             : 
      20                 :             : /* The migration of target macros to target hooks works as follows:
      21                 :             : 
      22                 :             :    1. Create a target hook that uses the existing target macros to
      23                 :             :       implement the same functionality.
      24                 :             : 
      25                 :             :    2. Convert all the MI files to use the hook instead of the macro.
      26                 :             : 
      27                 :             :    3. Repeat for a majority of the remaining target macros.  This will
      28                 :             :       take some time.
      29                 :             : 
      30                 :             :    4. Tell target maintainers to start migrating.
      31                 :             : 
      32                 :             :    5. Eventually convert the backends to override the hook instead of
      33                 :             :       defining the macros.  This will take some time too.
      34                 :             : 
      35                 :             :    6. TBD when, poison the macros.  Unmigrated targets will break at
      36                 :             :       this point.
      37                 :             : 
      38                 :             :    Note that we expect steps 1-3 to be done by the people that
      39                 :             :    understand what the MI does with each macro, and step 5 to be done
      40                 :             :    by the target maintainers for their respective targets.
      41                 :             : 
      42                 :             :    Note that steps 1 and 2 don't have to be done together, but no
      43                 :             :    target can override the new hook until step 2 is complete for it.
      44                 :             : 
      45                 :             :    Once the macros are poisoned, we will revert to the old migration
      46                 :             :    rules - migrate the macro, callers, and targets all at once.  This
      47                 :             :    comment can thus be removed at that point.  */
      48                 :             : 
      49                 :             : #include "config.h"
      50                 :             : #include "system.h"
      51                 :             : #include "coretypes.h"
      52                 :             : #include "target.h"
      53                 :             : #include "function.h"
      54                 :             : #include "rtl.h"
      55                 :             : #include "tree.h"
      56                 :             : #include "tree-ssa-alias.h"
      57                 :             : #include "gimple-expr.h"
      58                 :             : #include "memmodel.h"
      59                 :             : #include "backend.h"
      60                 :             : #include "emit-rtl.h"
      61                 :             : #include "df.h"
      62                 :             : #include "tm_p.h"
      63                 :             : #include "stringpool.h"
      64                 :             : #include "tree-vrp.h"
      65                 :             : #include "tree-ssanames.h"
      66                 :             : #include "profile-count.h"
      67                 :             : #include "optabs.h"
      68                 :             : #include "regs.h"
      69                 :             : #include "recog.h"
      70                 :             : #include "diagnostic-core.h"
      71                 :             : #include "fold-const.h"
      72                 :             : #include "stor-layout.h"
      73                 :             : #include "varasm.h"
      74                 :             : #include "flags.h"
      75                 :             : #include "explow.h"
      76                 :             : #include "expmed.h"
      77                 :             : #include "calls.h"
      78                 :             : #include "expr.h"
      79                 :             : #include "output.h"
      80                 :             : #include "common/common-target.h"
      81                 :             : #include "reload.h"
      82                 :             : #include "intl.h"
      83                 :             : #include "opts.h"
      84                 :             : #include "gimplify.h"
      85                 :             : #include "predict.h"
      86                 :             : #include "real.h"
      87                 :             : #include "langhooks.h"
      88                 :             : #include "sbitmap.h"
      89                 :             : #include "function-abi.h"
      90                 :             : #include "attribs.h"
      91                 :             : #include "asan.h"
      92                 :             : #include "emit-rtl.h"
      93                 :             : #include "gimple.h"
      94                 :             : #include "cfgloop.h"
      95                 :             : #include "tree-vectorizer.h"
      96                 :             : #include "options.h"
      97                 :             : #include "case-cfn-macros.h"
      98                 :             : #include "avoid-store-forwarding.h"
      99                 :             : 
     100                 :             : bool
     101                 :           0 : default_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
     102                 :             :                               rtx addr ATTRIBUTE_UNUSED,
     103                 :             :                               bool strict ATTRIBUTE_UNUSED,
     104                 :             :                               code_helper ATTRIBUTE_UNUSED)
     105                 :             : {
     106                 :             : #ifdef GO_IF_LEGITIMATE_ADDRESS
     107                 :             :   /* Defer to the old implementation using a goto.  */
     108                 :             :   if (strict)
     109                 :             :     return strict_memory_address_p (mode, addr);
     110                 :             :   else
     111                 :             :     return memory_address_p (mode, addr);
     112                 :             : #else
     113                 :           0 :   gcc_unreachable ();
     114                 :             : #endif
     115                 :             : }
     116                 :             : 
     117                 :             : void
     118                 :       25946 : default_external_libcall (rtx fun ATTRIBUTE_UNUSED)
     119                 :             : {
     120                 :             : #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
     121                 :       25946 :   ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
     122                 :             : #endif
     123                 :       25946 : }
     124                 :             : 
     125                 :             : int
     126                 :     5813318 : default_unspec_may_trap_p (const_rtx x, unsigned flags)
     127                 :             : {
     128                 :     5813318 :   int i;
     129                 :             : 
     130                 :             :   /* Any floating arithmetic may trap.  */
     131                 :     5813318 :   if ((SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math))
     132                 :             :     return 1;
     133                 :             : 
     134                 :    10055610 :   for (i = 0; i < XVECLEN (x, 0); ++i)
     135                 :             :     {
     136                 :     7290005 :       if (may_trap_p_1 (XVECEXP (x, 0, i), flags))
     137                 :             :         return 1;
     138                 :             :     }
     139                 :             : 
     140                 :             :   return 0;
     141                 :             : }
     142                 :             : 
     143                 :             : machine_mode
     144                 :    15493001 : default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
     145                 :             :                                machine_mode mode,
     146                 :             :                                int *punsignedp ATTRIBUTE_UNUSED,
     147                 :             :                                const_tree funtype ATTRIBUTE_UNUSED,
     148                 :             :                                int for_return ATTRIBUTE_UNUSED)
     149                 :             : {
     150                 :    15493001 :   if (type != NULL_TREE && for_return == 2)
     151                 :     3603539 :     return promote_mode (type, mode, punsignedp);
     152                 :             :   return mode;
     153                 :             : }
     154                 :             : 
     155                 :             : machine_mode
     156                 :           0 : default_promote_function_mode_always_promote (const_tree type,
     157                 :             :                                               machine_mode mode,
     158                 :             :                                               int *punsignedp,
     159                 :             :                                               const_tree funtype ATTRIBUTE_UNUSED,
     160                 :             :                                               int for_return ATTRIBUTE_UNUSED)
     161                 :             : {
     162                 :           0 :   return promote_mode (type, mode, punsignedp);
     163                 :             : }
     164                 :             : 
     165                 :             : machine_mode
     166                 :           0 : default_cc_modes_compatible (machine_mode m1, machine_mode m2)
     167                 :             : {
     168                 :           0 :   if (m1 == m2)
     169                 :           0 :     return m1;
     170                 :             :   return VOIDmode;
     171                 :             : }
     172                 :             : 
     173                 :             : bool
     174                 :           0 : default_return_in_memory (const_tree type,
     175                 :             :                           const_tree fntype ATTRIBUTE_UNUSED)
     176                 :             : {
     177                 :           0 :   return (TYPE_MODE (type) == BLKmode);
     178                 :             : }
     179                 :             : 
     180                 :             : rtx
     181                 :           0 : default_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
     182                 :             :                             machine_mode mode ATTRIBUTE_UNUSED)
     183                 :             : {
     184                 :           0 :   return x;
     185                 :             : }
     186                 :             : 
     187                 :             : bool
     188                 :          46 : default_legitimize_address_displacement (rtx *, rtx *, poly_int64,
     189                 :             :                                          machine_mode)
     190                 :             : {
     191                 :          46 :   return false;
     192                 :             : }
     193                 :             : 
     194                 :             : bool
     195                 :           0 : default_const_not_ok_for_debug_p (rtx x)
     196                 :             : {
     197                 :           0 :   if (GET_CODE (x) == UNSPEC)
     198                 :           0 :     return true;
     199                 :             :   return false;
     200                 :             : }
     201                 :             : 
     202                 :             : rtx
     203                 :           0 : default_expand_builtin_saveregs (void)
     204                 :             : {
     205                 :           0 :   error ("%<__builtin_saveregs%> not supported by this target");
     206                 :           0 :   return const0_rtx;
     207                 :             : }
     208                 :             : 
     209                 :             : void
     210                 :           0 : default_setup_incoming_varargs (cumulative_args_t,
     211                 :             :                                 const function_arg_info &, int *, int)
     212                 :             : {
     213                 :           0 : }
     214                 :             : 
     215                 :             : /* The default implementation of TARGET_BUILTIN_SETJMP_FRAME_VALUE.  */
     216                 :             : 
     217                 :             : rtx
     218                 :           0 : default_builtin_setjmp_frame_value (void)
     219                 :             : {
     220                 :           0 :   return virtual_stack_vars_rtx;
     221                 :             : }
     222                 :             : 
     223                 :             : /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns false.  */
     224                 :             : 
     225                 :             : bool
     226                 :           0 : hook_bool_CUMULATIVE_ARGS_false (cumulative_args_t ca ATTRIBUTE_UNUSED)
     227                 :             : {
     228                 :           0 :   return false;
     229                 :             : }
     230                 :             : 
     231                 :             : bool
     232                 :           0 : default_pretend_outgoing_varargs_named (cumulative_args_t ca ATTRIBUTE_UNUSED)
     233                 :             : {
     234                 :           0 :   return (targetm.calls.setup_incoming_varargs
     235                 :           0 :           != default_setup_incoming_varargs);
     236                 :             : }
     237                 :             : 
     238                 :             : scalar_int_mode
     239                 :      493132 : default_eh_return_filter_mode (void)
     240                 :             : {
     241                 :      493132 :   return targetm.unwind_word_mode ();
     242                 :             : }
     243                 :             : 
     244                 :             : scalar_int_mode
     245                 :       44625 : default_libgcc_cmp_return_mode (void)
     246                 :             : {
     247                 :       44625 :   return word_mode;
     248                 :             : }
     249                 :             : 
     250                 :             : scalar_int_mode
     251                 :         308 : default_libgcc_shift_count_mode (void)
     252                 :             : {
     253                 :         308 :   return word_mode;
     254                 :             : }
     255                 :             : 
     256                 :             : scalar_int_mode
     257                 :      720107 : default_unwind_word_mode (void)
     258                 :             : {
     259                 :      720107 :   return word_mode;
     260                 :             : }
     261                 :             : 
     262                 :             : /* The default implementation of TARGET_SHIFT_TRUNCATION_MASK.  */
     263                 :             : 
     264                 :             : unsigned HOST_WIDE_INT
     265                 :           1 : default_shift_truncation_mask (machine_mode mode)
     266                 :             : {
     267                 :           1 :   return SHIFT_COUNT_TRUNCATED ? GET_MODE_UNIT_BITSIZE (mode) - 1 : 0;
     268                 :             : }
     269                 :             : 
     270                 :             : /* The default implementation of TARGET_MIN_DIVISIONS_FOR_RECIP_MUL.  */
     271                 :             : 
     272                 :             : unsigned int
     273                 :      196616 : default_min_divisions_for_recip_mul (machine_mode mode ATTRIBUTE_UNUSED)
     274                 :             : {
     275                 :      196616 :   return have_insn_for (DIV, mode) ? 3 : 2;
     276                 :             : }
     277                 :             : 
     278                 :             : /* The default implementation of TARGET_MODE_REP_EXTENDED.  */
     279                 :             : 
     280                 :             : int
     281                 :    21136575 : default_mode_rep_extended (scalar_int_mode, scalar_int_mode)
     282                 :             : {
     283                 :    21136575 :   return UNKNOWN;
     284                 :             : }
     285                 :             : 
     286                 :             : /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true.  */
     287                 :             : 
     288                 :             : bool
     289                 :     5573957 : hook_bool_CUMULATIVE_ARGS_true (cumulative_args_t a ATTRIBUTE_UNUSED)
     290                 :             : {
     291                 :     5573957 :   return true;
     292                 :             : }
     293                 :             : 
     294                 :             : /* Return machine mode for non-standard suffix
     295                 :             :    or VOIDmode if non-standard suffixes are unsupported.  */
     296                 :             : machine_mode
     297                 :           0 : default_mode_for_suffix (char suffix ATTRIBUTE_UNUSED)
     298                 :             : {
     299                 :           0 :   return VOIDmode;
     300                 :             : }
     301                 :             : 
     302                 :             : /* Return machine mode for a floating type which is indicated
     303                 :             :    by the given enum tree_index.  */
     304                 :             : 
     305                 :             : machine_mode
     306                 :     2955110 : default_mode_for_floating_type (enum tree_index ti)
     307                 :             : {
     308                 :     2955110 :   if (ti == TI_FLOAT_TYPE)
     309                 :             :     return SFmode;
     310                 :     1458142 :   gcc_assert (ti == TI_DOUBLE_TYPE || ti == TI_LONG_DOUBLE_TYPE);
     311                 :             :   return DFmode;
     312                 :             : }
     313                 :             : 
     314                 :             : /* The generic C++ ABI specifies this is a 64-bit value.  */
     315                 :             : tree
     316                 :        4041 : default_cxx_guard_type (void)
     317                 :             : {
     318                 :        4041 :   return long_long_integer_type_node;
     319                 :             : }
     320                 :             : 
     321                 :             : /* Returns the size of the cookie to use when allocating an array
     322                 :             :    whose elements have the indicated TYPE.  Assumes that it is already
     323                 :             :    known that a cookie is needed.  */
     324                 :             : 
     325                 :             : tree
     326                 :       76652 : default_cxx_get_cookie_size (tree type)
     327                 :             : {
     328                 :       76652 :   tree cookie_size;
     329                 :             : 
     330                 :             :   /* We need to allocate an additional max (sizeof (size_t), alignof
     331                 :             :      (true_type)) bytes.  */
     332                 :       76652 :   tree sizetype_size;
     333                 :       76652 :   tree type_align;
     334                 :             : 
     335                 :       76652 :   sizetype_size = size_in_bytes (sizetype);
     336                 :       76652 :   type_align = size_int (TYPE_ALIGN_UNIT (type));
     337                 :       76652 :   if (tree_int_cst_lt (type_align, sizetype_size))
     338                 :             :     cookie_size = sizetype_size;
     339                 :             :   else
     340                 :       10858 :     cookie_size = type_align;
     341                 :             : 
     342                 :       76652 :   return cookie_size;
     343                 :             : }
     344                 :             : 
     345                 :             : /* Returns modified FUNCTION_TYPE for cdtor callabi.  */
     346                 :             : 
     347                 :             : tree
     348                 :           0 : default_cxx_adjust_cdtor_callabi_fntype (tree fntype)
     349                 :             : {
     350                 :           0 :   return fntype;
     351                 :             : }
     352                 :             : 
     353                 :             : /* Return true if a parameter must be passed by reference.  This version
     354                 :             :    of the TARGET_PASS_BY_REFERENCE hook uses just MUST_PASS_IN_STACK.  */
     355                 :             : 
     356                 :             : bool
     357                 :           0 : hook_pass_by_reference_must_pass_in_stack (cumulative_args_t,
     358                 :             :                                            const function_arg_info &arg)
     359                 :             : {
     360                 :           0 :   return targetm.calls.must_pass_in_stack (arg);
     361                 :             : }
     362                 :             : 
     363                 :             : /* Return true if a parameter follows callee copies conventions.  This
     364                 :             :    version of the hook is true for all named arguments.  */
     365                 :             : 
     366                 :             : bool
     367                 :           0 : hook_callee_copies_named (cumulative_args_t, const function_arg_info &arg)
     368                 :             : {
     369                 :           0 :   return arg.named;
     370                 :             : }
     371                 :             : 
     372                 :             : /* Emit to STREAM the assembler syntax for insn operand X.  */
     373                 :             : 
     374                 :             : void
     375                 :           0 : default_print_operand (FILE *stream ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
     376                 :             :                        int code ATTRIBUTE_UNUSED)
     377                 :             : {
     378                 :             : #ifdef PRINT_OPERAND
     379                 :             :   PRINT_OPERAND (stream, x, code);
     380                 :             : #else
     381                 :           0 :   gcc_unreachable ();
     382                 :             : #endif
     383                 :             : }
     384                 :             : 
     385                 :             : /* Emit to STREAM the assembler syntax for an insn operand whose memory
     386                 :             :    address is X.  */
     387                 :             : 
     388                 :             : void
     389                 :           0 : default_print_operand_address (FILE *stream ATTRIBUTE_UNUSED,
     390                 :             :                                machine_mode /*mode*/,
     391                 :             :                                rtx x ATTRIBUTE_UNUSED)
     392                 :             : {
     393                 :             : #ifdef PRINT_OPERAND_ADDRESS
     394                 :             :   PRINT_OPERAND_ADDRESS (stream, x);
     395                 :             : #else
     396                 :           0 :   gcc_unreachable ();
     397                 :             : #endif
     398                 :             : }
     399                 :             : 
     400                 :             : /* Return true if CODE is a valid punctuation character for the
     401                 :             :    `print_operand' hook.  */
     402                 :             : 
     403                 :             : bool
     404                 :           0 : default_print_operand_punct_valid_p (unsigned char code ATTRIBUTE_UNUSED)
     405                 :             : {
     406                 :             : #ifdef PRINT_OPERAND_PUNCT_VALID_P
     407                 :             :   return PRINT_OPERAND_PUNCT_VALID_P (code);
     408                 :             : #else
     409                 :           0 :   return false;
     410                 :             : #endif
     411                 :             : }
     412                 :             : 
     413                 :             : /* The default implementation of TARGET_MANGLE_ASSEMBLER_NAME.  */
     414                 :             : tree
     415                 :      540148 : default_mangle_assembler_name (const char *name ATTRIBUTE_UNUSED)
     416                 :             : {
     417                 :      540148 :   const char *skipped = name + (*name == '*' ? 1 : 0);
     418                 :      540148 :   const char *stripped = targetm.strip_name_encoding (skipped);
     419                 :      540148 :   if (*name != '*' && user_label_prefix[0])
     420                 :           0 :     stripped = ACONCAT ((user_label_prefix, stripped, NULL));
     421                 :      540148 :   return get_identifier (stripped);
     422                 :             : }
     423                 :             : 
     424                 :             : /* The default implementation of TARGET_TRANSLATE_MODE_ATTRIBUTE.  */
     425                 :             : 
     426                 :             : machine_mode
     427                 :       52711 : default_translate_mode_attribute (machine_mode mode)
     428                 :             : {
     429                 :       52711 :   return mode;
     430                 :             : }
     431                 :             : 
     432                 :             : /* True if MODE is valid for the target.  By "valid", we mean able to
     433                 :             :    be manipulated in non-trivial ways.  In particular, this means all
     434                 :             :    the arithmetic is supported.
     435                 :             : 
     436                 :             :    By default we guess this means that any C type is supported.  If
     437                 :             :    we can't map the mode back to a type that would be available in C,
     438                 :             :    then reject it.  Special case, here, is the double-word arithmetic
     439                 :             :    supported by optabs.cc.  */
     440                 :             : 
     441                 :             : bool
     442                 :     2686255 : default_scalar_mode_supported_p (scalar_mode mode)
     443                 :             : {
     444                 :     2686255 :   int precision = GET_MODE_PRECISION (mode);
     445                 :             : 
     446                 :     2686255 :   switch (GET_MODE_CLASS (mode))
     447                 :             :     {
     448                 :     1469159 :     case MODE_PARTIAL_INT:
     449                 :     1469159 :     case MODE_INT:
     450                 :     1469159 :       if (precision == CHAR_TYPE_SIZE)
     451                 :             :         return true;
     452                 :     1435871 :       if (precision == SHORT_TYPE_SIZE)
     453                 :             :         return true;
     454                 :     1401988 :       if (precision == INT_TYPE_SIZE)
     455                 :             :         return true;
     456                 :     1387834 :       if (precision == LONG_TYPE_SIZE)
     457                 :             :         return true;
     458                 :     1292117 :       if (precision == LONG_LONG_TYPE_SIZE)
     459                 :             :         return true;
     460                 :     1321241 :       if (precision == 2 * BITS_PER_WORD)
     461                 :             :         return true;
     462                 :             :       return false;
     463                 :             : 
     464                 :     1217096 :     case MODE_FLOAT:
     465                 :     1217096 :       if (mode == targetm.c.mode_for_floating_type (TI_FLOAT_TYPE))
     466                 :             :         return true;
     467                 :      904514 :       if (mode == targetm.c.mode_for_floating_type (TI_DOUBLE_TYPE))
     468                 :             :         return true;
     469                 :      312128 :       if (mode == targetm.c.mode_for_floating_type (TI_LONG_DOUBLE_TYPE))
     470                 :             :         return true;
     471                 :             :       return false;
     472                 :             : 
     473                 :             :     case MODE_DECIMAL_FLOAT:
     474                 :             :     case MODE_FRACT:
     475                 :             :     case MODE_UFRACT:
     476                 :             :     case MODE_ACCUM:
     477                 :             :     case MODE_UACCUM:
     478                 :             :       return false;
     479                 :             : 
     480                 :           0 :     default:
     481                 :           0 :       gcc_unreachable ();
     482                 :             :     }
     483                 :             : }
     484                 :             : 
     485                 :             : /* Return true if libgcc supports floating-point mode MODE (known to
     486                 :             :    be supported as a scalar mode).  */
     487                 :             : 
     488                 :             : bool
     489                 :     1524768 : default_libgcc_floating_mode_supported_p (scalar_float_mode mode)
     490                 :             : {
     491                 :     1524768 :   switch (mode)
     492                 :             :     {
     493                 :             : #ifdef HAVE_SFmode
     494                 :             :     case E_SFmode:
     495                 :             : #endif
     496                 :             : #ifdef HAVE_DFmode
     497                 :             :     case E_DFmode:
     498                 :             : #endif
     499                 :             : #ifdef HAVE_XFmode
     500                 :             :     case E_XFmode:
     501                 :             : #endif
     502                 :             : #ifdef HAVE_TFmode
     503                 :             :     case E_TFmode:
     504                 :             : #endif
     505                 :             :       return true;
     506                 :             : 
     507                 :           0 :     default:
     508                 :           0 :       return false;
     509                 :             :     }
     510                 :             : }
     511                 :             : 
     512                 :             : /* Return the machine mode to use for the type _FloatN, if EXTENDED is
     513                 :             :    false, or _FloatNx, if EXTENDED is true, or VOIDmode if not
     514                 :             :    supported.  */
     515                 :             : opt_scalar_float_mode
     516                 :     1958684 : default_floatn_mode (int n, bool extended)
     517                 :             : {
     518                 :     1958684 :   if (extended)
     519                 :             :     {
     520                 :      839436 :       opt_scalar_float_mode cand1, cand2;
     521                 :      839436 :       scalar_float_mode mode;
     522                 :      839436 :       switch (n)
     523                 :             :         {
     524                 :      279812 :         case 32:
     525                 :             : #ifdef HAVE_DFmode
     526                 :      279812 :           cand1 = DFmode;
     527                 :             : #endif
     528                 :      279812 :           break;
     529                 :             : 
     530                 :      279812 :         case 64:
     531                 :             : #ifdef HAVE_XFmode
     532                 :      279812 :           cand1 = XFmode;
     533                 :             : #endif
     534                 :             : #ifdef HAVE_TFmode
     535                 :      279812 :           cand2 = TFmode;
     536                 :             : #endif
     537                 :      279812 :           break;
     538                 :             : 
     539                 :             :         case 128:
     540                 :             :           break;
     541                 :             : 
     542                 :           0 :         default:
     543                 :             :           /* Those are the only valid _FloatNx types.  */
     544                 :           0 :           gcc_unreachable ();
     545                 :             :         }
     546                 :      839436 :       if (cand1.exists (&mode)
     547                 :      559624 :           && REAL_MODE_FORMAT (mode)->ieee_bits > n
     548                 :      559624 :           && targetm.scalar_mode_supported_p (mode)
     549                 :      559602 :           && targetm.libgcc_floating_mode_supported_p (mode))
     550                 :      559602 :         return cand1;
     551                 :      279834 :       if (cand2.exists (&mode)
     552                 :          22 :           && REAL_MODE_FORMAT (mode)->ieee_bits > n
     553                 :      279834 :           && targetm.scalar_mode_supported_p (mode)
     554                 :          22 :           && targetm.libgcc_floating_mode_supported_p (mode))
     555                 :          22 :         return cand2;
     556                 :             :     }
     557                 :             :   else
     558                 :             :     {
     559                 :     1119248 :       opt_scalar_float_mode cand;
     560                 :     1119248 :       scalar_float_mode mode;
     561                 :     1119248 :       switch (n)
     562                 :             :         {
     563                 :      279812 :         case 16:
     564                 :             :           /* Always enable _Float16 if we have basic support for the mode.
     565                 :             :              Targets can control the range and precision of operations on
     566                 :             :              the _Float16 type using TARGET_C_EXCESS_PRECISION.  */
     567                 :             : #ifdef HAVE_HFmode
     568                 :      279812 :           cand = HFmode;
     569                 :             : #endif
     570                 :      279812 :           break;
     571                 :             : 
     572                 :      279812 :         case 32:
     573                 :             : #ifdef HAVE_SFmode
     574                 :      279812 :           cand = SFmode;
     575                 :             : #endif
     576                 :      279812 :           break;
     577                 :             : 
     578                 :      279812 :         case 64:
     579                 :             : #ifdef HAVE_DFmode
     580                 :      279812 :           cand = DFmode;
     581                 :             : #endif
     582                 :      279812 :           break;
     583                 :             : 
     584                 :      279812 :         case 128:
     585                 :             : #ifdef HAVE_TFmode
     586                 :      279812 :           cand = TFmode;
     587                 :             : #endif
     588                 :      279812 :           break;
     589                 :             : 
     590                 :             :         default:
     591                 :             :           break;
     592                 :             :         }
     593                 :     1119248 :       if (cand.exists (&mode)
     594                 :     1119248 :           && REAL_MODE_FORMAT (mode)->ieee_bits == n
     595                 :     1119248 :           && targetm.scalar_mode_supported_p (mode)
     596                 :     1119248 :           && targetm.libgcc_floating_mode_supported_p (mode))
     597                 :     1119248 :         return cand;
     598                 :             :     }
     599                 :      279812 :   return opt_scalar_float_mode ();
     600                 :             : }
     601                 :             : 
     602                 :             : /* Define this to return true if the _Floatn and _Floatnx built-in functions
     603                 :             :    should implicitly enable the built-in function without the __builtin_ prefix
     604                 :             :    in addition to the normal built-in function with the __builtin_ prefix.  The
     605                 :             :    default is to only enable built-in functions without the __builtin_ prefix
     606                 :             :    for the GNU C langauge.  The argument FUNC is the enum builtin_in_function
     607                 :             :    id of the function to be enabled.  */
     608                 :             : 
     609                 :             : bool
     610                 :   120633660 : default_floatn_builtin_p (int func ATTRIBUTE_UNUSED)
     611                 :             : {
     612                 :   120633660 :   static bool first_time_p = true;
     613                 :   120633660 :   static bool c_or_objective_c;
     614                 :             : 
     615                 :   120633660 :   if (first_time_p)
     616                 :             :     {
     617                 :      226755 :       first_time_p = false;
     618                 :      337371 :       c_or_objective_c = lang_GNU_C () || lang_GNU_OBJC ();
     619                 :             :     }
     620                 :             : 
     621                 :   120633660 :   return c_or_objective_c;
     622                 :             : }
     623                 :             : 
     624                 :             : /* Make some target macros useable by target-independent code.  */
     625                 :             : bool
     626                 :           0 : targhook_words_big_endian (void)
     627                 :             : {
     628                 :           0 :   return !!WORDS_BIG_ENDIAN;
     629                 :             : }
     630                 :             : 
     631                 :             : bool
     632                 :      203935 : targhook_float_words_big_endian (void)
     633                 :             : {
     634                 :      203935 :   return !!FLOAT_WORDS_BIG_ENDIAN;
     635                 :             : }
     636                 :             : 
     637                 :             : /* True if the target supports floating-point exceptions and rounding
     638                 :             :    modes.  */
     639                 :             : 
     640                 :             : bool
     641                 :           0 : default_float_exceptions_rounding_supported_p (void)
     642                 :             : {
     643                 :             : #ifdef HAVE_adddf3
     644                 :           0 :   return HAVE_adddf3;
     645                 :             : #else
     646                 :             :   return false;
     647                 :             : #endif
     648                 :             : }
     649                 :             : 
     650                 :             : /* True if the target supports decimal floating point.  */
     651                 :             : 
     652                 :             : bool
     653                 :     1205310 : default_decimal_float_supported_p (void)
     654                 :             : {
     655                 :     1205310 :   return ENABLE_DECIMAL_FLOAT;
     656                 :             : }
     657                 :             : 
     658                 :             : /* True if the target supports fixed-point arithmetic.  */
     659                 :             : 
     660                 :             : bool
     661                 :      406389 : default_fixed_point_supported_p (void)
     662                 :             : {
     663                 :      406389 :   return ENABLE_FIXED_POINT;
     664                 :             : }
     665                 :             : 
     666                 :             : /* True if the target supports GNU indirect functions.  */
     667                 :             : 
     668                 :             : bool
     669                 :         475 : default_has_ifunc_p (void)
     670                 :             : {
     671                 :         475 :   return HAVE_GNU_INDIRECT_FUNCTION;
     672                 :             : }
     673                 :             : 
     674                 :             : /* Return true if we predict the loop LOOP will be transformed to a
     675                 :             :    low-overhead loop, otherwise return false.
     676                 :             : 
     677                 :             :    By default, false is returned, as this hook's applicability should be
     678                 :             :    verified for each target.  Target maintainers should re-define the hook
     679                 :             :    if the target can take advantage of it.  */
     680                 :             : 
     681                 :             : bool
     682                 :      463128 : default_predict_doloop_p (class loop *loop ATTRIBUTE_UNUSED)
     683                 :             : {
     684                 :      463128 :   return false;
     685                 :             : }
     686                 :             : 
     687                 :             : /* By default, just use the input MODE itself.  */
     688                 :             : 
     689                 :             : machine_mode
     690                 :           0 : default_preferred_doloop_mode (machine_mode mode)
     691                 :             : {
     692                 :           0 :   return mode;
     693                 :             : }
     694                 :             : 
     695                 :             : /* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
     696                 :             :    an error message.
     697                 :             : 
     698                 :             :    This function checks whether a given INSN is valid within a low-overhead
     699                 :             :    loop.  If INSN is invalid it returns the reason for that, otherwise it
     700                 :             :    returns NULL. A called function may clobber any special registers required
     701                 :             :    for low-overhead looping. Additionally, some targets (eg, PPC) use the count
     702                 :             :    register for branch on table instructions. We reject the doloop pattern in
     703                 :             :    these cases.  */
     704                 :             : 
     705                 :             : const char *
     706                 :           0 : default_invalid_within_doloop (const rtx_insn *insn)
     707                 :             : {
     708                 :           0 :   if (CALL_P (insn))
     709                 :             :     return "Function call in loop.";
     710                 :             : 
     711                 :           0 :   if (tablejump_p (insn, NULL, NULL) || computed_jump_p (insn))
     712                 :           0 :     return "Computed branch in the loop.";
     713                 :             : 
     714                 :             :   return NULL;
     715                 :             : }
     716                 :             : 
     717                 :             : /* Mapping of builtin functions to vectorized variants.  */
     718                 :             : 
     719                 :             : tree
     720                 :           0 : default_builtin_vectorized_function (unsigned int, tree, tree)
     721                 :             : {
     722                 :           0 :   return NULL_TREE;
     723                 :             : }
     724                 :             : 
     725                 :             : /* Mapping of target builtin functions to vectorized variants.  */
     726                 :             : 
     727                 :             : tree
     728                 :          36 : default_builtin_md_vectorized_function (tree, tree, tree)
     729                 :             : {
     730                 :          36 :   return NULL_TREE;
     731                 :             : }
     732                 :             : 
     733                 :             : /* Default vectorizer cost model values.  */
     734                 :             : 
     735                 :             : int
     736                 :           0 : default_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
     737                 :             :                                     tree vectype,
     738                 :             :                                     int misalign ATTRIBUTE_UNUSED)
     739                 :             : {
     740                 :           0 :   switch (type_of_cost)
     741                 :             :     {
     742                 :             :       case scalar_stmt:
     743                 :             :       case scalar_load:
     744                 :             :       case scalar_store:
     745                 :             :       case vector_stmt:
     746                 :             :       case vector_load:
     747                 :             :       case vector_store:
     748                 :             :       case vec_to_scalar:
     749                 :             :       case scalar_to_vec:
     750                 :             :       case cond_branch_not_taken:
     751                 :             :       case vec_perm:
     752                 :             :       case vec_promote_demote:
     753                 :             :         return 1;
     754                 :             : 
     755                 :           0 :       case unaligned_load:
     756                 :           0 :       case unaligned_store:
     757                 :           0 :         return 2;
     758                 :             : 
     759                 :           0 :       case cond_branch_taken:
     760                 :           0 :         return 3;
     761                 :             : 
     762                 :           0 :       case vec_construct:
     763                 :           0 :         return estimated_poly_value (TYPE_VECTOR_SUBPARTS (vectype)) - 1;
     764                 :             : 
     765                 :           0 :       default:
     766                 :           0 :         gcc_unreachable ();
     767                 :             :     }
     768                 :             : }
     769                 :             : 
     770                 :             : /* Reciprocal.  */
     771                 :             : 
     772                 :             : tree
     773                 :           0 : default_builtin_reciprocal (tree)
     774                 :             : {
     775                 :           0 :   return NULL_TREE;
     776                 :             : }
     777                 :             : 
     778                 :             : void
     779                 :           0 : default_emit_support_tinfos (emit_support_tinfos_callback)
     780                 :             : {
     781                 :           0 : }
     782                 :             : 
     783                 :             : bool
     784                 :        5304 : hook_bool_CUMULATIVE_ARGS_arg_info_false (cumulative_args_t,
     785                 :             :                                           const function_arg_info &)
     786                 :             : {
     787                 :        5304 :   return false;
     788                 :             : }
     789                 :             : 
     790                 :             : bool
     791                 :           0 : hook_bool_CUMULATIVE_ARGS_arg_info_true (cumulative_args_t,
     792                 :             :                                          const function_arg_info &)
     793                 :             : {
     794                 :           0 :   return true;
     795                 :             : }
     796                 :             : 
     797                 :             : int
     798                 :    11631190 : hook_int_CUMULATIVE_ARGS_arg_info_0 (cumulative_args_t,
     799                 :             :                                      const function_arg_info &)
     800                 :             : {
     801                 :    11631190 :   return 0;
     802                 :             : }
     803                 :             : 
     804                 :             : void
     805                 :    11343230 : hook_void_CUMULATIVE_ARGS (cumulative_args_t)
     806                 :             : {
     807                 :    11343230 : }
     808                 :             : 
     809                 :             : void
     810                 :           0 : hook_void_CUMULATIVE_ARGS_tree (cumulative_args_t ca ATTRIBUTE_UNUSED,
     811                 :             :                                 tree ATTRIBUTE_UNUSED)
     812                 :             : {
     813                 :           0 : }
     814                 :             : 
     815                 :             : void
     816                 :    11029058 : hook_void_CUMULATIVE_ARGS_rtx_tree (cumulative_args_t, rtx, tree)
     817                 :             : {
     818                 :    11029058 : }
     819                 :             : 
     820                 :             : /* Default implementation of TARGET_PUSH_ARGUMENT.  */
     821                 :             : 
     822                 :             : bool
     823                 :           0 : default_push_argument (unsigned int)
     824                 :             : {
     825                 :             : #ifdef PUSH_ROUNDING
     826                 :           0 :   return !ACCUMULATE_OUTGOING_ARGS;
     827                 :             : #else
     828                 :             :   return false;
     829                 :             : #endif
     830                 :             : }
     831                 :             : 
     832                 :             : void
     833                 :           0 : default_function_arg_advance (cumulative_args_t, const function_arg_info &)
     834                 :             : {
     835                 :           0 :   gcc_unreachable ();
     836                 :             : }
     837                 :             : 
     838                 :             : /* Default implementation of TARGET_FUNCTION_ARG_OFFSET.  */
     839                 :             : 
     840                 :             : HOST_WIDE_INT
     841                 :     5308194 : default_function_arg_offset (machine_mode, const_tree)
     842                 :             : {
     843                 :     5308194 :   return 0;
     844                 :             : }
     845                 :             : 
     846                 :             : /* Default implementation of TARGET_FUNCTION_ARG_PADDING: usually pad
     847                 :             :    upward, but pad short args downward on big-endian machines.  */
     848                 :             : 
     849                 :             : pad_direction
     850                 :    11822419 : default_function_arg_padding (machine_mode mode, const_tree type)
     851                 :             : {
     852                 :    11822419 :   if (!BYTES_BIG_ENDIAN)
     853                 :    11822419 :     return PAD_UPWARD;
     854                 :             : 
     855                 :             :   unsigned HOST_WIDE_INT size;
     856                 :             :   if (mode == BLKmode)
     857                 :             :     {
     858                 :             :       if (!type || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
     859                 :             :         return PAD_UPWARD;
     860                 :             :       size = int_size_in_bytes (type);
     861                 :             :     }
     862                 :             :   else
     863                 :             :     /* Targets with variable-sized modes must override this hook
     864                 :             :        and handle variable-sized modes explicitly.  */
     865                 :             :     size = GET_MODE_SIZE (mode).to_constant ();
     866                 :             : 
     867                 :             :   if (size < (PARM_BOUNDARY / BITS_PER_UNIT))
     868                 :             :     return PAD_DOWNWARD;
     869                 :             : 
     870                 :             :   return PAD_UPWARD;
     871                 :             : }
     872                 :             : 
     873                 :             : rtx
     874                 :           0 : default_function_arg (cumulative_args_t, const function_arg_info &)
     875                 :             : {
     876                 :           0 :   gcc_unreachable ();
     877                 :             : }
     878                 :             : 
     879                 :             : rtx
     880                 :           0 : default_function_incoming_arg (cumulative_args_t, const function_arg_info &)
     881                 :             : {
     882                 :           0 :   gcc_unreachable ();
     883                 :             : }
     884                 :             : 
     885                 :             : unsigned int
     886                 :           0 : default_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED,
     887                 :             :                                const_tree type ATTRIBUTE_UNUSED)
     888                 :             : {
     889                 :           0 :   return PARM_BOUNDARY;
     890                 :             : }
     891                 :             : 
     892                 :             : unsigned int
     893                 :     5308194 : default_function_arg_round_boundary (machine_mode mode ATTRIBUTE_UNUSED,
     894                 :             :                                      const_tree type ATTRIBUTE_UNUSED)
     895                 :             : {
     896                 :     5308194 :   return PARM_BOUNDARY;
     897                 :             : }
     898                 :             : 
     899                 :             : void
     900                 :           0 : hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
     901                 :             : {
     902                 :           0 : }
     903                 :             : 
     904                 :             : const char *
     905                 :      784186 : hook_invalid_arg_for_unprototyped_fn (
     906                 :             :         const_tree typelist ATTRIBUTE_UNUSED,
     907                 :             :         const_tree funcdecl ATTRIBUTE_UNUSED,
     908                 :             :         const_tree val ATTRIBUTE_UNUSED)
     909                 :             : {
     910                 :      784186 :   return NULL;
     911                 :             : }
     912                 :             : 
     913                 :             : /* Initialize the stack protection decls.  */
     914                 :             : 
     915                 :             : /* Stack protection related decls living in libgcc.  */
     916                 :             : static GTY(()) tree stack_chk_guard_decl;
     917                 :             : 
     918                 :             : tree
     919                 :           0 : default_stack_protect_guard (void)
     920                 :             : {
     921                 :           0 :   tree t = stack_chk_guard_decl;
     922                 :             : 
     923                 :           0 :   if (t == NULL)
     924                 :             :     {
     925                 :           0 :       rtx x;
     926                 :             : 
     927                 :           0 :       t = build_decl (UNKNOWN_LOCATION,
     928                 :             :                       VAR_DECL, get_identifier ("__stack_chk_guard"),
     929                 :             :                       ptr_type_node);
     930                 :           0 :       TREE_STATIC (t) = 1;
     931                 :           0 :       TREE_PUBLIC (t) = 1;
     932                 :           0 :       DECL_EXTERNAL (t) = 1;
     933                 :           0 :       TREE_USED (t) = 1;
     934                 :           0 :       TREE_THIS_VOLATILE (t) = 1;
     935                 :           0 :       DECL_ARTIFICIAL (t) = 1;
     936                 :           0 :       DECL_IGNORED_P (t) = 1;
     937                 :             : 
     938                 :             :       /* Do not share RTL as the declaration is visible outside of
     939                 :             :          current function.  */
     940                 :           0 :       x = DECL_RTL (t);
     941                 :           0 :       RTX_FLAG (x, used) = 1;
     942                 :             : 
     943                 :           0 :       stack_chk_guard_decl = t;
     944                 :             :     }
     945                 :             : 
     946                 :           0 :   return t;
     947                 :             : }
     948                 :             : 
     949                 :             : static GTY(()) tree stack_chk_fail_decl;
     950                 :             : 
     951                 :             : tree
     952                 :         232 : default_external_stack_protect_fail (void)
     953                 :             : {
     954                 :         232 :   tree t = stack_chk_fail_decl;
     955                 :             : 
     956                 :         232 :   if (t == NULL_TREE)
     957                 :             :     {
     958                 :         141 :       t = build_function_type_list (void_type_node, NULL_TREE);
     959                 :         141 :       t = build_decl (UNKNOWN_LOCATION,
     960                 :             :                       FUNCTION_DECL, get_identifier ("__stack_chk_fail"), t);
     961                 :         141 :       TREE_STATIC (t) = 1;
     962                 :         141 :       TREE_PUBLIC (t) = 1;
     963                 :         141 :       DECL_EXTERNAL (t) = 1;
     964                 :         141 :       TREE_USED (t) = 1;
     965                 :         141 :       TREE_THIS_VOLATILE (t) = 1;
     966                 :         141 :       TREE_NOTHROW (t) = 1;
     967                 :         141 :       DECL_ARTIFICIAL (t) = 1;
     968                 :         141 :       DECL_IGNORED_P (t) = 1;
     969                 :         141 :       DECL_VISIBILITY (t) = VISIBILITY_DEFAULT;
     970                 :         141 :       DECL_VISIBILITY_SPECIFIED (t) = 1;
     971                 :             : 
     972                 :         141 :       stack_chk_fail_decl = t;
     973                 :             :     }
     974                 :             : 
     975                 :         232 :   return build_call_expr (t, 0);
     976                 :             : }
     977                 :             : 
     978                 :             : tree
     979                 :           1 : default_hidden_stack_protect_fail (void)
     980                 :             : {
     981                 :             : #ifndef HAVE_GAS_HIDDEN
     982                 :             :   return default_external_stack_protect_fail ();
     983                 :             : #else
     984                 :           1 :   tree t = stack_chk_fail_decl;
     985                 :             : 
     986                 :           1 :   if (!flag_pic)
     987                 :           1 :     return default_external_stack_protect_fail ();
     988                 :             : 
     989                 :           0 :   if (t == NULL_TREE)
     990                 :             :     {
     991                 :           0 :       t = build_function_type_list (void_type_node, NULL_TREE);
     992                 :           0 :       t = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
     993                 :             :                       get_identifier ("__stack_chk_fail_local"), t);
     994                 :           0 :       TREE_STATIC (t) = 1;
     995                 :           0 :       TREE_PUBLIC (t) = 1;
     996                 :           0 :       DECL_EXTERNAL (t) = 1;
     997                 :           0 :       TREE_USED (t) = 1;
     998                 :           0 :       TREE_THIS_VOLATILE (t) = 1;
     999                 :           0 :       TREE_NOTHROW (t) = 1;
    1000                 :           0 :       DECL_ARTIFICIAL (t) = 1;
    1001                 :           0 :       DECL_IGNORED_P (t) = 1;
    1002                 :           0 :       DECL_VISIBILITY_SPECIFIED (t) = 1;
    1003                 :           0 :       DECL_VISIBILITY (t) = VISIBILITY_HIDDEN;
    1004                 :             : 
    1005                 :           0 :       stack_chk_fail_decl = t;
    1006                 :             :     }
    1007                 :             : 
    1008                 :           0 :   return build_call_expr (t, 0);
    1009                 :             : #endif
    1010                 :             : }
    1011                 :             : 
    1012                 :             : bool
    1013                 :    61633600 : hook_bool_const_rtx_commutative_p (const_rtx x,
    1014                 :             :                                    int outer_code ATTRIBUTE_UNUSED)
    1015                 :             : {
    1016                 :    61633600 :   return COMMUTATIVE_P (x);
    1017                 :             : }
    1018                 :             : 
    1019                 :             : rtx
    1020                 :           0 : default_function_value (const_tree ret_type ATTRIBUTE_UNUSED,
    1021                 :             :                         const_tree fn_decl_or_type,
    1022                 :             :                         bool outgoing ATTRIBUTE_UNUSED)
    1023                 :             : {
    1024                 :             :   /* The old interface doesn't handle receiving the function type.  */
    1025                 :           0 :   if (fn_decl_or_type
    1026                 :             :       && !DECL_P (fn_decl_or_type))
    1027                 :             :     fn_decl_or_type = NULL;
    1028                 :             : 
    1029                 :             : #ifdef FUNCTION_VALUE
    1030                 :             :   return FUNCTION_VALUE (ret_type, fn_decl_or_type);
    1031                 :             : #else
    1032                 :           0 :   gcc_unreachable ();
    1033                 :             : #endif
    1034                 :             : }
    1035                 :             : 
    1036                 :             : rtx
    1037                 :      107092 : default_libcall_value (machine_mode mode ATTRIBUTE_UNUSED,
    1038                 :             :                        const_rtx fun ATTRIBUTE_UNUSED)
    1039                 :             : {
    1040                 :             : #ifdef LIBCALL_VALUE
    1041                 :      107092 :   return LIBCALL_VALUE (MACRO_MODE (mode));
    1042                 :             : #else
    1043                 :             :   gcc_unreachable ();
    1044                 :             : #endif
    1045                 :             : }
    1046                 :             : 
    1047                 :             : /* The default hook for TARGET_FUNCTION_VALUE_REGNO_P.  */
    1048                 :             : 
    1049                 :             : bool
    1050                 :           0 : default_function_value_regno_p (const unsigned int regno ATTRIBUTE_UNUSED)
    1051                 :             : {
    1052                 :             : #ifdef FUNCTION_VALUE_REGNO_P
    1053                 :             :   return FUNCTION_VALUE_REGNO_P (regno);
    1054                 :             : #else
    1055                 :           0 :   gcc_unreachable ();
    1056                 :             : #endif
    1057                 :             : }
    1058                 :             : 
    1059                 :             : /* Choose the mode and rtx to use to zero REGNO, storing tem in PMODE and
    1060                 :             :    PREGNO_RTX and returning TRUE if successful, otherwise returning FALSE.  If
    1061                 :             :    the natural mode for REGNO doesn't work, attempt to group it with subsequent
    1062                 :             :    adjacent registers set in TOZERO.  */
    1063                 :             : 
    1064                 :             : static inline bool
    1065                 :           0 : zcur_select_mode_rtx (unsigned int regno, machine_mode *pmode,
    1066                 :             :                       rtx *pregno_rtx, HARD_REG_SET tozero)
    1067                 :             : {
    1068                 :           0 :   rtx regno_rtx = regno_reg_rtx[regno];
    1069                 :           0 :   machine_mode mode = GET_MODE (regno_rtx);
    1070                 :             : 
    1071                 :             :   /* If the natural mode doesn't work, try some wider mode.  */
    1072                 :           0 :   if (!targetm.hard_regno_mode_ok (regno, mode))
    1073                 :             :     {
    1074                 :             :       bool found = false;
    1075                 :           0 :       for (int nregs = 2;
    1076                 :           0 :            !found && nregs <= hard_regno_max_nregs
    1077                 :           0 :              && regno + nregs <= FIRST_PSEUDO_REGISTER
    1078                 :           0 :              && TEST_HARD_REG_BIT (tozero,
    1079                 :             :                                    regno + nregs - 1);
    1080                 :             :            nregs++)
    1081                 :             :         {
    1082                 :           0 :           mode = choose_hard_reg_mode (regno, nregs, 0);
    1083                 :           0 :           if (mode == E_VOIDmode)
    1084                 :           0 :             continue;
    1085                 :           0 :           gcc_checking_assert (targetm.hard_regno_mode_ok (regno, mode));
    1086                 :           0 :           regno_rtx = gen_rtx_REG (mode, regno);
    1087                 :           0 :           found = true;
    1088                 :             :         }
    1089                 :           0 :       if (!found)
    1090                 :             :         return false;
    1091                 :             :     }
    1092                 :             : 
    1093                 :           0 :   *pmode = mode;
    1094                 :           0 :   *pregno_rtx = regno_rtx;
    1095                 :           0 :   return true;
    1096                 :             : }
    1097                 :             : 
    1098                 :             : /* The default hook for TARGET_ZERO_CALL_USED_REGS.  */
    1099                 :             : 
    1100                 :             : HARD_REG_SET
    1101                 :           0 : default_zero_call_used_regs (HARD_REG_SET need_zeroed_hardregs)
    1102                 :             : {
    1103                 :           0 :   gcc_assert (!hard_reg_set_empty_p (need_zeroed_hardregs));
    1104                 :             : 
    1105                 :             :   HARD_REG_SET failed;
    1106                 :           0 :   CLEAR_HARD_REG_SET (failed);
    1107                 :             :   bool progress = false;
    1108                 :             : 
    1109                 :             :   /* First, try to zero each register in need_zeroed_hardregs by
    1110                 :             :      loading a zero into it, taking note of any failures in
    1111                 :             :      FAILED.  */
    1112                 :           0 :   for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
    1113                 :           0 :     if (TEST_HARD_REG_BIT (need_zeroed_hardregs, regno))
    1114                 :             :       {
    1115                 :           0 :         rtx_insn *last_insn = get_last_insn ();
    1116                 :           0 :         rtx regno_rtx;
    1117                 :           0 :         machine_mode mode;
    1118                 :             : 
    1119                 :           0 :         if (!zcur_select_mode_rtx (regno, &mode, &regno_rtx,
    1120                 :             :                                    need_zeroed_hardregs))
    1121                 :             :           {
    1122                 :           0 :             SET_HARD_REG_BIT (failed, regno);
    1123                 :           0 :             continue;
    1124                 :             :           }
    1125                 :             : 
    1126                 :           0 :         rtx zero = CONST0_RTX (mode);
    1127                 :           0 :         rtx_insn *insn = emit_move_insn (regno_rtx, zero);
    1128                 :           0 :         if (!valid_insn_p (insn))
    1129                 :             :           {
    1130                 :           0 :             SET_HARD_REG_BIT (failed, regno);
    1131                 :           0 :             delete_insns_since (last_insn);
    1132                 :             :           }
    1133                 :             :         else
    1134                 :             :           {
    1135                 :           0 :             progress = true;
    1136                 :           0 :             regno += hard_regno_nregs (regno, mode) - 1;
    1137                 :             :           }
    1138                 :             :       }
    1139                 :             : 
    1140                 :             :   /* Now retry with copies from zeroed registers, as long as we've
    1141                 :             :      made some PROGRESS, and registers remain to be zeroed in
    1142                 :             :      FAILED.  */
    1143                 :           0 :   while (progress && !hard_reg_set_empty_p (failed))
    1144                 :             :     {
    1145                 :           0 :       HARD_REG_SET retrying = failed;
    1146                 :             : 
    1147                 :           0 :       CLEAR_HARD_REG_SET (failed);
    1148                 :             :       progress = false;
    1149                 :             : 
    1150                 :           0 :       for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
    1151                 :           0 :         if (TEST_HARD_REG_BIT (retrying, regno))
    1152                 :             :           {
    1153                 :           0 :             rtx regno_rtx;
    1154                 :           0 :             machine_mode mode;
    1155                 :             : 
    1156                 :             :             /* This might select registers we've already zeroed.  If grouping
    1157                 :             :                with them is what it takes to get regno zeroed, so be it.  */
    1158                 :           0 :             if (!zcur_select_mode_rtx (regno, &mode, &regno_rtx,
    1159                 :             :                                        need_zeroed_hardregs))
    1160                 :             :               {
    1161                 :           0 :                 SET_HARD_REG_BIT (failed, regno);
    1162                 :           0 :                 continue;
    1163                 :             :               }
    1164                 :             : 
    1165                 :           0 :             bool success = false;
    1166                 :             :             /* Look for a source.  */
    1167                 :           0 :             for (unsigned int src = 0; src < FIRST_PSEUDO_REGISTER; src++)
    1168                 :             :               {
    1169                 :             :                 /* If SRC hasn't been zeroed (yet?), skip it.  */
    1170                 :           0 :                 if (! TEST_HARD_REG_BIT (need_zeroed_hardregs, src))
    1171                 :           0 :                   continue;
    1172                 :           0 :                 if (TEST_HARD_REG_BIT (retrying, src))
    1173                 :           0 :                   continue;
    1174                 :             : 
    1175                 :             :                 /* Check that SRC can hold MODE, and that any other
    1176                 :             :                    registers needed to hold MODE in SRC have also been
    1177                 :             :                    zeroed.  */
    1178                 :           0 :                 if (!targetm.hard_regno_mode_ok (src, mode))
    1179                 :           0 :                   continue;
    1180                 :           0 :                 unsigned n = targetm.hard_regno_nregs (src, mode);
    1181                 :           0 :                 bool ok = true;
    1182                 :           0 :                 for (unsigned i = 1; ok && i < n; i++)
    1183                 :           0 :                   ok = (TEST_HARD_REG_BIT (need_zeroed_hardregs, src + i)
    1184                 :           0 :                         && !TEST_HARD_REG_BIT (retrying, src + i));
    1185                 :           0 :                 if (!ok)
    1186                 :           0 :                   continue;
    1187                 :             : 
    1188                 :             :                 /* SRC is usable, try to copy from it.  */
    1189                 :           0 :                 rtx_insn *last_insn = get_last_insn ();
    1190                 :           0 :                 rtx src_rtx = gen_rtx_REG (mode, src);
    1191                 :           0 :                 rtx_insn *insn = emit_move_insn (regno_rtx, src_rtx);
    1192                 :           0 :                 if (!valid_insn_p (insn))
    1193                 :             :                   /* It didn't work, remove any inserts.  We'll look
    1194                 :             :                      for another SRC.  */
    1195                 :           0 :                   delete_insns_since (last_insn);
    1196                 :             :                 else
    1197                 :             :                   {
    1198                 :             :                     /* We're done for REGNO.  */
    1199                 :             :                     success = true;
    1200                 :             :                     break;
    1201                 :             :                   }
    1202                 :             :               }
    1203                 :             : 
    1204                 :             :             /* If nothing worked for REGNO this round, mark it to be
    1205                 :             :                retried if we get another round.  */
    1206                 :           0 :             if (!success)
    1207                 :           0 :               SET_HARD_REG_BIT (failed, regno);
    1208                 :             :             else
    1209                 :             :               {
    1210                 :             :                 /* Take note so as to enable another round if needed.  */
    1211                 :           0 :                 progress = true;
    1212                 :           0 :                 regno += hard_regno_nregs (regno, mode) - 1;
    1213                 :             :               }
    1214                 :             :           }
    1215                 :             :     }
    1216                 :             : 
    1217                 :             :   /* If any register remained, report it.  */
    1218                 :           0 :   if (!progress)
    1219                 :             :     {
    1220                 :           0 :       static bool issued_error;
    1221                 :           0 :       if (!issued_error)
    1222                 :             :         {
    1223                 :           0 :           const char *name = NULL;
    1224                 :           0 :           for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL;
    1225                 :             :                ++i)
    1226                 :           0 :             if (flag_zero_call_used_regs == zero_call_used_regs_opts[i].flag)
    1227                 :             :               {
    1228                 :             :                 name = zero_call_used_regs_opts[i].name;
    1229                 :             :                 break;
    1230                 :             :               }
    1231                 :             : 
    1232                 :           0 :           if (!name)
    1233                 :           0 :             name = "";
    1234                 :             : 
    1235                 :           0 :           issued_error = true;
    1236                 :           0 :           sorry ("argument %qs is not supported for %qs on this target",
    1237                 :             :                  name, "-fzero-call-used-regs");
    1238                 :             :         }
    1239                 :             :     }
    1240                 :             : 
    1241                 :           0 :   return need_zeroed_hardregs;
    1242                 :             : }
    1243                 :             : 
    1244                 :             : rtx
    1245                 :           0 : default_internal_arg_pointer (void)
    1246                 :             : {
    1247                 :             :   /* If the reg that the virtual arg pointer will be translated into is
    1248                 :             :      not a fixed reg or is the stack pointer, make a copy of the virtual
    1249                 :             :      arg pointer, and address parms via the copy.  The frame pointer is
    1250                 :             :      considered fixed even though it is not marked as such.  */
    1251                 :           0 :   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
    1252                 :           0 :        || ! (fixed_regs[ARG_POINTER_REGNUM]
    1253                 :             :              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
    1254                 :           0 :     return copy_to_reg (virtual_incoming_args_rtx);
    1255                 :             :   else
    1256                 :           0 :     return virtual_incoming_args_rtx;
    1257                 :             : }
    1258                 :             : 
    1259                 :             : rtx
    1260                 :           0 : default_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p)
    1261                 :             : {
    1262                 :           0 :   if (incoming_p)
    1263                 :             :     {
    1264                 :             : #ifdef STATIC_CHAIN_INCOMING_REGNUM
    1265                 :             :       return gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
    1266                 :             : #endif
    1267                 :             :     }
    1268                 :             : 
    1269                 :             : #ifdef STATIC_CHAIN_REGNUM
    1270                 :             :   return gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
    1271                 :             : #endif
    1272                 :             : 
    1273                 :           0 :   {
    1274                 :           0 :     static bool issued_error;
    1275                 :           0 :     if (!issued_error)
    1276                 :             :       {
    1277                 :           0 :         issued_error = true;
    1278                 :           0 :         sorry ("nested functions not supported on this target");
    1279                 :             :       }
    1280                 :             : 
    1281                 :             :     /* It really doesn't matter what we return here, so long at it
    1282                 :             :        doesn't cause the rest of the compiler to crash.  */
    1283                 :           0 :     return gen_rtx_MEM (Pmode, stack_pointer_rtx);
    1284                 :             :   }
    1285                 :             : }
    1286                 :             : 
    1287                 :             : void
    1288                 :           0 : default_trampoline_init (rtx ARG_UNUSED (m_tramp), tree ARG_UNUSED (t_func),
    1289                 :             :                          rtx ARG_UNUSED (r_chain))
    1290                 :             : {
    1291                 :           0 :   sorry ("nested function trampolines not supported on this target");
    1292                 :           0 : }
    1293                 :             : 
    1294                 :             : poly_int64
    1295                 :           0 : default_return_pops_args (tree, tree, poly_int64)
    1296                 :             : {
    1297                 :           0 :   return 0;
    1298                 :             : }
    1299                 :             : 
    1300                 :             : reg_class_t
    1301                 :    46959551 : default_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
    1302                 :             :                                          reg_class_t cl,
    1303                 :             :                                          reg_class_t best_cl ATTRIBUTE_UNUSED)
    1304                 :             : {
    1305                 :    46959551 :   return cl;
    1306                 :             : }
    1307                 :             : 
    1308                 :             : extern bool
    1309                 :   286963335 : default_lra_p (void)
    1310                 :             : {
    1311                 :   286963335 :   return true;
    1312                 :             : }
    1313                 :             : 
    1314                 :             : int
    1315                 :           0 : default_register_priority (int hard_regno ATTRIBUTE_UNUSED)
    1316                 :             : {
    1317                 :           0 :   return 0;
    1318                 :             : }
    1319                 :             : 
    1320                 :             : extern bool
    1321                 :           0 : default_register_usage_leveling_p (void)
    1322                 :             : {
    1323                 :           0 :   return false;
    1324                 :             : }
    1325                 :             : 
    1326                 :             : extern bool
    1327                 :     4844968 : default_different_addr_displacement_p (void)
    1328                 :             : {
    1329                 :     4844968 :   return false;
    1330                 :             : }
    1331                 :             : 
    1332                 :             : reg_class_t
    1333                 :           0 : default_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x ATTRIBUTE_UNUSED,
    1334                 :             :                           reg_class_t reload_class_i ATTRIBUTE_UNUSED,
    1335                 :             :                           machine_mode reload_mode ATTRIBUTE_UNUSED,
    1336                 :             :                           secondary_reload_info *sri)
    1337                 :             : {
    1338                 :           0 :   enum reg_class rclass = NO_REGS;
    1339                 :           0 :   enum reg_class reload_class = (enum reg_class) reload_class_i;
    1340                 :             : 
    1341                 :           0 :   if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
    1342                 :             :     {
    1343                 :           0 :       sri->icode = sri->prev_sri->t_icode;
    1344                 :           0 :       return NO_REGS;
    1345                 :             :     }
    1346                 :             : #ifdef SECONDARY_INPUT_RELOAD_CLASS
    1347                 :             :   if (in_p)
    1348                 :             :     rclass = SECONDARY_INPUT_RELOAD_CLASS (reload_class,
    1349                 :             :                                            MACRO_MODE (reload_mode), x);
    1350                 :             : #endif
    1351                 :             : #ifdef SECONDARY_OUTPUT_RELOAD_CLASS
    1352                 :             :   if (! in_p)
    1353                 :             :     rclass = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class,
    1354                 :             :                                             MACRO_MODE (reload_mode), x);
    1355                 :             : #endif
    1356                 :             :   if (rclass != NO_REGS)
    1357                 :             :     {
    1358                 :             :       enum insn_code icode
    1359                 :             :         = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab,
    1360                 :             :                                 reload_mode);
    1361                 :             : 
    1362                 :             :       if (icode != CODE_FOR_nothing
    1363                 :             :           && !insn_operand_matches (icode, in_p, x))
    1364                 :             :         icode = CODE_FOR_nothing;
    1365                 :             :       else if (icode != CODE_FOR_nothing)
    1366                 :             :         {
    1367                 :             :           const char *insn_constraint, *scratch_constraint;
    1368                 :             :           enum reg_class insn_class, scratch_class;
    1369                 :             : 
    1370                 :             :           gcc_assert (insn_data[(int) icode].n_operands == 3);
    1371                 :             :           insn_constraint = insn_data[(int) icode].operand[!in_p].constraint;
    1372                 :             :           if (!*insn_constraint)
    1373                 :             :             insn_class = ALL_REGS;
    1374                 :             :           else
    1375                 :             :             {
    1376                 :             :               if (in_p)
    1377                 :             :                 {
    1378                 :             :                   gcc_assert (*insn_constraint == '=');
    1379                 :             :                   insn_constraint++;
    1380                 :             :                 }
    1381                 :             :               insn_class = (reg_class_for_constraint
    1382                 :             :                             (lookup_constraint (insn_constraint)));
    1383                 :             :               gcc_assert (insn_class != NO_REGS);
    1384                 :             :             }
    1385                 :             : 
    1386                 :             :           scratch_constraint = insn_data[(int) icode].operand[2].constraint;
    1387                 :             :           /* The scratch register's constraint must start with "=&",
    1388                 :             :              except for an input reload, where only "=" is necessary,
    1389                 :             :              and where it might be beneficial to re-use registers from
    1390                 :             :              the input.  */
    1391                 :             :           gcc_assert (scratch_constraint[0] == '='
    1392                 :             :                       && (in_p || scratch_constraint[1] == '&'));
    1393                 :             :           scratch_constraint++;
    1394                 :             :           if (*scratch_constraint == '&')
    1395                 :             :             scratch_constraint++;
    1396                 :             :           scratch_class = (reg_class_for_constraint
    1397                 :             :                            (lookup_constraint (scratch_constraint)));
    1398                 :             : 
    1399                 :             :           if (reg_class_subset_p (reload_class, insn_class))
    1400                 :             :             {
    1401                 :             :               gcc_assert (scratch_class == rclass);
    1402                 :             :               rclass = NO_REGS;
    1403                 :             :             }
    1404                 :             :           else
    1405                 :             :             rclass = insn_class;
    1406                 :             : 
    1407                 :             :         }
    1408                 :             :       if (rclass == NO_REGS)
    1409                 :             :         sri->icode = icode;
    1410                 :             :       else
    1411                 :             :         sri->t_icode = icode;
    1412                 :             :     }
    1413                 :             :   return rclass;
    1414                 :             : }
    1415                 :             : 
    1416                 :             : /* The default implementation of TARGET_SECONDARY_MEMORY_NEEDED_MODE.  */
    1417                 :             : 
    1418                 :             : machine_mode
    1419                 :           0 : default_secondary_memory_needed_mode (machine_mode mode)
    1420                 :             : {
    1421                 :           0 :   if (!targetm.lra_p ()
    1422                 :           0 :       && known_lt (GET_MODE_BITSIZE (mode), BITS_PER_WORD)
    1423                 :           0 :       && INTEGRAL_MODE_P (mode))
    1424                 :           0 :     return mode_for_size (BITS_PER_WORD, GET_MODE_CLASS (mode), 0).require ();
    1425                 :             :   return mode;
    1426                 :             : }
    1427                 :             : 
    1428                 :             : /* By default, if flag_pic is true, then neither local nor global relocs
    1429                 :             :    should be placed in readonly memory.  */
    1430                 :             : 
    1431                 :             : int
    1432                 :           0 : default_reloc_rw_mask (void)
    1433                 :             : {
    1434                 :           0 :   return flag_pic ? 3 : 0;
    1435                 :             : }
    1436                 :             : 
    1437                 :             : /* By default, address diff vectors are generated
    1438                 :             : for jump tables when flag_pic is true.  */
    1439                 :             : 
    1440                 :             : bool
    1441                 :       14171 : default_generate_pic_addr_diff_vec (void)
    1442                 :             : {
    1443                 :       14171 :   return flag_pic;
    1444                 :             : }
    1445                 :             : 
    1446                 :             : /* Record an element in the table of global constructors.  SYMBOL is
    1447                 :             :    a SYMBOL_REF of the function to be called; PRIORITY is a number
    1448                 :             :    between 0 and MAX_INIT_PRIORITY.  */
    1449                 :             : 
    1450                 :             : void
    1451                 :           0 : default_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
    1452                 :             :                              int priority ATTRIBUTE_UNUSED)
    1453                 :             : {
    1454                 :           0 :   sorry ("global constructors not supported on this target");
    1455                 :           0 : }
    1456                 :             : 
    1457                 :             : /* Likewise for global destructors.  */
    1458                 :             : 
    1459                 :             : void
    1460                 :           0 : default_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
    1461                 :             :                             int priority ATTRIBUTE_UNUSED)
    1462                 :             : {
    1463                 :           0 :   sorry ("global destructors not supported on this target");
    1464                 :           0 : }
    1465                 :             : 
    1466                 :             : /* By default, do no modification. */
    1467                 :           0 : tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED,
    1468                 :             :                                          tree id)
    1469                 :             : {
    1470                 :           0 :    return id;
    1471                 :             : }
    1472                 :             : 
    1473                 :             : /* The default implementation of TARGET_STATIC_RTX_ALIGNMENT.  */
    1474                 :             : 
    1475                 :             : HOST_WIDE_INT
    1476                 :           0 : default_static_rtx_alignment (machine_mode mode)
    1477                 :             : {
    1478                 :           0 :   return GET_MODE_ALIGNMENT (mode);
    1479                 :             : }
    1480                 :             : 
    1481                 :             : /* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */
    1482                 :             : 
    1483                 :             : HOST_WIDE_INT
    1484                 :           0 : default_constant_alignment (const_tree, HOST_WIDE_INT align)
    1485                 :             : {
    1486                 :           0 :   return align;
    1487                 :             : }
    1488                 :             : 
    1489                 :             : /* An implementation of TARGET_CONSTANT_ALIGNMENT that aligns strings
    1490                 :             :    to at least BITS_PER_WORD but otherwise makes no changes.  */
    1491                 :             : 
    1492                 :             : HOST_WIDE_INT
    1493                 :           0 : constant_alignment_word_strings (const_tree exp, HOST_WIDE_INT align)
    1494                 :             : {
    1495                 :           0 :   if (TREE_CODE (exp) == STRING_CST)
    1496                 :           0 :     return MAX (align, BITS_PER_WORD);
    1497                 :             :   return align;
    1498                 :             : }
    1499                 :             : 
    1500                 :             : /* Default to natural alignment for vector types, bounded by
    1501                 :             :    MAX_OFILE_ALIGNMENT.  */
    1502                 :             : 
    1503                 :             : HOST_WIDE_INT
    1504                 :    64691203 : default_vector_alignment (const_tree type)
    1505                 :             : {
    1506                 :    64691203 :   unsigned HOST_WIDE_INT align = MAX_OFILE_ALIGNMENT;
    1507                 :    64691203 :   tree size = TYPE_SIZE (type);
    1508                 :    64691203 :   if (tree_fits_uhwi_p (size))
    1509                 :    64691203 :     align = tree_to_uhwi (size);
    1510                 :    64691203 :   if (align >= MAX_OFILE_ALIGNMENT)
    1511                 :             :     return MAX_OFILE_ALIGNMENT;
    1512                 :    64691196 :   return MAX (align, GET_MODE_ALIGNMENT (TYPE_MODE (type)));
    1513                 :             : }
    1514                 :             : 
    1515                 :             : /* The default implementation of
    1516                 :             :    TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT.  */
    1517                 :             : 
    1518                 :             : poly_uint64
    1519                 :     6077733 : default_preferred_vector_alignment (const_tree type)
    1520                 :             : {
    1521                 :     6077733 :   return TYPE_ALIGN (type);
    1522                 :             : }
    1523                 :             : 
    1524                 :             : /* The default implementation of
    1525                 :             :    TARGET_VECTORIZE_PREFERRED_DIV_AS_SHIFTS_OVER_MULT.  */
    1526                 :             : 
    1527                 :             : bool
    1528                 :       22490 : default_preferred_div_as_shifts_over_mult (const_tree type)
    1529                 :             : {
    1530                 :       22490 :   return !can_mult_highpart_p (TYPE_MODE (type), TYPE_UNSIGNED (type));
    1531                 :             : }
    1532                 :             : 
    1533                 :             : /* By default assume vectors of element TYPE require a multiple of the natural
    1534                 :             :    alignment of TYPE.  TYPE is naturally aligned if IS_PACKED is false.  */
    1535                 :             : bool
    1536                 :      102292 : default_builtin_vector_alignment_reachable (const_tree /*type*/, bool is_packed)
    1537                 :             : {
    1538                 :      102292 :   return ! is_packed;
    1539                 :             : }
    1540                 :             : 
    1541                 :             : /* By default, assume that a target supports any factor of misalignment
    1542                 :             :    memory access if it supports movmisalign patten.
    1543                 :             :    is_packed is true if the memory access is defined in a packed struct.  */
    1544                 :             : bool
    1545                 :     1379213 : default_builtin_support_vector_misalignment (machine_mode mode,
    1546                 :             :                                              const_tree type
    1547                 :             :                                              ATTRIBUTE_UNUSED,
    1548                 :             :                                              int misalignment
    1549                 :             :                                              ATTRIBUTE_UNUSED,
    1550                 :             :                                              bool is_packed
    1551                 :             :                                              ATTRIBUTE_UNUSED)
    1552                 :             : {
    1553                 :     1379213 :   if (optab_handler (movmisalign_optab, mode) != CODE_FOR_nothing)
    1554                 :     1378976 :     return true;
    1555                 :             :   return false;
    1556                 :             : }
    1557                 :             : 
    1558                 :             : /* By default, only attempt to parallelize bitwise operations, and
    1559                 :             :    possibly adds/subtracts using bit-twiddling.  */
    1560                 :             : 
    1561                 :             : machine_mode
    1562                 :           0 : default_preferred_simd_mode (scalar_mode)
    1563                 :             : {
    1564                 :           0 :   return word_mode;
    1565                 :             : }
    1566                 :             : 
    1567                 :             : /* By default do not split reductions further.  */
    1568                 :             : 
    1569                 :             : machine_mode
    1570                 :           0 : default_split_reduction (machine_mode mode)
    1571                 :             : {
    1572                 :           0 :   return mode;
    1573                 :             : }
    1574                 :             : 
    1575                 :             : /* By default only the preferred vector mode is tried.  */
    1576                 :             : 
    1577                 :             : unsigned int
    1578                 :           0 : default_autovectorize_vector_modes (vector_modes *, bool)
    1579                 :             : {
    1580                 :           0 :   return 0;
    1581                 :             : }
    1582                 :             : 
    1583                 :             : /* The default implementation of TARGET_VECTORIZE_RELATED_MODE.  */
    1584                 :             : 
    1585                 :             : opt_machine_mode
    1586                 :    30342584 : default_vectorize_related_mode (machine_mode vector_mode,
    1587                 :             :                                 scalar_mode element_mode,
    1588                 :             :                                 poly_uint64 nunits)
    1589                 :             : {
    1590                 :    30342584 :   machine_mode result_mode;
    1591                 :    30342584 :   if ((maybe_ne (nunits, 0U)
    1592                 :    51482569 :        || multiple_p (GET_MODE_SIZE (vector_mode),
    1593                 :    26641402 :                       GET_MODE_SIZE (element_mode), &nunits))
    1594                 :    28542349 :       && mode_for_vector (element_mode, nunits).exists (&result_mode)
    1595                 :    28363104 :       && VECTOR_MODE_P (result_mode)
    1596                 :    58704496 :       && targetm.vector_mode_supported_p (result_mode))
    1597                 :    28352896 :     return result_mode;
    1598                 :             : 
    1599                 :     1989688 :   return opt_machine_mode ();
    1600                 :             : }
    1601                 :             : 
    1602                 :             : /* By default a vector of integers is used as a mask.  */
    1603                 :             : 
    1604                 :             : opt_machine_mode
    1605                 :           0 : default_get_mask_mode (machine_mode mode)
    1606                 :             : {
    1607                 :           0 :   return related_int_vector_mode (mode);
    1608                 :             : }
    1609                 :             : 
    1610                 :             : /* By default consider masked stores to be expensive.  */
    1611                 :             : 
    1612                 :             : bool
    1613                 :        7811 : default_conditional_operation_is_expensive (unsigned ifn)
    1614                 :             : {
    1615                 :        7811 :   return ifn == IFN_MASK_STORE;
    1616                 :             : }
    1617                 :             : 
    1618                 :             : /* By default consider masked stores to be expensive.  */
    1619                 :             : 
    1620                 :             : bool
    1621                 :         449 : default_empty_mask_is_expensive (unsigned ifn)
    1622                 :             : {
    1623                 :         449 :   return ifn == IFN_MASK_STORE;
    1624                 :             : }
    1625                 :             : 
    1626                 :             : /* By default, the cost model accumulates three separate costs (prologue,
    1627                 :             :    loop body, and epilogue) for a vectorized loop or block.  So allocate an
    1628                 :             :    array of three unsigned ints, set it to zero, and return its address.  */
    1629                 :             : 
    1630                 :             : vector_costs *
    1631                 :           0 : default_vectorize_create_costs (vec_info *vinfo, bool costing_for_scalar)
    1632                 :             : {
    1633                 :           0 :   return new vector_costs (vinfo, costing_for_scalar);
    1634                 :             : }
    1635                 :             : 
    1636                 :             : /* Determine whether or not a pointer mode is valid. Assume defaults
    1637                 :             :    of ptr_mode or Pmode - can be overridden.  */
    1638                 :             : bool
    1639                 :     5727207 : default_valid_pointer_mode (scalar_int_mode mode)
    1640                 :             : {
    1641                 :     5727207 :   return (mode == ptr_mode || mode == Pmode);
    1642                 :             : }
    1643                 :             : 
    1644                 :             : /* Determine whether the memory reference specified by REF may alias
    1645                 :             :    the C libraries errno location.  */
    1646                 :             : bool
    1647                 :      973107 : default_ref_may_alias_errno (ao_ref *ref)
    1648                 :             : {
    1649                 :      973107 :   tree base = ao_ref_base (ref);
    1650                 :             :   /* The default implementation assumes the errno location is
    1651                 :             :      a declaration of type int or is always accessed via a
    1652                 :             :      pointer to int.  We assume that accesses to errno are
    1653                 :             :      not deliberately obfuscated (even in conforming ways).  */
    1654                 :      973107 :   if (TYPE_UNSIGNED (TREE_TYPE (base))
    1655                 :      973107 :       || TYPE_MODE (TREE_TYPE (base)) != TYPE_MODE (integer_type_node))
    1656                 :      836065 :     return false;
    1657                 :             :   /* The default implementation assumes an errno location declaration
    1658                 :             :      is never defined in the current compilation unit and may not be
    1659                 :             :      aliased by a local variable.  */
    1660                 :      137042 :   if (DECL_P (base)
    1661                 :      105255 :       && DECL_EXTERNAL (base)
    1662                 :      137807 :       && !TREE_STATIC (base))
    1663                 :             :     return true;
    1664                 :      136953 :   else if (TREE_CODE (base) == MEM_REF
    1665                 :      136953 :            && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
    1666                 :             :     {
    1667                 :       30229 :       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
    1668                 :       42965 :       return !pi || pi->pt.anything || pi->pt.nonlocal;
    1669                 :             :     }
    1670                 :             :   return false;
    1671                 :             : }
    1672                 :             : 
    1673                 :             : /* Return the mode for a pointer to a given ADDRSPACE,
    1674                 :             :    defaulting to ptr_mode for all address spaces.  */
    1675                 :             : 
    1676                 :             : scalar_int_mode
    1677                 :  2283190861 : default_addr_space_pointer_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
    1678                 :             : {
    1679                 :  2283190861 :   return ptr_mode;
    1680                 :             : }
    1681                 :             : 
    1682                 :             : /* Return the mode for an address in a given ADDRSPACE,
    1683                 :             :    defaulting to Pmode for all address spaces.  */
    1684                 :             : 
    1685                 :             : scalar_int_mode
    1686                 :    91465643 : default_addr_space_address_mode (addr_space_t addrspace ATTRIBUTE_UNUSED)
    1687                 :             : {
    1688                 :    91465643 :   return Pmode;
    1689                 :             : }
    1690                 :             : 
    1691                 :             : /* Named address space version of valid_pointer_mode.
    1692                 :             :    To match the above, the same modes apply to all address spaces.  */
    1693                 :             : 
    1694                 :             : bool
    1695                 :     5727207 : default_addr_space_valid_pointer_mode (scalar_int_mode mode,
    1696                 :             :                                        addr_space_t as ATTRIBUTE_UNUSED)
    1697                 :             : {
    1698                 :     5727207 :   return targetm.valid_pointer_mode (mode);
    1699                 :             : }
    1700                 :             : 
    1701                 :             : /* Some places still assume that all pointer or address modes are the
    1702                 :             :    standard Pmode and ptr_mode.  These optimizations become invalid if
    1703                 :             :    the target actually supports multiple different modes.  For now,
    1704                 :             :    we disable such optimizations on such targets, using this function.  */
    1705                 :             : 
    1706                 :             : bool
    1707                 :   654817438 : target_default_pointer_address_modes_p (void)
    1708                 :             : {
    1709                 :   654817438 :   if (targetm.addr_space.address_mode != default_addr_space_address_mode)
    1710                 :             :     return false;
    1711                 :   654817438 :   if (targetm.addr_space.pointer_mode != default_addr_space_pointer_mode)
    1712                 :           0 :     return false;
    1713                 :             : 
    1714                 :             :   return true;
    1715                 :             : }
    1716                 :             : 
    1717                 :             : /* Named address space version of legitimate_address_p.
    1718                 :             :    By default, all address spaces have the same form.  */
    1719                 :             : 
    1720                 :             : bool
    1721                 :  1414065581 : default_addr_space_legitimate_address_p (machine_mode mode, rtx mem,
    1722                 :             :                                          bool strict,
    1723                 :             :                                          addr_space_t as ATTRIBUTE_UNUSED,
    1724                 :             :                                          code_helper code)
    1725                 :             : {
    1726                 :  1414065581 :   return targetm.legitimate_address_p (mode, mem, strict, code);
    1727                 :             : }
    1728                 :             : 
    1729                 :             : /* Named address space version of LEGITIMIZE_ADDRESS.
    1730                 :             :    By default, all address spaces have the same form.  */
    1731                 :             : 
    1732                 :             : rtx
    1733                 :      586847 : default_addr_space_legitimize_address (rtx x, rtx oldx, machine_mode mode,
    1734                 :             :                                        addr_space_t as ATTRIBUTE_UNUSED)
    1735                 :             : {
    1736                 :      586847 :   return targetm.legitimize_address (x, oldx, mode);
    1737                 :             : }
    1738                 :             : 
    1739                 :             : /* The default hook for determining if one named address space is a subset of
    1740                 :             :    another and to return which address space to use as the common address
    1741                 :             :    space.  */
    1742                 :             : 
    1743                 :             : bool
    1744                 :           3 : default_addr_space_subset_p (addr_space_t subset, addr_space_t superset)
    1745                 :             : {
    1746                 :           3 :   return (subset == superset);
    1747                 :             : }
    1748                 :             : 
    1749                 :             : /* The default hook for determining if 0 within a named address
    1750                 :             :    space is a valid address.  */
    1751                 :             : 
    1752                 :             : bool
    1753                 :           0 : default_addr_space_zero_address_valid (addr_space_t as ATTRIBUTE_UNUSED)
    1754                 :             : {
    1755                 :           0 :   return false;
    1756                 :             : }
    1757                 :             : 
    1758                 :             : /* The default hook for debugging the address space is to return the
    1759                 :             :    address space number to indicate DW_AT_address_class.  */
    1760                 :             : int
    1761                 :           3 : default_addr_space_debug (addr_space_t as)
    1762                 :             : {
    1763                 :           3 :   return as;
    1764                 :             : }
    1765                 :             : 
    1766                 :             : /* The default hook implementation for TARGET_ADDR_SPACE_DIAGNOSE_USAGE.
    1767                 :             :    Don't complain about any address space.  */
    1768                 :             : 
    1769                 :             : void
    1770                 :         171 : default_addr_space_diagnose_usage (addr_space_t, location_t)
    1771                 :             : {
    1772                 :         171 : }
    1773                 :             : 
    1774                 :             : 
    1775                 :             : /* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be
    1776                 :             :    called for targets with only a generic address space.  */
    1777                 :             : 
    1778                 :             : rtx
    1779                 :           0 : default_addr_space_convert (rtx op ATTRIBUTE_UNUSED,
    1780                 :             :                             tree from_type ATTRIBUTE_UNUSED,
    1781                 :             :                             tree to_type ATTRIBUTE_UNUSED)
    1782                 :             : {
    1783                 :           0 :   gcc_unreachable ();
    1784                 :             : }
    1785                 :             : 
    1786                 :             : /* The defualt implementation of TARGET_HARD_REGNO_NREGS.  */
    1787                 :             : 
    1788                 :             : unsigned int
    1789                 :           0 : default_hard_regno_nregs (unsigned int, machine_mode mode)
    1790                 :             : {
    1791                 :             :   /* Targets with variable-sized modes must provide their own definition
    1792                 :             :      of this hook.  */
    1793                 :           0 :   return CEIL (GET_MODE_SIZE (mode).to_constant (), UNITS_PER_WORD);
    1794                 :             : }
    1795                 :             : 
    1796                 :             : bool
    1797                 :           0 : default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
    1798                 :             : {
    1799                 :           0 :   return true;
    1800                 :             : }
    1801                 :             : 
    1802                 :             : /* The default implementation of TARGET_MODE_DEPENDENT_ADDRESS_P.  */
    1803                 :             : 
    1804                 :             : bool
    1805                 :    35439112 : default_mode_dependent_address_p (const_rtx addr ATTRIBUTE_UNUSED,
    1806                 :             :                                   addr_space_t addrspace ATTRIBUTE_UNUSED)
    1807                 :             : {
    1808                 :    35439112 :   return false;
    1809                 :             : }
    1810                 :             : 
    1811                 :             : extern bool default_new_address_profitable_p (rtx, rtx);
    1812                 :             : 
    1813                 :             : 
    1814                 :             : /* The default implementation of TARGET_NEW_ADDRESS_PROFITABLE_P.  */
    1815                 :             : 
    1816                 :             : bool
    1817                 :     1061843 : default_new_address_profitable_p (rtx memref ATTRIBUTE_UNUSED,
    1818                 :             :                                   rtx_insn *insn ATTRIBUTE_UNUSED,
    1819                 :             :                                   rtx new_addr ATTRIBUTE_UNUSED)
    1820                 :             : {
    1821                 :     1061843 :   return true;
    1822                 :             : }
    1823                 :             : 
    1824                 :             : bool
    1825                 :           0 : default_target_option_valid_attribute_p (tree ARG_UNUSED (fndecl),
    1826                 :             :                                          tree ARG_UNUSED (name),
    1827                 :             :                                          tree ARG_UNUSED (args),
    1828                 :             :                                          int ARG_UNUSED (flags))
    1829                 :             : {
    1830                 :           0 :   warning (OPT_Wattributes,
    1831                 :             :            "%<target%> attribute is not supported on this machine");
    1832                 :             : 
    1833                 :           0 :   return false;
    1834                 :             : }
    1835                 :             : 
    1836                 :             : bool
    1837                 :           0 : default_target_option_valid_version_attribute_p (tree ARG_UNUSED (fndecl),
    1838                 :             :                                                  tree ARG_UNUSED (name),
    1839                 :             :                                                  tree ARG_UNUSED (args),
    1840                 :             :                                                  int ARG_UNUSED (flags))
    1841                 :             : {
    1842                 :           0 :   warning (OPT_Wattributes,
    1843                 :             :            "%<target_version%> attribute is not supported on this machine");
    1844                 :             : 
    1845                 :           0 :   return false;
    1846                 :             : }
    1847                 :             : 
    1848                 :             : bool
    1849                 :           0 : default_target_option_pragma_parse (tree ARG_UNUSED (args),
    1850                 :             :                                     tree ARG_UNUSED (pop_target))
    1851                 :             : {
    1852                 :             :   /* If args is NULL the caller is handle_pragma_pop_options ().  In that case,
    1853                 :             :      emit no warning because "#pragma GCC pop_target" is valid on targets that
    1854                 :             :      do not have the "target" pragma.  */
    1855                 :           0 :   if (args)
    1856                 :           0 :     warning (OPT_Wpragmas,
    1857                 :             :              "%<#pragma GCC target%> is not supported for this machine");
    1858                 :             : 
    1859                 :           0 :   return false;
    1860                 :             : }
    1861                 :             : 
    1862                 :             : bool
    1863                 :           0 : default_target_can_inline_p (tree caller, tree callee)
    1864                 :             : {
    1865                 :           0 :   tree callee_opts = DECL_FUNCTION_SPECIFIC_TARGET (callee);
    1866                 :           0 :   tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller);
    1867                 :           0 :   if (! callee_opts)
    1868                 :           0 :     callee_opts = target_option_default_node;
    1869                 :           0 :   if (! caller_opts)
    1870                 :           0 :     caller_opts = target_option_default_node;
    1871                 :             : 
    1872                 :             :   /* If both caller and callee have attributes, assume that if the
    1873                 :             :      pointer is different, the two functions have different target
    1874                 :             :      options since build_target_option_node uses a hash table for the
    1875                 :             :      options.  */
    1876                 :           0 :   return callee_opts == caller_opts;
    1877                 :             : }
    1878                 :             : 
    1879                 :             : /* By default, return false to not need to collect any target information
    1880                 :             :    for inlining.  Target maintainer should re-define the hook if the
    1881                 :             :    target want to take advantage of it.  */
    1882                 :             : 
    1883                 :             : bool
    1884                 :     5275982 : default_need_ipa_fn_target_info (const_tree, unsigned int &)
    1885                 :             : {
    1886                 :     5275982 :   return false;
    1887                 :             : }
    1888                 :             : 
    1889                 :             : bool
    1890                 :           0 : default_update_ipa_fn_target_info (unsigned int &, const gimple *)
    1891                 :             : {
    1892                 :           0 :   return false;
    1893                 :             : }
    1894                 :             : 
    1895                 :             : /* If the machine does not have a case insn that compares the bounds,
    1896                 :             :    this means extra overhead for dispatch tables, which raises the
    1897                 :             :    threshold for using them.  */
    1898                 :             : 
    1899                 :             : unsigned int
    1900                 :     1314114 : default_case_values_threshold (void)
    1901                 :             : {
    1902                 :     1314114 :   return (targetm.have_casesi () ? 4 : 5);
    1903                 :             : }
    1904                 :             : 
    1905                 :             : bool
    1906                 :   111107378 : default_have_conditional_execution (void)
    1907                 :             : {
    1908                 :   111107378 :   return HAVE_conditional_execution;
    1909                 :             : }
    1910                 :             : 
    1911                 :             : bool
    1912                 :           0 : default_have_ccmp (void)
    1913                 :             : {
    1914                 :           0 :   return targetm.gen_ccmp_first != NULL;
    1915                 :             : }
    1916                 :             : 
    1917                 :             : /* By default we assume that c99 functions are present at the runtime,
    1918                 :             :    but sincos is not.  */
    1919                 :             : bool
    1920                 :           0 : default_libc_has_function (enum function_class fn_class,
    1921                 :             :                            tree type ATTRIBUTE_UNUSED)
    1922                 :             : {
    1923                 :           0 :   if (fn_class == function_c94
    1924                 :             :       || fn_class == function_c99_misc
    1925                 :             :       || fn_class == function_c99_math_complex)
    1926                 :           0 :     return true;
    1927                 :             : 
    1928                 :             :   return false;
    1929                 :             : }
    1930                 :             : 
    1931                 :             : /* By default assume that libc has not a fast implementation.  */
    1932                 :             : 
    1933                 :             : bool
    1934                 :           0 : default_libc_has_fast_function (int fcode ATTRIBUTE_UNUSED)
    1935                 :             : {
    1936                 :           0 :   return false;
    1937                 :             : }
    1938                 :             : 
    1939                 :             : bool
    1940                 :           0 : gnu_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED,
    1941                 :             :                        tree type ATTRIBUTE_UNUSED)
    1942                 :             : {
    1943                 :           0 :   return true;
    1944                 :             : }
    1945                 :             : 
    1946                 :             : bool
    1947                 :           0 : no_c99_libc_has_function (enum function_class fn_class ATTRIBUTE_UNUSED,
    1948                 :             :                           tree type ATTRIBUTE_UNUSED)
    1949                 :             : {
    1950                 :           0 :   return false;
    1951                 :             : }
    1952                 :             : 
    1953                 :             : /* Assume some c99 functions are present at the runtime including sincos.  */
    1954                 :             : bool
    1955                 :           0 : bsd_libc_has_function (enum function_class fn_class,
    1956                 :             :                        tree type ATTRIBUTE_UNUSED)
    1957                 :             : {
    1958                 :           0 :   if (fn_class == function_c94
    1959                 :           0 :       || fn_class == function_c99_misc
    1960                 :           0 :       || fn_class == function_sincos)
    1961                 :             :     return true;
    1962                 :             : 
    1963                 :             :   return false;
    1964                 :             : }
    1965                 :             : 
    1966                 :             : /* By default, -fhardened will add -D_FORTIFY_SOURCE=2.  */
    1967                 :             : 
    1968                 :             : unsigned
    1969                 :           0 : default_fortify_source_default_level ()
    1970                 :             : {
    1971                 :           0 :   return 2;
    1972                 :             : }
    1973                 :             : 
    1974                 :             : unsigned
    1975                 :         134 : default_libm_function_max_error (unsigned, machine_mode, bool)
    1976                 :             : {
    1977                 :         134 :   return ~0U;
    1978                 :             : }
    1979                 :             : 
    1980                 :             : unsigned
    1981                 :       70405 : glibc_linux_libm_function_max_error (unsigned cfn, machine_mode mode,
    1982                 :             :                                      bool boundary_p)
    1983                 :             : {
    1984                 :             :   /* Let's use
    1985                 :             :      https://www.gnu.org/software/libc/manual/2.22/html_node/Errors-in-Math-Functions.html
    1986                 :             :      https://www.gnu.org/software/libc/manual/html_node/Errors-in-Math-Functions.html
    1987                 :             :      with usual values recorded here and significant outliers handled in
    1988                 :             :      target CPU specific overriders.  The tables only record default
    1989                 :             :      rounding to nearest, for -frounding-math let's add some extra ulps.
    1990                 :             :      For boundary_p values (say finite results outside of [-1.,1.] for
    1991                 :             :      sin/cos, or [-0.,+Inf] for sqrt etc. let's use custom random testers.  */
    1992                 :       70405 :   int rnd = flag_rounding_math ? 4 : 0;
    1993                 :       70405 :   bool sf = (REAL_MODE_FORMAT (mode) == &ieee_single_format
    1994                 :       50728 :              || REAL_MODE_FORMAT (mode) == &mips_single_format
    1995                 :      121133 :              || REAL_MODE_FORMAT (mode) == &motorola_single_format);
    1996                 :       70405 :   bool df = (REAL_MODE_FORMAT (mode) == &ieee_double_format
    1997                 :       37480 :              || REAL_MODE_FORMAT (mode) == &mips_double_format
    1998                 :      107885 :              || REAL_MODE_FORMAT (mode) == &motorola_double_format);
    1999                 :       70405 :   bool xf = (REAL_MODE_FORMAT (mode) == &ieee_extended_intel_96_format
    2000                 :       67215 :              || REAL_MODE_FORMAT (mode) == &ieee_extended_intel_128_format
    2001                 :      125239 :              || REAL_MODE_FORMAT (mode) == &ieee_extended_motorola_format);
    2002                 :       70405 :   bool tf = (REAL_MODE_FORMAT (mode) == &ieee_quad_format
    2003                 :       70405 :              || REAL_MODE_FORMAT (mode) == &mips_quad_format);
    2004                 :             : 
    2005                 :       70405 :   switch (cfn)
    2006                 :             :     {
    2007                 :       44958 :     CASE_CFN_SQRT:
    2008                 :       44958 :     CASE_CFN_SQRT_FN:
    2009                 :       44958 :       if (boundary_p)
    2010                 :             :         /* https://gcc.gnu.org/pipermail/gcc-patches/2023-April/616595.html */
    2011                 :             :         return 0;
    2012                 :       22479 :       if (sf || df || xf || tf)
    2013                 :       22345 :         return 0 + rnd;
    2014                 :             :       break;
    2015                 :        8747 :     CASE_CFN_COS:
    2016                 :        8747 :     CASE_CFN_COS_FN:
    2017                 :             :       /* cos is generally errors like sin, but far more arches have 2ulps
    2018                 :             :          for double.  */
    2019                 :        8747 :       if (!boundary_p && df)
    2020                 :        1653 :         return 2 + rnd;
    2021                 :       23794 :       gcc_fallthrough ();
    2022                 :       23794 :     CASE_CFN_SIN:
    2023                 :       23794 :     CASE_CFN_SIN_FN:
    2024                 :       23794 :       if (boundary_p)
    2025                 :             :         /* According to
    2026                 :             :            https://sourceware.org/pipermail/gcc-patches/2023-April/616315.html
    2027                 :             :            seems default rounding sin/cos stay strictly in [-1.,1.] range,
    2028                 :             :            with rounding to infinity it can be 1ulp larger/smaller.  */
    2029                 :       27956 :         return flag_rounding_math ? 1 : 0;
    2030                 :        9790 :       if (sf || df)
    2031                 :        6150 :         return 1 + rnd;
    2032                 :        3640 :       if (xf || tf)
    2033                 :        3640 :         return 2 + rnd;
    2034                 :             :       break;
    2035                 :             :     default:
    2036                 :             :       break;
    2037                 :             :     }
    2038                 :             : 
    2039                 :         134 :   return default_libm_function_max_error (cfn, mode, boundary_p);
    2040                 :             : }
    2041                 :             : 
    2042                 :             : tree
    2043                 :           0 : default_builtin_tm_load_store (tree ARG_UNUSED (type))
    2044                 :             : {
    2045                 :           0 :   return NULL_TREE;
    2046                 :             : }
    2047                 :             : 
    2048                 :             : /* Compute cost of moving registers to/from memory.  */
    2049                 :             : 
    2050                 :             : int
    2051                 :           0 : default_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
    2052                 :             :                           reg_class_t rclass ATTRIBUTE_UNUSED,
    2053                 :             :                           bool in ATTRIBUTE_UNUSED)
    2054                 :             : {
    2055                 :             : #ifndef MEMORY_MOVE_COST
    2056                 :           0 :     return (4 + memory_move_secondary_cost (mode, (enum reg_class) rclass, in));
    2057                 :             : #else
    2058                 :             :     return MEMORY_MOVE_COST (MACRO_MODE (mode), (enum reg_class) rclass, in);
    2059                 :             : #endif
    2060                 :             : }
    2061                 :             : 
    2062                 :             : /* Compute cost of moving data from a register of class FROM to one of
    2063                 :             :    TO, using MODE.  */
    2064                 :             : 
    2065                 :             : int
    2066                 :           0 : default_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
    2067                 :             :                             reg_class_t from ATTRIBUTE_UNUSED,
    2068                 :             :                             reg_class_t to ATTRIBUTE_UNUSED)
    2069                 :             : {
    2070                 :             : #ifndef REGISTER_MOVE_COST
    2071                 :           0 :   return 2;
    2072                 :             : #else
    2073                 :             :   return REGISTER_MOVE_COST (MACRO_MODE (mode),
    2074                 :             :                              (enum reg_class) from, (enum reg_class) to);
    2075                 :             : #endif
    2076                 :             : }
    2077                 :             : 
    2078                 :             : /* The default implementation of TARGET_SLOW_UNALIGNED_ACCESS.  */
    2079                 :             : 
    2080                 :             : bool
    2081                 :     3286551 : default_slow_unaligned_access (machine_mode, unsigned int)
    2082                 :             : {
    2083                 :     3286551 :   return STRICT_ALIGNMENT;
    2084                 :             : }
    2085                 :             : 
    2086                 :             : /* The default implementation of TARGET_ESTIMATED_POLY_VALUE.  */
    2087                 :             : 
    2088                 :             : HOST_WIDE_INT
    2089                 :           0 : default_estimated_poly_value (poly_int64 x, poly_value_estimate_kind)
    2090                 :             : {
    2091                 :           0 :   return x.coeffs[0];
    2092                 :             : }
    2093                 :             : 
    2094                 :             : /* For hooks which use the MOVE_RATIO macro, this gives the legacy default
    2095                 :             :    behavior.  SPEED_P is true if we are compiling for speed.  */
    2096                 :             : 
    2097                 :             : unsigned int
    2098                 :     1617418 : get_move_ratio (bool speed_p ATTRIBUTE_UNUSED)
    2099                 :             : {
    2100                 :     1617418 :   unsigned int move_ratio;
    2101                 :             : #ifdef MOVE_RATIO
    2102                 :     1617418 :   move_ratio = (unsigned int) MOVE_RATIO (speed_p);
    2103                 :             : #else
    2104                 :             : #if defined (HAVE_cpymemqi) || defined (HAVE_cpymemhi) || defined (HAVE_cpymemsi) || defined (HAVE_cpymemdi) || defined (HAVE_cpymemti)
    2105                 :             :   move_ratio = 2;
    2106                 :             : #else /* No cpymem patterns, pick a default.  */
    2107                 :             :   move_ratio = ((speed_p) ? 15 : 3);
    2108                 :             : #endif
    2109                 :             : #endif
    2110                 :     1617418 :   return move_ratio;
    2111                 :             : }
    2112                 :             : 
    2113                 :             : /* Return TRUE if the move_by_pieces/set_by_pieces infrastructure should be
    2114                 :             :    used; return FALSE if the cpymem/setmem optab should be expanded, or
    2115                 :             :    a call to memcpy emitted.  */
    2116                 :             : 
    2117                 :             : bool
    2118                 :     1078279 : default_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
    2119                 :             :                                         unsigned int alignment,
    2120                 :             :                                         enum by_pieces_operation op,
    2121                 :             :                                         bool speed_p)
    2122                 :             : {
    2123                 :     1078279 :   unsigned int max_size = 0;
    2124                 :     1078279 :   unsigned int ratio = 0;
    2125                 :             : 
    2126                 :     1078279 :   switch (op)
    2127                 :             :     {
    2128                 :       63508 :     case CLEAR_BY_PIECES:
    2129                 :       63508 :       max_size = STORE_MAX_PIECES;
    2130                 :       63508 :       ratio = CLEAR_RATIO (speed_p);
    2131                 :             :       break;
    2132                 :      872102 :     case MOVE_BY_PIECES:
    2133                 :      872102 :       max_size = MOVE_MAX_PIECES;
    2134                 :      872102 :       ratio = get_move_ratio (speed_p);
    2135                 :      872102 :       break;
    2136                 :       28469 :     case SET_BY_PIECES:
    2137                 :       28469 :       max_size = STORE_MAX_PIECES;
    2138                 :       28469 :       ratio = SET_RATIO (speed_p);
    2139                 :             :       break;
    2140                 :       77629 :     case STORE_BY_PIECES:
    2141                 :       77629 :       max_size = STORE_MAX_PIECES;
    2142                 :       77629 :       ratio = get_move_ratio (speed_p);
    2143                 :       77629 :       break;
    2144                 :       36571 :     case COMPARE_BY_PIECES:
    2145                 :       36571 :       max_size = COMPARE_MAX_PIECES;
    2146                 :             :       /* Pick a likely default, just as in get_move_ratio.  */
    2147                 :       36571 :       ratio = speed_p ? 15 : 3;
    2148                 :             :       break;
    2149                 :             :     }
    2150                 :             : 
    2151                 :     1078279 :   return by_pieces_ninsns (size, alignment, max_size + 1, op) < ratio;
    2152                 :             : }
    2153                 :             : 
    2154                 :             : /* This hook controls code generation for expanding a memcmp operation by
    2155                 :             :    pieces.  Return 1 for the normal pattern of compare/jump after each pair
    2156                 :             :    of loads, or a higher number to reduce the number of branches.  */
    2157                 :             : 
    2158                 :             : int
    2159                 :       96757 : default_compare_by_pieces_branch_ratio (machine_mode)
    2160                 :             : {
    2161                 :       96757 :   return 1;
    2162                 :             : }
    2163                 :             : 
    2164                 :             : /* Write PATCH_AREA_SIZE NOPs into the asm outfile FILE around a function
    2165                 :             :    entry.  If RECORD_P is true and the target supports named sections,
    2166                 :             :    the location of the NOPs will be recorded in a special object section
    2167                 :             :    called "__patchable_function_entries".  This routine may be called
    2168                 :             :    twice per function to put NOPs before and after the function
    2169                 :             :    entry.  */
    2170                 :             : 
    2171                 :             : void
    2172                 :          59 : default_print_patchable_function_entry (FILE *file,
    2173                 :             :                                         unsigned HOST_WIDE_INT patch_area_size,
    2174                 :             :                                         bool record_p)
    2175                 :             : {
    2176                 :          59 :   const char *nop_templ = 0;
    2177                 :          59 :   int code_num;
    2178                 :          59 :   rtx_insn *my_nop = make_insn_raw (gen_nop ());
    2179                 :             : 
    2180                 :             :   /* We use the template alone, relying on the (currently sane) assumption
    2181                 :             :      that the NOP template does not have variable operands.  */
    2182                 :          59 :   code_num = recog_memoized (my_nop);
    2183                 :          59 :   nop_templ = get_insn_template (code_num, my_nop);
    2184                 :             : 
    2185                 :          59 :   if (record_p && targetm_common.have_named_sections)
    2186                 :             :     {
    2187                 :          53 :       char buf[256];
    2188                 :          53 :       section *previous_section = in_section;
    2189                 :          53 :       const char *asm_op = integer_asm_op (POINTER_SIZE_UNITS, false);
    2190                 :             : 
    2191                 :          53 :       gcc_assert (asm_op != NULL);
    2192                 :             :       /* If SECTION_LINK_ORDER is supported, this internal label will
    2193                 :             :          be filled as the symbol for linked_to section.  */
    2194                 :          53 :       ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE", current_function_funcdef_no);
    2195                 :             : 
    2196                 :          53 :       unsigned int flags = SECTION_WRITE | SECTION_RELRO;
    2197                 :          53 :       if (HAVE_GAS_SECTION_LINK_ORDER)
    2198                 :          53 :         flags |= SECTION_LINK_ORDER;
    2199                 :             : 
    2200                 :          53 :       section *sect = get_section ("__patchable_function_entries",
    2201                 :             :                                   flags, current_function_decl);
    2202                 :          53 :       if (HAVE_COMDAT_GROUP && DECL_COMDAT_GROUP (current_function_decl))
    2203                 :          12 :         switch_to_comdat_section (sect, current_function_decl);
    2204                 :             :       else
    2205                 :          41 :         switch_to_section (sect);
    2206                 :          53 :       assemble_align (POINTER_SIZE);
    2207                 :          53 :       fputs (asm_op, file);
    2208                 :          53 :       assemble_name_raw (file, buf);
    2209                 :          53 :       fputc ('\n', file);
    2210                 :             : 
    2211                 :          53 :       switch_to_section (previous_section);
    2212                 :          53 :       ASM_OUTPUT_LABEL (file, buf);
    2213                 :             :     }
    2214                 :             : 
    2215                 :             :   unsigned i;
    2216                 :         136 :   for (i = 0; i < patch_area_size; ++i)
    2217                 :          77 :     output_asm_insn (nop_templ, NULL);
    2218                 :          59 : }
    2219                 :             : 
    2220                 :             : bool
    2221                 :           0 : default_profile_before_prologue (void)
    2222                 :             : {
    2223                 :             : #ifdef PROFILE_BEFORE_PROLOGUE
    2224                 :             :   return true;
    2225                 :             : #else
    2226                 :           0 :   return false;
    2227                 :             : #endif
    2228                 :             : }
    2229                 :             : 
    2230                 :             : /* The default implementation of TARGET_PREFERRED_RELOAD_CLASS.  */
    2231                 :             : 
    2232                 :             : reg_class_t
    2233                 :           0 : default_preferred_reload_class (rtx x ATTRIBUTE_UNUSED,
    2234                 :             :                                 reg_class_t rclass)
    2235                 :             : {
    2236                 :             : #ifdef PREFERRED_RELOAD_CLASS
    2237                 :             :   return (reg_class_t) PREFERRED_RELOAD_CLASS (x, (enum reg_class) rclass);
    2238                 :             : #else
    2239                 :           0 :   return rclass;
    2240                 :             : #endif
    2241                 :             : }
    2242                 :             : 
    2243                 :             : /* The default implementation of TARGET_OUTPUT_PREFERRED_RELOAD_CLASS.  */
    2244                 :             : 
    2245                 :             : reg_class_t
    2246                 :           0 : default_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED,
    2247                 :             :                                        reg_class_t rclass)
    2248                 :             : {
    2249                 :           0 :   return rclass;
    2250                 :             : }
    2251                 :             : 
    2252                 :             : /* The default implementation of TARGET_PREFERRED_RENAME_CLASS.  */
    2253                 :             : reg_class_t
    2254                 :      932080 : default_preferred_rename_class (reg_class_t rclass ATTRIBUTE_UNUSED)
    2255                 :             : {
    2256                 :      932080 :   return NO_REGS;
    2257                 :             : }
    2258                 :             : 
    2259                 :             : /* The default implementation of TARGET_CLASS_LIKELY_SPILLED_P.  */
    2260                 :             : 
    2261                 :             : bool
    2262                 :           0 : default_class_likely_spilled_p (reg_class_t rclass)
    2263                 :             : {
    2264                 :           0 :   return (reg_class_size[(int) rclass] == 1);
    2265                 :             : }
    2266                 :             : 
    2267                 :             : /* The default implementation of TARGET_CLASS_MAX_NREGS.  */
    2268                 :             : 
    2269                 :             : unsigned char
    2270                 :           0 : default_class_max_nregs (reg_class_t rclass ATTRIBUTE_UNUSED,
    2271                 :             :                          machine_mode mode ATTRIBUTE_UNUSED)
    2272                 :             : {
    2273                 :             : #ifdef CLASS_MAX_NREGS
    2274                 :             :   return (unsigned char) CLASS_MAX_NREGS ((enum reg_class) rclass,
    2275                 :             :                                           MACRO_MODE (mode));
    2276                 :             : #else
    2277                 :             :   /* Targets with variable-sized modes must provide their own definition
    2278                 :             :      of this hook.  */
    2279                 :           0 :   unsigned int size = GET_MODE_SIZE (mode).to_constant ();
    2280                 :           0 :   return (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
    2281                 :             : #endif
    2282                 :             : }
    2283                 :             : 
    2284                 :             : /* The default implementation of TARGET_AVOID_STORE_FORWARDING_P.  */
    2285                 :             : 
    2286                 :             : bool
    2287                 :           7 : default_avoid_store_forwarding_p (vec<store_fwd_info>, rtx, int total_cost,
    2288                 :             :                                   bool)
    2289                 :             : {
    2290                 :             :   /* Use a simple cost heurstic base on param_store_forwarding_max_distance.
    2291                 :             :      In general the distance should be somewhat correlated to the store
    2292                 :             :      forwarding penalty; if the penalty is large then it is justified to
    2293                 :             :      increase the window size.  Use this to reject sequences that are clearly
    2294                 :             :      unprofitable.
    2295                 :             :      Skip the cost check if param_store_forwarding_max_distance is 0.  */
    2296                 :           7 :   int max_cost = COSTS_N_INSNS (param_store_forwarding_max_distance / 2);
    2297                 :           7 :   const bool unlimited_cost = (param_store_forwarding_max_distance == 0);
    2298                 :           7 :   if (!unlimited_cost && total_cost > max_cost && max_cost)
    2299                 :             :     {
    2300                 :           1 :       if (dump_file)
    2301                 :           0 :         fprintf (dump_file, "Not transformed due to cost: %d > %d.\n",
    2302                 :             :                  total_cost, max_cost);
    2303                 :             : 
    2304                 :           1 :       return false;
    2305                 :             :     }
    2306                 :             : 
    2307                 :             :   return true;
    2308                 :             : }
    2309                 :             : 
    2310                 :             : /* Determine the debugging unwind mechanism for the target.  */
    2311                 :             : 
    2312                 :             : enum unwind_info_type
    2313                 :     1236399 : default_debug_unwind_info (void)
    2314                 :             : {
    2315                 :             :   /* If the target wants to force the use of dwarf2 unwind info, let it.  */
    2316                 :             :   /* ??? Change all users to the hook, then poison this.  */
    2317                 :             : #ifdef DWARF2_FRAME_INFO
    2318                 :             :   if (DWARF2_FRAME_INFO)
    2319                 :             :     return UI_DWARF2;
    2320                 :             : #endif
    2321                 :             : 
    2322                 :             :   /* Otherwise, only turn it on if dwarf2 debugging is enabled.  */
    2323                 :             : #ifdef DWARF2_DEBUGGING_INFO
    2324                 :     1236399 :   if (dwarf_debuginfo_p ())
    2325                 :      632013 :     return UI_DWARF2;
    2326                 :             : #endif
    2327                 :             : 
    2328                 :             :   return UI_NONE;
    2329                 :             : }
    2330                 :             : 
    2331                 :             : /* Targets that set NUM_POLY_INT_COEFFS to something greater than 1
    2332                 :             :    must define this hook.  */
    2333                 :             : 
    2334                 :             : unsigned int
    2335                 :           0 : default_dwarf_poly_indeterminate_value (unsigned int, unsigned int *, int *)
    2336                 :             : {
    2337                 :           0 :   gcc_unreachable ();
    2338                 :             : }
    2339                 :             : 
    2340                 :             : /* Determine the correct mode for a Dwarf frame register that represents
    2341                 :             :    register REGNO.  */
    2342                 :             : 
    2343                 :             : machine_mode
    2344                 :         736 : default_dwarf_frame_reg_mode (int regno)
    2345                 :             : {
    2346                 :         736 :   machine_mode save_mode = reg_raw_mode[regno];
    2347                 :             : 
    2348                 :         736 :   if (targetm.hard_regno_call_part_clobbered (eh_edge_abi.id (),
    2349                 :             :                                               regno, save_mode))
    2350                 :           0 :     save_mode = choose_hard_reg_mode (regno, 1, &eh_edge_abi);
    2351                 :         736 :   return save_mode;
    2352                 :             : }
    2353                 :             : 
    2354                 :             : /* To be used by targets where reg_raw_mode doesn't return the right
    2355                 :             :    mode for registers used in apply_builtin_return and apply_builtin_arg.  */
    2356                 :             : 
    2357                 :             : fixed_size_mode
    2358                 :        8217 : default_get_reg_raw_mode (int regno)
    2359                 :             : {
    2360                 :             :   /* Targets must override this hook if the underlying register is
    2361                 :             :      variable-sized.  */
    2362                 :        8217 :   return as_a <fixed_size_mode> (reg_raw_mode[regno]);
    2363                 :             : }
    2364                 :             : 
    2365                 :             : /* Return true if a leaf function should stay leaf even with profiling
    2366                 :             :    enabled.  */
    2367                 :             : 
    2368                 :             : bool
    2369                 :         754 : default_keep_leaf_when_profiled ()
    2370                 :             : {
    2371                 :         754 :   return false;
    2372                 :             : }
    2373                 :             : 
    2374                 :             : /* Return true if the state of option OPTION should be stored in PCH files
    2375                 :             :    and checked by default_pch_valid_p.  Store the option's current state
    2376                 :             :    in STATE if so.  */
    2377                 :             : 
    2378                 :             : static inline bool
    2379                 :    43913204 : option_affects_pch_p (int option, struct cl_option_state *state)
    2380                 :             : {
    2381                 :    43913204 :   if ((cl_options[option].flags & CL_TARGET) == 0)
    2382                 :             :     return false;
    2383                 :     3870288 :   if ((cl_options[option].flags & CL_PCH_IGNORE) != 0)
    2384                 :             :     return false;
    2385                 :     3870288 :   if (option_flag_var (option, &global_options) == &target_flags)
    2386                 :      643733 :     if (targetm.check_pch_target_flags)
    2387                 :             :       return false;
    2388                 :     3870288 :   return get_option_state (&global_options, option, state);
    2389                 :             : }
    2390                 :             : 
    2391                 :             : /* Default version of get_pch_validity.
    2392                 :             :    By default, every flag difference is fatal; that will be mostly right for
    2393                 :             :    most targets, but completely right for very few.  */
    2394                 :             : 
    2395                 :             : void *
    2396                 :         478 : default_get_pch_validity (size_t *sz)
    2397                 :             : {
    2398                 :         478 :   struct cl_option_state state;
    2399                 :         478 :   size_t i;
    2400                 :         478 :   char *result, *r;
    2401                 :             : 
    2402                 :         478 :   *sz = 2;
    2403                 :         478 :   if (targetm.check_pch_target_flags)
    2404                 :           0 :     *sz += sizeof (target_flags);
    2405                 :     1150546 :   for (i = 0; i < cl_options_count; i++)
    2406                 :     1150068 :     if (option_affects_pch_p (i, &state))
    2407                 :      110418 :       *sz += state.size;
    2408                 :             : 
    2409                 :         478 :   result = r = XNEWVEC (char, *sz);
    2410                 :         478 :   r[0] = flag_pic;
    2411                 :         478 :   r[1] = flag_pie;
    2412                 :         478 :   r += 2;
    2413                 :         478 :   if (targetm.check_pch_target_flags)
    2414                 :             :     {
    2415                 :           0 :       memcpy (r, &target_flags, sizeof (target_flags));
    2416                 :           0 :       r += sizeof (target_flags);
    2417                 :             :     }
    2418                 :             : 
    2419                 :     1150546 :   for (i = 0; i < cl_options_count; i++)
    2420                 :     1150068 :     if (option_affects_pch_p (i, &state))
    2421                 :             :       {
    2422                 :      110418 :         memcpy (r, state.data, state.size);
    2423                 :      110418 :         r += state.size;
    2424                 :             :       }
    2425                 :             : 
    2426                 :         478 :   return result;
    2427                 :             : }
    2428                 :             : 
    2429                 :             : /* Return a message which says that a PCH file was created with a different
    2430                 :             :    setting of OPTION.  */
    2431                 :             : 
    2432                 :             : static const char *
    2433                 :       18514 : pch_option_mismatch (const char *option)
    2434                 :             : {
    2435                 :       18514 :   return xasprintf (_("created and used with differing settings of '%s'"),
    2436                 :       18514 :                     option);
    2437                 :             : }
    2438                 :             : 
    2439                 :             : /* Default version of pch_valid_p.  */
    2440                 :             : 
    2441                 :             : const char *
    2442                 :       18873 : default_pch_valid_p (const void *data_p, size_t len ATTRIBUTE_UNUSED)
    2443                 :             : {
    2444                 :       18873 :   struct cl_option_state state;
    2445                 :       18873 :   const char *data = (const char *)data_p;
    2446                 :       18873 :   size_t i;
    2447                 :             : 
    2448                 :             :   /* -fpic and -fpie also usually make a PCH invalid.  */
    2449                 :       18873 :   if (data[0] != flag_pic)
    2450                 :           0 :     return _("created and used with different settings of %<-fpic%>");
    2451                 :       18873 :   if (data[1] != flag_pie)
    2452                 :           0 :     return _("created and used with different settings of %<-fpie%>");
    2453                 :       18873 :   data += 2;
    2454                 :             : 
    2455                 :             :   /* Check target_flags.  */
    2456                 :       18873 :   if (targetm.check_pch_target_flags)
    2457                 :             :     {
    2458                 :           0 :       int tf;
    2459                 :           0 :       const char *r;
    2460                 :             : 
    2461                 :           0 :       memcpy (&tf, data, sizeof (target_flags));
    2462                 :           0 :       data += sizeof (target_flags);
    2463                 :           0 :       r = targetm.check_pch_target_flags (tf);
    2464                 :           0 :       if (r != NULL)
    2465                 :             :         return r;
    2466                 :             :     }
    2467                 :             : 
    2468                 :    41613427 :   for (i = 0; i < cl_options_count; i++)
    2469                 :    41613068 :     if (option_affects_pch_p (i, &state))
    2470                 :             :       {
    2471                 :     3489505 :         if (memcmp (data, state.data, state.size) != 0)
    2472                 :       18514 :           return pch_option_mismatch (cl_options[i].opt_text);
    2473                 :     3470991 :         data += state.size;
    2474                 :             :       }
    2475                 :             : 
    2476                 :             :   return NULL;
    2477                 :             : }
    2478                 :             : 
    2479                 :             : /* Default version of cstore_mode.  */
    2480                 :             : 
    2481                 :             : scalar_int_mode
    2482                 :      624187 : default_cstore_mode (enum insn_code icode)
    2483                 :             : {
    2484                 :      624187 :   return as_a <scalar_int_mode> (insn_data[(int) icode].operand[0].mode);
    2485                 :             : }
    2486                 :             : 
    2487                 :             : /* Default version of member_type_forces_blk.  */
    2488                 :             : 
    2489                 :             : bool
    2490                 :           0 : default_member_type_forces_blk (const_tree, machine_mode)
    2491                 :             : {
    2492                 :           0 :   return false;
    2493                 :             : }
    2494                 :             : 
    2495                 :             : /* Default version of canonicalize_comparison.  */
    2496                 :             : 
    2497                 :             : void
    2498                 :           0 : default_canonicalize_comparison (int *, rtx *, rtx *, bool)
    2499                 :             : {
    2500                 :           0 : }
    2501                 :             : 
    2502                 :             : /* Default implementation of TARGET_ATOMIC_ASSIGN_EXPAND_FENV.  */
    2503                 :             : 
    2504                 :             : void
    2505                 :           0 : default_atomic_assign_expand_fenv (tree *, tree *, tree *)
    2506                 :             : {
    2507                 :           0 : }
    2508                 :             : 
    2509                 :             : #ifndef PAD_VARARGS_DOWN
    2510                 :             : #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
    2511                 :             : #endif
    2512                 :             : 
    2513                 :             : /* Build an indirect-ref expression over the given TREE, which represents a
    2514                 :             :    piece of a va_arg() expansion.  */
    2515                 :             : tree
    2516                 :       54452 : build_va_arg_indirect_ref (tree addr)
    2517                 :             : {
    2518                 :       54452 :   addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr);
    2519                 :       54452 :   return addr;
    2520                 :             : }
    2521                 :             : 
    2522                 :             : /* The "standard" implementation of va_arg: read the value from the
    2523                 :             :    current (padded) address and increment by the (padded) size.  */
    2524                 :             : 
    2525                 :             : tree
    2526                 :         260 : std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
    2527                 :             :                           gimple_seq *post_p)
    2528                 :             : {
    2529                 :         260 :   tree addr, t, type_size, rounded_size, valist_tmp;
    2530                 :         260 :   unsigned HOST_WIDE_INT align, boundary;
    2531                 :         260 :   bool indirect;
    2532                 :             : 
    2533                 :             :   /* All of the alignment and movement below is for args-grow-up machines.
    2534                 :             :      As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
    2535                 :             :      implement their own specialized gimplify_va_arg_expr routines.  */
    2536                 :         260 :   if (ARGS_GROW_DOWNWARD)
    2537                 :             :     gcc_unreachable ();
    2538                 :             : 
    2539                 :         260 :   indirect = pass_va_arg_by_reference (type);
    2540                 :         260 :   if (indirect)
    2541                 :          33 :     type = build_pointer_type (type);
    2542                 :             : 
    2543                 :         260 :   if (targetm.calls.split_complex_arg
    2544                 :           0 :       && TREE_CODE (type) == COMPLEX_TYPE
    2545                 :         260 :       && targetm.calls.split_complex_arg (type))
    2546                 :             :     {
    2547                 :           0 :       tree real_part, imag_part;
    2548                 :             : 
    2549                 :           0 :       real_part = std_gimplify_va_arg_expr (valist,
    2550                 :           0 :                                             TREE_TYPE (type), pre_p, NULL);
    2551                 :           0 :       real_part = get_initialized_tmp_var (real_part, pre_p);
    2552                 :             : 
    2553                 :           0 :       imag_part = std_gimplify_va_arg_expr (unshare_expr (valist),
    2554                 :           0 :                                             TREE_TYPE (type), pre_p, NULL);
    2555                 :           0 :       imag_part = get_initialized_tmp_var (imag_part, pre_p);
    2556                 :             : 
    2557                 :           0 :       return build2 (COMPLEX_EXPR, type, real_part, imag_part);
    2558                 :             :    }
    2559                 :             : 
    2560                 :         260 :   align = PARM_BOUNDARY / BITS_PER_UNIT;
    2561                 :         260 :   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
    2562                 :             : 
    2563                 :             :   /* When we align parameter on stack for caller, if the parameter
    2564                 :             :      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
    2565                 :             :      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
    2566                 :             :      here with caller.  */
    2567                 :         260 :   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
    2568                 :             :     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
    2569                 :             : 
    2570                 :         260 :   boundary /= BITS_PER_UNIT;
    2571                 :             : 
    2572                 :             :   /* Hoist the valist value into a temporary for the moment.  */
    2573                 :         260 :   valist_tmp = get_initialized_tmp_var (valist, pre_p);
    2574                 :             : 
    2575                 :             :   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
    2576                 :             :      requires greater alignment, we must perform dynamic alignment.  */
    2577                 :         260 :   if (boundary > align
    2578                 :           4 :       && !TYPE_EMPTY_P (type)
    2579                 :         264 :       && !integer_zerop (TYPE_SIZE (type)))
    2580                 :             :     {
    2581                 :           4 :       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
    2582                 :           4 :                   fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
    2583                 :           4 :       gimplify_and_add (t, pre_p);
    2584                 :             : 
    2585                 :           8 :       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
    2586                 :           8 :                   fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
    2587                 :             :                                valist_tmp,
    2588                 :             :                                build_int_cst (TREE_TYPE (valist), -boundary)));
    2589                 :           4 :       gimplify_and_add (t, pre_p);
    2590                 :             :     }
    2591                 :             :   else
    2592                 :             :     boundary = align;
    2593                 :             : 
    2594                 :             :   /* If the actual alignment is less than the alignment of the type,
    2595                 :             :      adjust the type accordingly so that we don't assume strict alignment
    2596                 :             :      when dereferencing the pointer.  */
    2597                 :         260 :   boundary *= BITS_PER_UNIT;
    2598                 :         260 :   if (boundary < TYPE_ALIGN (type))
    2599                 :             :     {
    2600                 :          22 :       type = build_variant_type_copy (type);
    2601                 :          22 :       SET_TYPE_ALIGN (type, boundary);
    2602                 :             :     }
    2603                 :             : 
    2604                 :             :   /* Compute the rounded size of the type.  */
    2605                 :         260 :   type_size = arg_size_in_bytes (type);
    2606                 :         260 :   rounded_size = round_up (type_size, align);
    2607                 :             : 
    2608                 :             :   /* Reduce rounded_size so it's sharable with the postqueue.  */
    2609                 :         260 :   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
    2610                 :             : 
    2611                 :             :   /* Get AP.  */
    2612                 :         260 :   addr = valist_tmp;
    2613                 :         260 :   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
    2614                 :             :     {
    2615                 :             :       /* Small args are padded downward.  */
    2616                 :             :       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
    2617                 :             :                        rounded_size, size_int (align));
    2618                 :             :       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
    2619                 :             :                        size_binop (MINUS_EXPR, rounded_size, type_size));
    2620                 :             :       addr = fold_build_pointer_plus (addr, t);
    2621                 :             :     }
    2622                 :             : 
    2623                 :             :   /* Compute new value for AP.  */
    2624                 :         260 :   t = fold_build_pointer_plus (valist_tmp, rounded_size);
    2625                 :         260 :   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
    2626                 :         260 :   gimplify_and_add (t, pre_p);
    2627                 :             : 
    2628                 :         260 :   addr = fold_convert (build_pointer_type (type), addr);
    2629                 :             : 
    2630                 :         260 :   if (indirect)
    2631                 :          33 :     addr = build_va_arg_indirect_ref (addr);
    2632                 :             : 
    2633                 :         260 :   return build_va_arg_indirect_ref (addr);
    2634                 :             : }
    2635                 :             : 
    2636                 :             : /* An implementation of TARGET_CAN_USE_DOLOOP_P for targets that do
    2637                 :             :    not support nested low-overhead loops.  */
    2638                 :             : 
    2639                 :             : bool
    2640                 :           0 : can_use_doloop_if_innermost (const widest_int &, const widest_int &,
    2641                 :             :                              unsigned int loop_depth, bool)
    2642                 :             : {
    2643                 :           0 :   return loop_depth == 1;
    2644                 :             : }
    2645                 :             : 
    2646                 :             : /* Default implementation of TARGET_OPTAB_SUPPORTED_P.  */
    2647                 :             : 
    2648                 :             : bool
    2649                 :           0 : default_optab_supported_p (int, machine_mode, machine_mode, optimization_type)
    2650                 :             : {
    2651                 :           0 :   return true;
    2652                 :             : }
    2653                 :             : 
    2654                 :             : /* Default implementation of TARGET_MAX_NOCE_IFCVT_SEQ_COST.  */
    2655                 :             : 
    2656                 :             : unsigned int
    2657                 :           0 : default_max_noce_ifcvt_seq_cost (edge e)
    2658                 :             : {
    2659                 :           0 :   bool predictable_p = predictable_edge_p (e);
    2660                 :             : 
    2661                 :           0 :   if (predictable_p)
    2662                 :             :     {
    2663                 :           0 :       if (OPTION_SET_P (param_max_rtl_if_conversion_predictable_cost))
    2664                 :           0 :         return param_max_rtl_if_conversion_predictable_cost;
    2665                 :             :     }
    2666                 :             :   else
    2667                 :             :     {
    2668                 :           0 :       if (OPTION_SET_P (param_max_rtl_if_conversion_unpredictable_cost))
    2669                 :           0 :         return param_max_rtl_if_conversion_unpredictable_cost;
    2670                 :             :     }
    2671                 :             : 
    2672                 :           0 :   return BRANCH_COST (true, predictable_p) * COSTS_N_INSNS (3);
    2673                 :             : }
    2674                 :             : 
    2675                 :             : /* Default implementation of TARGET_MIN_ARITHMETIC_PRECISION.  */
    2676                 :             : 
    2677                 :             : unsigned int
    2678                 :       71953 : default_min_arithmetic_precision (void)
    2679                 :             : {
    2680                 :       71953 :   return WORD_REGISTER_OPERATIONS ? BITS_PER_WORD : BITS_PER_UNIT;
    2681                 :             : }
    2682                 :             : 
    2683                 :             : /* Default implementation of TARGET_C_EXCESS_PRECISION.  */
    2684                 :             : 
    2685                 :             : enum flt_eval_method
    2686                 :           0 : default_excess_precision (enum excess_precision_type ATTRIBUTE_UNUSED)
    2687                 :             : {
    2688                 :           0 :   return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
    2689                 :             : }
    2690                 :             : 
    2691                 :             : /* Return true if _BitInt(N) is supported and fill details about it into
    2692                 :             :    *INFO.  */
    2693                 :             : bool
    2694                 :           0 : default_bitint_type_info (int, struct bitint_info *)
    2695                 :             : {
    2696                 :           0 :   return false;
    2697                 :             : }
    2698                 :             : 
    2699                 :             : /* Default implementation for
    2700                 :             :   TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE.  */
    2701                 :             : HOST_WIDE_INT
    2702                 :          16 : default_stack_clash_protection_alloca_probe_range (void)
    2703                 :             : {
    2704                 :          16 :   return 0;
    2705                 :             : }
    2706                 :             : 
    2707                 :             : /* The default implementation of TARGET_EARLY_REMAT_MODES.  */
    2708                 :             : 
    2709                 :             : void
    2710                 :           0 : default_select_early_remat_modes (sbitmap)
    2711                 :             : {
    2712                 :           0 : }
    2713                 :             : 
    2714                 :             : /* The default implementation of TARGET_PREFERRED_ELSE_VALUE.  */
    2715                 :             : 
    2716                 :             : tree
    2717                 :         514 : default_preferred_else_value (unsigned, tree type, unsigned, tree *)
    2718                 :             : {
    2719                 :         514 :   return build_zero_cst (type);
    2720                 :             : }
    2721                 :             : 
    2722                 :             : /* Default implementation of TARGET_HAVE_SPECULATION_SAFE_VALUE.  */
    2723                 :             : bool
    2724                 :      202866 : default_have_speculation_safe_value (bool active ATTRIBUTE_UNUSED)
    2725                 :             : {
    2726                 :             : #ifdef HAVE_speculation_barrier
    2727                 :      202866 :   return active ? HAVE_speculation_barrier : true;
    2728                 :             : #else
    2729                 :             :   return false;
    2730                 :             : #endif
    2731                 :             : }
    2732                 :             : /* Alternative implementation of TARGET_HAVE_SPECULATION_SAFE_VALUE
    2733                 :             :    that can be used on targets that never have speculative execution.  */
    2734                 :             : bool
    2735                 :           0 : speculation_safe_value_not_needed (bool active)
    2736                 :             : {
    2737                 :           0 :   return !active;
    2738                 :             : }
    2739                 :             : 
    2740                 :             : /* Default implementation of the speculation-safe-load builtin.  This
    2741                 :             :    implementation simply copies val to result and generates a
    2742                 :             :    speculation_barrier insn, if such a pattern is defined.  */
    2743                 :             : rtx
    2744                 :          33 : default_speculation_safe_value (machine_mode mode ATTRIBUTE_UNUSED,
    2745                 :             :                                 rtx result, rtx val,
    2746                 :             :                                 rtx failval ATTRIBUTE_UNUSED)
    2747                 :             : {
    2748                 :          33 :   emit_move_insn (result, val);
    2749                 :             : 
    2750                 :             : #ifdef HAVE_speculation_barrier
    2751                 :             :   /* Assume the target knows what it is doing: if it defines a
    2752                 :             :      speculation barrier, but it is not enabled, then assume that one
    2753                 :             :      isn't needed.  */
    2754                 :          33 :   if (HAVE_speculation_barrier)
    2755                 :          33 :     emit_insn (gen_speculation_barrier ());
    2756                 :             : #endif
    2757                 :             : 
    2758                 :          33 :   return result;
    2759                 :             : }
    2760                 :             : 
    2761                 :             : /* How many bits to shift in order to access the tag bits.
    2762                 :             :    The default is to store the tag in the top 8 bits of a 64 bit pointer, hence
    2763                 :             :    shifting 56 bits will leave just the tag.  */
    2764                 :             : #define HWASAN_SHIFT (GET_MODE_PRECISION (Pmode) - 8)
    2765                 :             : #define HWASAN_SHIFT_RTX GEN_INT (HWASAN_SHIFT)
    2766                 :             : 
    2767                 :             : bool
    2768                 :           0 : default_memtag_can_tag_addresses ()
    2769                 :             : {
    2770                 :           0 :   return false;
    2771                 :             : }
    2772                 :             : 
    2773                 :             : uint8_t
    2774                 :           0 : default_memtag_tag_size ()
    2775                 :             : {
    2776                 :           0 :   return 8;
    2777                 :             : }
    2778                 :             : 
    2779                 :             : uint8_t
    2780                 :        1202 : default_memtag_granule_size ()
    2781                 :             : {
    2782                 :        1202 :   return 16;
    2783                 :             : }
    2784                 :             : 
    2785                 :             : /* The default implementation of TARGET_MEMTAG_INSERT_RANDOM_TAG.  */
    2786                 :             : rtx
    2787                 :          60 : default_memtag_insert_random_tag (rtx untagged, rtx target)
    2788                 :             : {
    2789                 :          60 :   gcc_assert (param_hwasan_instrument_stack);
    2790                 :          60 :   if (param_hwasan_random_frame_tag)
    2791                 :             :     {
    2792                 :          16 :       rtx fn = init_one_libfunc ("__hwasan_generate_tag");
    2793                 :          16 :       rtx new_tag = emit_library_call_value (fn, NULL_RTX, LCT_NORMAL, QImode);
    2794                 :          16 :       return targetm.memtag.set_tag (untagged, new_tag, target);
    2795                 :             :     }
    2796                 :             :   else
    2797                 :             :     {
    2798                 :             :       /* NOTE: The kernel API does not have __hwasan_generate_tag exposed.
    2799                 :             :          In the future we may add the option emit random tags with inline
    2800                 :             :          instrumentation instead of function calls.  This would be the same
    2801                 :             :          between the kernel and userland.  */
    2802                 :             :       return untagged;
    2803                 :             :     }
    2804                 :             : }
    2805                 :             : 
    2806                 :             : /* The default implementation of TARGET_MEMTAG_ADD_TAG.  */
    2807                 :             : rtx
    2808                 :           0 : default_memtag_add_tag (rtx base, poly_int64 offset, uint8_t tag_offset)
    2809                 :             : {
    2810                 :             :   /* Need to look into what the most efficient code sequence is.
    2811                 :             :      This is a code sequence that would be emitted *many* times, so we
    2812                 :             :      want it as small as possible.
    2813                 :             : 
    2814                 :             :      There are two places where tag overflow is a question:
    2815                 :             :        - Tagging the shadow stack.
    2816                 :             :           (both tagging and untagging).
    2817                 :             :        - Tagging addressable pointers.
    2818                 :             : 
    2819                 :             :      We need to ensure both behaviors are the same (i.e. that the tag that
    2820                 :             :      ends up in a pointer after "overflowing" the tag bits with a tag addition
    2821                 :             :      is the same that ends up in the shadow space).
    2822                 :             : 
    2823                 :             :      The aim is that the behavior of tag addition should follow modulo
    2824                 :             :      wrapping in both instances.
    2825                 :             : 
    2826                 :             :      The libhwasan code doesn't have any path that increments a pointer's tag,
    2827                 :             :      which means it has no opinion on what happens when a tag increment
    2828                 :             :      overflows (and hence we can choose our own behavior).  */
    2829                 :             : 
    2830                 :           0 :   offset += ((uint64_t)tag_offset << HWASAN_SHIFT);
    2831                 :           0 :   return plus_constant (Pmode, base, offset);
    2832                 :             : }
    2833                 :             : 
    2834                 :             : /* The default implementation of TARGET_MEMTAG_SET_TAG.  */
    2835                 :             : rtx
    2836                 :           0 : default_memtag_set_tag (rtx untagged, rtx tag, rtx target)
    2837                 :             : {
    2838                 :           0 :   gcc_assert (GET_MODE (untagged) == Pmode && GET_MODE (tag) == QImode);
    2839                 :           0 :   tag = expand_simple_binop (Pmode, ASHIFT, tag, HWASAN_SHIFT_RTX, NULL_RTX,
    2840                 :             :                              /* unsignedp = */1, OPTAB_WIDEN);
    2841                 :           0 :   rtx ret = expand_simple_binop (Pmode, IOR, untagged, tag, target,
    2842                 :             :                                  /* unsignedp = */1, OPTAB_DIRECT);
    2843                 :           0 :   gcc_assert (ret);
    2844                 :           0 :   return ret;
    2845                 :             : }
    2846                 :             : 
    2847                 :             : /* The default implementation of TARGET_MEMTAG_EXTRACT_TAG.  */
    2848                 :             : rtx
    2849                 :           0 : default_memtag_extract_tag (rtx tagged_pointer, rtx target)
    2850                 :             : {
    2851                 :           0 :   rtx tag = expand_simple_binop (Pmode, LSHIFTRT, tagged_pointer,
    2852                 :           0 :                                  HWASAN_SHIFT_RTX, target,
    2853                 :             :                                  /* unsignedp = */0,
    2854                 :             :                                  OPTAB_DIRECT);
    2855                 :           0 :   rtx ret = gen_lowpart (QImode, tag);
    2856                 :           0 :   gcc_assert (ret);
    2857                 :           0 :   return ret;
    2858                 :             : }
    2859                 :             : 
    2860                 :             : /* The default implementation of TARGET_MEMTAG_UNTAGGED_POINTER.  */
    2861                 :             : rtx
    2862                 :           0 : default_memtag_untagged_pointer (rtx tagged_pointer, rtx target)
    2863                 :             : {
    2864                 :           0 :   rtx tag_mask = gen_int_mode ((HOST_WIDE_INT_1U << HWASAN_SHIFT) - 1, Pmode);
    2865                 :           0 :   rtx untagged_base = expand_simple_binop (Pmode, AND, tagged_pointer,
    2866                 :             :                                            tag_mask, target, true,
    2867                 :             :                                            OPTAB_DIRECT);
    2868                 :           0 :   gcc_assert (untagged_base);
    2869                 :           0 :   return untagged_base;
    2870                 :             : }
    2871                 :             : 
    2872                 :             : #include "gt-targhooks.h"
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.