s390-builtins.h revision 1.1 1 1.1 mrg /* Common data structures used for builtin handling on S/390.
2 1.1 mrg Copyright (C) 2015 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.1 mrg s390-builtins.c as well as s390-c.c. 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.1 mrg opflags_overloaded_builtin_var[S390_OVERLOADED_BUILTIN_VAR_MAX + 1];
149 1.1 mrg
150 1.1 mrg static inline unsigned int
151 1.1 mrg bflags_for_builtin (int fcode)
152 1.1 mrg {
153 1.1 mrg if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET)
154 1.1 mrg gcc_unreachable ();
155 1.1 mrg else if (fcode >= S390_OVERLOADED_BUILTIN_OFFSET)
156 1.1 mrg return bflags_overloaded_builtin[fcode - S390_BUILTIN_MAX];
157 1.1 mrg else
158 1.1 mrg return bflags_builtin[fcode];
159 1.1 mrg }
160 1.1 mrg
161 1.1 mrg static inline unsigned int
162 1.1 mrg opflags_for_builtin (int fcode)
163 1.1 mrg {
164 1.1 mrg if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET)
165 1.1 mrg return opflags_overloaded_builtin_var[fcode -
166 1.1 mrg S390_OVERLOADED_BUILTIN_VAR_OFFSET];
167 1.1 mrg else if (fcode >= S390_OVERLOADED_BUILTIN_OFFSET)
168 1.1 mrg gcc_unreachable ();
169 1.1 mrg else
170 1.1 mrg return opflags_builtin[fcode];
171 1.1 mrg }
172 1.1 mrg
173 1.1 mrg extern tree s390_builtin_decls[S390_BUILTIN_MAX +
174 1.1 mrg S390_OVERLOADED_BUILTIN_MAX +
175 1.1 mrg S390_OVERLOADED_BUILTIN_VAR_MAX];
176