xref: /plan9/sys/src/cmd/5a/a.y (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
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	'*' '/' '%'
187dd7cddfSDavid du Colombier %token	<lval>	LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5
197dd7cddfSDavid du Colombier %token	<lval>	LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA
207dd7cddfSDavid du Colombier %token	<lval>	LTYPEB LTYPEC LTYPED LTYPEE LTYPEF
2159cc4ca5SDavid du Colombier %token	<lval>	LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK
22*375daca8SDavid du Colombier %token	<lval>	LTYPEL LTYPEM LTYPEN LTYPEBX
237dd7cddfSDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC
247dd7cddfSDavid du Colombier %token	<lval>	LTYPEX LR LREG LF LFREG LC LCREG LPSR LFCR
257dd7cddfSDavid du Colombier %token	<lval>	LCOND LS LAT
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 oexpr pointer offset sreg spreg creg
307dd7cddfSDavid du Colombier %type	<lval>	rcon cond reglist
3159cc4ca5SDavid du Colombier %type	<gen>	gen rel reg regreg freg shift fcon frcon
3259cc4ca5SDavid du Colombier %type	<gen>	imm ximm name oreg ireg nireg ioreg imsr
337dd7cddfSDavid du Colombier %%
347dd7cddfSDavid du Colombier prog:
357dd7cddfSDavid du Colombier |	prog line
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier line:
387dd7cddfSDavid du Colombier 	LLAB ':'
397dd7cddfSDavid du Colombier 	{
407dd7cddfSDavid du Colombier 		if($1->value != pc)
417dd7cddfSDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
427dd7cddfSDavid du Colombier 		$1->value = pc;
437dd7cddfSDavid du Colombier 	}
447dd7cddfSDavid du Colombier 	line
457dd7cddfSDavid du Colombier |	LNAME ':'
467dd7cddfSDavid du Colombier 	{
477dd7cddfSDavid du Colombier 		$1->type = LLAB;
487dd7cddfSDavid du Colombier 		$1->value = pc;
497dd7cddfSDavid du Colombier 	}
507dd7cddfSDavid du Colombier 	line
517dd7cddfSDavid du Colombier |	LNAME '=' expr ';'
527dd7cddfSDavid du Colombier 	{
537dd7cddfSDavid du Colombier 		$1->type = LVAR;
547dd7cddfSDavid du Colombier 		$1->value = $3;
557dd7cddfSDavid du Colombier 	}
567dd7cddfSDavid du Colombier |	LVAR '=' expr ';'
577dd7cddfSDavid du Colombier 	{
587dd7cddfSDavid du Colombier 		if($1->value != $3)
597dd7cddfSDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
607dd7cddfSDavid du Colombier 		$1->value = $3;
617dd7cddfSDavid du Colombier 	}
627dd7cddfSDavid du Colombier |	';'
637dd7cddfSDavid du Colombier |	inst ';'
647dd7cddfSDavid du Colombier |	error ';'
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier inst:
677dd7cddfSDavid du Colombier /*
687dd7cddfSDavid du Colombier  * ADD
697dd7cddfSDavid du Colombier  */
707dd7cddfSDavid du Colombier 	LTYPE1 cond imsr ',' spreg ',' reg
717dd7cddfSDavid du Colombier 	{
727dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, $5, &$7);
737dd7cddfSDavid du Colombier 	}
7459cc4ca5SDavid du Colombier |	LTYPE1 cond imsr ',' spreg ','
7559cc4ca5SDavid du Colombier 	{
7659cc4ca5SDavid du Colombier 		outcode($1, $2, &$3, $5, &nullgen);
7759cc4ca5SDavid du Colombier 	}
787dd7cddfSDavid du Colombier |	LTYPE1 cond imsr ',' reg
797dd7cddfSDavid du Colombier 	{
807dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &$5);
817dd7cddfSDavid du Colombier 	}
827dd7cddfSDavid du Colombier /*
837dd7cddfSDavid du Colombier  * MVN
847dd7cddfSDavid du Colombier  */
857dd7cddfSDavid du Colombier |	LTYPE2 cond imsr ',' reg
867dd7cddfSDavid du Colombier 	{
877dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &$5);
887dd7cddfSDavid du Colombier 	}
897dd7cddfSDavid du Colombier /*
907dd7cddfSDavid du Colombier  * MOVW
917dd7cddfSDavid du Colombier  */
927dd7cddfSDavid du Colombier |	LTYPE3 cond gen ',' gen
937dd7cddfSDavid du Colombier 	{
947dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &$5);
957dd7cddfSDavid du Colombier 	}
967dd7cddfSDavid du Colombier /*
977dd7cddfSDavid du Colombier  * B/BL
987dd7cddfSDavid du Colombier  */
997dd7cddfSDavid du Colombier |	LTYPE4 cond comma rel
1007dd7cddfSDavid du Colombier 	{
1017dd7cddfSDavid du Colombier 		outcode($1, $2, &nullgen, NREG, &$4);
1027dd7cddfSDavid du Colombier 	}
1037dd7cddfSDavid du Colombier |	LTYPE4 cond comma nireg
1047dd7cddfSDavid du Colombier 	{
1057dd7cddfSDavid du Colombier 		outcode($1, $2, &nullgen, NREG, &$4);
1067dd7cddfSDavid du Colombier 	}
1077dd7cddfSDavid du Colombier /*
108*375daca8SDavid du Colombier  * BX
109*375daca8SDavid du Colombier  */
110*375daca8SDavid du Colombier |	LTYPEBX comma ireg
111*375daca8SDavid du Colombier 	{
112*375daca8SDavid du Colombier 		outcode($1, Always, &nullgen, NREG, &$3);
113*375daca8SDavid du Colombier 	}
114*375daca8SDavid du Colombier /*
1157dd7cddfSDavid du Colombier  * BEQ
1167dd7cddfSDavid du Colombier  */
1177dd7cddfSDavid du Colombier |	LTYPE5 comma rel
1187dd7cddfSDavid du Colombier 	{
1197dd7cddfSDavid du Colombier 		outcode($1, Always, &nullgen, NREG, &$3);
1207dd7cddfSDavid du Colombier 	}
1217dd7cddfSDavid du Colombier /*
1227dd7cddfSDavid du Colombier  * SWI
1237dd7cddfSDavid du Colombier  */
1247dd7cddfSDavid du Colombier |	LTYPE6 cond comma gen
1257dd7cddfSDavid du Colombier 	{
1267dd7cddfSDavid du Colombier 		outcode($1, $2, &nullgen, NREG, &$4);
1277dd7cddfSDavid du Colombier 	}
1287dd7cddfSDavid du Colombier /*
1297dd7cddfSDavid du Colombier  * CMP
1307dd7cddfSDavid du Colombier  */
1317dd7cddfSDavid du Colombier |	LTYPE7 cond imsr ',' spreg comma
1327dd7cddfSDavid du Colombier 	{
1337dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, $5, &nullgen);
1347dd7cddfSDavid du Colombier 	}
1357dd7cddfSDavid du Colombier /*
1367dd7cddfSDavid du Colombier  * MOVM
1377dd7cddfSDavid du Colombier  */
13859cc4ca5SDavid du Colombier |	LTYPE8 cond ioreg ',' '[' reglist ']'
1397dd7cddfSDavid du Colombier 	{
1407dd7cddfSDavid du Colombier 		Gen g;
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier 		g = nullgen;
1437dd7cddfSDavid du Colombier 		g.type = D_CONST;
1447dd7cddfSDavid du Colombier 		g.offset = $6;
1457dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &g);
1467dd7cddfSDavid du Colombier 	}
14759cc4ca5SDavid du Colombier |	LTYPE8 cond '[' reglist ']' ',' ioreg
1487dd7cddfSDavid du Colombier 	{
1497dd7cddfSDavid du Colombier 		Gen g;
1507dd7cddfSDavid du Colombier 
1517dd7cddfSDavid du Colombier 		g = nullgen;
1527dd7cddfSDavid du Colombier 		g.type = D_CONST;
1537dd7cddfSDavid du Colombier 		g.offset = $4;
1547dd7cddfSDavid du Colombier 		outcode($1, $2, &g, NREG, &$7);
1557dd7cddfSDavid du Colombier 	}
1567dd7cddfSDavid du Colombier /*
1577dd7cddfSDavid du Colombier  * SWAP
1587dd7cddfSDavid du Colombier  */
1597dd7cddfSDavid du Colombier |	LTYPE9 cond reg ',' ireg ',' reg
1607dd7cddfSDavid du Colombier 	{
1617dd7cddfSDavid du Colombier 		outcode($1, $2, &$5, $3.reg, &$7);
1627dd7cddfSDavid du Colombier 	}
1637dd7cddfSDavid du Colombier |	LTYPE9 cond reg ',' ireg comma
1647dd7cddfSDavid du Colombier 	{
1657dd7cddfSDavid du Colombier 		outcode($1, $2, &$5, $3.reg, &$3);
1667dd7cddfSDavid du Colombier 	}
1677dd7cddfSDavid du Colombier |	LTYPE9 cond comma ireg ',' reg
1687dd7cddfSDavid du Colombier 	{
1697dd7cddfSDavid du Colombier 		outcode($1, $2, &$4, $6.reg, &$6);
1707dd7cddfSDavid du Colombier 	}
1717dd7cddfSDavid du Colombier /*
1727dd7cddfSDavid du Colombier  * RET
1737dd7cddfSDavid du Colombier  */
17459cc4ca5SDavid du Colombier |	LTYPEA cond comma
1757dd7cddfSDavid du Colombier 	{
17659cc4ca5SDavid du Colombier 		outcode($1, $2, &nullgen, NREG, &nullgen);
1777dd7cddfSDavid du Colombier 	}
1787dd7cddfSDavid du Colombier /*
1797dd7cddfSDavid du Colombier  * TEXT/GLOBL
1807dd7cddfSDavid du Colombier  */
1817dd7cddfSDavid du Colombier |	LTYPEB name ',' imm
1827dd7cddfSDavid du Colombier 	{
1837dd7cddfSDavid du Colombier 		outcode($1, Always, &$2, NREG, &$4);
1847dd7cddfSDavid du Colombier 	}
1857dd7cddfSDavid du Colombier |	LTYPEB name ',' con ',' imm
1867dd7cddfSDavid du Colombier 	{
1877dd7cddfSDavid du Colombier 		outcode($1, Always, &$2, $4, &$6);
1887dd7cddfSDavid du Colombier 	}
1897dd7cddfSDavid du Colombier /*
1907dd7cddfSDavid du Colombier  * DATA
1917dd7cddfSDavid du Colombier  */
1927dd7cddfSDavid du Colombier |	LTYPEC name '/' con ',' ximm
1937dd7cddfSDavid du Colombier 	{
1947dd7cddfSDavid du Colombier 		outcode($1, Always, &$2, $4, &$6);
1957dd7cddfSDavid du Colombier 	}
1967dd7cddfSDavid du Colombier /*
19759cc4ca5SDavid du Colombier  * CASE
19859cc4ca5SDavid du Colombier  */
19959cc4ca5SDavid du Colombier |	LTYPED cond reg comma
20059cc4ca5SDavid du Colombier 	{
20159cc4ca5SDavid du Colombier 		outcode($1, $2, &$3, NREG, &nullgen);
20259cc4ca5SDavid du Colombier 	}
20359cc4ca5SDavid du Colombier /*
2047dd7cddfSDavid du Colombier  * word
2057dd7cddfSDavid du Colombier  */
2067dd7cddfSDavid du Colombier |	LTYPEH comma ximm
2077dd7cddfSDavid du Colombier 	{
2087dd7cddfSDavid du Colombier 		outcode($1, Always, &nullgen, NREG, &$3);
2097dd7cddfSDavid du Colombier 	}
2107dd7cddfSDavid du Colombier /*
2117dd7cddfSDavid du Colombier  * floating-point coprocessor
2127dd7cddfSDavid du Colombier  */
21359cc4ca5SDavid du Colombier |	LTYPEI cond freg ',' freg
2147dd7cddfSDavid du Colombier 	{
2157dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &$5);
2167dd7cddfSDavid du Colombier 	}
2177dd7cddfSDavid du Colombier |	LTYPEK cond frcon ',' freg
2187dd7cddfSDavid du Colombier 	{
2197dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, NREG, &$5);
2207dd7cddfSDavid du Colombier 	}
2217dd7cddfSDavid du Colombier |	LTYPEK cond frcon ',' LFREG ',' freg
2227dd7cddfSDavid du Colombier 	{
2237dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, $5, &$7);
2247dd7cddfSDavid du Colombier 	}
2257dd7cddfSDavid du Colombier |	LTYPEL cond freg ',' freg comma
2267dd7cddfSDavid du Colombier 	{
2277dd7cddfSDavid du Colombier 		outcode($1, $2, &$3, $5.reg, &nullgen);
2287dd7cddfSDavid du Colombier 	}
2297dd7cddfSDavid du Colombier /*
2307dd7cddfSDavid du Colombier  * MCR MRC
2317dd7cddfSDavid du Colombier  */
23259cc4ca5SDavid du Colombier |	LTYPEJ cond con ',' expr ',' spreg ',' creg ',' creg oexpr
2337dd7cddfSDavid du Colombier 	{
2347dd7cddfSDavid du Colombier 		Gen g;
2357dd7cddfSDavid du Colombier 
2367dd7cddfSDavid du Colombier 		g = nullgen;
2377dd7cddfSDavid du Colombier 		g.type = D_CONST;
2387dd7cddfSDavid du Colombier 		g.offset =
2397dd7cddfSDavid du Colombier 			(0xe << 24) |		/* opcode */
2407dd7cddfSDavid du Colombier 			($1 << 20) |		/* MCR/MRC */
2417dd7cddfSDavid du Colombier 			($2 << 28) |		/* scond */
2427dd7cddfSDavid du Colombier 			(($3 & 15) << 8) |	/* coprocessor number */
2437dd7cddfSDavid du Colombier 			(($5 & 7) << 21) |	/* coprocessor operation */
2447dd7cddfSDavid du Colombier 			(($7 & 15) << 12) |	/* arm register */
2457dd7cddfSDavid du Colombier 			(($9 & 15) << 16) |	/* Crn */
2467dd7cddfSDavid du Colombier 			(($11 & 15) << 0) |	/* Crm */
2477dd7cddfSDavid du Colombier 			(($12 & 7) << 5) |	/* coprocessor information */
2487dd7cddfSDavid du Colombier 			(1<<4);			/* must be set */
2497dd7cddfSDavid du Colombier 		outcode(AWORD, Always, &nullgen, NREG, &g);
2507dd7cddfSDavid du Colombier 	}
25159cc4ca5SDavid du Colombier /*
25259cc4ca5SDavid du Colombier  * MULL hi,lo,r1,r2
25359cc4ca5SDavid du Colombier  */
25459cc4ca5SDavid du Colombier |	LTYPEM cond reg ',' reg ',' regreg
25559cc4ca5SDavid du Colombier 	{
25659cc4ca5SDavid du Colombier 		outcode($1, $2, &$3, $5.reg, &$7);
25759cc4ca5SDavid du Colombier 	}
25859cc4ca5SDavid du Colombier /*
25980ee5cbfSDavid du Colombier  * MULA hi,lo,r1,r2
26080ee5cbfSDavid du Colombier  */
26180ee5cbfSDavid du Colombier |	LTYPEN cond reg ',' reg ',' reg ',' spreg
26280ee5cbfSDavid du Colombier 	{
26380ee5cbfSDavid du Colombier 		$7.type = D_REGREG;
26480ee5cbfSDavid du Colombier 		$7.offset = $9;
26580ee5cbfSDavid du Colombier 		outcode($1, $2, &$3, $5.reg, &$7);
26680ee5cbfSDavid du Colombier 	}
26780ee5cbfSDavid du Colombier /*
26859cc4ca5SDavid du Colombier  * END
26959cc4ca5SDavid du Colombier  */
27059cc4ca5SDavid du Colombier |	LTYPEE comma
27159cc4ca5SDavid du Colombier 	{
27259cc4ca5SDavid du Colombier 		outcode($1, Always, &nullgen, NREG, &nullgen);
27359cc4ca5SDavid du Colombier 	}
2747dd7cddfSDavid du Colombier 
2757dd7cddfSDavid du Colombier cond:
2767dd7cddfSDavid du Colombier 	{
2777dd7cddfSDavid du Colombier 		$$ = Always;
2787dd7cddfSDavid du Colombier 	}
2797dd7cddfSDavid du Colombier |	cond LCOND
2807dd7cddfSDavid du Colombier 	{
2817dd7cddfSDavid du Colombier 		$$ = ($1 & ~C_SCOND) | $2;
2827dd7cddfSDavid du Colombier 	}
2837dd7cddfSDavid du Colombier |	cond LS
2847dd7cddfSDavid du Colombier 	{
2857dd7cddfSDavid du Colombier 		$$ = $1 | $2;
2867dd7cddfSDavid du Colombier 	}
2877dd7cddfSDavid du Colombier 
2887dd7cddfSDavid du Colombier comma:
28959cc4ca5SDavid du Colombier |	',' comma
2907dd7cddfSDavid du Colombier 
2917dd7cddfSDavid du Colombier rel:
2927dd7cddfSDavid du Colombier 	con '(' LPC ')'
2937dd7cddfSDavid du Colombier 	{
2947dd7cddfSDavid du Colombier 		$$ = nullgen;
2957dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
2967dd7cddfSDavid du Colombier 		$$.offset = $1 + pc;
2977dd7cddfSDavid du Colombier 	}
2987dd7cddfSDavid du Colombier |	LNAME offset
2997dd7cddfSDavid du Colombier 	{
3007dd7cddfSDavid du Colombier 		$$ = nullgen;
3017dd7cddfSDavid du Colombier 		if(pass == 2)
3027dd7cddfSDavid du Colombier 			yyerror("undefined label: %s", $1->name);
3037dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
3047dd7cddfSDavid du Colombier 		$$.sym = $1;
3057dd7cddfSDavid du Colombier 		$$.offset = $2;
3067dd7cddfSDavid du Colombier 	}
3077dd7cddfSDavid du Colombier |	LLAB offset
3087dd7cddfSDavid du Colombier 	{
3097dd7cddfSDavid du Colombier 		$$ = nullgen;
3107dd7cddfSDavid du Colombier 		$$.type = D_BRANCH;
3117dd7cddfSDavid du Colombier 		$$.sym = $1;
3127dd7cddfSDavid du Colombier 		$$.offset = $1->value + $2;
3137dd7cddfSDavid du Colombier 	}
3147dd7cddfSDavid du Colombier 
3157dd7cddfSDavid du Colombier ximm:	'$' con
3167dd7cddfSDavid du Colombier 	{
3177dd7cddfSDavid du Colombier 		$$ = nullgen;
3187dd7cddfSDavid du Colombier 		$$.type = D_CONST;
3197dd7cddfSDavid du Colombier 		$$.offset = $2;
3207dd7cddfSDavid du Colombier 	}
3217dd7cddfSDavid du Colombier |	'$' oreg
3227dd7cddfSDavid du Colombier 	{
3237dd7cddfSDavid du Colombier 		$$ = $2;
3247dd7cddfSDavid du Colombier 		$$.type = D_CONST;
3257dd7cddfSDavid du Colombier 	}
3267dd7cddfSDavid du Colombier |	'$' '*' '$' oreg
3277dd7cddfSDavid du Colombier 	{
3287dd7cddfSDavid du Colombier 		$$ = $4;
3297dd7cddfSDavid du Colombier 		$$.type = D_OCONST;
3307dd7cddfSDavid du Colombier 	}
3317dd7cddfSDavid du Colombier |	'$' LSCONST
3327dd7cddfSDavid du Colombier 	{
3337dd7cddfSDavid du Colombier 		$$ = nullgen;
3347dd7cddfSDavid du Colombier 		$$.type = D_SCONST;
3357dd7cddfSDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
3367dd7cddfSDavid du Colombier 	}
3377dd7cddfSDavid du Colombier |	fcon
3387dd7cddfSDavid du Colombier 
3397dd7cddfSDavid du Colombier fcon:
3407dd7cddfSDavid du Colombier 	'$' LFCONST
3417dd7cddfSDavid du Colombier 	{
3427dd7cddfSDavid du Colombier 		$$ = nullgen;
3437dd7cddfSDavid du Colombier 		$$.type = D_FCONST;
3447dd7cddfSDavid du Colombier 		$$.dval = $2;
3457dd7cddfSDavid du Colombier 	}
3467dd7cddfSDavid du Colombier |	'$' '-' LFCONST
3477dd7cddfSDavid du Colombier 	{
3487dd7cddfSDavid du Colombier 		$$ = nullgen;
3497dd7cddfSDavid du Colombier 		$$.type = D_FCONST;
3507dd7cddfSDavid du Colombier 		$$.dval = -$3;
3517dd7cddfSDavid du Colombier 	}
3527dd7cddfSDavid du Colombier 
3537dd7cddfSDavid du Colombier reglist:
3547dd7cddfSDavid du Colombier 	spreg
3557dd7cddfSDavid du Colombier 	{
3567dd7cddfSDavid du Colombier 		$$ = 1 << $1;
3577dd7cddfSDavid du Colombier 	}
3587dd7cddfSDavid du Colombier |	spreg '-' spreg
3597dd7cddfSDavid du Colombier 	{
3607dd7cddfSDavid du Colombier 		int i;
3617dd7cddfSDavid du Colombier 		$$=0;
3627dd7cddfSDavid du Colombier 		for(i=$1; i<=$3; i++)
3637dd7cddfSDavid du Colombier 			$$ |= 1<<i;
3647dd7cddfSDavid du Colombier 		for(i=$3; i<=$1; i++)
3657dd7cddfSDavid du Colombier 			$$ |= 1<<i;
3667dd7cddfSDavid du Colombier 	}
3677dd7cddfSDavid du Colombier |	spreg comma reglist
3687dd7cddfSDavid du Colombier 	{
3697dd7cddfSDavid du Colombier 		$$ = (1<<$1) | $3;
3707dd7cddfSDavid du Colombier 	}
3717dd7cddfSDavid du Colombier 
3727dd7cddfSDavid du Colombier gen:
3737dd7cddfSDavid du Colombier 	reg
3747dd7cddfSDavid du Colombier |	ximm
3757dd7cddfSDavid du Colombier |	shift
37659cc4ca5SDavid du Colombier |	shift '(' spreg ')'
37759cc4ca5SDavid du Colombier 	{
37859cc4ca5SDavid du Colombier 		$$ = $1;
37959cc4ca5SDavid du Colombier 		$$.reg = $3;
38059cc4ca5SDavid du Colombier 	}
3817dd7cddfSDavid du Colombier |	LPSR
3827dd7cddfSDavid du Colombier 	{
3837dd7cddfSDavid du Colombier 		$$ = nullgen;
3847dd7cddfSDavid du Colombier 		$$.type = D_PSR;
3857dd7cddfSDavid du Colombier 		$$.reg = $1;
3867dd7cddfSDavid du Colombier 	}
3877dd7cddfSDavid du Colombier |	LFCR
3887dd7cddfSDavid du Colombier 	{
3897dd7cddfSDavid du Colombier 		$$ = nullgen;
3907dd7cddfSDavid du Colombier 		$$.type = D_FPCR;
3917dd7cddfSDavid du Colombier 		$$.reg = $1;
3927dd7cddfSDavid du Colombier 	}
3937dd7cddfSDavid du Colombier |	con
3947dd7cddfSDavid du Colombier 	{
3957dd7cddfSDavid du Colombier 		$$ = nullgen;
3967dd7cddfSDavid du Colombier 		$$.type = D_OREG;
3977dd7cddfSDavid du Colombier 		$$.offset = $1;
3987dd7cddfSDavid du Colombier 	}
3997dd7cddfSDavid du Colombier |	oreg
4007dd7cddfSDavid du Colombier |	freg
4017dd7cddfSDavid du Colombier 
4027dd7cddfSDavid du Colombier nireg:
4037dd7cddfSDavid du Colombier 	ireg
4047dd7cddfSDavid du Colombier |	name
4057dd7cddfSDavid du Colombier 	{
4067dd7cddfSDavid du Colombier 		$$ = $1;
4077dd7cddfSDavid du Colombier 		if($1.name != D_EXTERN && $1.name != D_STATIC) {
4087dd7cddfSDavid du Colombier 		}
4097dd7cddfSDavid du Colombier 	}
4107dd7cddfSDavid du Colombier 
4117dd7cddfSDavid du Colombier ireg:
4127dd7cddfSDavid du Colombier 	'(' spreg ')'
4137dd7cddfSDavid du Colombier 	{
4147dd7cddfSDavid du Colombier 		$$ = nullgen;
4157dd7cddfSDavid du Colombier 		$$.type = D_OREG;
4167dd7cddfSDavid du Colombier 		$$.reg = $2;
4177dd7cddfSDavid du Colombier 		$$.offset = 0;
4187dd7cddfSDavid du Colombier 	}
4197dd7cddfSDavid du Colombier 
42059cc4ca5SDavid du Colombier ioreg:
4217dd7cddfSDavid du Colombier 	ireg
4227dd7cddfSDavid du Colombier |	con '(' sreg ')'
4237dd7cddfSDavid du Colombier 	{
4247dd7cddfSDavid du Colombier 		$$ = nullgen;
4257dd7cddfSDavid du Colombier 		$$.type = D_OREG;
4267dd7cddfSDavid du Colombier 		$$.reg = $3;
4277dd7cddfSDavid du Colombier 		$$.offset = $1;
4287dd7cddfSDavid du Colombier 	}
42959cc4ca5SDavid du Colombier 
43059cc4ca5SDavid du Colombier oreg:
43159cc4ca5SDavid du Colombier 	name
43259cc4ca5SDavid du Colombier |	name '(' sreg ')'
4337dd7cddfSDavid du Colombier 	{
43459cc4ca5SDavid du Colombier 		$$ = $1;
4357dd7cddfSDavid du Colombier 		$$.type = D_OREG;
43659cc4ca5SDavid du Colombier 		$$.reg = $3;
4377dd7cddfSDavid du Colombier 	}
43859cc4ca5SDavid du Colombier |	ioreg
4397dd7cddfSDavid du Colombier 
4407dd7cddfSDavid du Colombier imsr:
4417dd7cddfSDavid du Colombier 	reg
4427dd7cddfSDavid du Colombier |	imm
4437dd7cddfSDavid du Colombier |	shift
4447dd7cddfSDavid du Colombier 
4457dd7cddfSDavid du Colombier imm:	'$' con
4467dd7cddfSDavid du Colombier 	{
4477dd7cddfSDavid du Colombier 		$$ = nullgen;
4487dd7cddfSDavid du Colombier 		$$.type = D_CONST;
4497dd7cddfSDavid du Colombier 		$$.offset = $2;
4507dd7cddfSDavid du Colombier 	}
4517dd7cddfSDavid du Colombier 
4527dd7cddfSDavid du Colombier reg:
4537dd7cddfSDavid du Colombier 	spreg
4547dd7cddfSDavid du Colombier 	{
4557dd7cddfSDavid du Colombier 		$$ = nullgen;
4567dd7cddfSDavid du Colombier 		$$.type = D_REG;
4577dd7cddfSDavid du Colombier 		$$.reg = $1;
4587dd7cddfSDavid du Colombier 	}
4597dd7cddfSDavid du Colombier 
46059cc4ca5SDavid du Colombier regreg:
46159cc4ca5SDavid du Colombier 	'(' spreg ',' spreg ')'
46259cc4ca5SDavid du Colombier 	{
46359cc4ca5SDavid du Colombier 		$$ = nullgen;
46459cc4ca5SDavid du Colombier 		$$.type = D_REGREG;
46559cc4ca5SDavid du Colombier 		$$.reg = $2;
46659cc4ca5SDavid du Colombier 		$$.offset = $4;
46759cc4ca5SDavid du Colombier 	}
46859cc4ca5SDavid du Colombier 
4697dd7cddfSDavid du Colombier shift:
4707dd7cddfSDavid du Colombier 	spreg '<' '<' rcon
4717dd7cddfSDavid du Colombier 	{
4727dd7cddfSDavid du Colombier 		$$ = nullgen;
4737dd7cddfSDavid du Colombier 		$$.type = D_SHIFT;
4747dd7cddfSDavid du Colombier 		$$.offset = $1 | $4 | (0 << 5);
4757dd7cddfSDavid du Colombier 	}
4767dd7cddfSDavid du Colombier |	spreg '>' '>' rcon
4777dd7cddfSDavid du Colombier 	{
4787dd7cddfSDavid du Colombier 		$$ = nullgen;
4797dd7cddfSDavid du Colombier 		$$.type = D_SHIFT;
4807dd7cddfSDavid du Colombier 		$$.offset = $1 | $4 | (1 << 5);
4817dd7cddfSDavid du Colombier 	}
4827dd7cddfSDavid du Colombier |	spreg '-' '>' rcon
4837dd7cddfSDavid du Colombier 	{
4847dd7cddfSDavid du Colombier 		$$ = nullgen;
4857dd7cddfSDavid du Colombier 		$$.type = D_SHIFT;
4867dd7cddfSDavid du Colombier 		$$.offset = $1 | $4 | (2 << 5);
4877dd7cddfSDavid du Colombier 	}
4887dd7cddfSDavid du Colombier |	spreg LAT '>' rcon
4897dd7cddfSDavid du Colombier 	{
4907dd7cddfSDavid du Colombier 		$$ = nullgen;
4917dd7cddfSDavid du Colombier 		$$.type = D_SHIFT;
4927dd7cddfSDavid du Colombier 		$$.offset = $1 | $4 | (3 << 5);
4937dd7cddfSDavid du Colombier 	}
4947dd7cddfSDavid du Colombier 
4957dd7cddfSDavid du Colombier rcon:
4967dd7cddfSDavid du Colombier 	spreg
4977dd7cddfSDavid du Colombier 	{
4987dd7cddfSDavid du Colombier 		if($$ < 0 || $$ >= 16)
4997dd7cddfSDavid du Colombier 			print("register value out of range\n");
5007dd7cddfSDavid du Colombier 		$$ = (($1&15) << 8) | (1 << 4);
5017dd7cddfSDavid du Colombier 	}
5027dd7cddfSDavid du Colombier |	con
5037dd7cddfSDavid du Colombier 	{
5047dd7cddfSDavid du Colombier 		if($$ < 0 || $$ >= 32)
5057dd7cddfSDavid du Colombier 			print("shift value out of range\n");
5067dd7cddfSDavid du Colombier 		$$ = ($1&31) << 7;
5077dd7cddfSDavid du Colombier 	}
5087dd7cddfSDavid du Colombier 
5097dd7cddfSDavid du Colombier sreg:
5107dd7cddfSDavid du Colombier 	LREG
5117dd7cddfSDavid du Colombier |	LPC
5127dd7cddfSDavid du Colombier 	{
5137dd7cddfSDavid du Colombier 		$$ = REGPC;
5147dd7cddfSDavid du Colombier 	}
5157dd7cddfSDavid du Colombier |	LR '(' expr ')'
5167dd7cddfSDavid du Colombier 	{
5177dd7cddfSDavid du Colombier 		if($3 < 0 || $3 >= NREG)
5187dd7cddfSDavid du Colombier 			print("register value out of range\n");
5197dd7cddfSDavid du Colombier 		$$ = $3;
5207dd7cddfSDavid du Colombier 	}
5217dd7cddfSDavid du Colombier 
5227dd7cddfSDavid du Colombier spreg:
5237dd7cddfSDavid du Colombier 	sreg
5247dd7cddfSDavid du Colombier |	LSP
5257dd7cddfSDavid du Colombier 	{
5267dd7cddfSDavid du Colombier 		$$ = REGSP;
5277dd7cddfSDavid du Colombier 	}
5287dd7cddfSDavid du Colombier 
5297dd7cddfSDavid du Colombier creg:
5307dd7cddfSDavid du Colombier 	LCREG
5317dd7cddfSDavid du Colombier |	LC '(' expr ')'
5327dd7cddfSDavid du Colombier 	{
5337dd7cddfSDavid du Colombier 		if($3 < 0 || $3 >= NREG)
5347dd7cddfSDavid du Colombier 			print("register value out of range\n");
5357dd7cddfSDavid du Colombier 		$$ = $3;
5367dd7cddfSDavid du Colombier 	}
5377dd7cddfSDavid du Colombier 
5387dd7cddfSDavid du Colombier frcon:
5397dd7cddfSDavid du Colombier 	freg
5407dd7cddfSDavid du Colombier |	fcon
5417dd7cddfSDavid du Colombier 
5427dd7cddfSDavid du Colombier freg:
5437dd7cddfSDavid du Colombier 	LFREG
5447dd7cddfSDavid du Colombier 	{
5457dd7cddfSDavid du Colombier 		$$ = nullgen;
5467dd7cddfSDavid du Colombier 		$$.type = D_FREG;
5477dd7cddfSDavid du Colombier 		$$.reg = $1;
5487dd7cddfSDavid du Colombier 	}
5497dd7cddfSDavid du Colombier |	LF '(' con ')'
5507dd7cddfSDavid du Colombier 	{
5517dd7cddfSDavid du Colombier 		$$ = nullgen;
5527dd7cddfSDavid du Colombier 		$$.type = D_FREG;
5537dd7cddfSDavid du Colombier 		$$.reg = $3;
5547dd7cddfSDavid du Colombier 	}
5557dd7cddfSDavid du Colombier 
5567dd7cddfSDavid du Colombier name:
5577dd7cddfSDavid du Colombier 	con '(' pointer ')'
5587dd7cddfSDavid du Colombier 	{
5597dd7cddfSDavid du Colombier 		$$ = nullgen;
5607dd7cddfSDavid du Colombier 		$$.type = D_OREG;
5617dd7cddfSDavid du Colombier 		$$.name = $3;
5627dd7cddfSDavid du Colombier 		$$.sym = S;
5637dd7cddfSDavid du Colombier 		$$.offset = $1;
5647dd7cddfSDavid du Colombier 	}
5657dd7cddfSDavid du Colombier |	LNAME offset '(' pointer ')'
5667dd7cddfSDavid du Colombier 	{
5677dd7cddfSDavid du Colombier 		$$ = nullgen;
5687dd7cddfSDavid du Colombier 		$$.type = D_OREG;
5697dd7cddfSDavid du Colombier 		$$.name = $4;
5707dd7cddfSDavid du Colombier 		$$.sym = $1;
5717dd7cddfSDavid du Colombier 		$$.offset = $2;
5727dd7cddfSDavid du Colombier 	}
5737dd7cddfSDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
5747dd7cddfSDavid du Colombier 	{
5757dd7cddfSDavid du Colombier 		$$ = nullgen;
5767dd7cddfSDavid du Colombier 		$$.type = D_OREG;
5777dd7cddfSDavid du Colombier 		$$.name = D_STATIC;
5787dd7cddfSDavid du Colombier 		$$.sym = $1;
5797dd7cddfSDavid du Colombier 		$$.offset = $4;
5807dd7cddfSDavid du Colombier 	}
5817dd7cddfSDavid du Colombier 
5827dd7cddfSDavid du Colombier offset:
5837dd7cddfSDavid du Colombier 	{
5847dd7cddfSDavid du Colombier 		$$ = 0;
5857dd7cddfSDavid du Colombier 	}
5867dd7cddfSDavid du Colombier |	'+' con
5877dd7cddfSDavid du Colombier 	{
5887dd7cddfSDavid du Colombier 		$$ = $2;
5897dd7cddfSDavid du Colombier 	}
5907dd7cddfSDavid du Colombier |	'-' con
5917dd7cddfSDavid du Colombier 	{
5927dd7cddfSDavid du Colombier 		$$ = -$2;
5937dd7cddfSDavid du Colombier 	}
5947dd7cddfSDavid du Colombier 
5957dd7cddfSDavid du Colombier pointer:
5967dd7cddfSDavid du Colombier 	LSB
5977dd7cddfSDavid du Colombier |	LSP
5987dd7cddfSDavid du Colombier |	LFP
5997dd7cddfSDavid du Colombier 
6007dd7cddfSDavid du Colombier con:
6017dd7cddfSDavid du Colombier 	LCONST
6027dd7cddfSDavid du Colombier |	LVAR
6037dd7cddfSDavid du Colombier 	{
6047dd7cddfSDavid du Colombier 		$$ = $1->value;
6057dd7cddfSDavid du Colombier 	}
6067dd7cddfSDavid du Colombier |	'-' con
6077dd7cddfSDavid du Colombier 	{
6087dd7cddfSDavid du Colombier 		$$ = -$2;
6097dd7cddfSDavid du Colombier 	}
6107dd7cddfSDavid du Colombier |	'+' con
6117dd7cddfSDavid du Colombier 	{
6127dd7cddfSDavid du Colombier 		$$ = $2;
6137dd7cddfSDavid du Colombier 	}
6147dd7cddfSDavid du Colombier |	'~' con
6157dd7cddfSDavid du Colombier 	{
6167dd7cddfSDavid du Colombier 		$$ = ~$2;
6177dd7cddfSDavid du Colombier 	}
6187dd7cddfSDavid du Colombier |	'(' expr ')'
6197dd7cddfSDavid du Colombier 	{
6207dd7cddfSDavid du Colombier 		$$ = $2;
6217dd7cddfSDavid du Colombier 	}
6227dd7cddfSDavid du Colombier 
6237dd7cddfSDavid du Colombier oexpr:
6247dd7cddfSDavid du Colombier 	{
6257dd7cddfSDavid du Colombier 		$$ = 0;
6267dd7cddfSDavid du Colombier 	}
6277dd7cddfSDavid du Colombier |	',' expr
6287dd7cddfSDavid du Colombier 	{
6297dd7cddfSDavid du Colombier 		$$ = $2;
6307dd7cddfSDavid du Colombier 	}
6317dd7cddfSDavid du Colombier 
6327dd7cddfSDavid du Colombier expr:
6337dd7cddfSDavid du Colombier 	con
6347dd7cddfSDavid du Colombier |	expr '+' expr
6357dd7cddfSDavid du Colombier 	{
6367dd7cddfSDavid du Colombier 		$$ = $1 + $3;
6377dd7cddfSDavid du Colombier 	}
6387dd7cddfSDavid du Colombier |	expr '-' expr
6397dd7cddfSDavid du Colombier 	{
6407dd7cddfSDavid du Colombier 		$$ = $1 - $3;
6417dd7cddfSDavid du Colombier 	}
6427dd7cddfSDavid du Colombier |	expr '*' expr
6437dd7cddfSDavid du Colombier 	{
6447dd7cddfSDavid du Colombier 		$$ = $1 * $3;
6457dd7cddfSDavid du Colombier 	}
6467dd7cddfSDavid du Colombier |	expr '/' expr
6477dd7cddfSDavid du Colombier 	{
6487dd7cddfSDavid du Colombier 		$$ = $1 / $3;
6497dd7cddfSDavid du Colombier 	}
6507dd7cddfSDavid du Colombier |	expr '%' expr
6517dd7cddfSDavid du Colombier 	{
6527dd7cddfSDavid du Colombier 		$$ = $1 % $3;
6537dd7cddfSDavid du Colombier 	}
6547dd7cddfSDavid du Colombier |	expr '<' '<' expr
6557dd7cddfSDavid du Colombier 	{
6567dd7cddfSDavid du Colombier 		$$ = $1 << $4;
6577dd7cddfSDavid du Colombier 	}
6587dd7cddfSDavid du Colombier |	expr '>' '>' expr
6597dd7cddfSDavid du Colombier 	{
6607dd7cddfSDavid du Colombier 		$$ = $1 >> $4;
6617dd7cddfSDavid du Colombier 	}
6627dd7cddfSDavid du Colombier |	expr '&' expr
6637dd7cddfSDavid du Colombier 	{
6647dd7cddfSDavid du Colombier 		$$ = $1 & $3;
6657dd7cddfSDavid du Colombier 	}
6667dd7cddfSDavid du Colombier |	expr '^' expr
6677dd7cddfSDavid du Colombier 	{
6687dd7cddfSDavid du Colombier 		$$ = $1 ^ $3;
6697dd7cddfSDavid du Colombier 	}
6707dd7cddfSDavid du Colombier |	expr '|' expr
6717dd7cddfSDavid du Colombier 	{
6727dd7cddfSDavid du Colombier 		$$ = $1 | $3;
6737dd7cddfSDavid du Colombier 	}
674