13e12c5d1SDavid du Colombier %{ 23e12c5d1SDavid du Colombier #include "a.h" 33e12c5d1SDavid du Colombier %} 43e12c5d1SDavid du Colombier %union 53e12c5d1SDavid du Colombier { 63e12c5d1SDavid du Colombier Sym *sym; 73e12c5d1SDavid du Colombier long lval; 83e12c5d1SDavid du Colombier double dval; 93e12c5d1SDavid du Colombier char sval[8]; 103e12c5d1SDavid du Colombier Gen gen; 113e12c5d1SDavid du Colombier } 123e12c5d1SDavid du Colombier %left '|' 133e12c5d1SDavid du Colombier %left '^' 143e12c5d1SDavid du Colombier %left '&' 153e12c5d1SDavid du Colombier %left '<' '>' 163e12c5d1SDavid du Colombier %left '+' '-' 173e12c5d1SDavid du Colombier %left '*' '/' '%' 183e12c5d1SDavid du Colombier %token <lval> LMOVW LMOVD LMOVB LSWAP LADDW LCMP 193e12c5d1SDavid du Colombier %token <lval> LBRA LFMOV LFCONV LFADD LCPOP LTRAP LJMPL LXORW 203e12c5d1SDavid du Colombier %token <lval> LNOP LEND LRETT LUNIMP LTEXT LDATA LRETRN 213e12c5d1SDavid du Colombier %token <lval> LCONST LSP LSB LFP LPC LCREG LFLUSH 223e12c5d1SDavid du Colombier %token <lval> LREG LFREG LR LC LF 23*219b2ee8SDavid du Colombier %token <lval> LFSR LFPQ LPSR LSCHED 243e12c5d1SDavid du Colombier %token <dval> LFCONST 253e12c5d1SDavid du Colombier %token <sval> LSCONST 263e12c5d1SDavid du Colombier %token <sym> LNAME LLAB LVAR 273e12c5d1SDavid du Colombier %type <lval> con expr pointer offset sreg 28*219b2ee8SDavid du Colombier %type <gen> addr rreg name psr creg freg 293e12c5d1SDavid du Colombier %type <gen> imm ximm fimm rel fsr fpq 303e12c5d1SDavid du Colombier %% 313e12c5d1SDavid du Colombier prog: 323e12c5d1SDavid du Colombier | prog line 333e12c5d1SDavid du Colombier 343e12c5d1SDavid du Colombier line: 353e12c5d1SDavid du Colombier LLAB ':' 363e12c5d1SDavid du Colombier { 373e12c5d1SDavid du Colombier if($1->value != pc) 383e12c5d1SDavid du Colombier yyerror("redeclaration of %s", $1->name); 393e12c5d1SDavid du Colombier $1->value = pc; 403e12c5d1SDavid du Colombier } 413e12c5d1SDavid du Colombier line 423e12c5d1SDavid du Colombier | LNAME ':' 433e12c5d1SDavid du Colombier { 443e12c5d1SDavid du Colombier $1->type = LLAB; 453e12c5d1SDavid du Colombier $1->value = pc; 463e12c5d1SDavid du Colombier } 473e12c5d1SDavid du Colombier line 483e12c5d1SDavid du Colombier | LNAME '=' expr ';' 493e12c5d1SDavid du Colombier { 503e12c5d1SDavid du Colombier $1->type = LVAR; 513e12c5d1SDavid du Colombier $1->value = $3; 523e12c5d1SDavid du Colombier } 533e12c5d1SDavid du Colombier | LVAR '=' expr ';' 543e12c5d1SDavid du Colombier { 553e12c5d1SDavid du Colombier if($1->value != $3) 563e12c5d1SDavid du Colombier yyerror("redeclaration of %s", $1->name); 573e12c5d1SDavid du Colombier $1->value = $3; 583e12c5d1SDavid du Colombier } 59*219b2ee8SDavid du Colombier | LSCHED ';' 60*219b2ee8SDavid du Colombier { 61*219b2ee8SDavid du Colombier nosched = $1; 62*219b2ee8SDavid du Colombier } 633e12c5d1SDavid du Colombier | ';' 643e12c5d1SDavid du Colombier | inst ';' 653e12c5d1SDavid du Colombier | error ';' 663e12c5d1SDavid du Colombier 673e12c5d1SDavid du Colombier inst: 683e12c5d1SDavid du Colombier /* 693e12c5d1SDavid du Colombier * B.1 load integer instructions 703e12c5d1SDavid du Colombier */ 713e12c5d1SDavid du Colombier LMOVW rreg ',' rreg 723e12c5d1SDavid du Colombier { 733e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 743e12c5d1SDavid du Colombier } 753e12c5d1SDavid du Colombier | LMOVW addr ',' rreg 763e12c5d1SDavid du Colombier { 773e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 783e12c5d1SDavid du Colombier } 793e12c5d1SDavid du Colombier | LMOVD addr ',' rreg 803e12c5d1SDavid du Colombier { 813e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 823e12c5d1SDavid du Colombier } 833e12c5d1SDavid du Colombier | LMOVB rreg ',' rreg 843e12c5d1SDavid du Colombier { 853e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 863e12c5d1SDavid du Colombier } 873e12c5d1SDavid du Colombier | LMOVB addr ',' rreg 883e12c5d1SDavid du Colombier { 893e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 903e12c5d1SDavid du Colombier } 913e12c5d1SDavid du Colombier /* 923e12c5d1SDavid du Colombier * B.2 load floating instructions 933e12c5d1SDavid du Colombier * includes CSR 943e12c5d1SDavid du Colombier */ 953e12c5d1SDavid du Colombier | LMOVD addr ',' freg 963e12c5d1SDavid du Colombier { 973e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 983e12c5d1SDavid du Colombier } 993e12c5d1SDavid du Colombier | LFMOV addr ',' freg 1003e12c5d1SDavid du Colombier { 1013e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1023e12c5d1SDavid du Colombier } 1033e12c5d1SDavid du Colombier | LFMOV fimm ',' freg 1043e12c5d1SDavid du Colombier { 1053e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1063e12c5d1SDavid du Colombier } 1073e12c5d1SDavid du Colombier | LFMOV freg ',' freg 1083e12c5d1SDavid du Colombier { 1093e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1103e12c5d1SDavid du Colombier } 1113e12c5d1SDavid du Colombier | LFMOV freg ',' addr 1123e12c5d1SDavid du Colombier { 1133e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1143e12c5d1SDavid du Colombier } 1153e12c5d1SDavid du Colombier | LMOVW addr ',' fsr 1163e12c5d1SDavid du Colombier { 1173e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1183e12c5d1SDavid du Colombier } 1193e12c5d1SDavid du Colombier /* 1203e12c5d1SDavid du Colombier * B.3 load coprocessor instructions 1213e12c5d1SDavid du Colombier * excludes CSR 1223e12c5d1SDavid du Colombier */ 1233e12c5d1SDavid du Colombier | LMOVW addr ',' creg 1243e12c5d1SDavid du Colombier { 1253e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1263e12c5d1SDavid du Colombier } 1273e12c5d1SDavid du Colombier | LMOVD addr ',' creg 1283e12c5d1SDavid du Colombier { 1293e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1303e12c5d1SDavid du Colombier } 1313e12c5d1SDavid du Colombier /* 1323e12c5d1SDavid du Colombier * B.4 store integer instructions 1333e12c5d1SDavid du Colombier */ 1343e12c5d1SDavid du Colombier | LMOVW rreg ',' addr 1353e12c5d1SDavid du Colombier { 1363e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1373e12c5d1SDavid du Colombier } 1383e12c5d1SDavid du Colombier | LMOVW imm ',' addr 1393e12c5d1SDavid du Colombier { 1403e12c5d1SDavid du Colombier if($2.offset != 0) 1413e12c5d1SDavid du Colombier yyerror("constant must be zero"); 1423e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1433e12c5d1SDavid du Colombier } 1443e12c5d1SDavid du Colombier | LMOVD rreg ',' addr 1453e12c5d1SDavid du Colombier { 1463e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1473e12c5d1SDavid du Colombier } 1483e12c5d1SDavid du Colombier | LMOVB rreg ',' addr 1493e12c5d1SDavid du Colombier { 1503e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1513e12c5d1SDavid du Colombier } 1523e12c5d1SDavid du Colombier | LMOVB imm ',' addr 1533e12c5d1SDavid du Colombier { 1543e12c5d1SDavid du Colombier if($2.offset != 0) 1553e12c5d1SDavid du Colombier yyerror("constant must be zero"); 1563e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1573e12c5d1SDavid du Colombier } 1583e12c5d1SDavid du Colombier /* 1593e12c5d1SDavid du Colombier * B.5 store floating instructions 1603e12c5d1SDavid du Colombier * includes CSR and CQ 1613e12c5d1SDavid du Colombier */ 1623e12c5d1SDavid du Colombier | LMOVW freg ',' addr 1633e12c5d1SDavid du Colombier { 1643e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1653e12c5d1SDavid du Colombier } 1663e12c5d1SDavid du Colombier | LMOVD freg ',' addr 1673e12c5d1SDavid du Colombier { 1683e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1693e12c5d1SDavid du Colombier } 1703e12c5d1SDavid du Colombier | LMOVW fsr ',' addr 1713e12c5d1SDavid du Colombier { 1723e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1733e12c5d1SDavid du Colombier } 1743e12c5d1SDavid du Colombier | LMOVD fpq ',' addr 1753e12c5d1SDavid du Colombier { 1763e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1773e12c5d1SDavid du Colombier } 1783e12c5d1SDavid du Colombier /* 1793e12c5d1SDavid du Colombier * B.6 store coprocessor instructions 1803e12c5d1SDavid du Colombier * excludes CSR and CQ 1813e12c5d1SDavid du Colombier */ 1823e12c5d1SDavid du Colombier | LMOVW creg ',' addr 1833e12c5d1SDavid du Colombier { 1843e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1853e12c5d1SDavid du Colombier } 1863e12c5d1SDavid du Colombier | LMOVD creg ',' addr 1873e12c5d1SDavid du Colombier { 1883e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1893e12c5d1SDavid du Colombier } 1903e12c5d1SDavid du Colombier /* 1913e12c5d1SDavid du Colombier * B.7 atomic load unsigned byte (TAS) 1923e12c5d1SDavid du Colombier * B.8 swap 1933e12c5d1SDavid du Colombier */ 1943e12c5d1SDavid du Colombier | LSWAP addr ',' rreg 1953e12c5d1SDavid du Colombier { 1963e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 1973e12c5d1SDavid du Colombier } 1983e12c5d1SDavid du Colombier /* 1993e12c5d1SDavid du Colombier * B.9 add instructions 2003e12c5d1SDavid du Colombier * B.10 tagged add instructions 2013e12c5d1SDavid du Colombier * B.11 subtract instructions 2023e12c5d1SDavid du Colombier * B.12 tagged subtract instructions 2033e12c5d1SDavid du Colombier * B.13 multiply step instruction 2043e12c5d1SDavid du Colombier * B.14 logical instructions 2053e12c5d1SDavid du Colombier * B.15 shift instructions 2063e12c5d1SDavid du Colombier * B.17 save/restore 2073e12c5d1SDavid du Colombier */ 2083e12c5d1SDavid du Colombier | LADDW rreg ',' sreg ',' rreg 2093e12c5d1SDavid du Colombier { 2103e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 2113e12c5d1SDavid du Colombier } 2123e12c5d1SDavid du Colombier | LADDW imm ',' sreg ',' rreg 2133e12c5d1SDavid du Colombier { 2143e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 2153e12c5d1SDavid du Colombier } 2163e12c5d1SDavid du Colombier | LADDW rreg ',' rreg 2173e12c5d1SDavid du Colombier { 2183e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2193e12c5d1SDavid du Colombier } 2203e12c5d1SDavid du Colombier | LADDW imm ',' rreg 2213e12c5d1SDavid du Colombier { 2223e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2233e12c5d1SDavid du Colombier } 2243e12c5d1SDavid du Colombier | LXORW rreg ',' sreg ',' rreg 2253e12c5d1SDavid du Colombier { 2263e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 2273e12c5d1SDavid du Colombier } 2283e12c5d1SDavid du Colombier | LXORW imm ',' sreg ',' rreg 2293e12c5d1SDavid du Colombier { 2303e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 2313e12c5d1SDavid du Colombier } 2323e12c5d1SDavid du Colombier | LXORW rreg ',' rreg 2333e12c5d1SDavid du Colombier { 2343e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2353e12c5d1SDavid du Colombier } 2363e12c5d1SDavid du Colombier | LXORW imm ',' rreg 2373e12c5d1SDavid du Colombier { 2383e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2393e12c5d1SDavid du Colombier } 2403e12c5d1SDavid du Colombier /* 2413e12c5d1SDavid du Colombier * B.16 set hi 2423e12c5d1SDavid du Colombier * other pseudo moves 2433e12c5d1SDavid du Colombier */ 2443e12c5d1SDavid du Colombier | LMOVW imm ',' rreg 2453e12c5d1SDavid du Colombier { 2463e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2473e12c5d1SDavid du Colombier } 2483e12c5d1SDavid du Colombier | LMOVD imm ',' rreg 2493e12c5d1SDavid du Colombier { 2503e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2513e12c5d1SDavid du Colombier } 2523e12c5d1SDavid du Colombier | LMOVW ximm ',' rreg 2533e12c5d1SDavid du Colombier { 2543e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2553e12c5d1SDavid du Colombier } 2563e12c5d1SDavid du Colombier | LMOVD ximm ',' rreg 2573e12c5d1SDavid du Colombier { 2583e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2593e12c5d1SDavid du Colombier } 2603e12c5d1SDavid du Colombier /* 2613e12c5d1SDavid du Colombier * B.18 branch on integer condition 2623e12c5d1SDavid du Colombier * B.19 floating point branch on condition 2633e12c5d1SDavid du Colombier * B.20 coprocessor branch on condition 2643e12c5d1SDavid du Colombier */ 2653e12c5d1SDavid du Colombier | LBRA comma rel 2663e12c5d1SDavid du Colombier { 2673e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2683e12c5d1SDavid du Colombier } 2693e12c5d1SDavid du Colombier /* 2703e12c5d1SDavid du Colombier * B.21 call instruction 2713e12c5d1SDavid du Colombier * B.22 jump and link instruction 2723e12c5d1SDavid du Colombier */ 2733e12c5d1SDavid du Colombier | LJMPL comma rel 2743e12c5d1SDavid du Colombier { 2753e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2763e12c5d1SDavid du Colombier } 2773e12c5d1SDavid du Colombier | LJMPL comma addr 2783e12c5d1SDavid du Colombier { 2793e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2803e12c5d1SDavid du Colombier } 2813e12c5d1SDavid du Colombier | LJMPL comma sreg ',' rel 2823e12c5d1SDavid du Colombier { 2833e12c5d1SDavid du Colombier outcode($1, &nullgen, $3, &$5); 2843e12c5d1SDavid du Colombier } 2853e12c5d1SDavid du Colombier | LJMPL comma sreg ',' addr 2863e12c5d1SDavid du Colombier { 2873e12c5d1SDavid du Colombier outcode($1, &nullgen, $3, &$5); 2883e12c5d1SDavid du Colombier } 2893e12c5d1SDavid du Colombier /* 2903e12c5d1SDavid du Colombier * B.23 return from trap 2913e12c5d1SDavid du Colombier */ 2923e12c5d1SDavid du Colombier | LRETT rreg ',' rreg 2933e12c5d1SDavid du Colombier { 2943e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 2953e12c5d1SDavid du Colombier } 2963e12c5d1SDavid du Colombier /* 2973e12c5d1SDavid du Colombier * B.28 instruction cache flush 2983e12c5d1SDavid du Colombier */ 2993e12c5d1SDavid du Colombier | LFLUSH rel comma 3003e12c5d1SDavid du Colombier { 3013e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 3023e12c5d1SDavid du Colombier } 3033e12c5d1SDavid du Colombier | LFLUSH addr comma 3043e12c5d1SDavid du Colombier { 3053e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 3063e12c5d1SDavid du Colombier } 3073e12c5d1SDavid du Colombier /* 3083e12c5d1SDavid du Colombier * B.24 trap on condition 3093e12c5d1SDavid du Colombier */ 3103e12c5d1SDavid du Colombier | LTRAP rreg ',' sreg 3113e12c5d1SDavid du Colombier { 3123e12c5d1SDavid du Colombier outcode($1, &$2, $4, &nullgen); 3133e12c5d1SDavid du Colombier } 3143e12c5d1SDavid du Colombier | LTRAP imm ',' sreg 3153e12c5d1SDavid du Colombier { 3163e12c5d1SDavid du Colombier outcode($1, &$2, $4, &nullgen); 3173e12c5d1SDavid du Colombier } 3183e12c5d1SDavid du Colombier | LTRAP rreg comma 3193e12c5d1SDavid du Colombier { 3203e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 3213e12c5d1SDavid du Colombier } 3223e12c5d1SDavid du Colombier | LTRAP comma 3233e12c5d1SDavid du Colombier { 3243e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 3253e12c5d1SDavid du Colombier } 3263e12c5d1SDavid du Colombier /* 3273e12c5d1SDavid du Colombier * B.25 read state register instructions 3283e12c5d1SDavid du Colombier */ 3293e12c5d1SDavid du Colombier | LMOVW psr ',' rreg 3303e12c5d1SDavid du Colombier { 3313e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3323e12c5d1SDavid du Colombier } 3333e12c5d1SDavid du Colombier /* 3343e12c5d1SDavid du Colombier * B.26 write state register instructions BOTCH XOR 3353e12c5d1SDavid du Colombier */ 3363e12c5d1SDavid du Colombier | LMOVW rreg ',' psr 3373e12c5d1SDavid du Colombier { 3383e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3393e12c5d1SDavid du Colombier } 3403e12c5d1SDavid du Colombier | LMOVW imm ',' psr 3413e12c5d1SDavid du Colombier { 3423e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3433e12c5d1SDavid du Colombier } 3443e12c5d1SDavid du Colombier | LXORW rreg ',' sreg ',' psr 3453e12c5d1SDavid du Colombier { 3463e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 3473e12c5d1SDavid du Colombier } 3483e12c5d1SDavid du Colombier | LXORW imm ',' sreg ',' psr 3493e12c5d1SDavid du Colombier { 3503e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 3513e12c5d1SDavid du Colombier } 3523e12c5d1SDavid du Colombier /* 3533e12c5d1SDavid du Colombier * B.27 unimplemented trap 3543e12c5d1SDavid du Colombier */ 3553e12c5d1SDavid du Colombier | LUNIMP comma 3563e12c5d1SDavid du Colombier { 3573e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 3583e12c5d1SDavid du Colombier } 3593e12c5d1SDavid du Colombier | LUNIMP imm comma 3603e12c5d1SDavid du Colombier { 3613e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 3623e12c5d1SDavid du Colombier } 3633e12c5d1SDavid du Colombier /* 3643e12c5d1SDavid du Colombier * B.29 floating point operate 3653e12c5d1SDavid du Colombier */ 3663e12c5d1SDavid du Colombier | LFCONV freg ',' freg 3673e12c5d1SDavid du Colombier { 3683e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3693e12c5d1SDavid du Colombier } 3703e12c5d1SDavid du Colombier | LFADD freg ',' freg 3713e12c5d1SDavid du Colombier { 3723e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3733e12c5d1SDavid du Colombier } 3743e12c5d1SDavid du Colombier | LFADD freg ',' freg ',' freg 3753e12c5d1SDavid du Colombier { 3763e12c5d1SDavid du Colombier outcode($1, &$2, $4.reg, &$6); 3773e12c5d1SDavid du Colombier } 3783e12c5d1SDavid du Colombier /* 3793e12c5d1SDavid du Colombier * B.30 coprocessor operate 3803e12c5d1SDavid du Colombier */ 3813e12c5d1SDavid du Colombier | LCPOP creg ',' creg 3823e12c5d1SDavid du Colombier { 3833e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3843e12c5d1SDavid du Colombier } 3853e12c5d1SDavid du Colombier | LCPOP creg ',' creg ',' creg 3863e12c5d1SDavid du Colombier { 3873e12c5d1SDavid du Colombier outcode($1, &$2, $4.reg, &$6); 3883e12c5d1SDavid du Colombier } 3893e12c5d1SDavid du Colombier /* 3903e12c5d1SDavid du Colombier * CMP 3913e12c5d1SDavid du Colombier */ 3923e12c5d1SDavid du Colombier | LCMP rreg ',' rreg 3933e12c5d1SDavid du Colombier { 3943e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3953e12c5d1SDavid du Colombier } 3963e12c5d1SDavid du Colombier | LCMP rreg ',' imm 3973e12c5d1SDavid du Colombier { 3983e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 3993e12c5d1SDavid du Colombier } 4003e12c5d1SDavid du Colombier /* 4013e12c5d1SDavid du Colombier * NOP 4023e12c5d1SDavid du Colombier */ 4033e12c5d1SDavid du Colombier | LNOP comma 4043e12c5d1SDavid du Colombier { 4053e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 4063e12c5d1SDavid du Colombier } 4073e12c5d1SDavid du Colombier | LNOP rreg comma 4083e12c5d1SDavid du Colombier { 4093e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 4103e12c5d1SDavid du Colombier } 4113e12c5d1SDavid du Colombier | LNOP freg comma 4123e12c5d1SDavid du Colombier { 4133e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 4143e12c5d1SDavid du Colombier } 4153e12c5d1SDavid du Colombier | LNOP ',' rreg 4163e12c5d1SDavid du Colombier { 4173e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 4183e12c5d1SDavid du Colombier } 4193e12c5d1SDavid du Colombier | LNOP ',' freg 4203e12c5d1SDavid du Colombier { 4213e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 4223e12c5d1SDavid du Colombier } 4233e12c5d1SDavid du Colombier /* 4243e12c5d1SDavid du Colombier * END 4253e12c5d1SDavid du Colombier */ 4263e12c5d1SDavid du Colombier | LEND comma 4273e12c5d1SDavid du Colombier { 4283e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 4293e12c5d1SDavid du Colombier } 4303e12c5d1SDavid du Colombier /* 4313e12c5d1SDavid du Colombier * TEXT/GLOBL 4323e12c5d1SDavid du Colombier */ 4333e12c5d1SDavid du Colombier | LTEXT name ',' imm 4343e12c5d1SDavid du Colombier { 4353e12c5d1SDavid du Colombier outcode($1, &$2, NREG, &$4); 4363e12c5d1SDavid du Colombier } 4373e12c5d1SDavid du Colombier | LTEXT name ',' con ',' imm 4383e12c5d1SDavid du Colombier { 4393e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 4403e12c5d1SDavid du Colombier } 4413e12c5d1SDavid du Colombier /* 4423e12c5d1SDavid du Colombier * DATA 4433e12c5d1SDavid du Colombier */ 4443e12c5d1SDavid du Colombier | LDATA name '/' con ',' imm 4453e12c5d1SDavid du Colombier { 4463e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 4473e12c5d1SDavid du Colombier } 4483e12c5d1SDavid du Colombier | LDATA name '/' con ',' ximm 4493e12c5d1SDavid du Colombier { 4503e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 4513e12c5d1SDavid du Colombier } 4523e12c5d1SDavid du Colombier | LDATA name '/' con ',' fimm 4533e12c5d1SDavid du Colombier { 4543e12c5d1SDavid du Colombier outcode($1, &$2, $4, &$6); 4553e12c5d1SDavid du Colombier } 4563e12c5d1SDavid du Colombier /* 4573e12c5d1SDavid du Colombier * RETURN 4583e12c5d1SDavid du Colombier */ 4593e12c5d1SDavid du Colombier | LRETRN comma 4603e12c5d1SDavid du Colombier { 4613e12c5d1SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 4623e12c5d1SDavid du Colombier } 4633e12c5d1SDavid du Colombier 4643e12c5d1SDavid du Colombier rel: 4653e12c5d1SDavid du Colombier con '(' LPC ')' 4663e12c5d1SDavid du Colombier { 4673e12c5d1SDavid du Colombier $$ = nullgen; 4683e12c5d1SDavid du Colombier $$.type = D_BRANCH; 4693e12c5d1SDavid du Colombier $$.offset = $1 + pc; 4703e12c5d1SDavid du Colombier } 4713e12c5d1SDavid du Colombier | LNAME offset 4723e12c5d1SDavid du Colombier { 4733e12c5d1SDavid du Colombier $$ = nullgen; 4743e12c5d1SDavid du Colombier if(pass == 2) 4753e12c5d1SDavid du Colombier yyerror("undefined label: %s", $1->name); 4763e12c5d1SDavid du Colombier $$.type = D_BRANCH; 4773e12c5d1SDavid du Colombier $$.sym = $1; 4783e12c5d1SDavid du Colombier $$.offset = $2; 4793e12c5d1SDavid du Colombier } 4803e12c5d1SDavid du Colombier | LLAB offset 4813e12c5d1SDavid du Colombier { 4823e12c5d1SDavid du Colombier $$ = nullgen; 4833e12c5d1SDavid du Colombier $$.type = D_BRANCH; 4843e12c5d1SDavid du Colombier $$.sym = $1; 4853e12c5d1SDavid du Colombier $$.offset = $1->value + $2; 4863e12c5d1SDavid du Colombier } 4873e12c5d1SDavid du Colombier 4883e12c5d1SDavid du Colombier rreg: 4893e12c5d1SDavid du Colombier sreg 4903e12c5d1SDavid du Colombier { 4913e12c5d1SDavid du Colombier $$ = nullgen; 4923e12c5d1SDavid du Colombier $$.type = D_REG; 4933e12c5d1SDavid du Colombier $$.reg = $1; 4943e12c5d1SDavid du Colombier } 4953e12c5d1SDavid du Colombier 4963e12c5d1SDavid du Colombier fsr: 4973e12c5d1SDavid du Colombier LFSR 4983e12c5d1SDavid du Colombier { 4993e12c5d1SDavid du Colombier $$ = nullgen; 5003e12c5d1SDavid du Colombier $$.type = D_PREG; 5013e12c5d1SDavid du Colombier $$.reg = $1; 5023e12c5d1SDavid du Colombier } 5033e12c5d1SDavid du Colombier 5043e12c5d1SDavid du Colombier fpq: 5053e12c5d1SDavid du Colombier LFPQ 5063e12c5d1SDavid du Colombier { 5073e12c5d1SDavid du Colombier $$ = nullgen; 5083e12c5d1SDavid du Colombier $$.type = D_PREG; 5093e12c5d1SDavid du Colombier $$.reg = $1; 5103e12c5d1SDavid du Colombier } 5113e12c5d1SDavid du Colombier 5123e12c5d1SDavid du Colombier psr: 5133e12c5d1SDavid du Colombier LPSR 5143e12c5d1SDavid du Colombier { 5153e12c5d1SDavid du Colombier $$ = nullgen; 5163e12c5d1SDavid du Colombier $$.type = D_PREG; 5173e12c5d1SDavid du Colombier $$.reg = $1; 5183e12c5d1SDavid du Colombier } 5193e12c5d1SDavid du Colombier 5203e12c5d1SDavid du Colombier creg: 5213e12c5d1SDavid du Colombier LCREG 5223e12c5d1SDavid du Colombier { 5233e12c5d1SDavid du Colombier $$ = nullgen; 5243e12c5d1SDavid du Colombier $$.type = D_CREG; 5253e12c5d1SDavid du Colombier $$.reg = $1; 5263e12c5d1SDavid du Colombier } 5273e12c5d1SDavid du Colombier | LC '(' con ')' 5283e12c5d1SDavid du Colombier { 5293e12c5d1SDavid du Colombier $$ = nullgen; 5303e12c5d1SDavid du Colombier $$.type = D_CREG; 5313e12c5d1SDavid du Colombier $$.reg = $3; 5323e12c5d1SDavid du Colombier } 5333e12c5d1SDavid du Colombier 5343e12c5d1SDavid du Colombier freg: 5353e12c5d1SDavid du Colombier LFREG 5363e12c5d1SDavid du Colombier { 5373e12c5d1SDavid du Colombier $$ = nullgen; 5383e12c5d1SDavid du Colombier $$.type = D_FREG; 5393e12c5d1SDavid du Colombier $$.reg = $1; 5403e12c5d1SDavid du Colombier } 5413e12c5d1SDavid du Colombier | LF '(' con ')' 5423e12c5d1SDavid du Colombier { 5433e12c5d1SDavid du Colombier $$ = nullgen; 5443e12c5d1SDavid du Colombier $$.type = D_FREG; 5453e12c5d1SDavid du Colombier $$.reg = $3; 5463e12c5d1SDavid du Colombier } 5473e12c5d1SDavid du Colombier 5483e12c5d1SDavid du Colombier ximm: 5493e12c5d1SDavid du Colombier '$' addr 5503e12c5d1SDavid du Colombier { 5513e12c5d1SDavid du Colombier $$ = $2; 5523e12c5d1SDavid du Colombier $$.type = D_CONST; 5533e12c5d1SDavid du Colombier } 5543e12c5d1SDavid du Colombier | '$' LSCONST 5553e12c5d1SDavid du Colombier { 5563e12c5d1SDavid du Colombier $$ = nullgen; 5573e12c5d1SDavid du Colombier $$.type = D_SCONST; 5583e12c5d1SDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 5593e12c5d1SDavid du Colombier } 5603e12c5d1SDavid du Colombier 5613e12c5d1SDavid du Colombier fimm: 5623e12c5d1SDavid du Colombier '$' LFCONST 5633e12c5d1SDavid du Colombier { 5643e12c5d1SDavid du Colombier $$ = nullgen; 5653e12c5d1SDavid du Colombier $$.type = D_FCONST; 5663e12c5d1SDavid du Colombier $$.dval = $2; 5673e12c5d1SDavid du Colombier } 5683e12c5d1SDavid du Colombier | '$' '-' LFCONST 5693e12c5d1SDavid du Colombier { 5703e12c5d1SDavid du Colombier $$ = nullgen; 5713e12c5d1SDavid du Colombier $$.type = D_FCONST; 5723e12c5d1SDavid du Colombier $$.dval = -$3; 5733e12c5d1SDavid du Colombier } 5743e12c5d1SDavid du Colombier 5753e12c5d1SDavid du Colombier imm: '$' con 5763e12c5d1SDavid du Colombier { 5773e12c5d1SDavid du Colombier $$ = nullgen; 5783e12c5d1SDavid du Colombier $$.type = D_CONST; 5793e12c5d1SDavid du Colombier $$.offset = $2; 5803e12c5d1SDavid du Colombier } 5813e12c5d1SDavid du Colombier 5823e12c5d1SDavid du Colombier sreg: 5833e12c5d1SDavid du Colombier LREG 5843e12c5d1SDavid du Colombier | LR '(' con ')' 5853e12c5d1SDavid du Colombier { 5863e12c5d1SDavid du Colombier if($$ < 0 || $$ >= NREG) 5873e12c5d1SDavid du Colombier print("register value out of range\n"); 5883e12c5d1SDavid du Colombier $$ = $3; 5893e12c5d1SDavid du Colombier } 5903e12c5d1SDavid du Colombier 591*219b2ee8SDavid du Colombier addr: 5923e12c5d1SDavid du Colombier '(' sreg ')' 5933e12c5d1SDavid du Colombier { 5943e12c5d1SDavid du Colombier $$ = nullgen; 5953e12c5d1SDavid du Colombier $$.type = D_OREG; 5963e12c5d1SDavid du Colombier $$.reg = $2; 5973e12c5d1SDavid du Colombier $$.offset = 0; 5983e12c5d1SDavid du Colombier } 5993e12c5d1SDavid du Colombier | '(' sreg ',' con ')' 6003e12c5d1SDavid du Colombier { 6013e12c5d1SDavid du Colombier $$ = nullgen; 6023e12c5d1SDavid du Colombier $$.type = D_ASI; 6033e12c5d1SDavid du Colombier $$.reg = $2; 6043e12c5d1SDavid du Colombier $$.offset = $4; 6053e12c5d1SDavid du Colombier } 6063e12c5d1SDavid du Colombier | '(' sreg '+' sreg ')' 6073e12c5d1SDavid du Colombier { 6083e12c5d1SDavid du Colombier $$ = nullgen; 6093e12c5d1SDavid du Colombier $$.type = D_OREG; 6103e12c5d1SDavid du Colombier $$.reg = $2; 6113e12c5d1SDavid du Colombier $$.xreg = $4; 6123e12c5d1SDavid du Colombier $$.offset = 0; 6133e12c5d1SDavid du Colombier } 614*219b2ee8SDavid du Colombier | name 6153e12c5d1SDavid du Colombier | con '(' sreg ')' 6163e12c5d1SDavid du Colombier { 6173e12c5d1SDavid du Colombier $$ = nullgen; 6183e12c5d1SDavid du Colombier $$.type = D_OREG; 6193e12c5d1SDavid du Colombier $$.reg = $3; 6203e12c5d1SDavid du Colombier $$.offset = $1; 6213e12c5d1SDavid du Colombier } 6223e12c5d1SDavid du Colombier 6233e12c5d1SDavid du Colombier name: 6243e12c5d1SDavid du Colombier con '(' pointer ')' 6253e12c5d1SDavid du Colombier { 6263e12c5d1SDavid du Colombier $$ = nullgen; 6273e12c5d1SDavid du Colombier $$.type = D_OREG; 6283e12c5d1SDavid du Colombier $$.name = $3; 6293e12c5d1SDavid du Colombier $$.sym = S; 6303e12c5d1SDavid du Colombier $$.offset = $1; 6313e12c5d1SDavid du Colombier } 6323e12c5d1SDavid du Colombier | LNAME offset '(' pointer ')' 6333e12c5d1SDavid du Colombier { 6343e12c5d1SDavid du Colombier $$ = nullgen; 6353e12c5d1SDavid du Colombier $$.type = D_OREG; 6363e12c5d1SDavid du Colombier $$.name = $4; 6373e12c5d1SDavid du Colombier $$.sym = $1; 6383e12c5d1SDavid du Colombier $$.offset = $2; 6393e12c5d1SDavid du Colombier } 6403e12c5d1SDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 6413e12c5d1SDavid du Colombier { 6423e12c5d1SDavid du Colombier $$ = nullgen; 6433e12c5d1SDavid du Colombier $$.type = D_OREG; 6443e12c5d1SDavid du Colombier $$.name = D_STATIC; 6453e12c5d1SDavid du Colombier $$.sym = $1; 6463e12c5d1SDavid du Colombier $$.offset = $4; 6473e12c5d1SDavid du Colombier } 6483e12c5d1SDavid du Colombier 6493e12c5d1SDavid du Colombier comma: 6503e12c5d1SDavid du Colombier | ',' 6513e12c5d1SDavid du Colombier 6523e12c5d1SDavid du Colombier offset: 6533e12c5d1SDavid du Colombier { 6543e12c5d1SDavid du Colombier $$ = 0; 6553e12c5d1SDavid du Colombier } 6563e12c5d1SDavid du Colombier | '+' con 6573e12c5d1SDavid du Colombier { 6583e12c5d1SDavid du Colombier $$ = $2; 6593e12c5d1SDavid du Colombier } 6603e12c5d1SDavid du Colombier | '-' con 6613e12c5d1SDavid du Colombier { 6623e12c5d1SDavid du Colombier $$ = -$2; 6633e12c5d1SDavid du Colombier } 6643e12c5d1SDavid du Colombier 6653e12c5d1SDavid du Colombier pointer: 6663e12c5d1SDavid du Colombier LSB 6673e12c5d1SDavid du Colombier | LSP 6683e12c5d1SDavid du Colombier | LFP 6693e12c5d1SDavid du Colombier 6703e12c5d1SDavid du Colombier con: 6713e12c5d1SDavid du Colombier LCONST 6723e12c5d1SDavid du Colombier | LVAR 6733e12c5d1SDavid du Colombier { 6743e12c5d1SDavid du Colombier $$ = $1->value; 6753e12c5d1SDavid du Colombier } 6763e12c5d1SDavid du Colombier | '-' con 6773e12c5d1SDavid du Colombier { 6783e12c5d1SDavid du Colombier $$ = -$2; 6793e12c5d1SDavid du Colombier } 6803e12c5d1SDavid du Colombier | '+' con 6813e12c5d1SDavid du Colombier { 6823e12c5d1SDavid du Colombier $$ = $2; 6833e12c5d1SDavid du Colombier } 6843e12c5d1SDavid du Colombier | '~' con 6853e12c5d1SDavid du Colombier { 6863e12c5d1SDavid du Colombier $$ = ~$2; 6873e12c5d1SDavid du Colombier } 6883e12c5d1SDavid du Colombier | '(' expr ')' 6893e12c5d1SDavid du Colombier { 6903e12c5d1SDavid du Colombier $$ = $2; 6913e12c5d1SDavid du Colombier } 6923e12c5d1SDavid du Colombier 6933e12c5d1SDavid du Colombier expr: 6943e12c5d1SDavid du Colombier con 6953e12c5d1SDavid du Colombier | expr '+' expr 6963e12c5d1SDavid du Colombier { 6973e12c5d1SDavid du Colombier $$ = $1 + $3; 6983e12c5d1SDavid du Colombier } 6993e12c5d1SDavid du Colombier | expr '-' expr 7003e12c5d1SDavid du Colombier { 7013e12c5d1SDavid du Colombier $$ = $1 - $3; 7023e12c5d1SDavid du Colombier } 7033e12c5d1SDavid du Colombier | expr '*' expr 7043e12c5d1SDavid du Colombier { 7053e12c5d1SDavid du Colombier $$ = $1 * $3; 7063e12c5d1SDavid du Colombier } 7073e12c5d1SDavid du Colombier | expr '/' expr 7083e12c5d1SDavid du Colombier { 7093e12c5d1SDavid du Colombier $$ = $1 / $3; 7103e12c5d1SDavid du Colombier } 7113e12c5d1SDavid du Colombier | expr '%' expr 7123e12c5d1SDavid du Colombier { 7133e12c5d1SDavid du Colombier $$ = $1 % $3; 7143e12c5d1SDavid du Colombier } 7153e12c5d1SDavid du Colombier | expr '<' '<' expr 7163e12c5d1SDavid du Colombier { 7173e12c5d1SDavid du Colombier $$ = $1 << $4; 7183e12c5d1SDavid du Colombier } 7193e12c5d1SDavid du Colombier | expr '>' '>' expr 7203e12c5d1SDavid du Colombier { 7213e12c5d1SDavid du Colombier $$ = $1 >> $4; 7223e12c5d1SDavid du Colombier } 7233e12c5d1SDavid du Colombier | expr '&' expr 7243e12c5d1SDavid du Colombier { 7253e12c5d1SDavid du Colombier $$ = $1 & $3; 7263e12c5d1SDavid du Colombier } 7273e12c5d1SDavid du Colombier | expr '^' expr 7283e12c5d1SDavid du Colombier { 7293e12c5d1SDavid du Colombier $$ = $1 ^ $3; 7303e12c5d1SDavid du Colombier } 7313e12c5d1SDavid du Colombier | expr '|' expr 7323e12c5d1SDavid du Colombier { 7333e12c5d1SDavid du Colombier $$ = $1 | $3; 7343e12c5d1SDavid du Colombier } 735