xref: /plan9/sys/src/cmd/ka/a.y (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier %{
23e12c5d1SDavid du Colombier #include "a.h"
33e12c5d1SDavid du Colombier %}
43e12c5d1SDavid du Colombier %union
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 	Sym	*sym;
73e12c5d1SDavid du Colombier 	long	lval;
83e12c5d1SDavid du Colombier 	double	dval;
93e12c5d1SDavid du Colombier 	char	sval[8];
103e12c5d1SDavid du Colombier 	Gen	gen;
113e12c5d1SDavid du Colombier }
123e12c5d1SDavid du Colombier %left	'|'
133e12c5d1SDavid du Colombier %left	'^'
143e12c5d1SDavid du Colombier %left	'&'
153e12c5d1SDavid du Colombier %left	'<' '>'
163e12c5d1SDavid du Colombier %left	'+' '-'
173e12c5d1SDavid du Colombier %left	'*' '/' '%'
183e12c5d1SDavid du Colombier %token	<lval>	LMOVW LMOVD LMOVB LSWAP LADDW LCMP
193e12c5d1SDavid du Colombier %token	<lval>	LBRA LFMOV LFCONV LFADD LCPOP LTRAP LJMPL LXORW
203e12c5d1SDavid du Colombier %token	<lval>	LNOP LEND LRETT LUNIMP LTEXT LDATA LRETRN
213e12c5d1SDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC LCREG LFLUSH
223e12c5d1SDavid du Colombier %token	<lval>	LREG LFREG LR LC LF
23*219b2ee8SDavid du Colombier %token	<lval>	LFSR LFPQ LPSR LSCHED
243e12c5d1SDavid du Colombier %token	<dval>	LFCONST
253e12c5d1SDavid du Colombier %token	<sval>	LSCONST
263e12c5d1SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
273e12c5d1SDavid du Colombier %type	<lval>	con expr pointer offset sreg
28*219b2ee8SDavid du Colombier %type	<gen>	addr rreg name psr creg freg
293e12c5d1SDavid du Colombier %type	<gen>	imm ximm fimm rel fsr fpq
303e12c5d1SDavid du Colombier %%
313e12c5d1SDavid du Colombier prog:
323e12c5d1SDavid du Colombier |	prog line
333e12c5d1SDavid du Colombier 
343e12c5d1SDavid du Colombier line:
353e12c5d1SDavid du Colombier 	LLAB ':'
363e12c5d1SDavid du Colombier 	{
373e12c5d1SDavid du Colombier 		if($1->value != pc)
383e12c5d1SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
393e12c5d1SDavid du Colombier 		$1->value = pc;
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier 	line
423e12c5d1SDavid du Colombier |	LNAME ':'
433e12c5d1SDavid du Colombier 	{
443e12c5d1SDavid du Colombier 		$1->type = LLAB;
453e12c5d1SDavid du Colombier 		$1->value = pc;
463e12c5d1SDavid du Colombier 	}
473e12c5d1SDavid du Colombier 	line
483e12c5d1SDavid du Colombier |	LNAME '=' expr ';'
493e12c5d1SDavid du Colombier 	{
503e12c5d1SDavid du Colombier 		$1->type = LVAR;
513e12c5d1SDavid du Colombier 		$1->value = $3;
523e12c5d1SDavid du Colombier 	}
533e12c5d1SDavid du Colombier |	LVAR '=' expr ';'
543e12c5d1SDavid du Colombier 	{
553e12c5d1SDavid du Colombier 		if($1->value != $3)
563e12c5d1SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
573e12c5d1SDavid du Colombier 		$1->value = $3;
583e12c5d1SDavid du Colombier 	}
59*219b2ee8SDavid du Colombier |	LSCHED ';'
60*219b2ee8SDavid du Colombier 	{
61*219b2ee8SDavid du Colombier 		nosched = $1;
62*219b2ee8SDavid du Colombier 	}
633e12c5d1SDavid du Colombier |	';'
643e12c5d1SDavid du Colombier |	inst ';'
653e12c5d1SDavid du Colombier |	error ';'
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier inst:
683e12c5d1SDavid du Colombier /*
693e12c5d1SDavid du Colombier  * B.1 load integer instructions
703e12c5d1SDavid du Colombier  */
713e12c5d1SDavid du Colombier 	LMOVW rreg ',' rreg
723e12c5d1SDavid du Colombier 	{
733e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
743e12c5d1SDavid du Colombier 	}
753e12c5d1SDavid du Colombier |	LMOVW addr ',' rreg
763e12c5d1SDavid du Colombier 	{
773e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
783e12c5d1SDavid du Colombier 	}
793e12c5d1SDavid du Colombier |	LMOVD addr ',' rreg
803e12c5d1SDavid du Colombier 	{
813e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
823e12c5d1SDavid du Colombier 	}
833e12c5d1SDavid du Colombier |	LMOVB rreg ',' rreg
843e12c5d1SDavid du Colombier 	{
853e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
863e12c5d1SDavid du Colombier 	}
873e12c5d1SDavid du Colombier |	LMOVB addr ',' rreg
883e12c5d1SDavid du Colombier 	{
893e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
903e12c5d1SDavid du Colombier 	}
913e12c5d1SDavid du Colombier /*
923e12c5d1SDavid du Colombier  * B.2 load floating instructions
933e12c5d1SDavid du Colombier  *	includes CSR
943e12c5d1SDavid du Colombier  */
953e12c5d1SDavid du Colombier |	LMOVD addr ',' freg
963e12c5d1SDavid du Colombier 	{
973e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
983e12c5d1SDavid du Colombier 	}
993e12c5d1SDavid du Colombier |	LFMOV addr ',' freg
1003e12c5d1SDavid du Colombier 	{
1013e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1023e12c5d1SDavid du Colombier 	}
1033e12c5d1SDavid du Colombier |	LFMOV fimm ',' freg
1043e12c5d1SDavid du Colombier 	{
1053e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1063e12c5d1SDavid du Colombier 	}
1073e12c5d1SDavid du Colombier |	LFMOV freg ',' freg
1083e12c5d1SDavid du Colombier 	{
1093e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1103e12c5d1SDavid du Colombier 	}
1113e12c5d1SDavid du Colombier |	LFMOV freg ',' addr
1123e12c5d1SDavid du Colombier 	{
1133e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1143e12c5d1SDavid du Colombier 	}
1153e12c5d1SDavid du Colombier |	LMOVW addr ',' fsr
1163e12c5d1SDavid du Colombier 	{
1173e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1183e12c5d1SDavid du Colombier 	}
1193e12c5d1SDavid du Colombier /*
1203e12c5d1SDavid du Colombier  * B.3 load coprocessor instructions
1213e12c5d1SDavid du Colombier  *	excludes CSR
1223e12c5d1SDavid du Colombier  */
1233e12c5d1SDavid du Colombier |	LMOVW addr ',' creg
1243e12c5d1SDavid du Colombier 	{
1253e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1263e12c5d1SDavid du Colombier 	}
1273e12c5d1SDavid du Colombier |	LMOVD addr ',' creg
1283e12c5d1SDavid du Colombier 	{
1293e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1303e12c5d1SDavid du Colombier 	}
1313e12c5d1SDavid du Colombier /*
1323e12c5d1SDavid du Colombier  * B.4 store integer instructions
1333e12c5d1SDavid du Colombier  */
1343e12c5d1SDavid du Colombier |	LMOVW rreg ',' addr
1353e12c5d1SDavid du Colombier 	{
1363e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1373e12c5d1SDavid du Colombier 	}
1383e12c5d1SDavid du Colombier |	LMOVW imm ',' addr
1393e12c5d1SDavid du Colombier 	{
1403e12c5d1SDavid du Colombier 		if($2.offset != 0)
1413e12c5d1SDavid du Colombier 			yyerror("constant must be zero");
1423e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1433e12c5d1SDavid du Colombier 	}
1443e12c5d1SDavid du Colombier |	LMOVD rreg ',' addr
1453e12c5d1SDavid du Colombier 	{
1463e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1473e12c5d1SDavid du Colombier 	}
1483e12c5d1SDavid du Colombier |	LMOVB rreg ',' addr
1493e12c5d1SDavid du Colombier 	{
1503e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1513e12c5d1SDavid du Colombier 	}
1523e12c5d1SDavid du Colombier |	LMOVB imm ',' addr
1533e12c5d1SDavid du Colombier 	{
1543e12c5d1SDavid du Colombier 		if($2.offset != 0)
1553e12c5d1SDavid du Colombier 			yyerror("constant must be zero");
1563e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1573e12c5d1SDavid du Colombier 	}
1583e12c5d1SDavid du Colombier /*
1593e12c5d1SDavid du Colombier  * B.5 store floating instructions
1603e12c5d1SDavid du Colombier  *	includes CSR and CQ
1613e12c5d1SDavid du Colombier  */
1623e12c5d1SDavid du Colombier |	LMOVW freg ',' addr
1633e12c5d1SDavid du Colombier 	{
1643e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1653e12c5d1SDavid du Colombier 	}
1663e12c5d1SDavid du Colombier |	LMOVD freg ',' addr
1673e12c5d1SDavid du Colombier 	{
1683e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1693e12c5d1SDavid du Colombier 	}
1703e12c5d1SDavid du Colombier |	LMOVW fsr ',' addr
1713e12c5d1SDavid du Colombier 	{
1723e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1733e12c5d1SDavid du Colombier 	}
1743e12c5d1SDavid du Colombier |	LMOVD fpq ',' addr
1753e12c5d1SDavid du Colombier 	{
1763e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1773e12c5d1SDavid du Colombier 	}
1783e12c5d1SDavid du Colombier /*
1793e12c5d1SDavid du Colombier  * B.6 store coprocessor instructions
1803e12c5d1SDavid du Colombier  *	excludes CSR and CQ
1813e12c5d1SDavid du Colombier  */
1823e12c5d1SDavid du Colombier |	LMOVW creg ',' addr
1833e12c5d1SDavid du Colombier 	{
1843e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1853e12c5d1SDavid du Colombier 	}
1863e12c5d1SDavid du Colombier |	LMOVD creg ',' addr
1873e12c5d1SDavid du Colombier 	{
1883e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1893e12c5d1SDavid du Colombier 	}
1903e12c5d1SDavid du Colombier /*
1913e12c5d1SDavid du Colombier  * B.7 atomic load unsigned byte (TAS)
1923e12c5d1SDavid du Colombier  * B.8 swap
1933e12c5d1SDavid du Colombier  */
1943e12c5d1SDavid du Colombier |	LSWAP addr ',' rreg
1953e12c5d1SDavid du Colombier 	{
1963e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1973e12c5d1SDavid du Colombier 	}
1983e12c5d1SDavid du Colombier /*
1993e12c5d1SDavid du Colombier  * B.9  add instructions
2003e12c5d1SDavid du Colombier  * B.10 tagged add instructions
2013e12c5d1SDavid du Colombier  * B.11 subtract instructions
2023e12c5d1SDavid du Colombier  * B.12 tagged subtract instructions
2033e12c5d1SDavid du Colombier  * B.13 multiply step instruction
2043e12c5d1SDavid du Colombier  * B.14 logical instructions
2053e12c5d1SDavid du Colombier  * B.15 shift instructions
2063e12c5d1SDavid du Colombier  * B.17 save/restore
2073e12c5d1SDavid du Colombier  */
2083e12c5d1SDavid du Colombier |	LADDW rreg ',' sreg ',' rreg
2093e12c5d1SDavid du Colombier 	{
2103e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
2113e12c5d1SDavid du Colombier 	}
2123e12c5d1SDavid du Colombier |	LADDW imm ',' sreg ',' rreg
2133e12c5d1SDavid du Colombier 	{
2143e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
2153e12c5d1SDavid du Colombier 	}
2163e12c5d1SDavid du Colombier |	LADDW rreg ',' rreg
2173e12c5d1SDavid du Colombier 	{
2183e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2193e12c5d1SDavid du Colombier 	}
2203e12c5d1SDavid du Colombier |	LADDW imm ',' rreg
2213e12c5d1SDavid du Colombier 	{
2223e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2233e12c5d1SDavid du Colombier 	}
2243e12c5d1SDavid du Colombier |	LXORW rreg ',' sreg ',' rreg
2253e12c5d1SDavid du Colombier 	{
2263e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
2273e12c5d1SDavid du Colombier 	}
2283e12c5d1SDavid du Colombier |	LXORW imm ',' sreg ',' rreg
2293e12c5d1SDavid du Colombier 	{
2303e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
2313e12c5d1SDavid du Colombier 	}
2323e12c5d1SDavid du Colombier |	LXORW rreg ',' rreg
2333e12c5d1SDavid du Colombier 	{
2343e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2353e12c5d1SDavid du Colombier 	}
2363e12c5d1SDavid du Colombier |	LXORW imm ',' rreg
2373e12c5d1SDavid du Colombier 	{
2383e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2393e12c5d1SDavid du Colombier 	}
2403e12c5d1SDavid du Colombier /*
2413e12c5d1SDavid du Colombier  * B.16 set hi
2423e12c5d1SDavid du Colombier  *	other pseudo moves
2433e12c5d1SDavid du Colombier  */
2443e12c5d1SDavid du Colombier |	LMOVW imm ',' rreg
2453e12c5d1SDavid du Colombier 	{
2463e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2473e12c5d1SDavid du Colombier 	}
2483e12c5d1SDavid du Colombier |	LMOVD imm ',' rreg
2493e12c5d1SDavid du Colombier 	{
2503e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2513e12c5d1SDavid du Colombier 	}
2523e12c5d1SDavid du Colombier |	LMOVW ximm ',' rreg
2533e12c5d1SDavid du Colombier 	{
2543e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2553e12c5d1SDavid du Colombier 	}
2563e12c5d1SDavid du Colombier |	LMOVD ximm ',' rreg
2573e12c5d1SDavid du Colombier 	{
2583e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2593e12c5d1SDavid du Colombier 	}
2603e12c5d1SDavid du Colombier /*
2613e12c5d1SDavid du Colombier  * B.18 branch on integer condition
2623e12c5d1SDavid du Colombier  * B.19 floating point branch on condition
2633e12c5d1SDavid du Colombier  * B.20 coprocessor branch on condition
2643e12c5d1SDavid du Colombier  */
2653e12c5d1SDavid du Colombier |	LBRA comma rel
2663e12c5d1SDavid du Colombier 	{
2673e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2683e12c5d1SDavid du Colombier 	}
2693e12c5d1SDavid du Colombier /*
2703e12c5d1SDavid du Colombier  * B.21 call instruction
2713e12c5d1SDavid du Colombier  * B.22 jump and link instruction
2723e12c5d1SDavid du Colombier  */
2733e12c5d1SDavid du Colombier |	LJMPL comma rel
2743e12c5d1SDavid du Colombier 	{
2753e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2763e12c5d1SDavid du Colombier 	}
2773e12c5d1SDavid du Colombier |	LJMPL comma addr
2783e12c5d1SDavid du Colombier 	{
2793e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2803e12c5d1SDavid du Colombier 	}
2813e12c5d1SDavid du Colombier |	LJMPL comma sreg ',' rel
2823e12c5d1SDavid du Colombier 	{
2833e12c5d1SDavid du Colombier 		outcode($1, &nullgen, $3, &$5);
2843e12c5d1SDavid du Colombier 	}
2853e12c5d1SDavid du Colombier |	LJMPL comma sreg ',' addr
2863e12c5d1SDavid du Colombier 	{
2873e12c5d1SDavid du Colombier 		outcode($1, &nullgen, $3, &$5);
2883e12c5d1SDavid du Colombier 	}
2893e12c5d1SDavid du Colombier /*
2903e12c5d1SDavid du Colombier  * B.23 return from trap
2913e12c5d1SDavid du Colombier  */
2923e12c5d1SDavid du Colombier |	LRETT rreg ',' rreg
2933e12c5d1SDavid du Colombier 	{
2943e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2953e12c5d1SDavid du Colombier 	}
2963e12c5d1SDavid du Colombier /*
2973e12c5d1SDavid du Colombier  * B.28 instruction cache flush
2983e12c5d1SDavid du Colombier  */
2993e12c5d1SDavid du Colombier |	LFLUSH rel comma
3003e12c5d1SDavid du Colombier 	{
3013e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
3023e12c5d1SDavid du Colombier 	}
3033e12c5d1SDavid du Colombier |	LFLUSH addr comma
3043e12c5d1SDavid du Colombier 	{
3053e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
3063e12c5d1SDavid du Colombier 	}
3073e12c5d1SDavid du Colombier /*
3083e12c5d1SDavid du Colombier  * B.24 trap on condition
3093e12c5d1SDavid du Colombier  */
3103e12c5d1SDavid du Colombier |	LTRAP rreg ',' sreg
3113e12c5d1SDavid du Colombier 	{
3123e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
3133e12c5d1SDavid du Colombier 	}
3143e12c5d1SDavid du Colombier |	LTRAP imm ',' sreg
3153e12c5d1SDavid du Colombier 	{
3163e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
3173e12c5d1SDavid du Colombier 	}
3183e12c5d1SDavid du Colombier |	LTRAP rreg comma
3193e12c5d1SDavid du Colombier 	{
3203e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
3213e12c5d1SDavid du Colombier 	}
3223e12c5d1SDavid du Colombier |	LTRAP comma
3233e12c5d1SDavid du Colombier 	{
3243e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
3253e12c5d1SDavid du Colombier 	}
3263e12c5d1SDavid du Colombier /*
3273e12c5d1SDavid du Colombier  * B.25 read state register instructions
3283e12c5d1SDavid du Colombier  */
3293e12c5d1SDavid du Colombier |	LMOVW psr ',' rreg
3303e12c5d1SDavid du Colombier 	{
3313e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3323e12c5d1SDavid du Colombier 	}
3333e12c5d1SDavid du Colombier /*
3343e12c5d1SDavid du Colombier  * B.26 write state register instructions BOTCH XOR
3353e12c5d1SDavid du Colombier  */
3363e12c5d1SDavid du Colombier |	LMOVW rreg ',' psr
3373e12c5d1SDavid du Colombier 	{
3383e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3393e12c5d1SDavid du Colombier 	}
3403e12c5d1SDavid du Colombier |	LMOVW imm ',' psr
3413e12c5d1SDavid du Colombier 	{
3423e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3433e12c5d1SDavid du Colombier 	}
3443e12c5d1SDavid du Colombier |	LXORW rreg ',' sreg ',' psr
3453e12c5d1SDavid du Colombier 	{
3463e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
3473e12c5d1SDavid du Colombier 	}
3483e12c5d1SDavid du Colombier |	LXORW imm ',' sreg ',' psr
3493e12c5d1SDavid du Colombier 	{
3503e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
3513e12c5d1SDavid du Colombier 	}
3523e12c5d1SDavid du Colombier /*
3533e12c5d1SDavid du Colombier  * B.27 unimplemented trap
3543e12c5d1SDavid du Colombier  */
3553e12c5d1SDavid du Colombier |	LUNIMP	comma
3563e12c5d1SDavid du Colombier 	{
3573e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
3583e12c5d1SDavid du Colombier 	}
3593e12c5d1SDavid du Colombier |	LUNIMP imm comma
3603e12c5d1SDavid du Colombier 	{
3613e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
3623e12c5d1SDavid du Colombier 	}
3633e12c5d1SDavid du Colombier /*
3643e12c5d1SDavid du Colombier  * B.29 floating point operate
3653e12c5d1SDavid du Colombier  */
3663e12c5d1SDavid du Colombier |	LFCONV freg ',' freg
3673e12c5d1SDavid du Colombier 	{
3683e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3693e12c5d1SDavid du Colombier 	}
3703e12c5d1SDavid du Colombier |	LFADD freg ',' freg
3713e12c5d1SDavid du Colombier 	{
3723e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3733e12c5d1SDavid du Colombier 	}
3743e12c5d1SDavid du Colombier |	LFADD freg ',' freg ',' freg
3753e12c5d1SDavid du Colombier 	{
3763e12c5d1SDavid du Colombier 		outcode($1, &$2, $4.reg, &$6);
3773e12c5d1SDavid du Colombier 	}
3783e12c5d1SDavid du Colombier /*
3793e12c5d1SDavid du Colombier  * B.30 coprocessor operate
3803e12c5d1SDavid du Colombier  */
3813e12c5d1SDavid du Colombier |	LCPOP creg ',' creg
3823e12c5d1SDavid du Colombier 	{
3833e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3843e12c5d1SDavid du Colombier 	}
3853e12c5d1SDavid du Colombier |	LCPOP creg ',' creg ',' creg
3863e12c5d1SDavid du Colombier 	{
3873e12c5d1SDavid du Colombier 		outcode($1, &$2, $4.reg, &$6);
3883e12c5d1SDavid du Colombier 	}
3893e12c5d1SDavid du Colombier /*
3903e12c5d1SDavid du Colombier  * CMP
3913e12c5d1SDavid du Colombier  */
3923e12c5d1SDavid du Colombier |	LCMP rreg ',' rreg
3933e12c5d1SDavid du Colombier 	{
3943e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3953e12c5d1SDavid du Colombier 	}
3963e12c5d1SDavid du Colombier |	LCMP rreg ',' imm
3973e12c5d1SDavid du Colombier 	{
3983e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
3993e12c5d1SDavid du Colombier 	}
4003e12c5d1SDavid du Colombier /*
4013e12c5d1SDavid du Colombier  * NOP
4023e12c5d1SDavid du Colombier  */
4033e12c5d1SDavid du Colombier |	LNOP comma
4043e12c5d1SDavid du Colombier 	{
4053e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
4063e12c5d1SDavid du Colombier 	}
4073e12c5d1SDavid du Colombier |	LNOP rreg comma
4083e12c5d1SDavid du Colombier 	{
4093e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
4103e12c5d1SDavid du Colombier 	}
4113e12c5d1SDavid du Colombier |	LNOP freg comma
4123e12c5d1SDavid du Colombier 	{
4133e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
4143e12c5d1SDavid du Colombier 	}
4153e12c5d1SDavid du Colombier |	LNOP ',' rreg
4163e12c5d1SDavid du Colombier 	{
4173e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
4183e12c5d1SDavid du Colombier 	}
4193e12c5d1SDavid du Colombier |	LNOP ',' freg
4203e12c5d1SDavid du Colombier 	{
4213e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
4223e12c5d1SDavid du Colombier 	}
4233e12c5d1SDavid du Colombier /*
4243e12c5d1SDavid du Colombier  * END
4253e12c5d1SDavid du Colombier  */
4263e12c5d1SDavid du Colombier |	LEND comma
4273e12c5d1SDavid du Colombier 	{
4283e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
4293e12c5d1SDavid du Colombier 	}
4303e12c5d1SDavid du Colombier /*
4313e12c5d1SDavid du Colombier  * TEXT/GLOBL
4323e12c5d1SDavid du Colombier  */
4333e12c5d1SDavid du Colombier |	LTEXT name ',' imm
4343e12c5d1SDavid du Colombier 	{
4353e12c5d1SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
4363e12c5d1SDavid du Colombier 	}
4373e12c5d1SDavid du Colombier |	LTEXT name ',' con ',' imm
4383e12c5d1SDavid du Colombier 	{
4393e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
4403e12c5d1SDavid du Colombier 	}
4413e12c5d1SDavid du Colombier /*
4423e12c5d1SDavid du Colombier  * DATA
4433e12c5d1SDavid du Colombier  */
4443e12c5d1SDavid du Colombier |	LDATA name '/' con ',' imm
4453e12c5d1SDavid du Colombier 	{
4463e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
4473e12c5d1SDavid du Colombier 	}
4483e12c5d1SDavid du Colombier |	LDATA name '/' con ',' ximm
4493e12c5d1SDavid du Colombier 	{
4503e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
4513e12c5d1SDavid du Colombier 	}
4523e12c5d1SDavid du Colombier |	LDATA name '/' con ',' fimm
4533e12c5d1SDavid du Colombier 	{
4543e12c5d1SDavid du Colombier 		outcode($1, &$2, $4, &$6);
4553e12c5d1SDavid du Colombier 	}
4563e12c5d1SDavid du Colombier /*
4573e12c5d1SDavid du Colombier  * RETURN
4583e12c5d1SDavid du Colombier  */
4593e12c5d1SDavid du Colombier |	LRETRN	comma
4603e12c5d1SDavid du Colombier 	{
4613e12c5d1SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
4623e12c5d1SDavid du Colombier 	}
4633e12c5d1SDavid du Colombier 
4643e12c5d1SDavid du Colombier rel:
4653e12c5d1SDavid du Colombier 	con '(' LPC ')'
4663e12c5d1SDavid du Colombier 	{
4673e12c5d1SDavid du Colombier 		$$ = nullgen;
4683e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
4693e12c5d1SDavid du Colombier 		$$.offset = $1 + pc;
4703e12c5d1SDavid du Colombier 	}
4713e12c5d1SDavid du Colombier |	LNAME offset
4723e12c5d1SDavid du Colombier 	{
4733e12c5d1SDavid du Colombier 		$$ = nullgen;
4743e12c5d1SDavid du Colombier 		if(pass == 2)
4753e12c5d1SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
4763e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
4773e12c5d1SDavid du Colombier 		$$.sym = $1;
4783e12c5d1SDavid du Colombier 		$$.offset = $2;
4793e12c5d1SDavid du Colombier 	}
4803e12c5d1SDavid du Colombier |	LLAB offset
4813e12c5d1SDavid du Colombier 	{
4823e12c5d1SDavid du Colombier 		$$ = nullgen;
4833e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
4843e12c5d1SDavid du Colombier 		$$.sym = $1;
4853e12c5d1SDavid du Colombier 		$$.offset = $1->value + $2;
4863e12c5d1SDavid du Colombier 	}
4873e12c5d1SDavid du Colombier 
4883e12c5d1SDavid du Colombier rreg:
4893e12c5d1SDavid du Colombier 	sreg
4903e12c5d1SDavid du Colombier 	{
4913e12c5d1SDavid du Colombier 		$$ = nullgen;
4923e12c5d1SDavid du Colombier 		$$.type = D_REG;
4933e12c5d1SDavid du Colombier 		$$.reg = $1;
4943e12c5d1SDavid du Colombier 	}
4953e12c5d1SDavid du Colombier 
4963e12c5d1SDavid du Colombier fsr:
4973e12c5d1SDavid du Colombier 	LFSR
4983e12c5d1SDavid du Colombier 	{
4993e12c5d1SDavid du Colombier 		$$ = nullgen;
5003e12c5d1SDavid du Colombier 		$$.type = D_PREG;
5013e12c5d1SDavid du Colombier 		$$.reg = $1;
5023e12c5d1SDavid du Colombier 	}
5033e12c5d1SDavid du Colombier 
5043e12c5d1SDavid du Colombier fpq:
5053e12c5d1SDavid du Colombier 	LFPQ
5063e12c5d1SDavid du Colombier 	{
5073e12c5d1SDavid du Colombier 		$$ = nullgen;
5083e12c5d1SDavid du Colombier 		$$.type = D_PREG;
5093e12c5d1SDavid du Colombier 		$$.reg = $1;
5103e12c5d1SDavid du Colombier 	}
5113e12c5d1SDavid du Colombier 
5123e12c5d1SDavid du Colombier psr:
5133e12c5d1SDavid du Colombier 	LPSR
5143e12c5d1SDavid du Colombier 	{
5153e12c5d1SDavid du Colombier 		$$ = nullgen;
5163e12c5d1SDavid du Colombier 		$$.type = D_PREG;
5173e12c5d1SDavid du Colombier 		$$.reg = $1;
5183e12c5d1SDavid du Colombier 	}
5193e12c5d1SDavid du Colombier 
5203e12c5d1SDavid du Colombier creg:
5213e12c5d1SDavid du Colombier 	LCREG
5223e12c5d1SDavid du Colombier 	{
5233e12c5d1SDavid du Colombier 		$$ = nullgen;
5243e12c5d1SDavid du Colombier 		$$.type = D_CREG;
5253e12c5d1SDavid du Colombier 		$$.reg = $1;
5263e12c5d1SDavid du Colombier 	}
5273e12c5d1SDavid du Colombier |	LC '(' con ')'
5283e12c5d1SDavid du Colombier 	{
5293e12c5d1SDavid du Colombier 		$$ = nullgen;
5303e12c5d1SDavid du Colombier 		$$.type = D_CREG;
5313e12c5d1SDavid du Colombier 		$$.reg = $3;
5323e12c5d1SDavid du Colombier 	}
5333e12c5d1SDavid du Colombier 
5343e12c5d1SDavid du Colombier freg:
5353e12c5d1SDavid du Colombier 	LFREG
5363e12c5d1SDavid du Colombier 	{
5373e12c5d1SDavid du Colombier 		$$ = nullgen;
5383e12c5d1SDavid du Colombier 		$$.type = D_FREG;
5393e12c5d1SDavid du Colombier 		$$.reg = $1;
5403e12c5d1SDavid du Colombier 	}
5413e12c5d1SDavid du Colombier |	LF '(' con ')'
5423e12c5d1SDavid du Colombier 	{
5433e12c5d1SDavid du Colombier 		$$ = nullgen;
5443e12c5d1SDavid du Colombier 		$$.type = D_FREG;
5453e12c5d1SDavid du Colombier 		$$.reg = $3;
5463e12c5d1SDavid du Colombier 	}
5473e12c5d1SDavid du Colombier 
5483e12c5d1SDavid du Colombier ximm:
5493e12c5d1SDavid du Colombier 	'$' addr
5503e12c5d1SDavid du Colombier 	{
5513e12c5d1SDavid du Colombier 		$$ = $2;
5523e12c5d1SDavid du Colombier 		$$.type = D_CONST;
5533e12c5d1SDavid du Colombier 	}
5543e12c5d1SDavid du Colombier |	'$' LSCONST
5553e12c5d1SDavid du Colombier 	{
5563e12c5d1SDavid du Colombier 		$$ = nullgen;
5573e12c5d1SDavid du Colombier 		$$.type = D_SCONST;
5583e12c5d1SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
5593e12c5d1SDavid du Colombier 	}
5603e12c5d1SDavid du Colombier 
5613e12c5d1SDavid du Colombier fimm:
5623e12c5d1SDavid du Colombier 	'$' LFCONST
5633e12c5d1SDavid du Colombier 	{
5643e12c5d1SDavid du Colombier 		$$ = nullgen;
5653e12c5d1SDavid du Colombier 		$$.type = D_FCONST;
5663e12c5d1SDavid du Colombier 		$$.dval = $2;
5673e12c5d1SDavid du Colombier 	}
5683e12c5d1SDavid du Colombier |	'$' '-' LFCONST
5693e12c5d1SDavid du Colombier 	{
5703e12c5d1SDavid du Colombier 		$$ = nullgen;
5713e12c5d1SDavid du Colombier 		$$.type = D_FCONST;
5723e12c5d1SDavid du Colombier 		$$.dval = -$3;
5733e12c5d1SDavid du Colombier 	}
5743e12c5d1SDavid du Colombier 
5753e12c5d1SDavid du Colombier imm:	'$' con
5763e12c5d1SDavid du Colombier 	{
5773e12c5d1SDavid du Colombier 		$$ = nullgen;
5783e12c5d1SDavid du Colombier 		$$.type = D_CONST;
5793e12c5d1SDavid du Colombier 		$$.offset = $2;
5803e12c5d1SDavid du Colombier 	}
5813e12c5d1SDavid du Colombier 
5823e12c5d1SDavid du Colombier sreg:
5833e12c5d1SDavid du Colombier 	LREG
5843e12c5d1SDavid du Colombier |	LR '(' con ')'
5853e12c5d1SDavid du Colombier 	{
5863e12c5d1SDavid du Colombier 		if($$ < 0 || $$ >= NREG)
5873e12c5d1SDavid du Colombier 			print("register value out of range\n");
5883e12c5d1SDavid du Colombier 		$$ = $3;
5893e12c5d1SDavid du Colombier 	}
5903e12c5d1SDavid du Colombier 
591*219b2ee8SDavid du Colombier addr:
5923e12c5d1SDavid du Colombier 	'(' sreg ')'
5933e12c5d1SDavid du Colombier 	{
5943e12c5d1SDavid du Colombier 		$$ = nullgen;
5953e12c5d1SDavid du Colombier 		$$.type = D_OREG;
5963e12c5d1SDavid du Colombier 		$$.reg = $2;
5973e12c5d1SDavid du Colombier 		$$.offset = 0;
5983e12c5d1SDavid du Colombier 	}
5993e12c5d1SDavid du Colombier |	'(' sreg ',' con ')'
6003e12c5d1SDavid du Colombier 	{
6013e12c5d1SDavid du Colombier 		$$ = nullgen;
6023e12c5d1SDavid du Colombier 		$$.type = D_ASI;
6033e12c5d1SDavid du Colombier 		$$.reg = $2;
6043e12c5d1SDavid du Colombier 		$$.offset = $4;
6053e12c5d1SDavid du Colombier 	}
6063e12c5d1SDavid du Colombier |	'(' sreg '+' sreg ')'
6073e12c5d1SDavid du Colombier 	{
6083e12c5d1SDavid du Colombier 		$$ = nullgen;
6093e12c5d1SDavid du Colombier 		$$.type = D_OREG;
6103e12c5d1SDavid du Colombier 		$$.reg = $2;
6113e12c5d1SDavid du Colombier 		$$.xreg = $4;
6123e12c5d1SDavid du Colombier 		$$.offset = 0;
6133e12c5d1SDavid du Colombier 	}
614*219b2ee8SDavid du Colombier |	name
6153e12c5d1SDavid du Colombier |	con '(' sreg ')'
6163e12c5d1SDavid du Colombier 	{
6173e12c5d1SDavid du Colombier 		$$ = nullgen;
6183e12c5d1SDavid du Colombier 		$$.type = D_OREG;
6193e12c5d1SDavid du Colombier 		$$.reg = $3;
6203e12c5d1SDavid du Colombier 		$$.offset = $1;
6213e12c5d1SDavid du Colombier 	}
6223e12c5d1SDavid du Colombier 
6233e12c5d1SDavid du Colombier name:
6243e12c5d1SDavid du Colombier 	con '(' pointer ')'
6253e12c5d1SDavid du Colombier 	{
6263e12c5d1SDavid du Colombier 		$$ = nullgen;
6273e12c5d1SDavid du Colombier 		$$.type = D_OREG;
6283e12c5d1SDavid du Colombier 		$$.name = $3;
6293e12c5d1SDavid du Colombier 		$$.sym = S;
6303e12c5d1SDavid du Colombier 		$$.offset = $1;
6313e12c5d1SDavid du Colombier 	}
6323e12c5d1SDavid du Colombier |	LNAME offset '(' pointer ')'
6333e12c5d1SDavid du Colombier 	{
6343e12c5d1SDavid du Colombier 		$$ = nullgen;
6353e12c5d1SDavid du Colombier 		$$.type = D_OREG;
6363e12c5d1SDavid du Colombier 		$$.name = $4;
6373e12c5d1SDavid du Colombier 		$$.sym = $1;
6383e12c5d1SDavid du Colombier 		$$.offset = $2;
6393e12c5d1SDavid du Colombier 	}
6403e12c5d1SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
6413e12c5d1SDavid du Colombier 	{
6423e12c5d1SDavid du Colombier 		$$ = nullgen;
6433e12c5d1SDavid du Colombier 		$$.type = D_OREG;
6443e12c5d1SDavid du Colombier 		$$.name = D_STATIC;
6453e12c5d1SDavid du Colombier 		$$.sym = $1;
6463e12c5d1SDavid du Colombier 		$$.offset = $4;
6473e12c5d1SDavid du Colombier 	}
6483e12c5d1SDavid du Colombier 
6493e12c5d1SDavid du Colombier comma:
6503e12c5d1SDavid du Colombier |	','
6513e12c5d1SDavid du Colombier 
6523e12c5d1SDavid du Colombier offset:
6533e12c5d1SDavid du Colombier 	{
6543e12c5d1SDavid du Colombier 		$$ = 0;
6553e12c5d1SDavid du Colombier 	}
6563e12c5d1SDavid du Colombier |	'+' con
6573e12c5d1SDavid du Colombier 	{
6583e12c5d1SDavid du Colombier 		$$ = $2;
6593e12c5d1SDavid du Colombier 	}
6603e12c5d1SDavid du Colombier |	'-' con
6613e12c5d1SDavid du Colombier 	{
6623e12c5d1SDavid du Colombier 		$$ = -$2;
6633e12c5d1SDavid du Colombier 	}
6643e12c5d1SDavid du Colombier 
6653e12c5d1SDavid du Colombier pointer:
6663e12c5d1SDavid du Colombier 	LSB
6673e12c5d1SDavid du Colombier |	LSP
6683e12c5d1SDavid du Colombier |	LFP
6693e12c5d1SDavid du Colombier 
6703e12c5d1SDavid du Colombier con:
6713e12c5d1SDavid du Colombier 	LCONST
6723e12c5d1SDavid du Colombier |	LVAR
6733e12c5d1SDavid du Colombier 	{
6743e12c5d1SDavid du Colombier 		$$ = $1->value;
6753e12c5d1SDavid du Colombier 	}
6763e12c5d1SDavid du Colombier |	'-' con
6773e12c5d1SDavid du Colombier 	{
6783e12c5d1SDavid du Colombier 		$$ = -$2;
6793e12c5d1SDavid du Colombier 	}
6803e12c5d1SDavid du Colombier |	'+' con
6813e12c5d1SDavid du Colombier 	{
6823e12c5d1SDavid du Colombier 		$$ = $2;
6833e12c5d1SDavid du Colombier 	}
6843e12c5d1SDavid du Colombier |	'~' con
6853e12c5d1SDavid du Colombier 	{
6863e12c5d1SDavid du Colombier 		$$ = ~$2;
6873e12c5d1SDavid du Colombier 	}
6883e12c5d1SDavid du Colombier |	'(' expr ')'
6893e12c5d1SDavid du Colombier 	{
6903e12c5d1SDavid du Colombier 		$$ = $2;
6913e12c5d1SDavid du Colombier 	}
6923e12c5d1SDavid du Colombier 
6933e12c5d1SDavid du Colombier expr:
6943e12c5d1SDavid du Colombier 	con
6953e12c5d1SDavid du Colombier |	expr '+' expr
6963e12c5d1SDavid du Colombier 	{
6973e12c5d1SDavid du Colombier 		$$ = $1 + $3;
6983e12c5d1SDavid du Colombier 	}
6993e12c5d1SDavid du Colombier |	expr '-' expr
7003e12c5d1SDavid du Colombier 	{
7013e12c5d1SDavid du Colombier 		$$ = $1 - $3;
7023e12c5d1SDavid du Colombier 	}
7033e12c5d1SDavid du Colombier |	expr '*' expr
7043e12c5d1SDavid du Colombier 	{
7053e12c5d1SDavid du Colombier 		$$ = $1 * $3;
7063e12c5d1SDavid du Colombier 	}
7073e12c5d1SDavid du Colombier |	expr '/' expr
7083e12c5d1SDavid du Colombier 	{
7093e12c5d1SDavid du Colombier 		$$ = $1 / $3;
7103e12c5d1SDavid du Colombier 	}
7113e12c5d1SDavid du Colombier |	expr '%' expr
7123e12c5d1SDavid du Colombier 	{
7133e12c5d1SDavid du Colombier 		$$ = $1 % $3;
7143e12c5d1SDavid du Colombier 	}
7153e12c5d1SDavid du Colombier |	expr '<' '<' expr
7163e12c5d1SDavid du Colombier 	{
7173e12c5d1SDavid du Colombier 		$$ = $1 << $4;
7183e12c5d1SDavid du Colombier 	}
7193e12c5d1SDavid du Colombier |	expr '>' '>' expr
7203e12c5d1SDavid du Colombier 	{
7213e12c5d1SDavid du Colombier 		$$ = $1 >> $4;
7223e12c5d1SDavid du Colombier 	}
7233e12c5d1SDavid du Colombier |	expr '&' expr
7243e12c5d1SDavid du Colombier 	{
7253e12c5d1SDavid du Colombier 		$$ = $1 & $3;
7263e12c5d1SDavid du Colombier 	}
7273e12c5d1SDavid du Colombier |	expr '^' expr
7283e12c5d1SDavid du Colombier 	{
7293e12c5d1SDavid du Colombier 		$$ = $1 ^ $3;
7303e12c5d1SDavid du Colombier 	}
7313e12c5d1SDavid du Colombier |	expr '|' expr
7323e12c5d1SDavid du Colombier 	{
7333e12c5d1SDavid du Colombier 		$$ = $1 | $3;
7343e12c5d1SDavid du Colombier 	}
735