xref: /plan9-contrib/sys/src/cmd/9a/a.y (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
1*fbadb1c4SDavid du Colombier %{
2*fbadb1c4SDavid du Colombier #include "a.h"
3*fbadb1c4SDavid du Colombier %}
4*fbadb1c4SDavid du Colombier %union
5*fbadb1c4SDavid du Colombier {
6*fbadb1c4SDavid du Colombier 	Sym	*sym;
7*fbadb1c4SDavid du Colombier 	vlong	lval;
8*fbadb1c4SDavid du Colombier 	double	dval;
9*fbadb1c4SDavid du Colombier 	char	sval[8];
10*fbadb1c4SDavid du Colombier 	Gen	gen;
11*fbadb1c4SDavid du Colombier }
12*fbadb1c4SDavid du Colombier %left	'|'
13*fbadb1c4SDavid du Colombier %left	'^'
14*fbadb1c4SDavid du Colombier %left	'&'
15*fbadb1c4SDavid du Colombier %left	'<' '>'
16*fbadb1c4SDavid du Colombier %left	'+' '-'
17*fbadb1c4SDavid du Colombier %left	'*' '/' '%'
18*fbadb1c4SDavid du Colombier %token	<lval>	LMOVW LMOVB LABS LLOGW LSHW LADDW LCMP LCROP
19*fbadb1c4SDavid du Colombier %token	<lval>	LBRA LFMOV LFCONV LFCMP LFADD LFMA LTRAP LXORW
20*fbadb1c4SDavid du Colombier %token	<lval>	LNOP LEND LRETT LWORD LTEXT LDATA LRETRN
21*fbadb1c4SDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC LCREG LFLUSH
22*fbadb1c4SDavid du Colombier %token	<lval>	LREG LFREG LR LCR LF LFPSCR
23*fbadb1c4SDavid du Colombier %token	<lval>	LLR LCTR LSPR LSPREG LSEG LMSR
24*fbadb1c4SDavid du Colombier %token	<lval>	LSCHED LXLD LXST LXOP LXMV
25*fbadb1c4SDavid du Colombier %token	<lval>	LRLWM LMOVMW LMOVEM LMOVFL LMTFSB LMA
26*fbadb1c4SDavid du Colombier %token	<dval>	LFCONST
27*fbadb1c4SDavid du Colombier %token	<sval>	LSCONST
28*fbadb1c4SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
29*fbadb1c4SDavid du Colombier %type	<lval>	con expr pointer offset sreg
30*fbadb1c4SDavid du Colombier %type	<gen>	addr rreg regaddr name creg freg xlreg lr ctr
31*fbadb1c4SDavid du Colombier %type	<gen>	imm ximm fimm rel psr lcr cbit fpscr fpscrf msr mask
32*fbadb1c4SDavid du Colombier %%
33*fbadb1c4SDavid du Colombier prog:
34*fbadb1c4SDavid du Colombier |	prog line
35*fbadb1c4SDavid du Colombier 
36*fbadb1c4SDavid du Colombier line:
37*fbadb1c4SDavid du Colombier 	LLAB ':'
38*fbadb1c4SDavid du Colombier 	{
39*fbadb1c4SDavid du Colombier 		if($1->value != pc)
40*fbadb1c4SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
41*fbadb1c4SDavid du Colombier 		$1->value = pc;
42*fbadb1c4SDavid du Colombier 	}
43*fbadb1c4SDavid du Colombier 	line
44*fbadb1c4SDavid du Colombier |	LNAME ':'
45*fbadb1c4SDavid du Colombier 	{
46*fbadb1c4SDavid du Colombier 		$1->type = LLAB;
47*fbadb1c4SDavid du Colombier 		$1->value = pc;
48*fbadb1c4SDavid du Colombier 	}
49*fbadb1c4SDavid du Colombier 	line
50*fbadb1c4SDavid du Colombier |	LNAME '=' expr ';'
51*fbadb1c4SDavid du Colombier 	{
52*fbadb1c4SDavid du Colombier 		$1->type = LVAR;
53*fbadb1c4SDavid du Colombier 		$1->value = $3;
54*fbadb1c4SDavid du Colombier 	}
55*fbadb1c4SDavid du Colombier |	LVAR '=' expr ';'
56*fbadb1c4SDavid du Colombier 	{
57*fbadb1c4SDavid du Colombier 		if($1->value != $3)
58*fbadb1c4SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
59*fbadb1c4SDavid du Colombier 		$1->value = $3;
60*fbadb1c4SDavid du Colombier 	}
61*fbadb1c4SDavid du Colombier |	LSCHED ';'
62*fbadb1c4SDavid du Colombier 	{
63*fbadb1c4SDavid du Colombier 		nosched = $1;
64*fbadb1c4SDavid du Colombier 	}
65*fbadb1c4SDavid du Colombier |	';'
66*fbadb1c4SDavid du Colombier |	inst ';'
67*fbadb1c4SDavid du Colombier |	error ';'
68*fbadb1c4SDavid du Colombier 
69*fbadb1c4SDavid du Colombier inst:
70*fbadb1c4SDavid du Colombier /*
71*fbadb1c4SDavid du Colombier  * load ints and bytes
72*fbadb1c4SDavid du Colombier  */
73*fbadb1c4SDavid du Colombier 	LMOVW rreg ',' rreg
74*fbadb1c4SDavid du Colombier 	{
75*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
76*fbadb1c4SDavid du Colombier 	}
77*fbadb1c4SDavid du Colombier |	LMOVW addr ',' rreg
78*fbadb1c4SDavid du Colombier 	{
79*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
80*fbadb1c4SDavid du Colombier 	}
81*fbadb1c4SDavid du Colombier |	LMOVW regaddr ',' rreg
82*fbadb1c4SDavid du Colombier 	{
83*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
84*fbadb1c4SDavid du Colombier 	}
85*fbadb1c4SDavid du Colombier |	LMOVB rreg ',' rreg
86*fbadb1c4SDavid du Colombier 	{
87*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
88*fbadb1c4SDavid du Colombier 	}
89*fbadb1c4SDavid du Colombier |	LMOVB addr ',' rreg
90*fbadb1c4SDavid du Colombier 	{
91*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
92*fbadb1c4SDavid du Colombier 	}
93*fbadb1c4SDavid du Colombier |	LMOVB regaddr ',' rreg
94*fbadb1c4SDavid du Colombier 	{
95*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
96*fbadb1c4SDavid du Colombier 	}
97*fbadb1c4SDavid du Colombier /*
98*fbadb1c4SDavid du Colombier  * load floats
99*fbadb1c4SDavid du Colombier  */
100*fbadb1c4SDavid du Colombier |	LFMOV addr ',' freg
101*fbadb1c4SDavid du Colombier 	{
102*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
103*fbadb1c4SDavid du Colombier 	}
104*fbadb1c4SDavid du Colombier |	LFMOV regaddr ',' freg
105*fbadb1c4SDavid du Colombier 	{
106*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
107*fbadb1c4SDavid du Colombier 	}
108*fbadb1c4SDavid du Colombier |	LFMOV fimm ',' freg
109*fbadb1c4SDavid du Colombier 	{
110*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
111*fbadb1c4SDavid du Colombier 	}
112*fbadb1c4SDavid du Colombier |	LFMOV freg ',' freg
113*fbadb1c4SDavid du Colombier 	{
114*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
115*fbadb1c4SDavid du Colombier 	}
116*fbadb1c4SDavid du Colombier |	LFMOV freg ',' addr
117*fbadb1c4SDavid du Colombier 	{
118*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
119*fbadb1c4SDavid du Colombier 	}
120*fbadb1c4SDavid du Colombier |	LFMOV freg ',' regaddr
121*fbadb1c4SDavid du Colombier 	{
122*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
123*fbadb1c4SDavid du Colombier 	}
124*fbadb1c4SDavid du Colombier /*
125*fbadb1c4SDavid du Colombier  * store ints and bytes
126*fbadb1c4SDavid du Colombier  */
127*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' addr
128*fbadb1c4SDavid du Colombier 	{
129*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
130*fbadb1c4SDavid du Colombier 	}
131*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' regaddr
132*fbadb1c4SDavid du Colombier 	{
133*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
134*fbadb1c4SDavid du Colombier 	}
135*fbadb1c4SDavid du Colombier |	LMOVB rreg ',' addr
136*fbadb1c4SDavid du Colombier 	{
137*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
138*fbadb1c4SDavid du Colombier 	}
139*fbadb1c4SDavid du Colombier |	LMOVB rreg ',' regaddr
140*fbadb1c4SDavid du Colombier 	{
141*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
142*fbadb1c4SDavid du Colombier 	}
143*fbadb1c4SDavid du Colombier /*
144*fbadb1c4SDavid du Colombier  * store floats
145*fbadb1c4SDavid du Colombier  */
146*fbadb1c4SDavid du Colombier |	LMOVW freg ',' addr
147*fbadb1c4SDavid du Colombier 	{
148*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
149*fbadb1c4SDavid du Colombier 	}
150*fbadb1c4SDavid du Colombier |	LMOVW freg ',' regaddr
151*fbadb1c4SDavid du Colombier 	{
152*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
153*fbadb1c4SDavid du Colombier 	}
154*fbadb1c4SDavid du Colombier /*
155*fbadb1c4SDavid du Colombier  * floating point status
156*fbadb1c4SDavid du Colombier  */
157*fbadb1c4SDavid du Colombier |	LMOVW fpscr ',' freg
158*fbadb1c4SDavid du Colombier 	{
159*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
160*fbadb1c4SDavid du Colombier 	}
161*fbadb1c4SDavid du Colombier |	LMOVW freg ','  fpscr
162*fbadb1c4SDavid du Colombier 	{
163*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
164*fbadb1c4SDavid du Colombier 	}
165*fbadb1c4SDavid du Colombier |	LMOVW freg ',' imm ',' fpscr
166*fbadb1c4SDavid du Colombier 	{
167*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
168*fbadb1c4SDavid du Colombier 	}
169*fbadb1c4SDavid du Colombier |	LMOVW fpscr ',' creg
170*fbadb1c4SDavid du Colombier 	{
171*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
172*fbadb1c4SDavid du Colombier 	}
173*fbadb1c4SDavid du Colombier |	LMOVW imm ',' fpscrf
174*fbadb1c4SDavid du Colombier 	{
175*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
176*fbadb1c4SDavid du Colombier 	}
177*fbadb1c4SDavid du Colombier |	LMTFSB imm ',' con
178*fbadb1c4SDavid du Colombier 	{
179*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
180*fbadb1c4SDavid du Colombier 	}
181*fbadb1c4SDavid du Colombier /*
182*fbadb1c4SDavid du Colombier  * field moves (mtcrf)
183*fbadb1c4SDavid du Colombier  */
184*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' imm ',' lcr
185*fbadb1c4SDavid du Colombier 	{
186*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
187*fbadb1c4SDavid du Colombier 	}
188*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' creg
189*fbadb1c4SDavid du Colombier 	{
190*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
191*fbadb1c4SDavid du Colombier 	}
192*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' lcr
193*fbadb1c4SDavid du Colombier 	{
194*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
195*fbadb1c4SDavid du Colombier 	}
196*fbadb1c4SDavid du Colombier /*
197*fbadb1c4SDavid du Colombier  * integer operations
198*fbadb1c4SDavid du Colombier  * logical instructions
199*fbadb1c4SDavid du Colombier  * shift instructions
200*fbadb1c4SDavid du Colombier  * unary instructions
201*fbadb1c4SDavid du Colombier  */
202*fbadb1c4SDavid du Colombier |	LADDW rreg ',' sreg ',' rreg
203*fbadb1c4SDavid du Colombier 	{
204*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
205*fbadb1c4SDavid du Colombier 	}
206*fbadb1c4SDavid du Colombier |	LADDW imm ',' sreg ',' rreg
207*fbadb1c4SDavid du Colombier 	{
208*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
209*fbadb1c4SDavid du Colombier 	}
210*fbadb1c4SDavid du Colombier |	LADDW rreg ',' imm ',' rreg
211*fbadb1c4SDavid du Colombier 	{
212*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
213*fbadb1c4SDavid du Colombier 	}
214*fbadb1c4SDavid du Colombier |	LADDW rreg ',' rreg
215*fbadb1c4SDavid du Colombier 	{
216*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
217*fbadb1c4SDavid du Colombier 	}
218*fbadb1c4SDavid du Colombier |	LADDW imm ',' rreg
219*fbadb1c4SDavid du Colombier 	{
220*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
221*fbadb1c4SDavid du Colombier 	}
222*fbadb1c4SDavid du Colombier |	LLOGW rreg ',' sreg ',' rreg
223*fbadb1c4SDavid du Colombier 	{
224*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
225*fbadb1c4SDavid du Colombier 	}
226*fbadb1c4SDavid du Colombier |	LLOGW rreg ',' rreg
227*fbadb1c4SDavid du Colombier 	{
228*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
229*fbadb1c4SDavid du Colombier 	}
230*fbadb1c4SDavid du Colombier |	LSHW rreg ',' sreg ',' rreg
231*fbadb1c4SDavid du Colombier 	{
232*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
233*fbadb1c4SDavid du Colombier 	}
234*fbadb1c4SDavid du Colombier |	LSHW rreg ',' rreg
235*fbadb1c4SDavid du Colombier 	{
236*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
237*fbadb1c4SDavid du Colombier 	}
238*fbadb1c4SDavid du Colombier |	LSHW imm ',' sreg ',' rreg
239*fbadb1c4SDavid du Colombier 	{
240*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
241*fbadb1c4SDavid du Colombier 	}
242*fbadb1c4SDavid du Colombier |	LSHW imm ',' rreg
243*fbadb1c4SDavid du Colombier 	{
244*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
245*fbadb1c4SDavid du Colombier 	}
246*fbadb1c4SDavid du Colombier |	LABS rreg ',' rreg
247*fbadb1c4SDavid du Colombier 	{
248*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
249*fbadb1c4SDavid du Colombier 	}
250*fbadb1c4SDavid du Colombier |	LABS rreg
251*fbadb1c4SDavid du Colombier 	{
252*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$2);
253*fbadb1c4SDavid du Colombier 	}
254*fbadb1c4SDavid du Colombier /*
255*fbadb1c4SDavid du Colombier  * multiply-accumulate
256*fbadb1c4SDavid du Colombier  */
257*fbadb1c4SDavid du Colombier |	LMA rreg ',' sreg ',' rreg
258*fbadb1c4SDavid du Colombier 	{
259*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
260*fbadb1c4SDavid du Colombier 	}
261*fbadb1c4SDavid du Colombier /*
262*fbadb1c4SDavid du Colombier  * move immediate: macro for cau+or, addi, addis, and other combinations
263*fbadb1c4SDavid du Colombier  */
264*fbadb1c4SDavid du Colombier |	LMOVW imm ',' rreg
265*fbadb1c4SDavid du Colombier 	{
266*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
267*fbadb1c4SDavid du Colombier 	}
268*fbadb1c4SDavid du Colombier |	LMOVW ximm ',' rreg
269*fbadb1c4SDavid du Colombier 	{
270*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
271*fbadb1c4SDavid du Colombier 	}
272*fbadb1c4SDavid du Colombier /*
273*fbadb1c4SDavid du Colombier  * condition register operations
274*fbadb1c4SDavid du Colombier  */
275*fbadb1c4SDavid du Colombier |	LCROP cbit ',' cbit
276*fbadb1c4SDavid du Colombier 	{
277*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4.reg, &$4);
278*fbadb1c4SDavid du Colombier 	}
279*fbadb1c4SDavid du Colombier |	LCROP cbit ',' con ',' cbit
280*fbadb1c4SDavid du Colombier 	{
281*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
282*fbadb1c4SDavid du Colombier 	}
283*fbadb1c4SDavid du Colombier /*
284*fbadb1c4SDavid du Colombier  * condition register moves
285*fbadb1c4SDavid du Colombier  * move from machine state register
286*fbadb1c4SDavid du Colombier  */
287*fbadb1c4SDavid du Colombier |	LMOVW creg ',' creg
288*fbadb1c4SDavid du Colombier 	{
289*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
290*fbadb1c4SDavid du Colombier 	}
291*fbadb1c4SDavid du Colombier |	LMOVW psr ',' creg
292*fbadb1c4SDavid du Colombier 	{
293*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
294*fbadb1c4SDavid du Colombier 	}
295*fbadb1c4SDavid du Colombier |	LMOVW lcr ',' rreg
296*fbadb1c4SDavid du Colombier 	{
297*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
298*fbadb1c4SDavid du Colombier 	}
299*fbadb1c4SDavid du Colombier |	LMOVW psr ',' rreg
300*fbadb1c4SDavid du Colombier 	{
301*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
302*fbadb1c4SDavid du Colombier 	}
303*fbadb1c4SDavid du Colombier |	LMOVW xlreg ',' rreg
304*fbadb1c4SDavid du Colombier 	{
305*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
306*fbadb1c4SDavid du Colombier 	}
307*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' xlreg
308*fbadb1c4SDavid du Colombier 	{
309*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
310*fbadb1c4SDavid du Colombier 	}
311*fbadb1c4SDavid du Colombier |	LMOVW creg ',' psr
312*fbadb1c4SDavid du Colombier 	{
313*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
314*fbadb1c4SDavid du Colombier 	}
315*fbadb1c4SDavid du Colombier |	LMOVW rreg ',' psr
316*fbadb1c4SDavid du Colombier 	{
317*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
318*fbadb1c4SDavid du Colombier 	}
319*fbadb1c4SDavid du Colombier /*
320*fbadb1c4SDavid du Colombier  * branch, branch conditional
321*fbadb1c4SDavid du Colombier  * branch conditional register
322*fbadb1c4SDavid du Colombier  * branch conditional to count register
323*fbadb1c4SDavid du Colombier  */
324*fbadb1c4SDavid du Colombier |	LBRA rel
325*fbadb1c4SDavid du Colombier 	{
326*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
327*fbadb1c4SDavid du Colombier 	}
328*fbadb1c4SDavid du Colombier |	LBRA addr
329*fbadb1c4SDavid du Colombier 	{
330*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
331*fbadb1c4SDavid du Colombier 	}
332*fbadb1c4SDavid du Colombier |	LBRA '(' xlreg ')'
333*fbadb1c4SDavid du Colombier 	{
334*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
335*fbadb1c4SDavid du Colombier 	}
336*fbadb1c4SDavid du Colombier |	LBRA ',' rel
337*fbadb1c4SDavid du Colombier 	{
338*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
339*fbadb1c4SDavid du Colombier 	}
340*fbadb1c4SDavid du Colombier |	LBRA ',' addr
341*fbadb1c4SDavid du Colombier 	{
342*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
343*fbadb1c4SDavid du Colombier 	}
344*fbadb1c4SDavid du Colombier |	LBRA ',' '(' xlreg ')'
345*fbadb1c4SDavid du Colombier 	{
346*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$4);
347*fbadb1c4SDavid du Colombier 	}
348*fbadb1c4SDavid du Colombier |	LBRA creg ',' rel
349*fbadb1c4SDavid du Colombier 	{
350*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
351*fbadb1c4SDavid du Colombier 	}
352*fbadb1c4SDavid du Colombier |	LBRA creg ',' addr
353*fbadb1c4SDavid du Colombier 	{
354*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
355*fbadb1c4SDavid du Colombier 	}
356*fbadb1c4SDavid du Colombier |	LBRA creg ',' '(' xlreg ')'
357*fbadb1c4SDavid du Colombier 	{
358*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$5);
359*fbadb1c4SDavid du Colombier 	}
360*fbadb1c4SDavid du Colombier |	LBRA con ',' rel
361*fbadb1c4SDavid du Colombier 	{
362*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
363*fbadb1c4SDavid du Colombier 	}
364*fbadb1c4SDavid du Colombier |	LBRA con ',' addr
365*fbadb1c4SDavid du Colombier 	{
366*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
367*fbadb1c4SDavid du Colombier 	}
368*fbadb1c4SDavid du Colombier |	LBRA con ',' '(' xlreg ')'
369*fbadb1c4SDavid du Colombier 	{
370*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, $2, &$5);
371*fbadb1c4SDavid du Colombier 	}
372*fbadb1c4SDavid du Colombier |	LBRA con ',' con ',' rel
373*fbadb1c4SDavid du Colombier 	{
374*fbadb1c4SDavid du Colombier 		Gen g;
375*fbadb1c4SDavid du Colombier 		g = nullgen;
376*fbadb1c4SDavid du Colombier 		g.type = D_CONST;
377*fbadb1c4SDavid du Colombier 		g.offset = $2;
378*fbadb1c4SDavid du Colombier 		outcode($1, &g, $4, &$6);
379*fbadb1c4SDavid du Colombier 	}
380*fbadb1c4SDavid du Colombier |	LBRA con ',' con ',' addr
381*fbadb1c4SDavid du Colombier 	{
382*fbadb1c4SDavid du Colombier 		Gen g;
383*fbadb1c4SDavid du Colombier 		g = nullgen;
384*fbadb1c4SDavid du Colombier 		g.type = D_CONST;
385*fbadb1c4SDavid du Colombier 		g.offset = $2;
386*fbadb1c4SDavid du Colombier 		outcode($1, &g, $4, &$6);
387*fbadb1c4SDavid du Colombier 	}
388*fbadb1c4SDavid du Colombier |	LBRA con ',' con ',' '(' xlreg ')'
389*fbadb1c4SDavid du Colombier 	{
390*fbadb1c4SDavid du Colombier 		Gen g;
391*fbadb1c4SDavid du Colombier 		g = nullgen;
392*fbadb1c4SDavid du Colombier 		g.type = D_CONST;
393*fbadb1c4SDavid du Colombier 		g.offset = $2;
394*fbadb1c4SDavid du Colombier 		outcode($1, &g, $4, &$7);
395*fbadb1c4SDavid du Colombier 	}
396*fbadb1c4SDavid du Colombier /*
397*fbadb1c4SDavid du Colombier  * conditional trap
398*fbadb1c4SDavid du Colombier  */
399*fbadb1c4SDavid du Colombier |	LTRAP rreg ',' sreg
400*fbadb1c4SDavid du Colombier 	{
401*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
402*fbadb1c4SDavid du Colombier 	}
403*fbadb1c4SDavid du Colombier |	LTRAP imm ',' sreg
404*fbadb1c4SDavid du Colombier 	{
405*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &nullgen);
406*fbadb1c4SDavid du Colombier 	}
407*fbadb1c4SDavid du Colombier |	LTRAP rreg comma
408*fbadb1c4SDavid du Colombier 	{
409*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
410*fbadb1c4SDavid du Colombier 	}
411*fbadb1c4SDavid du Colombier |	LTRAP comma
412*fbadb1c4SDavid du Colombier 	{
413*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
414*fbadb1c4SDavid du Colombier 	}
415*fbadb1c4SDavid du Colombier /*
416*fbadb1c4SDavid du Colombier  * floating point operate
417*fbadb1c4SDavid du Colombier  */
418*fbadb1c4SDavid du Colombier |	LFCONV freg ',' freg
419*fbadb1c4SDavid du Colombier 	{
420*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
421*fbadb1c4SDavid du Colombier 	}
422*fbadb1c4SDavid du Colombier |	LFADD freg ',' freg
423*fbadb1c4SDavid du Colombier 	{
424*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
425*fbadb1c4SDavid du Colombier 	}
426*fbadb1c4SDavid du Colombier |	LFADD freg ',' freg ',' freg
427*fbadb1c4SDavid du Colombier 	{
428*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4.reg, &$6);
429*fbadb1c4SDavid du Colombier 	}
430*fbadb1c4SDavid du Colombier |	LFMA freg ',' freg ',' freg ',' freg
431*fbadb1c4SDavid du Colombier 	{
432*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
433*fbadb1c4SDavid du Colombier 	}
434*fbadb1c4SDavid du Colombier |	LFCMP freg ',' freg
435*fbadb1c4SDavid du Colombier 	{
436*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
437*fbadb1c4SDavid du Colombier 	}
438*fbadb1c4SDavid du Colombier |	LFCMP freg ',' freg ',' creg
439*fbadb1c4SDavid du Colombier 	{
440*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
441*fbadb1c4SDavid du Colombier 	}
442*fbadb1c4SDavid du Colombier /*
443*fbadb1c4SDavid du Colombier  * CMP
444*fbadb1c4SDavid du Colombier  */
445*fbadb1c4SDavid du Colombier |	LCMP rreg ',' rreg
446*fbadb1c4SDavid du Colombier 	{
447*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
448*fbadb1c4SDavid du Colombier 	}
449*fbadb1c4SDavid du Colombier |	LCMP rreg ',' imm
450*fbadb1c4SDavid du Colombier 	{
451*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
452*fbadb1c4SDavid du Colombier 	}
453*fbadb1c4SDavid du Colombier |	LCMP rreg ',' rreg ',' creg
454*fbadb1c4SDavid du Colombier 	{
455*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
456*fbadb1c4SDavid du Colombier 	}
457*fbadb1c4SDavid du Colombier |	LCMP rreg ',' imm ',' creg
458*fbadb1c4SDavid du Colombier 	{
459*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $6.reg, &$4);
460*fbadb1c4SDavid du Colombier 	}
461*fbadb1c4SDavid du Colombier /*
462*fbadb1c4SDavid du Colombier  * rotate and mask
463*fbadb1c4SDavid du Colombier  */
464*fbadb1c4SDavid du Colombier |	LRLWM  imm ',' rreg ',' imm ',' rreg
465*fbadb1c4SDavid du Colombier 	{
466*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
467*fbadb1c4SDavid du Colombier 	}
468*fbadb1c4SDavid du Colombier |	LRLWM  imm ',' rreg ',' mask ',' rreg
469*fbadb1c4SDavid du Colombier 	{
470*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
471*fbadb1c4SDavid du Colombier 	}
472*fbadb1c4SDavid du Colombier |	LRLWM  rreg ',' rreg ',' imm ',' rreg
473*fbadb1c4SDavid du Colombier 	{
474*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
475*fbadb1c4SDavid du Colombier 	}
476*fbadb1c4SDavid du Colombier |	LRLWM  rreg ',' rreg ',' mask ',' rreg
477*fbadb1c4SDavid du Colombier 	{
478*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4.reg, &$6, &$8);
479*fbadb1c4SDavid du Colombier 	}
480*fbadb1c4SDavid du Colombier /*
481*fbadb1c4SDavid du Colombier  * load/store multiple
482*fbadb1c4SDavid du Colombier  */
483*fbadb1c4SDavid du Colombier |	LMOVMW addr ',' rreg
484*fbadb1c4SDavid du Colombier 	{
485*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
486*fbadb1c4SDavid du Colombier 	}
487*fbadb1c4SDavid du Colombier |	LMOVMW rreg ',' addr
488*fbadb1c4SDavid du Colombier 	{
489*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
490*fbadb1c4SDavid du Colombier 	}
491*fbadb1c4SDavid du Colombier /*
492*fbadb1c4SDavid du Colombier  * various indexed load/store
493*fbadb1c4SDavid du Colombier  * indexed unary (eg, cache clear)
494*fbadb1c4SDavid du Colombier  */
495*fbadb1c4SDavid du Colombier |	LXLD regaddr ',' rreg
496*fbadb1c4SDavid du Colombier 	{
497*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
498*fbadb1c4SDavid du Colombier 	}
499*fbadb1c4SDavid du Colombier |	LXLD regaddr ',' imm ',' rreg
500*fbadb1c4SDavid du Colombier 	{
501*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
502*fbadb1c4SDavid du Colombier 	}
503*fbadb1c4SDavid du Colombier |	LXST rreg ',' regaddr
504*fbadb1c4SDavid du Colombier 	{
505*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
506*fbadb1c4SDavid du Colombier 	}
507*fbadb1c4SDavid du Colombier |	LXST rreg ',' imm ',' regaddr
508*fbadb1c4SDavid du Colombier 	{
509*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$4, &$6);
510*fbadb1c4SDavid du Colombier 	}
511*fbadb1c4SDavid du Colombier |	LXMV regaddr ',' rreg
512*fbadb1c4SDavid du Colombier 	{
513*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
514*fbadb1c4SDavid du Colombier 	}
515*fbadb1c4SDavid du Colombier |	LXMV rreg ',' regaddr
516*fbadb1c4SDavid du Colombier 	{
517*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
518*fbadb1c4SDavid du Colombier 	}
519*fbadb1c4SDavid du Colombier |	LXOP regaddr
520*fbadb1c4SDavid du Colombier 	{
521*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
522*fbadb1c4SDavid du Colombier 	}
523*fbadb1c4SDavid du Colombier /*
524*fbadb1c4SDavid du Colombier  * NOP
525*fbadb1c4SDavid du Colombier  */
526*fbadb1c4SDavid du Colombier |	LNOP comma
527*fbadb1c4SDavid du Colombier 	{
528*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
529*fbadb1c4SDavid du Colombier 	}
530*fbadb1c4SDavid du Colombier |	LNOP rreg comma
531*fbadb1c4SDavid du Colombier 	{
532*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
533*fbadb1c4SDavid du Colombier 	}
534*fbadb1c4SDavid du Colombier |	LNOP freg comma
535*fbadb1c4SDavid du Colombier 	{
536*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
537*fbadb1c4SDavid du Colombier 	}
538*fbadb1c4SDavid du Colombier |	LNOP ',' rreg
539*fbadb1c4SDavid du Colombier 	{
540*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
541*fbadb1c4SDavid du Colombier 	}
542*fbadb1c4SDavid du Colombier |	LNOP ',' freg
543*fbadb1c4SDavid du Colombier 	{
544*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &$3);
545*fbadb1c4SDavid du Colombier 	}
546*fbadb1c4SDavid du Colombier /*
547*fbadb1c4SDavid du Colombier  * word
548*fbadb1c4SDavid du Colombier  */
549*fbadb1c4SDavid du Colombier |	LWORD imm comma
550*fbadb1c4SDavid du Colombier 	{
551*fbadb1c4SDavid du Colombier 		if($1 == ADWORD && $2.type == D_CONST)
552*fbadb1c4SDavid du Colombier 			$2.type = D_DCONST;
553*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
554*fbadb1c4SDavid du Colombier 	}
555*fbadb1c4SDavid du Colombier |	LWORD ximm comma
556*fbadb1c4SDavid du Colombier 	{
557*fbadb1c4SDavid du Colombier 		if($1 == ADWORD && $2.type == D_CONST)
558*fbadb1c4SDavid du Colombier 			$2.type = D_DCONST;
559*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &nullgen);
560*fbadb1c4SDavid du Colombier 	}
561*fbadb1c4SDavid du Colombier /*
562*fbadb1c4SDavid du Colombier  * END
563*fbadb1c4SDavid du Colombier  */
564*fbadb1c4SDavid du Colombier |	LEND comma
565*fbadb1c4SDavid du Colombier 	{
566*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
567*fbadb1c4SDavid du Colombier 	}
568*fbadb1c4SDavid du Colombier /*
569*fbadb1c4SDavid du Colombier  * TEXT/GLOBL
570*fbadb1c4SDavid du Colombier  */
571*fbadb1c4SDavid du Colombier |	LTEXT name ',' imm
572*fbadb1c4SDavid du Colombier 	{
573*fbadb1c4SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
574*fbadb1c4SDavid du Colombier 	}
575*fbadb1c4SDavid du Colombier |	LTEXT name ',' con ',' imm
576*fbadb1c4SDavid du Colombier 	{
577*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
578*fbadb1c4SDavid du Colombier 	}
579*fbadb1c4SDavid du Colombier |	LTEXT name ',' imm ':' imm
580*fbadb1c4SDavid du Colombier 	{
581*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, NREG, &$6, &$4);
582*fbadb1c4SDavid du Colombier 	}
583*fbadb1c4SDavid du Colombier |	LTEXT name ',' con ',' imm ':' imm
584*fbadb1c4SDavid du Colombier 	{
585*fbadb1c4SDavid du Colombier 		outgcode($1, &$2, $4, &$8, &$6);
586*fbadb1c4SDavid du Colombier 	}
587*fbadb1c4SDavid du Colombier /*
588*fbadb1c4SDavid du Colombier  * DATA
589*fbadb1c4SDavid du Colombier  */
590*fbadb1c4SDavid du Colombier |	LDATA name '/' con ',' imm
591*fbadb1c4SDavid du Colombier 	{
592*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
593*fbadb1c4SDavid du Colombier 	}
594*fbadb1c4SDavid du Colombier |	LDATA name '/' con ',' ximm
595*fbadb1c4SDavid du Colombier 	{
596*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
597*fbadb1c4SDavid du Colombier 	}
598*fbadb1c4SDavid du Colombier |	LDATA name '/' con ',' fimm
599*fbadb1c4SDavid du Colombier 	{
600*fbadb1c4SDavid du Colombier 		outcode($1, &$2, $4, &$6);
601*fbadb1c4SDavid du Colombier 	}
602*fbadb1c4SDavid du Colombier /*
603*fbadb1c4SDavid du Colombier  * RETURN
604*fbadb1c4SDavid du Colombier  */
605*fbadb1c4SDavid du Colombier |	LRETRN	comma
606*fbadb1c4SDavid du Colombier 	{
607*fbadb1c4SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
608*fbadb1c4SDavid du Colombier 	}
609*fbadb1c4SDavid du Colombier 
610*fbadb1c4SDavid du Colombier rel:
611*fbadb1c4SDavid du Colombier 	con '(' LPC ')'
612*fbadb1c4SDavid du Colombier 	{
613*fbadb1c4SDavid du Colombier 		$$ = nullgen;
614*fbadb1c4SDavid du Colombier 		$$.type = D_BRANCH;
615*fbadb1c4SDavid du Colombier 		$$.offset = $1 + pc;
616*fbadb1c4SDavid du Colombier 	}
617*fbadb1c4SDavid du Colombier |	LNAME offset
618*fbadb1c4SDavid du Colombier 	{
619*fbadb1c4SDavid du Colombier 		$$ = nullgen;
620*fbadb1c4SDavid du Colombier 		if(pass == 2)
621*fbadb1c4SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
622*fbadb1c4SDavid du Colombier 		$$.type = D_BRANCH;
623*fbadb1c4SDavid du Colombier 		$$.sym = $1;
624*fbadb1c4SDavid du Colombier 		$$.offset = $2;
625*fbadb1c4SDavid du Colombier 	}
626*fbadb1c4SDavid du Colombier |	LLAB offset
627*fbadb1c4SDavid du Colombier 	{
628*fbadb1c4SDavid du Colombier 		$$ = nullgen;
629*fbadb1c4SDavid du Colombier 		$$.type = D_BRANCH;
630*fbadb1c4SDavid du Colombier 		$$.sym = $1;
631*fbadb1c4SDavid du Colombier 		$$.offset = $1->value + $2;
632*fbadb1c4SDavid du Colombier 	}
633*fbadb1c4SDavid du Colombier 
634*fbadb1c4SDavid du Colombier rreg:
635*fbadb1c4SDavid du Colombier 	sreg
636*fbadb1c4SDavid du Colombier 	{
637*fbadb1c4SDavid du Colombier 		$$ = nullgen;
638*fbadb1c4SDavid du Colombier 		$$.type = D_REG;
639*fbadb1c4SDavid du Colombier 		$$.reg = $1;
640*fbadb1c4SDavid du Colombier 	}
641*fbadb1c4SDavid du Colombier 
642*fbadb1c4SDavid du Colombier xlreg:
643*fbadb1c4SDavid du Colombier 	lr
644*fbadb1c4SDavid du Colombier |	ctr
645*fbadb1c4SDavid du Colombier 
646*fbadb1c4SDavid du Colombier lr:
647*fbadb1c4SDavid du Colombier 	LLR
648*fbadb1c4SDavid du Colombier 	{
649*fbadb1c4SDavid du Colombier 		$$ = nullgen;
650*fbadb1c4SDavid du Colombier 		$$.type = D_SPR;
651*fbadb1c4SDavid du Colombier 		$$.offset = $1;
652*fbadb1c4SDavid du Colombier 	}
653*fbadb1c4SDavid du Colombier 
654*fbadb1c4SDavid du Colombier lcr:
655*fbadb1c4SDavid du Colombier 	LCR
656*fbadb1c4SDavid du Colombier 	{
657*fbadb1c4SDavid du Colombier 		$$ = nullgen;
658*fbadb1c4SDavid du Colombier 		$$.type = D_CREG;
659*fbadb1c4SDavid du Colombier 		$$.reg = NREG;	/* whole register */
660*fbadb1c4SDavid du Colombier 	}
661*fbadb1c4SDavid du Colombier 
662*fbadb1c4SDavid du Colombier ctr:
663*fbadb1c4SDavid du Colombier 	LCTR
664*fbadb1c4SDavid du Colombier 	{
665*fbadb1c4SDavid du Colombier 		$$ = nullgen;
666*fbadb1c4SDavid du Colombier 		$$.type = D_SPR;
667*fbadb1c4SDavid du Colombier 		$$.offset = $1;
668*fbadb1c4SDavid du Colombier 	}
669*fbadb1c4SDavid du Colombier 
670*fbadb1c4SDavid du Colombier msr:
671*fbadb1c4SDavid du Colombier 	LMSR
672*fbadb1c4SDavid du Colombier 	{
673*fbadb1c4SDavid du Colombier 		$$ = nullgen;
674*fbadb1c4SDavid du Colombier 		$$.type = D_MSR;
675*fbadb1c4SDavid du Colombier 	}
676*fbadb1c4SDavid du Colombier 
677*fbadb1c4SDavid du Colombier psr:
678*fbadb1c4SDavid du Colombier 	LSPREG
679*fbadb1c4SDavid du Colombier 	{
680*fbadb1c4SDavid du Colombier 		$$ = nullgen;
681*fbadb1c4SDavid du Colombier 		$$.type = D_SPR;
682*fbadb1c4SDavid du Colombier 		$$.offset = $1;
683*fbadb1c4SDavid du Colombier 	}
684*fbadb1c4SDavid du Colombier |	LSPR '(' con ')'
685*fbadb1c4SDavid du Colombier 	{
686*fbadb1c4SDavid du Colombier 		$$ = nullgen;
687*fbadb1c4SDavid du Colombier 		$$.type = $1;
688*fbadb1c4SDavid du Colombier 		$$.offset = $3;
689*fbadb1c4SDavid du Colombier 	}
690*fbadb1c4SDavid du Colombier |	msr
691*fbadb1c4SDavid du Colombier 
692*fbadb1c4SDavid du Colombier fpscr:
693*fbadb1c4SDavid du Colombier 	LFPSCR
694*fbadb1c4SDavid du Colombier 	{
695*fbadb1c4SDavid du Colombier 		$$ = nullgen;
696*fbadb1c4SDavid du Colombier 		$$.type = D_FPSCR;
697*fbadb1c4SDavid du Colombier 		$$.reg = NREG;
698*fbadb1c4SDavid du Colombier 	}
699*fbadb1c4SDavid du Colombier 
700*fbadb1c4SDavid du Colombier fpscrf:
701*fbadb1c4SDavid du Colombier 	LFPSCR '(' con ')'
702*fbadb1c4SDavid du Colombier 	{
703*fbadb1c4SDavid du Colombier 		$$ = nullgen;
704*fbadb1c4SDavid du Colombier 		$$.type = D_FPSCR;
705*fbadb1c4SDavid du Colombier 		$$.reg = $3;
706*fbadb1c4SDavid du Colombier 	}
707*fbadb1c4SDavid du Colombier 
708*fbadb1c4SDavid du Colombier freg:
709*fbadb1c4SDavid du Colombier 	LFREG
710*fbadb1c4SDavid du Colombier 	{
711*fbadb1c4SDavid du Colombier 		$$ = nullgen;
712*fbadb1c4SDavid du Colombier 		$$.type = D_FREG;
713*fbadb1c4SDavid du Colombier 		$$.reg = $1;
714*fbadb1c4SDavid du Colombier 	}
715*fbadb1c4SDavid du Colombier |	LF '(' con ')'
716*fbadb1c4SDavid du Colombier 	{
717*fbadb1c4SDavid du Colombier 		$$ = nullgen;
718*fbadb1c4SDavid du Colombier 		$$.type = D_FREG;
719*fbadb1c4SDavid du Colombier 		$$.reg = $3;
720*fbadb1c4SDavid du Colombier 	}
721*fbadb1c4SDavid du Colombier 
722*fbadb1c4SDavid du Colombier creg:
723*fbadb1c4SDavid du Colombier 	LCREG
724*fbadb1c4SDavid du Colombier 	{
725*fbadb1c4SDavid du Colombier 		$$ = nullgen;
726*fbadb1c4SDavid du Colombier 		$$.type = D_CREG;
727*fbadb1c4SDavid du Colombier 		$$.reg = $1;
728*fbadb1c4SDavid du Colombier 	}
729*fbadb1c4SDavid du Colombier |	LCR '(' con ')'
730*fbadb1c4SDavid du Colombier 	{
731*fbadb1c4SDavid du Colombier 		$$ = nullgen;
732*fbadb1c4SDavid du Colombier 		$$.type = D_CREG;
733*fbadb1c4SDavid du Colombier 		$$.reg = $3;
734*fbadb1c4SDavid du Colombier 	}
735*fbadb1c4SDavid du Colombier 
736*fbadb1c4SDavid du Colombier 
737*fbadb1c4SDavid du Colombier cbit:	con
738*fbadb1c4SDavid du Colombier 	{
739*fbadb1c4SDavid du Colombier 		$$ = nullgen;
740*fbadb1c4SDavid du Colombier 		$$.type = D_REG;
741*fbadb1c4SDavid du Colombier 		$$.reg = $1;
742*fbadb1c4SDavid du Colombier 	}
743*fbadb1c4SDavid du Colombier 
744*fbadb1c4SDavid du Colombier mask:
745*fbadb1c4SDavid du Colombier 	con ',' con
746*fbadb1c4SDavid du Colombier 	{
747*fbadb1c4SDavid du Colombier 		int mb, me;
748*fbadb1c4SDavid du Colombier 		ulong v;
749*fbadb1c4SDavid du Colombier 
750*fbadb1c4SDavid du Colombier 		$$ = nullgen;
751*fbadb1c4SDavid du Colombier 		$$.type = D_CONST;
752*fbadb1c4SDavid du Colombier 		mb = $1;
753*fbadb1c4SDavid du Colombier 		me = $3;
754*fbadb1c4SDavid du Colombier 		if(mb < 0 || mb > 31 || me < 0 || me > 31){
755*fbadb1c4SDavid du Colombier 			yyerror("illegal mask start/end value(s)");
756*fbadb1c4SDavid du Colombier 			mb = me = 0;
757*fbadb1c4SDavid du Colombier 		}
758*fbadb1c4SDavid du Colombier 		if(mb <= me)
759*fbadb1c4SDavid du Colombier 			v = ((ulong)~0L>>mb) & (~0L<<(31-me));
760*fbadb1c4SDavid du Colombier 		else
761*fbadb1c4SDavid du Colombier 			v = ~(((ulong)~0L>>(me+1)) & (~0L<<(31-(mb-1))));
762*fbadb1c4SDavid du Colombier 		$$.offset = v;
763*fbadb1c4SDavid du Colombier 	}
764*fbadb1c4SDavid du Colombier 
765*fbadb1c4SDavid du Colombier ximm:
766*fbadb1c4SDavid du Colombier 	'$' addr
767*fbadb1c4SDavid du Colombier 	{
768*fbadb1c4SDavid du Colombier 		$$ = $2;
769*fbadb1c4SDavid du Colombier 		$$.type = D_CONST;
770*fbadb1c4SDavid du Colombier 	}
771*fbadb1c4SDavid du Colombier |	'$' LSCONST
772*fbadb1c4SDavid du Colombier 	{
773*fbadb1c4SDavid du Colombier 		$$ = nullgen;
774*fbadb1c4SDavid du Colombier 		$$.type = D_SCONST;
775*fbadb1c4SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
776*fbadb1c4SDavid du Colombier 	}
777*fbadb1c4SDavid du Colombier 
778*fbadb1c4SDavid du Colombier fimm:
779*fbadb1c4SDavid du Colombier 	'$' LFCONST
780*fbadb1c4SDavid du Colombier 	{
781*fbadb1c4SDavid du Colombier 		$$ = nullgen;
782*fbadb1c4SDavid du Colombier 		$$.type = D_FCONST;
783*fbadb1c4SDavid du Colombier 		$$.dval = $2;
784*fbadb1c4SDavid du Colombier 	}
785*fbadb1c4SDavid du Colombier |	'$' '-' LFCONST
786*fbadb1c4SDavid du Colombier 	{
787*fbadb1c4SDavid du Colombier 		$$ = nullgen;
788*fbadb1c4SDavid du Colombier 		$$.type = D_FCONST;
789*fbadb1c4SDavid du Colombier 		$$.dval = -$3;
790*fbadb1c4SDavid du Colombier 	}
791*fbadb1c4SDavid du Colombier 
792*fbadb1c4SDavid du Colombier imm:	'$' con
793*fbadb1c4SDavid du Colombier 	{
794*fbadb1c4SDavid du Colombier 		$$ = nullgen;
795*fbadb1c4SDavid du Colombier 		$$.type = D_CONST;
796*fbadb1c4SDavid du Colombier 		$$.offset = $2;
797*fbadb1c4SDavid du Colombier 	}
798*fbadb1c4SDavid du Colombier 
799*fbadb1c4SDavid du Colombier sreg:
800*fbadb1c4SDavid du Colombier 	LREG
801*fbadb1c4SDavid du Colombier |	LR '(' con ')'
802*fbadb1c4SDavid du Colombier 	{
803*fbadb1c4SDavid du Colombier 		if($$ < 0 || $$ >= NREG)
804*fbadb1c4SDavid du Colombier 			print("register value out of range\n");
805*fbadb1c4SDavid du Colombier 		$$ = $3;
806*fbadb1c4SDavid du Colombier 	}
807*fbadb1c4SDavid du Colombier 
808*fbadb1c4SDavid du Colombier regaddr:
809*fbadb1c4SDavid du Colombier 	'(' sreg ')'
810*fbadb1c4SDavid du Colombier 	{
811*fbadb1c4SDavid du Colombier 		$$ = nullgen;
812*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
813*fbadb1c4SDavid du Colombier 		$$.reg = $2;
814*fbadb1c4SDavid du Colombier 		$$.offset = 0;
815*fbadb1c4SDavid du Colombier 	}
816*fbadb1c4SDavid du Colombier |	'(' sreg '+' sreg ')'
817*fbadb1c4SDavid du Colombier 	{
818*fbadb1c4SDavid du Colombier 		$$ = nullgen;
819*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
820*fbadb1c4SDavid du Colombier 		$$.reg = $2;
821*fbadb1c4SDavid du Colombier 		$$.xreg = $4;
822*fbadb1c4SDavid du Colombier 		$$.offset = 0;
823*fbadb1c4SDavid du Colombier 	}
824*fbadb1c4SDavid du Colombier 
825*fbadb1c4SDavid du Colombier addr:
826*fbadb1c4SDavid du Colombier 	name
827*fbadb1c4SDavid du Colombier |	con '(' sreg ')'
828*fbadb1c4SDavid du Colombier 	{
829*fbadb1c4SDavid du Colombier 		$$ = nullgen;
830*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
831*fbadb1c4SDavid du Colombier 		$$.reg = $3;
832*fbadb1c4SDavid du Colombier 		$$.offset = $1;
833*fbadb1c4SDavid du Colombier 	}
834*fbadb1c4SDavid du Colombier 
835*fbadb1c4SDavid du Colombier name:
836*fbadb1c4SDavid du Colombier 	con '(' pointer ')'
837*fbadb1c4SDavid du Colombier 	{
838*fbadb1c4SDavid du Colombier 		$$ = nullgen;
839*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
840*fbadb1c4SDavid du Colombier 		$$.name = $3;
841*fbadb1c4SDavid du Colombier 		$$.sym = S;
842*fbadb1c4SDavid du Colombier 		$$.offset = $1;
843*fbadb1c4SDavid du Colombier 	}
844*fbadb1c4SDavid du Colombier |	LNAME offset '(' pointer ')'
845*fbadb1c4SDavid du Colombier 	{
846*fbadb1c4SDavid du Colombier 		$$ = nullgen;
847*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
848*fbadb1c4SDavid du Colombier 		$$.name = $4;
849*fbadb1c4SDavid du Colombier 		$$.sym = $1;
850*fbadb1c4SDavid du Colombier 		$$.offset = $2;
851*fbadb1c4SDavid du Colombier 	}
852*fbadb1c4SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
853*fbadb1c4SDavid du Colombier 	{
854*fbadb1c4SDavid du Colombier 		$$ = nullgen;
855*fbadb1c4SDavid du Colombier 		$$.type = D_OREG;
856*fbadb1c4SDavid du Colombier 		$$.name = D_STATIC;
857*fbadb1c4SDavid du Colombier 		$$.sym = $1;
858*fbadb1c4SDavid du Colombier 		$$.offset = $4;
859*fbadb1c4SDavid du Colombier 	}
860*fbadb1c4SDavid du Colombier 
861*fbadb1c4SDavid du Colombier comma:
862*fbadb1c4SDavid du Colombier |	','
863*fbadb1c4SDavid du Colombier 
864*fbadb1c4SDavid du Colombier offset:
865*fbadb1c4SDavid du Colombier 	{
866*fbadb1c4SDavid du Colombier 		$$ = 0;
867*fbadb1c4SDavid du Colombier 	}
868*fbadb1c4SDavid du Colombier |	'+' con
869*fbadb1c4SDavid du Colombier 	{
870*fbadb1c4SDavid du Colombier 		$$ = $2;
871*fbadb1c4SDavid du Colombier 	}
872*fbadb1c4SDavid du Colombier |	'-' con
873*fbadb1c4SDavid du Colombier 	{
874*fbadb1c4SDavid du Colombier 		$$ = -$2;
875*fbadb1c4SDavid du Colombier 	}
876*fbadb1c4SDavid du Colombier 
877*fbadb1c4SDavid du Colombier pointer:
878*fbadb1c4SDavid du Colombier 	LSB
879*fbadb1c4SDavid du Colombier |	LSP
880*fbadb1c4SDavid du Colombier |	LFP
881*fbadb1c4SDavid du Colombier 
882*fbadb1c4SDavid du Colombier con:
883*fbadb1c4SDavid du Colombier 	LCONST
884*fbadb1c4SDavid du Colombier |	LVAR
885*fbadb1c4SDavid du Colombier 	{
886*fbadb1c4SDavid du Colombier 		$$ = $1->value;
887*fbadb1c4SDavid du Colombier 	}
888*fbadb1c4SDavid du Colombier |	'-' con
889*fbadb1c4SDavid du Colombier 	{
890*fbadb1c4SDavid du Colombier 		$$ = -$2;
891*fbadb1c4SDavid du Colombier 	}
892*fbadb1c4SDavid du Colombier |	'+' con
893*fbadb1c4SDavid du Colombier 	{
894*fbadb1c4SDavid du Colombier 		$$ = $2;
895*fbadb1c4SDavid du Colombier 	}
896*fbadb1c4SDavid du Colombier |	'~' con
897*fbadb1c4SDavid du Colombier 	{
898*fbadb1c4SDavid du Colombier 		$$ = ~$2;
899*fbadb1c4SDavid du Colombier 	}
900*fbadb1c4SDavid du Colombier |	'(' expr ')'
901*fbadb1c4SDavid du Colombier 	{
902*fbadb1c4SDavid du Colombier 		$$ = $2;
903*fbadb1c4SDavid du Colombier 	}
904*fbadb1c4SDavid du Colombier 
905*fbadb1c4SDavid du Colombier expr:
906*fbadb1c4SDavid du Colombier 	con
907*fbadb1c4SDavid du Colombier |	expr '+' expr
908*fbadb1c4SDavid du Colombier 	{
909*fbadb1c4SDavid du Colombier 		$$ = $1 + $3;
910*fbadb1c4SDavid du Colombier 	}
911*fbadb1c4SDavid du Colombier |	expr '-' expr
912*fbadb1c4SDavid du Colombier 	{
913*fbadb1c4SDavid du Colombier 		$$ = $1 - $3;
914*fbadb1c4SDavid du Colombier 	}
915*fbadb1c4SDavid du Colombier |	expr '*' expr
916*fbadb1c4SDavid du Colombier 	{
917*fbadb1c4SDavid du Colombier 		$$ = $1 * $3;
918*fbadb1c4SDavid du Colombier 	}
919*fbadb1c4SDavid du Colombier |	expr '/' expr
920*fbadb1c4SDavid du Colombier 	{
921*fbadb1c4SDavid du Colombier 		$$ = $1 / $3;
922*fbadb1c4SDavid du Colombier 	}
923*fbadb1c4SDavid du Colombier |	expr '%' expr
924*fbadb1c4SDavid du Colombier 	{
925*fbadb1c4SDavid du Colombier 		$$ = $1 % $3;
926*fbadb1c4SDavid du Colombier 	}
927*fbadb1c4SDavid du Colombier |	expr '<' '<' expr
928*fbadb1c4SDavid du Colombier 	{
929*fbadb1c4SDavid du Colombier 		$$ = $1 << $4;
930*fbadb1c4SDavid du Colombier 	}
931*fbadb1c4SDavid du Colombier |	expr '>' '>' expr
932*fbadb1c4SDavid du Colombier 	{
933*fbadb1c4SDavid du Colombier 		$$ = $1 >> $4;
934*fbadb1c4SDavid du Colombier 	}
935*fbadb1c4SDavid du Colombier |	expr '&' expr
936*fbadb1c4SDavid du Colombier 	{
937*fbadb1c4SDavid du Colombier 		$$ = $1 & $3;
938*fbadb1c4SDavid du Colombier 	}
939*fbadb1c4SDavid du Colombier |	expr '^' expr
940*fbadb1c4SDavid du Colombier 	{
941*fbadb1c4SDavid du Colombier 		$$ = $1 ^ $3;
942*fbadb1c4SDavid du Colombier 	}
943*fbadb1c4SDavid du Colombier |	expr '|' expr
944*fbadb1c4SDavid du Colombier 	{
945*fbadb1c4SDavid du Colombier 		$$ = $1 | $3;
946*fbadb1c4SDavid du Colombier 	}
947