1c0a41ee6SAnton Johansson %{
2c0a41ee6SAnton Johansson /*
37b84fd04STaylor Simpson  *  Copyright(c) 2019-2023 rev.ng Labs Srl. All Rights Reserved.
4c0a41ee6SAnton Johansson  *
5c0a41ee6SAnton Johansson  *  This program is distributed in the hope that it will be useful,
6c0a41ee6SAnton Johansson  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
7c0a41ee6SAnton Johansson  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8c0a41ee6SAnton Johansson  *  GNU General Public License for more details.
9c0a41ee6SAnton Johansson  *
10c0a41ee6SAnton Johansson  *  You should have received a copy of the GNU General Public License
11c0a41ee6SAnton Johansson  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
12c0a41ee6SAnton Johansson  */
13c0a41ee6SAnton Johansson 
14c0a41ee6SAnton Johansson #include "idef-parser.h"
15c0a41ee6SAnton Johansson #include "parser-helpers.h"
16c0a41ee6SAnton Johansson #include "idef-parser.tab.h"
17c0a41ee6SAnton Johansson #include "idef-parser.yy.h"
18c0a41ee6SAnton Johansson 
19c0a41ee6SAnton Johansson /* Uncomment this to disable yyasserts */
20c0a41ee6SAnton Johansson /* #define NDEBUG */
21c0a41ee6SAnton Johansson 
22c0a41ee6SAnton Johansson #define ERR_LINE_CONTEXT 40
23c0a41ee6SAnton Johansson 
24c0a41ee6SAnton Johansson %}
25c0a41ee6SAnton Johansson 
26c0a41ee6SAnton Johansson %lex-param {void *scanner}
27c0a41ee6SAnton Johansson %parse-param {void *scanner}
28c0a41ee6SAnton Johansson %parse-param {Context *c}
29c0a41ee6SAnton Johansson 
30c0a41ee6SAnton Johansson %define parse.error verbose
31c0a41ee6SAnton Johansson %define parse.lac full
32c0a41ee6SAnton Johansson %define api.pure full
33c0a41ee6SAnton Johansson 
34c0a41ee6SAnton Johansson %locations
35c0a41ee6SAnton Johansson 
36c0a41ee6SAnton Johansson %union {
37c0a41ee6SAnton Johansson     GString *string;
38c0a41ee6SAnton Johansson     HexValue rvalue;
39c0a41ee6SAnton Johansson     HexSat sat;
40c0a41ee6SAnton Johansson     HexCast cast;
41c0a41ee6SAnton Johansson     HexExtract extract;
42c0a41ee6SAnton Johansson     HexMpy mpy;
43c0a41ee6SAnton Johansson     HexSignedness signedness;
44c0a41ee6SAnton Johansson     int index;
45c0a41ee6SAnton Johansson }
46c0a41ee6SAnton Johansson 
47c0a41ee6SAnton Johansson /* Tokens */
48c0a41ee6SAnton Johansson %start input
49c0a41ee6SAnton Johansson 
50c0a41ee6SAnton Johansson %expect 1
51c0a41ee6SAnton Johansson 
52c0a41ee6SAnton Johansson %token IN INAME VAR
53c0a41ee6SAnton Johansson %token ABS CROUND ROUND CIRCADD COUNTONES INC DEC ANDA ORA XORA PLUSPLUS ASL
54c0a41ee6SAnton Johansson %token ASR LSR EQ NEQ LTE GTE MIN MAX ANDL FOR ICIRC IF MUN FSCR FCHK SXT
55bbb71568SAnton Johansson %token ZXT CONSTEXT LOCNT BREV SIGN LOAD STORE PC LPCFG
567b84fd04STaylor Simpson %token LOAD_CANCEL STORE_CANCEL CANCEL IDENTITY ROTL INSBITS SETBITS EXTRANGE
57c0a41ee6SAnton Johansson %token CAST4_8U FAIL CARRY_FROM_ADD ADDSAT64 LSBNEW
58c0a41ee6SAnton Johansson %token TYPE_SIZE_T TYPE_INT TYPE_SIGNED TYPE_UNSIGNED TYPE_LONG
59c0a41ee6SAnton Johansson 
60c0a41ee6SAnton Johansson %token <rvalue> REG IMM PRED
61c0a41ee6SAnton Johansson %token <index> ELSE
62c0a41ee6SAnton Johansson %token <mpy> MPY
63c0a41ee6SAnton Johansson %token <sat> SAT
64c0a41ee6SAnton Johansson %token <cast> CAST DEPOSIT SETHALF
65c0a41ee6SAnton Johansson %token <extract> EXTRACT
66c0a41ee6SAnton Johansson %type <string> INAME
67c0a41ee6SAnton Johansson %type <rvalue> rvalue lvalue VAR assign_statement var var_decl var_type
68c0a41ee6SAnton Johansson %type <rvalue> FAIL
69c0a41ee6SAnton Johansson %type <rvalue> TYPE_SIGNED TYPE_UNSIGNED TYPE_INT TYPE_LONG TYPE_SIZE_T
70c0a41ee6SAnton Johansson %type <index> if_stmt IF
71c0a41ee6SAnton Johansson %type <signedness> SIGN
72c0a41ee6SAnton Johansson 
73c0a41ee6SAnton Johansson /* Operator Precedences */
74c0a41ee6SAnton Johansson %left MIN MAX
75c0a41ee6SAnton Johansson %left '('
76c0a41ee6SAnton Johansson %left ','
77c0a41ee6SAnton Johansson %left '='
78c0a41ee6SAnton Johansson %right CIRCADD
79c0a41ee6SAnton Johansson %right INC DEC ANDA ORA XORA
80c0a41ee6SAnton Johansson %left '?' ':'
81c0a41ee6SAnton Johansson %left ANDL
82c0a41ee6SAnton Johansson %left '|'
83c0a41ee6SAnton Johansson %left '^' ANDOR
84c0a41ee6SAnton Johansson %left '&'
85c0a41ee6SAnton Johansson %left EQ NEQ
86c0a41ee6SAnton Johansson %left '<' '>' LTE GTE
87c0a41ee6SAnton Johansson %left ASL ASR LSR
88c0a41ee6SAnton Johansson %right ABS
89c0a41ee6SAnton Johansson %left '-' '+'
90c0a41ee6SAnton Johansson %left '*' '/' '%' MPY
91c0a41ee6SAnton Johansson %right '~' '!'
92c0a41ee6SAnton Johansson %left '['
93c0a41ee6SAnton Johansson %right CAST
94c0a41ee6SAnton Johansson %right LOCNT BREV
95c0a41ee6SAnton Johansson 
96c0a41ee6SAnton Johansson /* Bison Grammar */
97c0a41ee6SAnton Johansson %%
98c0a41ee6SAnton Johansson 
99c0a41ee6SAnton Johansson /* Input file containing the description of each hexagon instruction */
100c0a41ee6SAnton Johansson input : instructions
101c0a41ee6SAnton Johansson       {
1028a9ce095SAlessandro Di Federico           /* Suppress warning about unused yynerrs */
1038a9ce095SAlessandro Di Federico           (void) yynerrs;
104c0a41ee6SAnton Johansson           YYACCEPT;
105c0a41ee6SAnton Johansson       }
106c0a41ee6SAnton Johansson       ;
107c0a41ee6SAnton Johansson 
108c0a41ee6SAnton Johansson instructions : instruction instructions
109c0a41ee6SAnton Johansson              | %empty
110c0a41ee6SAnton Johansson              ;
111c0a41ee6SAnton Johansson 
112c0a41ee6SAnton Johansson instruction : INAME
113c0a41ee6SAnton Johansson               {
114c0a41ee6SAnton Johansson                   gen_inst(c, $1);
115c0a41ee6SAnton Johansson               }
116c0a41ee6SAnton Johansson               arguments
117c0a41ee6SAnton Johansson               {
118c0a41ee6SAnton Johansson                   EMIT_SIG(c, ")");
119c0a41ee6SAnton Johansson                   EMIT_HEAD(c, "{\n");
120c0a41ee6SAnton Johansson               }
121c0a41ee6SAnton Johansson               code
122c0a41ee6SAnton Johansson               {
123c0a41ee6SAnton Johansson                   gen_inst_code(c, &@1);
124c0a41ee6SAnton Johansson               }
125c0a41ee6SAnton Johansson             | error /* Recover gracefully after instruction compilation error */
126c0a41ee6SAnton Johansson               {
127c0a41ee6SAnton Johansson                   free_instruction(c);
128c0a41ee6SAnton Johansson               }
129c0a41ee6SAnton Johansson             ;
130c0a41ee6SAnton Johansson 
131c0a41ee6SAnton Johansson arguments : '(' ')'
132c0a41ee6SAnton Johansson           | '(' argument_list ')';
133c0a41ee6SAnton Johansson 
134c0a41ee6SAnton Johansson argument_list : argument_decl ',' argument_list
135c0a41ee6SAnton Johansson               | argument_decl
136c0a41ee6SAnton Johansson               ;
137c0a41ee6SAnton Johansson 
138c0a41ee6SAnton Johansson var : VAR
139c0a41ee6SAnton Johansson       {
140c0a41ee6SAnton Johansson           track_string(c, $1.var.name);
141c0a41ee6SAnton Johansson           $$ = $1;
142c0a41ee6SAnton Johansson       }
143c0a41ee6SAnton Johansson     ;
144c0a41ee6SAnton Johansson 
145c0a41ee6SAnton Johansson /*
146c0a41ee6SAnton Johansson  * Here the integer types are defined from valid combinations of
147c0a41ee6SAnton Johansson  * `signed`, `unsigned`, `int`, and `long` tokens. The `signed`
148c0a41ee6SAnton Johansson  * and `unsigned` tokens are here assumed to always be placed
149c0a41ee6SAnton Johansson  * first in the type declaration, which is not the case in
150c0a41ee6SAnton Johansson  * normal C. Similarly, `int` is assumed to always be placed
151c0a41ee6SAnton Johansson  * last in the type.
152c0a41ee6SAnton Johansson  */
153c0a41ee6SAnton Johansson type_int : TYPE_INT
154c0a41ee6SAnton Johansson          | TYPE_SIGNED
155c0a41ee6SAnton Johansson          | TYPE_SIGNED TYPE_INT;
156c0a41ee6SAnton Johansson type_uint : TYPE_UNSIGNED
157c0a41ee6SAnton Johansson           | TYPE_UNSIGNED TYPE_INT;
158c0a41ee6SAnton Johansson type_ulonglong : TYPE_UNSIGNED TYPE_LONG TYPE_LONG
159c0a41ee6SAnton Johansson                | TYPE_UNSIGNED TYPE_LONG TYPE_LONG TYPE_INT;
160c0a41ee6SAnton Johansson 
161c0a41ee6SAnton Johansson /*
162c0a41ee6SAnton Johansson  * Here the various valid int types defined above specify
163c0a41ee6SAnton Johansson  * their `signedness` and `bit_width`. The LP64 convention
164c0a41ee6SAnton Johansson  * is assumed where longs are 64-bit, long longs are then
165c0a41ee6SAnton Johansson  * assumed to also be 64-bit.
166c0a41ee6SAnton Johansson  */
167c0a41ee6SAnton Johansson var_type : TYPE_SIZE_T
168c0a41ee6SAnton Johansson            {
169c0a41ee6SAnton Johansson               yyassert(c, &@1, $1.bit_width <= 64,
170c0a41ee6SAnton Johansson                        "Variables with size > 64-bit are not supported!");
171c0a41ee6SAnton Johansson               $$ = $1;
172c0a41ee6SAnton Johansson            }
173c0a41ee6SAnton Johansson          | type_int
174c0a41ee6SAnton Johansson            {
175c0a41ee6SAnton Johansson               $$.signedness = SIGNED;
176c0a41ee6SAnton Johansson               $$.bit_width  = 32;
177c0a41ee6SAnton Johansson            }
178c0a41ee6SAnton Johansson          | type_uint
179c0a41ee6SAnton Johansson            {
180c0a41ee6SAnton Johansson               $$.signedness = UNSIGNED;
181c0a41ee6SAnton Johansson               $$.bit_width  = 32;
182c0a41ee6SAnton Johansson            }
183c0a41ee6SAnton Johansson          | type_ulonglong
184c0a41ee6SAnton Johansson            {
185c0a41ee6SAnton Johansson               $$.signedness = UNSIGNED;
186c0a41ee6SAnton Johansson               $$.bit_width  = 64;
187c0a41ee6SAnton Johansson            }
188c0a41ee6SAnton Johansson          ;
189c0a41ee6SAnton Johansson 
190c0a41ee6SAnton Johansson /* Rule to capture declarations of VARs */
191c0a41ee6SAnton Johansson var_decl : var_type IMM
192c0a41ee6SAnton Johansson            {
193c0a41ee6SAnton Johansson               /*
194c0a41ee6SAnton Johansson                * Rule to capture "int i;" declarations since "i" is special
195c0a41ee6SAnton Johansson                * and assumed to be always be IMM. Moreover, "i" is only
196c0a41ee6SAnton Johansson                * assumed to be used in for-loops.
197c0a41ee6SAnton Johansson                *
198c0a41ee6SAnton Johansson                * Therefore we want to NOP these declarations.
199c0a41ee6SAnton Johansson                */
200c0a41ee6SAnton Johansson               yyassert(c, &@2, $2.imm.type == I,
201c0a41ee6SAnton Johansson                        "Variable declaration with immedaties only allowed"
202c0a41ee6SAnton Johansson                        " for the loop induction variable \"i\"");
203c0a41ee6SAnton Johansson               $$ = $2;
204c0a41ee6SAnton Johansson            }
205c0a41ee6SAnton Johansson          | var_type var
206c0a41ee6SAnton Johansson            {
207c0a41ee6SAnton Johansson               /*
208c0a41ee6SAnton Johansson                * Allocate new variable, this checks that it hasn't already
209c0a41ee6SAnton Johansson                * been declared.
210c0a41ee6SAnton Johansson                */
211c0a41ee6SAnton Johansson               gen_varid_allocate(c, &@1, &$2, $1.bit_width, $1.signedness);
212c0a41ee6SAnton Johansson               /* Copy var for variable name */
213c0a41ee6SAnton Johansson               $$ = $2;
214c0a41ee6SAnton Johansson               /* Copy type info from var_type */
215c0a41ee6SAnton Johansson               $$.signedness = $1.signedness;
216c0a41ee6SAnton Johansson               $$.bit_width  = $1.bit_width;
217c0a41ee6SAnton Johansson            }
218c0a41ee6SAnton Johansson          ;
219c0a41ee6SAnton Johansson 
220c0a41ee6SAnton Johansson /* Return the modified registers list */
221c0a41ee6SAnton Johansson code : '{' statements '}'
222c0a41ee6SAnton Johansson        {
223c0a41ee6SAnton Johansson            c->inst.code_begin = c->input_buffer + @2.first_column - 1;
224c0a41ee6SAnton Johansson            c->inst.code_end = c->input_buffer + @2.last_column - 1;
225c0a41ee6SAnton Johansson        }
226c0a41ee6SAnton Johansson      | '{'
227c0a41ee6SAnton Johansson        {
228c0a41ee6SAnton Johansson            /* Nop */
229c0a41ee6SAnton Johansson        }
230c0a41ee6SAnton Johansson        '}'
231c0a41ee6SAnton Johansson      ;
232c0a41ee6SAnton Johansson 
233c0a41ee6SAnton Johansson argument_decl : REG
234c0a41ee6SAnton Johansson                 {
235c0a41ee6SAnton Johansson                     emit_arg(c, &@1, &$1);
236c0a41ee6SAnton Johansson                     /* Enqueue register into initialization list */
237c0a41ee6SAnton Johansson                     g_array_append_val(c->inst.init_list, $1);
238c0a41ee6SAnton Johansson                 }
239c0a41ee6SAnton Johansson               | PRED
240c0a41ee6SAnton Johansson                 {
241c0a41ee6SAnton Johansson                     emit_arg(c, &@1, &$1);
242c0a41ee6SAnton Johansson                     /* Enqueue predicate into initialization list */
243c0a41ee6SAnton Johansson                     g_array_append_val(c->inst.init_list, $1);
244c0a41ee6SAnton Johansson                 }
245c0a41ee6SAnton Johansson               | IN REG
246c0a41ee6SAnton Johansson                 {
247c0a41ee6SAnton Johansson                     emit_arg(c, &@2, &$2);
248c0a41ee6SAnton Johansson                 }
249c0a41ee6SAnton Johansson               | IN PRED
250c0a41ee6SAnton Johansson                 {
251c0a41ee6SAnton Johansson                     emit_arg(c, &@2, &$2);
252c0a41ee6SAnton Johansson                 }
253c0a41ee6SAnton Johansson               | IMM
254c0a41ee6SAnton Johansson                 {
255c0a41ee6SAnton Johansson                     EMIT_SIG(c, ", int %ciV", $1.imm.id);
256c0a41ee6SAnton Johansson                 }
257c0a41ee6SAnton Johansson               ;
258c0a41ee6SAnton Johansson 
259c0a41ee6SAnton Johansson code_block : '{' statements '}'
260c0a41ee6SAnton Johansson            | '{' '}'
261c0a41ee6SAnton Johansson            ;
262c0a41ee6SAnton Johansson 
263c0a41ee6SAnton Johansson /* A list of one or more statements */
264c0a41ee6SAnton Johansson statements : statements statement
265c0a41ee6SAnton Johansson            | statement
266c0a41ee6SAnton Johansson            ;
267c0a41ee6SAnton Johansson 
268c0a41ee6SAnton Johansson /* Statements can be assignment (rvalue ';'), control or memory statements */
269c0a41ee6SAnton Johansson statement : control_statement
270c0a41ee6SAnton Johansson           | var_decl ';'
271c0a41ee6SAnton Johansson           | rvalue ';'
272c0a41ee6SAnton Johansson           | code_block
273c0a41ee6SAnton Johansson           | ';'
274c0a41ee6SAnton Johansson           ;
275c0a41ee6SAnton Johansson 
276c0a41ee6SAnton Johansson assign_statement : lvalue '=' rvalue
277c0a41ee6SAnton Johansson                    {
278c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
279c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &$3);
280c0a41ee6SAnton Johansson                        $$ = $1;
281c0a41ee6SAnton Johansson                    }
282c0a41ee6SAnton Johansson                  | var_decl '=' rvalue
283c0a41ee6SAnton Johansson                    {
284c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
285c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &$3);
286c0a41ee6SAnton Johansson                        $$ = $1;
287c0a41ee6SAnton Johansson                    }
288c0a41ee6SAnton Johansson                  | lvalue INC rvalue
289c0a41ee6SAnton Johansson                    {
290c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
291c0a41ee6SAnton Johansson                        HexValue tmp = gen_bin_op(c, &@1, ADD_OP, &$1, &$3);
292c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &tmp);
293c0a41ee6SAnton Johansson                        $$ = $1;
294c0a41ee6SAnton Johansson                    }
295c0a41ee6SAnton Johansson                  | lvalue DEC rvalue
296c0a41ee6SAnton Johansson                    {
297c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
298c0a41ee6SAnton Johansson                        HexValue tmp = gen_bin_op(c, &@1, SUB_OP, &$1, &$3);
299c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &tmp);
300c0a41ee6SAnton Johansson                        $$ = $1;
301c0a41ee6SAnton Johansson                    }
302c0a41ee6SAnton Johansson                  | lvalue ANDA rvalue
303c0a41ee6SAnton Johansson                    {
304c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
305c0a41ee6SAnton Johansson                        HexValue tmp = gen_bin_op(c, &@1, ANDB_OP, &$1, &$3);
306c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &tmp);
307c0a41ee6SAnton Johansson                        $$ = $1;
308c0a41ee6SAnton Johansson                    }
309c0a41ee6SAnton Johansson                  | lvalue ORA rvalue
310c0a41ee6SAnton Johansson                    {
311c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
312c0a41ee6SAnton Johansson                        HexValue tmp = gen_bin_op(c, &@1, ORB_OP, &$1, &$3);
313c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &tmp);
314c0a41ee6SAnton Johansson                        $$ = $1;
315c0a41ee6SAnton Johansson                    }
316c0a41ee6SAnton Johansson                  | lvalue XORA rvalue
317c0a41ee6SAnton Johansson                    {
318c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
319c0a41ee6SAnton Johansson                        HexValue tmp = gen_bin_op(c, &@1, XORB_OP, &$1, &$3);
320c0a41ee6SAnton Johansson                        gen_assign(c, &@1, &$1, &tmp);
321c0a41ee6SAnton Johansson                        $$ = $1;
322c0a41ee6SAnton Johansson                    }
323c0a41ee6SAnton Johansson                  | PRED '=' rvalue
324c0a41ee6SAnton Johansson                    {
325c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
326c0a41ee6SAnton Johansson                        gen_pred_assign(c, &@1, &$1, &$3);
327c0a41ee6SAnton Johansson                    }
328c0a41ee6SAnton Johansson                  | IMM '=' rvalue
329c0a41ee6SAnton Johansson                    {
330c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
331c0a41ee6SAnton Johansson                        yyassert(c, &@1, $3.type == IMMEDIATE,
332c0a41ee6SAnton Johansson                                 "Cannot assign non-immediate to immediate!");
333c0a41ee6SAnton Johansson                        yyassert(c, &@1, $1.imm.type == VARIABLE,
334c0a41ee6SAnton Johansson                                 "Cannot assign to non-variable!");
335c0a41ee6SAnton Johansson                        /* Assign to the function argument */
336c0a41ee6SAnton Johansson                        OUT(c, &@1, &$1, " = ", &$3, ";\n");
337c0a41ee6SAnton Johansson                        $$ = $1;
338c0a41ee6SAnton Johansson                    }
339c0a41ee6SAnton Johansson                  | LOAD '(' IMM ',' IMM ',' SIGN ',' var ',' lvalue ')'
340c0a41ee6SAnton Johansson                    {
341c0a41ee6SAnton Johansson                        @1.last_column = @12.last_column;
342c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
343c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
344c0a41ee6SAnton Johansson                        yyassert(c, &@1, $3.imm.value == 1,
345c0a41ee6SAnton Johansson                                 "LOAD of arrays not supported!");
346c0a41ee6SAnton Johansson                        gen_load(c, &@1, &$5, $7, &$9, &$11);
347c0a41ee6SAnton Johansson                    }
348c0a41ee6SAnton Johansson                  | STORE '(' IMM ',' IMM ',' var ',' rvalue ')'
349c0a41ee6SAnton Johansson                    /* Store primitive */
350c0a41ee6SAnton Johansson                    {
351c0a41ee6SAnton Johansson                        @1.last_column = @10.last_column;
352c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
353c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
354c0a41ee6SAnton Johansson                        yyassert(c, &@1, $3.imm.value == 1,
355c0a41ee6SAnton Johansson                                 "STORE of arrays not supported!");
356c0a41ee6SAnton Johansson                        gen_store(c, &@1, &$5, &$7, &$9);
357c0a41ee6SAnton Johansson                    }
358c0a41ee6SAnton Johansson                  | LPCFG '=' rvalue
359c0a41ee6SAnton Johansson                    {
360c0a41ee6SAnton Johansson                        @1.last_column = @3.last_column;
361c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
362c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
363c0a41ee6SAnton Johansson                        $3 = gen_rvalue_truncate(c, &@1, &$3);
364c0a41ee6SAnton Johansson                        $3 = rvalue_materialize(c, &@1, &$3);
365148ef7fdSTaylor Simpson                        OUT(c, &@1, "gen_set_usr_field(ctx, USR_LPCFG, ", &$3, ");\n");
366c0a41ee6SAnton Johansson                    }
367c0a41ee6SAnton Johansson                  | DEPOSIT '(' rvalue ',' rvalue ',' rvalue ')'
368c0a41ee6SAnton Johansson                    {
369c0a41ee6SAnton Johansson                        @1.last_column = @8.last_column;
370c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
371c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
372c0a41ee6SAnton Johansson                        gen_deposit_op(c, &@1, &$5, &$7, &$3, &$1);
373c0a41ee6SAnton Johansson                    }
374c0a41ee6SAnton Johansson                  | SETHALF '(' rvalue ',' lvalue ',' rvalue ')'
375c0a41ee6SAnton Johansson                    {
376c0a41ee6SAnton Johansson                        @1.last_column = @8.last_column;
377c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
378c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
379c0a41ee6SAnton Johansson                        gen_sethalf(c, &@1, &$1, &$3, &$5, &$7);
380c0a41ee6SAnton Johansson                    }
381c0a41ee6SAnton Johansson                  | SETBITS '(' rvalue ',' rvalue ',' rvalue ',' rvalue ')'
382c0a41ee6SAnton Johansson                    {
383c0a41ee6SAnton Johansson                        @1.last_column = @10.last_column;
384c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
385c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
386c0a41ee6SAnton Johansson                        gen_setbits(c, &@1, &$3, &$5, &$7, &$9);
387c0a41ee6SAnton Johansson                    }
388c0a41ee6SAnton Johansson                  | INSBITS '(' lvalue ',' rvalue ',' rvalue ',' rvalue ')'
389c0a41ee6SAnton Johansson                    {
390c0a41ee6SAnton Johansson                        @1.last_column = @10.last_column;
391c0a41ee6SAnton Johansson                        yyassert(c, &@1, !is_inside_ternary(c),
392c0a41ee6SAnton Johansson                                 "Assignment side-effect not modeled!");
393c0a41ee6SAnton Johansson                        gen_rdeposit_op(c, &@1, &$3, &$9, &$7, &$5);
394c0a41ee6SAnton Johansson                    }
395c0a41ee6SAnton Johansson                  | IDENTITY '(' rvalue ')'
396c0a41ee6SAnton Johansson                    {
397c0a41ee6SAnton Johansson                        @1.last_column = @4.last_column;
398c0a41ee6SAnton Johansson                        $$ = $3;
399c0a41ee6SAnton Johansson                    }
400c0a41ee6SAnton Johansson                  ;
401c0a41ee6SAnton Johansson 
402c0a41ee6SAnton Johansson control_statement : frame_check
403c0a41ee6SAnton Johansson                   | cancel_statement
404c0a41ee6SAnton Johansson                   | if_statement
405c0a41ee6SAnton Johansson                   | for_statement
406c0a41ee6SAnton Johansson                   ;
407c0a41ee6SAnton Johansson 
408c0a41ee6SAnton Johansson frame_check : FCHK '(' rvalue ',' rvalue ')' ';'
409c0a41ee6SAnton Johansson             ;
410c0a41ee6SAnton Johansson 
411c0a41ee6SAnton Johansson cancel_statement : LOAD_CANCEL
412c0a41ee6SAnton Johansson                    {
413c0a41ee6SAnton Johansson                        gen_load_cancel(c, &@1);
414c0a41ee6SAnton Johansson                    }
4157b84fd04STaylor Simpson                  | STORE_CANCEL
416c0a41ee6SAnton Johansson                    {
417c0a41ee6SAnton Johansson                        gen_cancel(c, &@1);
418c0a41ee6SAnton Johansson                    }
4197b84fd04STaylor Simpson                  | CANCEL
420c0a41ee6SAnton Johansson                  ;
421c0a41ee6SAnton Johansson 
422c0a41ee6SAnton Johansson if_statement : if_stmt
423c0a41ee6SAnton Johansson                {
424c0a41ee6SAnton Johansson                    /* Fix else label */
425c0a41ee6SAnton Johansson                    OUT(c, &@1, "gen_set_label(if_label_", &$1, ");\n");
426c0a41ee6SAnton Johansson                }
427c0a41ee6SAnton Johansson              | if_stmt ELSE
428c0a41ee6SAnton Johansson                {
429c0a41ee6SAnton Johansson                    @1.last_column = @2.last_column;
430c0a41ee6SAnton Johansson                    $2 = gen_if_else(c, &@1, $1);
431c0a41ee6SAnton Johansson                }
432c0a41ee6SAnton Johansson                statement
433c0a41ee6SAnton Johansson                {
434c0a41ee6SAnton Johansson                    OUT(c, &@1, "gen_set_label(if_label_", &$2, ");\n");
435c0a41ee6SAnton Johansson                }
436c0a41ee6SAnton Johansson              ;
437c0a41ee6SAnton Johansson 
438c0a41ee6SAnton Johansson for_statement : FOR '(' IMM '=' IMM ';' IMM '<' IMM ';' IMM PLUSPLUS ')'
439c0a41ee6SAnton Johansson                 {
440c0a41ee6SAnton Johansson                     yyassert(c, &@3,
441c0a41ee6SAnton Johansson                              $3.imm.type == I &&
442c0a41ee6SAnton Johansson                              $7.imm.type == I &&
443c0a41ee6SAnton Johansson                              $11.imm.type == I,
444c0a41ee6SAnton Johansson                              "Loop induction variable must be \"i\"");
445c0a41ee6SAnton Johansson                     @1.last_column = @13.last_column;
446c0a41ee6SAnton Johansson                     OUT(c, &@1, "for (int ", &$3, " = ", &$5, "; ",
447c0a41ee6SAnton Johansson                         &$7, " < ", &$9);
448c0a41ee6SAnton Johansson                     OUT(c, &@1, "; ", &$11, "++) {\n");
449c0a41ee6SAnton Johansson                 }
450c0a41ee6SAnton Johansson                 code_block
451c0a41ee6SAnton Johansson                 {
452c0a41ee6SAnton Johansson                     OUT(c, &@1, "}\n");
453c0a41ee6SAnton Johansson                 }
454c0a41ee6SAnton Johansson               ;
455c0a41ee6SAnton Johansson 
456c0a41ee6SAnton Johansson if_stmt : IF '(' rvalue ')'
457c0a41ee6SAnton Johansson           {
458c0a41ee6SAnton Johansson               @1.last_column = @3.last_column;
459c0a41ee6SAnton Johansson               $1 = gen_if_cond(c, &@1, &$3);
460c0a41ee6SAnton Johansson           }
461c0a41ee6SAnton Johansson           statement
462c0a41ee6SAnton Johansson           {
463c0a41ee6SAnton Johansson               $$ = $1;
464c0a41ee6SAnton Johansson           }
465c0a41ee6SAnton Johansson         ;
466c0a41ee6SAnton Johansson 
467c0a41ee6SAnton Johansson rvalue : FAIL
468c0a41ee6SAnton Johansson          {
469c0a41ee6SAnton Johansson              yyassert(c, &@1, false, "Encountered a FAIL token as rvalue.\n");
470c0a41ee6SAnton Johansson          }
471c0a41ee6SAnton Johansson        | assign_statement
472c0a41ee6SAnton Johansson        | REG
473c0a41ee6SAnton Johansson          {
474c0a41ee6SAnton Johansson              $$ = $1;
475c0a41ee6SAnton Johansson          }
476c0a41ee6SAnton Johansson        | IMM
477c0a41ee6SAnton Johansson          {
478c0a41ee6SAnton Johansson              $$ = $1;
479c0a41ee6SAnton Johansson          }
480c0a41ee6SAnton Johansson        | PRED
481c0a41ee6SAnton Johansson          {
482c0a41ee6SAnton Johansson              $$ = gen_rvalue_pred(c, &@1, &$1);
483c0a41ee6SAnton Johansson          }
484c0a41ee6SAnton Johansson        | PC
485c0a41ee6SAnton Johansson          {
486c0a41ee6SAnton Johansson              /* Read PC from the CR */
487c0a41ee6SAnton Johansson              HexValue rvalue;
488c0a41ee6SAnton Johansson              memset(&rvalue, 0, sizeof(HexValue));
489c0a41ee6SAnton Johansson              rvalue.type = IMMEDIATE;
490c0a41ee6SAnton Johansson              rvalue.imm.type = IMM_PC;
491c0a41ee6SAnton Johansson              rvalue.bit_width = 32;
492c0a41ee6SAnton Johansson              rvalue.signedness = UNSIGNED;
493c0a41ee6SAnton Johansson              $$ = rvalue;
494c0a41ee6SAnton Johansson          }
495c0a41ee6SAnton Johansson        | CONSTEXT
496c0a41ee6SAnton Johansson          {
497c0a41ee6SAnton Johansson              HexValue rvalue;
498c0a41ee6SAnton Johansson              memset(&rvalue, 0, sizeof(HexValue));
499c0a41ee6SAnton Johansson              rvalue.type = IMMEDIATE;
500c0a41ee6SAnton Johansson              rvalue.imm.type = IMM_CONSTEXT;
501c0a41ee6SAnton Johansson              rvalue.signedness = UNSIGNED;
502c0a41ee6SAnton Johansson              rvalue.is_dotnew = false;
503c0a41ee6SAnton Johansson              $$ = rvalue;
504c0a41ee6SAnton Johansson          }
505c0a41ee6SAnton Johansson        | var
506c0a41ee6SAnton Johansson          {
507c0a41ee6SAnton Johansson              $$ = gen_rvalue_var(c, &@1, &$1);
508c0a41ee6SAnton Johansson          }
509c0a41ee6SAnton Johansson        | MPY '(' rvalue ',' rvalue ')'
510c0a41ee6SAnton Johansson          {
511c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
512c0a41ee6SAnton Johansson              $$ = gen_rvalue_mpy(c, &@1, &$1, &$3, &$5);
513c0a41ee6SAnton Johansson          }
514c0a41ee6SAnton Johansson        | rvalue '+' rvalue
515c0a41ee6SAnton Johansson          {
516c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
517c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ADD_OP, &$1, &$3);
518c0a41ee6SAnton Johansson          }
519c0a41ee6SAnton Johansson        | rvalue '-' rvalue
520c0a41ee6SAnton Johansson          {
521c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
522c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, SUB_OP, &$1, &$3);
523c0a41ee6SAnton Johansson          }
524c0a41ee6SAnton Johansson        | rvalue '*' rvalue
525c0a41ee6SAnton Johansson          {
526c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
527c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, MUL_OP, &$1, &$3);
528c0a41ee6SAnton Johansson          }
529c0a41ee6SAnton Johansson        | rvalue ASL rvalue
530c0a41ee6SAnton Johansson          {
531c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
532c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ASL_OP, &$1, &$3);
533c0a41ee6SAnton Johansson          }
534c0a41ee6SAnton Johansson        | rvalue ASR rvalue
535c0a41ee6SAnton Johansson          {
536c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
537c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $1.signedness);
538c0a41ee6SAnton Johansson              if ($1.signedness == UNSIGNED) {
539c0a41ee6SAnton Johansson                  $$ = gen_bin_op(c, &@1, LSR_OP, &$1, &$3);
540c0a41ee6SAnton Johansson              } else if ($1.signedness == SIGNED) {
541c0a41ee6SAnton Johansson                  $$ = gen_bin_op(c, &@1, ASR_OP, &$1, &$3);
542c0a41ee6SAnton Johansson              }
543c0a41ee6SAnton Johansson          }
544c0a41ee6SAnton Johansson        | rvalue LSR rvalue
545c0a41ee6SAnton Johansson          {
546c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
547c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, LSR_OP, &$1, &$3);
548c0a41ee6SAnton Johansson          }
549c0a41ee6SAnton Johansson        | rvalue '&' rvalue
550c0a41ee6SAnton Johansson          {
551c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
552c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ANDB_OP, &$1, &$3);
553c0a41ee6SAnton Johansson          }
554c0a41ee6SAnton Johansson        | rvalue '|' rvalue
555c0a41ee6SAnton Johansson          {
556c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
557c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ORB_OP, &$1, &$3);
558c0a41ee6SAnton Johansson          }
559c0a41ee6SAnton Johansson        | rvalue '^' rvalue
560c0a41ee6SAnton Johansson          {
561c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
562c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, XORB_OP, &$1, &$3);
563c0a41ee6SAnton Johansson          }
564c0a41ee6SAnton Johansson        | rvalue ANDL rvalue
565c0a41ee6SAnton Johansson          {
566c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
567c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ANDL_OP, &$1, &$3);
568c0a41ee6SAnton Johansson          }
569c0a41ee6SAnton Johansson        | MIN '(' rvalue ',' rvalue ')'
570c0a41ee6SAnton Johansson          {
571c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
572c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, MINI_OP, &$3, &$5);
573c0a41ee6SAnton Johansson          }
574c0a41ee6SAnton Johansson        | MAX '(' rvalue ',' rvalue ')'
575c0a41ee6SAnton Johansson          {
576c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
577c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, MAXI_OP, &$3, &$5);
578c0a41ee6SAnton Johansson          }
579c0a41ee6SAnton Johansson        | '~' rvalue
580c0a41ee6SAnton Johansson          {
581c0a41ee6SAnton Johansson              @1.last_column = @2.last_column;
582c0a41ee6SAnton Johansson              $$ = gen_rvalue_not(c, &@1, &$2);
583c0a41ee6SAnton Johansson          }
584c0a41ee6SAnton Johansson        | '!' rvalue
585c0a41ee6SAnton Johansson          {
586c0a41ee6SAnton Johansson              @1.last_column = @2.last_column;
587c0a41ee6SAnton Johansson              $$ = gen_rvalue_notl(c, &@1, &$2);
588c0a41ee6SAnton Johansson          }
589c0a41ee6SAnton Johansson        | SAT '(' IMM ',' rvalue ')'
590c0a41ee6SAnton Johansson          {
591c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
592c0a41ee6SAnton Johansson              $$ = gen_rvalue_sat(c, &@1, &$1, &$3, &$5);
593c0a41ee6SAnton Johansson          }
594c0a41ee6SAnton Johansson        | CAST rvalue
595c0a41ee6SAnton Johansson          {
596c0a41ee6SAnton Johansson              @1.last_column = @2.last_column;
597c0a41ee6SAnton Johansson              $$ = gen_cast_op(c, &@1, &$2, $1.bit_width, $1.signedness);
598c0a41ee6SAnton Johansson          }
599c0a41ee6SAnton Johansson        | rvalue EQ rvalue
600c0a41ee6SAnton Johansson          {
601c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
602c0a41ee6SAnton Johansson              $$ = gen_bin_cmp(c, &@1, TCG_COND_EQ, &$1, &$3);
603c0a41ee6SAnton Johansson          }
604c0a41ee6SAnton Johansson        | rvalue NEQ rvalue
605c0a41ee6SAnton Johansson          {
606c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
607c0a41ee6SAnton Johansson              $$ = gen_bin_cmp(c, &@1, TCG_COND_NE, &$1, &$3);
608c0a41ee6SAnton Johansson          }
609c0a41ee6SAnton Johansson        | rvalue '<' rvalue
610c0a41ee6SAnton Johansson          {
611c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
612c0a41ee6SAnton Johansson 
613c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $1.signedness);
614c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $3.signedness);
615c0a41ee6SAnton Johansson              if ($1.signedness == UNSIGNED || $3.signedness == UNSIGNED) {
616c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_LTU, &$1, &$3);
617c0a41ee6SAnton Johansson              } else {
618c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_LT, &$1, &$3);
619c0a41ee6SAnton Johansson              }
620c0a41ee6SAnton Johansson          }
621c0a41ee6SAnton Johansson        | rvalue '>' rvalue
622c0a41ee6SAnton Johansson          {
623c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
624c0a41ee6SAnton Johansson 
625c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $1.signedness);
626c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $3.signedness);
627c0a41ee6SAnton Johansson              if ($1.signedness == UNSIGNED || $3.signedness == UNSIGNED) {
628c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_GTU, &$1, &$3);
629c0a41ee6SAnton Johansson              } else {
630c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_GT, &$1, &$3);
631c0a41ee6SAnton Johansson              }
632c0a41ee6SAnton Johansson          }
633c0a41ee6SAnton Johansson        | rvalue LTE rvalue
634c0a41ee6SAnton Johansson          {
635c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
636c0a41ee6SAnton Johansson 
637c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $1.signedness);
638c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $3.signedness);
639c0a41ee6SAnton Johansson              if ($1.signedness == UNSIGNED || $3.signedness == UNSIGNED) {
640c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_LEU, &$1, &$3);
641c0a41ee6SAnton Johansson              } else {
642c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_LE, &$1, &$3);
643c0a41ee6SAnton Johansson              }
644c0a41ee6SAnton Johansson          }
645c0a41ee6SAnton Johansson        | rvalue GTE rvalue
646c0a41ee6SAnton Johansson          {
647c0a41ee6SAnton Johansson              @1.last_column = @3.last_column;
648c0a41ee6SAnton Johansson 
649c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $1.signedness);
650c0a41ee6SAnton Johansson              assert_signedness(c, &@1, $3.signedness);
651c0a41ee6SAnton Johansson              if ($1.signedness == UNSIGNED || $3.signedness == UNSIGNED) {
652c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_GEU, &$1, &$3);
653c0a41ee6SAnton Johansson              } else {
654c0a41ee6SAnton Johansson                  $$ = gen_bin_cmp(c, &@1, TCG_COND_GE, &$1, &$3);
655c0a41ee6SAnton Johansson              }
656c0a41ee6SAnton Johansson          }
657c0a41ee6SAnton Johansson        | rvalue '?'
658c0a41ee6SAnton Johansson          {
659c0a41ee6SAnton Johansson              Ternary t = { 0 };
660c0a41ee6SAnton Johansson              t.state = IN_LEFT;
661c0a41ee6SAnton Johansson              t.cond = $1;
662c0a41ee6SAnton Johansson              g_array_append_val(c->ternary, t);
663c0a41ee6SAnton Johansson          }
664c0a41ee6SAnton Johansson          rvalue ':'
665c0a41ee6SAnton Johansson          {
666c0a41ee6SAnton Johansson              Ternary *t = &g_array_index(c->ternary, Ternary,
667c0a41ee6SAnton Johansson                                          c->ternary->len - 1);
668c0a41ee6SAnton Johansson              t->state = IN_RIGHT;
669c0a41ee6SAnton Johansson          }
670c0a41ee6SAnton Johansson          rvalue
671c0a41ee6SAnton Johansson          {
672c0a41ee6SAnton Johansson              @1.last_column = @5.last_column;
673c0a41ee6SAnton Johansson              $$ = gen_rvalue_ternary(c, &@1, &$1, &$4, &$7);
674c0a41ee6SAnton Johansson          }
675c0a41ee6SAnton Johansson        | FSCR '(' rvalue ')'
676c0a41ee6SAnton Johansson          {
677c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
678c0a41ee6SAnton Johansson              $$ = gen_rvalue_fscr(c, &@1, &$3);
679c0a41ee6SAnton Johansson          }
680c0a41ee6SAnton Johansson        | SXT '(' rvalue ',' IMM ',' rvalue ')'
681c0a41ee6SAnton Johansson          {
682c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
683c0a41ee6SAnton Johansson              yyassert(c, &@1, $5.type == IMMEDIATE &&
684c0a41ee6SAnton Johansson                       $5.imm.type == VALUE,
685c0a41ee6SAnton Johansson                       "SXT expects immediate values\n");
6864354f3dbSPaolo Bonzini              $$ = gen_extend_op(c, &@1, &$3, 64, &$7, SIGNED);
687c0a41ee6SAnton Johansson          }
688c0a41ee6SAnton Johansson        | ZXT '(' rvalue ',' IMM ',' rvalue ')'
689c0a41ee6SAnton Johansson          {
690c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
691c0a41ee6SAnton Johansson              yyassert(c, &@1, $5.type == IMMEDIATE &&
692c0a41ee6SAnton Johansson                       $5.imm.type == VALUE,
693c0a41ee6SAnton Johansson                       "ZXT expects immediate values\n");
6944354f3dbSPaolo Bonzini              $$ = gen_extend_op(c, &@1, &$3, 64, &$7, UNSIGNED);
695c0a41ee6SAnton Johansson          }
696c0a41ee6SAnton Johansson        | '(' rvalue ')'
697c0a41ee6SAnton Johansson          {
698c0a41ee6SAnton Johansson              $$ = $2;
699c0a41ee6SAnton Johansson          }
700c0a41ee6SAnton Johansson        | ABS rvalue
701c0a41ee6SAnton Johansson          {
702c0a41ee6SAnton Johansson              @1.last_column = @2.last_column;
703c0a41ee6SAnton Johansson              $$ = gen_rvalue_abs(c, &@1, &$2);
704c0a41ee6SAnton Johansson          }
705c0a41ee6SAnton Johansson        | CROUND '(' rvalue ',' rvalue ')'
706c0a41ee6SAnton Johansson          {
707c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
708c0a41ee6SAnton Johansson              $$ = gen_convround_n(c, &@1, &$3, &$5);
709c0a41ee6SAnton Johansson          }
710c0a41ee6SAnton Johansson        | CROUND '(' rvalue ')'
711c0a41ee6SAnton Johansson          {
712c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
713c0a41ee6SAnton Johansson              $$ = gen_convround(c, &@1, &$3);
714c0a41ee6SAnton Johansson          }
715c0a41ee6SAnton Johansson        | ROUND '(' rvalue ',' rvalue ')'
716c0a41ee6SAnton Johansson          {
717c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
718c0a41ee6SAnton Johansson              $$ = gen_round(c, &@1, &$3, &$5);
719c0a41ee6SAnton Johansson          }
720c0a41ee6SAnton Johansson        | '-' rvalue
721c0a41ee6SAnton Johansson          {
722c0a41ee6SAnton Johansson              @1.last_column = @2.last_column;
723c0a41ee6SAnton Johansson              $$ = gen_rvalue_neg(c, &@1, &$2);
724c0a41ee6SAnton Johansson          }
725c0a41ee6SAnton Johansson        | ICIRC '(' rvalue ')' ASL IMM
726c0a41ee6SAnton Johansson          {
727c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
728c0a41ee6SAnton Johansson              $$ = gen_tmp(c, &@1, 32, UNSIGNED);
729c0a41ee6SAnton Johansson              OUT(c, &@1, "gen_read_ireg(", &$$, ", ", &$3, ", ", &$6, ");\n");
730c0a41ee6SAnton Johansson          }
731c0a41ee6SAnton Johansson        | CIRCADD '(' rvalue ',' rvalue ',' rvalue ')'
732c0a41ee6SAnton Johansson          {
733c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
734c0a41ee6SAnton Johansson              gen_circ_op(c, &@1, &$3, &$5, &$7);
735c0a41ee6SAnton Johansson          }
736c0a41ee6SAnton Johansson        | LOCNT '(' rvalue ')'
737c0a41ee6SAnton Johansson          {
738c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
739c0a41ee6SAnton Johansson              /* Leading ones count */
740c0a41ee6SAnton Johansson              $$ = gen_locnt_op(c, &@1, &$3);
741c0a41ee6SAnton Johansson          }
742c0a41ee6SAnton Johansson        | COUNTONES '(' rvalue ')'
743c0a41ee6SAnton Johansson          {
744c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
745c0a41ee6SAnton Johansson              /* Ones count */
746c0a41ee6SAnton Johansson              $$ = gen_ctpop_op(c, &@1, &$3);
747c0a41ee6SAnton Johansson          }
748c0a41ee6SAnton Johansson        | EXTRACT '(' rvalue ',' rvalue ')'
749c0a41ee6SAnton Johansson          {
750c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
751c0a41ee6SAnton Johansson              $$ = gen_extract_op(c, &@1, &$5, &$3, &$1);
752c0a41ee6SAnton Johansson          }
753c0a41ee6SAnton Johansson        | EXTRANGE '(' rvalue ',' rvalue ',' rvalue ')'
754c0a41ee6SAnton Johansson          {
755c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
756c0a41ee6SAnton Johansson              yyassert(c, &@1, $5.type == IMMEDIATE &&
757c0a41ee6SAnton Johansson                       $5.imm.type == VALUE &&
758c0a41ee6SAnton Johansson                       $7.type == IMMEDIATE &&
759c0a41ee6SAnton Johansson                       $7.imm.type == VALUE,
760c0a41ee6SAnton Johansson                       "Range extract needs immediate values!\n");
761c0a41ee6SAnton Johansson              $$ = gen_rextract_op(c,
762c0a41ee6SAnton Johansson                                   &@1,
763c0a41ee6SAnton Johansson                                   &$3,
764c0a41ee6SAnton Johansson                                   $7.imm.value,
765c0a41ee6SAnton Johansson                                   $5.imm.value - $7.imm.value + 1);
766c0a41ee6SAnton Johansson          }
767c0a41ee6SAnton Johansson        | CAST4_8U '(' rvalue ')'
768c0a41ee6SAnton Johansson          {
769c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
770c0a41ee6SAnton Johansson              $$ = gen_rvalue_truncate(c, &@1, &$3);
771c0a41ee6SAnton Johansson              $$.signedness = UNSIGNED;
772c0a41ee6SAnton Johansson              $$ = rvalue_materialize(c, &@1, &$$);
773c0a41ee6SAnton Johansson              $$ = gen_rvalue_extend(c, &@1, &$$);
774c0a41ee6SAnton Johansson          }
775c0a41ee6SAnton Johansson        | BREV '(' rvalue ')'
776c0a41ee6SAnton Johansson          {
777c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
778c0a41ee6SAnton Johansson              $$ = gen_rvalue_brev(c, &@1, &$3);
779c0a41ee6SAnton Johansson          }
780c0a41ee6SAnton Johansson        | ROTL '(' rvalue ',' rvalue ')'
781c0a41ee6SAnton Johansson          {
782c0a41ee6SAnton Johansson              @1.last_column = @6.last_column;
783c0a41ee6SAnton Johansson              $$ = gen_rotl(c, &@1, &$3, &$5);
784c0a41ee6SAnton Johansson          }
785c0a41ee6SAnton Johansson        | ADDSAT64 '(' rvalue ',' rvalue ',' rvalue ')'
786c0a41ee6SAnton Johansson          {
787c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
788c0a41ee6SAnton Johansson              gen_addsat64(c, &@1, &$3, &$5, &$7);
789c0a41ee6SAnton Johansson          }
790c0a41ee6SAnton Johansson        | CARRY_FROM_ADD '(' rvalue ',' rvalue ',' rvalue ')'
791c0a41ee6SAnton Johansson          {
792c0a41ee6SAnton Johansson              @1.last_column = @8.last_column;
793c0a41ee6SAnton Johansson              $$ = gen_carry_from_add(c, &@1, &$3, &$5, &$7);
794c0a41ee6SAnton Johansson          }
795c0a41ee6SAnton Johansson        | LSBNEW '(' rvalue ')'
796c0a41ee6SAnton Johansson          {
797c0a41ee6SAnton Johansson              @1.last_column = @4.last_column;
798c0a41ee6SAnton Johansson              HexValue one = gen_imm_value(c, &@1, 1, 32, UNSIGNED);
799c0a41ee6SAnton Johansson              $$ = gen_bin_op(c, &@1, ANDB_OP, &$3, &one);
800c0a41ee6SAnton Johansson          }
801c0a41ee6SAnton Johansson        ;
802c0a41ee6SAnton Johansson 
803c0a41ee6SAnton Johansson lvalue : FAIL
804c0a41ee6SAnton Johansson          {
805c0a41ee6SAnton Johansson              @1.last_column = @1.last_column;
806c0a41ee6SAnton Johansson              yyassert(c, &@1, false, "Encountered a FAIL token as lvalue.\n");
807c0a41ee6SAnton Johansson          }
808c0a41ee6SAnton Johansson        | REG
809c0a41ee6SAnton Johansson          {
810c0a41ee6SAnton Johansson              $$ = $1;
811c0a41ee6SAnton Johansson          }
812c0a41ee6SAnton Johansson        | var
813c0a41ee6SAnton Johansson          {
814c0a41ee6SAnton Johansson              $$ = $1;
815c0a41ee6SAnton Johansson          }
816c0a41ee6SAnton Johansson        ;
817c0a41ee6SAnton Johansson 
818c0a41ee6SAnton Johansson %%
819c0a41ee6SAnton Johansson 
820c0a41ee6SAnton Johansson int main(int argc, char **argv)
821c0a41ee6SAnton Johansson {
822c0a41ee6SAnton Johansson     if (argc != 5) {
823c0a41ee6SAnton Johansson         fprintf(stderr,
824c0a41ee6SAnton Johansson                 "Semantics: Hexagon ISA to tinycode generator compiler\n\n");
825c0a41ee6SAnton Johansson         fprintf(stderr,
826c0a41ee6SAnton Johansson                 "Usage: ./semantics IDEFS EMITTER_C EMITTER_H "
827c0a41ee6SAnton Johansson                 "ENABLED_INSTRUCTIONS_LIST\n");
828c0a41ee6SAnton Johansson         return 1;
829c0a41ee6SAnton Johansson     }
830c0a41ee6SAnton Johansson 
831c0a41ee6SAnton Johansson     enum {
832c0a41ee6SAnton Johansson         ARG_INDEX_ARGV0 = 0,
833c0a41ee6SAnton Johansson         ARG_INDEX_IDEFS,
834c0a41ee6SAnton Johansson         ARG_INDEX_EMITTER_C,
835c0a41ee6SAnton Johansson         ARG_INDEX_EMITTER_H,
836c0a41ee6SAnton Johansson         ARG_INDEX_ENABLED_INSTRUCTIONS_LIST
837c0a41ee6SAnton Johansson     };
838c0a41ee6SAnton Johansson 
839c0a41ee6SAnton Johansson     FILE *enabled_file = fopen(argv[ARG_INDEX_ENABLED_INSTRUCTIONS_LIST], "w");
840c0a41ee6SAnton Johansson 
841c0a41ee6SAnton Johansson     FILE *output_file = fopen(argv[ARG_INDEX_EMITTER_C], "w");
842c0a41ee6SAnton Johansson     fputs("#include \"qemu/osdep.h\"\n", output_file);
843c0a41ee6SAnton Johansson     fputs("#include \"qemu/log.h\"\n", output_file);
844c0a41ee6SAnton Johansson     fputs("#include \"cpu.h\"\n", output_file);
845c0a41ee6SAnton Johansson     fputs("#include \"internal.h\"\n", output_file);
846*13e27d1fSRichard Henderson     fputs("#include \"tcg/tcg.h\"\n", output_file);
847c0a41ee6SAnton Johansson     fputs("#include \"tcg/tcg-op.h\"\n", output_file);
848*13e27d1fSRichard Henderson     fputs("#include \"exec/helper-gen.h\"\n", output_file);
849c0a41ee6SAnton Johansson     fputs("#include \"insn.h\"\n", output_file);
850c0a41ee6SAnton Johansson     fputs("#include \"opcodes.h\"\n", output_file);
851c0a41ee6SAnton Johansson     fputs("#include \"translate.h\"\n", output_file);
852c0a41ee6SAnton Johansson     fputs("#define QEMU_GENERATE\n", output_file);
853c0a41ee6SAnton Johansson     fputs("#include \"genptr.h\"\n", output_file);
854c0a41ee6SAnton Johansson     fputs("#include \"macros.h\"\n", output_file);
855c0a41ee6SAnton Johansson     fprintf(output_file, "#include \"%s\"\n", argv[ARG_INDEX_EMITTER_H]);
856c0a41ee6SAnton Johansson 
857c0a41ee6SAnton Johansson     FILE *defines_file = fopen(argv[ARG_INDEX_EMITTER_H], "w");
858c0a41ee6SAnton Johansson     assert(defines_file != NULL);
859c0a41ee6SAnton Johansson     fputs("#ifndef HEX_EMITTER_H\n", defines_file);
860c0a41ee6SAnton Johansson     fputs("#define HEX_EMITTER_H\n", defines_file);
861c0a41ee6SAnton Johansson     fputs("\n", defines_file);
862c0a41ee6SAnton Johansson     fputs("#include \"insn.h\"\n\n", defines_file);
863c0a41ee6SAnton Johansson 
864c0a41ee6SAnton Johansson     /* Parser input file */
865c0a41ee6SAnton Johansson     Context context = { 0 };
866c0a41ee6SAnton Johansson     context.defines_file = defines_file;
867c0a41ee6SAnton Johansson     context.output_file = output_file;
868c0a41ee6SAnton Johansson     context.enabled_file = enabled_file;
869c0a41ee6SAnton Johansson     /* Initialize buffers */
870c0a41ee6SAnton Johansson     context.out_str = g_string_new(NULL);
871c0a41ee6SAnton Johansson     context.signature_str = g_string_new(NULL);
872c0a41ee6SAnton Johansson     context.header_str = g_string_new(NULL);
873c0a41ee6SAnton Johansson     context.ternary = g_array_new(FALSE, TRUE, sizeof(Ternary));
874c0a41ee6SAnton Johansson     /* Read input file */
875c0a41ee6SAnton Johansson     FILE *input_file = fopen(argv[ARG_INDEX_IDEFS], "r");
876c0a41ee6SAnton Johansson     fseek(input_file, 0L, SEEK_END);
877c0a41ee6SAnton Johansson     long input_size = ftell(input_file);
878c0a41ee6SAnton Johansson     context.input_buffer = (char *) calloc(input_size + 1, sizeof(char));
879c0a41ee6SAnton Johansson     fseek(input_file, 0L, SEEK_SET);
880c0a41ee6SAnton Johansson     size_t read_chars = fread(context.input_buffer,
881c0a41ee6SAnton Johansson                               sizeof(char),
882c0a41ee6SAnton Johansson                               input_size,
883c0a41ee6SAnton Johansson                               input_file);
884c0a41ee6SAnton Johansson     if (read_chars != (size_t) input_size) {
885c0a41ee6SAnton Johansson         fprintf(stderr, "Error: an error occurred while reading input file!\n");
886c0a41ee6SAnton Johansson         return -1;
887c0a41ee6SAnton Johansson     }
888c0a41ee6SAnton Johansson     yylex_init(&context.scanner);
889c0a41ee6SAnton Johansson     YY_BUFFER_STATE buffer;
890c0a41ee6SAnton Johansson     buffer = yy_scan_string(context.input_buffer, context.scanner);
891c0a41ee6SAnton Johansson     /* Start the parsing procedure */
892c0a41ee6SAnton Johansson     yyparse(context.scanner, &context);
893c0a41ee6SAnton Johansson     if (context.implemented_insn != context.total_insn) {
894c0a41ee6SAnton Johansson         fprintf(stderr,
895c0a41ee6SAnton Johansson                 "Warning: %d/%d meta instructions have been implemented!\n",
896c0a41ee6SAnton Johansson                 context.implemented_insn,
897c0a41ee6SAnton Johansson                 context.total_insn);
898c0a41ee6SAnton Johansson     }
899c0a41ee6SAnton Johansson     fputs("#endif " START_COMMENT " HEX_EMITTER_h " END_COMMENT "\n",
900c0a41ee6SAnton Johansson           defines_file);
901c0a41ee6SAnton Johansson     /* Cleanup */
902c0a41ee6SAnton Johansson     yy_delete_buffer(buffer, context.scanner);
903c0a41ee6SAnton Johansson     yylex_destroy(context.scanner);
904c0a41ee6SAnton Johansson     free(context.input_buffer);
905c0a41ee6SAnton Johansson     g_string_free(context.out_str, TRUE);
906c0a41ee6SAnton Johansson     g_string_free(context.signature_str, TRUE);
907c0a41ee6SAnton Johansson     g_string_free(context.header_str, TRUE);
908c0a41ee6SAnton Johansson     g_array_free(context.ternary, TRUE);
909c0a41ee6SAnton Johansson     fclose(output_file);
910c0a41ee6SAnton Johansson     fclose(input_file);
911c0a41ee6SAnton Johansson     fclose(defines_file);
912c0a41ee6SAnton Johansson     fclose(enabled_file);
913c0a41ee6SAnton Johansson 
914c0a41ee6SAnton Johansson     return 0;
915c0a41ee6SAnton Johansson }
916