1*fbadb1c4SDavid du Colombier %{ 2*fbadb1c4SDavid du Colombier #include "a.h" 3*fbadb1c4SDavid du Colombier %} 4*fbadb1c4SDavid du Colombier %union 5*fbadb1c4SDavid du Colombier { 6*fbadb1c4SDavid du Colombier Sym *sym; 7*fbadb1c4SDavid du Colombier vlong lval; 8*fbadb1c4SDavid du Colombier double dval; 9*fbadb1c4SDavid du Colombier char sval[8]; 10*fbadb1c4SDavid du Colombier Gen gen; 11*fbadb1c4SDavid du Colombier } 12*fbadb1c4SDavid du Colombier %left '|' 13*fbadb1c4SDavid du Colombier %left '^' 14*fbadb1c4SDavid du Colombier %left '&' 15*fbadb1c4SDavid du Colombier %left '<' '>' 16*fbadb1c4SDavid du Colombier %left '+' '-' 17*fbadb1c4SDavid du Colombier %left '*' '/' '%' 18*fbadb1c4SDavid du Colombier %token <lval> LMOVW LMOVB LABS LLOGW LSHW LADDW LCMP LCROP 19*fbadb1c4SDavid du Colombier %token <lval> LBRA LFMOV LFCONV LFCMP LFADD LFMA LTRAP LXORW 20*fbadb1c4SDavid du Colombier %token <lval> LNOP LEND LRETT LWORD LTEXT LDATA LRETRN 21*fbadb1c4SDavid du Colombier %token <lval> LCONST LSP LSB LFP LPC LCREG LFLUSH 22*fbadb1c4SDavid du Colombier %token <lval> LREG LFREG LR LCR LF LFPSCR 23*fbadb1c4SDavid du Colombier %token <lval> LLR LCTR LSPR LSPREG LSEG LMSR 24*fbadb1c4SDavid du Colombier %token <lval> LSCHED LXLD LXST LXOP LXMV 25*fbadb1c4SDavid du Colombier %token <lval> LRLWM LMOVMW LMOVEM LMOVFL LMTFSB LMA 26*fbadb1c4SDavid du Colombier %token <dval> LFCONST 27*fbadb1c4SDavid du Colombier %token <sval> LSCONST 28*fbadb1c4SDavid du Colombier %token <sym> LNAME LLAB LVAR 29*fbadb1c4SDavid du Colombier %type <lval> con expr pointer offset sreg 30*fbadb1c4SDavid du Colombier %type <gen> addr rreg regaddr name creg freg xlreg lr ctr 31*fbadb1c4SDavid du Colombier %type <gen> imm ximm fimm rel psr lcr cbit fpscr fpscrf msr mask 32*fbadb1c4SDavid du Colombier %% 33*fbadb1c4SDavid du Colombier prog: 34*fbadb1c4SDavid du Colombier | prog line 35*fbadb1c4SDavid du Colombier 36*fbadb1c4SDavid du Colombier line: 37*fbadb1c4SDavid du Colombier LLAB ':' 38*fbadb1c4SDavid du Colombier { 39*fbadb1c4SDavid du Colombier if($1->value != pc) 40*fbadb1c4SDavid du Colombier yyerror("redeclaration of %s", $1->name); 41*fbadb1c4SDavid du Colombier $1->value = pc; 42*fbadb1c4SDavid du Colombier } 43*fbadb1c4SDavid du Colombier line 44*fbadb1c4SDavid du Colombier | LNAME ':' 45*fbadb1c4SDavid du Colombier { 46*fbadb1c4SDavid du Colombier $1->type = LLAB; 47*fbadb1c4SDavid du Colombier $1->value = pc; 48*fbadb1c4SDavid du Colombier } 49*fbadb1c4SDavid du Colombier line 50*fbadb1c4SDavid du Colombier | LNAME '=' expr ';' 51*fbadb1c4SDavid du Colombier { 52*fbadb1c4SDavid du Colombier $1->type = LVAR; 53*fbadb1c4SDavid du Colombier $1->value = $3; 54*fbadb1c4SDavid du Colombier } 55*fbadb1c4SDavid du Colombier | LVAR '=' expr ';' 56*fbadb1c4SDavid du Colombier { 57*fbadb1c4SDavid du Colombier if($1->value != $3) 58*fbadb1c4SDavid du Colombier yyerror("redeclaration of %s", $1->name); 59*fbadb1c4SDavid du Colombier $1->value = $3; 60*fbadb1c4SDavid du Colombier } 61*fbadb1c4SDavid du Colombier | LSCHED ';' 62*fbadb1c4SDavid du Colombier { 63*fbadb1c4SDavid du Colombier nosched = $1; 64*fbadb1c4SDavid du Colombier } 65*fbadb1c4SDavid du Colombier | ';' 66*fbadb1c4SDavid du Colombier | inst ';' 67*fbadb1c4SDavid du Colombier | error ';' 68*fbadb1c4SDavid du Colombier 69*fbadb1c4SDavid du Colombier inst: 70*fbadb1c4SDavid du Colombier /* 71*fbadb1c4SDavid du Colombier * load ints and bytes 72*fbadb1c4SDavid du Colombier */ 73*fbadb1c4SDavid du Colombier LMOVW rreg ',' rreg 74*fbadb1c4SDavid du Colombier { 75*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 76*fbadb1c4SDavid du Colombier } 77*fbadb1c4SDavid du Colombier | LMOVW addr ',' rreg 78*fbadb1c4SDavid du Colombier { 79*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 80*fbadb1c4SDavid du Colombier } 81*fbadb1c4SDavid du Colombier | LMOVW regaddr ',' rreg 82*fbadb1c4SDavid du Colombier { 83*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 84*fbadb1c4SDavid du Colombier } 85*fbadb1c4SDavid du Colombier | LMOVB rreg ',' rreg 86*fbadb1c4SDavid du Colombier { 87*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 88*fbadb1c4SDavid du Colombier } 89*fbadb1c4SDavid du Colombier | LMOVB addr ',' rreg 90*fbadb1c4SDavid du Colombier { 91*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 92*fbadb1c4SDavid du Colombier } 93*fbadb1c4SDavid du Colombier | LMOVB regaddr ',' rreg 94*fbadb1c4SDavid du Colombier { 95*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 96*fbadb1c4SDavid du Colombier } 97*fbadb1c4SDavid du Colombier /* 98*fbadb1c4SDavid du Colombier * load floats 99*fbadb1c4SDavid du Colombier */ 100*fbadb1c4SDavid du Colombier | LFMOV addr ',' freg 101*fbadb1c4SDavid du Colombier { 102*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 103*fbadb1c4SDavid du Colombier } 104*fbadb1c4SDavid du Colombier | LFMOV regaddr ',' freg 105*fbadb1c4SDavid du Colombier { 106*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 107*fbadb1c4SDavid du Colombier } 108*fbadb1c4SDavid du Colombier | LFMOV fimm ',' freg 109*fbadb1c4SDavid du Colombier { 110*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 111*fbadb1c4SDavid du Colombier } 112*fbadb1c4SDavid du Colombier | LFMOV freg ',' freg 113*fbadb1c4SDavid du Colombier { 114*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 115*fbadb1c4SDavid du Colombier } 116*fbadb1c4SDavid du Colombier | LFMOV freg ',' addr 117*fbadb1c4SDavid du Colombier { 118*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 119*fbadb1c4SDavid du Colombier } 120*fbadb1c4SDavid du Colombier | LFMOV freg ',' regaddr 121*fbadb1c4SDavid du Colombier { 122*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 123*fbadb1c4SDavid du Colombier } 124*fbadb1c4SDavid du Colombier /* 125*fbadb1c4SDavid du Colombier * store ints and bytes 126*fbadb1c4SDavid du Colombier */ 127*fbadb1c4SDavid du Colombier | LMOVW rreg ',' addr 128*fbadb1c4SDavid du Colombier { 129*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 130*fbadb1c4SDavid du Colombier } 131*fbadb1c4SDavid du Colombier | LMOVW rreg ',' regaddr 132*fbadb1c4SDavid du Colombier { 133*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 134*fbadb1c4SDavid du Colombier } 135*fbadb1c4SDavid du Colombier | LMOVB rreg ',' addr 136*fbadb1c4SDavid du Colombier { 137*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 138*fbadb1c4SDavid du Colombier } 139*fbadb1c4SDavid du Colombier | LMOVB rreg ',' regaddr 140*fbadb1c4SDavid du Colombier { 141*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 142*fbadb1c4SDavid du Colombier } 143*fbadb1c4SDavid du Colombier /* 144*fbadb1c4SDavid du Colombier * store floats 145*fbadb1c4SDavid du Colombier */ 146*fbadb1c4SDavid du Colombier | LMOVW freg ',' addr 147*fbadb1c4SDavid du Colombier { 148*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 149*fbadb1c4SDavid du Colombier } 150*fbadb1c4SDavid du Colombier | LMOVW freg ',' regaddr 151*fbadb1c4SDavid du Colombier { 152*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 153*fbadb1c4SDavid du Colombier } 154*fbadb1c4SDavid du Colombier /* 155*fbadb1c4SDavid du Colombier * floating point status 156*fbadb1c4SDavid du Colombier */ 157*fbadb1c4SDavid du Colombier | LMOVW fpscr ',' freg 158*fbadb1c4SDavid du Colombier { 159*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 160*fbadb1c4SDavid du Colombier } 161*fbadb1c4SDavid du Colombier | LMOVW freg ',' fpscr 162*fbadb1c4SDavid du Colombier { 163*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 164*fbadb1c4SDavid du Colombier } 165*fbadb1c4SDavid du Colombier | LMOVW freg ',' imm ',' fpscr 166*fbadb1c4SDavid du Colombier { 167*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$4, &$6); 168*fbadb1c4SDavid du Colombier } 169*fbadb1c4SDavid du Colombier | LMOVW fpscr ',' creg 170*fbadb1c4SDavid du Colombier { 171*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 172*fbadb1c4SDavid du Colombier } 173*fbadb1c4SDavid du Colombier | LMOVW imm ',' fpscrf 174*fbadb1c4SDavid du Colombier { 175*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 176*fbadb1c4SDavid du Colombier } 177*fbadb1c4SDavid du Colombier | LMTFSB imm ',' con 178*fbadb1c4SDavid du Colombier { 179*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &nullgen); 180*fbadb1c4SDavid du Colombier } 181*fbadb1c4SDavid du Colombier /* 182*fbadb1c4SDavid du Colombier * field moves (mtcrf) 183*fbadb1c4SDavid du Colombier */ 184*fbadb1c4SDavid du Colombier | LMOVW rreg ',' imm ',' lcr 185*fbadb1c4SDavid du Colombier { 186*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$4, &$6); 187*fbadb1c4SDavid du Colombier } 188*fbadb1c4SDavid du Colombier | LMOVW rreg ',' creg 189*fbadb1c4SDavid du Colombier { 190*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 191*fbadb1c4SDavid du Colombier } 192*fbadb1c4SDavid du Colombier | LMOVW rreg ',' lcr 193*fbadb1c4SDavid du Colombier { 194*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 195*fbadb1c4SDavid du Colombier } 196*fbadb1c4SDavid du Colombier /* 197*fbadb1c4SDavid du Colombier * integer operations 198*fbadb1c4SDavid du Colombier * logical instructions 199*fbadb1c4SDavid du Colombier * shift instructions 200*fbadb1c4SDavid du Colombier * unary instructions 201*fbadb1c4SDavid du Colombier */ 202*fbadb1c4SDavid du Colombier | LADDW rreg ',' sreg ',' rreg 203*fbadb1c4SDavid du Colombier { 204*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 205*fbadb1c4SDavid du Colombier } 206*fbadb1c4SDavid du Colombier | LADDW imm ',' sreg ',' rreg 207*fbadb1c4SDavid du Colombier { 208*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 209*fbadb1c4SDavid du Colombier } 210*fbadb1c4SDavid du Colombier | LADDW rreg ',' imm ',' rreg 211*fbadb1c4SDavid du Colombier { 212*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$4, &$6); 213*fbadb1c4SDavid du Colombier } 214*fbadb1c4SDavid du Colombier | LADDW rreg ',' rreg 215*fbadb1c4SDavid du Colombier { 216*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 217*fbadb1c4SDavid du Colombier } 218*fbadb1c4SDavid du Colombier | LADDW imm ',' rreg 219*fbadb1c4SDavid du Colombier { 220*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 221*fbadb1c4SDavid du Colombier } 222*fbadb1c4SDavid du Colombier | LLOGW rreg ',' sreg ',' rreg 223*fbadb1c4SDavid du Colombier { 224*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 225*fbadb1c4SDavid du Colombier } 226*fbadb1c4SDavid du Colombier | LLOGW rreg ',' rreg 227*fbadb1c4SDavid du Colombier { 228*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 229*fbadb1c4SDavid du Colombier } 230*fbadb1c4SDavid du Colombier | LSHW rreg ',' sreg ',' rreg 231*fbadb1c4SDavid du Colombier { 232*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 233*fbadb1c4SDavid du Colombier } 234*fbadb1c4SDavid du Colombier | LSHW rreg ',' rreg 235*fbadb1c4SDavid du Colombier { 236*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 237*fbadb1c4SDavid du Colombier } 238*fbadb1c4SDavid du Colombier | LSHW imm ',' sreg ',' rreg 239*fbadb1c4SDavid du Colombier { 240*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 241*fbadb1c4SDavid du Colombier } 242*fbadb1c4SDavid du Colombier | LSHW imm ',' rreg 243*fbadb1c4SDavid du Colombier { 244*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 245*fbadb1c4SDavid du Colombier } 246*fbadb1c4SDavid du Colombier | LABS rreg ',' rreg 247*fbadb1c4SDavid du Colombier { 248*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 249*fbadb1c4SDavid du Colombier } 250*fbadb1c4SDavid du Colombier | LABS rreg 251*fbadb1c4SDavid du Colombier { 252*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$2); 253*fbadb1c4SDavid du Colombier } 254*fbadb1c4SDavid du Colombier /* 255*fbadb1c4SDavid du Colombier * multiply-accumulate 256*fbadb1c4SDavid du Colombier */ 257*fbadb1c4SDavid du Colombier | LMA rreg ',' sreg ',' rreg 258*fbadb1c4SDavid du Colombier { 259*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 260*fbadb1c4SDavid du Colombier } 261*fbadb1c4SDavid du Colombier /* 262*fbadb1c4SDavid du Colombier * move immediate: macro for cau+or, addi, addis, and other combinations 263*fbadb1c4SDavid du Colombier */ 264*fbadb1c4SDavid du Colombier | LMOVW imm ',' rreg 265*fbadb1c4SDavid du Colombier { 266*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 267*fbadb1c4SDavid du Colombier } 268*fbadb1c4SDavid du Colombier | LMOVW ximm ',' rreg 269*fbadb1c4SDavid du Colombier { 270*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 271*fbadb1c4SDavid du Colombier } 272*fbadb1c4SDavid du Colombier /* 273*fbadb1c4SDavid du Colombier * condition register operations 274*fbadb1c4SDavid du Colombier */ 275*fbadb1c4SDavid du Colombier | LCROP cbit ',' cbit 276*fbadb1c4SDavid du Colombier { 277*fbadb1c4SDavid du Colombier outcode($1, &$2, $4.reg, &$4); 278*fbadb1c4SDavid du Colombier } 279*fbadb1c4SDavid du Colombier | LCROP cbit ',' con ',' cbit 280*fbadb1c4SDavid du Colombier { 281*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 282*fbadb1c4SDavid du Colombier } 283*fbadb1c4SDavid du Colombier /* 284*fbadb1c4SDavid du Colombier * condition register moves 285*fbadb1c4SDavid du Colombier * move from machine state register 286*fbadb1c4SDavid du Colombier */ 287*fbadb1c4SDavid du Colombier | LMOVW creg ',' creg 288*fbadb1c4SDavid du Colombier { 289*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 290*fbadb1c4SDavid du Colombier } 291*fbadb1c4SDavid du Colombier | LMOVW psr ',' creg 292*fbadb1c4SDavid du Colombier { 293*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 294*fbadb1c4SDavid du Colombier } 295*fbadb1c4SDavid du Colombier | LMOVW lcr ',' rreg 296*fbadb1c4SDavid du Colombier { 297*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 298*fbadb1c4SDavid du Colombier } 299*fbadb1c4SDavid du Colombier | LMOVW psr ',' rreg 300*fbadb1c4SDavid du Colombier { 301*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 302*fbadb1c4SDavid du Colombier } 303*fbadb1c4SDavid du Colombier | LMOVW xlreg ',' rreg 304*fbadb1c4SDavid du Colombier { 305*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 306*fbadb1c4SDavid du Colombier } 307*fbadb1c4SDavid du Colombier | LMOVW rreg ',' xlreg 308*fbadb1c4SDavid du Colombier { 309*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 310*fbadb1c4SDavid du Colombier } 311*fbadb1c4SDavid du Colombier | LMOVW creg ',' psr 312*fbadb1c4SDavid du Colombier { 313*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 314*fbadb1c4SDavid du Colombier } 315*fbadb1c4SDavid du Colombier | LMOVW rreg ',' psr 316*fbadb1c4SDavid du Colombier { 317*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 318*fbadb1c4SDavid du Colombier } 319*fbadb1c4SDavid du Colombier /* 320*fbadb1c4SDavid du Colombier * branch, branch conditional 321*fbadb1c4SDavid du Colombier * branch conditional register 322*fbadb1c4SDavid du Colombier * branch conditional to count register 323*fbadb1c4SDavid du Colombier */ 324*fbadb1c4SDavid du Colombier | LBRA rel 325*fbadb1c4SDavid du Colombier { 326*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 327*fbadb1c4SDavid du Colombier } 328*fbadb1c4SDavid du Colombier | LBRA addr 329*fbadb1c4SDavid du Colombier { 330*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$2); 331*fbadb1c4SDavid du Colombier } 332*fbadb1c4SDavid du Colombier | LBRA '(' xlreg ')' 333*fbadb1c4SDavid du Colombier { 334*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 335*fbadb1c4SDavid du Colombier } 336*fbadb1c4SDavid du Colombier | LBRA ',' rel 337*fbadb1c4SDavid du Colombier { 338*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 339*fbadb1c4SDavid du Colombier } 340*fbadb1c4SDavid du Colombier | LBRA ',' addr 341*fbadb1c4SDavid du Colombier { 342*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 343*fbadb1c4SDavid du Colombier } 344*fbadb1c4SDavid du Colombier | LBRA ',' '(' xlreg ')' 345*fbadb1c4SDavid du Colombier { 346*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$4); 347*fbadb1c4SDavid du Colombier } 348*fbadb1c4SDavid du Colombier | LBRA creg ',' rel 349*fbadb1c4SDavid du Colombier { 350*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 351*fbadb1c4SDavid du Colombier } 352*fbadb1c4SDavid du Colombier | LBRA creg ',' addr 353*fbadb1c4SDavid du Colombier { 354*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 355*fbadb1c4SDavid du Colombier } 356*fbadb1c4SDavid du Colombier | LBRA creg ',' '(' xlreg ')' 357*fbadb1c4SDavid du Colombier { 358*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$5); 359*fbadb1c4SDavid du Colombier } 360*fbadb1c4SDavid du Colombier | LBRA con ',' rel 361*fbadb1c4SDavid du Colombier { 362*fbadb1c4SDavid du Colombier outcode($1, &nullgen, $2, &$4); 363*fbadb1c4SDavid du Colombier } 364*fbadb1c4SDavid du Colombier | LBRA con ',' addr 365*fbadb1c4SDavid du Colombier { 366*fbadb1c4SDavid du Colombier outcode($1, &nullgen, $2, &$4); 367*fbadb1c4SDavid du Colombier } 368*fbadb1c4SDavid du Colombier | LBRA con ',' '(' xlreg ')' 369*fbadb1c4SDavid du Colombier { 370*fbadb1c4SDavid du Colombier outcode($1, &nullgen, $2, &$5); 371*fbadb1c4SDavid du Colombier } 372*fbadb1c4SDavid du Colombier | LBRA con ',' con ',' rel 373*fbadb1c4SDavid du Colombier { 374*fbadb1c4SDavid du Colombier Gen g; 375*fbadb1c4SDavid du Colombier g = nullgen; 376*fbadb1c4SDavid du Colombier g.type = D_CONST; 377*fbadb1c4SDavid du Colombier g.offset = $2; 378*fbadb1c4SDavid du Colombier outcode($1, &g, $4, &$6); 379*fbadb1c4SDavid du Colombier } 380*fbadb1c4SDavid du Colombier | LBRA con ',' con ',' addr 381*fbadb1c4SDavid du Colombier { 382*fbadb1c4SDavid du Colombier Gen g; 383*fbadb1c4SDavid du Colombier g = nullgen; 384*fbadb1c4SDavid du Colombier g.type = D_CONST; 385*fbadb1c4SDavid du Colombier g.offset = $2; 386*fbadb1c4SDavid du Colombier outcode($1, &g, $4, &$6); 387*fbadb1c4SDavid du Colombier } 388*fbadb1c4SDavid du Colombier | LBRA con ',' con ',' '(' xlreg ')' 389*fbadb1c4SDavid du Colombier { 390*fbadb1c4SDavid du Colombier Gen g; 391*fbadb1c4SDavid du Colombier g = nullgen; 392*fbadb1c4SDavid du Colombier g.type = D_CONST; 393*fbadb1c4SDavid du Colombier g.offset = $2; 394*fbadb1c4SDavid du Colombier outcode($1, &g, $4, &$7); 395*fbadb1c4SDavid du Colombier } 396*fbadb1c4SDavid du Colombier /* 397*fbadb1c4SDavid du Colombier * conditional trap 398*fbadb1c4SDavid du Colombier */ 399*fbadb1c4SDavid du Colombier | LTRAP rreg ',' sreg 400*fbadb1c4SDavid du Colombier { 401*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &nullgen); 402*fbadb1c4SDavid du Colombier } 403*fbadb1c4SDavid du Colombier | LTRAP imm ',' sreg 404*fbadb1c4SDavid du Colombier { 405*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &nullgen); 406*fbadb1c4SDavid du Colombier } 407*fbadb1c4SDavid du Colombier | LTRAP rreg comma 408*fbadb1c4SDavid du Colombier { 409*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 410*fbadb1c4SDavid du Colombier } 411*fbadb1c4SDavid du Colombier | LTRAP comma 412*fbadb1c4SDavid du Colombier { 413*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 414*fbadb1c4SDavid du Colombier } 415*fbadb1c4SDavid du Colombier /* 416*fbadb1c4SDavid du Colombier * floating point operate 417*fbadb1c4SDavid du Colombier */ 418*fbadb1c4SDavid du Colombier | LFCONV freg ',' freg 419*fbadb1c4SDavid du Colombier { 420*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 421*fbadb1c4SDavid du Colombier } 422*fbadb1c4SDavid du Colombier | LFADD freg ',' freg 423*fbadb1c4SDavid du Colombier { 424*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 425*fbadb1c4SDavid du Colombier } 426*fbadb1c4SDavid du Colombier | LFADD freg ',' freg ',' freg 427*fbadb1c4SDavid du Colombier { 428*fbadb1c4SDavid du Colombier outcode($1, &$2, $4.reg, &$6); 429*fbadb1c4SDavid du Colombier } 430*fbadb1c4SDavid du Colombier | LFMA freg ',' freg ',' freg ',' freg 431*fbadb1c4SDavid du Colombier { 432*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4.reg, &$6, &$8); 433*fbadb1c4SDavid du Colombier } 434*fbadb1c4SDavid du Colombier | LFCMP freg ',' freg 435*fbadb1c4SDavid du Colombier { 436*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 437*fbadb1c4SDavid du Colombier } 438*fbadb1c4SDavid du Colombier | LFCMP freg ',' freg ',' creg 439*fbadb1c4SDavid du Colombier { 440*fbadb1c4SDavid du Colombier outcode($1, &$2, $6.reg, &$4); 441*fbadb1c4SDavid du Colombier } 442*fbadb1c4SDavid du Colombier /* 443*fbadb1c4SDavid du Colombier * CMP 444*fbadb1c4SDavid du Colombier */ 445*fbadb1c4SDavid du Colombier | LCMP rreg ',' rreg 446*fbadb1c4SDavid du Colombier { 447*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 448*fbadb1c4SDavid du Colombier } 449*fbadb1c4SDavid du Colombier | LCMP rreg ',' imm 450*fbadb1c4SDavid du Colombier { 451*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 452*fbadb1c4SDavid du Colombier } 453*fbadb1c4SDavid du Colombier | LCMP rreg ',' rreg ',' creg 454*fbadb1c4SDavid du Colombier { 455*fbadb1c4SDavid du Colombier outcode($1, &$2, $6.reg, &$4); 456*fbadb1c4SDavid du Colombier } 457*fbadb1c4SDavid du Colombier | LCMP rreg ',' imm ',' creg 458*fbadb1c4SDavid du Colombier { 459*fbadb1c4SDavid du Colombier outcode($1, &$2, $6.reg, &$4); 460*fbadb1c4SDavid du Colombier } 461*fbadb1c4SDavid du Colombier /* 462*fbadb1c4SDavid du Colombier * rotate and mask 463*fbadb1c4SDavid du Colombier */ 464*fbadb1c4SDavid du Colombier | LRLWM imm ',' rreg ',' imm ',' rreg 465*fbadb1c4SDavid du Colombier { 466*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4.reg, &$6, &$8); 467*fbadb1c4SDavid du Colombier } 468*fbadb1c4SDavid du Colombier | LRLWM imm ',' rreg ',' mask ',' rreg 469*fbadb1c4SDavid du Colombier { 470*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4.reg, &$6, &$8); 471*fbadb1c4SDavid du Colombier } 472*fbadb1c4SDavid du Colombier | LRLWM rreg ',' rreg ',' imm ',' rreg 473*fbadb1c4SDavid du Colombier { 474*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4.reg, &$6, &$8); 475*fbadb1c4SDavid du Colombier } 476*fbadb1c4SDavid du Colombier | LRLWM rreg ',' rreg ',' mask ',' rreg 477*fbadb1c4SDavid du Colombier { 478*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4.reg, &$6, &$8); 479*fbadb1c4SDavid du Colombier } 480*fbadb1c4SDavid du Colombier /* 481*fbadb1c4SDavid du Colombier * load/store multiple 482*fbadb1c4SDavid du Colombier */ 483*fbadb1c4SDavid du Colombier | LMOVMW addr ',' rreg 484*fbadb1c4SDavid du Colombier { 485*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 486*fbadb1c4SDavid du Colombier } 487*fbadb1c4SDavid du Colombier | LMOVMW rreg ',' addr 488*fbadb1c4SDavid du Colombier { 489*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 490*fbadb1c4SDavid du Colombier } 491*fbadb1c4SDavid du Colombier /* 492*fbadb1c4SDavid du Colombier * various indexed load/store 493*fbadb1c4SDavid du Colombier * indexed unary (eg, cache clear) 494*fbadb1c4SDavid du Colombier */ 495*fbadb1c4SDavid du Colombier | LXLD regaddr ',' rreg 496*fbadb1c4SDavid du Colombier { 497*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 498*fbadb1c4SDavid du Colombier } 499*fbadb1c4SDavid du Colombier | LXLD regaddr ',' imm ',' rreg 500*fbadb1c4SDavid du Colombier { 501*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$4, &$6); 502*fbadb1c4SDavid du Colombier } 503*fbadb1c4SDavid du Colombier | LXST rreg ',' regaddr 504*fbadb1c4SDavid du Colombier { 505*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 506*fbadb1c4SDavid du Colombier } 507*fbadb1c4SDavid du Colombier | LXST rreg ',' imm ',' regaddr 508*fbadb1c4SDavid du Colombier { 509*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$4, &$6); 510*fbadb1c4SDavid du Colombier } 511*fbadb1c4SDavid du Colombier | LXMV regaddr ',' rreg 512*fbadb1c4SDavid du Colombier { 513*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 514*fbadb1c4SDavid du Colombier } 515*fbadb1c4SDavid du Colombier | LXMV rreg ',' regaddr 516*fbadb1c4SDavid du Colombier { 517*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 518*fbadb1c4SDavid du Colombier } 519*fbadb1c4SDavid du Colombier | LXOP regaddr 520*fbadb1c4SDavid du Colombier { 521*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 522*fbadb1c4SDavid du Colombier } 523*fbadb1c4SDavid du Colombier /* 524*fbadb1c4SDavid du Colombier * NOP 525*fbadb1c4SDavid du Colombier */ 526*fbadb1c4SDavid du Colombier | LNOP comma 527*fbadb1c4SDavid du Colombier { 528*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 529*fbadb1c4SDavid du Colombier } 530*fbadb1c4SDavid du Colombier | LNOP rreg comma 531*fbadb1c4SDavid du Colombier { 532*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 533*fbadb1c4SDavid du Colombier } 534*fbadb1c4SDavid du Colombier | LNOP freg comma 535*fbadb1c4SDavid du Colombier { 536*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 537*fbadb1c4SDavid du Colombier } 538*fbadb1c4SDavid du Colombier | LNOP ',' rreg 539*fbadb1c4SDavid du Colombier { 540*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 541*fbadb1c4SDavid du Colombier } 542*fbadb1c4SDavid du Colombier | LNOP ',' freg 543*fbadb1c4SDavid du Colombier { 544*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 545*fbadb1c4SDavid du Colombier } 546*fbadb1c4SDavid du Colombier /* 547*fbadb1c4SDavid du Colombier * word 548*fbadb1c4SDavid du Colombier */ 549*fbadb1c4SDavid du Colombier | LWORD imm comma 550*fbadb1c4SDavid du Colombier { 551*fbadb1c4SDavid du Colombier if($1 == ADWORD && $2.type == D_CONST) 552*fbadb1c4SDavid du Colombier $2.type = D_DCONST; 553*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 554*fbadb1c4SDavid du Colombier } 555*fbadb1c4SDavid du Colombier | LWORD ximm comma 556*fbadb1c4SDavid du Colombier { 557*fbadb1c4SDavid du Colombier if($1 == ADWORD && $2.type == D_CONST) 558*fbadb1c4SDavid du Colombier $2.type = D_DCONST; 559*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 560*fbadb1c4SDavid du Colombier } 561*fbadb1c4SDavid du Colombier /* 562*fbadb1c4SDavid du Colombier * END 563*fbadb1c4SDavid du Colombier */ 564*fbadb1c4SDavid du Colombier | LEND comma 565*fbadb1c4SDavid du Colombier { 566*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 567*fbadb1c4SDavid du Colombier } 568*fbadb1c4SDavid du Colombier /* 569*fbadb1c4SDavid du Colombier * TEXT/GLOBL 570*fbadb1c4SDavid du Colombier */ 571*fbadb1c4SDavid du Colombier | LTEXT name ',' imm 572*fbadb1c4SDavid du Colombier { 573*fbadb1c4SDavid du Colombier outcode($1, &$2, NREG, &$4); 574*fbadb1c4SDavid du Colombier } 575*fbadb1c4SDavid du Colombier | LTEXT name ',' con ',' imm 576*fbadb1c4SDavid du Colombier { 577*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 578*fbadb1c4SDavid du Colombier } 579*fbadb1c4SDavid du Colombier | LTEXT name ',' imm ':' imm 580*fbadb1c4SDavid du Colombier { 581*fbadb1c4SDavid du Colombier outgcode($1, &$2, NREG, &$6, &$4); 582*fbadb1c4SDavid du Colombier } 583*fbadb1c4SDavid du Colombier | LTEXT name ',' con ',' imm ':' imm 584*fbadb1c4SDavid du Colombier { 585*fbadb1c4SDavid du Colombier outgcode($1, &$2, $4, &$8, &$6); 586*fbadb1c4SDavid du Colombier } 587*fbadb1c4SDavid du Colombier /* 588*fbadb1c4SDavid du Colombier * DATA 589*fbadb1c4SDavid du Colombier */ 590*fbadb1c4SDavid du Colombier | LDATA name '/' con ',' imm 591*fbadb1c4SDavid du Colombier { 592*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 593*fbadb1c4SDavid du Colombier } 594*fbadb1c4SDavid du Colombier | LDATA name '/' con ',' ximm 595*fbadb1c4SDavid du Colombier { 596*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 597*fbadb1c4SDavid du Colombier } 598*fbadb1c4SDavid du Colombier | LDATA name '/' con ',' fimm 599*fbadb1c4SDavid du Colombier { 600*fbadb1c4SDavid du Colombier outcode($1, &$2, $4, &$6); 601*fbadb1c4SDavid du Colombier } 602*fbadb1c4SDavid du Colombier /* 603*fbadb1c4SDavid du Colombier * RETURN 604*fbadb1c4SDavid du Colombier */ 605*fbadb1c4SDavid du Colombier | LRETRN comma 606*fbadb1c4SDavid du Colombier { 607*fbadb1c4SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 608*fbadb1c4SDavid du Colombier } 609*fbadb1c4SDavid du Colombier 610*fbadb1c4SDavid du Colombier rel: 611*fbadb1c4SDavid du Colombier con '(' LPC ')' 612*fbadb1c4SDavid du Colombier { 613*fbadb1c4SDavid du Colombier $$ = nullgen; 614*fbadb1c4SDavid du Colombier $$.type = D_BRANCH; 615*fbadb1c4SDavid du Colombier $$.offset = $1 + pc; 616*fbadb1c4SDavid du Colombier } 617*fbadb1c4SDavid du Colombier | LNAME offset 618*fbadb1c4SDavid du Colombier { 619*fbadb1c4SDavid du Colombier $$ = nullgen; 620*fbadb1c4SDavid du Colombier if(pass == 2) 621*fbadb1c4SDavid du Colombier yyerror("undefined label: %s", $1->name); 622*fbadb1c4SDavid du Colombier $$.type = D_BRANCH; 623*fbadb1c4SDavid du Colombier $$.sym = $1; 624*fbadb1c4SDavid du Colombier $$.offset = $2; 625*fbadb1c4SDavid du Colombier } 626*fbadb1c4SDavid du Colombier | LLAB offset 627*fbadb1c4SDavid du Colombier { 628*fbadb1c4SDavid du Colombier $$ = nullgen; 629*fbadb1c4SDavid du Colombier $$.type = D_BRANCH; 630*fbadb1c4SDavid du Colombier $$.sym = $1; 631*fbadb1c4SDavid du Colombier $$.offset = $1->value + $2; 632*fbadb1c4SDavid du Colombier } 633*fbadb1c4SDavid du Colombier 634*fbadb1c4SDavid du Colombier rreg: 635*fbadb1c4SDavid du Colombier sreg 636*fbadb1c4SDavid du Colombier { 637*fbadb1c4SDavid du Colombier $$ = nullgen; 638*fbadb1c4SDavid du Colombier $$.type = D_REG; 639*fbadb1c4SDavid du Colombier $$.reg = $1; 640*fbadb1c4SDavid du Colombier } 641*fbadb1c4SDavid du Colombier 642*fbadb1c4SDavid du Colombier xlreg: 643*fbadb1c4SDavid du Colombier lr 644*fbadb1c4SDavid du Colombier | ctr 645*fbadb1c4SDavid du Colombier 646*fbadb1c4SDavid du Colombier lr: 647*fbadb1c4SDavid du Colombier LLR 648*fbadb1c4SDavid du Colombier { 649*fbadb1c4SDavid du Colombier $$ = nullgen; 650*fbadb1c4SDavid du Colombier $$.type = D_SPR; 651*fbadb1c4SDavid du Colombier $$.offset = $1; 652*fbadb1c4SDavid du Colombier } 653*fbadb1c4SDavid du Colombier 654*fbadb1c4SDavid du Colombier lcr: 655*fbadb1c4SDavid du Colombier LCR 656*fbadb1c4SDavid du Colombier { 657*fbadb1c4SDavid du Colombier $$ = nullgen; 658*fbadb1c4SDavid du Colombier $$.type = D_CREG; 659*fbadb1c4SDavid du Colombier $$.reg = NREG; /* whole register */ 660*fbadb1c4SDavid du Colombier } 661*fbadb1c4SDavid du Colombier 662*fbadb1c4SDavid du Colombier ctr: 663*fbadb1c4SDavid du Colombier LCTR 664*fbadb1c4SDavid du Colombier { 665*fbadb1c4SDavid du Colombier $$ = nullgen; 666*fbadb1c4SDavid du Colombier $$.type = D_SPR; 667*fbadb1c4SDavid du Colombier $$.offset = $1; 668*fbadb1c4SDavid du Colombier } 669*fbadb1c4SDavid du Colombier 670*fbadb1c4SDavid du Colombier msr: 671*fbadb1c4SDavid du Colombier LMSR 672*fbadb1c4SDavid du Colombier { 673*fbadb1c4SDavid du Colombier $$ = nullgen; 674*fbadb1c4SDavid du Colombier $$.type = D_MSR; 675*fbadb1c4SDavid du Colombier } 676*fbadb1c4SDavid du Colombier 677*fbadb1c4SDavid du Colombier psr: 678*fbadb1c4SDavid du Colombier LSPREG 679*fbadb1c4SDavid du Colombier { 680*fbadb1c4SDavid du Colombier $$ = nullgen; 681*fbadb1c4SDavid du Colombier $$.type = D_SPR; 682*fbadb1c4SDavid du Colombier $$.offset = $1; 683*fbadb1c4SDavid du Colombier } 684*fbadb1c4SDavid du Colombier | LSPR '(' con ')' 685*fbadb1c4SDavid du Colombier { 686*fbadb1c4SDavid du Colombier $$ = nullgen; 687*fbadb1c4SDavid du Colombier $$.type = $1; 688*fbadb1c4SDavid du Colombier $$.offset = $3; 689*fbadb1c4SDavid du Colombier } 690*fbadb1c4SDavid du Colombier | msr 691*fbadb1c4SDavid du Colombier 692*fbadb1c4SDavid du Colombier fpscr: 693*fbadb1c4SDavid du Colombier LFPSCR 694*fbadb1c4SDavid du Colombier { 695*fbadb1c4SDavid du Colombier $$ = nullgen; 696*fbadb1c4SDavid du Colombier $$.type = D_FPSCR; 697*fbadb1c4SDavid du Colombier $$.reg = NREG; 698*fbadb1c4SDavid du Colombier } 699*fbadb1c4SDavid du Colombier 700*fbadb1c4SDavid du Colombier fpscrf: 701*fbadb1c4SDavid du Colombier LFPSCR '(' con ')' 702*fbadb1c4SDavid du Colombier { 703*fbadb1c4SDavid du Colombier $$ = nullgen; 704*fbadb1c4SDavid du Colombier $$.type = D_FPSCR; 705*fbadb1c4SDavid du Colombier $$.reg = $3; 706*fbadb1c4SDavid du Colombier } 707*fbadb1c4SDavid du Colombier 708*fbadb1c4SDavid du Colombier freg: 709*fbadb1c4SDavid du Colombier LFREG 710*fbadb1c4SDavid du Colombier { 711*fbadb1c4SDavid du Colombier $$ = nullgen; 712*fbadb1c4SDavid du Colombier $$.type = D_FREG; 713*fbadb1c4SDavid du Colombier $$.reg = $1; 714*fbadb1c4SDavid du Colombier } 715*fbadb1c4SDavid du Colombier | LF '(' con ')' 716*fbadb1c4SDavid du Colombier { 717*fbadb1c4SDavid du Colombier $$ = nullgen; 718*fbadb1c4SDavid du Colombier $$.type = D_FREG; 719*fbadb1c4SDavid du Colombier $$.reg = $3; 720*fbadb1c4SDavid du Colombier } 721*fbadb1c4SDavid du Colombier 722*fbadb1c4SDavid du Colombier creg: 723*fbadb1c4SDavid du Colombier LCREG 724*fbadb1c4SDavid du Colombier { 725*fbadb1c4SDavid du Colombier $$ = nullgen; 726*fbadb1c4SDavid du Colombier $$.type = D_CREG; 727*fbadb1c4SDavid du Colombier $$.reg = $1; 728*fbadb1c4SDavid du Colombier } 729*fbadb1c4SDavid du Colombier | LCR '(' con ')' 730*fbadb1c4SDavid du Colombier { 731*fbadb1c4SDavid du Colombier $$ = nullgen; 732*fbadb1c4SDavid du Colombier $$.type = D_CREG; 733*fbadb1c4SDavid du Colombier $$.reg = $3; 734*fbadb1c4SDavid du Colombier } 735*fbadb1c4SDavid du Colombier 736*fbadb1c4SDavid du Colombier 737*fbadb1c4SDavid du Colombier cbit: con 738*fbadb1c4SDavid du Colombier { 739*fbadb1c4SDavid du Colombier $$ = nullgen; 740*fbadb1c4SDavid du Colombier $$.type = D_REG; 741*fbadb1c4SDavid du Colombier $$.reg = $1; 742*fbadb1c4SDavid du Colombier } 743*fbadb1c4SDavid du Colombier 744*fbadb1c4SDavid du Colombier mask: 745*fbadb1c4SDavid du Colombier con ',' con 746*fbadb1c4SDavid du Colombier { 747*fbadb1c4SDavid du Colombier int mb, me; 748*fbadb1c4SDavid du Colombier ulong v; 749*fbadb1c4SDavid du Colombier 750*fbadb1c4SDavid du Colombier $$ = nullgen; 751*fbadb1c4SDavid du Colombier $$.type = D_CONST; 752*fbadb1c4SDavid du Colombier mb = $1; 753*fbadb1c4SDavid du Colombier me = $3; 754*fbadb1c4SDavid du Colombier if(mb < 0 || mb > 31 || me < 0 || me > 31){ 755*fbadb1c4SDavid du Colombier yyerror("illegal mask start/end value(s)"); 756*fbadb1c4SDavid du Colombier mb = me = 0; 757*fbadb1c4SDavid du Colombier } 758*fbadb1c4SDavid du Colombier if(mb <= me) 759*fbadb1c4SDavid du Colombier v = ((ulong)~0L>>mb) & (~0L<<(31-me)); 760*fbadb1c4SDavid du Colombier else 761*fbadb1c4SDavid du Colombier v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1)))); 762*fbadb1c4SDavid du Colombier $$.offset = v; 763*fbadb1c4SDavid du Colombier } 764*fbadb1c4SDavid du Colombier 765*fbadb1c4SDavid du Colombier ximm: 766*fbadb1c4SDavid du Colombier '$' addr 767*fbadb1c4SDavid du Colombier { 768*fbadb1c4SDavid du Colombier $$ = $2; 769*fbadb1c4SDavid du Colombier $$.type = D_CONST; 770*fbadb1c4SDavid du Colombier } 771*fbadb1c4SDavid du Colombier | '$' LSCONST 772*fbadb1c4SDavid du Colombier { 773*fbadb1c4SDavid du Colombier $$ = nullgen; 774*fbadb1c4SDavid du Colombier $$.type = D_SCONST; 775*fbadb1c4SDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 776*fbadb1c4SDavid du Colombier } 777*fbadb1c4SDavid du Colombier 778*fbadb1c4SDavid du Colombier fimm: 779*fbadb1c4SDavid du Colombier '$' LFCONST 780*fbadb1c4SDavid du Colombier { 781*fbadb1c4SDavid du Colombier $$ = nullgen; 782*fbadb1c4SDavid du Colombier $$.type = D_FCONST; 783*fbadb1c4SDavid du Colombier $$.dval = $2; 784*fbadb1c4SDavid du Colombier } 785*fbadb1c4SDavid du Colombier | '$' '-' LFCONST 786*fbadb1c4SDavid du Colombier { 787*fbadb1c4SDavid du Colombier $$ = nullgen; 788*fbadb1c4SDavid du Colombier $$.type = D_FCONST; 789*fbadb1c4SDavid du Colombier $$.dval = -$3; 790*fbadb1c4SDavid du Colombier } 791*fbadb1c4SDavid du Colombier 792*fbadb1c4SDavid du Colombier imm: '$' con 793*fbadb1c4SDavid du Colombier { 794*fbadb1c4SDavid du Colombier $$ = nullgen; 795*fbadb1c4SDavid du Colombier $$.type = D_CONST; 796*fbadb1c4SDavid du Colombier $$.offset = $2; 797*fbadb1c4SDavid du Colombier } 798*fbadb1c4SDavid du Colombier 799*fbadb1c4SDavid du Colombier sreg: 800*fbadb1c4SDavid du Colombier LREG 801*fbadb1c4SDavid du Colombier | LR '(' con ')' 802*fbadb1c4SDavid du Colombier { 803*fbadb1c4SDavid du Colombier if($$ < 0 || $$ >= NREG) 804*fbadb1c4SDavid du Colombier print("register value out of range\n"); 805*fbadb1c4SDavid du Colombier $$ = $3; 806*fbadb1c4SDavid du Colombier } 807*fbadb1c4SDavid du Colombier 808*fbadb1c4SDavid du Colombier regaddr: 809*fbadb1c4SDavid du Colombier '(' sreg ')' 810*fbadb1c4SDavid du Colombier { 811*fbadb1c4SDavid du Colombier $$ = nullgen; 812*fbadb1c4SDavid du Colombier $$.type = D_OREG; 813*fbadb1c4SDavid du Colombier $$.reg = $2; 814*fbadb1c4SDavid du Colombier $$.offset = 0; 815*fbadb1c4SDavid du Colombier } 816*fbadb1c4SDavid du Colombier | '(' sreg '+' sreg ')' 817*fbadb1c4SDavid du Colombier { 818*fbadb1c4SDavid du Colombier $$ = nullgen; 819*fbadb1c4SDavid du Colombier $$.type = D_OREG; 820*fbadb1c4SDavid du Colombier $$.reg = $2; 821*fbadb1c4SDavid du Colombier $$.xreg = $4; 822*fbadb1c4SDavid du Colombier $$.offset = 0; 823*fbadb1c4SDavid du Colombier } 824*fbadb1c4SDavid du Colombier 825*fbadb1c4SDavid du Colombier addr: 826*fbadb1c4SDavid du Colombier name 827*fbadb1c4SDavid du Colombier | con '(' sreg ')' 828*fbadb1c4SDavid du Colombier { 829*fbadb1c4SDavid du Colombier $$ = nullgen; 830*fbadb1c4SDavid du Colombier $$.type = D_OREG; 831*fbadb1c4SDavid du Colombier $$.reg = $3; 832*fbadb1c4SDavid du Colombier $$.offset = $1; 833*fbadb1c4SDavid du Colombier } 834*fbadb1c4SDavid du Colombier 835*fbadb1c4SDavid du Colombier name: 836*fbadb1c4SDavid du Colombier con '(' pointer ')' 837*fbadb1c4SDavid du Colombier { 838*fbadb1c4SDavid du Colombier $$ = nullgen; 839*fbadb1c4SDavid du Colombier $$.type = D_OREG; 840*fbadb1c4SDavid du Colombier $$.name = $3; 841*fbadb1c4SDavid du Colombier $$.sym = S; 842*fbadb1c4SDavid du Colombier $$.offset = $1; 843*fbadb1c4SDavid du Colombier } 844*fbadb1c4SDavid du Colombier | LNAME offset '(' pointer ')' 845*fbadb1c4SDavid du Colombier { 846*fbadb1c4SDavid du Colombier $$ = nullgen; 847*fbadb1c4SDavid du Colombier $$.type = D_OREG; 848*fbadb1c4SDavid du Colombier $$.name = $4; 849*fbadb1c4SDavid du Colombier $$.sym = $1; 850*fbadb1c4SDavid du Colombier $$.offset = $2; 851*fbadb1c4SDavid du Colombier } 852*fbadb1c4SDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 853*fbadb1c4SDavid du Colombier { 854*fbadb1c4SDavid du Colombier $$ = nullgen; 855*fbadb1c4SDavid du Colombier $$.type = D_OREG; 856*fbadb1c4SDavid du Colombier $$.name = D_STATIC; 857*fbadb1c4SDavid du Colombier $$.sym = $1; 858*fbadb1c4SDavid du Colombier $$.offset = $4; 859*fbadb1c4SDavid du Colombier } 860*fbadb1c4SDavid du Colombier 861*fbadb1c4SDavid du Colombier comma: 862*fbadb1c4SDavid du Colombier | ',' 863*fbadb1c4SDavid du Colombier 864*fbadb1c4SDavid du Colombier offset: 865*fbadb1c4SDavid du Colombier { 866*fbadb1c4SDavid du Colombier $$ = 0; 867*fbadb1c4SDavid du Colombier } 868*fbadb1c4SDavid du Colombier | '+' con 869*fbadb1c4SDavid du Colombier { 870*fbadb1c4SDavid du Colombier $$ = $2; 871*fbadb1c4SDavid du Colombier } 872*fbadb1c4SDavid du Colombier | '-' con 873*fbadb1c4SDavid du Colombier { 874*fbadb1c4SDavid du Colombier $$ = -$2; 875*fbadb1c4SDavid du Colombier } 876*fbadb1c4SDavid du Colombier 877*fbadb1c4SDavid du Colombier pointer: 878*fbadb1c4SDavid du Colombier LSB 879*fbadb1c4SDavid du Colombier | LSP 880*fbadb1c4SDavid du Colombier | LFP 881*fbadb1c4SDavid du Colombier 882*fbadb1c4SDavid du Colombier con: 883*fbadb1c4SDavid du Colombier LCONST 884*fbadb1c4SDavid du Colombier | LVAR 885*fbadb1c4SDavid du Colombier { 886*fbadb1c4SDavid du Colombier $$ = $1->value; 887*fbadb1c4SDavid du Colombier } 888*fbadb1c4SDavid du Colombier | '-' con 889*fbadb1c4SDavid du Colombier { 890*fbadb1c4SDavid du Colombier $$ = -$2; 891*fbadb1c4SDavid du Colombier } 892*fbadb1c4SDavid du Colombier | '+' con 893*fbadb1c4SDavid du Colombier { 894*fbadb1c4SDavid du Colombier $$ = $2; 895*fbadb1c4SDavid du Colombier } 896*fbadb1c4SDavid du Colombier | '~' con 897*fbadb1c4SDavid du Colombier { 898*fbadb1c4SDavid du Colombier $$ = ~$2; 899*fbadb1c4SDavid du Colombier } 900*fbadb1c4SDavid du Colombier | '(' expr ')' 901*fbadb1c4SDavid du Colombier { 902*fbadb1c4SDavid du Colombier $$ = $2; 903*fbadb1c4SDavid du Colombier } 904*fbadb1c4SDavid du Colombier 905*fbadb1c4SDavid du Colombier expr: 906*fbadb1c4SDavid du Colombier con 907*fbadb1c4SDavid du Colombier | expr '+' expr 908*fbadb1c4SDavid du Colombier { 909*fbadb1c4SDavid du Colombier $$ = $1 + $3; 910*fbadb1c4SDavid du Colombier } 911*fbadb1c4SDavid du Colombier | expr '-' expr 912*fbadb1c4SDavid du Colombier { 913*fbadb1c4SDavid du Colombier $$ = $1 - $3; 914*fbadb1c4SDavid du Colombier } 915*fbadb1c4SDavid du Colombier | expr '*' expr 916*fbadb1c4SDavid du Colombier { 917*fbadb1c4SDavid du Colombier $$ = $1 * $3; 918*fbadb1c4SDavid du Colombier } 919*fbadb1c4SDavid du Colombier | expr '/' expr 920*fbadb1c4SDavid du Colombier { 921*fbadb1c4SDavid du Colombier $$ = $1 / $3; 922*fbadb1c4SDavid du Colombier } 923*fbadb1c4SDavid du Colombier | expr '%' expr 924*fbadb1c4SDavid du Colombier { 925*fbadb1c4SDavid du Colombier $$ = $1 % $3; 926*fbadb1c4SDavid du Colombier } 927*fbadb1c4SDavid du Colombier | expr '<' '<' expr 928*fbadb1c4SDavid du Colombier { 929*fbadb1c4SDavid du Colombier $$ = $1 << $4; 930*fbadb1c4SDavid du Colombier } 931*fbadb1c4SDavid du Colombier | expr '>' '>' expr 932*fbadb1c4SDavid du Colombier { 933*fbadb1c4SDavid du Colombier $$ = $1 >> $4; 934*fbadb1c4SDavid du Colombier } 935*fbadb1c4SDavid du Colombier | expr '&' expr 936*fbadb1c4SDavid du Colombier { 937*fbadb1c4SDavid du Colombier $$ = $1 & $3; 938*fbadb1c4SDavid du Colombier } 939*fbadb1c4SDavid du Colombier | expr '^' expr 940*fbadb1c4SDavid du Colombier { 941*fbadb1c4SDavid du Colombier $$ = $1 ^ $3; 942*fbadb1c4SDavid du Colombier } 943*fbadb1c4SDavid du Colombier | expr '|' expr 944*fbadb1c4SDavid du Colombier { 945*fbadb1c4SDavid du Colombier $$ = $1 | $3; 946*fbadb1c4SDavid du Colombier } 947