1e887ea33SDavid du Colombier %{ 2e887ea33SDavid du Colombier #include "a.h" 3e887ea33SDavid du Colombier %} 4e887ea33SDavid du Colombier %union { 5e887ea33SDavid du Colombier Sym *sym; 6e887ea33SDavid du Colombier vlong lval; 7e887ea33SDavid du Colombier double dval; 8e887ea33SDavid du Colombier char sval[8]; 9e887ea33SDavid du Colombier Gen gen; 10e887ea33SDavid du Colombier Gen2 gen2; 11e887ea33SDavid du Colombier } 12e887ea33SDavid du Colombier %left '|' 13e887ea33SDavid du Colombier %left '^' 14e887ea33SDavid du Colombier %left '&' 15e887ea33SDavid du Colombier %left '<' '>' 16e887ea33SDavid du Colombier %left '+' '-' 17e887ea33SDavid du Colombier %left '*' '/' '%' 18e887ea33SDavid du Colombier %token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4 19*40d01547SDavid du Colombier %token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG LTYPEXC LTYPEX LTYPEY LTYPERT 20e887ea33SDavid du Colombier %token <lval> LCONST LFP LPC LSB 21*40d01547SDavid du Colombier %token <lval> LBREG LLREG LSREG LFREG LMREG LXREG LYREG 22e887ea33SDavid du Colombier %token <dval> LFCONST 23e887ea33SDavid du Colombier %token <sval> LSCONST LSP 24e887ea33SDavid du Colombier %token <sym> LNAME LLAB LVAR 25e887ea33SDavid du Colombier %type <lval> con expr pointer offset 26e887ea33SDavid du Colombier %type <gen> mem imm reg nam rel rem rim rom omem nmem 27*40d01547SDavid du Colombier %type <gen2> nonnon nonrel nonrem rimnon rimrem remrim 28*40d01547SDavid du Colombier %type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10 spec11 spec12 29e887ea33SDavid du Colombier %% 30e887ea33SDavid du Colombier prog: 31e887ea33SDavid du Colombier | prog line 32e887ea33SDavid du Colombier 33e887ea33SDavid du Colombier line: 34e887ea33SDavid du Colombier LLAB ':' 35e887ea33SDavid du Colombier { 36e887ea33SDavid du Colombier if($1->value != pc) 37e887ea33SDavid du Colombier yyerror("redeclaration of %s", $1->name); 38e887ea33SDavid du Colombier $1->value = pc; 39e887ea33SDavid du Colombier } 40e887ea33SDavid du Colombier line 41e887ea33SDavid du Colombier | LNAME ':' 42e887ea33SDavid du Colombier { 43e887ea33SDavid du Colombier $1->type = LLAB; 44e887ea33SDavid du Colombier $1->value = pc; 45e887ea33SDavid du Colombier } 46e887ea33SDavid du Colombier line 47e887ea33SDavid du Colombier | ';' 48e887ea33SDavid du Colombier | inst ';' 49e887ea33SDavid du Colombier | error ';' 50e887ea33SDavid du Colombier 51e887ea33SDavid du Colombier inst: 52e887ea33SDavid du Colombier LNAME '=' expr 53e887ea33SDavid du Colombier { 54e887ea33SDavid du Colombier $1->type = LVAR; 55e887ea33SDavid du Colombier $1->value = $3; 56e887ea33SDavid du Colombier } 57e887ea33SDavid du Colombier | LVAR '=' expr 58e887ea33SDavid du Colombier { 59e887ea33SDavid du Colombier if($1->value != $3) 60e887ea33SDavid du Colombier yyerror("redeclaration of %s", $1->name); 61e887ea33SDavid du Colombier $1->value = $3; 62e887ea33SDavid du Colombier } 63e887ea33SDavid du Colombier | LTYPE0 nonnon { outcode($1, &$2); } 64e887ea33SDavid du Colombier | LTYPE1 nonrem { outcode($1, &$2); } 65e887ea33SDavid du Colombier | LTYPE2 rimnon { outcode($1, &$2); } 66e887ea33SDavid du Colombier | LTYPE3 rimrem { outcode($1, &$2); } 67e887ea33SDavid du Colombier | LTYPE4 remrim { outcode($1, &$2); } 68e887ea33SDavid du Colombier | LTYPER nonrel { outcode($1, &$2); } 69e887ea33SDavid du Colombier | LTYPED spec1 { outcode($1, &$2); } 70e887ea33SDavid du Colombier | LTYPET spec2 { outcode($1, &$2); } 71e887ea33SDavid du Colombier | LTYPEC spec3 { outcode($1, &$2); } 72e887ea33SDavid du Colombier | LTYPEN spec4 { outcode($1, &$2); } 73e887ea33SDavid du Colombier | LTYPES spec5 { outcode($1, &$2); } 74e887ea33SDavid du Colombier | LTYPEM spec6 { outcode($1, &$2); } 75e887ea33SDavid du Colombier | LTYPEI spec7 { outcode($1, &$2); } 76e887ea33SDavid du Colombier | LTYPEXC spec8 { outcode($1, &$2); } 77e887ea33SDavid du Colombier | LTYPEX spec9 { outcode($1, &$2); } 78*40d01547SDavid du Colombier | LTYPEG spec10 { outcode($1, &$2); } 79*40d01547SDavid du Colombier | LTYPEY spec11 { outcode($1, &$2); } 80*40d01547SDavid du Colombier | LTYPERT spec12 { outcode($1, &$2); } 81e887ea33SDavid du Colombier 82e887ea33SDavid du Colombier nonnon: 83e887ea33SDavid du Colombier { 84e887ea33SDavid du Colombier $$.from = nullgen; 85e887ea33SDavid du Colombier $$.to = nullgen; 86e887ea33SDavid du Colombier } 87e887ea33SDavid du Colombier | ',' 88e887ea33SDavid du Colombier { 89e887ea33SDavid du Colombier $$.from = nullgen; 90e887ea33SDavid du Colombier $$.to = nullgen; 91e887ea33SDavid du Colombier } 92e887ea33SDavid du Colombier 93e887ea33SDavid du Colombier rimrem: 94e887ea33SDavid du Colombier rim ',' rem 95e887ea33SDavid du Colombier { 96e887ea33SDavid du Colombier $$.from = $1; 97e887ea33SDavid du Colombier $$.to = $3; 98e887ea33SDavid du Colombier } 99e887ea33SDavid du Colombier 100e887ea33SDavid du Colombier remrim: 101e887ea33SDavid du Colombier rem ',' rim 102e887ea33SDavid du Colombier { 103e887ea33SDavid du Colombier $$.from = $1; 104e887ea33SDavid du Colombier $$.to = $3; 105e887ea33SDavid du Colombier } 106e887ea33SDavid du Colombier 107e887ea33SDavid du Colombier rimnon: 108e887ea33SDavid du Colombier rim ',' 109e887ea33SDavid du Colombier { 110e887ea33SDavid du Colombier $$.from = $1; 111e887ea33SDavid du Colombier $$.to = nullgen; 112e887ea33SDavid du Colombier } 113e887ea33SDavid du Colombier | rim 114e887ea33SDavid du Colombier { 115e887ea33SDavid du Colombier $$.from = $1; 116e887ea33SDavid du Colombier $$.to = nullgen; 117e887ea33SDavid du Colombier } 118e887ea33SDavid du Colombier 119e887ea33SDavid du Colombier nonrem: 120e887ea33SDavid du Colombier ',' rem 121e887ea33SDavid du Colombier { 122e887ea33SDavid du Colombier $$.from = nullgen; 123e887ea33SDavid du Colombier $$.to = $2; 124e887ea33SDavid du Colombier } 125e887ea33SDavid du Colombier | rem 126e887ea33SDavid du Colombier { 127e887ea33SDavid du Colombier $$.from = nullgen; 128e887ea33SDavid du Colombier $$.to = $1; 129e887ea33SDavid du Colombier } 130e887ea33SDavid du Colombier 131e887ea33SDavid du Colombier nonrel: 132e887ea33SDavid du Colombier ',' rel 133e887ea33SDavid du Colombier { 134e887ea33SDavid du Colombier $$.from = nullgen; 135e887ea33SDavid du Colombier $$.to = $2; 136e887ea33SDavid du Colombier } 137e887ea33SDavid du Colombier | rel 138e887ea33SDavid du Colombier { 139e887ea33SDavid du Colombier $$.from = nullgen; 140e887ea33SDavid du Colombier $$.to = $1; 141e887ea33SDavid du Colombier } 142e887ea33SDavid du Colombier 143e887ea33SDavid du Colombier spec1: /* DATA */ 144e887ea33SDavid du Colombier nam '/' con ',' imm 145e887ea33SDavid du Colombier { 146e887ea33SDavid du Colombier $$.from = $1; 147e887ea33SDavid du Colombier $$.from.scale = $3; 148e887ea33SDavid du Colombier $$.to = $5; 149e887ea33SDavid du Colombier } 150e887ea33SDavid du Colombier 151e887ea33SDavid du Colombier spec2: /* TEXT */ 152e887ea33SDavid du Colombier mem ',' imm 153e887ea33SDavid du Colombier { 154e887ea33SDavid du Colombier $$.from = $1; 155e887ea33SDavid du Colombier $$.to = $3; 156e887ea33SDavid du Colombier } 157e887ea33SDavid du Colombier | mem ',' con ',' imm 158e887ea33SDavid du Colombier { 159e887ea33SDavid du Colombier $$.from = $1; 160e887ea33SDavid du Colombier $$.from.scale = $3; 161e887ea33SDavid du Colombier $$.to = $5; 162e887ea33SDavid du Colombier } 163e887ea33SDavid du Colombier 164e887ea33SDavid du Colombier spec3: /* JMP/CALL */ 165e887ea33SDavid du Colombier ',' rom 166e887ea33SDavid du Colombier { 167e887ea33SDavid du Colombier $$.from = nullgen; 168e887ea33SDavid du Colombier $$.to = $2; 169e887ea33SDavid du Colombier } 170e887ea33SDavid du Colombier | rom 171e887ea33SDavid du Colombier { 172e887ea33SDavid du Colombier $$.from = nullgen; 173e887ea33SDavid du Colombier $$.to = $1; 174e887ea33SDavid du Colombier } 175e887ea33SDavid du Colombier 176e887ea33SDavid du Colombier spec4: /* NOP */ 177e887ea33SDavid du Colombier nonnon 178e887ea33SDavid du Colombier | nonrem 179e887ea33SDavid du Colombier 180e887ea33SDavid du Colombier spec5: /* SHL/SHR */ 181e887ea33SDavid du Colombier rim ',' rem 182e887ea33SDavid du Colombier { 183e887ea33SDavid du Colombier $$.from = $1; 184e887ea33SDavid du Colombier $$.to = $3; 185e887ea33SDavid du Colombier } 186e887ea33SDavid du Colombier | rim ',' rem ':' LLREG 187e887ea33SDavid du Colombier { 188e887ea33SDavid du Colombier $$.from = $1; 189e887ea33SDavid du Colombier $$.to = $3; 190e887ea33SDavid du Colombier if($$.from.index != D_NONE) 191e887ea33SDavid du Colombier yyerror("dp shift with lhs index"); 192e887ea33SDavid du Colombier $$.from.index = $5; 193e887ea33SDavid du Colombier } 194e887ea33SDavid du Colombier 195e887ea33SDavid du Colombier spec6: /* MOVW/MOVL */ 196e887ea33SDavid du Colombier rim ',' rem 197e887ea33SDavid du Colombier { 198e887ea33SDavid du Colombier $$.from = $1; 199e887ea33SDavid du Colombier $$.to = $3; 200e887ea33SDavid du Colombier } 201e887ea33SDavid du Colombier | rim ',' rem ':' LSREG 202e887ea33SDavid du Colombier { 203e887ea33SDavid du Colombier $$.from = $1; 204e887ea33SDavid du Colombier $$.to = $3; 205e887ea33SDavid du Colombier if($$.to.index != D_NONE) 206e887ea33SDavid du Colombier yyerror("dp move with lhs index"); 207e887ea33SDavid du Colombier $$.to.index = $5; 208e887ea33SDavid du Colombier } 209e887ea33SDavid du Colombier 210e887ea33SDavid du Colombier spec7: 211e887ea33SDavid du Colombier rim ',' 212e887ea33SDavid du Colombier { 213e887ea33SDavid du Colombier $$.from = $1; 214e887ea33SDavid du Colombier $$.to = nullgen; 215e887ea33SDavid du Colombier } 216e887ea33SDavid du Colombier | rim 217e887ea33SDavid du Colombier { 218e887ea33SDavid du Colombier $$.from = $1; 219e887ea33SDavid du Colombier $$.to = nullgen; 220e887ea33SDavid du Colombier } 221e887ea33SDavid du Colombier | rim ',' rem 222e887ea33SDavid du Colombier { 223e887ea33SDavid du Colombier $$.from = $1; 224e887ea33SDavid du Colombier $$.to = $3; 225e887ea33SDavid du Colombier } 226e887ea33SDavid du Colombier 227e887ea33SDavid du Colombier spec8: /* CMPPS/CMPPD */ 228e887ea33SDavid du Colombier reg ',' rem ',' con 229e887ea33SDavid du Colombier { 230e887ea33SDavid du Colombier $$.from = $1; 231e887ea33SDavid du Colombier $$.to = $3; 232e887ea33SDavid du Colombier $$.from.offset = $5; 233e887ea33SDavid du Colombier } 234*40d01547SDavid du Colombier | reg ',' reg ',' rem ',' con /* VCMPPS/VCMPPD */ 235*40d01547SDavid du Colombier { 236*40d01547SDavid du Colombier $$.from = $1; 237*40d01547SDavid du Colombier if(!isxyreg($3.type)) 238*40d01547SDavid du Colombier yyerror("second source operand must be X/Y register"); 239*40d01547SDavid du Colombier $$.from.index = $3.type; 240*40d01547SDavid du Colombier $$.to = $5; 241*40d01547SDavid du Colombier $$.from.offset = $7; 242*40d01547SDavid du Colombier } 243e887ea33SDavid du Colombier 244*40d01547SDavid du Colombier spec9: /* SHUFL */ 245e887ea33SDavid du Colombier imm ',' rem ',' reg 246e887ea33SDavid du Colombier { 247e887ea33SDavid du Colombier $$.from = $3; 248e887ea33SDavid du Colombier $$.to = $5; 249e887ea33SDavid du Colombier if($1.type != D_CONST) 250e887ea33SDavid du Colombier yyerror("illegal constant"); 251e887ea33SDavid du Colombier $$.to.offset = $1.offset; 252e887ea33SDavid du Colombier } 253*40d01547SDavid du Colombier | imm ',' rem ',' reg ',' reg 254*40d01547SDavid du Colombier { 255*40d01547SDavid du Colombier $$.from = $3; 256*40d01547SDavid du Colombier $$.to = $7; 257*40d01547SDavid du Colombier if($1.type != D_CONST) 258*40d01547SDavid du Colombier yyerror("illegal constant"); 259*40d01547SDavid du Colombier $$.to.offset = $1.offset; 260*40d01547SDavid du Colombier if(!isxyreg($5.type)) 261*40d01547SDavid du Colombier yyerror("second source operand must be X/Y register"); 262*40d01547SDavid du Colombier $$.to.index = $5.type; 263*40d01547SDavid du Colombier } 264e887ea33SDavid du Colombier 265*40d01547SDavid du Colombier spec10: /* GLOBL */ 266*40d01547SDavid du Colombier mem ',' imm 267*40d01547SDavid du Colombier { 268*40d01547SDavid du Colombier $$.from = $1; 269*40d01547SDavid du Colombier $$.to = $3; 270*40d01547SDavid du Colombier } 271*40d01547SDavid du Colombier | mem ',' con ',' imm 272*40d01547SDavid du Colombier { 273*40d01547SDavid du Colombier $$.from = $1; 274*40d01547SDavid du Colombier $$.from.scale = $3; 275*40d01547SDavid du Colombier $$.to = $5; 276*40d01547SDavid du Colombier } 277*40d01547SDavid du Colombier 278*40d01547SDavid du Colombier spec11: 279*40d01547SDavid du Colombier rimrem 280*40d01547SDavid du Colombier | rim ',' reg ',' rem 281*40d01547SDavid du Colombier { 282*40d01547SDavid du Colombier $$.from = $1; 283*40d01547SDavid du Colombier $$.to = $5; 284*40d01547SDavid du Colombier if(isxyreg($3.type)) { 285*40d01547SDavid du Colombier if(isxyreg($1.type)) 286*40d01547SDavid du Colombier $$.from.index = $3.type; 287*40d01547SDavid du Colombier else if(isxyreg($5.type)) 288*40d01547SDavid du Colombier $$.to.index = $3.type; 289*40d01547SDavid du Colombier } else 290*40d01547SDavid du Colombier yyerror("second source operand must be X or Y register"); 291*40d01547SDavid du Colombier } 292*40d01547SDavid du Colombier 293*40d01547SDavid du Colombier spec12: /* RET/RETF */ 294e887ea33SDavid du Colombier { 295e887ea33SDavid du Colombier $$.from = nullgen; 296e887ea33SDavid du Colombier $$.to = nullgen; 297e887ea33SDavid du Colombier } 298e887ea33SDavid du Colombier | imm 299e887ea33SDavid du Colombier { 300e887ea33SDavid du Colombier $$.from = $1; 301e887ea33SDavid du Colombier $$.to = nullgen; 302e887ea33SDavid du Colombier } 303e887ea33SDavid du Colombier 304e887ea33SDavid du Colombier rem: 305e887ea33SDavid du Colombier reg 306e887ea33SDavid du Colombier | mem 307e887ea33SDavid du Colombier 308e887ea33SDavid du Colombier rom: 309e887ea33SDavid du Colombier rel 310e887ea33SDavid du Colombier | nmem 311e887ea33SDavid du Colombier | '*' reg 312e887ea33SDavid du Colombier { 313e887ea33SDavid du Colombier $$ = $2; 314e887ea33SDavid du Colombier } 315e887ea33SDavid du Colombier | '*' omem 316e887ea33SDavid du Colombier { 317e887ea33SDavid du Colombier $$ = $2; 318e887ea33SDavid du Colombier } 319e887ea33SDavid du Colombier | reg 320e887ea33SDavid du Colombier | omem 321*40d01547SDavid du Colombier | imm 322e887ea33SDavid du Colombier 323e887ea33SDavid du Colombier rim: 324e887ea33SDavid du Colombier rem 325e887ea33SDavid du Colombier | imm 326e887ea33SDavid du Colombier 327e887ea33SDavid du Colombier rel: 328e887ea33SDavid du Colombier con '(' LPC ')' 329e887ea33SDavid du Colombier { 330e887ea33SDavid du Colombier $$ = nullgen; 331e887ea33SDavid du Colombier $$.type = D_BRANCH; 332e887ea33SDavid du Colombier $$.offset = $1 + pc; 333e887ea33SDavid du Colombier } 334e887ea33SDavid du Colombier | LNAME offset 335e887ea33SDavid du Colombier { 336e887ea33SDavid du Colombier $$ = nullgen; 337e887ea33SDavid du Colombier if(pass == 2) 338e887ea33SDavid du Colombier yyerror("undefined label: %s", $1->name); 339e887ea33SDavid du Colombier $$.type = D_BRANCH; 340e887ea33SDavid du Colombier $$.sym = $1; 341e887ea33SDavid du Colombier $$.offset = $2; 342e887ea33SDavid du Colombier } 343e887ea33SDavid du Colombier | LLAB offset 344e887ea33SDavid du Colombier { 345e887ea33SDavid du Colombier $$ = nullgen; 346e887ea33SDavid du Colombier $$.type = D_BRANCH; 347e887ea33SDavid du Colombier $$.sym = $1; 348e887ea33SDavid du Colombier $$.offset = $1->value + $2; 349e887ea33SDavid du Colombier } 350e887ea33SDavid du Colombier 351e887ea33SDavid du Colombier reg: 352e887ea33SDavid du Colombier LBREG 353e887ea33SDavid du Colombier { 354e887ea33SDavid du Colombier $$ = nullgen; 355e887ea33SDavid du Colombier $$.type = $1; 356e887ea33SDavid du Colombier } 357e887ea33SDavid du Colombier | LFREG 358e887ea33SDavid du Colombier { 359e887ea33SDavid du Colombier $$ = nullgen; 360e887ea33SDavid du Colombier $$.type = $1; 361e887ea33SDavid du Colombier } 362e887ea33SDavid du Colombier | LLREG 363e887ea33SDavid du Colombier { 364e887ea33SDavid du Colombier $$ = nullgen; 365e887ea33SDavid du Colombier $$.type = $1; 366e887ea33SDavid du Colombier } 367e887ea33SDavid du Colombier | LMREG 368e887ea33SDavid du Colombier { 369e887ea33SDavid du Colombier $$ = nullgen; 370e887ea33SDavid du Colombier $$.type = $1; 371e887ea33SDavid du Colombier } 372e887ea33SDavid du Colombier | LSP 373e887ea33SDavid du Colombier { 374e887ea33SDavid du Colombier $$ = nullgen; 375e887ea33SDavid du Colombier $$.type = D_SP; 376e887ea33SDavid du Colombier } 377e887ea33SDavid du Colombier | LSREG 378e887ea33SDavid du Colombier { 379e887ea33SDavid du Colombier $$ = nullgen; 380e887ea33SDavid du Colombier $$.type = $1; 381e887ea33SDavid du Colombier } 382e887ea33SDavid du Colombier | LXREG 383e887ea33SDavid du Colombier { 384e887ea33SDavid du Colombier $$ = nullgen; 385e887ea33SDavid du Colombier $$.type = $1; 386e887ea33SDavid du Colombier } 387*40d01547SDavid du Colombier | LYREG 388*40d01547SDavid du Colombier { 389*40d01547SDavid du Colombier $$ = nullgen; 390*40d01547SDavid du Colombier $$.type = $1; 391*40d01547SDavid du Colombier } 392e887ea33SDavid du Colombier 393e887ea33SDavid du Colombier imm: 394e887ea33SDavid du Colombier '$' con 395e887ea33SDavid du Colombier { 396e887ea33SDavid du Colombier $$ = nullgen; 397e887ea33SDavid du Colombier $$.type = D_CONST; 398e887ea33SDavid du Colombier $$.offset = $2; 399e887ea33SDavid du Colombier } 400e887ea33SDavid du Colombier | '$' nam 401e887ea33SDavid du Colombier { 402e887ea33SDavid du Colombier $$ = $2; 403e887ea33SDavid du Colombier $$.index = $2.type; 404e887ea33SDavid du Colombier $$.type = D_ADDR; 405e887ea33SDavid du Colombier /* 406e887ea33SDavid du Colombier if($2.type == D_AUTO || $2.type == D_PARAM) 407e887ea33SDavid du Colombier yyerror("constant cannot be automatic: %s", 408e887ea33SDavid du Colombier $2.sym->name); 409e887ea33SDavid du Colombier */ 410e887ea33SDavid du Colombier } 411e887ea33SDavid du Colombier | '$' LSCONST 412e887ea33SDavid du Colombier { 413e887ea33SDavid du Colombier $$ = nullgen; 414e887ea33SDavid du Colombier $$.type = D_SCONST; 415e887ea33SDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 416e887ea33SDavid du Colombier } 417e887ea33SDavid du Colombier | '$' LFCONST 418e887ea33SDavid du Colombier { 419e887ea33SDavid du Colombier $$ = nullgen; 420e887ea33SDavid du Colombier $$.type = D_FCONST; 421e887ea33SDavid du Colombier $$.dval = $2; 422e887ea33SDavid du Colombier } 423e887ea33SDavid du Colombier | '$' '(' LFCONST ')' 424e887ea33SDavid du Colombier { 425e887ea33SDavid du Colombier $$ = nullgen; 426e887ea33SDavid du Colombier $$.type = D_FCONST; 427e887ea33SDavid du Colombier $$.dval = $3; 428e887ea33SDavid du Colombier } 429e887ea33SDavid du Colombier | '$' '-' LFCONST 430e887ea33SDavid du Colombier { 431e887ea33SDavid du Colombier $$ = nullgen; 432e887ea33SDavid du Colombier $$.type = D_FCONST; 433e887ea33SDavid du Colombier $$.dval = -$3; 434e887ea33SDavid du Colombier } 435e887ea33SDavid du Colombier 436e887ea33SDavid du Colombier mem: 437e887ea33SDavid du Colombier omem 438e887ea33SDavid du Colombier | nmem 439e887ea33SDavid du Colombier 440e887ea33SDavid du Colombier omem: 441e887ea33SDavid du Colombier con 442e887ea33SDavid du Colombier { 443e887ea33SDavid du Colombier $$ = nullgen; 444e887ea33SDavid du Colombier $$.type = D_INDIR+D_NONE; 445e887ea33SDavid du Colombier $$.offset = $1; 446e887ea33SDavid du Colombier } 447e887ea33SDavid du Colombier | con '(' LLREG ')' 448e887ea33SDavid du Colombier { 449e887ea33SDavid du Colombier $$ = nullgen; 450e887ea33SDavid du Colombier $$.type = D_INDIR+$3; 451e887ea33SDavid du Colombier $$.offset = $1; 452e887ea33SDavid du Colombier } 453e887ea33SDavid du Colombier | con '(' LSP ')' 454e887ea33SDavid du Colombier { 455e887ea33SDavid du Colombier $$ = nullgen; 456e887ea33SDavid du Colombier $$.type = D_INDIR+D_SP; 457e887ea33SDavid du Colombier $$.offset = $1; 458e887ea33SDavid du Colombier } 459e887ea33SDavid du Colombier | con '(' LLREG '*' con ')' 460e887ea33SDavid du Colombier { 461e887ea33SDavid du Colombier $$ = nullgen; 462e887ea33SDavid du Colombier $$.type = D_INDIR+D_NONE; 463e887ea33SDavid du Colombier $$.offset = $1; 464e887ea33SDavid du Colombier $$.index = $3; 465e887ea33SDavid du Colombier $$.scale = $5; 466e887ea33SDavid du Colombier checkscale($$.scale); 467e887ea33SDavid du Colombier } 468e887ea33SDavid du Colombier | con '(' LLREG ')' '(' LLREG '*' con ')' 469e887ea33SDavid du Colombier { 470e887ea33SDavid du Colombier $$ = nullgen; 471e887ea33SDavid du Colombier $$.type = D_INDIR+$3; 472e887ea33SDavid du Colombier $$.offset = $1; 473e887ea33SDavid du Colombier $$.index = $6; 474e887ea33SDavid du Colombier $$.scale = $8; 475e887ea33SDavid du Colombier checkscale($$.scale); 476e887ea33SDavid du Colombier } 477e887ea33SDavid du Colombier | '(' LLREG ')' 478e887ea33SDavid du Colombier { 479e887ea33SDavid du Colombier $$ = nullgen; 480e887ea33SDavid du Colombier $$.type = D_INDIR+$2; 481e887ea33SDavid du Colombier } 482e887ea33SDavid du Colombier | '(' LSP ')' 483e887ea33SDavid du Colombier { 484e887ea33SDavid du Colombier $$ = nullgen; 485e887ea33SDavid du Colombier $$.type = D_INDIR+D_SP; 486e887ea33SDavid du Colombier } 487*40d01547SDavid du Colombier | con '(' LSREG ')' 488*40d01547SDavid du Colombier { 489*40d01547SDavid du Colombier $$ = nullgen; 490*40d01547SDavid du Colombier $$.type = D_INDIR+$3; 491*40d01547SDavid du Colombier $$.offset = $1; 492*40d01547SDavid du Colombier } 493e887ea33SDavid du Colombier | '(' LLREG '*' con ')' 494e887ea33SDavid du Colombier { 495e887ea33SDavid du Colombier $$ = nullgen; 496e887ea33SDavid du Colombier $$.type = D_INDIR+D_NONE; 497e887ea33SDavid du Colombier $$.index = $2; 498e887ea33SDavid du Colombier $$.scale = $4; 499e887ea33SDavid du Colombier checkscale($$.scale); 500e887ea33SDavid du Colombier } 501e887ea33SDavid du Colombier | '(' LLREG ')' '(' LLREG '*' con ')' 502e887ea33SDavid du Colombier { 503e887ea33SDavid du Colombier $$ = nullgen; 504e887ea33SDavid du Colombier $$.type = D_INDIR+$2; 505e887ea33SDavid du Colombier $$.index = $5; 506e887ea33SDavid du Colombier $$.scale = $7; 507e887ea33SDavid du Colombier checkscale($$.scale); 508e887ea33SDavid du Colombier } 509e887ea33SDavid du Colombier 510e887ea33SDavid du Colombier nmem: 511e887ea33SDavid du Colombier nam 512e887ea33SDavid du Colombier { 513e887ea33SDavid du Colombier $$ = $1; 514e887ea33SDavid du Colombier } 515e887ea33SDavid du Colombier | nam '(' LLREG '*' con ')' 516e887ea33SDavid du Colombier { 517e887ea33SDavid du Colombier $$ = $1; 518e887ea33SDavid du Colombier $$.index = $3; 519e887ea33SDavid du Colombier $$.scale = $5; 520e887ea33SDavid du Colombier checkscale($$.scale); 521e887ea33SDavid du Colombier } 522e887ea33SDavid du Colombier 523e887ea33SDavid du Colombier nam: 524e887ea33SDavid du Colombier LNAME offset '(' pointer ')' 525e887ea33SDavid du Colombier { 526e887ea33SDavid du Colombier $$ = nullgen; 527e887ea33SDavid du Colombier $$.type = $4; 528e887ea33SDavid du Colombier $$.sym = $1; 529e887ea33SDavid du Colombier $$.offset = $2; 530e887ea33SDavid du Colombier } 531e887ea33SDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 532e887ea33SDavid du Colombier { 533e887ea33SDavid du Colombier $$ = nullgen; 534e887ea33SDavid du Colombier $$.type = D_STATIC; 535e887ea33SDavid du Colombier $$.sym = $1; 536e887ea33SDavid du Colombier $$.offset = $4; 537e887ea33SDavid du Colombier } 538e887ea33SDavid du Colombier 539e887ea33SDavid du Colombier offset: 540e887ea33SDavid du Colombier { 541e887ea33SDavid du Colombier $$ = 0; 542e887ea33SDavid du Colombier } 543e887ea33SDavid du Colombier | '+' con 544e887ea33SDavid du Colombier { 545e887ea33SDavid du Colombier $$ = $2; 546e887ea33SDavid du Colombier } 547e887ea33SDavid du Colombier | '-' con 548e887ea33SDavid du Colombier { 549e887ea33SDavid du Colombier $$ = -$2; 550e887ea33SDavid du Colombier } 551e887ea33SDavid du Colombier 552e887ea33SDavid du Colombier pointer: 553e887ea33SDavid du Colombier LSB 554e887ea33SDavid du Colombier | LSP 555e887ea33SDavid du Colombier { 556e887ea33SDavid du Colombier $$ = D_AUTO; 557e887ea33SDavid du Colombier } 558e887ea33SDavid du Colombier | LFP 559e887ea33SDavid du Colombier 560e887ea33SDavid du Colombier con: 561e887ea33SDavid du Colombier LCONST 562e887ea33SDavid du Colombier | LVAR 563e887ea33SDavid du Colombier { 564e887ea33SDavid du Colombier $$ = $1->value; 565e887ea33SDavid du Colombier } 566e887ea33SDavid du Colombier | '-' con 567e887ea33SDavid du Colombier { 568e887ea33SDavid du Colombier $$ = -$2; 569e887ea33SDavid du Colombier } 570e887ea33SDavid du Colombier | '+' con 571e887ea33SDavid du Colombier { 572e887ea33SDavid du Colombier $$ = $2; 573e887ea33SDavid du Colombier } 574e887ea33SDavid du Colombier | '~' con 575e887ea33SDavid du Colombier { 576e887ea33SDavid du Colombier $$ = ~$2; 577e887ea33SDavid du Colombier } 578e887ea33SDavid du Colombier | '(' expr ')' 579e887ea33SDavid du Colombier { 580e887ea33SDavid du Colombier $$ = $2; 581e887ea33SDavid du Colombier } 582e887ea33SDavid du Colombier 583e887ea33SDavid du Colombier expr: 584e887ea33SDavid du Colombier con 585e887ea33SDavid du Colombier | expr '+' expr 586e887ea33SDavid du Colombier { 587e887ea33SDavid du Colombier $$ = $1 + $3; 588e887ea33SDavid du Colombier } 589e887ea33SDavid du Colombier | expr '-' expr 590e887ea33SDavid du Colombier { 591e887ea33SDavid du Colombier $$ = $1 - $3; 592e887ea33SDavid du Colombier } 593e887ea33SDavid du Colombier | expr '*' expr 594e887ea33SDavid du Colombier { 595e887ea33SDavid du Colombier $$ = $1 * $3; 596e887ea33SDavid du Colombier } 597e887ea33SDavid du Colombier | expr '/' expr 598e887ea33SDavid du Colombier { 599e887ea33SDavid du Colombier $$ = $1 / $3; 600e887ea33SDavid du Colombier } 601e887ea33SDavid du Colombier | expr '%' expr 602e887ea33SDavid du Colombier { 603e887ea33SDavid du Colombier $$ = $1 % $3; 604e887ea33SDavid du Colombier } 605e887ea33SDavid du Colombier | expr '<' '<' expr 606e887ea33SDavid du Colombier { 607e887ea33SDavid du Colombier $$ = $1 << $4; 608e887ea33SDavid du Colombier } 609e887ea33SDavid du Colombier | expr '>' '>' expr 610e887ea33SDavid du Colombier { 611e887ea33SDavid du Colombier $$ = $1 >> $4; 612e887ea33SDavid du Colombier } 613e887ea33SDavid du Colombier | expr '&' expr 614e887ea33SDavid du Colombier { 615e887ea33SDavid du Colombier $$ = $1 & $3; 616e887ea33SDavid du Colombier } 617e887ea33SDavid du Colombier | expr '^' expr 618e887ea33SDavid du Colombier { 619e887ea33SDavid du Colombier $$ = $1 ^ $3; 620e887ea33SDavid du Colombier } 621e887ea33SDavid du Colombier | expr '|' expr 622e887ea33SDavid du Colombier { 623e887ea33SDavid du Colombier $$ = $1 | $3; 624e887ea33SDavid du Colombier } 625