xref: /plan9-contrib/sys/src/cmd/4a/a.y (revision f8bc6aaf8056e137bcdfb6117a990ac3eff62cc9)
17edc7532SDavid du Colombier %{
27edc7532SDavid du Colombier #include "a.h"
37edc7532SDavid du Colombier %}
47edc7532SDavid du Colombier %union
57edc7532SDavid du Colombier {
67edc7532SDavid du Colombier 	Sym	*sym;
77edc7532SDavid du Colombier 	vlong	lval;
87edc7532SDavid du Colombier 	double	dval;
97edc7532SDavid du Colombier 	char	sval[8];
107edc7532SDavid du Colombier 	Gen	gen;
117edc7532SDavid du Colombier }
127edc7532SDavid du Colombier %left	'|'
137edc7532SDavid du Colombier %left	'^'
147edc7532SDavid du Colombier %left	'&'
157edc7532SDavid du Colombier %left	'<' '>'
167edc7532SDavid du Colombier %left	'+' '-'
177edc7532SDavid du Colombier %left	'*' '/' '%'
187edc7532SDavid du Colombier %token	<lval>	LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5
197edc7532SDavid du Colombier %token	<lval>	LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA
207edc7532SDavid du Colombier %token	<lval>	LTYPEB LTYPEC LTYPED LTYPEE LTYPEF
217edc7532SDavid du Colombier %token	<lval>	LTYPEG LTYPEH LTYPEI LTYPEJ LTYPEK
227edc7532SDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC LHI LLO LMREG
237edc7532SDavid du Colombier %token	<lval>	LTYPEX LREG LFREG LFCREG LR LM LF
247edc7532SDavid du Colombier %token	<lval>	LFCR LSCHED
257edc7532SDavid du Colombier %token	<dval>	LFCONST
267edc7532SDavid du Colombier %token	<sval>	LSCONST
277edc7532SDavid du Colombier %token	<lval>	LVCONST
287edc7532SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
297edc7532SDavid du Colombier %type	<lval>	con expr pointer offset sreg
307edc7532SDavid du Colombier %type	<gen>	gen vgen lgen vlgen rel reg freg mreg fcreg
317edc7532SDavid du Colombier %type	<gen>	imm ximm ireg name oreg imr nireg fgen
327edc7532SDavid du Colombier %%
337edc7532SDavid du Colombier prog:
347edc7532SDavid du Colombier |	prog line
357edc7532SDavid du Colombier 
367edc7532SDavid du Colombier line:
377edc7532SDavid du Colombier 	LLAB ':'
387edc7532SDavid du Colombier 	{
397edc7532SDavid du Colombier 		if($1->value != pc)
407edc7532SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
417edc7532SDavid du Colombier 		$1->value = pc;
427edc7532SDavid du Colombier 	}
437edc7532SDavid du Colombier 	line
447edc7532SDavid du Colombier |	LNAME ':'
457edc7532SDavid du Colombier 	{
467edc7532SDavid du Colombier 		$1->type = LLAB;
477edc7532SDavid du Colombier 		$1->value = pc;
487edc7532SDavid du Colombier 	}
497edc7532SDavid du Colombier 	line
507edc7532SDavid du Colombier |	LNAME '=' expr ';'
517edc7532SDavid du Colombier 	{
527edc7532SDavid du Colombier 		$1->type = LVAR;
537edc7532SDavid du Colombier 		$1->value = $3;
547edc7532SDavid du Colombier 	}
557edc7532SDavid du Colombier |	LVAR '=' expr ';'
567edc7532SDavid du Colombier 	{
577edc7532SDavid du Colombier 		if($1->value != $3)
587edc7532SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
597edc7532SDavid du Colombier 		$1->value = $3;
607edc7532SDavid du Colombier 	}
617edc7532SDavid du Colombier |	LSCHED ';'
627edc7532SDavid du Colombier 	{
637edc7532SDavid du Colombier 		nosched = $1;
647edc7532SDavid du Colombier 	}
657edc7532SDavid du Colombier |	';'
667edc7532SDavid du Colombier |	inst ';'
677edc7532SDavid du Colombier |	error ';'
687edc7532SDavid du Colombier 
697edc7532SDavid du Colombier inst:
707edc7532SDavid du Colombier /*
717edc7532SDavid du Colombier  * Immed-type
727edc7532SDavid du Colombier  */
737edc7532SDavid du Colombier 	LTYPE1 imr ',' sreg ',' reg
747edc7532SDavid du Colombier 	{
757edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
767edc7532SDavid du Colombier 	}
777edc7532SDavid du Colombier |	LTYPE1 imr ',' reg
787edc7532SDavid du Colombier 	{
797edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
807edc7532SDavid du Colombier 	}
817edc7532SDavid du Colombier /*
827edc7532SDavid du Colombier  * NOR
837edc7532SDavid du Colombier  */
847edc7532SDavid du Colombier |	LTYPE2 imr ',' sreg ',' imr
857edc7532SDavid du Colombier 	{
867edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
877edc7532SDavid du Colombier 	}
887edc7532SDavid du Colombier |	LTYPE2 imr ',' imr
897edc7532SDavid du Colombier 	{
907edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
917edc7532SDavid du Colombier 	}
927edc7532SDavid du Colombier /*
937edc7532SDavid du Colombier  * LOAD/STORE, but not MOVW
947edc7532SDavid du Colombier  */
957edc7532SDavid du Colombier |	LTYPE3 lgen ',' gen
967edc7532SDavid du Colombier 	{
977edc7532SDavid du Colombier 		if(!isreg(&$2) && !isreg(&$4))
987edc7532SDavid du Colombier 			print("one side must be register\n");
997edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1007edc7532SDavid du Colombier 	}
1017edc7532SDavid du Colombier /*
1027edc7532SDavid du Colombier  * SPECIAL
1037edc7532SDavid du Colombier  */
1047edc7532SDavid du Colombier |	LTYPE4 comma
1057edc7532SDavid du Colombier 	{
1067edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
1077edc7532SDavid du Colombier 	}
1087edc7532SDavid du Colombier /*
1097edc7532SDavid du Colombier  * MOVW
1107edc7532SDavid du Colombier  */
1117edc7532SDavid du Colombier |	LTYPE5 vlgen ',' vgen
1127edc7532SDavid du Colombier 	{
1137edc7532SDavid du Colombier 		if(!isreg(&$2) && !isreg(&$4))
1147edc7532SDavid du Colombier 			print("one side must be register\n");
1157edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1167edc7532SDavid du Colombier 	}
1177edc7532SDavid du Colombier /*
1187edc7532SDavid du Colombier  * MUL/DIV
1197edc7532SDavid du Colombier  */
1207edc7532SDavid du Colombier |	LTYPE6 reg ',' sreg comma
1217edc7532SDavid du Colombier 	{
1227edc7532SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
1237edc7532SDavid du Colombier 	}
1247edc7532SDavid du Colombier |	LTYPE6 reg ',' sreg ',' reg
1257edc7532SDavid du Colombier 	{
1267edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
1277edc7532SDavid du Colombier 	}
1287edc7532SDavid du Colombier /*
1297edc7532SDavid du Colombier  * JMP/JAL
1307edc7532SDavid du Colombier  */
1317edc7532SDavid du Colombier |	LTYPE7 comma rel
1327edc7532SDavid du Colombier 	{
1337edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
1347edc7532SDavid du Colombier 	}
1357edc7532SDavid du Colombier |	LTYPE7 comma nireg
1367edc7532SDavid du Colombier 	{
1377edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
1387edc7532SDavid du Colombier 	}
1397edc7532SDavid du Colombier |	LTYPE8 comma rel
1407edc7532SDavid du Colombier 	{
1417edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
1427edc7532SDavid du Colombier 	}
1437edc7532SDavid du Colombier |	LTYPE8 comma nireg
1447edc7532SDavid du Colombier 	{
1457edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
1467edc7532SDavid du Colombier 	}
1477edc7532SDavid du Colombier |	LTYPE8 sreg ',' nireg
1487edc7532SDavid du Colombier 	{
1497edc7532SDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
1507edc7532SDavid du Colombier 	}
1517edc7532SDavid du Colombier /*
1527edc7532SDavid du Colombier  * BEQ/BNE
1537edc7532SDavid du Colombier  */
1547edc7532SDavid du Colombier |	LTYPE9 gen ',' rel
1557edc7532SDavid du Colombier 	{
1567edc7532SDavid du Colombier 		if(!isreg(&$2))
1577edc7532SDavid du Colombier 			print("left side must be register\n");
1587edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1597edc7532SDavid du Colombier 	}
1607edc7532SDavid du Colombier |	LTYPE9 gen ',' sreg ',' rel
1617edc7532SDavid du Colombier 	{
1627edc7532SDavid du Colombier 		if(!isreg(&$2))
1637edc7532SDavid du Colombier 			print("left side must be register\n");
1647edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
1657edc7532SDavid du Colombier 	}
1667edc7532SDavid du Colombier /*
1677edc7532SDavid du Colombier  * B-other
1687edc7532SDavid du Colombier  */
1697edc7532SDavid du Colombier |	LTYPEA gen ',' rel
1707edc7532SDavid du Colombier 	{
1717edc7532SDavid du Colombier 		if(!isreg(&$2))
1727edc7532SDavid du Colombier 			print("left side must be register\n");
1737edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1747edc7532SDavid du Colombier 	}
1757edc7532SDavid du Colombier /*
1767edc7532SDavid du Colombier  * TEXT/GLOBL
1777edc7532SDavid du Colombier  */
1787edc7532SDavid du Colombier |	LTYPEB name ',' imm
1797edc7532SDavid du Colombier 	{
1807edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1817edc7532SDavid du Colombier 	}
1827edc7532SDavid du Colombier |	LTYPEB name ',' con ',' imm
1837edc7532SDavid du Colombier 	{
1847edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
1857edc7532SDavid du Colombier 	}
1867edc7532SDavid du Colombier /*
1877edc7532SDavid du Colombier  * DATA
1887edc7532SDavid du Colombier  */
1897edc7532SDavid du Colombier |	LTYPEC name '/' con ',' ximm
1907edc7532SDavid du Colombier 	{
1917edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
1927edc7532SDavid du Colombier 	}
1937edc7532SDavid du Colombier /*
1947edc7532SDavid du Colombier  * floating-type
1957edc7532SDavid du Colombier  */
1967edc7532SDavid du Colombier |	LTYPED freg ',' freg
1977edc7532SDavid du Colombier 	{
1987edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
1997edc7532SDavid du Colombier 	}
2007edc7532SDavid du Colombier |	LTYPEE freg ',' freg
2017edc7532SDavid du Colombier 	{
2027edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2037edc7532SDavid du Colombier 	}
2047edc7532SDavid du Colombier |	LTYPEE freg ',' LFREG ',' freg
2057edc7532SDavid du Colombier 	{
2067edc7532SDavid du Colombier 		outcode($1, &$2, $4, &$6);
2077edc7532SDavid du Colombier 	}
2087edc7532SDavid du Colombier |	LTYPEF freg ',' LFREG comma
2097edc7532SDavid du Colombier 	{
2107edc7532SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
2117edc7532SDavid du Colombier 	}
2127edc7532SDavid du Colombier /*
2137edc7532SDavid du Colombier  * coprocessor branch
2147edc7532SDavid du Colombier  */
2157edc7532SDavid du Colombier |	LTYPEG comma rel
2167edc7532SDavid du Colombier 	{
2177edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2187edc7532SDavid du Colombier 	}
2197edc7532SDavid du Colombier /*
2207edc7532SDavid du Colombier  * word
2217edc7532SDavid du Colombier  */
2227edc7532SDavid du Colombier |	LTYPEH comma ximm
2237edc7532SDavid du Colombier 	{
2247edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2257edc7532SDavid du Colombier 	}
2267edc7532SDavid du Colombier /*
2277edc7532SDavid du Colombier  * NOP
2287edc7532SDavid du Colombier  */
2297edc7532SDavid du Colombier |	LTYPEI comma
2307edc7532SDavid du Colombier 	{
2317edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
2327edc7532SDavid du Colombier 	}
2337edc7532SDavid du Colombier |	LTYPEI ',' vgen
2347edc7532SDavid du Colombier 	{
2357edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
2367edc7532SDavid du Colombier 	}
2377edc7532SDavid du Colombier |	LTYPEI vgen comma
2387edc7532SDavid du Colombier 	{
2397edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
2407edc7532SDavid du Colombier 	}
2417edc7532SDavid du Colombier /*
2427edc7532SDavid du Colombier  * BREAK -- overloaded with CACHE opcode
2437edc7532SDavid du Colombier  */
2447edc7532SDavid du Colombier |	LTYPEJ comma
2457edc7532SDavid du Colombier 	{
2467edc7532SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
2477edc7532SDavid du Colombier 	}
2487edc7532SDavid du Colombier |	LTYPEJ vgen ',' vgen
2497edc7532SDavid du Colombier 	{
2507edc7532SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
2517edc7532SDavid du Colombier 	}
2527edc7532SDavid du Colombier 
2537edc7532SDavid du Colombier comma:
2547edc7532SDavid du Colombier |	','
2557edc7532SDavid du Colombier 
2567edc7532SDavid du Colombier rel:
2577edc7532SDavid du Colombier 	con '(' LPC ')'
2587edc7532SDavid du Colombier 	{
2597edc7532SDavid du Colombier 		$$ = nullgen;
2607edc7532SDavid du Colombier 		$$.type = D_BRANCH;
2617edc7532SDavid du Colombier 		$$.offset = $1 + pc;
2627edc7532SDavid du Colombier 	}
2637edc7532SDavid du Colombier |	LNAME offset
2647edc7532SDavid du Colombier 	{
2657edc7532SDavid du Colombier 		$$ = nullgen;
2667edc7532SDavid du Colombier 		if(pass == 2)
2677edc7532SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
2687edc7532SDavid du Colombier 		$$.type = D_BRANCH;
2697edc7532SDavid du Colombier 		$$.sym = $1;
2707edc7532SDavid du Colombier 		$$.offset = $2;
2717edc7532SDavid du Colombier 	}
2727edc7532SDavid du Colombier |	LLAB offset
2737edc7532SDavid du Colombier 	{
2747edc7532SDavid du Colombier 		$$ = nullgen;
2757edc7532SDavid du Colombier 		$$.type = D_BRANCH;
2767edc7532SDavid du Colombier 		$$.sym = $1;
2777edc7532SDavid du Colombier 		$$.offset = $1->value + $2;
2787edc7532SDavid du Colombier 	}
2797edc7532SDavid du Colombier 
2807edc7532SDavid du Colombier vlgen:
2817edc7532SDavid du Colombier 	lgen
2827edc7532SDavid du Colombier |	fgen
2837edc7532SDavid du Colombier |	mreg
2847edc7532SDavid du Colombier |	fcreg
2857edc7532SDavid du Colombier |	LHI
2867edc7532SDavid du Colombier 	{
2877edc7532SDavid du Colombier 		$$ = nullgen;
2887edc7532SDavid du Colombier 		$$.type = D_HI;
2897edc7532SDavid du Colombier 	}
2907edc7532SDavid du Colombier |	LLO
2917edc7532SDavid du Colombier 	{
2927edc7532SDavid du Colombier 		$$ = nullgen;
2937edc7532SDavid du Colombier 		$$.type = D_LO;
2947edc7532SDavid du Colombier 	}
2957edc7532SDavid du Colombier 
2967edc7532SDavid du Colombier vgen:
2977edc7532SDavid du Colombier 	gen
2987edc7532SDavid du Colombier |	fgen
2997edc7532SDavid du Colombier |	mreg
3007edc7532SDavid du Colombier |	fcreg
3017edc7532SDavid du Colombier |	LHI
3027edc7532SDavid du Colombier 	{
3037edc7532SDavid du Colombier 		$$ = nullgen;
3047edc7532SDavid du Colombier 		$$.type = D_HI;
3057edc7532SDavid du Colombier 	}
3067edc7532SDavid du Colombier |	LLO
3077edc7532SDavid du Colombier 	{
3087edc7532SDavid du Colombier 		$$ = nullgen;
3097edc7532SDavid du Colombier 		$$.type = D_LO;
3107edc7532SDavid du Colombier 	}
3117edc7532SDavid du Colombier 
3127edc7532SDavid du Colombier lgen:
3137edc7532SDavid du Colombier 	gen
3147edc7532SDavid du Colombier |	ximm
3157edc7532SDavid du Colombier 
3167edc7532SDavid du Colombier fgen:
3177edc7532SDavid du Colombier 	freg
3187edc7532SDavid du Colombier 
3197edc7532SDavid du Colombier mreg:
3207edc7532SDavid du Colombier 	LMREG
3217edc7532SDavid du Colombier 	{
3227edc7532SDavid du Colombier 		$$ = nullgen;
3237edc7532SDavid du Colombier 		$$.type = D_MREG;
3247edc7532SDavid du Colombier 		$$.reg = $1;
3257edc7532SDavid du Colombier 	}
3267edc7532SDavid du Colombier |	LM '(' con ')'
3277edc7532SDavid du Colombier 	{
3287edc7532SDavid du Colombier 		$$ = nullgen;
3297edc7532SDavid du Colombier 		$$.type = D_MREG;
3307edc7532SDavid du Colombier 		$$.reg = $3;
3317edc7532SDavid du Colombier 	}
3327edc7532SDavid du Colombier 
3337edc7532SDavid du Colombier fcreg:
3347edc7532SDavid du Colombier 	LFCREG
3357edc7532SDavid du Colombier 	{
3367edc7532SDavid du Colombier 		$$ = nullgen;
3377edc7532SDavid du Colombier 		$$.type = D_FCREG;
3387edc7532SDavid du Colombier 		$$.reg = $1;
3397edc7532SDavid du Colombier 	}
3407edc7532SDavid du Colombier |	LFCR '(' con ')'
3417edc7532SDavid du Colombier 	{
3427edc7532SDavid du Colombier 		$$ = nullgen;
3437edc7532SDavid du Colombier 		$$.type = D_FCREG;
3447edc7532SDavid du Colombier 		$$.reg = $3;
3457edc7532SDavid du Colombier 	}
3467edc7532SDavid du Colombier 
3477edc7532SDavid du Colombier freg:
3487edc7532SDavid du Colombier 	LFREG
3497edc7532SDavid du Colombier 	{
3507edc7532SDavid du Colombier 		$$ = nullgen;
3517edc7532SDavid du Colombier 		$$.type = D_FREG;
3527edc7532SDavid du Colombier 		$$.reg = $1;
3537edc7532SDavid du Colombier 	}
3547edc7532SDavid du Colombier |	LF '(' con ')'
3557edc7532SDavid du Colombier 	{
3567edc7532SDavid du Colombier 		$$ = nullgen;
3577edc7532SDavid du Colombier 		$$.type = D_FREG;
3587edc7532SDavid du Colombier 		$$.reg = $3;
3597edc7532SDavid du Colombier 	}
3607edc7532SDavid du Colombier 
3617edc7532SDavid du Colombier ximm:	'$' con
3627edc7532SDavid du Colombier 	{
3637edc7532SDavid du Colombier 		$$ = nullgen;
364*f8bc6aafSDavid du Colombier 		if(isvconst($2))
3657edc7532SDavid du Colombier 			$$.type = D_VCONST;
366*f8bc6aafSDavid du Colombier 		else
3677edc7532SDavid du Colombier 			$$.type = D_CONST;
3687edc7532SDavid du Colombier 		$$.offset = $2;
3697edc7532SDavid du Colombier 	}
3707edc7532SDavid du Colombier |	'$' oreg
3717edc7532SDavid du Colombier 	{
3727edc7532SDavid du Colombier 		$$ = $2;
3737edc7532SDavid du Colombier 		$$.type = D_CONST;
3747edc7532SDavid du Colombier 	}
3757edc7532SDavid du Colombier |	'$' '*' '$' oreg
3767edc7532SDavid du Colombier 	{
3777edc7532SDavid du Colombier 		$$ = $4;
3787edc7532SDavid du Colombier 		$$.type = D_OCONST;
3797edc7532SDavid du Colombier 	}
3807edc7532SDavid du Colombier |	'$' LSCONST
3817edc7532SDavid du Colombier 	{
3827edc7532SDavid du Colombier 		$$ = nullgen;
3837edc7532SDavid du Colombier 		$$.type = D_SCONST;
3847edc7532SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
3857edc7532SDavid du Colombier 	}
3867edc7532SDavid du Colombier |	'$' LFCONST
3877edc7532SDavid du Colombier 	{
3887edc7532SDavid du Colombier 		$$ = nullgen;
3897edc7532SDavid du Colombier 		$$.type = D_FCONST;
3907edc7532SDavid du Colombier 		$$.dval = $2;
3917edc7532SDavid du Colombier 	}
3927edc7532SDavid du Colombier |	'$' '-' LFCONST
3937edc7532SDavid du Colombier 	{
3947edc7532SDavid du Colombier 		$$ = nullgen;
3957edc7532SDavid du Colombier 		$$.type = D_FCONST;
3967edc7532SDavid du Colombier 		$$.dval = -$3;
3977edc7532SDavid du Colombier 	}
3987edc7532SDavid du Colombier 
3997edc7532SDavid du Colombier nireg:
4007edc7532SDavid du Colombier 	ireg
4017edc7532SDavid du Colombier |	con ireg
4027edc7532SDavid du Colombier 	{
4037edc7532SDavid du Colombier 		if($1 != 0)
4047edc7532SDavid du Colombier 			yyerror("offset must be zero");
4057edc7532SDavid du Colombier 		$$ = $2;
4067edc7532SDavid du Colombier 	}
4077edc7532SDavid du Colombier |	name
4087edc7532SDavid du Colombier 	{
4097edc7532SDavid du Colombier 		$$ = $1;
4107edc7532SDavid du Colombier 		if($1.name != D_EXTERN && $1.name != D_STATIC) {
4117edc7532SDavid du Colombier 		}
4127edc7532SDavid du Colombier 	}
4137edc7532SDavid du Colombier 
4147edc7532SDavid du Colombier ireg:
4157edc7532SDavid du Colombier 	'(' sreg ')'
4167edc7532SDavid du Colombier 	{
4177edc7532SDavid du Colombier 		$$ = nullgen;
4187edc7532SDavid du Colombier 		$$.type = D_OREG;
4197edc7532SDavid du Colombier 		$$.reg = $2;
4207edc7532SDavid du Colombier 		$$.offset = 0;
4217edc7532SDavid du Colombier 	}
4227edc7532SDavid du Colombier 
4237edc7532SDavid du Colombier gen:
4247edc7532SDavid du Colombier 	reg
4257edc7532SDavid du Colombier |	con
4267edc7532SDavid du Colombier 	{
4277edc7532SDavid du Colombier 		$$ = nullgen;
4287edc7532SDavid du Colombier 		$$.type = D_OREG;
4297edc7532SDavid du Colombier 		$$.offset = $1;
4307edc7532SDavid du Colombier 	}
4317edc7532SDavid du Colombier |	oreg
4327edc7532SDavid du Colombier 
4337edc7532SDavid du Colombier oreg:
4347edc7532SDavid du Colombier 	name
4357edc7532SDavid du Colombier |	name '(' sreg ')'
4367edc7532SDavid du Colombier 	{
4377edc7532SDavid du Colombier 		$$ = $1;
4387edc7532SDavid du Colombier 		$$.type = D_OREG;
4397edc7532SDavid du Colombier 		$$.reg = $3;
4407edc7532SDavid du Colombier 	}
4417edc7532SDavid du Colombier |	'(' sreg ')'
4427edc7532SDavid du Colombier 	{
4437edc7532SDavid du Colombier 		$$ = nullgen;
4447edc7532SDavid du Colombier 		$$.type = D_OREG;
4457edc7532SDavid du Colombier 		$$.reg = $2;
4467edc7532SDavid du Colombier 		$$.offset = 0;
4477edc7532SDavid du Colombier 	}
4487edc7532SDavid du Colombier |	con '(' sreg ')'
4497edc7532SDavid du Colombier 	{
4507edc7532SDavid du Colombier 		$$ = nullgen;
4517edc7532SDavid du Colombier 		$$.type = D_OREG;
4527edc7532SDavid du Colombier 		$$.reg = $3;
4537edc7532SDavid du Colombier 		$$.offset = $1;
4547edc7532SDavid du Colombier 	}
4557edc7532SDavid du Colombier 
4567edc7532SDavid du Colombier imr:
4577edc7532SDavid du Colombier 	reg
4587edc7532SDavid du Colombier |	imm
4597edc7532SDavid du Colombier 
4607edc7532SDavid du Colombier imm:	'$' con
4617edc7532SDavid du Colombier 	{
4627edc7532SDavid du Colombier 		$$ = nullgen;
463*f8bc6aafSDavid du Colombier 		if(isvconst($2))
4647edc7532SDavid du Colombier 			$$.type = D_VCONST;
465*f8bc6aafSDavid du Colombier 		else
4667edc7532SDavid du Colombier 			$$.type = D_CONST;
4677edc7532SDavid du Colombier 		$$.offset = $2;
4687edc7532SDavid du Colombier 	}
4697edc7532SDavid du Colombier 
4707edc7532SDavid du Colombier reg:
4717edc7532SDavid du Colombier 	sreg
4727edc7532SDavid du Colombier 	{
4737edc7532SDavid du Colombier 		$$ = nullgen;
4747edc7532SDavid du Colombier 		$$.type = D_REG;
4757edc7532SDavid du Colombier 		$$.reg = $1;
4767edc7532SDavid du Colombier 	}
4777edc7532SDavid du Colombier 
4787edc7532SDavid du Colombier sreg:
4797edc7532SDavid du Colombier 	LREG
4807edc7532SDavid du Colombier |	LR '(' con ')'
4817edc7532SDavid du Colombier 	{
4827edc7532SDavid du Colombier 		if($$ < 0 || $$ >= NREG)
4837edc7532SDavid du Colombier 			print("register value out of range\n");
4847edc7532SDavid du Colombier 		$$ = $3;
4857edc7532SDavid du Colombier 	}
4867edc7532SDavid du Colombier 
4877edc7532SDavid du Colombier name:
4887edc7532SDavid du Colombier 	con '(' pointer ')'
4897edc7532SDavid du Colombier 	{
4907edc7532SDavid du Colombier 		$$ = nullgen;
4917edc7532SDavid du Colombier 		$$.type = D_OREG;
4927edc7532SDavid du Colombier 		$$.name = $3;
4937edc7532SDavid du Colombier 		$$.sym = S;
4947edc7532SDavid du Colombier 		$$.offset = $1;
4957edc7532SDavid du Colombier 	}
4967edc7532SDavid du Colombier |	LNAME offset '(' pointer ')'
4977edc7532SDavid du Colombier 	{
4987edc7532SDavid du Colombier 		$$ = nullgen;
4997edc7532SDavid du Colombier 		$$.type = D_OREG;
5007edc7532SDavid du Colombier 		$$.name = $4;
5017edc7532SDavid du Colombier 		$$.sym = $1;
5027edc7532SDavid du Colombier 		$$.offset = $2;
5037edc7532SDavid du Colombier 	}
5047edc7532SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
5057edc7532SDavid du Colombier 	{
5067edc7532SDavid du Colombier 		$$ = nullgen;
5077edc7532SDavid du Colombier 		$$.type = D_OREG;
5087edc7532SDavid du Colombier 		$$.name = D_STATIC;
5097edc7532SDavid du Colombier 		$$.sym = $1;
5107edc7532SDavid du Colombier 		$$.offset = $4;
5117edc7532SDavid du Colombier 	}
5127edc7532SDavid du Colombier 
5137edc7532SDavid du Colombier offset:
5147edc7532SDavid du Colombier 	{
5157edc7532SDavid du Colombier 		$$ = 0;
5167edc7532SDavid du Colombier 	}
5177edc7532SDavid du Colombier |	'+' con
5187edc7532SDavid du Colombier 	{
5197edc7532SDavid du Colombier 		$$ = $2;
5207edc7532SDavid du Colombier 	}
5217edc7532SDavid du Colombier |	'-' con
5227edc7532SDavid du Colombier 	{
5237edc7532SDavid du Colombier 		$$ = -$2;
5247edc7532SDavid du Colombier 	}
5257edc7532SDavid du Colombier 
5267edc7532SDavid du Colombier pointer:
5277edc7532SDavid du Colombier 	LSB
5287edc7532SDavid du Colombier |	LSP
5297edc7532SDavid du Colombier |	LFP
5307edc7532SDavid du Colombier 
5317edc7532SDavid du Colombier con:
5327edc7532SDavid du Colombier 	LCONST
5337edc7532SDavid du Colombier |	LVAR
5347edc7532SDavid du Colombier 	{
5357edc7532SDavid du Colombier 		$$ = $1->value;
5367edc7532SDavid du Colombier 	}
5377edc7532SDavid du Colombier |	'-' con
5387edc7532SDavid du Colombier 	{
5397edc7532SDavid du Colombier 		$$ = -$2;
5407edc7532SDavid du Colombier 	}
5417edc7532SDavid du Colombier |	'+' con
5427edc7532SDavid du Colombier 	{
5437edc7532SDavid du Colombier 		$$ = $2;
5447edc7532SDavid du Colombier 	}
5457edc7532SDavid du Colombier |	'~' con
5467edc7532SDavid du Colombier 	{
5477edc7532SDavid du Colombier 		$$ = ~$2;
5487edc7532SDavid du Colombier 	}
5497edc7532SDavid du Colombier |	'(' expr ')'
5507edc7532SDavid du Colombier 	{
5517edc7532SDavid du Colombier 		$$ = $2;
5527edc7532SDavid du Colombier 	}
5537edc7532SDavid du Colombier 
5547edc7532SDavid du Colombier expr:
5557edc7532SDavid du Colombier 	con
5567edc7532SDavid du Colombier |	expr '+' expr
5577edc7532SDavid du Colombier 	{
5587edc7532SDavid du Colombier 		$$ = $1 + $3;
5597edc7532SDavid du Colombier 	}
5607edc7532SDavid du Colombier |	expr '-' expr
5617edc7532SDavid du Colombier 	{
5627edc7532SDavid du Colombier 		$$ = $1 - $3;
5637edc7532SDavid du Colombier 	}
5647edc7532SDavid du Colombier |	expr '*' expr
5657edc7532SDavid du Colombier 	{
5667edc7532SDavid du Colombier 		$$ = $1 * $3;
5677edc7532SDavid du Colombier 	}
5687edc7532SDavid du Colombier |	expr '/' expr
5697edc7532SDavid du Colombier 	{
5707edc7532SDavid du Colombier 		$$ = $1 / $3;
5717edc7532SDavid du Colombier 	}
5727edc7532SDavid du Colombier |	expr '%' expr
5737edc7532SDavid du Colombier 	{
5747edc7532SDavid du Colombier 		$$ = $1 % $3;
5757edc7532SDavid du Colombier 	}
5767edc7532SDavid du Colombier |	expr '<' '<' expr
5777edc7532SDavid du Colombier 	{
5787edc7532SDavid du Colombier 		$$ = $1 << $4;
5797edc7532SDavid du Colombier 	}
5807edc7532SDavid du Colombier |	expr '>' '>' expr
5817edc7532SDavid du Colombier 	{
5827edc7532SDavid du Colombier 		$$ = $1 >> $4;
5837edc7532SDavid du Colombier 	}
5847edc7532SDavid du Colombier |	expr '&' expr
5857edc7532SDavid du Colombier 	{
5867edc7532SDavid du Colombier 		$$ = $1 & $3;
5877edc7532SDavid du Colombier 	}
5887edc7532SDavid du Colombier |	expr '^' expr
5897edc7532SDavid du Colombier 	{
5907edc7532SDavid du Colombier 		$$ = $1 ^ $3;
5917edc7532SDavid du Colombier 	}
5927edc7532SDavid du Colombier |	expr '|' expr
5937edc7532SDavid du Colombier 	{
5947edc7532SDavid du Colombier 		$$ = $1 | $3;
5957edc7532SDavid du Colombier 	}
5967edc7532SDavid du Colombier %%
5977edc7532SDavid du Colombier 
5987edc7532SDavid du Colombier int
5997edc7532SDavid du Colombier isvconst(vlong con)
6007edc7532SDavid du Colombier {
601*f8bc6aafSDavid du Colombier 	long l;
6027edc7532SDavid du Colombier 
603*f8bc6aafSDavid du Colombier 	l = con;
604*f8bc6aafSDavid du Colombier 	return (vlong)l != con;
6057edc7532SDavid du Colombier }
606