3 $Id: patterns.y 23065 2016-03-02 09:05:50Z coelho $
5 Copyright 1989-2016 MINES ParisTech
7 This file is part of PIPS.
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
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.
18 See the GNU General Public License for more details.
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/>.
27 #include "pips_config.h"
36 #include "resources.h"
43 static size_t opcode_argc =0;
44 size_t sac_lineno = 0;
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)
75 %type <tokenId> token;
77 %type <tokenList> tokens_list;
78 %type <typeList> types_list;
80 %type <argument> argument;
81 %type <argsList> arguments_list;
82 %type <argsList> merge_arguments;
85 %type <opcodesList> opcodes_list;
86 %type <mappingsList> mappings;
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
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
133 %token TRUE_OPERATOR_TOK
134 %token FALSE_OPERATOR_TOK
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
143 %token <iVal> INTEGER_TOK
144 %token <fVal> FLOAT_TOK
145 %token <strVal> IDENTIFIER_TOK
154 definitions_list definition
165 IDENTIFIER_TOK '{' opcodes_list '}'
167 insert_opcodeClass($1, opcode_argc, $3);
172 opcodes_list opcode { $$ = CONS(OPCODE, $2, $1); }
176 IDENTIFIER_TOK ':' types_list ',' INTEGER_TOK ';'
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);
184 IDENTIFIER_TOK ':' tokens_list merge_arguments ';'
186 insert_pattern($1, $3, $4);
190 type types_list { $$ = CONS(int, $1, $2); }
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; }
206 $$ = CONS(TOKEN, (void*)$1, $2);
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; }
253 ':' arguments_list { $$ = $2; }
258 arguments_list ',' argument { $$ = CONS(ARGUMENT, $3, $1); }
259 | argument { $$ = CONS(ARGUMENT, $1, NIL); }
262 INTEGER_TOK { $$ = make_patternArg_static($1); }
263 | { $$ = make_patternArg_dynamic(); }
266 IDENTIFIER_TOK '[' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ',' INTEGER_TOK ']' '{' mappings '}'
267 { insert_transformation( $1, $3, $5, $7, $9, $11, $14); }
270 mappings ',' INTEGER_TOK { $$ = CONS(INT, $3, $1); }
271 | INTEGER_TOK { $$ = CONS(INT, $1, NIL); }
280 void yyerror(const char* s)
282 pips_internal_error("patterns parser:%zd: %s\n",sac_lineno, s);