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