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> LTYPEL LTYPEM LTYPEN LTYPEBX
23 %token <lval> LCONST LSP LSB LFP LPC
24 %token <lval> LTYPEX LR LREG LF LFREG LC LCREG LPSR LFCR
25 %token <lval> LCOND LS LAT
28 %token <sym> LNAME LLAB LVAR
29 %type <lval> con expr oexpr pointer offset sreg spreg creg
30 %type <lval> rcon cond reglist
31 %type <gen> gen rel reg regreg freg shift fcon frcon
32 %type <gen> imm ximm name oreg ireg nireg ioreg imsr
41 yyerror("redeclaration of %s", $1->name);
59 yyerror("redeclaration of %s", $1->name);
70 LTYPE1 cond imsr ',' spreg ',' reg
72 outcode($1, $2, &$3, $5, &$7);
74 | LTYPE1 cond imsr ',' spreg ','
76 outcode($1, $2, &$3, $5, &nullgen);
78 | LTYPE1 cond imsr ',' reg
80 outcode($1, $2, &$3, NREG, &$5);
85 | LTYPE2 cond imsr ',' reg
87 outcode($1, $2, &$3, NREG, &$5);
92 | LTYPE3 cond gen ',' gen
94 outcode($1, $2, &$3, NREG, &$5);
99 | LTYPE4 cond comma rel
101 outcode($1, $2, &nullgen, NREG, &$4);
103 | LTYPE4 cond comma nireg
105 outcode($1, $2, &nullgen, NREG, &$4);
112 outcode($1, Always, &nullgen, NREG, &$3);
119 outcode($1, Always, &nullgen, NREG, &$3);
124 | LTYPE6 cond comma gen
126 outcode($1, $2, &nullgen, NREG, &$4);
131 | LTYPE7 cond imsr ',' spreg comma
133 outcode($1, $2, &$3, $5, &nullgen);
138 | LTYPE8 cond ioreg ',' '[' reglist ']'
145 outcode($1, $2, &$3, NREG, &g);
147 | LTYPE8 cond '[' reglist ']' ',' ioreg
154 outcode($1, $2, &g, NREG, &$7);
159 | LTYPE9 cond reg ',' ireg ',' reg
161 outcode($1, $2, &$5, $3.reg, &$7);
163 | LTYPE9 cond reg ',' ireg comma
165 outcode($1, $2, &$5, $3.reg, &$3);
167 | LTYPE9 cond comma ireg ',' reg
169 outcode($1, $2, &$4, $6.reg, &$6);
176 outcode($1, $2, &nullgen, NREG, &nullgen);
181 | LTYPEB name ',' imm
183 outcode($1, Always, &$2, NREG, &$4);
185 | LTYPEB name ',' con ',' imm
187 outcode($1, Always, &$2, $4, &$6);
192 | LTYPEC name '/' con ',' ximm
194 outcode($1, Always, &$2, $4, &$6);
199 | LTYPED cond reg comma
201 outcode($1, $2, &$3, NREG, &nullgen);
208 outcode($1, Always, &nullgen, NREG, &$3);
211 * floating-point coprocessor
213 | LTYPEI cond freg ',' freg
215 outcode($1, $2, &$3, NREG, &$5);
217 | LTYPEK cond frcon ',' freg
219 outcode($1, $2, &$3, NREG, &$5);
221 | LTYPEK cond frcon ',' LFREG ',' freg
223 outcode($1, $2, &$3, $5, &$7);
225 | LTYPEL cond freg ',' freg comma
227 outcode($1, $2, &$3, $5.reg, &nullgen);
232 | LTYPEJ cond con ',' expr ',' spreg ',' creg ',' creg oexpr
239 (0xe << 24) | /* opcode */
240 ($1 << 20) | /* MCR/MRC */
241 ($2 << 28) | /* scond */
242 (($3 & 15) << 8) | /* coprocessor number */
243 (($5 & 7) << 21) | /* coprocessor operation */
244 (($7 & 15) << 12) | /* arm register */
245 (($9 & 15) << 16) | /* Crn */
246 (($11 & 15) << 0) | /* Crm */
247 (($12 & 7) << 5) | /* coprocessor information */
248 (1<<4); /* must be set */
249 outcode(AWORD, Always, &nullgen, NREG, &g);
254 | LTYPEM cond reg ',' reg ',' regreg
256 outcode($1, $2, &$3, $5.reg, &$7);
261 | LTYPEN cond reg ',' reg ',' reg ',' spreg
265 outcode($1, $2, &$3, $5.reg, &$7);
272 outcode($1, Always, &nullgen, NREG, &nullgen);
281 $$ = ($1 & ~C_SCOND) | $2;
302 yyerror("undefined label: %s", $1->name);
312 $$.offset = $1->value + $2;
335 memcpy($$.sval, $2, sizeof($$.sval));
362 for(i=$1; i<=$3; i++)
364 for(i=$3; i<=$1; i++)
367 | spreg comma reglist
376 | shift '(' spreg ')'
407 if($1.name != D_EXTERN && $1.name != D_STATIC) {
461 '(' spreg ',' spreg ')'
474 $$.offset = $1 | $4 | (0 << 5);
480 $$.offset = $1 | $4 | (1 << 5);
486 $$.offset = $1 | $4 | (2 << 5);
492 $$.offset = $1 | $4 | (3 << 5);
498 if($$ < 0 || $$ >= 16)
499 print("register value out of range\n");
500 $$ = (($1&15) << 8) | (1 << 4);
504 if($$ < 0 || $$ >= 32)
505 print("shift value out of range\n");
517 if($3 < 0 || $3 >= NREG)
518 print("register value out of range\n");
533 if($3 < 0 || $3 >= NREG)
534 print("register value out of range\n");
565 | LNAME offset '(' pointer ')'
573 | LNAME '<' '>' offset '(' LSB ')'