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