17edc7532SDavid du Colombier %{ 27edc7532SDavid du Colombier #include "a.h" 37edc7532SDavid du Colombier %} 47edc7532SDavid du Colombier %union 57edc7532SDavid du Colombier { 67edc7532SDavid du Colombier Sym *sym; 77edc7532SDavid du Colombier vlong lval; 87edc7532SDavid du Colombier double dval; 97edc7532SDavid du Colombier char sval[8]; 107edc7532SDavid du Colombier Gen gen; 117edc7532SDavid du Colombier } 127edc7532SDavid du Colombier %left '|' 137edc7532SDavid du Colombier %left '^' 147edc7532SDavid du Colombier %left '&' 157edc7532SDavid du Colombier %left '<' '>' 167edc7532SDavid du Colombier %left '+' '-' 177edc7532SDavid du Colombier %left '*' '/' '%' 187edc7532SDavid du Colombier %token <lval> LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5 197edc7532SDavid du Colombier %token <lval> LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA 207edc7532SDavid du Colombier %token <lval> LTYPEB LTYPEC LTYPED LTYPEE LTYPEF 217edc7532SDavid du Colombier %token <lval> LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK 227edc7532SDavid du Colombier %token <lval> LCONST LSP LSB LFP LPC LHI LLO LMREG 237edc7532SDavid du Colombier %token <lval> LTYPEX LREG LFREG LFCREG LR LM LF 247edc7532SDavid du Colombier %token <lval> LFCR LSCHED 257edc7532SDavid du Colombier %token <dval> LFCONST 267edc7532SDavid du Colombier %token <sval> LSCONST 277edc7532SDavid du Colombier %token <lval> LVCONST 287edc7532SDavid du Colombier %token <sym> LNAME LLAB LVAR 297edc7532SDavid du Colombier %type <lval> con expr pointer offset sreg 307edc7532SDavid du Colombier %type <gen> gen vgen lgen vlgen rel reg freg mreg fcreg 317edc7532SDavid du Colombier %type <gen> imm ximm ireg name oreg imr nireg fgen 327edc7532SDavid du Colombier %% 337edc7532SDavid du Colombier prog: 347edc7532SDavid du Colombier | prog line 357edc7532SDavid du Colombier 367edc7532SDavid du Colombier line: 377edc7532SDavid du Colombier LLAB ':' 387edc7532SDavid du Colombier { 397edc7532SDavid du Colombier if($1->value != pc) 407edc7532SDavid du Colombier yyerror("redeclaration of %s", $1->name); 417edc7532SDavid du Colombier $1->value = pc; 427edc7532SDavid du Colombier } 437edc7532SDavid du Colombier line 447edc7532SDavid du Colombier | LNAME ':' 457edc7532SDavid du Colombier { 467edc7532SDavid du Colombier $1->type = LLAB; 477edc7532SDavid du Colombier $1->value = pc; 487edc7532SDavid du Colombier } 497edc7532SDavid du Colombier line 507edc7532SDavid du Colombier | LNAME '=' expr ';' 517edc7532SDavid du Colombier { 527edc7532SDavid du Colombier $1->type = LVAR; 537edc7532SDavid du Colombier $1->value = $3; 547edc7532SDavid du Colombier } 557edc7532SDavid du Colombier | LVAR '=' expr ';' 567edc7532SDavid du Colombier { 577edc7532SDavid du Colombier if($1->value != $3) 587edc7532SDavid du Colombier yyerror("redeclaration of %s", $1->name); 597edc7532SDavid du Colombier $1->value = $3; 607edc7532SDavid du Colombier } 617edc7532SDavid du Colombier | LSCHED ';' 627edc7532SDavid du Colombier { 637edc7532SDavid du Colombier nosched = $1; 647edc7532SDavid du Colombier } 657edc7532SDavid du Colombier | ';' 667edc7532SDavid du Colombier | inst ';' 677edc7532SDavid du Colombier | error ';' 687edc7532SDavid du Colombier 697edc7532SDavid du Colombier inst: 707edc7532SDavid du Colombier /* 717edc7532SDavid du Colombier * Immed-type 727edc7532SDavid du Colombier */ 737edc7532SDavid du Colombier LTYPE1 imr ',' sreg ',' reg 747edc7532SDavid du Colombier { 757edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 767edc7532SDavid du Colombier } 777edc7532SDavid du Colombier | LTYPE1 imr ',' reg 787edc7532SDavid du Colombier { 797edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 807edc7532SDavid du Colombier } 817edc7532SDavid du Colombier /* 827edc7532SDavid du Colombier * NOR 837edc7532SDavid du Colombier */ 847edc7532SDavid du Colombier | LTYPE2 imr ',' sreg ',' imr 857edc7532SDavid du Colombier { 867edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 877edc7532SDavid du Colombier } 887edc7532SDavid du Colombier | LTYPE2 imr ',' imr 897edc7532SDavid du Colombier { 907edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 917edc7532SDavid du Colombier } 927edc7532SDavid du Colombier /* 937edc7532SDavid du Colombier * LOAD/STORE, but not MOVW 947edc7532SDavid du Colombier */ 957edc7532SDavid du Colombier | LTYPE3 lgen ',' gen 967edc7532SDavid du Colombier { 977edc7532SDavid du Colombier if(!isreg(&$2) && !isreg(&$4)) 987edc7532SDavid du Colombier print("one side must be register\n"); 997edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1007edc7532SDavid du Colombier } 1017edc7532SDavid du Colombier /* 1027edc7532SDavid du Colombier * SPECIAL 1037edc7532SDavid du Colombier */ 1047edc7532SDavid du Colombier | LTYPE4 comma 1057edc7532SDavid du Colombier { 1067edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 1077edc7532SDavid du Colombier } 1087edc7532SDavid du Colombier /* 1097edc7532SDavid du Colombier * MOVW 1107edc7532SDavid du Colombier */ 1117edc7532SDavid du Colombier | LTYPE5 vlgen ',' vgen 1127edc7532SDavid du Colombier { 1137edc7532SDavid du Colombier if(!isreg(&$2) && !isreg(&$4)) 1147edc7532SDavid du Colombier print("one side must be register\n"); 1157edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1167edc7532SDavid du Colombier } 1177edc7532SDavid du Colombier /* 1187edc7532SDavid du Colombier * MUL/DIV 1197edc7532SDavid du Colombier */ 1207edc7532SDavid du Colombier | LTYPE6 reg ',' sreg comma 1217edc7532SDavid du Colombier { 1227edc7532SDavid du Colombier outcode($1, &$2, $4, &nullgen); 1237edc7532SDavid du Colombier } 1247edc7532SDavid du Colombier | LTYPE6 reg ',' sreg ',' reg 1257edc7532SDavid du Colombier { 1267edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 1277edc7532SDavid du Colombier } 1287edc7532SDavid du Colombier /* 1297edc7532SDavid du Colombier * JMP/JAL 1307edc7532SDavid du Colombier */ 1317edc7532SDavid du Colombier | LTYPE7 comma rel 1327edc7532SDavid du Colombier { 1337edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 1347edc7532SDavid du Colombier } 1357edc7532SDavid du Colombier | LTYPE7 comma nireg 1367edc7532SDavid du Colombier { 1377edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 1387edc7532SDavid du Colombier } 1397edc7532SDavid du Colombier | LTYPE8 comma rel 1407edc7532SDavid du Colombier { 1417edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 1427edc7532SDavid du Colombier } 1437edc7532SDavid du Colombier | LTYPE8 comma nireg 1447edc7532SDavid du Colombier { 1457edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 1467edc7532SDavid du Colombier } 1477edc7532SDavid du Colombier | LTYPE8 sreg ',' nireg 1487edc7532SDavid du Colombier { 1497edc7532SDavid du Colombier outcode($1, &nullgen, $2, &$4); 1507edc7532SDavid du Colombier } 1517edc7532SDavid du Colombier /* 1527edc7532SDavid du Colombier * BEQ/BNE 1537edc7532SDavid du Colombier */ 1547edc7532SDavid du Colombier | LTYPE9 gen ',' rel 1557edc7532SDavid du Colombier { 1567edc7532SDavid du Colombier if(!isreg(&$2)) 1577edc7532SDavid du Colombier print("left side must be register\n"); 1587edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1597edc7532SDavid du Colombier } 1607edc7532SDavid du Colombier | LTYPE9 gen ',' sreg ',' rel 1617edc7532SDavid du Colombier { 1627edc7532SDavid du Colombier if(!isreg(&$2)) 1637edc7532SDavid du Colombier print("left side must be register\n"); 1647edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 1657edc7532SDavid du Colombier } 1667edc7532SDavid du Colombier /* 1677edc7532SDavid du Colombier * B-other 1687edc7532SDavid du Colombier */ 1697edc7532SDavid du Colombier | LTYPEA gen ',' rel 1707edc7532SDavid du Colombier { 1717edc7532SDavid du Colombier if(!isreg(&$2)) 1727edc7532SDavid du Colombier print("left side must be register\n"); 1737edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1747edc7532SDavid du Colombier } 1757edc7532SDavid du Colombier /* 1767edc7532SDavid du Colombier * TEXT/GLOBL 1777edc7532SDavid du Colombier */ 1787edc7532SDavid du Colombier | LTYPEB name ',' imm 1797edc7532SDavid du Colombier { 1807edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1817edc7532SDavid du Colombier } 1827edc7532SDavid du Colombier | LTYPEB name ',' con ',' imm 1837edc7532SDavid du Colombier { 1847edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 1857edc7532SDavid du Colombier } 1867edc7532SDavid du Colombier /* 1877edc7532SDavid du Colombier * DATA 1887edc7532SDavid du Colombier */ 1897edc7532SDavid du Colombier | LTYPEC name '/' con ',' ximm 1907edc7532SDavid du Colombier { 1917edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 1927edc7532SDavid du Colombier } 1937edc7532SDavid du Colombier /* 1947edc7532SDavid du Colombier * floating-type 1957edc7532SDavid du Colombier */ 1967edc7532SDavid du Colombier | LTYPED freg ',' freg 1977edc7532SDavid du Colombier { 1987edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 1997edc7532SDavid du Colombier } 2007edc7532SDavid du Colombier | LTYPEE freg ',' freg 2017edc7532SDavid du Colombier { 2027edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 2037edc7532SDavid du Colombier } 2047edc7532SDavid du Colombier | LTYPEE freg ',' LFREG ',' freg 2057edc7532SDavid du Colombier { 2067edc7532SDavid du Colombier outcode($1, &$2, $4, &$6); 2077edc7532SDavid du Colombier } 2087edc7532SDavid du Colombier | LTYPEF freg ',' LFREG comma 2097edc7532SDavid du Colombier { 2107edc7532SDavid du Colombier outcode($1, &$2, $4, &nullgen); 2117edc7532SDavid du Colombier } 2127edc7532SDavid du Colombier /* 2137edc7532SDavid du Colombier * coprocessor branch 2147edc7532SDavid du Colombier */ 2157edc7532SDavid du Colombier | LTYPEG comma rel 2167edc7532SDavid du Colombier { 2177edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2187edc7532SDavid du Colombier } 2197edc7532SDavid du Colombier /* 2207edc7532SDavid du Colombier * word 2217edc7532SDavid du Colombier */ 2227edc7532SDavid du Colombier | LTYPEH comma ximm 2237edc7532SDavid du Colombier { 2247edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2257edc7532SDavid du Colombier } 2267edc7532SDavid du Colombier /* 2277edc7532SDavid du Colombier * NOP 2287edc7532SDavid du Colombier */ 2297edc7532SDavid du Colombier | LTYPEI comma 2307edc7532SDavid du Colombier { 2317edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 2327edc7532SDavid du Colombier } 2337edc7532SDavid du Colombier | LTYPEI ',' vgen 2347edc7532SDavid du Colombier { 2357edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &$3); 2367edc7532SDavid du Colombier } 2377edc7532SDavid du Colombier | LTYPEI vgen comma 2387edc7532SDavid du Colombier { 2397edc7532SDavid du Colombier outcode($1, &$2, NREG, &nullgen); 2407edc7532SDavid du Colombier } 2417edc7532SDavid du Colombier /* 2427edc7532SDavid du Colombier * BREAK -- overloaded with CACHE opcode 2437edc7532SDavid du Colombier */ 2447edc7532SDavid du Colombier | LTYPEJ comma 2457edc7532SDavid du Colombier { 2467edc7532SDavid du Colombier outcode($1, &nullgen, NREG, &nullgen); 2477edc7532SDavid du Colombier } 2487edc7532SDavid du Colombier | LTYPEJ vgen ',' vgen 2497edc7532SDavid du Colombier { 2507edc7532SDavid du Colombier outcode($1, &$2, NREG, &$4); 2517edc7532SDavid du Colombier } 2527edc7532SDavid du Colombier 2537edc7532SDavid du Colombier comma: 2547edc7532SDavid du Colombier | ',' 2557edc7532SDavid du Colombier 2567edc7532SDavid du Colombier rel: 2577edc7532SDavid du Colombier con '(' LPC ')' 2587edc7532SDavid du Colombier { 2597edc7532SDavid du Colombier $$ = nullgen; 2607edc7532SDavid du Colombier $$.type = D_BRANCH; 2617edc7532SDavid du Colombier $$.offset = $1 + pc; 2627edc7532SDavid du Colombier } 2637edc7532SDavid du Colombier | LNAME offset 2647edc7532SDavid du Colombier { 2657edc7532SDavid du Colombier $$ = nullgen; 2667edc7532SDavid du Colombier if(pass == 2) 2677edc7532SDavid du Colombier yyerror("undefined label: %s", $1->name); 2687edc7532SDavid du Colombier $$.type = D_BRANCH; 2697edc7532SDavid du Colombier $$.sym = $1; 2707edc7532SDavid du Colombier $$.offset = $2; 2717edc7532SDavid du Colombier } 2727edc7532SDavid du Colombier | LLAB offset 2737edc7532SDavid du Colombier { 2747edc7532SDavid du Colombier $$ = nullgen; 2757edc7532SDavid du Colombier $$.type = D_BRANCH; 2767edc7532SDavid du Colombier $$.sym = $1; 2777edc7532SDavid du Colombier $$.offset = $1->value + $2; 2787edc7532SDavid du Colombier } 2797edc7532SDavid du Colombier 2807edc7532SDavid du Colombier vlgen: 2817edc7532SDavid du Colombier lgen 2827edc7532SDavid du Colombier | fgen 2837edc7532SDavid du Colombier | mreg 2847edc7532SDavid du Colombier | fcreg 2857edc7532SDavid du Colombier | LHI 2867edc7532SDavid du Colombier { 2877edc7532SDavid du Colombier $$ = nullgen; 2887edc7532SDavid du Colombier $$.type = D_HI; 2897edc7532SDavid du Colombier } 2907edc7532SDavid du Colombier | LLO 2917edc7532SDavid du Colombier { 2927edc7532SDavid du Colombier $$ = nullgen; 2937edc7532SDavid du Colombier $$.type = D_LO; 2947edc7532SDavid du Colombier } 2957edc7532SDavid du Colombier 2967edc7532SDavid du Colombier vgen: 2977edc7532SDavid du Colombier gen 2987edc7532SDavid du Colombier | fgen 2997edc7532SDavid du Colombier | mreg 3007edc7532SDavid du Colombier | fcreg 3017edc7532SDavid du Colombier | LHI 3027edc7532SDavid du Colombier { 3037edc7532SDavid du Colombier $$ = nullgen; 3047edc7532SDavid du Colombier $$.type = D_HI; 3057edc7532SDavid du Colombier } 3067edc7532SDavid du Colombier | LLO 3077edc7532SDavid du Colombier { 3087edc7532SDavid du Colombier $$ = nullgen; 3097edc7532SDavid du Colombier $$.type = D_LO; 3107edc7532SDavid du Colombier } 3117edc7532SDavid du Colombier 3127edc7532SDavid du Colombier lgen: 3137edc7532SDavid du Colombier gen 3147edc7532SDavid du Colombier | ximm 3157edc7532SDavid du Colombier 3167edc7532SDavid du Colombier fgen: 3177edc7532SDavid du Colombier freg 3187edc7532SDavid du Colombier 3197edc7532SDavid du Colombier mreg: 3207edc7532SDavid du Colombier LMREG 3217edc7532SDavid du Colombier { 3227edc7532SDavid du Colombier $$ = nullgen; 3237edc7532SDavid du Colombier $$.type = D_MREG; 3247edc7532SDavid du Colombier $$.reg = $1; 3257edc7532SDavid du Colombier } 3267edc7532SDavid du Colombier | LM '(' con ')' 3277edc7532SDavid du Colombier { 3287edc7532SDavid du Colombier $$ = nullgen; 3297edc7532SDavid du Colombier $$.type = D_MREG; 3307edc7532SDavid du Colombier $$.reg = $3; 3317edc7532SDavid du Colombier } 3327edc7532SDavid du Colombier 3337edc7532SDavid du Colombier fcreg: 3347edc7532SDavid du Colombier LFCREG 3357edc7532SDavid du Colombier { 3367edc7532SDavid du Colombier $$ = nullgen; 3377edc7532SDavid du Colombier $$.type = D_FCREG; 3387edc7532SDavid du Colombier $$.reg = $1; 3397edc7532SDavid du Colombier } 3407edc7532SDavid du Colombier | LFCR '(' con ')' 3417edc7532SDavid du Colombier { 3427edc7532SDavid du Colombier $$ = nullgen; 3437edc7532SDavid du Colombier $$.type = D_FCREG; 3447edc7532SDavid du Colombier $$.reg = $3; 3457edc7532SDavid du Colombier } 3467edc7532SDavid du Colombier 3477edc7532SDavid du Colombier freg: 3487edc7532SDavid du Colombier LFREG 3497edc7532SDavid du Colombier { 3507edc7532SDavid du Colombier $$ = nullgen; 3517edc7532SDavid du Colombier $$.type = D_FREG; 3527edc7532SDavid du Colombier $$.reg = $1; 3537edc7532SDavid du Colombier } 3547edc7532SDavid du Colombier | LF '(' con ')' 3557edc7532SDavid du Colombier { 3567edc7532SDavid du Colombier $$ = nullgen; 3577edc7532SDavid du Colombier $$.type = D_FREG; 3587edc7532SDavid du Colombier $$.reg = $3; 3597edc7532SDavid du Colombier } 3607edc7532SDavid du Colombier 3617edc7532SDavid du Colombier ximm: '$' con 3627edc7532SDavid du Colombier { 3637edc7532SDavid du Colombier $$ = nullgen; 364*f8bc6aafSDavid du Colombier if(isvconst($2)) 3657edc7532SDavid du Colombier $$.type = D_VCONST; 366*f8bc6aafSDavid du Colombier else 3677edc7532SDavid du Colombier $$.type = D_CONST; 3687edc7532SDavid du Colombier $$.offset = $2; 3697edc7532SDavid du Colombier } 3707edc7532SDavid du Colombier | '$' oreg 3717edc7532SDavid du Colombier { 3727edc7532SDavid du Colombier $$ = $2; 3737edc7532SDavid du Colombier $$.type = D_CONST; 3747edc7532SDavid du Colombier } 3757edc7532SDavid du Colombier | '$' '*' '$' oreg 3767edc7532SDavid du Colombier { 3777edc7532SDavid du Colombier $$ = $4; 3787edc7532SDavid du Colombier $$.type = D_OCONST; 3797edc7532SDavid du Colombier } 3807edc7532SDavid du Colombier | '$' LSCONST 3817edc7532SDavid du Colombier { 3827edc7532SDavid du Colombier $$ = nullgen; 3837edc7532SDavid du Colombier $$.type = D_SCONST; 3847edc7532SDavid du Colombier memcpy($$.sval, $2, sizeof($$.sval)); 3857edc7532SDavid du Colombier } 3867edc7532SDavid du Colombier | '$' LFCONST 3877edc7532SDavid du Colombier { 3887edc7532SDavid du Colombier $$ = nullgen; 3897edc7532SDavid du Colombier $$.type = D_FCONST; 3907edc7532SDavid du Colombier $$.dval = $2; 3917edc7532SDavid du Colombier } 3927edc7532SDavid du Colombier | '$' '-' LFCONST 3937edc7532SDavid du Colombier { 3947edc7532SDavid du Colombier $$ = nullgen; 3957edc7532SDavid du Colombier $$.type = D_FCONST; 3967edc7532SDavid du Colombier $$.dval = -$3; 3977edc7532SDavid du Colombier } 3987edc7532SDavid du Colombier 3997edc7532SDavid du Colombier nireg: 4007edc7532SDavid du Colombier ireg 4017edc7532SDavid du Colombier | con ireg 4027edc7532SDavid du Colombier { 4037edc7532SDavid du Colombier if($1 != 0) 4047edc7532SDavid du Colombier yyerror("offset must be zero"); 4057edc7532SDavid du Colombier $$ = $2; 4067edc7532SDavid du Colombier } 4077edc7532SDavid du Colombier | name 4087edc7532SDavid du Colombier { 4097edc7532SDavid du Colombier $$ = $1; 4107edc7532SDavid du Colombier if($1.name != D_EXTERN && $1.name != D_STATIC) { 4117edc7532SDavid du Colombier } 4127edc7532SDavid du Colombier } 4137edc7532SDavid du Colombier 4147edc7532SDavid du Colombier ireg: 4157edc7532SDavid du Colombier '(' sreg ')' 4167edc7532SDavid du Colombier { 4177edc7532SDavid du Colombier $$ = nullgen; 4187edc7532SDavid du Colombier $$.type = D_OREG; 4197edc7532SDavid du Colombier $$.reg = $2; 4207edc7532SDavid du Colombier $$.offset = 0; 4217edc7532SDavid du Colombier } 4227edc7532SDavid du Colombier 4237edc7532SDavid du Colombier gen: 4247edc7532SDavid du Colombier reg 4257edc7532SDavid du Colombier | con 4267edc7532SDavid du Colombier { 4277edc7532SDavid du Colombier $$ = nullgen; 4287edc7532SDavid du Colombier $$.type = D_OREG; 4297edc7532SDavid du Colombier $$.offset = $1; 4307edc7532SDavid du Colombier } 4317edc7532SDavid du Colombier | oreg 4327edc7532SDavid du Colombier 4337edc7532SDavid du Colombier oreg: 4347edc7532SDavid du Colombier name 4357edc7532SDavid du Colombier | name '(' sreg ')' 4367edc7532SDavid du Colombier { 4377edc7532SDavid du Colombier $$ = $1; 4387edc7532SDavid du Colombier $$.type = D_OREG; 4397edc7532SDavid du Colombier $$.reg = $3; 4407edc7532SDavid du Colombier } 4417edc7532SDavid du Colombier | '(' sreg ')' 4427edc7532SDavid du Colombier { 4437edc7532SDavid du Colombier $$ = nullgen; 4447edc7532SDavid du Colombier $$.type = D_OREG; 4457edc7532SDavid du Colombier $$.reg = $2; 4467edc7532SDavid du Colombier $$.offset = 0; 4477edc7532SDavid du Colombier } 4487edc7532SDavid du Colombier | con '(' sreg ')' 4497edc7532SDavid du Colombier { 4507edc7532SDavid du Colombier $$ = nullgen; 4517edc7532SDavid du Colombier $$.type = D_OREG; 4527edc7532SDavid du Colombier $$.reg = $3; 4537edc7532SDavid du Colombier $$.offset = $1; 4547edc7532SDavid du Colombier } 4557edc7532SDavid du Colombier 4567edc7532SDavid du Colombier imr: 4577edc7532SDavid du Colombier reg 4587edc7532SDavid du Colombier | imm 4597edc7532SDavid du Colombier 4607edc7532SDavid du Colombier imm: '$' con 4617edc7532SDavid du Colombier { 4627edc7532SDavid du Colombier $$ = nullgen; 463*f8bc6aafSDavid du Colombier if(isvconst($2)) 4647edc7532SDavid du Colombier $$.type = D_VCONST; 465*f8bc6aafSDavid du Colombier else 4667edc7532SDavid du Colombier $$.type = D_CONST; 4677edc7532SDavid du Colombier $$.offset = $2; 4687edc7532SDavid du Colombier } 4697edc7532SDavid du Colombier 4707edc7532SDavid du Colombier reg: 4717edc7532SDavid du Colombier sreg 4727edc7532SDavid du Colombier { 4737edc7532SDavid du Colombier $$ = nullgen; 4747edc7532SDavid du Colombier $$.type = D_REG; 4757edc7532SDavid du Colombier $$.reg = $1; 4767edc7532SDavid du Colombier } 4777edc7532SDavid du Colombier 4787edc7532SDavid du Colombier sreg: 4797edc7532SDavid du Colombier LREG 4807edc7532SDavid du Colombier | LR '(' con ')' 4817edc7532SDavid du Colombier { 4827edc7532SDavid du Colombier if($$ < 0 || $$ >= NREG) 4837edc7532SDavid du Colombier print("register value out of range\n"); 4847edc7532SDavid du Colombier $$ = $3; 4857edc7532SDavid du Colombier } 4867edc7532SDavid du Colombier 4877edc7532SDavid du Colombier name: 4887edc7532SDavid du Colombier con '(' pointer ')' 4897edc7532SDavid du Colombier { 4907edc7532SDavid du Colombier $$ = nullgen; 4917edc7532SDavid du Colombier $$.type = D_OREG; 4927edc7532SDavid du Colombier $$.name = $3; 4937edc7532SDavid du Colombier $$.sym = S; 4947edc7532SDavid du Colombier $$.offset = $1; 4957edc7532SDavid du Colombier } 4967edc7532SDavid du Colombier | LNAME offset '(' pointer ')' 4977edc7532SDavid du Colombier { 4987edc7532SDavid du Colombier $$ = nullgen; 4997edc7532SDavid du Colombier $$.type = D_OREG; 5007edc7532SDavid du Colombier $$.name = $4; 5017edc7532SDavid du Colombier $$.sym = $1; 5027edc7532SDavid du Colombier $$.offset = $2; 5037edc7532SDavid du Colombier } 5047edc7532SDavid du Colombier | LNAME '<' '>' offset '(' LSB ')' 5057edc7532SDavid du Colombier { 5067edc7532SDavid du Colombier $$ = nullgen; 5077edc7532SDavid du Colombier $$.type = D_OREG; 5087edc7532SDavid du Colombier $$.name = D_STATIC; 5097edc7532SDavid du Colombier $$.sym = $1; 5107edc7532SDavid du Colombier $$.offset = $4; 5117edc7532SDavid du Colombier } 5127edc7532SDavid du Colombier 5137edc7532SDavid du Colombier offset: 5147edc7532SDavid du Colombier { 5157edc7532SDavid du Colombier $$ = 0; 5167edc7532SDavid du Colombier } 5177edc7532SDavid du Colombier | '+' con 5187edc7532SDavid du Colombier { 5197edc7532SDavid du Colombier $$ = $2; 5207edc7532SDavid du Colombier } 5217edc7532SDavid du Colombier | '-' con 5227edc7532SDavid du Colombier { 5237edc7532SDavid du Colombier $$ = -$2; 5247edc7532SDavid du Colombier } 5257edc7532SDavid du Colombier 5267edc7532SDavid du Colombier pointer: 5277edc7532SDavid du Colombier LSB 5287edc7532SDavid du Colombier | LSP 5297edc7532SDavid du Colombier | LFP 5307edc7532SDavid du Colombier 5317edc7532SDavid du Colombier con: 5327edc7532SDavid du Colombier LCONST 5337edc7532SDavid du Colombier | LVAR 5347edc7532SDavid du Colombier { 5357edc7532SDavid du Colombier $$ = $1->value; 5367edc7532SDavid du Colombier } 5377edc7532SDavid du Colombier | '-' con 5387edc7532SDavid du Colombier { 5397edc7532SDavid du Colombier $$ = -$2; 5407edc7532SDavid du Colombier } 5417edc7532SDavid du Colombier | '+' con 5427edc7532SDavid du Colombier { 5437edc7532SDavid du Colombier $$ = $2; 5447edc7532SDavid du Colombier } 5457edc7532SDavid du Colombier | '~' con 5467edc7532SDavid du Colombier { 5477edc7532SDavid du Colombier $$ = ~$2; 5487edc7532SDavid du Colombier } 5497edc7532SDavid du Colombier | '(' expr ')' 5507edc7532SDavid du Colombier { 5517edc7532SDavid du Colombier $$ = $2; 5527edc7532SDavid du Colombier } 5537edc7532SDavid du Colombier 5547edc7532SDavid du Colombier expr: 5557edc7532SDavid du Colombier con 5567edc7532SDavid du Colombier | expr '+' expr 5577edc7532SDavid du Colombier { 5587edc7532SDavid du Colombier $$ = $1 + $3; 5597edc7532SDavid du Colombier } 5607edc7532SDavid du Colombier | expr '-' expr 5617edc7532SDavid du Colombier { 5627edc7532SDavid du Colombier $$ = $1 - $3; 5637edc7532SDavid du Colombier } 5647edc7532SDavid du Colombier | expr '*' expr 5657edc7532SDavid du Colombier { 5667edc7532SDavid du Colombier $$ = $1 * $3; 5677edc7532SDavid du Colombier } 5687edc7532SDavid du Colombier | expr '/' expr 5697edc7532SDavid du Colombier { 5707edc7532SDavid du Colombier $$ = $1 / $3; 5717edc7532SDavid du Colombier } 5727edc7532SDavid du Colombier | expr '%' expr 5737edc7532SDavid du Colombier { 5747edc7532SDavid du Colombier $$ = $1 % $3; 5757edc7532SDavid du Colombier } 5767edc7532SDavid du Colombier | expr '<' '<' expr 5777edc7532SDavid du Colombier { 5787edc7532SDavid du Colombier $$ = $1 << $4; 5797edc7532SDavid du Colombier } 5807edc7532SDavid du Colombier | expr '>' '>' expr 5817edc7532SDavid du Colombier { 5827edc7532SDavid du Colombier $$ = $1 >> $4; 5837edc7532SDavid du Colombier } 5847edc7532SDavid du Colombier | expr '&' expr 5857edc7532SDavid du Colombier { 5867edc7532SDavid du Colombier $$ = $1 & $3; 5877edc7532SDavid du Colombier } 5887edc7532SDavid du Colombier | expr '^' expr 5897edc7532SDavid du Colombier { 5907edc7532SDavid du Colombier $$ = $1 ^ $3; 5917edc7532SDavid du Colombier } 5927edc7532SDavid du Colombier | expr '|' expr 5937edc7532SDavid du Colombier { 5947edc7532SDavid du Colombier $$ = $1 | $3; 5957edc7532SDavid du Colombier } 5967edc7532SDavid du Colombier %% 5977edc7532SDavid du Colombier 5987edc7532SDavid du Colombier int 5997edc7532SDavid du Colombier isvconst(vlong con) 6007edc7532SDavid du Colombier { 601*f8bc6aafSDavid du Colombier long l; 6027edc7532SDavid du Colombier 603*f8bc6aafSDavid du Colombier l = con; 604*f8bc6aafSDavid du Colombier return (vlong)l != con; 6057edc7532SDavid du Colombier } 606