PIPS
patterns.y
Go to the documentation of this file.
1 /*
2 
3  $Id: patterns.y 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 %{
26 #ifdef HAVE_CONFIG_H
27  #include "pips_config.h"
28 #endif
29 
30 #include <stdio.h>
31 
32 #include "genC.h"
33 #include "linear.h"
34 #include "ri.h"
35 
36 #include "resources.h"
37 
38 #include "misc.h"
39 #include "ri-util.h"
40 
41 #include "sac.h"
42 
43 static size_t opcode_argc =0;
44 size_t sac_lineno = 0;
45 
46 /* fake helpers */
47 #define TOKEN_NEWGEN_DOMAIN (-1)
48 #define ARGUMENT_NEWGEN_DOMAIN (-1)
49 #define gen_TOKEN_cons(t,l) gen_cons(t,l)
50 #define gen_ARGUMENT_cons(a,l) gen_cons(a,l)
51 
52 
53 %}
54 
55 
56 %union {
57  intptr_t tokenId;
58  intptr_t typeId;
59  list tokenList;
60  list typeList;
61 
62  patternArg argument;
63  list argsList;
64 
65  int iVal;
66  float fVal;
67  char * strVal;
68 
69  opcode opVal;
70  list opcodesList;
71 
72  list mappingsList;
73 }
74 
75 %type <tokenId> token;
76 %type <typeId> type;
77 %type <tokenList> tokens_list;
78 %type <typeList> types_list;
79 
80 %type <argument> argument;
81 %type <argsList> arguments_list;
82 %type <argsList> merge_arguments;
83 
84 %type <opVal> opcode;
85 %type <opcodesList> opcodes_list;
86 %type <mappingsList> mappings;
87 
88 %token UNKNOWN_TOK
89 %token REFERENCE_TOK
90 %token QI_REF_TOK
91 %token HI_REF_TOK
92 %token SI_REF_TOK
93 %token DI_REF_TOK
94 %token SF_REF_TOK
95 %token DF_REF_TOK
96 %token SC_REF_TOK
97 %token DC_REF_TOK
98 %token LOG_REF_TOK
99 %token CONSTANT_TOK
100 
101 %token ASSIGN_OPERATOR_TOK
102 %token PLUS_OPERATOR_TOK
103 %token MINUS_OPERATOR_TOK
104 %token UNARY_MINUS_OPERATOR_TOK
105 %token MULTIPLY_OPERATOR_TOK
106 %token MULADD_OPERATOR_TOK
107 %token DIVIDE_OPERATOR_TOK
108 %token INVERSE_OPERATOR_TOK
109 %token POWER_OPERATOR_TOK
110 %token MODULO_OPERATOR_TOK
111 %token MIN_OPERATOR_TOK
112 %token COS_OPERATOR_TOK
113 %token SIN_OPERATOR_TOK
114 %token MIN0_OPERATOR_TOK
115 %token AMIN1_OPERATOR_TOK
116 %token DMIN1_OPERATOR_TOK
117 %token MAX_OPERATOR_TOK
118 %token MAX0_OPERATOR_TOK
119 %token AMAX1_OPERATOR_TOK
120 %token DMAX1_OPERATOR_TOK
121 %token ABS_OPERATOR_TOK
122 %token IABS_OPERATOR_TOK
123 %token DABS_OPERATOR_TOK
124 %token CABS_OPERATOR_TOK
125 
126 %token AND_OPERATOR_TOK
127 %token OR_OPERATOR_TOK
128 %token NOT_OPERATOR_TOK
129 %token NON_EQUAL_OPERATOR_TOK
130 %token EQUIV_OPERATOR_TOK
131 %token NON_EQUIV_OPERATOR_TOK
132 
133 %token TRUE_OPERATOR_TOK
134 %token FALSE_OPERATOR_TOK
135 
136 %token GREATER_OR_EQUAL_OPERATOR_TOK
137 %token GREATER_THAN_OPERATOR_TOK
138 %token LESS_OR_EQUAL_OPERATOR_TOK
139 %token LESS_THAN_OPERATOR_TOK
140 %token EQUAL_OPERATOR_TOK
141 %token PHI_TOK
142 
143 %token <iVal> INTEGER_TOK
144 %token <fVal> FLOAT_TOK
145 %token <strVal> IDENTIFIER_TOK
146 
147 %%
148 
149 definitions:
150  definitions_list
151  ;
152 
153 definitions_list:
154  definitions_list definition
155  |
156  ;
157 
158 definition:
159  operation
160  | pattern
161  | transformation
162  ;
163 
164 operation:
165  IDENTIFIER_TOK '{' opcodes_list '}'
166  {
167  insert_opcodeClass($1, opcode_argc, $3);
168  opcode_argc=0;
169  }
170 
171 opcodes_list:
172  opcodes_list opcode { $$ = CONS(OPCODE, $2, $1); }
173  | { $$ = NIL; }
174 
175 opcode:
176  IDENTIFIER_TOK ':' types_list ',' INTEGER_TOK ';'
177  {
178  if(opcode_argc<=0)opcode_argc=gen_length($3);
179  else pips_assert("all opcode of the same operation have the same lenght\n",opcode_argc == gen_length($3));
180  $$ = generate_opcode($1, $3, $5);
181  }
182 
183 pattern:
184  IDENTIFIER_TOK ':' tokens_list merge_arguments ';'
185  {
186  insert_pattern($1, $3, $4);
187  }
188 
189 types_list:
190  type types_list { $$ = CONS(int, $1, $2); }
191  | { $$ = NIL; }
192 
193 type:
194  QI_REF_TOK { $$ = QI_REF_TOK; }
195  | HI_REF_TOK { $$ = HI_REF_TOK; }
196  | SI_REF_TOK { $$ = SI_REF_TOK; }
197  | DI_REF_TOK { $$ = DI_REF_TOK; }
198  | SF_REF_TOK { $$ = SF_REF_TOK; }
199  | DF_REF_TOK { $$ = DF_REF_TOK; }
200  | SC_REF_TOK { $$ = SC_REF_TOK; }
201  | DC_REF_TOK { $$ = DC_REF_TOK; }
202  | LOG_REF_TOK { $$ = LOG_REF_TOK; }
203 
204 tokens_list:
205  token tokens_list {
206  $$ = CONS(TOKEN, (void*)$1, $2);
207  }
208  | { $$ = NIL; }
209 
210 token:
211  REFERENCE_TOK { $$ = REFERENCE_TOK; }
212  | CONSTANT_TOK { $$ = CONSTANT_TOK; }
213  | ASSIGN_OPERATOR_TOK { $$ = ASSIGN_OPERATOR_TOK; }
214  | PLUS_OPERATOR_TOK { $$ = PLUS_OPERATOR_TOK; }
215  | MINUS_OPERATOR_TOK { $$ = MINUS_OPERATOR_TOK; }
216  | UNARY_MINUS_OPERATOR_TOK { $$ = UNARY_MINUS_OPERATOR_TOK; }
217  | MULTIPLY_OPERATOR_TOK { $$ = MULTIPLY_OPERATOR_TOK; }
218  | MULADD_OPERATOR_TOK { $$ = MULADD_OPERATOR_TOK; }
219  | DIVIDE_OPERATOR_TOK { $$ = DIVIDE_OPERATOR_TOK; }
220  | INVERSE_OPERATOR_TOK { $$ = INVERSE_OPERATOR_TOK; }
221  | POWER_OPERATOR_TOK { $$ = POWER_OPERATOR_TOK; }
222  | MODULO_OPERATOR_TOK { $$ = MODULO_OPERATOR_TOK; }
223  | MIN_OPERATOR_TOK { $$ = MIN_OPERATOR_TOK; }
224  | COS_OPERATOR_TOK { $$ = COS_OPERATOR_TOK; }
225  | SIN_OPERATOR_TOK { $$ = SIN_OPERATOR_TOK; }
226  | MIN0_OPERATOR_TOK { $$ = MIN0_OPERATOR_TOK; }
227  | AMIN1_OPERATOR_TOK { $$ = AMIN1_OPERATOR_TOK; }
228  | DMIN1_OPERATOR_TOK { $$ = DMIN1_OPERATOR_TOK; }
229  | MAX_OPERATOR_TOK { $$ = MAX_OPERATOR_TOK; }
230  | MAX0_OPERATOR_TOK { $$ = MAX0_OPERATOR_TOK; }
231  | AMAX1_OPERATOR_TOK { $$ = AMAX1_OPERATOR_TOK; }
232  | DMAX1_OPERATOR_TOK { $$ = DMAX1_OPERATOR_TOK; }
233  | ABS_OPERATOR_TOK { $$ = ABS_OPERATOR_TOK; }
234  | IABS_OPERATOR_TOK { $$ = IABS_OPERATOR_TOK; }
235  | DABS_OPERATOR_TOK { $$ = DABS_OPERATOR_TOK; }
236  | CABS_OPERATOR_TOK { $$ = CABS_OPERATOR_TOK; }
237  | AND_OPERATOR_TOK { $$ = AND_OPERATOR_TOK; }
238  | OR_OPERATOR_TOK { $$ = OR_OPERATOR_TOK; }
239  | NOT_OPERATOR_TOK { $$ = NOT_OPERATOR_TOK; }
240  | NON_EQUAL_OPERATOR_TOK { $$ = NON_EQUAL_OPERATOR_TOK; }
241  | EQUIV_OPERATOR_TOK { $$ = EQUIV_OPERATOR_TOK; }
242  | NON_EQUIV_OPERATOR_TOK { $$ = NON_EQUIV_OPERATOR_TOK; }
243  | TRUE_OPERATOR_TOK { $$ = TRUE_OPERATOR_TOK; }
244  | FALSE_OPERATOR_TOK { $$ = FALSE_OPERATOR_TOK; }
245  | GREATER_OR_EQUAL_OPERATOR_TOK { $$ = GREATER_OR_EQUAL_OPERATOR_TOK; }
246  | GREATER_THAN_OPERATOR_TOK { $$ = GREATER_THAN_OPERATOR_TOK; }
247  | LESS_OR_EQUAL_OPERATOR_TOK { $$ = LESS_OR_EQUAL_OPERATOR_TOK; }
248  | LESS_THAN_OPERATOR_TOK { $$ = LESS_THAN_OPERATOR_TOK; }
249  | EQUAL_OPERATOR_TOK { $$ = EQUAL_OPERATOR_TOK; }
250  | PHI_TOK { $$ = PHI_TOK; }
251 
252 merge_arguments:
253  ':' arguments_list { $$ = $2; }
254  | { $$ = NIL; }
255  ;
256 
257 arguments_list:
258  arguments_list ',' argument { $$ = CONS(ARGUMENT, $3, $1); }
259  | argument { $$ = CONS(ARGUMENT, $1, NIL); }
260 
261 argument:
262  INTEGER_TOK { $$ = make_patternArg_static($1); }
263  | { $$ = make_patternArg_dynamic(); }
264 
265 transformation:
266  IDENTIFIER_TOK '[' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ']' '{' mappings '}'
267  { insert_transformation( $1, $3, $5, $7, $9, $11, $14); }
268 
269 mappings:
270  mappings ',' INTEGER_TOK { $$ = CONS(INT, $3, $1); }
271  | INTEGER_TOK { $$ = CONS(INT, $1, NIL); }
272 
273 %%
274 
275 int yywrap(void)
276 {
277  return 1;
278 }
279 
280 void yyerror(const char* s)
281 {
282  pips_internal_error("patterns parser:%zd: %s\n",sac_lineno, s);
283 }