1 /* Common data structures used for builtin handling on S/390.
2    Copyright (C) 2015-2018 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
bflags_for_builtin(int fcode)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
opflags_for_builtin(int fcode)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