xref: /plan9/sys/src/cmd/8a/a.y (revision 6520663fb7ebac8d17e4a1dbc55d10bf525f7b14)
13e12c5d1SDavid du Colombier %{
23e12c5d1SDavid du Colombier #include "a.h"
33e12c5d1SDavid du Colombier %}
43e12c5d1SDavid du Colombier %union	{
53e12c5d1SDavid du Colombier 	Sym	*sym;
63e12c5d1SDavid du Colombier 	long	lval;
7*6520663fSDavid du Colombier 	struct {
8*6520663fSDavid du Colombier 		long v1;
9*6520663fSDavid du Colombier 		long v2;
10*6520663fSDavid du Colombier 	} con2;
113e12c5d1SDavid du Colombier 	double	dval;
123e12c5d1SDavid du Colombier 	char	sval[8];
133e12c5d1SDavid du Colombier 	Gen	gen;
143e12c5d1SDavid du Colombier 	Gen2	gen2;
153e12c5d1SDavid du Colombier }
163e12c5d1SDavid du Colombier %left	'|'
173e12c5d1SDavid du Colombier %left	'^'
183e12c5d1SDavid du Colombier %left	'&'
193e12c5d1SDavid du Colombier %left	'<' '>'
203e12c5d1SDavid du Colombier %left	'+' '-'
213e12c5d1SDavid du Colombier %left	'*' '/' '%'
223e12c5d1SDavid du Colombier %token	<lval>	LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4
23*6520663fSDavid du Colombier %token	<lval>	LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG
243e12c5d1SDavid du Colombier %token	<lval>	LCONST LFP LPC LSB
253e12c5d1SDavid du Colombier %token	<lval>	LBREG LLREG LSREG LFREG
263e12c5d1SDavid du Colombier %token	<dval>	LFCONST
273e12c5d1SDavid du Colombier %token	<sval>	LSCONST LSP
283e12c5d1SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
293e12c5d1SDavid du Colombier %type	<lval>	con expr pointer offset
30*6520663fSDavid du Colombier %type	<con2>	con2
31*6520663fSDavid du Colombier %type	<gen>	mem imm imm2 reg nam rel rem rim rom omem nmem
323e12c5d1SDavid du Colombier %type	<gen2>	nonnon nonrel nonrem rimnon rimrem remrim
33*6520663fSDavid du Colombier %type	<gen2>	spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8
343e12c5d1SDavid du Colombier %%
353e12c5d1SDavid du Colombier prog:
363e12c5d1SDavid du Colombier |	prog line
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier line:
393e12c5d1SDavid du Colombier 	LLAB ':'
403e12c5d1SDavid du Colombier 	{
413e12c5d1SDavid du Colombier 		if($1->value != pc)
423e12c5d1SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
433e12c5d1SDavid du Colombier 		$1->value = pc;
443e12c5d1SDavid du Colombier 	}
453e12c5d1SDavid du Colombier 	line
463e12c5d1SDavid du Colombier |	LNAME ':'
473e12c5d1SDavid du Colombier 	{
483e12c5d1SDavid du Colombier 		$1->type = LLAB;
493e12c5d1SDavid du Colombier 		$1->value = pc;
503e12c5d1SDavid du Colombier 	}
513e12c5d1SDavid du Colombier 	line
523e12c5d1SDavid du Colombier |	';'
533e12c5d1SDavid du Colombier |	inst ';'
543e12c5d1SDavid du Colombier |	error ';'
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier inst:
573e12c5d1SDavid du Colombier 	LNAME '=' expr
583e12c5d1SDavid du Colombier 	{
593e12c5d1SDavid du Colombier 		$1->type = LVAR;
603e12c5d1SDavid du Colombier 		$1->value = $3;
613e12c5d1SDavid du Colombier 	}
623e12c5d1SDavid du Colombier |	LVAR '=' expr
633e12c5d1SDavid du Colombier 	{
643e12c5d1SDavid du Colombier 		if($1->value != $3)
653e12c5d1SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
663e12c5d1SDavid du Colombier 		$1->value = $3;
673e12c5d1SDavid du Colombier 	}
683e12c5d1SDavid du Colombier |	LTYPE0 nonnon	{ outcode($1, &$2); }
693e12c5d1SDavid du Colombier |	LTYPE1 nonrem	{ outcode($1, &$2); }
703e12c5d1SDavid du Colombier |	LTYPE2 rimnon	{ outcode($1, &$2); }
713e12c5d1SDavid du Colombier |	LTYPE3 rimrem	{ outcode($1, &$2); }
723e12c5d1SDavid du Colombier |	LTYPE4 remrim	{ outcode($1, &$2); }
733e12c5d1SDavid du Colombier |	LTYPER nonrel	{ outcode($1, &$2); }
743e12c5d1SDavid du Colombier |	LTYPED spec1	{ outcode($1, &$2); }
753e12c5d1SDavid du Colombier |	LTYPET spec2	{ outcode($1, &$2); }
763e12c5d1SDavid du Colombier |	LTYPEC spec3	{ outcode($1, &$2); }
773e12c5d1SDavid du Colombier |	LTYPEN spec4	{ outcode($1, &$2); }
783e12c5d1SDavid du Colombier |	LTYPES spec5	{ outcode($1, &$2); }
793e12c5d1SDavid du Colombier |	LTYPEM spec6	{ outcode($1, &$2); }
803ff48bf5SDavid du Colombier |	LTYPEI spec7	{ outcode($1, &$2); }
81*6520663fSDavid du Colombier |	LTYPEG spec8	{ outcode($1, &$2); }
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier nonnon:
843e12c5d1SDavid du Colombier 	{
853e12c5d1SDavid du Colombier 		$$.from = nullgen;
863e12c5d1SDavid du Colombier 		$$.to = nullgen;
873e12c5d1SDavid du Colombier 	}
883e12c5d1SDavid du Colombier |	','
893e12c5d1SDavid du Colombier 	{
903e12c5d1SDavid du Colombier 		$$.from = nullgen;
913e12c5d1SDavid du Colombier 		$$.to = nullgen;
923e12c5d1SDavid du Colombier 	}
933e12c5d1SDavid du Colombier 
943e12c5d1SDavid du Colombier rimrem:
953e12c5d1SDavid du Colombier 	rim ',' rem
963e12c5d1SDavid du Colombier 	{
973e12c5d1SDavid du Colombier 		$$.from = $1;
983e12c5d1SDavid du Colombier 		$$.to = $3;
993e12c5d1SDavid du Colombier 	}
1003e12c5d1SDavid du Colombier 
1013e12c5d1SDavid du Colombier remrim:
1023e12c5d1SDavid du Colombier 	rem ',' rim
1033e12c5d1SDavid du Colombier 	{
1043e12c5d1SDavid du Colombier 		$$.from = $1;
1053e12c5d1SDavid du Colombier 		$$.to = $3;
1063e12c5d1SDavid du Colombier 	}
1073e12c5d1SDavid du Colombier 
1083e12c5d1SDavid du Colombier rimnon:
1093e12c5d1SDavid du Colombier 	rim ','
1103e12c5d1SDavid du Colombier 	{
1113e12c5d1SDavid du Colombier 		$$.from = $1;
1123e12c5d1SDavid du Colombier 		$$.to = nullgen;
1133e12c5d1SDavid du Colombier 	}
1143e12c5d1SDavid du Colombier |	rim
1153e12c5d1SDavid du Colombier 	{
1163e12c5d1SDavid du Colombier 		$$.from = $1;
1173e12c5d1SDavid du Colombier 		$$.to = nullgen;
1183e12c5d1SDavid du Colombier 	}
1193e12c5d1SDavid du Colombier 
1203e12c5d1SDavid du Colombier nonrem:
1213e12c5d1SDavid du Colombier 	',' rem
1223e12c5d1SDavid du Colombier 	{
1233e12c5d1SDavid du Colombier 		$$.from = nullgen;
1243e12c5d1SDavid du Colombier 		$$.to = $2;
1253e12c5d1SDavid du Colombier 	}
1263e12c5d1SDavid du Colombier |	rem
1273e12c5d1SDavid du Colombier 	{
1283e12c5d1SDavid du Colombier 		$$.from = nullgen;
1293e12c5d1SDavid du Colombier 		$$.to = $1;
1303e12c5d1SDavid du Colombier 	}
1313e12c5d1SDavid du Colombier 
1323e12c5d1SDavid du Colombier nonrel:
1333e12c5d1SDavid du Colombier 	',' rel
1343e12c5d1SDavid du Colombier 	{
1353e12c5d1SDavid du Colombier 		$$.from = nullgen;
1363e12c5d1SDavid du Colombier 		$$.to = $2;
1373e12c5d1SDavid du Colombier 	}
1383e12c5d1SDavid du Colombier |	rel
1393e12c5d1SDavid du Colombier 	{
1403e12c5d1SDavid du Colombier 		$$.from = nullgen;
1413e12c5d1SDavid du Colombier 		$$.to = $1;
1423e12c5d1SDavid du Colombier 	}
1433e12c5d1SDavid du Colombier 
1443e12c5d1SDavid du Colombier spec1:	/* DATA */
14580ee5cbfSDavid du Colombier 	nam '/' con ',' imm
1463e12c5d1SDavid du Colombier 	{
1473e12c5d1SDavid du Colombier 		$$.from = $1;
1483e12c5d1SDavid du Colombier 		$$.from.scale = $3;
1493e12c5d1SDavid du Colombier 		$$.to = $5;
1503e12c5d1SDavid du Colombier 	}
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier spec2:	/* TEXT */
1533e12c5d1SDavid du Colombier 	mem ',' imm
1543e12c5d1SDavid du Colombier 	{
1553e12c5d1SDavid du Colombier 		$$.from = $1;
1563e12c5d1SDavid du Colombier 		$$.to = $3;
1573e12c5d1SDavid du Colombier 	}
1583e12c5d1SDavid du Colombier |	mem ',' con ',' imm
1593e12c5d1SDavid du Colombier 	{
1603e12c5d1SDavid du Colombier 		$$.from = $1;
1613e12c5d1SDavid du Colombier 		$$.from.scale = $3;
1623e12c5d1SDavid du Colombier 		$$.to = $5;
1633e12c5d1SDavid du Colombier 	}
1643e12c5d1SDavid du Colombier 
1653e12c5d1SDavid du Colombier spec3:	/* JMP/CALL */
1663e12c5d1SDavid du Colombier 	',' rom
1673e12c5d1SDavid du Colombier 	{
1683e12c5d1SDavid du Colombier 		$$.from = nullgen;
1693e12c5d1SDavid du Colombier 		$$.to = $2;
1703e12c5d1SDavid du Colombier 	}
1713e12c5d1SDavid du Colombier |	rom
1723e12c5d1SDavid du Colombier 	{
1733e12c5d1SDavid du Colombier 		$$.from = nullgen;
1743e12c5d1SDavid du Colombier 		$$.to = $1;
1753e12c5d1SDavid du Colombier 	}
1763e12c5d1SDavid du Colombier 
1773e12c5d1SDavid du Colombier spec4:	/* NOP */
1783e12c5d1SDavid du Colombier 	nonnon
1793e12c5d1SDavid du Colombier |	nonrem
1803e12c5d1SDavid du Colombier 
1813e12c5d1SDavid du Colombier spec5:	/* SHL/SHR */
1823e12c5d1SDavid du Colombier 	rim ',' rem
1833e12c5d1SDavid du Colombier 	{
1843e12c5d1SDavid du Colombier 		$$.from = $1;
1853e12c5d1SDavid du Colombier 		$$.to = $3;
1863e12c5d1SDavid du Colombier 	}
1873e12c5d1SDavid du Colombier |	rim ',' rem ':' LLREG
1883e12c5d1SDavid du Colombier 	{
1893e12c5d1SDavid du Colombier 		$$.from = $1;
1903e12c5d1SDavid du Colombier 		$$.to = $3;
1913e12c5d1SDavid du Colombier 		if($$.from.index != D_NONE)
1923e12c5d1SDavid du Colombier 			yyerror("dp shift with lhs index");
1933e12c5d1SDavid du Colombier 		$$.from.index = $5;
1943e12c5d1SDavid du Colombier 	}
1953e12c5d1SDavid du Colombier 
1963e12c5d1SDavid du Colombier spec6:	/* MOVW/MOVL */
1973e12c5d1SDavid du Colombier 	rim ',' rem
1983e12c5d1SDavid du Colombier 	{
1993e12c5d1SDavid du Colombier 		$$.from = $1;
2003e12c5d1SDavid du Colombier 		$$.to = $3;
2013e12c5d1SDavid du Colombier 	}
2023e12c5d1SDavid du Colombier |	rim ',' rem ':' LSREG
2033e12c5d1SDavid du Colombier 	{
2043e12c5d1SDavid du Colombier 		$$.from = $1;
2053e12c5d1SDavid du Colombier 		$$.to = $3;
2063e12c5d1SDavid du Colombier 		if($$.to.index != D_NONE)
2073e12c5d1SDavid du Colombier 			yyerror("dp move with lhs index");
2083e12c5d1SDavid du Colombier 		$$.to.index = $5;
2093e12c5d1SDavid du Colombier 	}
2103e12c5d1SDavid du Colombier 
2113ff48bf5SDavid du Colombier spec7:
2123ff48bf5SDavid du Colombier 	rim ','
2133ff48bf5SDavid du Colombier 	{
2143ff48bf5SDavid du Colombier 		$$.from = $1;
2153ff48bf5SDavid du Colombier 		$$.to = nullgen;
2163ff48bf5SDavid du Colombier 	}
2173ff48bf5SDavid du Colombier |	rim
2183ff48bf5SDavid du Colombier 	{
2193ff48bf5SDavid du Colombier 		$$.from = $1;
2203ff48bf5SDavid du Colombier 		$$.to = nullgen;
2213ff48bf5SDavid du Colombier 	}
2223ff48bf5SDavid du Colombier |	rim ',' rem
2233ff48bf5SDavid du Colombier 	{
2243ff48bf5SDavid du Colombier 		$$.from = $1;
2253ff48bf5SDavid du Colombier 		$$.to = $3;
2263ff48bf5SDavid du Colombier 	}
2273ff48bf5SDavid du Colombier 
228*6520663fSDavid du Colombier spec8:	/* GLOBL */
229*6520663fSDavid du Colombier 	mem ',' imm
230*6520663fSDavid du Colombier 	{
231*6520663fSDavid du Colombier 		$$.from = $1;
232*6520663fSDavid du Colombier 		$$.to = $3;
233*6520663fSDavid du Colombier 	}
234*6520663fSDavid du Colombier |	mem ',' con ',' imm
235*6520663fSDavid du Colombier 	{
236*6520663fSDavid du Colombier 		$$.from = $1;
237*6520663fSDavid du Colombier 		$$.from.scale = $3;
238*6520663fSDavid du Colombier 		$$.to = $5;
239*6520663fSDavid du Colombier 	}
240*6520663fSDavid du Colombier 
2413e12c5d1SDavid du Colombier rem:
2423e12c5d1SDavid du Colombier 	reg
2433e12c5d1SDavid du Colombier |	mem
2443e12c5d1SDavid du Colombier 
2453e12c5d1SDavid du Colombier rom:
2463e12c5d1SDavid du Colombier 	rel
2473e12c5d1SDavid du Colombier |	nmem
2483e12c5d1SDavid du Colombier |	'*' reg
2493e12c5d1SDavid du Colombier 	{
2503e12c5d1SDavid du Colombier 		$$ = $2;
2513e12c5d1SDavid du Colombier 	}
2523e12c5d1SDavid du Colombier |	'*' omem
2533e12c5d1SDavid du Colombier 	{
2543e12c5d1SDavid du Colombier 		$$ = $2;
2553e12c5d1SDavid du Colombier 	}
25680ee5cbfSDavid du Colombier |	reg
25780ee5cbfSDavid du Colombier |	omem
258*6520663fSDavid du Colombier |	imm
2593e12c5d1SDavid du Colombier 
2603e12c5d1SDavid du Colombier rim:
2613e12c5d1SDavid du Colombier 	rem
2623e12c5d1SDavid du Colombier |	imm
2633e12c5d1SDavid du Colombier 
2643e12c5d1SDavid du Colombier rel:
2653e12c5d1SDavid du Colombier 	con '(' LPC ')'
2663e12c5d1SDavid du Colombier 	{
2673e12c5d1SDavid du Colombier 		$$ = nullgen;
2683e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
2693e12c5d1SDavid du Colombier 		$$.offset = $1 + pc;
2703e12c5d1SDavid du Colombier 	}
2713e12c5d1SDavid du Colombier |	LNAME offset
2723e12c5d1SDavid du Colombier 	{
2733e12c5d1SDavid du Colombier 		$$ = nullgen;
2743e12c5d1SDavid du Colombier 		if(pass == 2)
2753e12c5d1SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
2763e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
2773e12c5d1SDavid du Colombier 		$$.sym = $1;
2783e12c5d1SDavid du Colombier 		$$.offset = $2;
2793e12c5d1SDavid du Colombier 	}
2803e12c5d1SDavid du Colombier |	LLAB offset
2813e12c5d1SDavid du Colombier 	{
2823e12c5d1SDavid du Colombier 		$$ = nullgen;
2833e12c5d1SDavid du Colombier 		$$.type = D_BRANCH;
2843e12c5d1SDavid du Colombier 		$$.sym = $1;
2853e12c5d1SDavid du Colombier 		$$.offset = $1->value + $2;
2863e12c5d1SDavid du Colombier 	}
2873e12c5d1SDavid du Colombier 
2883e12c5d1SDavid du Colombier reg:
2893e12c5d1SDavid du Colombier 	LBREG
2903e12c5d1SDavid du Colombier 	{
2913e12c5d1SDavid du Colombier 		$$ = nullgen;
2923e12c5d1SDavid du Colombier 		$$.type = $1;
2933e12c5d1SDavid du Colombier 	}
2943e12c5d1SDavid du Colombier |	LFREG
2953e12c5d1SDavid du Colombier 	{
2963e12c5d1SDavid du Colombier 		$$ = nullgen;
2973e12c5d1SDavid du Colombier 		$$.type = $1;
2983e12c5d1SDavid du Colombier 	}
2993e12c5d1SDavid du Colombier |	LLREG
3003e12c5d1SDavid du Colombier 	{
3013e12c5d1SDavid du Colombier 		$$ = nullgen;
3023e12c5d1SDavid du Colombier 		$$.type = $1;
3033e12c5d1SDavid du Colombier 	}
3043e12c5d1SDavid du Colombier |	LSP
3053e12c5d1SDavid du Colombier 	{
3063e12c5d1SDavid du Colombier 		$$ = nullgen;
3073e12c5d1SDavid du Colombier 		$$.type = D_SP;
3083e12c5d1SDavid du Colombier 	}
3093e12c5d1SDavid du Colombier |	LSREG
3103e12c5d1SDavid du Colombier 	{
3113e12c5d1SDavid du Colombier 		$$ = nullgen;
3123e12c5d1SDavid du Colombier 		$$.type = $1;
3133e12c5d1SDavid du Colombier 	}
3143e12c5d1SDavid du Colombier 
3153e12c5d1SDavid du Colombier imm:
3163e12c5d1SDavid du Colombier 	'$' con
3173e12c5d1SDavid du Colombier 	{
3183e12c5d1SDavid du Colombier 		$$ = nullgen;
3193e12c5d1SDavid du Colombier 		$$.type = D_CONST;
3203e12c5d1SDavid du Colombier 		$$.offset = $2;
3213e12c5d1SDavid du Colombier 	}
3223e12c5d1SDavid du Colombier |	'$' nam
3233e12c5d1SDavid du Colombier 	{
3243e12c5d1SDavid du Colombier 		$$ = $2;
3253e12c5d1SDavid du Colombier 		$$.index = $2.type;
3263e12c5d1SDavid du Colombier 		$$.type = D_ADDR;
327219b2ee8SDavid du Colombier 		/*
3283e12c5d1SDavid du Colombier 		if($2.type == D_AUTO || $2.type == D_PARAM)
3293e12c5d1SDavid du Colombier 			yyerror("constant cannot be automatic: %s",
3303e12c5d1SDavid du Colombier 				$2.sym->name);
331219b2ee8SDavid du Colombier 		 */
3323e12c5d1SDavid du Colombier 	}
3333e12c5d1SDavid du Colombier |	'$' LSCONST
3343e12c5d1SDavid du Colombier 	{
3353e12c5d1SDavid du Colombier 		$$ = nullgen;
3363e12c5d1SDavid du Colombier 		$$.type = D_SCONST;
3373e12c5d1SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
3383e12c5d1SDavid du Colombier 	}
3393e12c5d1SDavid du Colombier |	'$' LFCONST
3403e12c5d1SDavid du Colombier 	{
3413e12c5d1SDavid du Colombier 		$$ = nullgen;
3423e12c5d1SDavid du Colombier 		$$.type = D_FCONST;
3433e12c5d1SDavid du Colombier 		$$.dval = $2;
3443e12c5d1SDavid du Colombier 	}
345219b2ee8SDavid du Colombier |	'$' '(' LFCONST ')'
346219b2ee8SDavid du Colombier 	{
347219b2ee8SDavid du Colombier 		$$ = nullgen;
348219b2ee8SDavid du Colombier 		$$.type = D_FCONST;
349219b2ee8SDavid du Colombier 		$$.dval = $3;
350219b2ee8SDavid du Colombier 	}
3513e12c5d1SDavid du Colombier |	'$' '-' LFCONST
3523e12c5d1SDavid du Colombier 	{
3533e12c5d1SDavid du Colombier 		$$ = nullgen;
3543e12c5d1SDavid du Colombier 		$$.type = D_FCONST;
3553e12c5d1SDavid du Colombier 		$$.dval = -$3;
3563e12c5d1SDavid du Colombier 	}
3573e12c5d1SDavid du Colombier 
358*6520663fSDavid du Colombier imm2:
359*6520663fSDavid du Colombier 	'$' con2
360*6520663fSDavid du Colombier 	{
361*6520663fSDavid du Colombier 		$$ = nullgen;
362*6520663fSDavid du Colombier 		$$.type = D_CONST2;
363*6520663fSDavid du Colombier 		$$.offset = $2.v1;
364*6520663fSDavid du Colombier 		$$.offset2 = $2.v2;
365*6520663fSDavid du Colombier 	}
366*6520663fSDavid du Colombier 
367*6520663fSDavid du Colombier con2:
368*6520663fSDavid du Colombier 	LCONST
369*6520663fSDavid du Colombier 	{
370*6520663fSDavid du Colombier 		$$.v1 = $1;
371*6520663fSDavid du Colombier 		$$.v2 = 0;
372*6520663fSDavid du Colombier 	}
373*6520663fSDavid du Colombier |	'-' LCONST
374*6520663fSDavid du Colombier 	{
375*6520663fSDavid du Colombier 		$$.v1 = -$2;
376*6520663fSDavid du Colombier 		$$.v2 = 0;
377*6520663fSDavid du Colombier 	}
378*6520663fSDavid du Colombier |	LCONST '-' LCONST
379*6520663fSDavid du Colombier 	{
380*6520663fSDavid du Colombier 		$$.v1 = $1;
381*6520663fSDavid du Colombier 		$$.v2 = $3;
382*6520663fSDavid du Colombier 	}
383*6520663fSDavid du Colombier |	'-' LCONST '-' LCONST
384*6520663fSDavid du Colombier 	{
385*6520663fSDavid du Colombier 		$$.v1 = -$2;
386*6520663fSDavid du Colombier 		$$.v2 = $4;
387*6520663fSDavid du Colombier 	}
388*6520663fSDavid du Colombier 
3893e12c5d1SDavid du Colombier mem:
3903e12c5d1SDavid du Colombier 	omem
3913e12c5d1SDavid du Colombier |	nmem
3923e12c5d1SDavid du Colombier 
3933e12c5d1SDavid du Colombier omem:
3943e12c5d1SDavid du Colombier 	con
3953e12c5d1SDavid du Colombier 	{
3963e12c5d1SDavid du Colombier 		$$ = nullgen;
3973e12c5d1SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
3983e12c5d1SDavid du Colombier 		$$.offset = $1;
3993e12c5d1SDavid du Colombier 	}
4003e12c5d1SDavid du Colombier |	con '(' LLREG ')'
4013e12c5d1SDavid du Colombier 	{
4023e12c5d1SDavid du Colombier 		$$ = nullgen;
4033e12c5d1SDavid du Colombier 		$$.type = D_INDIR+$3;
4043e12c5d1SDavid du Colombier 		$$.offset = $1;
4053e12c5d1SDavid du Colombier 	}
4063e12c5d1SDavid du Colombier |	con '(' LSP ')'
4073e12c5d1SDavid du Colombier 	{
4083e12c5d1SDavid du Colombier 		$$ = nullgen;
4093e12c5d1SDavid du Colombier 		$$.type = D_INDIR+D_SP;
4103e12c5d1SDavid du Colombier 		$$.offset = $1;
4113e12c5d1SDavid du Colombier 	}
4123e12c5d1SDavid du Colombier |	con '(' LLREG '*' con ')'
4133e12c5d1SDavid du Colombier 	{
4143e12c5d1SDavid du Colombier 		$$ = nullgen;
4153e12c5d1SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
4163e12c5d1SDavid du Colombier 		$$.offset = $1;
4173e12c5d1SDavid du Colombier 		$$.index = $3;
4183e12c5d1SDavid du Colombier 		$$.scale = $5;
4193e12c5d1SDavid du Colombier 		checkscale($$.scale);
4203e12c5d1SDavid du Colombier 	}
4213e12c5d1SDavid du Colombier |	con '(' LLREG ')' '(' LLREG '*' con ')'
4223e12c5d1SDavid du Colombier 	{
4233e12c5d1SDavid du Colombier 		$$ = nullgen;
4243e12c5d1SDavid du Colombier 		$$.type = D_INDIR+$3;
4253e12c5d1SDavid du Colombier 		$$.offset = $1;
4263e12c5d1SDavid du Colombier 		$$.index = $6;
4273e12c5d1SDavid du Colombier 		$$.scale = $8;
4283e12c5d1SDavid du Colombier 		checkscale($$.scale);
4293e12c5d1SDavid du Colombier 	}
4303e12c5d1SDavid du Colombier |	'(' LLREG ')'
4313e12c5d1SDavid du Colombier 	{
4323e12c5d1SDavid du Colombier 		$$ = nullgen;
4333e12c5d1SDavid du Colombier 		$$.type = D_INDIR+$2;
4343e12c5d1SDavid du Colombier 	}
4353e12c5d1SDavid du Colombier |	'(' LSP ')'
4363e12c5d1SDavid du Colombier 	{
4373e12c5d1SDavid du Colombier 		$$ = nullgen;
4383e12c5d1SDavid du Colombier 		$$.type = D_INDIR+D_SP;
4393e12c5d1SDavid du Colombier 	}
440*6520663fSDavid du Colombier |	con '(' LSREG ')'
441*6520663fSDavid du Colombier 	{
442*6520663fSDavid du Colombier 		$$ = nullgen;
443*6520663fSDavid du Colombier 		$$.type = D_INDIR+$3;
444*6520663fSDavid du Colombier 		$$.offset = $1;
445*6520663fSDavid du Colombier 	}
4463e12c5d1SDavid du Colombier |	'(' LLREG '*' con ')'
4473e12c5d1SDavid du Colombier 	{
4483e12c5d1SDavid du Colombier 		$$ = nullgen;
4493e12c5d1SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
4503e12c5d1SDavid du Colombier 		$$.index = $2;
4513e12c5d1SDavid du Colombier 		$$.scale = $4;
4523e12c5d1SDavid du Colombier 		checkscale($$.scale);
4533e12c5d1SDavid du Colombier 	}
4543e12c5d1SDavid du Colombier |	'(' LLREG ')' '(' LLREG '*' con ')'
4553e12c5d1SDavid du Colombier 	{
4563e12c5d1SDavid du Colombier 		$$ = nullgen;
4573e12c5d1SDavid du Colombier 		$$.type = D_INDIR+$2;
4583e12c5d1SDavid du Colombier 		$$.index = $5;
4593e12c5d1SDavid du Colombier 		$$.scale = $7;
4603e12c5d1SDavid du Colombier 		checkscale($$.scale);
4613e12c5d1SDavid du Colombier 	}
4623e12c5d1SDavid du Colombier 
4633e12c5d1SDavid du Colombier nmem:
4643e12c5d1SDavid du Colombier 	nam
4653e12c5d1SDavid du Colombier 	{
4663e12c5d1SDavid du Colombier 		$$ = $1;
4673e12c5d1SDavid du Colombier 	}
4683e12c5d1SDavid du Colombier |	nam '(' LLREG '*' con ')'
4693e12c5d1SDavid du Colombier 	{
4703e12c5d1SDavid du Colombier 		$$ = $1;
4713e12c5d1SDavid du Colombier 		$$.index = $3;
4723e12c5d1SDavid du Colombier 		$$.scale = $5;
4733e12c5d1SDavid du Colombier 		checkscale($$.scale);
4743e12c5d1SDavid du Colombier 	}
4753e12c5d1SDavid du Colombier 
4763e12c5d1SDavid du Colombier nam:
4773e12c5d1SDavid du Colombier 	LNAME offset '(' pointer ')'
4783e12c5d1SDavid du Colombier 	{
4793e12c5d1SDavid du Colombier 		$$ = nullgen;
4803e12c5d1SDavid du Colombier 		$$.type = $4;
4813e12c5d1SDavid du Colombier 		$$.sym = $1;
4823e12c5d1SDavid du Colombier 		$$.offset = $2;
4833e12c5d1SDavid du Colombier 	}
4843e12c5d1SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
4853e12c5d1SDavid du Colombier 	{
4863e12c5d1SDavid du Colombier 		$$ = nullgen;
4873e12c5d1SDavid du Colombier 		$$.type = D_STATIC;
4883e12c5d1SDavid du Colombier 		$$.sym = $1;
4893e12c5d1SDavid du Colombier 		$$.offset = $4;
4903e12c5d1SDavid du Colombier 	}
4913e12c5d1SDavid du Colombier 
4923e12c5d1SDavid du Colombier offset:
4933e12c5d1SDavid du Colombier 	{
4943e12c5d1SDavid du Colombier 		$$ = 0;
4953e12c5d1SDavid du Colombier 	}
4963e12c5d1SDavid du Colombier |	'+' con
4973e12c5d1SDavid du Colombier 	{
4983e12c5d1SDavid du Colombier 		$$ = $2;
4993e12c5d1SDavid du Colombier 	}
5003e12c5d1SDavid du Colombier |	'-' con
5013e12c5d1SDavid du Colombier 	{
5023e12c5d1SDavid du Colombier 		$$ = -$2;
5033e12c5d1SDavid du Colombier 	}
5043e12c5d1SDavid du Colombier 
5053e12c5d1SDavid du Colombier pointer:
5063e12c5d1SDavid du Colombier 	LSB
5073e12c5d1SDavid du Colombier |	LSP
5083e12c5d1SDavid du Colombier 	{
5093e12c5d1SDavid du Colombier 		$$ = D_AUTO;
5103e12c5d1SDavid du Colombier 	}
5113e12c5d1SDavid du Colombier |	LFP
5123e12c5d1SDavid du Colombier 
5133e12c5d1SDavid du Colombier con:
5143e12c5d1SDavid du Colombier 	LCONST
5153e12c5d1SDavid du Colombier |	LVAR
5163e12c5d1SDavid du Colombier 	{
5173e12c5d1SDavid du Colombier 		$$ = $1->value;
5183e12c5d1SDavid du Colombier 	}
5193e12c5d1SDavid du Colombier |	'-' con
5203e12c5d1SDavid du Colombier 	{
5213e12c5d1SDavid du Colombier 		$$ = -$2;
5223e12c5d1SDavid du Colombier 	}
5233e12c5d1SDavid du Colombier |	'+' con
5243e12c5d1SDavid du Colombier 	{
5253e12c5d1SDavid du Colombier 		$$ = $2;
5263e12c5d1SDavid du Colombier 	}
5273e12c5d1SDavid du Colombier |	'~' con
5283e12c5d1SDavid du Colombier 	{
5293e12c5d1SDavid du Colombier 		$$ = ~$2;
5303e12c5d1SDavid du Colombier 	}
5313e12c5d1SDavid du Colombier |	'(' expr ')'
5323e12c5d1SDavid du Colombier 	{
5333e12c5d1SDavid du Colombier 		$$ = $2;
5343e12c5d1SDavid du Colombier 	}
5353e12c5d1SDavid du Colombier 
5363e12c5d1SDavid du Colombier expr:
5373e12c5d1SDavid du Colombier 	con
5383e12c5d1SDavid du Colombier |	expr '+' expr
5393e12c5d1SDavid du Colombier 	{
5403e12c5d1SDavid du Colombier 		$$ = $1 + $3;
5413e12c5d1SDavid du Colombier 	}
5423e12c5d1SDavid du Colombier |	expr '-' expr
5433e12c5d1SDavid du Colombier 	{
5443e12c5d1SDavid du Colombier 		$$ = $1 - $3;
5453e12c5d1SDavid du Colombier 	}
5463e12c5d1SDavid du Colombier |	expr '*' expr
5473e12c5d1SDavid du Colombier 	{
5483e12c5d1SDavid du Colombier 		$$ = $1 * $3;
5493e12c5d1SDavid du Colombier 	}
5503e12c5d1SDavid du Colombier |	expr '/' expr
5513e12c5d1SDavid du Colombier 	{
5523e12c5d1SDavid du Colombier 		$$ = $1 / $3;
5533e12c5d1SDavid du Colombier 	}
5543e12c5d1SDavid du Colombier |	expr '%' expr
5553e12c5d1SDavid du Colombier 	{
5563e12c5d1SDavid du Colombier 		$$ = $1 % $3;
5573e12c5d1SDavid du Colombier 	}
5583e12c5d1SDavid du Colombier |	expr '<' '<' expr
5593e12c5d1SDavid du Colombier 	{
5603e12c5d1SDavid du Colombier 		$$ = $1 << $4;
5613e12c5d1SDavid du Colombier 	}
5623e12c5d1SDavid du Colombier |	expr '>' '>' expr
5633e12c5d1SDavid du Colombier 	{
5643e12c5d1SDavid du Colombier 		$$ = $1 >> $4;
5653e12c5d1SDavid du Colombier 	}
5663e12c5d1SDavid du Colombier |	expr '&' expr
5673e12c5d1SDavid du Colombier 	{
5683e12c5d1SDavid du Colombier 		$$ = $1 & $3;
5693e12c5d1SDavid du Colombier 	}
5703e12c5d1SDavid du Colombier |	expr '^' expr
5713e12c5d1SDavid du Colombier 	{
5723e12c5d1SDavid du Colombier 		$$ = $1 ^ $3;
5733e12c5d1SDavid du Colombier 	}
5743e12c5d1SDavid du Colombier |	expr '|' expr
5753e12c5d1SDavid du Colombier 	{
5763e12c5d1SDavid du Colombier 		$$ = $1 | $3;
5773e12c5d1SDavid du Colombier 	}
578