1*ce95e1b3SDavid du Colombier %{ 2*ce95e1b3SDavid du Colombier #include "a.h" 3*ce95e1b3SDavid du Colombier %} 4*ce95e1b3SDavid du Colombier %union 5*ce95e1b3SDavid du Colombier { 6*ce95e1b3SDavid du Colombier Sym *sym; 7*ce95e1b3SDavid du Colombier vlong lval; 8*ce95e1b3SDavid du Colombier double dval; 9*ce95e1b3SDavid du Colombier char sval[8]; 10*ce95e1b3SDavid du Colombier Gen gen; 11*ce95e1b3SDavid du Colombier } 12*ce95e1b3SDavid du Colombier %left '|' 13*ce95e1b3SDavid du Colombier %left '^' 14*ce95e1b3SDavid du Colombier %left '&' 15*ce95e1b3SDavid du Colombier %left '<' '>' 16*ce95e1b3SDavid du Colombier %left '+' '-' 17*ce95e1b3SDavid du Colombier %left '*' '/' '%' 18*ce95e1b3SDavid du Colombier %token <lval> LADD LMUL LBEQ LBR LBRET LCALL LFLT2 LFLT3 19*ce95e1b3SDavid du Colombier %token <lval> LMOVB LMOVBU LMOVW LMOVF LLUI LSYS LSYS0 LCSR LSWAP LAMO 20*ce95e1b3SDavid du Colombier %token <lval> LCONST LSP LSB LFP LPC LREG LFREG LR FR LCTL 21*ce95e1b3SDavid du Colombier %token <lval> LDATA LTEXT LWORD 22*ce95e1b3SDavid du Colombier %token <sval> LSCONST 23*ce95e1b3SDavid du Colombier %token <dval> LFCONST 24*ce95e1b3SDavid du Colombier %token <sym> LNAME LLAB LVAR 25*ce95e1b3SDavid du Colombier %type <lval> con expr pointer offset sreg freg oprrr 26*ce95e1b3SDavid du Colombier %type <gen> rreg dreg ctlreg drreg 27*ce95e1b3SDavid du Colombier %type <gen> addr name oreg rel imm ximm fimm 28*ce95e1b3SDavid du Colombier %% 29*ce95e1b3SDavid du Colombier prog: 30*ce95e1b3SDavid du Colombier | prog line 31*ce95e1b3SDavid du Colombier 32*ce95e1b3SDavid du Colombier line: 33*ce95e1b3SDavid du Colombier LLAB ':' 34*ce95e1b3SDavid du Colombier { 35*ce95e1b3SDavid du Colombier if($1->value != pc) 36*ce95e1b3SDavid du Colombier yyerror("redeclaration of %s", $1->name); 37*ce95e1b3SDavid du Colombier $1->value = pc; 38*ce95e1b3SDavid du Colombier } 39*ce95e1b3SDavid du Colombier line 40*ce95e1b3SDavid du Colombier | LNAME ':' 41*ce95e1b3SDavid du Colombier { 42*ce95e1b3SDavid du Colombier $1->type = LLAB; 43*ce95e1b3SDavid du Colombier $1->value = pc; 44*ce95e1b3SDavid du Colombier } 45*ce95e1b3SDavid du Colombier line 46*ce95e1b3SDavid du Colombier | LNAME '=' expr ';' 47*ce95e1b3SDavid du Colombier { 48*ce95e1b3SDavid du Colombier $1->type = LVAR; 49*ce95e1b3SDavid du Colombier $1->value = $3; 50*ce95e1b3SDavid du Colombier } 51*ce95e1b3SDavid du Colombier | LVAR '=' expr ';' 52*ce95e1b3SDavid du Colombier { 53*ce95e1b3SDavid du Colombier if($1->value != $3) 54*ce95e1b3SDavid du Colombier yyerror("redeclaration of %s", $1->name); 55*ce95e1b3SDavid du Colombier $1->value = $3; 56*ce95e1b3SDavid du Colombier } 57*ce95e1b3SDavid du Colombier | ';' 58*ce95e1b3SDavid du Colombier | inst ';' 59*ce95e1b3SDavid du Colombier | error ';' 60*ce95e1b3SDavid du Colombier 61*ce95e1b3SDavid du Colombier inst: 62*ce95e1b3SDavid du Colombier LADD imm ',' rreg 63*ce95e1b3SDavid du Colombier { 64*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 65*ce95e1b3SDavid du Colombier } 66*ce95e1b3SDavid du Colombier | oprrr rreg ',' rreg 67*ce95e1b3SDavid du Colombier { 68*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 69*ce95e1b3SDavid du Colombier } 70*ce95e1b3SDavid du Colombier | LADD imm ',' sreg ',' rreg 71*ce95e1b3SDavid du Colombier { 72*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 73*ce95e1b3SDavid du Colombier } 74*ce95e1b3SDavid du Colombier | oprrr rreg ',' sreg ',' rreg 75*ce95e1b3SDavid du Colombier { 76*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 77*ce95e1b3SDavid du Colombier } 78*ce95e1b3SDavid du Colombier 79*ce95e1b3SDavid du Colombier | LFLT2 drreg ',' drreg 80*ce95e1b3SDavid du Colombier { 81*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 82*ce95e1b3SDavid du Colombier } 83*ce95e1b3SDavid du Colombier | LFLT3 drreg ',' freg ',' drreg 84*ce95e1b3SDavid du Colombier { 85*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 86*ce95e1b3SDavid du Colombier } 87*ce95e1b3SDavid du Colombier 88*ce95e1b3SDavid du Colombier | LBEQ rreg ',' sreg ',' rel 89*ce95e1b3SDavid du Colombier { 90*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 91*ce95e1b3SDavid du Colombier } 92*ce95e1b3SDavid du Colombier 93*ce95e1b3SDavid du Colombier | LBEQ rreg ',' rel 94*ce95e1b3SDavid du Colombier { 95*ce95e1b3SDavid du Colombier Gen regzero; 96*ce95e1b3SDavid du Colombier regzero = nullgen; 97*ce95e1b3SDavid du Colombier regzero.type = D_REG; 98*ce95e1b3SDavid du Colombier regzero.reg = 0; 99*ce95e1b3SDavid du Colombier outcode($1, ®zero, $2.reg, &$4); 100*ce95e1b3SDavid du Colombier } 101*ce95e1b3SDavid du Colombier 102*ce95e1b3SDavid du Colombier | LBR rel 103*ce95e1b3SDavid du Colombier { 104*ce95e1b3SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 105*ce95e1b3SDavid du Colombier } 106*ce95e1b3SDavid du Colombier 107*ce95e1b3SDavid du Colombier | LBR oreg 108*ce95e1b3SDavid du Colombier { 109*ce95e1b3SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 110*ce95e1b3SDavid du Colombier } 111*ce95e1b3SDavid du Colombier 112*ce95e1b3SDavid du Colombier 113*ce95e1b3SDavid du Colombier | LBRET 114*ce95e1b3SDavid du Colombier { 115*ce95e1b3SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 116*ce95e1b3SDavid du Colombier } 117*ce95e1b3SDavid du Colombier 118*ce95e1b3SDavid du Colombier | LCALL sreg ',' addr 119*ce95e1b3SDavid du Colombier { 120*ce95e1b3SDavid du Colombier outcode($1, &nullgen, $2, &$4); 121*ce95e1b3SDavid du Colombier } 122*ce95e1b3SDavid du Colombier | LCALL sreg ',' rel 123*ce95e1b3SDavid du Colombier { 124*ce95e1b3SDavid du Colombier outcode($1, &nullgen, $2, &$4); 125*ce95e1b3SDavid du Colombier } 126*ce95e1b3SDavid du Colombier 127*ce95e1b3SDavid du Colombier | LMOVB addr ',' rreg 128*ce95e1b3SDavid du Colombier { 129*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 130*ce95e1b3SDavid du Colombier } 131*ce95e1b3SDavid du Colombier | LMOVBU addr ',' rreg 132*ce95e1b3SDavid du Colombier { 133*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 134*ce95e1b3SDavid du Colombier } 135*ce95e1b3SDavid du Colombier | LMOVB rreg ',' addr 136*ce95e1b3SDavid du Colombier { 137*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 138*ce95e1b3SDavid du Colombier } 139*ce95e1b3SDavid du Colombier 140*ce95e1b3SDavid du Colombier | LMOVF addr ',' dreg 141*ce95e1b3SDavid du Colombier { 142*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 143*ce95e1b3SDavid du Colombier } 144*ce95e1b3SDavid du Colombier | LMOVF dreg ',' addr 145*ce95e1b3SDavid du Colombier { 146*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 147*ce95e1b3SDavid du Colombier } 148*ce95e1b3SDavid du Colombier | LMOVF dreg ',' dreg 149*ce95e1b3SDavid du Colombier { 150*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 151*ce95e1b3SDavid du Colombier } 152*ce95e1b3SDavid du Colombier 153*ce95e1b3SDavid du Colombier 154*ce95e1b3SDavid du Colombier | LMOVW imm ',' rreg 155*ce95e1b3SDavid du Colombier { 156*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 157*ce95e1b3SDavid du Colombier } 158*ce95e1b3SDavid du Colombier | LMOVW ximm ',' rreg 159*ce95e1b3SDavid du Colombier { 160*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 161*ce95e1b3SDavid du Colombier } 162*ce95e1b3SDavid du Colombier | LMOVW rreg ',' rreg 163*ce95e1b3SDavid du Colombier { 164*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 165*ce95e1b3SDavid du Colombier } 166*ce95e1b3SDavid du Colombier | LMOVW addr ',' rreg 167*ce95e1b3SDavid du Colombier { 168*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 169*ce95e1b3SDavid du Colombier } 170*ce95e1b3SDavid du Colombier | LMOVW rreg ',' addr 171*ce95e1b3SDavid du Colombier { 172*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 173*ce95e1b3SDavid du Colombier } 174*ce95e1b3SDavid du Colombier | LMOVW rreg ',' ctlreg 175*ce95e1b3SDavid du Colombier { 176*ce95e1b3SDavid du Colombier Gen regzero; 177*ce95e1b3SDavid du Colombier regzero = nullgen; 178*ce95e1b3SDavid du Colombier regzero.type = D_REG; 179*ce95e1b3SDavid du Colombier regzero.reg = 0; 180*ce95e1b3SDavid du Colombier outcode(ACSRRW, &$4, $2.reg, ®zero); 181*ce95e1b3SDavid du Colombier } 182*ce95e1b3SDavid du Colombier | LMOVW imm ',' ctlreg 183*ce95e1b3SDavid du Colombier { 184*ce95e1b3SDavid du Colombier Gen regzero; 185*ce95e1b3SDavid du Colombier int r = $2.offset; 186*ce95e1b3SDavid du Colombier if(r < 0 || r >= NREG) 187*ce95e1b3SDavid du Colombier yyerror("immediate value out of range"); 188*ce95e1b3SDavid du Colombier regzero = nullgen; 189*ce95e1b3SDavid du Colombier regzero.type = D_REG; 190*ce95e1b3SDavid du Colombier regzero.reg = 0; 191*ce95e1b3SDavid du Colombier outcode(ACSRRWI, &$4, r, ®zero); 192*ce95e1b3SDavid du Colombier } 193*ce95e1b3SDavid du Colombier | LMOVW ctlreg ',' rreg 194*ce95e1b3SDavid du Colombier { 195*ce95e1b3SDavid du Colombier outcode(ACSRRS, &$2, REGZERO, &$4); 196*ce95e1b3SDavid du Colombier } 197*ce95e1b3SDavid du Colombier 198*ce95e1b3SDavid du Colombier | LLUI name ',' rreg 199*ce95e1b3SDavid du Colombier { 200*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 201*ce95e1b3SDavid du Colombier } 202*ce95e1b3SDavid du Colombier | LLUI imm ',' rreg 203*ce95e1b3SDavid du Colombier { 204*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 205*ce95e1b3SDavid du Colombier } 206*ce95e1b3SDavid du Colombier 207*ce95e1b3SDavid du Colombier 208*ce95e1b3SDavid du Colombier | LSYS imm 209*ce95e1b3SDavid du Colombier { 210*ce95e1b3SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 211*ce95e1b3SDavid du Colombier } 212*ce95e1b3SDavid du Colombier 213*ce95e1b3SDavid du Colombier | LSYS0 214*ce95e1b3SDavid du Colombier { 215*ce95e1b3SDavid du Colombier Gen syscon; 216*ce95e1b3SDavid du Colombier syscon = nullgen; 217*ce95e1b3SDavid du Colombier syscon.type = D_CONST; 218*ce95e1b3SDavid du Colombier syscon.offset = $1; 219*ce95e1b3SDavid du Colombier outcode(ASYS, &nullgen, NREG, &syscon); 220*ce95e1b3SDavid du Colombier } 221*ce95e1b3SDavid du Colombier 222*ce95e1b3SDavid du Colombier | LCSR ctlreg ',' sreg ',' rreg 223*ce95e1b3SDavid du Colombier { 224*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 225*ce95e1b3SDavid du Colombier } 226*ce95e1b3SDavid du Colombier 227*ce95e1b3SDavid du Colombier | LCSR ctlreg ',' '$' con ',' rreg 228*ce95e1b3SDavid du Colombier { 229*ce95e1b3SDavid du Colombier if($5 < 0 || $5 >= NREG) 230*ce95e1b3SDavid du Colombier yyerror("immediate value out of range"); 231*ce95e1b3SDavid du Colombier outcode($1 + (ACSRRWI-ACSRRW), &$2, $5, &$7); 232*ce95e1b3SDavid du Colombier } 233*ce95e1b3SDavid du Colombier 234*ce95e1b3SDavid du Colombier | LSWAP rreg ',' sreg ',' rreg 235*ce95e1b3SDavid du Colombier { 236*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 237*ce95e1b3SDavid du Colombier } 238*ce95e1b3SDavid du Colombier 239*ce95e1b3SDavid du Colombier | LAMO con ',' rreg ',' sreg ',' rreg 240*ce95e1b3SDavid du Colombier { 241*ce95e1b3SDavid du Colombier outcode($1, &$4, ($2<<16)|$6, &$8); 242*ce95e1b3SDavid du Colombier } 243*ce95e1b3SDavid du Colombier 244*ce95e1b3SDavid du Colombier | LTEXT name ',' imm 245*ce95e1b3SDavid du Colombier { 246*ce95e1b3SDavid du Colombier outcode($1, &$2, NREG, &$4); 247*ce95e1b3SDavid du Colombier } 248*ce95e1b3SDavid du Colombier | LTEXT name ',' con ',' imm 249*ce95e1b3SDavid du Colombier { 250*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 251*ce95e1b3SDavid du Colombier } 252*ce95e1b3SDavid du Colombier 253*ce95e1b3SDavid du Colombier | LDATA name '/' con ',' imm 254*ce95e1b3SDavid du Colombier { 255*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 256*ce95e1b3SDavid du Colombier } 257*ce95e1b3SDavid du Colombier | LDATA name '/' con ',' ximm 258*ce95e1b3SDavid du Colombier { 259*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 260*ce95e1b3SDavid du Colombier } 261*ce95e1b3SDavid du Colombier | LDATA name '/' con ',' fimm 262*ce95e1b3SDavid du Colombier { 263*ce95e1b3SDavid du Colombier outcode($1, &$2, $4, &$6); 264*ce95e1b3SDavid du Colombier } 265*ce95e1b3SDavid du Colombier 266*ce95e1b3SDavid du Colombier | LWORD imm 267*ce95e1b3SDavid du Colombier { 268*ce95e1b3SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 269*ce95e1b3SDavid du Colombier } 270*ce95e1b3SDavid du Colombier 271*ce95e1b3SDavid du Colombier rel: 272*ce95e1b3SDavid du Colombier con '(' LPC ')' 273*ce95e1b3SDavid du Colombier { 274*ce95e1b3SDavid du Colombier $$ = nullgen; 275*ce95e1b3SDavid du Colombier $$.type = D_BRANCH; 276*ce95e1b3SDavid du Colombier $$.offset = $1 + pc; 277*ce95e1b3SDavid du Colombier } 278*ce95e1b3SDavid du Colombier | LNAME offset 279*ce95e1b3SDavid du Colombier { 280*ce95e1b3SDavid du Colombier $$ = nullgen; 281*ce95e1b3SDavid du Colombier if(pass == 2) 282*ce95e1b3SDavid du Colombier yyerror("undefined label: %s", $1->name); 283*ce95e1b3SDavid du Colombier $$.type = D_BRANCH; 284*ce95e1b3SDavid du Colombier $$.sym = $1; 285*ce95e1b3SDavid du Colombier $$.offset = $2; 286*ce95e1b3SDavid du Colombier } 287*ce95e1b3SDavid du Colombier | LLAB offset 288*ce95e1b3SDavid du Colombier { 289*ce95e1b3SDavid du Colombier $$ = nullgen; 290*ce95e1b3SDavid du Colombier $$.type = D_BRANCH; 291*ce95e1b3SDavid du Colombier $$.sym = $1; 292*ce95e1b3SDavid du Colombier $$.offset = $1->value + $2; 293*ce95e1b3SDavid du Colombier } 294*ce95e1b3SDavid du Colombier 295*ce95e1b3SDavid du Colombier oprrr: 296*ce95e1b3SDavid du Colombier LADD 297*ce95e1b3SDavid du Colombier | LMUL 298*ce95e1b3SDavid du Colombier 299*ce95e1b3SDavid du Colombier addr: 300*ce95e1b3SDavid du Colombier oreg 301*ce95e1b3SDavid du Colombier | name 302*ce95e1b3SDavid du Colombier 303*ce95e1b3SDavid du Colombier oreg: 304*ce95e1b3SDavid du Colombier '(' sreg ')' 305*ce95e1b3SDavid du Colombier { 306*ce95e1b3SDavid du Colombier $$ = nullgen; 307*ce95e1b3SDavid du Colombier $$.type = D_OREG; 308*ce95e1b3SDavid du Colombier $$.reg = $2; 309*ce95e1b3SDavid du Colombier $$.offset = 0; 310*ce95e1b3SDavid du Colombier } 311*ce95e1b3SDavid du Colombier | con '(' sreg ')' 312*ce95e1b3SDavid du Colombier { 313*ce95e1b3SDavid du Colombier $$ = nullgen; 314*ce95e1b3SDavid du Colombier $$.type = D_OREG; 315*ce95e1b3SDavid du Colombier $$.reg = $3; 316*ce95e1b3SDavid du Colombier $$.offset = $1; 317*ce95e1b3SDavid du Colombier } 318*ce95e1b3SDavid du Colombier 319*ce95e1b3SDavid du Colombier name: 320*ce95e1b3SDavid du Colombier con '(' pointer ')' 321*ce95e1b3SDavid du Colombier { 322*ce95e1b3SDavid du Colombier $$ = nullgen; 323*ce95e1b3SDavid du Colombier $$.type = D_OREG; 324*ce95e1b3SDavid du Colombier $$.name = $3; 325*ce95e1b3SDavid du Colombier $$.sym = S; 326*ce95e1b3SDavid du Colombier $$.offset = $1; 327*ce95e1b3SDavid du Colombier } 328*ce95e1b3SDavid du Colombier | LNAME offset '(' pointer ')' 329*ce95e1b3SDavid du Colombier { 330*ce95e1b3SDavid du Colombier $$ = nullgen; 331*ce95e1b3SDavid du Colombier $$.type = D_OREG; 332*ce95e1b3SDavid du Colombier $$.name = $4; 333*ce95e1b3SDavid du Colombier $$.sym = $1; 334*ce95e1b3SDavid du Colombier $$.offset = $2; 335*ce95e1b3SDavid du Colombier } 336*ce95e1b3SDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 337*ce95e1b3SDavid du Colombier { 338*ce95e1b3SDavid du Colombier $$ = nullgen; 339*ce95e1b3SDavid du Colombier $$.type = D_OREG; 340*ce95e1b3SDavid du Colombier $$.name = D_STATIC; 341*ce95e1b3SDavid du Colombier $$.sym = $1; 342*ce95e1b3SDavid du Colombier $$.offset = $4; 343*ce95e1b3SDavid du Colombier } 344*ce95e1b3SDavid du Colombier 345*ce95e1b3SDavid du Colombier offset: 346*ce95e1b3SDavid du Colombier { 347*ce95e1b3SDavid du Colombier $$ = 0; 348*ce95e1b3SDavid du Colombier } 349*ce95e1b3SDavid du Colombier | '+' con 350*ce95e1b3SDavid du Colombier { 351*ce95e1b3SDavid du Colombier $$ = $2; 352*ce95e1b3SDavid du Colombier } 353*ce95e1b3SDavid du Colombier | '-' con 354*ce95e1b3SDavid du Colombier { 355*ce95e1b3SDavid du Colombier $$ = -$2; 356*ce95e1b3SDavid du Colombier } 357*ce95e1b3SDavid du Colombier 358*ce95e1b3SDavid du Colombier pointer: 359*ce95e1b3SDavid du Colombier LSB 360*ce95e1b3SDavid du Colombier | LSP 361*ce95e1b3SDavid du Colombier | LFP 362*ce95e1b3SDavid du Colombier 363*ce95e1b3SDavid du Colombier rreg: 364*ce95e1b3SDavid du Colombier sreg 365*ce95e1b3SDavid du Colombier { 366*ce95e1b3SDavid du Colombier $$ = nullgen; 367*ce95e1b3SDavid du Colombier $$.type = D_REG; 368*ce95e1b3SDavid du Colombier $$.reg = $1; 369*ce95e1b3SDavid du Colombier } 370*ce95e1b3SDavid du Colombier 371*ce95e1b3SDavid du Colombier dreg: 372*ce95e1b3SDavid du Colombier freg 373*ce95e1b3SDavid du Colombier { 374*ce95e1b3SDavid du Colombier $$ = nullgen; 375*ce95e1b3SDavid du Colombier $$.type = D_FREG; 376*ce95e1b3SDavid du Colombier $$.reg = $1; 377*ce95e1b3SDavid du Colombier } 378*ce95e1b3SDavid du Colombier 379*ce95e1b3SDavid du Colombier drreg: 380*ce95e1b3SDavid du Colombier dreg 381*ce95e1b3SDavid du Colombier | rreg 382*ce95e1b3SDavid du Colombier 383*ce95e1b3SDavid du Colombier sreg: 384*ce95e1b3SDavid du Colombier LREG 385*ce95e1b3SDavid du Colombier | LR '(' expr ')' 386*ce95e1b3SDavid du Colombier { 387*ce95e1b3SDavid du Colombier if($3 < 0 || $3 >= NREG) 388*ce95e1b3SDavid du Colombier yyerror("register value out of range"); 389*ce95e1b3SDavid du Colombier $$ = $3; 390*ce95e1b3SDavid du Colombier } 391*ce95e1b3SDavid du Colombier 392*ce95e1b3SDavid du Colombier freg: 393*ce95e1b3SDavid du Colombier LFREG 394*ce95e1b3SDavid du Colombier | FR '(' expr ')' 395*ce95e1b3SDavid du Colombier { 396*ce95e1b3SDavid du Colombier if($3 < 0 || $3 >= NREG) 397*ce95e1b3SDavid du Colombier yyerror("register value out of range"); 398*ce95e1b3SDavid du Colombier $$ = $3; 399*ce95e1b3SDavid du Colombier } 400*ce95e1b3SDavid du Colombier 401*ce95e1b3SDavid du Colombier ctlreg: 402*ce95e1b3SDavid du Colombier LCTL '(' expr ')' 403*ce95e1b3SDavid du Colombier { 404*ce95e1b3SDavid du Colombier if($3 < 0 || $3 >= 0xFFF) 405*ce95e1b3SDavid du Colombier yyerror("CSR value out of range"); 406*ce95e1b3SDavid du Colombier $$ = nullgen; 407*ce95e1b3SDavid du Colombier $$.type = D_CTLREG; 408*ce95e1b3SDavid du Colombier $$.offset = $3; 409*ce95e1b3SDavid du Colombier } 410*ce95e1b3SDavid du Colombier 411*ce95e1b3SDavid du Colombier ximm: 412*ce95e1b3SDavid du Colombier '$' addr 413*ce95e1b3SDavid du Colombier { 414*ce95e1b3SDavid du Colombier $$ = $2; 415*ce95e1b3SDavid du Colombier $$.type = D_CONST; 416*ce95e1b3SDavid du Colombier } 417*ce95e1b3SDavid du Colombier | '$' LSCONST 418*ce95e1b3SDavid du Colombier { 419*ce95e1b3SDavid du Colombier $$ = nullgen; 420*ce95e1b3SDavid du Colombier $$.type = D_SCONST; 421*ce95e1b3SDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 422*ce95e1b3SDavid du Colombier } 423*ce95e1b3SDavid du Colombier 424*ce95e1b3SDavid du Colombier fimm: 425*ce95e1b3SDavid du Colombier '$' LFCONST 426*ce95e1b3SDavid du Colombier { 427*ce95e1b3SDavid du Colombier $$ = nullgen; 428*ce95e1b3SDavid du Colombier $$.type = D_FCONST; 429*ce95e1b3SDavid du Colombier $$.dval = $2; 430*ce95e1b3SDavid du Colombier } 431*ce95e1b3SDavid du Colombier | '$' '-' LFCONST 432*ce95e1b3SDavid du Colombier { 433*ce95e1b3SDavid du Colombier $$ = nullgen; 434*ce95e1b3SDavid du Colombier $$.type = D_FCONST; 435*ce95e1b3SDavid du Colombier $$.dval = -$3; 436*ce95e1b3SDavid du Colombier } 437*ce95e1b3SDavid du Colombier 438*ce95e1b3SDavid du Colombier imm: 439*ce95e1b3SDavid du Colombier '$' con 440*ce95e1b3SDavid du Colombier { 441*ce95e1b3SDavid du Colombier $$ = nullgen; 442*ce95e1b3SDavid du Colombier $$.type = D_CONST; 443*ce95e1b3SDavid du Colombier $$.offset = $2; 444*ce95e1b3SDavid du Colombier if(thechar == 'j' && (vlong)$$.offset != $2){ 445*ce95e1b3SDavid du Colombier $$.type = D_VCONST; 446*ce95e1b3SDavid du Colombier $$.vval = $2; 447*ce95e1b3SDavid du Colombier } 448*ce95e1b3SDavid du Colombier } 449*ce95e1b3SDavid du Colombier 450*ce95e1b3SDavid du Colombier con: 451*ce95e1b3SDavid du Colombier LCONST 452*ce95e1b3SDavid du Colombier | LVAR 453*ce95e1b3SDavid du Colombier { 454*ce95e1b3SDavid du Colombier $$ = $1->value; 455*ce95e1b3SDavid du Colombier } 456*ce95e1b3SDavid du Colombier | '-' con 457*ce95e1b3SDavid du Colombier { 458*ce95e1b3SDavid du Colombier $$ = -$2; 459*ce95e1b3SDavid du Colombier } 460*ce95e1b3SDavid du Colombier | '+' con 461*ce95e1b3SDavid du Colombier { 462*ce95e1b3SDavid du Colombier $$ = $2; 463*ce95e1b3SDavid du Colombier } 464*ce95e1b3SDavid du Colombier | '~' con 465*ce95e1b3SDavid du Colombier { 466*ce95e1b3SDavid du Colombier $$ = ~$2; 467*ce95e1b3SDavid du Colombier } 468*ce95e1b3SDavid du Colombier | '(' expr ')' 469*ce95e1b3SDavid du Colombier { 470*ce95e1b3SDavid du Colombier $$ = $2; 471*ce95e1b3SDavid du Colombier } 472*ce95e1b3SDavid du Colombier 473*ce95e1b3SDavid du Colombier expr: 474*ce95e1b3SDavid du Colombier con 475*ce95e1b3SDavid du Colombier | expr '+' expr 476*ce95e1b3SDavid du Colombier { 477*ce95e1b3SDavid du Colombier $$ = $1 + $3; 478*ce95e1b3SDavid du Colombier } 479*ce95e1b3SDavid du Colombier | expr '-' expr 480*ce95e1b3SDavid du Colombier { 481*ce95e1b3SDavid du Colombier $$ = $1 - $3; 482*ce95e1b3SDavid du Colombier } 483*ce95e1b3SDavid du Colombier | expr '*' expr 484*ce95e1b3SDavid du Colombier { 485*ce95e1b3SDavid du Colombier $$ = $1 * $3; 486*ce95e1b3SDavid du Colombier } 487*ce95e1b3SDavid du Colombier | expr '/' expr 488*ce95e1b3SDavid du Colombier { 489*ce95e1b3SDavid du Colombier $$ = $1 / $3; 490*ce95e1b3SDavid du Colombier } 491*ce95e1b3SDavid du Colombier | expr '%' expr 492*ce95e1b3SDavid du Colombier { 493*ce95e1b3SDavid du Colombier $$ = $1 % $3; 494*ce95e1b3SDavid du Colombier } 495*ce95e1b3SDavid du Colombier | expr '<' '<' expr 496*ce95e1b3SDavid du Colombier { 497*ce95e1b3SDavid du Colombier $$ = $1 << $4; 498*ce95e1b3SDavid du Colombier } 499*ce95e1b3SDavid du Colombier | expr '>' '>' expr 500*ce95e1b3SDavid du Colombier { 501*ce95e1b3SDavid du Colombier $$ = $1 >> $4; 502*ce95e1b3SDavid du Colombier } 503*ce95e1b3SDavid du Colombier | expr '&' expr 504*ce95e1b3SDavid du Colombier { 505*ce95e1b3SDavid du Colombier $$ = $1 & $3; 506*ce95e1b3SDavid du Colombier } 507*ce95e1b3SDavid du Colombier | expr '^' expr 508*ce95e1b3SDavid du Colombier { 509*ce95e1b3SDavid du Colombier $$ = $1 ^ $3; 510*ce95e1b3SDavid du Colombier } 511*ce95e1b3SDavid du Colombier | expr '|' expr 512*ce95e1b3SDavid du Colombier { 513*ce95e1b3SDavid du Colombier $$ = $1 | $3; 514*ce95e1b3SDavid du Colombier } 515