1  /* Common data structures used for builtin handling on S/390.
       2     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       3  
       4     Contributed by Andreas Krebbel (Andreas.Krebbel@de.ibm.com).
       5  
       6     This file is part of GCC.
       7  
       8     GCC is free software; you can redistribute it and/or modify it
       9     under the terms of the GNU General Public License as published by
      10     the Free Software Foundation; either version 3, or (at your option)
      11     any later version.
      12  
      13     GCC is distributed in the hope that it will be useful, but WITHOUT
      14     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      16     License for more details.
      17  
      18     You should have received a copy of the GNU General Public License
      19     along with GCC; see the file COPYING3.  If not see
      20     <http://www.gnu.org/licenses/>.  */
      21  
      22  /* This files contains data structure definitions which can be used by
      23     s390-builtins.cc as well as s390-c.cc.  Since the latter is
      24     considered to be part of the front-end we have to be careful not
      25     to use any of tree and rtx like data structures.  */
      26  
      27  /* Builtin types, data and prototypes. */
      28  
      29  enum s390_builtin_type_index
      30  {
      31  #undef DEF_TYPE
      32  #undef DEF_POINTER_TYPE
      33  #undef DEF_DISTINCT_TYPE
      34  #undef DEF_VECTOR_TYPE
      35  #undef DEF_OPAQUE_VECTOR_TYPE
      36  #undef DEF_FN_TYPE
      37  #undef DEF_OV_TYPE
      38  #define DEF_TYPE(INDEX, ...) INDEX,
      39  #define DEF_POINTER_TYPE(INDEX, ...) INDEX,
      40  #define DEF_DISTINCT_TYPE(INDEX, ...) INDEX,
      41  #define DEF_VECTOR_TYPE(INDEX, ...) INDEX,
      42  #define DEF_OPAQUE_VECTOR_TYPE(INDEX, ...) INDEX,
      43  #define DEF_FN_TYPE(...)
      44  #define DEF_OV_TYPE(...)
      45  #include "s390-builtin-types.def"
      46    BT_MAX
      47  };
      48  
      49  enum s390_builtin_fn_type_index
      50  {
      51  #undef DEF_TYPE
      52  #undef DEF_POINTER_TYPE
      53  #undef DEF_DISTINCT_TYPE
      54  #undef DEF_VECTOR_TYPE
      55  #undef DEF_OPAQUE_VECTOR_TYPE
      56  #undef DEF_FN_TYPE
      57  #undef DEF_OV_TYPE
      58  #define DEF_TYPE(...)
      59  #define DEF_POINTER_TYPE(...)
      60  #define DEF_DISTINCT_TYPE(...)
      61  #define DEF_VECTOR_TYPE(...)
      62  #define DEF_OPAQUE_VECTOR_TYPE(...)
      63  #define DEF_FN_TYPE(INDEX, ...) INDEX,
      64  #define DEF_OV_TYPE(...)
      65  #include "s390-builtin-types.def"
      66    BT_FN_MAX
      67  };
      68  
      69  enum s390_builtin_ov_type_index
      70  {
      71  #undef DEF_TYPE
      72  #undef DEF_POINTER_TYPE
      73  #undef DEF_DISTINCT_TYPE
      74  #undef DEF_VECTOR_TYPE
      75  #undef DEF_OPAQUE_VECTOR_TYPE
      76  #undef DEF_FN_TYPE
      77  #undef DEF_OV_TYPE
      78  #define DEF_TYPE(...)
      79  #define DEF_POINTER_TYPE(...)
      80  #define DEF_DISTINCT_TYPE(...)
      81  #define DEF_VECTOR_TYPE(...)
      82  #define DEF_OPAQUE_VECTOR_TYPE(...)
      83  #define DEF_FN_TYPE(...)
      84  #define DEF_OV_TYPE(INDEX, ...) INDEX,
      85  #include "s390-builtin-types.def"
      86    BT_OV_MAX
      87  };
      88  
      89  #define MAX_OV_OPERANDS 6
      90  
      91  extern tree s390_builtin_types[BT_MAX];
      92  extern tree s390_builtin_fn_types[BT_FN_MAX];
      93  
      94    /* Builtins.  */
      95  
      96  enum s390_builtins {
      97  #undef B_DEF
      98  #undef OB_DEF
      99  #undef OB_DEF_VAR
     100  #define B_DEF(NAME, ...) S390_BUILTIN_##NAME,
     101  #define OB_DEF(...)
     102  #define OB_DEF_VAR(...)
     103  
     104  #include "s390-builtins.def"
     105    S390_BUILTIN_MAX
     106  };
     107  
     108  
     109  /* Generate an enumeration of all overloaded builtins defined with
     110     OB_DEF in s390-builtins.def.  */
     111  enum s390_overloaded_builtins {
     112  #undef B_DEF
     113  #undef OB_DEF
     114  #undef OB_DEF_VAR
     115  #define B_DEF(...)
     116  #define OB_DEF(NAME, ...) S390_OVERLOADED_BUILTIN_##NAME,
     117  #define OB_DEF_VAR(...)
     118  #include "s390-builtins.def"
     119  S390_OVERLOADED_BUILTIN_MAX
     120  };
     121  
     122  /* Generate an enumeration of all variants of overloaded builtins
     123     defined with OB_DEF_VAR in s390-builtins.def.  */
     124  enum s390_overloaded_builtin_vars {
     125  #undef B_DEF
     126  #undef OB_DEF
     127  #undef OB_DEF_VAR
     128  #define B_DEF(...)
     129  #define OB_DEF(...)
     130  #define OB_DEF_VAR(NAME, ...) S390_OVERLOADED_BUILTIN_VAR_##NAME,
     131  #include "s390-builtins.def"
     132  S390_OVERLOADED_BUILTIN_VAR_MAX
     133  };
     134  
     135  #define S390_OVERLOADED_BUILTIN_OFFSET S390_BUILTIN_MAX
     136  #define S390_OVERLOADED_BUILTIN_VAR_OFFSET \
     137    (S390_BUILTIN_MAX + S390_OVERLOADED_BUILTIN_MAX)
     138  #define S390_ALL_BUILTIN_MAX				\
     139    (S390_BUILTIN_MAX + S390_OVERLOADED_BUILTIN_MAX +	\
     140     S390_OVERLOADED_BUILTIN_VAR_MAX)
     141  
     142  extern const unsigned int bflags_builtin[S390_BUILTIN_MAX + 1];
     143  extern const unsigned int opflags_builtin[S390_BUILTIN_MAX + 1];
     144  
     145  extern const unsigned int
     146    bflags_overloaded_builtin[S390_OVERLOADED_BUILTIN_MAX + 1];
     147  extern const unsigned int
     148    bflags_overloaded_builtin_var[S390_OVERLOADED_BUILTIN_VAR_MAX + 1];
     149  extern const unsigned int
     150    opflags_overloaded_builtin_var[S390_OVERLOADED_BUILTIN_VAR_MAX + 1];
     151  
     152  static inline unsigned int
     153  bflags_for_builtin (int fcode)
     154  {
     155    if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET)
     156      gcc_unreachable ();
     157    else if (fcode >= S390_OVERLOADED_BUILTIN_OFFSET)
     158      return bflags_overloaded_builtin[fcode - S390_BUILTIN_MAX];
     159    else
     160      return bflags_builtin[fcode];
     161  }
     162  
     163  static inline unsigned int
     164  opflags_for_builtin (int fcode)
     165  {
     166    if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET)
     167      return opflags_overloaded_builtin_var[fcode -
     168  					  S390_OVERLOADED_BUILTIN_VAR_OFFSET];
     169    else if (fcode >= S390_OVERLOADED_BUILTIN_OFFSET)
     170      gcc_unreachable ();
     171    else
     172      return opflags_builtin[fcode];
     173  }
     174  
     175  extern tree s390_builtin_decls[S390_BUILTIN_MAX +
     176  			       S390_OVERLOADED_BUILTIN_MAX +
     177  			       S390_OVERLOADED_BUILTIN_VAR_MAX];