18 %token <lval> LMOVW LMOVB LABS LLOGW LSHW LADDW LCMP LCROP
19 %token <lval> LBRA LFMOV LFCONV LFCMP LFADD LFMA LTRAP LXORW
20 %token <lval> LNOP LEND LRETT LWORD LTEXT LDATA LRETRN
21 %token <lval> LCONST LSP LSB LFP LPC LCREG LFLUSH
22 %token <lval> LREG LFREG LR LCR LF LFPSCR
23 %token <lval> LLR LCTR LSPR LSPREG LSEG LMSR LDCR
24 %token <lval> LSCHED LXLD LXST LXOP LXMV
25 %token <lval> LRLWM LMOVMW LMOVEM LMOVFL LMTFSB LMA LFMOVX
28 %token <sym> LNAME LLAB LVAR
29 %type <lval> con expr pointer offset sreg
30 %type <gen> addr rreg regaddr name creg freg xlreg lr ctr
31 %type <gen> imm ximm fimm rel psr lcr cbit fpscr fpscrf seg msr mask
40 yyerror("redeclaration of %s", $1->name);
58 yyerror("redeclaration of %s", $1->name);
75 outcode($1, &$2, NREG, &$4);
79 outcode($1, &$2, NREG, &$4);
81 | LMOVW regaddr ',' rreg
83 outcode($1, &$2, NREG, &$4);
87 outcode($1, &$2, NREG, &$4);
91 outcode($1, &$2, NREG, &$4);
93 | LMOVB regaddr ',' rreg
95 outcode($1, &$2, NREG, &$4);
98 * load and store floats
100 | LFMOV addr ',' freg
102 outcode($1, &$2, NREG, &$4);
104 | LFMOV regaddr ',' freg
106 outcode($1, &$2, NREG, &$4);
108 | LFMOV fimm ',' freg
110 outcode($1, &$2, NREG, &$4);
112 | LFMOV freg ',' freg
114 outcode($1, &$2, NREG, &$4);
116 | LFMOV freg ',' addr
118 outcode($1, &$2, NREG, &$4);
120 | LFMOV freg ',' regaddr
122 outcode($1, &$2, NREG, &$4);
125 * load and store floats, indexed only
127 | LFMOVX regaddr ',' freg
129 outcode($1, &$2, NREG, &$4);
131 | LFMOVX freg ',' regaddr
133 outcode($1, &$2, NREG, &$4);
136 * store ints and bytes
138 | LMOVW rreg ',' addr
140 outcode($1, &$2, NREG, &$4);
142 | LMOVW rreg ',' regaddr
144 outcode($1, &$2, NREG, &$4);
146 | LMOVB rreg ',' addr
148 outcode($1, &$2, NREG, &$4);
150 | LMOVB rreg ',' regaddr
152 outcode($1, &$2, NREG, &$4);
157 | LMOVW freg ',' addr
159 outcode($1, &$2, NREG, &$4);
161 | LMOVW freg ',' regaddr
163 outcode($1, &$2, NREG, &$4);
166 * floating point status
168 | LMOVW fpscr ',' freg
170 outcode($1, &$2, NREG, &$4);
172 | LMOVW freg ',' fpscr
174 outcode($1, &$2, NREG, &$4);
176 | LMOVW freg ',' imm ',' fpscr
178 outgcode($1, &$2, NREG, &$4, &$6);
180 | LMOVW fpscr ',' creg
182 outcode($1, &$2, NREG, &$4);
184 | LMOVW imm ',' fpscrf
186 outcode($1, &$2, NREG, &$4);
190 outcode($1, &$2, $4, &nullgen);
193 * field moves (mtcrf)
195 | LMOVW rreg ',' imm ',' lcr
197 outgcode($1, &$2, NREG, &$4, &$6);
199 | LMOVW rreg ',' creg
201 outcode($1, &$2, NREG, &$4);
205 outcode($1, &$2, NREG, &$4);
209 * logical instructions
213 | LADDW rreg ',' sreg ',' rreg
215 outcode($1, &$2, $4, &$6);
217 | LADDW imm ',' sreg ',' rreg
219 outcode($1, &$2, $4, &$6);
221 | LADDW rreg ',' imm ',' rreg
223 outgcode($1, &$2, NREG, &$4, &$6);
225 | LADDW rreg ',' rreg
227 outcode($1, &$2, NREG, &$4);
231 outcode($1, &$2, NREG, &$4);
233 | LLOGW rreg ',' sreg ',' rreg
235 outcode($1, &$2, $4, &$6);
237 | LLOGW rreg ',' rreg
239 outcode($1, &$2, NREG, &$4);
241 | LSHW rreg ',' sreg ',' rreg
243 outcode($1, &$2, $4, &$6);
247 outcode($1, &$2, NREG, &$4);
249 | LSHW imm ',' sreg ',' rreg
251 outcode($1, &$2, $4, &$6);
255 outcode($1, &$2, NREG, &$4);
259 outcode($1, &$2, NREG, &$4);
263 outcode($1, &$2, NREG, &$2);
266 * multiply-accumulate
268 | LMA rreg ',' sreg ',' rreg
270 outcode($1, &$2, $4, &$6);
273 * move immediate: macro for cau+or, addi, addis, and other combinations
277 outcode($1, &$2, NREG, &$4);
279 | LMOVW ximm ',' rreg
281 outcode($1, &$2, NREG, &$4);
284 * condition register operations
286 | LCROP cbit ',' cbit
288 outcode($1, &$2, $4.reg, &$4);
290 | LCROP cbit ',' con ',' cbit
292 outcode($1, &$2, $4, &$6);
295 * condition register moves
296 * move from machine state register
298 | LMOVW creg ',' creg
300 outcode($1, &$2, NREG, &$4);
304 outcode($1, &$2, NREG, &$4);
308 outcode($1, &$2, NREG, &$4);
312 outcode($1, &$2, NREG, &$4);
319 outcode($1, &$2, r, &$4);
326 outcode($1, &$2, r, &$4);
328 | LMOVW xlreg ',' rreg
330 outcode($1, &$2, NREG, &$4);
332 | LMOVW rreg ',' xlreg
334 outcode($1, &$2, NREG, &$4);
338 outcode($1, &$2, NREG, &$4);
342 outcode($1, &$2, NREG, &$4);
345 * branch, branch conditional
346 * branch conditional register
347 * branch conditional to count register
351 outcode($1, &nullgen, NREG, &$2);
355 outcode($1, &nullgen, NREG, &$2);
359 outcode($1, &nullgen, NREG, &$3);
363 outcode($1, &nullgen, NREG, &$3);
367 outcode($1, &nullgen, NREG, &$3);
369 | LBRA ',' '(' xlreg ')'
371 outcode($1, &nullgen, NREG, &$4);
375 outcode($1, &$2, NREG, &$4);
379 outcode($1, &$2, NREG, &$4);
381 | LBRA creg ',' '(' xlreg ')'
383 outcode($1, &$2, NREG, &$5);
387 outcode($1, &nullgen, $2, &$4);
391 outcode($1, &nullgen, $2, &$4);
393 | LBRA con ',' '(' xlreg ')'
395 outcode($1, &nullgen, $2, &$5);
397 | LBRA con ',' con ',' rel
403 outcode($1, &g, $4, &$6);
405 | LBRA con ',' con ',' addr
411 outcode($1, &g, $4, &$6);
413 | LBRA con ',' con ',' '(' xlreg ')'
419 outcode($1, &g, $4, &$7);
424 | LTRAP rreg ',' sreg
426 outcode($1, &$2, $4, &nullgen);
430 outcode($1, &$2, $4, &nullgen);
434 outcode($1, &$2, NREG, &nullgen);
438 outcode($1, &nullgen, NREG, &nullgen);
441 * floating point operate
443 | LFCONV freg ',' freg
445 outcode($1, &$2, NREG, &$4);
447 | LFADD freg ',' freg
449 outcode($1, &$2, NREG, &$4);
451 | LFADD freg ',' freg ',' freg
453 outcode($1, &$2, $4.reg, &$6);
455 | LFMA freg ',' freg ',' freg ',' freg
457 outgcode($1, &$2, $4.reg, &$6, &$8);
459 | LFCMP freg ',' freg
461 outcode($1, &$2, NREG, &$4);
463 | LFCMP freg ',' freg ',' creg
465 outcode($1, &$2, $6.reg, &$4);
472 outcode($1, &$2, NREG, &$4);
476 outcode($1, &$2, NREG, &$4);
478 | LCMP rreg ',' rreg ',' creg
480 outcode($1, &$2, $6.reg, &$4);
482 | LCMP rreg ',' imm ',' creg
484 outcode($1, &$2, $6.reg, &$4);
489 | LRLWM imm ',' rreg ',' imm ',' rreg
491 outgcode($1, &$2, $4.reg, &$6, &$8);
493 | LRLWM imm ',' rreg ',' mask ',' rreg
495 outgcode($1, &$2, $4.reg, &$6, &$8);
497 | LRLWM rreg ',' rreg ',' imm ',' rreg
499 outgcode($1, &$2, $4.reg, &$6, &$8);
501 | LRLWM rreg ',' rreg ',' mask ',' rreg
503 outgcode($1, &$2, $4.reg, &$6, &$8);
506 * load/store multiple
508 | LMOVMW addr ',' rreg
510 outcode($1, &$2, NREG, &$4);
512 | LMOVMW rreg ',' addr
514 outcode($1, &$2, NREG, &$4);
517 * various indexed load/store
518 * indexed unary (eg, cache clear)
520 | LXLD regaddr ',' rreg
522 outcode($1, &$2, NREG, &$4);
524 | LXLD regaddr ',' imm ',' rreg
526 outgcode($1, &$2, NREG, &$4, &$6);
528 | LXST rreg ',' regaddr
530 outcode($1, &$2, NREG, &$4);
532 | LXST rreg ',' imm ',' regaddr
534 outgcode($1, &$2, NREG, &$4, &$6);
536 | LXMV regaddr ',' rreg
538 outcode($1, &$2, NREG, &$4);
540 | LXMV rreg ',' regaddr
542 outcode($1, &$2, NREG, &$4);
546 outcode($1, &$2, NREG, &nullgen);
553 outcode($1, &nullgen, NREG, &nullgen);
557 outcode($1, &$2, NREG, &nullgen);
561 outcode($1, &$2, NREG, &nullgen);
565 outcode($1, &nullgen, NREG, &$3);
569 outcode($1, &nullgen, NREG, &$3);
576 outcode($1, &$2, NREG, &nullgen);
580 outcode($1, &$2, NREG, &nullgen);
587 outcode($1, &nullgen, NREG, &nullgen);
594 outcode($1, &$2, NREG, &$4);
596 | LTEXT name ',' con ',' imm
598 outcode($1, &$2, $4, &$6);
600 | LTEXT name ',' imm ':' imm
602 outgcode($1, &$2, NREG, &$6, &$4);
604 | LTEXT name ',' con ',' imm ':' imm
606 outgcode($1, &$2, $4, &$8, &$6);
611 | LDATA name '/' con ',' imm
613 outcode($1, &$2, $4, &$6);
615 | LDATA name '/' con ',' ximm
617 outcode($1, &$2, $4, &$6);
619 | LDATA name '/' con ',' fimm
621 outcode($1, &$2, $4, &$6);
628 outcode($1, &nullgen, NREG, &nullgen);
642 yyerror("undefined label: %s", $1->name);
652 $$.offset = $1->value + $2;
680 $$.reg = NREG; /* whole register */
729 if($3 < 0 || $3 > 15)
730 yyerror("segment register number out of range");
806 if(mb < 0 || mb > 31 || me < 0 || me > 31){
807 yyerror("illegal mask start/end value(s)");
811 v = ((ulong)~0L>>mb) & (~0L<<(31-me));
813 v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1))));
827 memcpy($$.sval, $2, sizeof($$.sval));
855 if($$ < 0 || $$ >= NREG)
856 print("register value out of range\n");
868 | '(' sreg '+' sreg ')'
896 | LNAME offset '(' pointer ')'
904 | LNAME '<' '>' offset '(' LSB ')'