18 %token <lval> LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5
19 %token <lval> LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA
20 %token <lval> LTYPEB LTYPEC LTYPED LTYPEE LTYPEF
21 %token <lval> LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK
22 %token <lval> LCONST LSP LSB LFP LPC LHI LLO LMREG
23 %token <lval> LTYPEX LREG LFREG LFCREG LR LM LF
24 %token <lval> LFCR LSCHED
27 %token <sym> LNAME LLAB LVAR
28 %type <lval> con expr pointer offset sreg
29 %type <gen> gen vgen lgen vlgen rel reg freg mreg fcreg
30 %type <gen> imm ximm ireg name oreg imr nireg fgen
39 yyerror("redeclaration of %s", $1->name);
57 yyerror("redeclaration of %s", $1->name);
72 LTYPE1 imr ',' sreg ',' reg
74 outcode($1, &$2, $4, &$6);
78 outcode($1, &$2, NREG, &$4);
83 | LTYPE2 imr ',' sreg ',' imr
85 outcode($1, &$2, $4, &$6);
89 outcode($1, &$2, NREG, &$4);
92 * LOAD/STORE, but not MOVW
96 if(!isreg(&$2) && !isreg(&$4))
97 print("one side must be register\n");
98 outcode($1, &$2, NREG, &$4);
105 outcode($1, &nullgen, NREG, &nullgen);
110 | LTYPE5 vlgen ',' vgen
112 if(!isreg(&$2) && !isreg(&$4))
113 print("one side must be register\n");
114 outcode($1, &$2, NREG, &$4);
119 | LTYPE6 reg ',' sreg comma
121 outcode($1, &$2, $4, &nullgen);
123 | LTYPE6 reg ',' sreg ',' reg
125 outcode($1, &$2, $4, &$6);
132 outcode($1, &nullgen, NREG, &$3);
136 outcode($1, &nullgen, NREG, &$3);
140 outcode($1, &nullgen, NREG, &$3);
144 outcode($1, &nullgen, NREG, &$3);
146 | LTYPE8 sreg ',' nireg
148 outcode($1, &nullgen, $2, &$4);
156 print("left side must be register\n");
157 outcode($1, &$2, NREG, &$4);
159 | LTYPE9 gen ',' sreg ',' rel
162 print("left side must be register\n");
163 outcode($1, &$2, $4, &$6);
171 print("left side must be register\n");
172 outcode($1, &$2, NREG, &$4);
177 | LTYPEB name ',' imm
179 outcode($1, &$2, NREG, &$4);
181 | LTYPEB name ',' con ',' imm
183 outcode($1, &$2, $4, &$6);
188 | LTYPEC name '/' con ',' ximm
190 outcode($1, &$2, $4, &$6);
195 | LTYPED freg ',' freg
197 outcode($1, &$2, NREG, &$4);
199 | LTYPEE freg ',' freg
201 outcode($1, &$2, NREG, &$4);
203 | LTYPEE freg ',' LFREG ',' freg
205 outcode($1, &$2, $4, &$6);
207 | LTYPEF freg ',' LFREG comma
209 outcode($1, &$2, $4, &nullgen);
216 outcode($1, &nullgen, NREG, &$3);
223 outcode($1, &nullgen, NREG, &$3);
230 outcode($1, &nullgen, NREG, &nullgen);
234 outcode($1, &nullgen, NREG, &$3);
238 outcode($1, &$2, NREG, &nullgen);
241 * BREAK -- overloaded with CACHE opcode
245 outcode($1, &nullgen, NREG, &nullgen);
247 | LTYPEJ vgen ',' vgen
249 outcode($1, &$2, NREG, &$4);
266 yyerror("undefined label: %s", $1->name);
276 $$.offset = $1->value + $2;
380 memcpy($$.sval, $2, sizeof($$.sval));
400 yyerror("offset must be zero");
406 if($1.name != D_EXTERN && $1.name != D_STATIC) {
475 if($$ < 0 || $$ >= NREG)
476 print("register value out of range\n");
489 | LNAME offset '(' pointer ')'
497 | LNAME '<' '>' offset '(' LSB ')'