xref: /plan9-contrib/sys/src/cmd/qa/a.y (revision 6891d8578618fb7ccda4a131c122d4d0e6580c4b)
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	'*' '/' '%'
1880ee5cbfSDavid du Colombier %token	<lval>	LMOVW LMOVB LABS LLOGW LSHW LADDW LCMP LCROP
197dd7cddfSDavid du Colombier %token	<lval>	LBRA LFMOV LFCONV LFCMP LFADD LFMA LTRAP LXORW
207dd7cddfSDavid du Colombier %token	<lval>	LNOP LEND LRETT LWORD LTEXT LDATA LRETRN
217dd7cddfSDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC LCREG LFLUSH
227dd7cddfSDavid du Colombier %token	<lval>	LREG LFREG LR LCR LF LFPSCR
23*6891d857SDavid du Colombier %token	<lval>	LLR LCTR LSPR LSPREG LSEG LMSR LDCR
247dd7cddfSDavid du Colombier %token	<lval>	LSCHED LXLD LXST LXOP LXMV
25*6891d857SDavid du Colombier %token	<lval>	LRLWM LMOVMW LMOVEM LMOVFL LMTFSB LMA LFMOVX
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 pointer offset sreg
307dd7cddfSDavid du Colombier %type	<gen>	addr rreg regaddr name creg freg xlreg lr ctr
317dd7cddfSDavid du Colombier %type	<gen>	imm ximm fimm rel psr lcr cbit fpscr fpscrf seg msr mask
327dd7cddfSDavid du Colombier %%
337dd7cddfSDavid du Colombier prog:
347dd7cddfSDavid du Colombier |	prog line
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier line:
377dd7cddfSDavid du Colombier 	LLAB ':'
387dd7cddfSDavid du Colombier 	{
397dd7cddfSDavid du Colombier 		if($1->value != pc)
407dd7cddfSDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
417dd7cddfSDavid du Colombier 		$1->value = pc;
427dd7cddfSDavid du Colombier 	}
437dd7cddfSDavid du Colombier 	line
447dd7cddfSDavid du Colombier |	LNAME ':'
457dd7cddfSDavid du Colombier 	{
467dd7cddfSDavid du Colombier 		$1->type = LLAB;
477dd7cddfSDavid du Colombier 		$1->value = pc;
487dd7cddfSDavid du Colombier 	}
497dd7cddfSDavid du Colombier 	line
507dd7cddfSDavid du Colombier |	LNAME '=' expr ';'
517dd7cddfSDavid du Colombier 	{
527dd7cddfSDavid du Colombier 		$1->type = LVAR;
537dd7cddfSDavid du Colombier 		$1->value = $3;
547dd7cddfSDavid du Colombier 	}
557dd7cddfSDavid du Colombier |	LVAR '=' expr ';'
567dd7cddfSDavid du Colombier 	{
577dd7cddfSDavid du Colombier 		if($1->value != $3)
587dd7cddfSDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
597dd7cddfSDavid du Colombier 		$1->value = $3;
607dd7cddfSDavid du Colombier 	}
617dd7cddfSDavid du Colombier |	LSCHED ';'
627dd7cddfSDavid du Colombier 	{
637dd7cddfSDavid du Colombier 		nosched = $1;
647dd7cddfSDavid du Colombier 	}
657dd7cddfSDavid du Colombier |	';'
667dd7cddfSDavid du Colombier |	inst ';'
677dd7cddfSDavid du Colombier |	error ';'
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier inst:
707dd7cddfSDavid du Colombier /*
717dd7cddfSDavid du Colombier  * load ints and bytes
727dd7cddfSDavid du Colombier  */
737dd7cddfSDavid du Colombier 	LMOVW rreg ',' rreg
747dd7cddfSDavid du Colombier 	{
757dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
767dd7cddfSDavid du Colombier 	}
777dd7cddfSDavid du Colombier |	LMOVW addr ',' rreg
787dd7cddfSDavid du Colombier 	{
797dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
807dd7cddfSDavid du Colombier 	}
817dd7cddfSDavid du Colombier |	LMOVW regaddr ',' rreg
827dd7cddfSDavid du Colombier 	{
837dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
847dd7cddfSDavid du Colombier 	}
857dd7cddfSDavid du Colombier |	LMOVB rreg ',' rreg
867dd7cddfSDavid du Colombier 	{
877dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
887dd7cddfSDavid du Colombier 	}
897dd7cddfSDavid du Colombier |	LMOVB addr ',' rreg
907dd7cddfSDavid du Colombier 	{
917dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
927dd7cddfSDavid du Colombier 	}
937dd7cddfSDavid du Colombier |	LMOVB regaddr ',' rreg
947dd7cddfSDavid du Colombier 	{
957dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
967dd7cddfSDavid du Colombier 	}
977dd7cddfSDavid du Colombier /*
98*6891d857SDavid du Colombier  * load and store floats
997dd7cddfSDavid du Colombier  */
1007dd7cddfSDavid du Colombier |	LFMOV addr ',' freg
1017dd7cddfSDavid du Colombier 	{
1027dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1037dd7cddfSDavid du Colombier 	}
1047dd7cddfSDavid du Colombier |	LFMOV regaddr ',' freg
1057dd7cddfSDavid du Colombier 	{
1067dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1077dd7cddfSDavid du Colombier 	}
1087dd7cddfSDavid du Colombier |	LFMOV fimm ',' freg
1097dd7cddfSDavid du Colombier 	{
1107dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1117dd7cddfSDavid du Colombier 	}
1127dd7cddfSDavid du Colombier |	LFMOV freg ',' freg
1137dd7cddfSDavid du Colombier 	{
1147dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1157dd7cddfSDavid du Colombier 	}
1167dd7cddfSDavid du Colombier |	LFMOV freg ',' addr
1177dd7cddfSDavid du Colombier 	{
1187dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1197dd7cddfSDavid du Colombier 	}
1207dd7cddfSDavid du Colombier |	LFMOV freg ',' regaddr
1217dd7cddfSDavid du Colombier 	{
1227dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1237dd7cddfSDavid du Colombier 	}
1247dd7cddfSDavid du Colombier /*
125*6891d857SDavid du Colombier  * load and store floats, indexed only
126*6891d857SDavid du Colombier  */
127*6891d857SDavid du Colombier |	LFMOVX regaddr ',' freg
128*6891d857SDavid du Colombier 	{
129*6891d857SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
130*6891d857SDavid du Colombier 	}
131*6891d857SDavid du Colombier |	LFMOVX freg ',' regaddr
132*6891d857SDavid du Colombier 	{
133*6891d857SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
134*6891d857SDavid du Colombier 	}
135*6891d857SDavid du Colombier /*
1367dd7cddfSDavid du Colombier  * store ints and bytes
1377dd7cddfSDavid du Colombier  */
1387dd7cddfSDavid du Colombier |	LMOVW rreg ',' addr
1397dd7cddfSDavid du Colombier 	{
1407dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1417dd7cddfSDavid du Colombier 	}
1427dd7cddfSDavid du Colombier |	LMOVW rreg ',' regaddr
1437dd7cddfSDavid du Colombier 	{
1447dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1457dd7cddfSDavid du Colombier 	}
1467dd7cddfSDavid du Colombier |	LMOVB rreg ',' addr
1477dd7cddfSDavid du Colombier 	{
1487dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1497dd7cddfSDavid du Colombier 	}
1507dd7cddfSDavid du Colombier |	LMOVB rreg ',' regaddr
1517dd7cddfSDavid du Colombier 	{
1527dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1537dd7cddfSDavid du Colombier 	}
1547dd7cddfSDavid du Colombier /*
1557dd7cddfSDavid du Colombier  * store floats
1567dd7cddfSDavid du Colombier  */
1577dd7cddfSDavid du Colombier |	LMOVW freg ',' addr
1587dd7cddfSDavid du Colombier 	{
1597dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1607dd7cddfSDavid du Colombier 	}
1617dd7cddfSDavid du Colombier |	LMOVW freg ',' regaddr
1627dd7cddfSDavid du Colombier 	{
1637dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1647dd7cddfSDavid du Colombier 	}
1657dd7cddfSDavid du Colombier /*
1667dd7cddfSDavid du Colombier  * floating point status
1677dd7cddfSDavid du Colombier  */
1687dd7cddfSDavid du Colombier |	LMOVW fpscr ',' freg
1697dd7cddfSDavid du Colombier 	{
1707dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1717dd7cddfSDavid du Colombier 	}
1727dd7cddfSDavid du Colombier |	LMOVW freg ','  fpscr
1737dd7cddfSDavid du Colombier 	{
1747dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1757dd7cddfSDavid du Colombier 	}
1767dd7cddfSDavid du Colombier |	LMOVW freg ',' imm ',' fpscr
1777dd7cddfSDavid du Colombier 	{
1787dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
1797dd7cddfSDavid du Colombier 	}
1807dd7cddfSDavid du Colombier |	LMOVW fpscr ',' creg
1817dd7cddfSDavid du Colombier 	{
1827dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1837dd7cddfSDavid du Colombier 	}
1847dd7cddfSDavid du Colombier |	LMOVW imm ',' fpscrf
1857dd7cddfSDavid du Colombier 	{
1867dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1877dd7cddfSDavid du Colombier 	}
1887dd7cddfSDavid du Colombier |	LMTFSB imm ',' con
1897dd7cddfSDavid du Colombier 	{
1907dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
1917dd7cddfSDavid du Colombier 	}
1927dd7cddfSDavid du Colombier /*
1937dd7cddfSDavid du Colombier  * field moves (mtcrf)
1947dd7cddfSDavid du Colombier  */
1957dd7cddfSDavid du Colombier |	LMOVW rreg ',' imm ',' lcr
1967dd7cddfSDavid du Colombier 	{
1977dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
1987dd7cddfSDavid du Colombier 	}
1997dd7cddfSDavid du Colombier |	LMOVW rreg ',' creg
2007dd7cddfSDavid du Colombier 	{
2017dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2027dd7cddfSDavid du Colombier 	}
2037dd7cddfSDavid du Colombier |	LMOVW rreg ',' lcr
2047dd7cddfSDavid du Colombier 	{
2057dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2067dd7cddfSDavid du Colombier 	}
2077dd7cddfSDavid du Colombier /*
2087dd7cddfSDavid du Colombier  * integer operations
2097dd7cddfSDavid du Colombier  * logical instructions
2107dd7cddfSDavid du Colombier  * shift instructions
21180ee5cbfSDavid du Colombier  * unary instructions
2127dd7cddfSDavid du Colombier  */
2137dd7cddfSDavid du Colombier |	LADDW rreg ',' sreg ',' rreg
2147dd7cddfSDavid du Colombier 	{
2157dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
2167dd7cddfSDavid du Colombier 	}
2177dd7cddfSDavid du Colombier |	LADDW imm ',' sreg ',' rreg
2187dd7cddfSDavid du Colombier 	{
2197dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
2207dd7cddfSDavid du Colombier 	}
2217dd7cddfSDavid du Colombier |	LADDW rreg ',' imm ',' rreg
2227dd7cddfSDavid du Colombier 	{
2237dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
2247dd7cddfSDavid du Colombier 	}
2257dd7cddfSDavid du Colombier |	LADDW rreg ',' rreg
2267dd7cddfSDavid du Colombier 	{
2277dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2287dd7cddfSDavid du Colombier 	}
2297dd7cddfSDavid du Colombier |	LADDW imm ',' rreg
2307dd7cddfSDavid du Colombier 	{
2317dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2327dd7cddfSDavid du Colombier 	}
2337dd7cddfSDavid du Colombier |	LLOGW rreg ',' sreg ',' rreg
2347dd7cddfSDavid du Colombier 	{
2357dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
2367dd7cddfSDavid du Colombier 	}
2377dd7cddfSDavid du Colombier |	LLOGW rreg ',' rreg
2387dd7cddfSDavid du Colombier 	{
2397dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2407dd7cddfSDavid du Colombier 	}
24180ee5cbfSDavid du Colombier |	LSHW rreg ',' sreg ',' rreg
24280ee5cbfSDavid du Colombier 	{
24380ee5cbfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
24480ee5cbfSDavid du Colombier 	}
24580ee5cbfSDavid du Colombier |	LSHW rreg ',' rreg
24680ee5cbfSDavid du Colombier 	{
24780ee5cbfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
24880ee5cbfSDavid du Colombier 	}
24980ee5cbfSDavid du Colombier |	LSHW imm ',' sreg ',' rreg
25080ee5cbfSDavid du Colombier 	{
25180ee5cbfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
25280ee5cbfSDavid du Colombier 	}
25380ee5cbfSDavid du Colombier |	LSHW imm ',' rreg
25480ee5cbfSDavid du Colombier 	{
25580ee5cbfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
25680ee5cbfSDavid du Colombier 	}
2577dd7cddfSDavid du Colombier |	LABS rreg ',' rreg
2587dd7cddfSDavid du Colombier 	{
2597dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2607dd7cddfSDavid du Colombier 	}
2617dd7cddfSDavid du Colombier |	LABS rreg
2627dd7cddfSDavid du Colombier 	{
2637dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$2);
2647dd7cddfSDavid du Colombier 	}
2657dd7cddfSDavid du Colombier /*
266375daca8SDavid du Colombier  * multiply-accumulate
267375daca8SDavid du Colombier  */
268375daca8SDavid du Colombier |	LMA rreg ',' sreg ',' rreg
269375daca8SDavid du Colombier 	{
270375daca8SDavid du Colombier 		outcode($1, &$2, $4, &$6);
271375daca8SDavid du Colombier 	}
272375daca8SDavid du Colombier /*
2737dd7cddfSDavid du Colombier  * move immediate: macro for cau+or, addi, addis, and other combinations
2747dd7cddfSDavid du Colombier  */
2757dd7cddfSDavid du Colombier |	LMOVW imm ',' rreg
2767dd7cddfSDavid du Colombier 	{
2777dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2787dd7cddfSDavid du Colombier 	}
2797dd7cddfSDavid du Colombier |	LMOVW ximm ',' rreg
2807dd7cddfSDavid du Colombier 	{
2817dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2827dd7cddfSDavid du Colombier 	}
2837dd7cddfSDavid du Colombier /*
2847dd7cddfSDavid du Colombier  * condition register operations
2857dd7cddfSDavid du Colombier  */
2867dd7cddfSDavid du Colombier |	LCROP cbit ',' cbit
2877dd7cddfSDavid du Colombier 	{
2887dd7cddfSDavid du Colombier 		outcode($1, &$2, $4.reg, &$4);
2897dd7cddfSDavid du Colombier 	}
2907dd7cddfSDavid du Colombier |	LCROP cbit ',' con ',' cbit
2917dd7cddfSDavid du Colombier 	{
2927dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
2937dd7cddfSDavid du Colombier 	}
2947dd7cddfSDavid du Colombier /*
2957dd7cddfSDavid du Colombier  * condition register moves
2967dd7cddfSDavid du Colombier  * move from machine state register
2977dd7cddfSDavid du Colombier  */
2987dd7cddfSDavid du Colombier |	LMOVW creg ',' creg
2997dd7cddfSDavid du Colombier 	{
3007dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3017dd7cddfSDavid du Colombier 	}
3027dd7cddfSDavid du Colombier |	LMOVW psr ',' creg
3037dd7cddfSDavid du Colombier 	{
3047dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3057dd7cddfSDavid du Colombier 	}
3067dd7cddfSDavid du Colombier |	LMOVW lcr ',' rreg
3077dd7cddfSDavid du Colombier 	{
3087dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3097dd7cddfSDavid du Colombier 	}
3107dd7cddfSDavid du Colombier |	LMOVW psr ',' rreg
3117dd7cddfSDavid du Colombier 	{
3127dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3137dd7cddfSDavid du Colombier 	}
3147dd7cddfSDavid du Colombier |	LMOVW seg ',' rreg
3157dd7cddfSDavid du Colombier 	{
3167dd7cddfSDavid du Colombier 		int r;
3177dd7cddfSDavid du Colombier 		r = $2.offset;
3187dd7cddfSDavid du Colombier 		$2.offset = 0;
3197dd7cddfSDavid du Colombier 		outcode($1, &$2, r, &$4);
3207dd7cddfSDavid du Colombier 	}
3217dd7cddfSDavid du Colombier |	LMOVW rreg ',' seg
3227dd7cddfSDavid du Colombier 	{
3237dd7cddfSDavid du Colombier 		int r;
3247dd7cddfSDavid du Colombier 		r = $4.offset;
3257dd7cddfSDavid du Colombier 		$4.offset = 0;
3267dd7cddfSDavid du Colombier 		outcode($1, &$2, r, &$4);
3277dd7cddfSDavid du Colombier 	}
3287dd7cddfSDavid du Colombier |	LMOVW xlreg ',' rreg
3297dd7cddfSDavid du Colombier 	{
3307dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3317dd7cddfSDavid du Colombier 	}
3327dd7cddfSDavid du Colombier |	LMOVW rreg ',' xlreg
3337dd7cddfSDavid du Colombier 	{
3347dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3357dd7cddfSDavid du Colombier 	}
3367dd7cddfSDavid du Colombier |	LMOVW creg ',' psr
3377dd7cddfSDavid du Colombier 	{
3387dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3397dd7cddfSDavid du Colombier 	}
3407dd7cddfSDavid du Colombier |	LMOVW rreg ',' psr
3417dd7cddfSDavid du Colombier 	{
3427dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3437dd7cddfSDavid du Colombier 	}
3447dd7cddfSDavid du Colombier /*
3457dd7cddfSDavid du Colombier  * branch, branch conditional
3467dd7cddfSDavid du Colombier  * branch conditional register
3477dd7cddfSDavid du Colombier  * branch conditional to count register
3487dd7cddfSDavid du Colombier  */
3497dd7cddfSDavid du Colombier |	LBRA rel
3507dd7cddfSDavid du Colombier 	{
3517dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
3527dd7cddfSDavid du Colombier 	}
3537dd7cddfSDavid du Colombier |	LBRA addr
3547dd7cddfSDavid du Colombier 	{
3557dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
3567dd7cddfSDavid du Colombier 	}
3577dd7cddfSDavid du Colombier |	LBRA '(' xlreg ')'
3587dd7cddfSDavid du Colombier 	{
3597dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
3607dd7cddfSDavid du Colombier 	}
36180ee5cbfSDavid du Colombier |	LBRA ',' rel
36280ee5cbfSDavid du Colombier 	{
36380ee5cbfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
36480ee5cbfSDavid du Colombier 	}
36580ee5cbfSDavid du Colombier |	LBRA ',' addr
36680ee5cbfSDavid du Colombier 	{
36780ee5cbfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
36880ee5cbfSDavid du Colombier 	}
36980ee5cbfSDavid du Colombier |	LBRA ',' '(' xlreg ')'
37080ee5cbfSDavid du Colombier 	{
37180ee5cbfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$4);
37280ee5cbfSDavid du Colombier 	}
3737dd7cddfSDavid du Colombier |	LBRA creg ',' rel
3747dd7cddfSDavid du Colombier 	{
3757dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3767dd7cddfSDavid du Colombier 	}
3777dd7cddfSDavid du Colombier |	LBRA creg ',' addr
3787dd7cddfSDavid du Colombier 	{
3797dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3807dd7cddfSDavid du Colombier 	}
3817dd7cddfSDavid du Colombier |	LBRA creg ',' '(' xlreg ')'
3827dd7cddfSDavid du Colombier 	{
3837dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$5);
3847dd7cddfSDavid du Colombier 	}
3857dd7cddfSDavid du Colombier |	LBRA con ',' rel
3867dd7cddfSDavid du Colombier 	{
3877dd7cddfSDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
3887dd7cddfSDavid du Colombier 	}
3897dd7cddfSDavid du Colombier |	LBRA con ',' addr
3907dd7cddfSDavid du Colombier 	{
3917dd7cddfSDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
3927dd7cddfSDavid du Colombier 	}
3937dd7cddfSDavid du Colombier |	LBRA con ',' '(' xlreg ')'
3947dd7cddfSDavid du Colombier 	{
3957dd7cddfSDavid du Colombier 		outcode($1, &nullgen, $2, &$5);
3967dd7cddfSDavid du Colombier 	}
3977dd7cddfSDavid du Colombier |	LBRA con ',' con ',' rel
3987dd7cddfSDavid du Colombier 	{
3997dd7cddfSDavid du Colombier 		Gen g;
4007dd7cddfSDavid du Colombier 		g = nullgen;
4017dd7cddfSDavid du Colombier 		g.type = D_CONST;
4027dd7cddfSDavid du Colombier 		g.offset = $2;
4037dd7cddfSDavid du Colombier 		outcode($1, &g, $4, &$6);
4047dd7cddfSDavid du Colombier 	}
4057dd7cddfSDavid du Colombier |	LBRA con ',' con ',' addr
4067dd7cddfSDavid du Colombier 	{
4077dd7cddfSDavid du Colombier 		Gen g;
4087dd7cddfSDavid du Colombier 		g = nullgen;
4097dd7cddfSDavid du Colombier 		g.type = D_CONST;
4107dd7cddfSDavid du Colombier 		g.offset = $2;
4117dd7cddfSDavid du Colombier 		outcode($1, &g, $4, &$6);
4127dd7cddfSDavid du Colombier 	}
4137dd7cddfSDavid du Colombier |	LBRA con ',' con ',' '(' xlreg ')'
4147dd7cddfSDavid du Colombier 	{
4157dd7cddfSDavid du Colombier 		Gen g;
4167dd7cddfSDavid du Colombier 		g = nullgen;
4177dd7cddfSDavid du Colombier 		g.type = D_CONST;
4187dd7cddfSDavid du Colombier 		g.offset = $2;
4197dd7cddfSDavid du Colombier 		outcode($1, &g, $4, &$7);
4207dd7cddfSDavid du Colombier 	}
4217dd7cddfSDavid du Colombier /*
4227dd7cddfSDavid du Colombier  * conditional trap
4237dd7cddfSDavid du Colombier  */
4247dd7cddfSDavid du Colombier |	LTRAP rreg ',' sreg
4257dd7cddfSDavid du Colombier 	{
4267dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
4277dd7cddfSDavid du Colombier 	}
4287dd7cddfSDavid du Colombier |	LTRAP imm ',' sreg
4297dd7cddfSDavid du Colombier 	{
4307dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
4317dd7cddfSDavid du Colombier 	}
4327dd7cddfSDavid du Colombier |	LTRAP rreg comma
4337dd7cddfSDavid du Colombier 	{
4347dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
4357dd7cddfSDavid du Colombier 	}
4367dd7cddfSDavid du Colombier |	LTRAP comma
4377dd7cddfSDavid du Colombier 	{
4387dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
4397dd7cddfSDavid du Colombier 	}
4407dd7cddfSDavid du Colombier /*
4417dd7cddfSDavid du Colombier  * floating point operate
4427dd7cddfSDavid du Colombier  */
4437dd7cddfSDavid du Colombier |	LFCONV freg ',' freg
4447dd7cddfSDavid du Colombier 	{
4457dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4467dd7cddfSDavid du Colombier 	}
4477dd7cddfSDavid du Colombier |	LFADD freg ',' freg
4487dd7cddfSDavid du Colombier 	{
4497dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4507dd7cddfSDavid du Colombier 	}
4517dd7cddfSDavid du Colombier |	LFADD freg ',' freg ',' freg
4527dd7cddfSDavid du Colombier 	{
4537dd7cddfSDavid du Colombier 		outcode($1, &$2, $4.reg, &$6);
4547dd7cddfSDavid du Colombier 	}
4557dd7cddfSDavid du Colombier |	LFMA freg ',' freg ',' freg ',' freg
4567dd7cddfSDavid du Colombier 	{
4577dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
4587dd7cddfSDavid du Colombier 	}
4597dd7cddfSDavid du Colombier |	LFCMP freg ',' freg
4607dd7cddfSDavid du Colombier 	{
4617dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4627dd7cddfSDavid du Colombier 	}
4637dd7cddfSDavid du Colombier |	LFCMP freg ',' freg ',' creg
4647dd7cddfSDavid du Colombier 	{
4657dd7cddfSDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
4667dd7cddfSDavid du Colombier 	}
4677dd7cddfSDavid du Colombier /*
4687dd7cddfSDavid du Colombier  * CMP
4697dd7cddfSDavid du Colombier  */
4707dd7cddfSDavid du Colombier |	LCMP rreg ',' rreg
4717dd7cddfSDavid du Colombier 	{
4727dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4737dd7cddfSDavid du Colombier 	}
4747dd7cddfSDavid du Colombier |	LCMP rreg ',' imm
4757dd7cddfSDavid du Colombier 	{
4767dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4777dd7cddfSDavid du Colombier 	}
4787dd7cddfSDavid du Colombier |	LCMP rreg ',' rreg ',' creg
4797dd7cddfSDavid du Colombier 	{
4807dd7cddfSDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
4817dd7cddfSDavid du Colombier 	}
4827dd7cddfSDavid du Colombier |	LCMP rreg ',' imm ',' creg
4837dd7cddfSDavid du Colombier 	{
4847dd7cddfSDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
4857dd7cddfSDavid du Colombier 	}
4867dd7cddfSDavid du Colombier /*
4877dd7cddfSDavid du Colombier  * rotate and mask
4887dd7cddfSDavid du Colombier  */
4897dd7cddfSDavid du Colombier |	LRLWM  imm ',' rreg ',' imm ',' rreg
4907dd7cddfSDavid du Colombier 	{
4917dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
4927dd7cddfSDavid du Colombier 	}
4937dd7cddfSDavid du Colombier |	LRLWM  imm ',' rreg ',' mask ',' rreg
4947dd7cddfSDavid du Colombier 	{
4957dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
4967dd7cddfSDavid du Colombier 	}
4977dd7cddfSDavid du Colombier |	LRLWM  rreg ',' rreg ',' imm ',' rreg
4987dd7cddfSDavid du Colombier 	{
4997dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
5007dd7cddfSDavid du Colombier 	}
5017dd7cddfSDavid du Colombier |	LRLWM  rreg ',' rreg ',' mask ',' rreg
5027dd7cddfSDavid du Colombier 	{
5037dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
5047dd7cddfSDavid du Colombier 	}
5057dd7cddfSDavid du Colombier /*
5067dd7cddfSDavid du Colombier  * load/store multiple
5077dd7cddfSDavid du Colombier  */
5087dd7cddfSDavid du Colombier |	LMOVMW addr ',' rreg
5097dd7cddfSDavid du Colombier 	{
5107dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5117dd7cddfSDavid du Colombier 	}
5127dd7cddfSDavid du Colombier |	LMOVMW rreg ',' addr
5137dd7cddfSDavid du Colombier 	{
5147dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5157dd7cddfSDavid du Colombier 	}
5167dd7cddfSDavid du Colombier /*
5177dd7cddfSDavid du Colombier  * various indexed load/store
5187dd7cddfSDavid du Colombier  * indexed unary (eg, cache clear)
5197dd7cddfSDavid du Colombier  */
5207dd7cddfSDavid du Colombier |	LXLD regaddr ',' rreg
5217dd7cddfSDavid du Colombier 	{
5227dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5237dd7cddfSDavid du Colombier 	}
5247dd7cddfSDavid du Colombier |	LXLD regaddr ',' imm ',' rreg
5257dd7cddfSDavid du Colombier 	{
5267dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
5277dd7cddfSDavid du Colombier 	}
5287dd7cddfSDavid du Colombier |	LXST rreg ',' regaddr
5297dd7cddfSDavid du Colombier 	{
5307dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5317dd7cddfSDavid du Colombier 	}
5327dd7cddfSDavid du Colombier |	LXST rreg ',' imm ',' regaddr
5337dd7cddfSDavid du Colombier 	{
5347dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
5357dd7cddfSDavid du Colombier 	}
5367dd7cddfSDavid du Colombier |	LXMV regaddr ',' rreg
5377dd7cddfSDavid du Colombier 	{
5387dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5397dd7cddfSDavid du Colombier 	}
5407dd7cddfSDavid du Colombier |	LXMV rreg ',' regaddr
5417dd7cddfSDavid du Colombier 	{
5427dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5437dd7cddfSDavid du Colombier 	}
5447dd7cddfSDavid du Colombier |	LXOP regaddr
5457dd7cddfSDavid du Colombier 	{
5467dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
5477dd7cddfSDavid du Colombier 	}
5487dd7cddfSDavid du Colombier /*
5497dd7cddfSDavid du Colombier  * NOP
5507dd7cddfSDavid du Colombier  */
5517dd7cddfSDavid du Colombier |	LNOP comma
5527dd7cddfSDavid du Colombier 	{
5537dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
5547dd7cddfSDavid du Colombier 	}
5557dd7cddfSDavid du Colombier |	LNOP rreg comma
5567dd7cddfSDavid du Colombier 	{
5577dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
5587dd7cddfSDavid du Colombier 	}
5597dd7cddfSDavid du Colombier |	LNOP freg comma
5607dd7cddfSDavid du Colombier 	{
5617dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
5627dd7cddfSDavid du Colombier 	}
5637dd7cddfSDavid du Colombier |	LNOP ',' rreg
5647dd7cddfSDavid du Colombier 	{
5657dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
5667dd7cddfSDavid du Colombier 	}
5677dd7cddfSDavid du Colombier |	LNOP ',' freg
5687dd7cddfSDavid du Colombier 	{
5697dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
5707dd7cddfSDavid du Colombier 	}
5717dd7cddfSDavid du Colombier /*
5727dd7cddfSDavid du Colombier  * word
5737dd7cddfSDavid du Colombier  */
5747dd7cddfSDavid du Colombier |	LWORD imm comma
5757dd7cddfSDavid du Colombier 	{
5767dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
5777dd7cddfSDavid du Colombier 	}
5787dd7cddfSDavid du Colombier |	LWORD ximm comma
5797dd7cddfSDavid du Colombier 	{
5807dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
5817dd7cddfSDavid du Colombier 	}
5827dd7cddfSDavid du Colombier /*
5837dd7cddfSDavid du Colombier  * END
5847dd7cddfSDavid du Colombier  */
5857dd7cddfSDavid du Colombier |	LEND comma
5867dd7cddfSDavid du Colombier 	{
5877dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
5887dd7cddfSDavid du Colombier 	}
5897dd7cddfSDavid du Colombier /*
5907dd7cddfSDavid du Colombier  * TEXT/GLOBL
5917dd7cddfSDavid du Colombier  */
5927dd7cddfSDavid du Colombier |	LTEXT name ',' imm
5937dd7cddfSDavid du Colombier 	{
5947dd7cddfSDavid du Colombier 		outcode($1, &$2, NREG, &$4);
5957dd7cddfSDavid du Colombier 	}
5967dd7cddfSDavid du Colombier |	LTEXT name ',' con ',' imm
5977dd7cddfSDavid du Colombier 	{
5987dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
5997dd7cddfSDavid du Colombier 	}
6007dd7cddfSDavid du Colombier |	LTEXT name ',' imm ':' imm
6017dd7cddfSDavid du Colombier 	{
6027dd7cddfSDavid du Colombier 		outgcode($1, &$2, NREG, &$6, &$4);
6037dd7cddfSDavid du Colombier 	}
6047dd7cddfSDavid du Colombier |	LTEXT name ',' con ',' imm ':' imm
6057dd7cddfSDavid du Colombier 	{
6067dd7cddfSDavid du Colombier 		outgcode($1, &$2, $4, &$8, &$6);
6077dd7cddfSDavid du Colombier 	}
6087dd7cddfSDavid du Colombier /*
6097dd7cddfSDavid du Colombier  * DATA
6107dd7cddfSDavid du Colombier  */
6117dd7cddfSDavid du Colombier |	LDATA name '/' con ',' imm
6127dd7cddfSDavid du Colombier 	{
6137dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
6147dd7cddfSDavid du Colombier 	}
6157dd7cddfSDavid du Colombier |	LDATA name '/' con ',' ximm
6167dd7cddfSDavid du Colombier 	{
6177dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
6187dd7cddfSDavid du Colombier 	}
6197dd7cddfSDavid du Colombier |	LDATA name '/' con ',' fimm
6207dd7cddfSDavid du Colombier 	{
6217dd7cddfSDavid du Colombier 		outcode($1, &$2, $4, &$6);
6227dd7cddfSDavid du Colombier 	}
6237dd7cddfSDavid du Colombier /*
6247dd7cddfSDavid du Colombier  * RETURN
6257dd7cddfSDavid du Colombier  */
6267dd7cddfSDavid du Colombier |	LRETRN	comma
6277dd7cddfSDavid du Colombier 	{
6287dd7cddfSDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
6297dd7cddfSDavid du Colombier 	}
6307dd7cddfSDavid du Colombier 
6317dd7cddfSDavid du Colombier rel:
6327dd7cddfSDavid du Colombier 	con '(' LPC ')'
6337dd7cddfSDavid du Colombier 	{
6347dd7cddfSDavid du Colombier 		$$ = nullgen;
6357dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
6367dd7cddfSDavid du Colombier 		$$.offset = $1 + pc;
6377dd7cddfSDavid du Colombier 	}
6387dd7cddfSDavid du Colombier |	LNAME offset
6397dd7cddfSDavid du Colombier 	{
6407dd7cddfSDavid du Colombier 		$$ = nullgen;
6417dd7cddfSDavid du Colombier 		if(pass == 2)
6427dd7cddfSDavid du Colombier 			yyerror("undefined label: %s", $1->name);
6437dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
6447dd7cddfSDavid du Colombier 		$$.sym = $1;
6457dd7cddfSDavid du Colombier 		$$.offset = $2;
6467dd7cddfSDavid du Colombier 	}
6477dd7cddfSDavid du Colombier |	LLAB offset
6487dd7cddfSDavid du Colombier 	{
6497dd7cddfSDavid du Colombier 		$$ = nullgen;
6507dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
6517dd7cddfSDavid du Colombier 		$$.sym = $1;
6527dd7cddfSDavid du Colombier 		$$.offset = $1->value + $2;
6537dd7cddfSDavid du Colombier 	}
6547dd7cddfSDavid du Colombier 
6557dd7cddfSDavid du Colombier rreg:
6567dd7cddfSDavid du Colombier 	sreg
6577dd7cddfSDavid du Colombier 	{
6587dd7cddfSDavid du Colombier 		$$ = nullgen;
6597dd7cddfSDavid du Colombier 		$$.type = D_REG;
6607dd7cddfSDavid du Colombier 		$$.reg = $1;
6617dd7cddfSDavid du Colombier 	}
6627dd7cddfSDavid du Colombier 
6637dd7cddfSDavid du Colombier xlreg:
6647dd7cddfSDavid du Colombier 	lr
6657dd7cddfSDavid du Colombier |	ctr
6667dd7cddfSDavid du Colombier 
6677dd7cddfSDavid du Colombier lr:
6687dd7cddfSDavid du Colombier 	LLR
6697dd7cddfSDavid du Colombier 	{
6707dd7cddfSDavid du Colombier 		$$ = nullgen;
6717dd7cddfSDavid du Colombier 		$$.type = D_SPR;
6727dd7cddfSDavid du Colombier 		$$.offset = $1;
6737dd7cddfSDavid du Colombier 	}
6747dd7cddfSDavid du Colombier 
6757dd7cddfSDavid du Colombier lcr:
6767dd7cddfSDavid du Colombier 	LCR
6777dd7cddfSDavid du Colombier 	{
6787dd7cddfSDavid du Colombier 		$$ = nullgen;
6797dd7cddfSDavid du Colombier 		$$.type = D_CREG;
6807dd7cddfSDavid du Colombier 		$$.reg = NREG;	/* whole register */
6817dd7cddfSDavid du Colombier 	}
6827dd7cddfSDavid du Colombier 
6837dd7cddfSDavid du Colombier ctr:
6847dd7cddfSDavid du Colombier 	LCTR
6857dd7cddfSDavid du Colombier 	{
6867dd7cddfSDavid du Colombier 		$$ = nullgen;
6877dd7cddfSDavid du Colombier 		$$.type = D_SPR;
6887dd7cddfSDavid du Colombier 		$$.offset = $1;
6897dd7cddfSDavid du Colombier 	}
6907dd7cddfSDavid du Colombier 
6917dd7cddfSDavid du Colombier msr:
6927dd7cddfSDavid du Colombier 	LMSR
6937dd7cddfSDavid du Colombier 	{
6947dd7cddfSDavid du Colombier 		$$ = nullgen;
6957dd7cddfSDavid du Colombier 		$$.type = D_MSR;
6967dd7cddfSDavid du Colombier 	}
6977dd7cddfSDavid du Colombier 
6987dd7cddfSDavid du Colombier psr:
6997dd7cddfSDavid du Colombier 	LSPREG
7007dd7cddfSDavid du Colombier 	{
7017dd7cddfSDavid du Colombier 		$$ = nullgen;
7027dd7cddfSDavid du Colombier 		$$.type = D_SPR;
7037dd7cddfSDavid du Colombier 		$$.offset = $1;
7047dd7cddfSDavid du Colombier 	}
7057dd7cddfSDavid du Colombier |	LSPR '(' con ')'
7067dd7cddfSDavid du Colombier 	{
7077dd7cddfSDavid du Colombier 		$$ = nullgen;
708375daca8SDavid du Colombier 		$$.type = $1;
7097dd7cddfSDavid du Colombier 		$$.offset = $3;
7107dd7cddfSDavid du Colombier 	}
711*6891d857SDavid du Colombier |	LDCR '(' con ')'
712*6891d857SDavid du Colombier 	{
713*6891d857SDavid du Colombier 		$$ = nullgen;
714*6891d857SDavid du Colombier 		$$.type = $1;
715*6891d857SDavid du Colombier 		$$.offset = $3;
716*6891d857SDavid du Colombier 	}
717*6891d857SDavid du Colombier |	LDCR '(' sreg ')'
718*6891d857SDavid du Colombier 	{
719*6891d857SDavid du Colombier 		$$ = nullgen;
720*6891d857SDavid du Colombier 		$$.type = $1;
721*6891d857SDavid du Colombier 		$$.reg = $3;
722*6891d857SDavid du Colombier 		$$.offset = 0;
723*6891d857SDavid du Colombier 	}
7247dd7cddfSDavid du Colombier |	msr
7257dd7cddfSDavid du Colombier 
7267dd7cddfSDavid du Colombier seg:
7277dd7cddfSDavid du Colombier 	LSEG '(' con ')'
7287dd7cddfSDavid du Colombier 	{
7297dd7cddfSDavid du Colombier 		if($3 < 0 || $3 > 15)
7307dd7cddfSDavid du Colombier 			yyerror("segment register number out of range");
7317dd7cddfSDavid du Colombier 		$$ = nullgen;
7327dd7cddfSDavid du Colombier 		$$.type = D_SREG;
7337dd7cddfSDavid du Colombier 		$$.reg = $3;
7347dd7cddfSDavid du Colombier 		$$.offset = NREG;
7357dd7cddfSDavid du Colombier 	}
7367dd7cddfSDavid du Colombier |	LSEG '(' sreg ')'
7377dd7cddfSDavid du Colombier 	{
7387dd7cddfSDavid du Colombier 		$$ = nullgen;
7397dd7cddfSDavid du Colombier 		$$.type = D_SREG;
7407dd7cddfSDavid du Colombier 		$$.reg = NREG;
7417dd7cddfSDavid du Colombier 		$$.offset = $3;
7427dd7cddfSDavid du Colombier 	}
7437dd7cddfSDavid du Colombier 
7447dd7cddfSDavid du Colombier fpscr:
7457dd7cddfSDavid du Colombier 	LFPSCR
7467dd7cddfSDavid du Colombier 	{
7477dd7cddfSDavid du Colombier 		$$ = nullgen;
7487dd7cddfSDavid du Colombier 		$$.type = D_FPSCR;
7497dd7cddfSDavid du Colombier 		$$.reg = NREG;
7507dd7cddfSDavid du Colombier 	}
7517dd7cddfSDavid du Colombier 
7527dd7cddfSDavid du Colombier fpscrf:
7537dd7cddfSDavid du Colombier 	LFPSCR '(' con ')'
7547dd7cddfSDavid du Colombier 	{
7557dd7cddfSDavid du Colombier 		$$ = nullgen;
7567dd7cddfSDavid du Colombier 		$$.type = D_FPSCR;
7577dd7cddfSDavid du Colombier 		$$.reg = $3;
7587dd7cddfSDavid du Colombier 	}
7597dd7cddfSDavid du Colombier 
7607dd7cddfSDavid du Colombier freg:
7617dd7cddfSDavid du Colombier 	LFREG
7627dd7cddfSDavid du Colombier 	{
7637dd7cddfSDavid du Colombier 		$$ = nullgen;
7647dd7cddfSDavid du Colombier 		$$.type = D_FREG;
7657dd7cddfSDavid du Colombier 		$$.reg = $1;
7667dd7cddfSDavid du Colombier 	}
7677dd7cddfSDavid du Colombier |	LF '(' con ')'
7687dd7cddfSDavid du Colombier 	{
7697dd7cddfSDavid du Colombier 		$$ = nullgen;
7707dd7cddfSDavid du Colombier 		$$.type = D_FREG;
7717dd7cddfSDavid du Colombier 		$$.reg = $3;
7727dd7cddfSDavid du Colombier 	}
7737dd7cddfSDavid du Colombier 
7747dd7cddfSDavid du Colombier creg:
7757dd7cddfSDavid du Colombier 	LCREG
7767dd7cddfSDavid du Colombier 	{
7777dd7cddfSDavid du Colombier 		$$ = nullgen;
7787dd7cddfSDavid du Colombier 		$$.type = D_CREG;
7797dd7cddfSDavid du Colombier 		$$.reg = $1;
7807dd7cddfSDavid du Colombier 	}
7817dd7cddfSDavid du Colombier |	LCR '(' con ')'
7827dd7cddfSDavid du Colombier 	{
7837dd7cddfSDavid du Colombier 		$$ = nullgen;
7847dd7cddfSDavid du Colombier 		$$.type = D_CREG;
7857dd7cddfSDavid du Colombier 		$$.reg = $3;
7867dd7cddfSDavid du Colombier 	}
7877dd7cddfSDavid du Colombier 
7887dd7cddfSDavid du Colombier 
7897dd7cddfSDavid du Colombier cbit:	con
7907dd7cddfSDavid du Colombier 	{
7917dd7cddfSDavid du Colombier 		$$ = nullgen;
7927dd7cddfSDavid du Colombier 		$$.type = D_REG;
7937dd7cddfSDavid du Colombier 		$$.reg = $1;
7947dd7cddfSDavid du Colombier 	}
7957dd7cddfSDavid du Colombier 
7967dd7cddfSDavid du Colombier mask:
7977dd7cddfSDavid du Colombier 	con ',' con
7987dd7cddfSDavid du Colombier 	{
7997dd7cddfSDavid du Colombier 		int mb, me;
8007dd7cddfSDavid du Colombier 		ulong v;
8017dd7cddfSDavid du Colombier 
8027dd7cddfSDavid du Colombier 		$$ = nullgen;
8037dd7cddfSDavid du Colombier 		$$.type = D_CONST;
8047dd7cddfSDavid du Colombier 		mb = $1;
8057dd7cddfSDavid du Colombier 		me = $3;
8067dd7cddfSDavid du Colombier 		if(mb < 0 || mb > 31 || me < 0 || me > 31){
8077dd7cddfSDavid du Colombier 			yyerror("illegal mask start/end value(s)");
8087dd7cddfSDavid du Colombier 			mb = me = 0;
8097dd7cddfSDavid du Colombier 		}
8107dd7cddfSDavid du Colombier 		if(mb <= me)
8117dd7cddfSDavid du Colombier 			v = ((ulong)~0L>>mb) & (~0L<<(31-me));
8127dd7cddfSDavid du Colombier 		else
8137dd7cddfSDavid du Colombier 			v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1))));
8147dd7cddfSDavid du Colombier 		$$.offset = v;
8157dd7cddfSDavid du Colombier 	}
8167dd7cddfSDavid du Colombier 
8177dd7cddfSDavid du Colombier ximm:
8187dd7cddfSDavid du Colombier 	'$' addr
8197dd7cddfSDavid du Colombier 	{
8207dd7cddfSDavid du Colombier 		$$ = $2;
8217dd7cddfSDavid du Colombier 		$$.type = D_CONST;
8227dd7cddfSDavid du Colombier 	}
8237dd7cddfSDavid du Colombier |	'$' LSCONST
8247dd7cddfSDavid du Colombier 	{
8257dd7cddfSDavid du Colombier 		$$ = nullgen;
8267dd7cddfSDavid du Colombier 		$$.type = D_SCONST;
8277dd7cddfSDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
8287dd7cddfSDavid du Colombier 	}
8297dd7cddfSDavid du Colombier 
8307dd7cddfSDavid du Colombier fimm:
8317dd7cddfSDavid du Colombier 	'$' LFCONST
8327dd7cddfSDavid du Colombier 	{
8337dd7cddfSDavid du Colombier 		$$ = nullgen;
8347dd7cddfSDavid du Colombier 		$$.type = D_FCONST;
8357dd7cddfSDavid du Colombier 		$$.dval = $2;
8367dd7cddfSDavid du Colombier 	}
8377dd7cddfSDavid du Colombier |	'$' '-' LFCONST
8387dd7cddfSDavid du Colombier 	{
8397dd7cddfSDavid du Colombier 		$$ = nullgen;
8407dd7cddfSDavid du Colombier 		$$.type = D_FCONST;
8417dd7cddfSDavid du Colombier 		$$.dval = -$3;
8427dd7cddfSDavid du Colombier 	}
8437dd7cddfSDavid du Colombier 
8447dd7cddfSDavid du Colombier imm:	'$' con
8457dd7cddfSDavid du Colombier 	{
8467dd7cddfSDavid du Colombier 		$$ = nullgen;
8477dd7cddfSDavid du Colombier 		$$.type = D_CONST;
8487dd7cddfSDavid du Colombier 		$$.offset = $2;
8497dd7cddfSDavid du Colombier 	}
8507dd7cddfSDavid du Colombier 
8517dd7cddfSDavid du Colombier sreg:
8527dd7cddfSDavid du Colombier 	LREG
8537dd7cddfSDavid du Colombier |	LR '(' con ')'
8547dd7cddfSDavid du Colombier 	{
8557dd7cddfSDavid du Colombier 		if($$ < 0 || $$ >= NREG)
8567dd7cddfSDavid du Colombier 			print("register value out of range\n");
8577dd7cddfSDavid du Colombier 		$$ = $3;
8587dd7cddfSDavid du Colombier 	}
8597dd7cddfSDavid du Colombier 
8607dd7cddfSDavid du Colombier regaddr:
8617dd7cddfSDavid du Colombier 	'(' sreg ')'
8627dd7cddfSDavid du Colombier 	{
8637dd7cddfSDavid du Colombier 		$$ = nullgen;
8647dd7cddfSDavid du Colombier 		$$.type = D_OREG;
8657dd7cddfSDavid du Colombier 		$$.reg = $2;
8667dd7cddfSDavid du Colombier 		$$.offset = 0;
8677dd7cddfSDavid du Colombier 	}
8687dd7cddfSDavid du Colombier |	'(' sreg '+' sreg ')'
8697dd7cddfSDavid du Colombier 	{
8707dd7cddfSDavid du Colombier 		$$ = nullgen;
8717dd7cddfSDavid du Colombier 		$$.type = D_OREG;
8727dd7cddfSDavid du Colombier 		$$.reg = $2;
8737dd7cddfSDavid du Colombier 		$$.xreg = $4;
8747dd7cddfSDavid du Colombier 		$$.offset = 0;
8757dd7cddfSDavid du Colombier 	}
8767dd7cddfSDavid du Colombier 
8777dd7cddfSDavid du Colombier addr:
8787dd7cddfSDavid du Colombier 	name
8797dd7cddfSDavid du Colombier |	con '(' sreg ')'
8807dd7cddfSDavid du Colombier 	{
8817dd7cddfSDavid du Colombier 		$$ = nullgen;
8827dd7cddfSDavid du Colombier 		$$.type = D_OREG;
8837dd7cddfSDavid du Colombier 		$$.reg = $3;
8847dd7cddfSDavid du Colombier 		$$.offset = $1;
8857dd7cddfSDavid du Colombier 	}
8867dd7cddfSDavid du Colombier 
8877dd7cddfSDavid du Colombier name:
8887dd7cddfSDavid du Colombier 	con '(' pointer ')'
8897dd7cddfSDavid du Colombier 	{
8907dd7cddfSDavid du Colombier 		$$ = nullgen;
8917dd7cddfSDavid du Colombier 		$$.type = D_OREG;
8927dd7cddfSDavid du Colombier 		$$.name = $3;
8937dd7cddfSDavid du Colombier 		$$.sym = S;
8947dd7cddfSDavid du Colombier 		$$.offset = $1;
8957dd7cddfSDavid du Colombier 	}
8967dd7cddfSDavid du Colombier |	LNAME offset '(' pointer ')'
8977dd7cddfSDavid du Colombier 	{
8987dd7cddfSDavid du Colombier 		$$ = nullgen;
8997dd7cddfSDavid du Colombier 		$$.type = D_OREG;
9007dd7cddfSDavid du Colombier 		$$.name = $4;
9017dd7cddfSDavid du Colombier 		$$.sym = $1;
9027dd7cddfSDavid du Colombier 		$$.offset = $2;
9037dd7cddfSDavid du Colombier 	}
9047dd7cddfSDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
9057dd7cddfSDavid du Colombier 	{
9067dd7cddfSDavid du Colombier 		$$ = nullgen;
9077dd7cddfSDavid du Colombier 		$$.type = D_OREG;
9087dd7cddfSDavid du Colombier 		$$.name = D_STATIC;
9097dd7cddfSDavid du Colombier 		$$.sym = $1;
9107dd7cddfSDavid du Colombier 		$$.offset = $4;
9117dd7cddfSDavid du Colombier 	}
9127dd7cddfSDavid du Colombier 
9137dd7cddfSDavid du Colombier comma:
9147dd7cddfSDavid du Colombier |	','
9157dd7cddfSDavid du Colombier 
9167dd7cddfSDavid du Colombier offset:
9177dd7cddfSDavid du Colombier 	{
9187dd7cddfSDavid du Colombier 		$$ = 0;
9197dd7cddfSDavid du Colombier 	}
9207dd7cddfSDavid du Colombier |	'+' con
9217dd7cddfSDavid du Colombier 	{
9227dd7cddfSDavid du Colombier 		$$ = $2;
9237dd7cddfSDavid du Colombier 	}
9247dd7cddfSDavid du Colombier |	'-' con
9257dd7cddfSDavid du Colombier 	{
9267dd7cddfSDavid du Colombier 		$$ = -$2;
9277dd7cddfSDavid du Colombier 	}
9287dd7cddfSDavid du Colombier 
9297dd7cddfSDavid du Colombier pointer:
9307dd7cddfSDavid du Colombier 	LSB
9317dd7cddfSDavid du Colombier |	LSP
9327dd7cddfSDavid du Colombier |	LFP
9337dd7cddfSDavid du Colombier 
9347dd7cddfSDavid du Colombier con:
9357dd7cddfSDavid du Colombier 	LCONST
9367dd7cddfSDavid du Colombier |	LVAR
9377dd7cddfSDavid du Colombier 	{
9387dd7cddfSDavid du Colombier 		$$ = $1->value;
9397dd7cddfSDavid du Colombier 	}
9407dd7cddfSDavid du Colombier |	'-' con
9417dd7cddfSDavid du Colombier 	{
9427dd7cddfSDavid du Colombier 		$$ = -$2;
9437dd7cddfSDavid du Colombier 	}
9447dd7cddfSDavid du Colombier |	'+' con
9457dd7cddfSDavid du Colombier 	{
9467dd7cddfSDavid du Colombier 		$$ = $2;
9477dd7cddfSDavid du Colombier 	}
9487dd7cddfSDavid du Colombier |	'~' con
9497dd7cddfSDavid du Colombier 	{
9507dd7cddfSDavid du Colombier 		$$ = ~$2;
9517dd7cddfSDavid du Colombier 	}
9527dd7cddfSDavid du Colombier |	'(' expr ')'
9537dd7cddfSDavid du Colombier 	{
9547dd7cddfSDavid du Colombier 		$$ = $2;
9557dd7cddfSDavid du Colombier 	}
9567dd7cddfSDavid du Colombier 
9577dd7cddfSDavid du Colombier expr:
9587dd7cddfSDavid du Colombier 	con
9597dd7cddfSDavid du Colombier |	expr '+' expr
9607dd7cddfSDavid du Colombier 	{
9617dd7cddfSDavid du Colombier 		$$ = $1 + $3;
9627dd7cddfSDavid du Colombier 	}
9637dd7cddfSDavid du Colombier |	expr '-' expr
9647dd7cddfSDavid du Colombier 	{
9657dd7cddfSDavid du Colombier 		$$ = $1 - $3;
9667dd7cddfSDavid du Colombier 	}
9677dd7cddfSDavid du Colombier |	expr '*' expr
9687dd7cddfSDavid du Colombier 	{
9697dd7cddfSDavid du Colombier 		$$ = $1 * $3;
9707dd7cddfSDavid du Colombier 	}
9717dd7cddfSDavid du Colombier |	expr '/' expr
9727dd7cddfSDavid du Colombier 	{
9737dd7cddfSDavid du Colombier 		$$ = $1 / $3;
9747dd7cddfSDavid du Colombier 	}
9757dd7cddfSDavid du Colombier |	expr '%' expr
9767dd7cddfSDavid du Colombier 	{
9777dd7cddfSDavid du Colombier 		$$ = $1 % $3;
9787dd7cddfSDavid du Colombier 	}
9797dd7cddfSDavid du Colombier |	expr '<' '<' expr
9807dd7cddfSDavid du Colombier 	{
9817dd7cddfSDavid du Colombier 		$$ = $1 << $4;
9827dd7cddfSDavid du Colombier 	}
9837dd7cddfSDavid du Colombier |	expr '>' '>' expr
9847dd7cddfSDavid du Colombier 	{
9857dd7cddfSDavid du Colombier 		$$ = $1 >> $4;
9867dd7cddfSDavid du Colombier 	}
9877dd7cddfSDavid du Colombier |	expr '&' expr
9887dd7cddfSDavid du Colombier 	{
9897dd7cddfSDavid du Colombier 		$$ = $1 & $3;
9907dd7cddfSDavid du Colombier 	}
9917dd7cddfSDavid du Colombier |	expr '^' expr
9927dd7cddfSDavid du Colombier 	{
9937dd7cddfSDavid du Colombier 		$$ = $1 ^ $3;
9947dd7cddfSDavid du Colombier 	}
9957dd7cddfSDavid du Colombier |	expr '|' expr
9967dd7cddfSDavid du Colombier 	{
9977dd7cddfSDavid du Colombier 		$$ = $1 | $3;
9987dd7cddfSDavid du Colombier 	}
999