1 /* Common data structures used for builtin handling on S/390. 2 Copyright (C) 2015-2020 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.c as well as s390-c.c. 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]; 178