xref: /plan9-contrib/sys/src/cmd/ia/a.y (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier %{
2*ce95e1b3SDavid du Colombier #include "a.h"
3*ce95e1b3SDavid du Colombier %}
4*ce95e1b3SDavid du Colombier %union
5*ce95e1b3SDavid du Colombier {
6*ce95e1b3SDavid du Colombier 	Sym	*sym;
7*ce95e1b3SDavid du Colombier 	vlong	lval;
8*ce95e1b3SDavid du Colombier 	double	dval;
9*ce95e1b3SDavid du Colombier 	char	sval[8];
10*ce95e1b3SDavid du Colombier 	Gen	gen;
11*ce95e1b3SDavid du Colombier }
12*ce95e1b3SDavid du Colombier %left	'|'
13*ce95e1b3SDavid du Colombier %left	'^'
14*ce95e1b3SDavid du Colombier %left	'&'
15*ce95e1b3SDavid du Colombier %left	'<' '>'
16*ce95e1b3SDavid du Colombier %left	'+' '-'
17*ce95e1b3SDavid du Colombier %left	'*' '/' '%'
18*ce95e1b3SDavid du Colombier %token	<lval>	LADD LMUL LBEQ LBR LBRET LCALL LFLT2 LFLT3
19*ce95e1b3SDavid du Colombier %token	<lval>	LMOVB LMOVBU LMOVW LMOVF LLUI LSYS LSYS0 LCSR LSWAP LAMO
20*ce95e1b3SDavid du Colombier %token	<lval>	LCONST LSP LSB LFP LPC LREG LFREG LR FR LCTL
21*ce95e1b3SDavid du Colombier %token	<lval>	LDATA LTEXT LWORD
22*ce95e1b3SDavid du Colombier %token	<sval>	LSCONST
23*ce95e1b3SDavid du Colombier %token	<dval>	LFCONST
24*ce95e1b3SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
25*ce95e1b3SDavid du Colombier %type	<lval>	con expr pointer offset sreg freg oprrr
26*ce95e1b3SDavid du Colombier %type	<gen>	rreg dreg ctlreg drreg
27*ce95e1b3SDavid du Colombier %type	<gen>	addr name oreg rel imm ximm fimm
28*ce95e1b3SDavid du Colombier %%
29*ce95e1b3SDavid du Colombier prog:
30*ce95e1b3SDavid du Colombier |	prog line
31*ce95e1b3SDavid du Colombier 
32*ce95e1b3SDavid du Colombier line:
33*ce95e1b3SDavid du Colombier 	LLAB ':'
34*ce95e1b3SDavid du Colombier 	{
35*ce95e1b3SDavid du Colombier 		if($1->value != pc)
36*ce95e1b3SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
37*ce95e1b3SDavid du Colombier 		$1->value = pc;
38*ce95e1b3SDavid du Colombier 	}
39*ce95e1b3SDavid du Colombier 	line
40*ce95e1b3SDavid du Colombier |	LNAME ':'
41*ce95e1b3SDavid du Colombier 	{
42*ce95e1b3SDavid du Colombier 		$1->type = LLAB;
43*ce95e1b3SDavid du Colombier 		$1->value = pc;
44*ce95e1b3SDavid du Colombier 	}
45*ce95e1b3SDavid du Colombier 	line
46*ce95e1b3SDavid du Colombier |	LNAME '=' expr ';'
47*ce95e1b3SDavid du Colombier 	{
48*ce95e1b3SDavid du Colombier 		$1->type = LVAR;
49*ce95e1b3SDavid du Colombier 		$1->value = $3;
50*ce95e1b3SDavid du Colombier 	}
51*ce95e1b3SDavid du Colombier |	LVAR '=' expr ';'
52*ce95e1b3SDavid du Colombier 	{
53*ce95e1b3SDavid du Colombier 		if($1->value != $3)
54*ce95e1b3SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
55*ce95e1b3SDavid du Colombier 		$1->value = $3;
56*ce95e1b3SDavid du Colombier 	}
57*ce95e1b3SDavid du Colombier |	';'
58*ce95e1b3SDavid du Colombier |	inst ';'
59*ce95e1b3SDavid du Colombier |	error ';'
60*ce95e1b3SDavid du Colombier 
61*ce95e1b3SDavid du Colombier inst:
62*ce95e1b3SDavid du Colombier 	LADD imm ',' rreg
63*ce95e1b3SDavid du Colombier 	{
64*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
65*ce95e1b3SDavid du Colombier 	}
66*ce95e1b3SDavid du Colombier |	oprrr rreg ',' rreg
67*ce95e1b3SDavid du Colombier 	{
68*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
69*ce95e1b3SDavid du Colombier 	}
70*ce95e1b3SDavid du Colombier |	LADD imm ',' sreg ',' rreg
71*ce95e1b3SDavid du Colombier 	{
72*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
73*ce95e1b3SDavid du Colombier 	}
74*ce95e1b3SDavid du Colombier |	oprrr rreg ',' sreg ',' rreg
75*ce95e1b3SDavid du Colombier 	{
76*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
77*ce95e1b3SDavid du Colombier 	}
78*ce95e1b3SDavid du Colombier 
79*ce95e1b3SDavid du Colombier |	LFLT2 drreg ',' drreg
80*ce95e1b3SDavid du Colombier 	{
81*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
82*ce95e1b3SDavid du Colombier 	}
83*ce95e1b3SDavid du Colombier |	LFLT3 drreg ',' freg ',' drreg
84*ce95e1b3SDavid du Colombier 	{
85*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
86*ce95e1b3SDavid du Colombier 	}
87*ce95e1b3SDavid du Colombier 
88*ce95e1b3SDavid du Colombier |	LBEQ rreg ',' sreg ',' rel
89*ce95e1b3SDavid du Colombier 	{
90*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
91*ce95e1b3SDavid du Colombier 	}
92*ce95e1b3SDavid du Colombier 
93*ce95e1b3SDavid du Colombier |	LBEQ rreg ',' rel
94*ce95e1b3SDavid du Colombier 	{
95*ce95e1b3SDavid du Colombier 		Gen regzero;
96*ce95e1b3SDavid du Colombier 		regzero = nullgen;
97*ce95e1b3SDavid du Colombier 		regzero.type = D_REG;
98*ce95e1b3SDavid du Colombier 		regzero.reg = 0;
99*ce95e1b3SDavid du Colombier 		outcode($1, &regzero, $2.reg, &$4);
100*ce95e1b3SDavid du Colombier 	}
101*ce95e1b3SDavid du Colombier 
102*ce95e1b3SDavid du Colombier |	LBR	rel
103*ce95e1b3SDavid du Colombier 	{
104*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
105*ce95e1b3SDavid du Colombier 	}
106*ce95e1b3SDavid du Colombier 
107*ce95e1b3SDavid du Colombier |	LBR oreg
108*ce95e1b3SDavid du Colombier 	{
109*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
110*ce95e1b3SDavid du Colombier 	}
111*ce95e1b3SDavid du Colombier 
112*ce95e1b3SDavid du Colombier 
113*ce95e1b3SDavid du Colombier |	LBRET
114*ce95e1b3SDavid du Colombier 	{
115*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, NREG, &nullgen);
116*ce95e1b3SDavid du Colombier 	}
117*ce95e1b3SDavid du Colombier 
118*ce95e1b3SDavid du Colombier |	LCALL sreg ',' addr
119*ce95e1b3SDavid du Colombier 	{
120*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
121*ce95e1b3SDavid du Colombier 	}
122*ce95e1b3SDavid du Colombier |	LCALL sreg ',' rel
123*ce95e1b3SDavid du Colombier 	{
124*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, $2, &$4);
125*ce95e1b3SDavid du Colombier 	}
126*ce95e1b3SDavid du Colombier 
127*ce95e1b3SDavid du Colombier |	LMOVB addr ',' rreg
128*ce95e1b3SDavid du Colombier 	{
129*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
130*ce95e1b3SDavid du Colombier 	}
131*ce95e1b3SDavid du Colombier |	LMOVBU addr ',' rreg
132*ce95e1b3SDavid du Colombier 	{
133*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
134*ce95e1b3SDavid du Colombier 	}
135*ce95e1b3SDavid du Colombier |	LMOVB rreg ',' addr
136*ce95e1b3SDavid du Colombier 	{
137*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
138*ce95e1b3SDavid du Colombier 	}
139*ce95e1b3SDavid du Colombier 
140*ce95e1b3SDavid du Colombier |	LMOVF addr ',' dreg
141*ce95e1b3SDavid du Colombier 	{
142*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
143*ce95e1b3SDavid du Colombier 	}
144*ce95e1b3SDavid du Colombier |	LMOVF dreg ',' addr
145*ce95e1b3SDavid du Colombier 	{
146*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
147*ce95e1b3SDavid du Colombier 	}
148*ce95e1b3SDavid du Colombier |	LMOVF dreg ',' dreg
149*ce95e1b3SDavid du Colombier 	{
150*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
151*ce95e1b3SDavid du Colombier 	}
152*ce95e1b3SDavid du Colombier 
153*ce95e1b3SDavid du Colombier 
154*ce95e1b3SDavid du Colombier |	LMOVW imm ',' rreg
155*ce95e1b3SDavid du Colombier 	{
156*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
157*ce95e1b3SDavid du Colombier 	}
158*ce95e1b3SDavid du Colombier |	LMOVW ximm ',' rreg
159*ce95e1b3SDavid du Colombier 	{
160*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
161*ce95e1b3SDavid du Colombier 	}
162*ce95e1b3SDavid du Colombier |	LMOVW rreg ',' rreg
163*ce95e1b3SDavid du Colombier 	{
164*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
165*ce95e1b3SDavid du Colombier 	}
166*ce95e1b3SDavid du Colombier |	LMOVW addr ',' rreg
167*ce95e1b3SDavid du Colombier 	{
168*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
169*ce95e1b3SDavid du Colombier 	}
170*ce95e1b3SDavid du Colombier |	LMOVW rreg ',' addr
171*ce95e1b3SDavid du Colombier 	{
172*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
173*ce95e1b3SDavid du Colombier 	}
174*ce95e1b3SDavid du Colombier |	LMOVW rreg ',' ctlreg
175*ce95e1b3SDavid du Colombier 	{
176*ce95e1b3SDavid du Colombier 		Gen regzero;
177*ce95e1b3SDavid du Colombier 		regzero = nullgen;
178*ce95e1b3SDavid du Colombier 		regzero.type = D_REG;
179*ce95e1b3SDavid du Colombier 		regzero.reg = 0;
180*ce95e1b3SDavid du Colombier 		outcode(ACSRRW, &$4, $2.reg, &regzero);
181*ce95e1b3SDavid du Colombier 	}
182*ce95e1b3SDavid du Colombier |	LMOVW imm ',' ctlreg
183*ce95e1b3SDavid du Colombier 	{
184*ce95e1b3SDavid du Colombier 		Gen regzero;
185*ce95e1b3SDavid du Colombier 		int r = $2.offset;
186*ce95e1b3SDavid du Colombier 		if(r < 0 || r >= NREG)
187*ce95e1b3SDavid du Colombier 			yyerror("immediate value out of range");
188*ce95e1b3SDavid du Colombier 		regzero = nullgen;
189*ce95e1b3SDavid du Colombier 		regzero.type = D_REG;
190*ce95e1b3SDavid du Colombier 		regzero.reg = 0;
191*ce95e1b3SDavid du Colombier 		outcode(ACSRRWI, &$4, r, &regzero);
192*ce95e1b3SDavid du Colombier 	}
193*ce95e1b3SDavid du Colombier |	LMOVW ctlreg ',' rreg
194*ce95e1b3SDavid du Colombier 	{
195*ce95e1b3SDavid du Colombier 		outcode(ACSRRS, &$2, REGZERO, &$4);
196*ce95e1b3SDavid du Colombier 	}
197*ce95e1b3SDavid du Colombier 
198*ce95e1b3SDavid du Colombier |	LLUI name ',' rreg
199*ce95e1b3SDavid du Colombier 	{
200*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
201*ce95e1b3SDavid du Colombier 	}
202*ce95e1b3SDavid du Colombier |	LLUI imm ',' rreg
203*ce95e1b3SDavid du Colombier 	{
204*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
205*ce95e1b3SDavid du Colombier 	}
206*ce95e1b3SDavid du Colombier 
207*ce95e1b3SDavid du Colombier 
208*ce95e1b3SDavid du Colombier |	LSYS imm
209*ce95e1b3SDavid du Colombier 	{
210*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
211*ce95e1b3SDavid du Colombier 	}
212*ce95e1b3SDavid du Colombier 
213*ce95e1b3SDavid du Colombier |	LSYS0
214*ce95e1b3SDavid du Colombier 	{
215*ce95e1b3SDavid du Colombier 		Gen syscon;
216*ce95e1b3SDavid du Colombier 		syscon = nullgen;
217*ce95e1b3SDavid du Colombier 		syscon.type = D_CONST;
218*ce95e1b3SDavid du Colombier 		syscon.offset = $1;
219*ce95e1b3SDavid du Colombier 		outcode(ASYS, &nullgen, NREG, &syscon);
220*ce95e1b3SDavid du Colombier 	}
221*ce95e1b3SDavid du Colombier 
222*ce95e1b3SDavid du Colombier |	LCSR ctlreg ',' sreg ',' rreg
223*ce95e1b3SDavid du Colombier 	{
224*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
225*ce95e1b3SDavid du Colombier 	}
226*ce95e1b3SDavid du Colombier 
227*ce95e1b3SDavid du Colombier |	LCSR ctlreg ',' '$' con ',' rreg
228*ce95e1b3SDavid du Colombier 	{
229*ce95e1b3SDavid du Colombier 		if($5 < 0 || $5 >= NREG)
230*ce95e1b3SDavid du Colombier 			yyerror("immediate value out of range");
231*ce95e1b3SDavid du Colombier 		outcode($1 + (ACSRRWI-ACSRRW), &$2, $5, &$7);
232*ce95e1b3SDavid du Colombier 	}
233*ce95e1b3SDavid du Colombier 
234*ce95e1b3SDavid du Colombier |	LSWAP rreg ',' sreg ',' rreg
235*ce95e1b3SDavid du Colombier 	{
236*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
237*ce95e1b3SDavid du Colombier 	}
238*ce95e1b3SDavid du Colombier 
239*ce95e1b3SDavid du Colombier |	LAMO con ',' rreg ',' sreg ',' rreg
240*ce95e1b3SDavid du Colombier 	{
241*ce95e1b3SDavid du Colombier 		outcode($1, &$4, ($2<<16)|$6, &$8);
242*ce95e1b3SDavid du Colombier 	}
243*ce95e1b3SDavid du Colombier 
244*ce95e1b3SDavid du Colombier |	LTEXT name ',' imm
245*ce95e1b3SDavid du Colombier 	{
246*ce95e1b3SDavid du Colombier 		outcode($1, &$2, NREG, &$4);
247*ce95e1b3SDavid du Colombier 	}
248*ce95e1b3SDavid du Colombier |	LTEXT name ',' con ',' imm
249*ce95e1b3SDavid du Colombier 	{
250*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
251*ce95e1b3SDavid du Colombier 	}
252*ce95e1b3SDavid du Colombier 
253*ce95e1b3SDavid du Colombier |	LDATA name '/' con ',' imm
254*ce95e1b3SDavid du Colombier 	{
255*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
256*ce95e1b3SDavid du Colombier 	}
257*ce95e1b3SDavid du Colombier |	LDATA name '/' con ',' ximm
258*ce95e1b3SDavid du Colombier 	{
259*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
260*ce95e1b3SDavid du Colombier 	}
261*ce95e1b3SDavid du Colombier |	LDATA name '/' con ',' fimm
262*ce95e1b3SDavid du Colombier 	{
263*ce95e1b3SDavid du Colombier 		outcode($1, &$2, $4, &$6);
264*ce95e1b3SDavid du Colombier 	}
265*ce95e1b3SDavid du Colombier 
266*ce95e1b3SDavid du Colombier |	LWORD imm
267*ce95e1b3SDavid du Colombier 	{
268*ce95e1b3SDavid du Colombier 		outcode($1, &nullgen, NREG, &$2);
269*ce95e1b3SDavid du Colombier 	}
270*ce95e1b3SDavid du Colombier 
271*ce95e1b3SDavid du Colombier rel:
272*ce95e1b3SDavid du Colombier 	con '(' LPC ')'
273*ce95e1b3SDavid du Colombier 	{
274*ce95e1b3SDavid du Colombier 		$$ = nullgen;
275*ce95e1b3SDavid du Colombier 		$$.type = D_BRANCH;
276*ce95e1b3SDavid du Colombier 		$$.offset = $1 + pc;
277*ce95e1b3SDavid du Colombier 	}
278*ce95e1b3SDavid du Colombier |	LNAME offset
279*ce95e1b3SDavid du Colombier 	{
280*ce95e1b3SDavid du Colombier 		$$ = nullgen;
281*ce95e1b3SDavid du Colombier 		if(pass == 2)
282*ce95e1b3SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
283*ce95e1b3SDavid du Colombier 		$$.type = D_BRANCH;
284*ce95e1b3SDavid du Colombier 		$$.sym = $1;
285*ce95e1b3SDavid du Colombier 		$$.offset = $2;
286*ce95e1b3SDavid du Colombier 	}
287*ce95e1b3SDavid du Colombier |	LLAB offset
288*ce95e1b3SDavid du Colombier 	{
289*ce95e1b3SDavid du Colombier 		$$ = nullgen;
290*ce95e1b3SDavid du Colombier 		$$.type = D_BRANCH;
291*ce95e1b3SDavid du Colombier 		$$.sym = $1;
292*ce95e1b3SDavid du Colombier 		$$.offset = $1->value + $2;
293*ce95e1b3SDavid du Colombier 	}
294*ce95e1b3SDavid du Colombier 
295*ce95e1b3SDavid du Colombier oprrr:
296*ce95e1b3SDavid du Colombier 	LADD
297*ce95e1b3SDavid du Colombier |	LMUL
298*ce95e1b3SDavid du Colombier 
299*ce95e1b3SDavid du Colombier addr:
300*ce95e1b3SDavid du Colombier 	oreg
301*ce95e1b3SDavid du Colombier |	name
302*ce95e1b3SDavid du Colombier 
303*ce95e1b3SDavid du Colombier oreg:
304*ce95e1b3SDavid du Colombier 	'(' sreg ')'
305*ce95e1b3SDavid du Colombier 	{
306*ce95e1b3SDavid du Colombier 		$$ = nullgen;
307*ce95e1b3SDavid du Colombier 		$$.type = D_OREG;
308*ce95e1b3SDavid du Colombier 		$$.reg = $2;
309*ce95e1b3SDavid du Colombier 		$$.offset = 0;
310*ce95e1b3SDavid du Colombier 	}
311*ce95e1b3SDavid du Colombier |	con '(' sreg ')'
312*ce95e1b3SDavid du Colombier 	{
313*ce95e1b3SDavid du Colombier 		$$ = nullgen;
314*ce95e1b3SDavid du Colombier 		$$.type = D_OREG;
315*ce95e1b3SDavid du Colombier 		$$.reg = $3;
316*ce95e1b3SDavid du Colombier 		$$.offset = $1;
317*ce95e1b3SDavid du Colombier 	}
318*ce95e1b3SDavid du Colombier 
319*ce95e1b3SDavid du Colombier name:
320*ce95e1b3SDavid du Colombier 	con '(' pointer ')'
321*ce95e1b3SDavid du Colombier 	{
322*ce95e1b3SDavid du Colombier 		$$ = nullgen;
323*ce95e1b3SDavid du Colombier 		$$.type = D_OREG;
324*ce95e1b3SDavid du Colombier 		$$.name = $3;
325*ce95e1b3SDavid du Colombier 		$$.sym = S;
326*ce95e1b3SDavid du Colombier 		$$.offset = $1;
327*ce95e1b3SDavid du Colombier 	}
328*ce95e1b3SDavid du Colombier |	LNAME offset '(' pointer ')'
329*ce95e1b3SDavid du Colombier 	{
330*ce95e1b3SDavid du Colombier 		$$ = nullgen;
331*ce95e1b3SDavid du Colombier 		$$.type = D_OREG;
332*ce95e1b3SDavid du Colombier 		$$.name = $4;
333*ce95e1b3SDavid du Colombier 		$$.sym = $1;
334*ce95e1b3SDavid du Colombier 		$$.offset = $2;
335*ce95e1b3SDavid du Colombier 	}
336*ce95e1b3SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
337*ce95e1b3SDavid du Colombier 	{
338*ce95e1b3SDavid du Colombier 		$$ = nullgen;
339*ce95e1b3SDavid du Colombier 		$$.type = D_OREG;
340*ce95e1b3SDavid du Colombier 		$$.name = D_STATIC;
341*ce95e1b3SDavid du Colombier 		$$.sym = $1;
342*ce95e1b3SDavid du Colombier 		$$.offset = $4;
343*ce95e1b3SDavid du Colombier 	}
344*ce95e1b3SDavid du Colombier 
345*ce95e1b3SDavid du Colombier offset:
346*ce95e1b3SDavid du Colombier 	{
347*ce95e1b3SDavid du Colombier 		$$ = 0;
348*ce95e1b3SDavid du Colombier 	}
349*ce95e1b3SDavid du Colombier |	'+' con
350*ce95e1b3SDavid du Colombier 	{
351*ce95e1b3SDavid du Colombier 		$$ = $2;
352*ce95e1b3SDavid du Colombier 	}
353*ce95e1b3SDavid du Colombier |	'-' con
354*ce95e1b3SDavid du Colombier 	{
355*ce95e1b3SDavid du Colombier 		$$ = -$2;
356*ce95e1b3SDavid du Colombier 	}
357*ce95e1b3SDavid du Colombier 
358*ce95e1b3SDavid du Colombier pointer:
359*ce95e1b3SDavid du Colombier 	LSB
360*ce95e1b3SDavid du Colombier |	LSP
361*ce95e1b3SDavid du Colombier |	LFP
362*ce95e1b3SDavid du Colombier 
363*ce95e1b3SDavid du Colombier rreg:
364*ce95e1b3SDavid du Colombier 	sreg
365*ce95e1b3SDavid du Colombier 	{
366*ce95e1b3SDavid du Colombier 		$$ = nullgen;
367*ce95e1b3SDavid du Colombier 		$$.type = D_REG;
368*ce95e1b3SDavid du Colombier 		$$.reg = $1;
369*ce95e1b3SDavid du Colombier 	}
370*ce95e1b3SDavid du Colombier 
371*ce95e1b3SDavid du Colombier dreg:
372*ce95e1b3SDavid du Colombier 	freg
373*ce95e1b3SDavid du Colombier 	{
374*ce95e1b3SDavid du Colombier 		$$ = nullgen;
375*ce95e1b3SDavid du Colombier 		$$.type = D_FREG;
376*ce95e1b3SDavid du Colombier 		$$.reg = $1;
377*ce95e1b3SDavid du Colombier 	}
378*ce95e1b3SDavid du Colombier 
379*ce95e1b3SDavid du Colombier drreg:
380*ce95e1b3SDavid du Colombier 	dreg
381*ce95e1b3SDavid du Colombier |	rreg
382*ce95e1b3SDavid du Colombier 
383*ce95e1b3SDavid du Colombier sreg:
384*ce95e1b3SDavid du Colombier 	LREG
385*ce95e1b3SDavid du Colombier |	LR '(' expr ')'
386*ce95e1b3SDavid du Colombier 	{
387*ce95e1b3SDavid du Colombier 		if($3 < 0 || $3 >= NREG)
388*ce95e1b3SDavid du Colombier 			yyerror("register value out of range");
389*ce95e1b3SDavid du Colombier 		$$ = $3;
390*ce95e1b3SDavid du Colombier 	}
391*ce95e1b3SDavid du Colombier 
392*ce95e1b3SDavid du Colombier freg:
393*ce95e1b3SDavid du Colombier 	LFREG
394*ce95e1b3SDavid du Colombier |	FR '(' expr ')'
395*ce95e1b3SDavid du Colombier 	{
396*ce95e1b3SDavid du Colombier 		if($3 < 0 || $3 >= NREG)
397*ce95e1b3SDavid du Colombier 			yyerror("register value out of range");
398*ce95e1b3SDavid du Colombier 		$$ = $3;
399*ce95e1b3SDavid du Colombier 	}
400*ce95e1b3SDavid du Colombier 
401*ce95e1b3SDavid du Colombier ctlreg:
402*ce95e1b3SDavid du Colombier 	LCTL '(' expr ')'
403*ce95e1b3SDavid du Colombier 	{
404*ce95e1b3SDavid du Colombier 		if($3 < 0 || $3 >= 0xFFF)
405*ce95e1b3SDavid du Colombier 			yyerror("CSR value out of range");
406*ce95e1b3SDavid du Colombier 		$$ = nullgen;
407*ce95e1b3SDavid du Colombier 		$$.type = D_CTLREG;
408*ce95e1b3SDavid du Colombier 		$$.offset = $3;
409*ce95e1b3SDavid du Colombier 	}
410*ce95e1b3SDavid du Colombier 
411*ce95e1b3SDavid du Colombier ximm:
412*ce95e1b3SDavid du Colombier 	'$' addr
413*ce95e1b3SDavid du Colombier 	{
414*ce95e1b3SDavid du Colombier 		$$ = $2;
415*ce95e1b3SDavid du Colombier 		$$.type = D_CONST;
416*ce95e1b3SDavid du Colombier 	}
417*ce95e1b3SDavid du Colombier |	'$' LSCONST
418*ce95e1b3SDavid du Colombier 	{
419*ce95e1b3SDavid du Colombier 		$$ = nullgen;
420*ce95e1b3SDavid du Colombier 		$$.type = D_SCONST;
421*ce95e1b3SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
422*ce95e1b3SDavid du Colombier 	}
423*ce95e1b3SDavid du Colombier 
424*ce95e1b3SDavid du Colombier fimm:
425*ce95e1b3SDavid du Colombier 	'$' LFCONST
426*ce95e1b3SDavid du Colombier 	{
427*ce95e1b3SDavid du Colombier 		$$ = nullgen;
428*ce95e1b3SDavid du Colombier 		$$.type = D_FCONST;
429*ce95e1b3SDavid du Colombier 		$$.dval = $2;
430*ce95e1b3SDavid du Colombier 	}
431*ce95e1b3SDavid du Colombier |	'$' '-' LFCONST
432*ce95e1b3SDavid du Colombier 	{
433*ce95e1b3SDavid du Colombier 		$$ = nullgen;
434*ce95e1b3SDavid du Colombier 		$$.type = D_FCONST;
435*ce95e1b3SDavid du Colombier 		$$.dval = -$3;
436*ce95e1b3SDavid du Colombier 	}
437*ce95e1b3SDavid du Colombier 
438*ce95e1b3SDavid du Colombier imm:
439*ce95e1b3SDavid du Colombier 	'$' con
440*ce95e1b3SDavid du Colombier 	{
441*ce95e1b3SDavid du Colombier 		$$ = nullgen;
442*ce95e1b3SDavid du Colombier 		$$.type = D_CONST;
443*ce95e1b3SDavid du Colombier 		$$.offset = $2;
444*ce95e1b3SDavid du Colombier 		if(thechar == 'j' && (vlong)$$.offset != $2){
445*ce95e1b3SDavid du Colombier 			$$.type = D_VCONST;
446*ce95e1b3SDavid du Colombier 			$$.vval = $2;
447*ce95e1b3SDavid du Colombier 		}
448*ce95e1b3SDavid du Colombier 	}
449*ce95e1b3SDavid du Colombier 
450*ce95e1b3SDavid du Colombier con:
451*ce95e1b3SDavid du Colombier 	LCONST
452*ce95e1b3SDavid du Colombier |	LVAR
453*ce95e1b3SDavid du Colombier 	{
454*ce95e1b3SDavid du Colombier 		$$ = $1->value;
455*ce95e1b3SDavid du Colombier 	}
456*ce95e1b3SDavid du Colombier |	'-' con
457*ce95e1b3SDavid du Colombier 	{
458*ce95e1b3SDavid du Colombier 		$$ = -$2;
459*ce95e1b3SDavid du Colombier 	}
460*ce95e1b3SDavid du Colombier |	'+' con
461*ce95e1b3SDavid du Colombier 	{
462*ce95e1b3SDavid du Colombier 		$$ = $2;
463*ce95e1b3SDavid du Colombier 	}
464*ce95e1b3SDavid du Colombier |	'~' con
465*ce95e1b3SDavid du Colombier 	{
466*ce95e1b3SDavid du Colombier 		$$ = ~$2;
467*ce95e1b3SDavid du Colombier 	}
468*ce95e1b3SDavid du Colombier |	'(' expr ')'
469*ce95e1b3SDavid du Colombier 	{
470*ce95e1b3SDavid du Colombier 		$$ = $2;
471*ce95e1b3SDavid du Colombier 	}
472*ce95e1b3SDavid du Colombier 
473*ce95e1b3SDavid du Colombier expr:
474*ce95e1b3SDavid du Colombier 	con
475*ce95e1b3SDavid du Colombier |	expr '+' expr
476*ce95e1b3SDavid du Colombier 	{
477*ce95e1b3SDavid du Colombier 		$$ = $1 + $3;
478*ce95e1b3SDavid du Colombier 	}
479*ce95e1b3SDavid du Colombier |	expr '-' expr
480*ce95e1b3SDavid du Colombier 	{
481*ce95e1b3SDavid du Colombier 		$$ = $1 - $3;
482*ce95e1b3SDavid du Colombier 	}
483*ce95e1b3SDavid du Colombier |	expr '*' expr
484*ce95e1b3SDavid du Colombier 	{
485*ce95e1b3SDavid du Colombier 		$$ = $1 * $3;
486*ce95e1b3SDavid du Colombier 	}
487*ce95e1b3SDavid du Colombier |	expr '/' expr
488*ce95e1b3SDavid du Colombier 	{
489*ce95e1b3SDavid du Colombier 		$$ = $1 / $3;
490*ce95e1b3SDavid du Colombier 	}
491*ce95e1b3SDavid du Colombier |	expr '%' expr
492*ce95e1b3SDavid du Colombier 	{
493*ce95e1b3SDavid du Colombier 		$$ = $1 % $3;
494*ce95e1b3SDavid du Colombier 	}
495*ce95e1b3SDavid du Colombier |	expr '<' '<' expr
496*ce95e1b3SDavid du Colombier 	{
497*ce95e1b3SDavid du Colombier 		$$ = $1 << $4;
498*ce95e1b3SDavid du Colombier 	}
499*ce95e1b3SDavid du Colombier |	expr '>' '>' expr
500*ce95e1b3SDavid du Colombier 	{
501*ce95e1b3SDavid du Colombier 		$$ = $1 >> $4;
502*ce95e1b3SDavid du Colombier 	}
503*ce95e1b3SDavid du Colombier |	expr '&' expr
504*ce95e1b3SDavid du Colombier 	{
505*ce95e1b3SDavid du Colombier 		$$ = $1 & $3;
506*ce95e1b3SDavid du Colombier 	}
507*ce95e1b3SDavid du Colombier |	expr '^' expr
508*ce95e1b3SDavid du Colombier 	{
509*ce95e1b3SDavid du Colombier 		$$ = $1 ^ $3;
510*ce95e1b3SDavid du Colombier 	}
511*ce95e1b3SDavid du Colombier |	expr '|' expr
512*ce95e1b3SDavid du Colombier 	{
513*ce95e1b3SDavid du Colombier 		$$ = $1 | $3;
514*ce95e1b3SDavid du Colombier 	}
515