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