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 29enum 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 49enum 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 69enum 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 91extern tree s390_builtin_types[BT_MAX]; 92extern tree s390_builtin_fn_types[BT_FN_MAX]; 93 94 /* Builtins. */ 95 96enum 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. */ 111enum 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" 119S390_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. */ 124enum 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" 132S390_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 142extern const unsigned int bflags_builtin[S390_BUILTIN_MAX + 1]; 143extern const unsigned int opflags_builtin[S390_BUILTIN_MAX + 1]; 144 145extern const unsigned int 146 bflags_overloaded_builtin[S390_OVERLOADED_BUILTIN_MAX + 1]; 147extern const unsigned int 148 bflags_overloaded_builtin_var[S390_OVERLOADED_BUILTIN_VAR_MAX + 1]; 149extern const unsigned int 150 opflags_overloaded_builtin_var[S390_OVERLOADED_BUILTIN_VAR_MAX + 1]; 151 152static inline unsigned int 153bflags_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 163static inline unsigned int 164opflags_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 175extern tree s390_builtin_decls[S390_BUILTIN_MAX + 176 S390_OVERLOADED_BUILTIN_MAX + 177 S390_OVERLOADED_BUILTIN_VAR_MAX]; 178