17dd7cddfSDavid du Colombier %{ 27dd7cddfSDavid du Colombier #include "a.h" 37dd7cddfSDavid du Colombier %} 47dd7cddfSDavid du Colombier %union 57dd7cddfSDavid du Colombier { 67dd7cddfSDavid du Colombier Sym *sym; 77dd7cddfSDavid du Colombier long lval; 87dd7cddfSDavid du Colombier double dval; 97dd7cddfSDavid du Colombier char sval[8]; 107dd7cddfSDavid du Colombier Gen gen; 117dd7cddfSDavid du Colombier } 127dd7cddfSDavid du Colombier %left '|' 137dd7cddfSDavid du Colombier %left '^' 147dd7cddfSDavid du Colombier %left '&' 157dd7cddfSDavid du Colombier %left '<' '>' 167dd7cddfSDavid du Colombier %left '+' '-' 177dd7cddfSDavid du Colombier %left '*' '/' '%' 187dd7cddfSDavid du Colombier %token <lval> LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5 197dd7cddfSDavid du Colombier %token <lval> LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA 207dd7cddfSDavid du Colombier %token <lval> LTYPEB LTYPEC LTYPED LTYPEE LTYPEF 2159cc4ca5SDavid du Colombier %token <lval> LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK 22*375daca8SDavid du Colombier %token <lval> LTYPEL LTYPEM LTYPEN LTYPEBX 237dd7cddfSDavid du Colombier %token <lval> LCONST LSP LSB LFP LPC 247dd7cddfSDavid du Colombier %token <lval> LTYPEX LR LREG LF LFREG LC LCREG LPSR LFCR 257dd7cddfSDavid du Colombier %token <lval> LCOND LS LAT 267dd7cddfSDavid du Colombier %token <dval> LFCONST 277dd7cddfSDavid du Colombier %token <sval> LSCONST 287dd7cddfSDavid du Colombier %token <sym> LNAME LLAB LVAR 297dd7cddfSDavid du Colombier %type <lval> con expr oexpr pointer offset sreg spreg creg 307dd7cddfSDavid du Colombier %type <lval> rcon cond reglist 3159cc4ca5SDavid du Colombier %type <gen> gen rel reg regreg freg shift fcon frcon 3259cc4ca5SDavid du Colombier %type <gen> imm ximm name oreg ireg nireg ioreg imsr 337dd7cddfSDavid du Colombier %% 347dd7cddfSDavid du Colombier prog: 357dd7cddfSDavid du Colombier | prog line 367dd7cddfSDavid du Colombier 377dd7cddfSDavid du Colombier line: 387dd7cddfSDavid du Colombier LLAB ':' 397dd7cddfSDavid du Colombier { 407dd7cddfSDavid du Colombier if($1->value != pc) 417dd7cddfSDavid du Colombier yyerror("redeclaration of %s", $1->name); 427dd7cddfSDavid du Colombier $1->value = pc; 437dd7cddfSDavid du Colombier } 447dd7cddfSDavid du Colombier line 457dd7cddfSDavid du Colombier | LNAME ':' 467dd7cddfSDavid du Colombier { 477dd7cddfSDavid du Colombier $1->type = LLAB; 487dd7cddfSDavid du Colombier $1->value = pc; 497dd7cddfSDavid du Colombier } 507dd7cddfSDavid du Colombier line 517dd7cddfSDavid du Colombier | LNAME '=' expr ';' 527dd7cddfSDavid du Colombier { 537dd7cddfSDavid du Colombier $1->type = LVAR; 547dd7cddfSDavid du Colombier $1->value = $3; 557dd7cddfSDavid du Colombier } 567dd7cddfSDavid du Colombier | LVAR '=' expr ';' 577dd7cddfSDavid du Colombier { 587dd7cddfSDavid du Colombier if($1->value != $3) 597dd7cddfSDavid du Colombier yyerror("redeclaration of %s", $1->name); 607dd7cddfSDavid du Colombier $1->value = $3; 617dd7cddfSDavid du Colombier } 627dd7cddfSDavid du Colombier | ';' 637dd7cddfSDavid du Colombier | inst ';' 647dd7cddfSDavid du Colombier | error ';' 657dd7cddfSDavid du Colombier 667dd7cddfSDavid du Colombier inst: 677dd7cddfSDavid du Colombier /* 687dd7cddfSDavid du Colombier * ADD 697dd7cddfSDavid du Colombier */ 707dd7cddfSDavid du Colombier LTYPE1 cond imsr ',' spreg ',' reg 717dd7cddfSDavid du Colombier { 727dd7cddfSDavid du Colombier outcode($1, $2, &$3, $5, &$7); 737dd7cddfSDavid du Colombier } 7459cc4ca5SDavid du Colombier | LTYPE1 cond imsr ',' spreg ',' 7559cc4ca5SDavid du Colombier { 7659cc4ca5SDavid du Colombier outcode($1, $2, &$3, $5, &nullgen); 7759cc4ca5SDavid du Colombier } 787dd7cddfSDavid du Colombier | LTYPE1 cond imsr ',' reg 797dd7cddfSDavid du Colombier { 807dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &$5); 817dd7cddfSDavid du Colombier } 827dd7cddfSDavid du Colombier /* 837dd7cddfSDavid du Colombier * MVN 847dd7cddfSDavid du Colombier */ 857dd7cddfSDavid du Colombier | LTYPE2 cond imsr ',' reg 867dd7cddfSDavid du Colombier { 877dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &$5); 887dd7cddfSDavid du Colombier } 897dd7cddfSDavid du Colombier /* 907dd7cddfSDavid du Colombier * MOVW 917dd7cddfSDavid du Colombier */ 927dd7cddfSDavid du Colombier | LTYPE3 cond gen ',' gen 937dd7cddfSDavid du Colombier { 947dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &$5); 957dd7cddfSDavid du Colombier } 967dd7cddfSDavid du Colombier /* 977dd7cddfSDavid du Colombier * B/BL 987dd7cddfSDavid du Colombier */ 997dd7cddfSDavid du Colombier | LTYPE4 cond comma rel 1007dd7cddfSDavid du Colombier { 1017dd7cddfSDavid du Colombier outcode($1, $2, &nullgen, NREG, &$4); 1027dd7cddfSDavid du Colombier } 1037dd7cddfSDavid du Colombier | LTYPE4 cond comma nireg 1047dd7cddfSDavid du Colombier { 1057dd7cddfSDavid du Colombier outcode($1, $2, &nullgen, NREG, &$4); 1067dd7cddfSDavid du Colombier } 1077dd7cddfSDavid du Colombier /* 108*375daca8SDavid du Colombier * BX 109*375daca8SDavid du Colombier */ 110*375daca8SDavid du Colombier | LTYPEBX comma ireg 111*375daca8SDavid du Colombier { 112*375daca8SDavid du Colombier outcode($1, Always, &nullgen, NREG, &$3); 113*375daca8SDavid du Colombier } 114*375daca8SDavid du Colombier /* 1157dd7cddfSDavid du Colombier * BEQ 1167dd7cddfSDavid du Colombier */ 1177dd7cddfSDavid du Colombier | LTYPE5 comma rel 1187dd7cddfSDavid du Colombier { 1197dd7cddfSDavid du Colombier outcode($1, Always, &nullgen, NREG, &$3); 1207dd7cddfSDavid du Colombier } 1217dd7cddfSDavid du Colombier /* 1227dd7cddfSDavid du Colombier * SWI 1237dd7cddfSDavid du Colombier */ 1247dd7cddfSDavid du Colombier | LTYPE6 cond comma gen 1257dd7cddfSDavid du Colombier { 1267dd7cddfSDavid du Colombier outcode($1, $2, &nullgen, NREG, &$4); 1277dd7cddfSDavid du Colombier } 1287dd7cddfSDavid du Colombier /* 1297dd7cddfSDavid du Colombier * CMP 1307dd7cddfSDavid du Colombier */ 1317dd7cddfSDavid du Colombier | LTYPE7 cond imsr ',' spreg comma 1327dd7cddfSDavid du Colombier { 1337dd7cddfSDavid du Colombier outcode($1, $2, &$3, $5, &nullgen); 1347dd7cddfSDavid du Colombier } 1357dd7cddfSDavid du Colombier /* 1367dd7cddfSDavid du Colombier * MOVM 1377dd7cddfSDavid du Colombier */ 13859cc4ca5SDavid du Colombier | LTYPE8 cond ioreg ',' '[' reglist ']' 1397dd7cddfSDavid du Colombier { 1407dd7cddfSDavid du Colombier Gen g; 1417dd7cddfSDavid du Colombier 1427dd7cddfSDavid du Colombier g = nullgen; 1437dd7cddfSDavid du Colombier g.type = D_CONST; 1447dd7cddfSDavid du Colombier g.offset = $6; 1457dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &g); 1467dd7cddfSDavid du Colombier } 14759cc4ca5SDavid du Colombier | LTYPE8 cond '[' reglist ']' ',' ioreg 1487dd7cddfSDavid du Colombier { 1497dd7cddfSDavid du Colombier Gen g; 1507dd7cddfSDavid du Colombier 1517dd7cddfSDavid du Colombier g = nullgen; 1527dd7cddfSDavid du Colombier g.type = D_CONST; 1537dd7cddfSDavid du Colombier g.offset = $4; 1547dd7cddfSDavid du Colombier outcode($1, $2, &g, NREG, &$7); 1557dd7cddfSDavid du Colombier } 1567dd7cddfSDavid du Colombier /* 1577dd7cddfSDavid du Colombier * SWAP 1587dd7cddfSDavid du Colombier */ 1597dd7cddfSDavid du Colombier | LTYPE9 cond reg ',' ireg ',' reg 1607dd7cddfSDavid du Colombier { 1617dd7cddfSDavid du Colombier outcode($1, $2, &$5, $3.reg, &$7); 1627dd7cddfSDavid du Colombier } 1637dd7cddfSDavid du Colombier | LTYPE9 cond reg ',' ireg comma 1647dd7cddfSDavid du Colombier { 1657dd7cddfSDavid du Colombier outcode($1, $2, &$5, $3.reg, &$3); 1667dd7cddfSDavid du Colombier } 1677dd7cddfSDavid du Colombier | LTYPE9 cond comma ireg ',' reg 1687dd7cddfSDavid du Colombier { 1697dd7cddfSDavid du Colombier outcode($1, $2, &$4, $6.reg, &$6); 1707dd7cddfSDavid du Colombier } 1717dd7cddfSDavid du Colombier /* 1727dd7cddfSDavid du Colombier * RET 1737dd7cddfSDavid du Colombier */ 17459cc4ca5SDavid du Colombier | LTYPEA cond comma 1757dd7cddfSDavid du Colombier { 17659cc4ca5SDavid du Colombier outcode($1, $2, &nullgen, NREG, &nullgen); 1777dd7cddfSDavid du Colombier } 1787dd7cddfSDavid du Colombier /* 1797dd7cddfSDavid du Colombier * TEXT/GLOBL 1807dd7cddfSDavid du Colombier */ 1817dd7cddfSDavid du Colombier | LTYPEB name ',' imm 1827dd7cddfSDavid du Colombier { 1837dd7cddfSDavid du Colombier outcode($1, Always, &$2, NREG, &$4); 1847dd7cddfSDavid du Colombier } 1857dd7cddfSDavid du Colombier | LTYPEB name ',' con ',' imm 1867dd7cddfSDavid du Colombier { 1877dd7cddfSDavid du Colombier outcode($1, Always, &$2, $4, &$6); 1887dd7cddfSDavid du Colombier } 1897dd7cddfSDavid du Colombier /* 1907dd7cddfSDavid du Colombier * DATA 1917dd7cddfSDavid du Colombier */ 1927dd7cddfSDavid du Colombier | LTYPEC name '/' con ',' ximm 1937dd7cddfSDavid du Colombier { 1947dd7cddfSDavid du Colombier outcode($1, Always, &$2, $4, &$6); 1957dd7cddfSDavid du Colombier } 1967dd7cddfSDavid du Colombier /* 19759cc4ca5SDavid du Colombier * CASE 19859cc4ca5SDavid du Colombier */ 19959cc4ca5SDavid du Colombier | LTYPED cond reg comma 20059cc4ca5SDavid du Colombier { 20159cc4ca5SDavid du Colombier outcode($1, $2, &$3, NREG, &nullgen); 20259cc4ca5SDavid du Colombier } 20359cc4ca5SDavid du Colombier /* 2047dd7cddfSDavid du Colombier * word 2057dd7cddfSDavid du Colombier */ 2067dd7cddfSDavid du Colombier | LTYPEH comma ximm 2077dd7cddfSDavid du Colombier { 2087dd7cddfSDavid du Colombier outcode($1, Always, &nullgen, NREG, &$3); 2097dd7cddfSDavid du Colombier } 2107dd7cddfSDavid du Colombier /* 2117dd7cddfSDavid du Colombier * floating-point coprocessor 2127dd7cddfSDavid du Colombier */ 21359cc4ca5SDavid du Colombier | LTYPEI cond freg ',' freg 2147dd7cddfSDavid du Colombier { 2157dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &$5); 2167dd7cddfSDavid du Colombier } 2177dd7cddfSDavid du Colombier | LTYPEK cond frcon ',' freg 2187dd7cddfSDavid du Colombier { 2197dd7cddfSDavid du Colombier outcode($1, $2, &$3, NREG, &$5); 2207dd7cddfSDavid du Colombier } 2217dd7cddfSDavid du Colombier | LTYPEK cond frcon ',' LFREG ',' freg 2227dd7cddfSDavid du Colombier { 2237dd7cddfSDavid du Colombier outcode($1, $2, &$3, $5, &$7); 2247dd7cddfSDavid du Colombier } 2257dd7cddfSDavid du Colombier | LTYPEL cond freg ',' freg comma 2267dd7cddfSDavid du Colombier { 2277dd7cddfSDavid du Colombier outcode($1, $2, &$3, $5.reg, &nullgen); 2287dd7cddfSDavid du Colombier } 2297dd7cddfSDavid du Colombier /* 2307dd7cddfSDavid du Colombier * MCR MRC 2317dd7cddfSDavid du Colombier */ 23259cc4ca5SDavid du Colombier | LTYPEJ cond con ',' expr ',' spreg ',' creg ',' creg oexpr 2337dd7cddfSDavid du Colombier { 2347dd7cddfSDavid du Colombier Gen g; 2357dd7cddfSDavid du Colombier 2367dd7cddfSDavid du Colombier g = nullgen; 2377dd7cddfSDavid du Colombier g.type = D_CONST; 2387dd7cddfSDavid du Colombier g.offset = 2397dd7cddfSDavid du Colombier (0xe << 24) | /* opcode */ 2407dd7cddfSDavid du Colombier ($1 << 20) | /* MCR/MRC */ 2417dd7cddfSDavid du Colombier ($2 << 28) | /* scond */ 2427dd7cddfSDavid du Colombier (($3 & 15) << 8) | /* coprocessor number */ 2437dd7cddfSDavid du Colombier (($5 & 7) << 21) | /* coprocessor operation */ 2447dd7cddfSDavid du Colombier (($7 & 15) << 12) | /* arm register */ 2457dd7cddfSDavid du Colombier (($9 & 15) << 16) | /* Crn */ 2467dd7cddfSDavid du Colombier (($11 & 15) << 0) | /* Crm */ 2477dd7cddfSDavid du Colombier (($12 & 7) << 5) | /* coprocessor information */ 2487dd7cddfSDavid du Colombier (1<<4); /* must be set */ 2497dd7cddfSDavid du Colombier outcode(AWORD, Always, &nullgen, NREG, &g); 2507dd7cddfSDavid du Colombier } 25159cc4ca5SDavid du Colombier /* 25259cc4ca5SDavid du Colombier * MULL hi,lo,r1,r2 25359cc4ca5SDavid du Colombier */ 25459cc4ca5SDavid du Colombier | LTYPEM cond reg ',' reg ',' regreg 25559cc4ca5SDavid du Colombier { 25659cc4ca5SDavid du Colombier outcode($1, $2, &$3, $5.reg, &$7); 25759cc4ca5SDavid du Colombier } 25859cc4ca5SDavid du Colombier /* 25980ee5cbfSDavid du Colombier * MULA hi,lo,r1,r2 26080ee5cbfSDavid du Colombier */ 26180ee5cbfSDavid du Colombier | LTYPEN cond reg ',' reg ',' reg ',' spreg 26280ee5cbfSDavid du Colombier { 26380ee5cbfSDavid du Colombier $7.type = D_REGREG; 26480ee5cbfSDavid du Colombier $7.offset = $9; 26580ee5cbfSDavid du Colombier outcode($1, $2, &$3, $5.reg, &$7); 26680ee5cbfSDavid du Colombier } 26780ee5cbfSDavid du Colombier /* 26859cc4ca5SDavid du Colombier * END 26959cc4ca5SDavid du Colombier */ 27059cc4ca5SDavid du Colombier | LTYPEE comma 27159cc4ca5SDavid du Colombier { 27259cc4ca5SDavid du Colombier outcode($1, Always, &nullgen, NREG, &nullgen); 27359cc4ca5SDavid du Colombier } 2747dd7cddfSDavid du Colombier 2757dd7cddfSDavid du Colombier cond: 2767dd7cddfSDavid du Colombier { 2777dd7cddfSDavid du Colombier $$ = Always; 2787dd7cddfSDavid du Colombier } 2797dd7cddfSDavid du Colombier | cond LCOND 2807dd7cddfSDavid du Colombier { 2817dd7cddfSDavid du Colombier $$ = ($1 & ~C_SCOND) | $2; 2827dd7cddfSDavid du Colombier } 2837dd7cddfSDavid du Colombier | cond LS 2847dd7cddfSDavid du Colombier { 2857dd7cddfSDavid du Colombier $$ = $1 | $2; 2867dd7cddfSDavid du Colombier } 2877dd7cddfSDavid du Colombier 2887dd7cddfSDavid du Colombier comma: 28959cc4ca5SDavid du Colombier | ',' comma 2907dd7cddfSDavid du Colombier 2917dd7cddfSDavid du Colombier rel: 2927dd7cddfSDavid du Colombier con '(' LPC ')' 2937dd7cddfSDavid du Colombier { 2947dd7cddfSDavid du Colombier $$ = nullgen; 2957dd7cddfSDavid du Colombier $$.type = D_BRANCH; 2967dd7cddfSDavid du Colombier $$.offset = $1 + pc; 2977dd7cddfSDavid du Colombier } 2987dd7cddfSDavid du Colombier | LNAME offset 2997dd7cddfSDavid du Colombier { 3007dd7cddfSDavid du Colombier $$ = nullgen; 3017dd7cddfSDavid du Colombier if(pass == 2) 3027dd7cddfSDavid du Colombier yyerror("undefined label: %s", $1->name); 3037dd7cddfSDavid du Colombier $$.type = D_BRANCH; 3047dd7cddfSDavid du Colombier $$.sym = $1; 3057dd7cddfSDavid du Colombier $$.offset = $2; 3067dd7cddfSDavid du Colombier } 3077dd7cddfSDavid du Colombier | LLAB offset 3087dd7cddfSDavid du Colombier { 3097dd7cddfSDavid du Colombier $$ = nullgen; 3107dd7cddfSDavid du Colombier $$.type = D_BRANCH; 3117dd7cddfSDavid du Colombier $$.sym = $1; 3127dd7cddfSDavid du Colombier $$.offset = $1->value + $2; 3137dd7cddfSDavid du Colombier } 3147dd7cddfSDavid du Colombier 3157dd7cddfSDavid du Colombier ximm: '$' con 3167dd7cddfSDavid du Colombier { 3177dd7cddfSDavid du Colombier $$ = nullgen; 3187dd7cddfSDavid du Colombier $$.type = D_CONST; 3197dd7cddfSDavid du Colombier $$.offset = $2; 3207dd7cddfSDavid du Colombier } 3217dd7cddfSDavid du Colombier | '$' oreg 3227dd7cddfSDavid du Colombier { 3237dd7cddfSDavid du Colombier $$ = $2; 3247dd7cddfSDavid du Colombier $$.type = D_CONST; 3257dd7cddfSDavid du Colombier } 3267dd7cddfSDavid du Colombier | '$' '*' '$' oreg 3277dd7cddfSDavid du Colombier { 3287dd7cddfSDavid du Colombier $$ = $4; 3297dd7cddfSDavid du Colombier $$.type = D_OCONST; 3307dd7cddfSDavid du Colombier } 3317dd7cddfSDavid du Colombier | '$' LSCONST 3327dd7cddfSDavid du Colombier { 3337dd7cddfSDavid du Colombier $$ = nullgen; 3347dd7cddfSDavid du Colombier $$.type = D_SCONST; 3357dd7cddfSDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 3367dd7cddfSDavid du Colombier } 3377dd7cddfSDavid du Colombier | fcon 3387dd7cddfSDavid du Colombier 3397dd7cddfSDavid du Colombier fcon: 3407dd7cddfSDavid du Colombier '$' LFCONST 3417dd7cddfSDavid du Colombier { 3427dd7cddfSDavid du Colombier $$ = nullgen; 3437dd7cddfSDavid du Colombier $$.type = D_FCONST; 3447dd7cddfSDavid du Colombier $$.dval = $2; 3457dd7cddfSDavid du Colombier } 3467dd7cddfSDavid du Colombier | '$' '-' LFCONST 3477dd7cddfSDavid du Colombier { 3487dd7cddfSDavid du Colombier $$ = nullgen; 3497dd7cddfSDavid du Colombier $$.type = D_FCONST; 3507dd7cddfSDavid du Colombier $$.dval = -$3; 3517dd7cddfSDavid du Colombier } 3527dd7cddfSDavid du Colombier 3537dd7cddfSDavid du Colombier reglist: 3547dd7cddfSDavid du Colombier spreg 3557dd7cddfSDavid du Colombier { 3567dd7cddfSDavid du Colombier $$ = 1 << $1; 3577dd7cddfSDavid du Colombier } 3587dd7cddfSDavid du Colombier | spreg '-' spreg 3597dd7cddfSDavid du Colombier { 3607dd7cddfSDavid du Colombier int i; 3617dd7cddfSDavid du Colombier $$=0; 3627dd7cddfSDavid du Colombier for(i=$1; i<=$3; i++) 3637dd7cddfSDavid du Colombier $$ |= 1<<i; 3647dd7cddfSDavid du Colombier for(i=$3; i<=$1; i++) 3657dd7cddfSDavid du Colombier $$ |= 1<<i; 3667dd7cddfSDavid du Colombier } 3677dd7cddfSDavid du Colombier | spreg comma reglist 3687dd7cddfSDavid du Colombier { 3697dd7cddfSDavid du Colombier $$ = (1<<$1) | $3; 3707dd7cddfSDavid du Colombier } 3717dd7cddfSDavid du Colombier 3727dd7cddfSDavid du Colombier gen: 3737dd7cddfSDavid du Colombier reg 3747dd7cddfSDavid du Colombier | ximm 3757dd7cddfSDavid du Colombier | shift 37659cc4ca5SDavid du Colombier | shift '(' spreg ')' 37759cc4ca5SDavid du Colombier { 37859cc4ca5SDavid du Colombier $$ = $1; 37959cc4ca5SDavid du Colombier $$.reg = $3; 38059cc4ca5SDavid du Colombier } 3817dd7cddfSDavid du Colombier | LPSR 3827dd7cddfSDavid du Colombier { 3837dd7cddfSDavid du Colombier $$ = nullgen; 3847dd7cddfSDavid du Colombier $$.type = D_PSR; 3857dd7cddfSDavid du Colombier $$.reg = $1; 3867dd7cddfSDavid du Colombier } 3877dd7cddfSDavid du Colombier | LFCR 3887dd7cddfSDavid du Colombier { 3897dd7cddfSDavid du Colombier $$ = nullgen; 3907dd7cddfSDavid du Colombier $$.type = D_FPCR; 3917dd7cddfSDavid du Colombier $$.reg = $1; 3927dd7cddfSDavid du Colombier } 3937dd7cddfSDavid du Colombier | con 3947dd7cddfSDavid du Colombier { 3957dd7cddfSDavid du Colombier $$ = nullgen; 3967dd7cddfSDavid du Colombier $$.type = D_OREG; 3977dd7cddfSDavid du Colombier $$.offset = $1; 3987dd7cddfSDavid du Colombier } 3997dd7cddfSDavid du Colombier | oreg 4007dd7cddfSDavid du Colombier | freg 4017dd7cddfSDavid du Colombier 4027dd7cddfSDavid du Colombier nireg: 4037dd7cddfSDavid du Colombier ireg 4047dd7cddfSDavid du Colombier | name 4057dd7cddfSDavid du Colombier { 4067dd7cddfSDavid du Colombier $$ = $1; 4077dd7cddfSDavid du Colombier if($1.name != D_EXTERN && $1.name != D_STATIC) { 4087dd7cddfSDavid du Colombier } 4097dd7cddfSDavid du Colombier } 4107dd7cddfSDavid du Colombier 4117dd7cddfSDavid du Colombier ireg: 4127dd7cddfSDavid du Colombier '(' spreg ')' 4137dd7cddfSDavid du Colombier { 4147dd7cddfSDavid du Colombier $$ = nullgen; 4157dd7cddfSDavid du Colombier $$.type = D_OREG; 4167dd7cddfSDavid du Colombier $$.reg = $2; 4177dd7cddfSDavid du Colombier $$.offset = 0; 4187dd7cddfSDavid du Colombier } 4197dd7cddfSDavid du Colombier 42059cc4ca5SDavid du Colombier ioreg: 4217dd7cddfSDavid du Colombier ireg 4227dd7cddfSDavid du Colombier | con '(' sreg ')' 4237dd7cddfSDavid du Colombier { 4247dd7cddfSDavid du Colombier $$ = nullgen; 4257dd7cddfSDavid du Colombier $$.type = D_OREG; 4267dd7cddfSDavid du Colombier $$.reg = $3; 4277dd7cddfSDavid du Colombier $$.offset = $1; 4287dd7cddfSDavid du Colombier } 42959cc4ca5SDavid du Colombier 43059cc4ca5SDavid du Colombier oreg: 43159cc4ca5SDavid du Colombier name 43259cc4ca5SDavid du Colombier | name '(' sreg ')' 4337dd7cddfSDavid du Colombier { 43459cc4ca5SDavid du Colombier $$ = $1; 4357dd7cddfSDavid du Colombier $$.type = D_OREG; 43659cc4ca5SDavid du Colombier $$.reg = $3; 4377dd7cddfSDavid du Colombier } 43859cc4ca5SDavid du Colombier | ioreg 4397dd7cddfSDavid du Colombier 4407dd7cddfSDavid du Colombier imsr: 4417dd7cddfSDavid du Colombier reg 4427dd7cddfSDavid du Colombier | imm 4437dd7cddfSDavid du Colombier | shift 4447dd7cddfSDavid du Colombier 4457dd7cddfSDavid du Colombier imm: '$' con 4467dd7cddfSDavid du Colombier { 4477dd7cddfSDavid du Colombier $$ = nullgen; 4487dd7cddfSDavid du Colombier $$.type = D_CONST; 4497dd7cddfSDavid du Colombier $$.offset = $2; 4507dd7cddfSDavid du Colombier } 4517dd7cddfSDavid du Colombier 4527dd7cddfSDavid du Colombier reg: 4537dd7cddfSDavid du Colombier spreg 4547dd7cddfSDavid du Colombier { 4557dd7cddfSDavid du Colombier $$ = nullgen; 4567dd7cddfSDavid du Colombier $$.type = D_REG; 4577dd7cddfSDavid du Colombier $$.reg = $1; 4587dd7cddfSDavid du Colombier } 4597dd7cddfSDavid du Colombier 46059cc4ca5SDavid du Colombier regreg: 46159cc4ca5SDavid du Colombier '(' spreg ',' spreg ')' 46259cc4ca5SDavid du Colombier { 46359cc4ca5SDavid du Colombier $$ = nullgen; 46459cc4ca5SDavid du Colombier $$.type = D_REGREG; 46559cc4ca5SDavid du Colombier $$.reg = $2; 46659cc4ca5SDavid du Colombier $$.offset = $4; 46759cc4ca5SDavid du Colombier } 46859cc4ca5SDavid du Colombier 4697dd7cddfSDavid du Colombier shift: 4707dd7cddfSDavid du Colombier spreg '<' '<' rcon 4717dd7cddfSDavid du Colombier { 4727dd7cddfSDavid du Colombier $$ = nullgen; 4737dd7cddfSDavid du Colombier $$.type = D_SHIFT; 4747dd7cddfSDavid du Colombier $$.offset = $1 | $4 | (0 << 5); 4757dd7cddfSDavid du Colombier } 4767dd7cddfSDavid du Colombier | spreg '>' '>' rcon 4777dd7cddfSDavid du Colombier { 4787dd7cddfSDavid du Colombier $$ = nullgen; 4797dd7cddfSDavid du Colombier $$.type = D_SHIFT; 4807dd7cddfSDavid du Colombier $$.offset = $1 | $4 | (1 << 5); 4817dd7cddfSDavid du Colombier } 4827dd7cddfSDavid du Colombier | spreg '-' '>' rcon 4837dd7cddfSDavid du Colombier { 4847dd7cddfSDavid du Colombier $$ = nullgen; 4857dd7cddfSDavid du Colombier $$.type = D_SHIFT; 4867dd7cddfSDavid du Colombier $$.offset = $1 | $4 | (2 << 5); 4877dd7cddfSDavid du Colombier } 4887dd7cddfSDavid du Colombier | spreg LAT '>' rcon 4897dd7cddfSDavid du Colombier { 4907dd7cddfSDavid du Colombier $$ = nullgen; 4917dd7cddfSDavid du Colombier $$.type = D_SHIFT; 4927dd7cddfSDavid du Colombier $$.offset = $1 | $4 | (3 << 5); 4937dd7cddfSDavid du Colombier } 4947dd7cddfSDavid du Colombier 4957dd7cddfSDavid du Colombier rcon: 4967dd7cddfSDavid du Colombier spreg 4977dd7cddfSDavid du Colombier { 4987dd7cddfSDavid du Colombier if($$ < 0 || $$ >= 16) 4997dd7cddfSDavid du Colombier print("register value out of range\n"); 5007dd7cddfSDavid du Colombier $$ = (($1&15) << 8) | (1 << 4); 5017dd7cddfSDavid du Colombier } 5027dd7cddfSDavid du Colombier | con 5037dd7cddfSDavid du Colombier { 5047dd7cddfSDavid du Colombier if($$ < 0 || $$ >= 32) 5057dd7cddfSDavid du Colombier print("shift value out of range\n"); 5067dd7cddfSDavid du Colombier $$ = ($1&31) << 7; 5077dd7cddfSDavid du Colombier } 5087dd7cddfSDavid du Colombier 5097dd7cddfSDavid du Colombier sreg: 5107dd7cddfSDavid du Colombier LREG 5117dd7cddfSDavid du Colombier | LPC 5127dd7cddfSDavid du Colombier { 5137dd7cddfSDavid du Colombier $$ = REGPC; 5147dd7cddfSDavid du Colombier } 5157dd7cddfSDavid du Colombier | LR '(' expr ')' 5167dd7cddfSDavid du Colombier { 5177dd7cddfSDavid du Colombier if($3 < 0 || $3 >= NREG) 5187dd7cddfSDavid du Colombier print("register value out of range\n"); 5197dd7cddfSDavid du Colombier $$ = $3; 5207dd7cddfSDavid du Colombier } 5217dd7cddfSDavid du Colombier 5227dd7cddfSDavid du Colombier spreg: 5237dd7cddfSDavid du Colombier sreg 5247dd7cddfSDavid du Colombier | LSP 5257dd7cddfSDavid du Colombier { 5267dd7cddfSDavid du Colombier $$ = REGSP; 5277dd7cddfSDavid du Colombier } 5287dd7cddfSDavid du Colombier 5297dd7cddfSDavid du Colombier creg: 5307dd7cddfSDavid du Colombier LCREG 5317dd7cddfSDavid du Colombier | LC '(' expr ')' 5327dd7cddfSDavid du Colombier { 5337dd7cddfSDavid du Colombier if($3 < 0 || $3 >= NREG) 5347dd7cddfSDavid du Colombier print("register value out of range\n"); 5357dd7cddfSDavid du Colombier $$ = $3; 5367dd7cddfSDavid du Colombier } 5377dd7cddfSDavid du Colombier 5387dd7cddfSDavid du Colombier frcon: 5397dd7cddfSDavid du Colombier freg 5407dd7cddfSDavid du Colombier | fcon 5417dd7cddfSDavid du Colombier 5427dd7cddfSDavid du Colombier freg: 5437dd7cddfSDavid du Colombier LFREG 5447dd7cddfSDavid du Colombier { 5457dd7cddfSDavid du Colombier $$ = nullgen; 5467dd7cddfSDavid du Colombier $$.type = D_FREG; 5477dd7cddfSDavid du Colombier $$.reg = $1; 5487dd7cddfSDavid du Colombier } 5497dd7cddfSDavid du Colombier | LF '(' con ')' 5507dd7cddfSDavid du Colombier { 5517dd7cddfSDavid du Colombier $$ = nullgen; 5527dd7cddfSDavid du Colombier $$.type = D_FREG; 5537dd7cddfSDavid du Colombier $$.reg = $3; 5547dd7cddfSDavid du Colombier } 5557dd7cddfSDavid du Colombier 5567dd7cddfSDavid du Colombier name: 5577dd7cddfSDavid du Colombier con '(' pointer ')' 5587dd7cddfSDavid du Colombier { 5597dd7cddfSDavid du Colombier $$ = nullgen; 5607dd7cddfSDavid du Colombier $$.type = D_OREG; 5617dd7cddfSDavid du Colombier $$.name = $3; 5627dd7cddfSDavid du Colombier $$.sym = S; 5637dd7cddfSDavid du Colombier $$.offset = $1; 5647dd7cddfSDavid du Colombier } 5657dd7cddfSDavid du Colombier | LNAME offset '(' pointer ')' 5667dd7cddfSDavid du Colombier { 5677dd7cddfSDavid du Colombier $$ = nullgen; 5687dd7cddfSDavid du Colombier $$.type = D_OREG; 5697dd7cddfSDavid du Colombier $$.name = $4; 5707dd7cddfSDavid du Colombier $$.sym = $1; 5717dd7cddfSDavid du Colombier $$.offset = $2; 5727dd7cddfSDavid du Colombier } 5737dd7cddfSDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 5747dd7cddfSDavid du Colombier { 5757dd7cddfSDavid du Colombier $$ = nullgen; 5767dd7cddfSDavid du Colombier $$.type = D_OREG; 5777dd7cddfSDavid du Colombier $$.name = D_STATIC; 5787dd7cddfSDavid du Colombier $$.sym = $1; 5797dd7cddfSDavid du Colombier $$.offset = $4; 5807dd7cddfSDavid du Colombier } 5817dd7cddfSDavid du Colombier 5827dd7cddfSDavid du Colombier offset: 5837dd7cddfSDavid du Colombier { 5847dd7cddfSDavid du Colombier $$ = 0; 5857dd7cddfSDavid du Colombier } 5867dd7cddfSDavid du Colombier | '+' con 5877dd7cddfSDavid du Colombier { 5887dd7cddfSDavid du Colombier $$ = $2; 5897dd7cddfSDavid du Colombier } 5907dd7cddfSDavid du Colombier | '-' con 5917dd7cddfSDavid du Colombier { 5927dd7cddfSDavid du Colombier $$ = -$2; 5937dd7cddfSDavid du Colombier } 5947dd7cddfSDavid du Colombier 5957dd7cddfSDavid du Colombier pointer: 5967dd7cddfSDavid du Colombier LSB 5977dd7cddfSDavid du Colombier | LSP 5987dd7cddfSDavid du Colombier | LFP 5997dd7cddfSDavid du Colombier 6007dd7cddfSDavid du Colombier con: 6017dd7cddfSDavid du Colombier LCONST 6027dd7cddfSDavid du Colombier | LVAR 6037dd7cddfSDavid du Colombier { 6047dd7cddfSDavid du Colombier $$ = $1->value; 6057dd7cddfSDavid du Colombier } 6067dd7cddfSDavid du Colombier | '-' con 6077dd7cddfSDavid du Colombier { 6087dd7cddfSDavid du Colombier $$ = -$2; 6097dd7cddfSDavid du Colombier } 6107dd7cddfSDavid du Colombier | '+' con 6117dd7cddfSDavid du Colombier { 6127dd7cddfSDavid du Colombier $$ = $2; 6137dd7cddfSDavid du Colombier } 6147dd7cddfSDavid du Colombier | '~' con 6157dd7cddfSDavid du Colombier { 6167dd7cddfSDavid du Colombier $$ = ~$2; 6177dd7cddfSDavid du Colombier } 6187dd7cddfSDavid du Colombier | '(' expr ')' 6197dd7cddfSDavid du Colombier { 6207dd7cddfSDavid du Colombier $$ = $2; 6217dd7cddfSDavid du Colombier } 6227dd7cddfSDavid du Colombier 6237dd7cddfSDavid du Colombier oexpr: 6247dd7cddfSDavid du Colombier { 6257dd7cddfSDavid du Colombier $$ = 0; 6267dd7cddfSDavid du Colombier } 6277dd7cddfSDavid du Colombier | ',' expr 6287dd7cddfSDavid du Colombier { 6297dd7cddfSDavid du Colombier $$ = $2; 6307dd7cddfSDavid du Colombier } 6317dd7cddfSDavid du Colombier 6327dd7cddfSDavid du Colombier expr: 6337dd7cddfSDavid du Colombier con 6347dd7cddfSDavid du Colombier | expr '+' expr 6357dd7cddfSDavid du Colombier { 6367dd7cddfSDavid du Colombier $$ = $1 + $3; 6377dd7cddfSDavid du Colombier } 6387dd7cddfSDavid du Colombier | expr '-' expr 6397dd7cddfSDavid du Colombier { 6407dd7cddfSDavid du Colombier $$ = $1 - $3; 6417dd7cddfSDavid du Colombier } 6427dd7cddfSDavid du Colombier | expr '*' expr 6437dd7cddfSDavid du Colombier { 6447dd7cddfSDavid du Colombier $$ = $1 * $3; 6457dd7cddfSDavid du Colombier } 6467dd7cddfSDavid du Colombier | expr '/' expr 6477dd7cddfSDavid du Colombier { 6487dd7cddfSDavid du Colombier $$ = $1 / $3; 6497dd7cddfSDavid du Colombier } 6507dd7cddfSDavid du Colombier | expr '%' expr 6517dd7cddfSDavid du Colombier { 6527dd7cddfSDavid du Colombier $$ = $1 % $3; 6537dd7cddfSDavid du Colombier } 6547dd7cddfSDavid du Colombier | expr '<' '<' expr 6557dd7cddfSDavid du Colombier { 6567dd7cddfSDavid du Colombier $$ = $1 << $4; 6577dd7cddfSDavid du Colombier } 6587dd7cddfSDavid du Colombier | expr '>' '>' expr 6597dd7cddfSDavid du Colombier { 6607dd7cddfSDavid du Colombier $$ = $1 >> $4; 6617dd7cddfSDavid du Colombier } 6627dd7cddfSDavid du Colombier | expr '&' expr 6637dd7cddfSDavid du Colombier { 6647dd7cddfSDavid du Colombier $$ = $1 & $3; 6657dd7cddfSDavid du Colombier } 6667dd7cddfSDavid du Colombier | expr '^' expr 6677dd7cddfSDavid du Colombier { 6687dd7cddfSDavid du Colombier $$ = $1 ^ $3; 6697dd7cddfSDavid du Colombier } 6707dd7cddfSDavid du Colombier | expr '|' expr 6717dd7cddfSDavid du Colombier { 6727dd7cddfSDavid du Colombier $$ = $1 | $3; 6737dd7cddfSDavid du Colombier } 674