xref: /plan9-contrib/sys/src/cmd/6a/a.y (revision 40d015479ed36701ae6dcfd8814f849fc6285e8d)
1e887ea33SDavid du Colombier %{
2e887ea33SDavid du Colombier #include "a.h"
3e887ea33SDavid du Colombier %}
4e887ea33SDavid du Colombier %union	{
5e887ea33SDavid du Colombier 	Sym	*sym;
6e887ea33SDavid du Colombier 	vlong	lval;
7e887ea33SDavid du Colombier 	double	dval;
8e887ea33SDavid du Colombier 	char	sval[8];
9e887ea33SDavid du Colombier 	Gen	gen;
10e887ea33SDavid du Colombier 	Gen2	gen2;
11e887ea33SDavid du Colombier }
12e887ea33SDavid du Colombier %left	'|'
13e887ea33SDavid du Colombier %left	'^'
14e887ea33SDavid du Colombier %left	'&'
15e887ea33SDavid du Colombier %left	'<' '>'
16e887ea33SDavid du Colombier %left	'+' '-'
17e887ea33SDavid du Colombier %left	'*' '/' '%'
18e887ea33SDavid du Colombier %token	<lval>	LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4
19*40d01547SDavid du Colombier %token	<lval>	LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG LTYPEXC LTYPEX LTYPEY LTYPERT
20e887ea33SDavid du Colombier %token	<lval>	LCONST LFP LPC LSB
21*40d01547SDavid du Colombier %token	<lval>	LBREG LLREG LSREG LFREG LMREG LXREG LYREG
22e887ea33SDavid du Colombier %token	<dval>	LFCONST
23e887ea33SDavid du Colombier %token	<sval>	LSCONST LSP
24e887ea33SDavid du Colombier %token	<sym>	LNAME LLAB LVAR
25e887ea33SDavid du Colombier %type	<lval>	con expr pointer offset
26e887ea33SDavid du Colombier %type	<gen>	mem imm reg nam rel rem rim rom omem nmem
27*40d01547SDavid du Colombier %type	<gen2>	nonnon nonrel nonrem rimnon rimrem remrim
28*40d01547SDavid du Colombier %type	<gen2>	spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10 spec11 spec12
29e887ea33SDavid du Colombier %%
30e887ea33SDavid du Colombier prog:
31e887ea33SDavid du Colombier |	prog line
32e887ea33SDavid du Colombier 
33e887ea33SDavid du Colombier line:
34e887ea33SDavid du Colombier 	LLAB ':'
35e887ea33SDavid du Colombier 	{
36e887ea33SDavid du Colombier 		if($1->value != pc)
37e887ea33SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
38e887ea33SDavid du Colombier 		$1->value = pc;
39e887ea33SDavid du Colombier 	}
40e887ea33SDavid du Colombier 	line
41e887ea33SDavid du Colombier |	LNAME ':'
42e887ea33SDavid du Colombier 	{
43e887ea33SDavid du Colombier 		$1->type = LLAB;
44e887ea33SDavid du Colombier 		$1->value = pc;
45e887ea33SDavid du Colombier 	}
46e887ea33SDavid du Colombier 	line
47e887ea33SDavid du Colombier |	';'
48e887ea33SDavid du Colombier |	inst ';'
49e887ea33SDavid du Colombier |	error ';'
50e887ea33SDavid du Colombier 
51e887ea33SDavid du Colombier inst:
52e887ea33SDavid du Colombier 	LNAME '=' expr
53e887ea33SDavid du Colombier 	{
54e887ea33SDavid du Colombier 		$1->type = LVAR;
55e887ea33SDavid du Colombier 		$1->value = $3;
56e887ea33SDavid du Colombier 	}
57e887ea33SDavid du Colombier |	LVAR '=' expr
58e887ea33SDavid du Colombier 	{
59e887ea33SDavid du Colombier 		if($1->value != $3)
60e887ea33SDavid du Colombier 			yyerror("redeclaration of %s", $1->name);
61e887ea33SDavid du Colombier 		$1->value = $3;
62e887ea33SDavid du Colombier 	}
63e887ea33SDavid du Colombier |	LTYPE0 nonnon	{ outcode($1, &$2); }
64e887ea33SDavid du Colombier |	LTYPE1 nonrem	{ outcode($1, &$2); }
65e887ea33SDavid du Colombier |	LTYPE2 rimnon	{ outcode($1, &$2); }
66e887ea33SDavid du Colombier |	LTYPE3 rimrem	{ outcode($1, &$2); }
67e887ea33SDavid du Colombier |	LTYPE4 remrim	{ outcode($1, &$2); }
68e887ea33SDavid du Colombier |	LTYPER nonrel	{ outcode($1, &$2); }
69e887ea33SDavid du Colombier |	LTYPED spec1	{ outcode($1, &$2); }
70e887ea33SDavid du Colombier |	LTYPET spec2	{ outcode($1, &$2); }
71e887ea33SDavid du Colombier |	LTYPEC spec3	{ outcode($1, &$2); }
72e887ea33SDavid du Colombier |	LTYPEN spec4	{ outcode($1, &$2); }
73e887ea33SDavid du Colombier |	LTYPES spec5	{ outcode($1, &$2); }
74e887ea33SDavid du Colombier |	LTYPEM spec6	{ outcode($1, &$2); }
75e887ea33SDavid du Colombier |	LTYPEI spec7	{ outcode($1, &$2); }
76e887ea33SDavid du Colombier |	LTYPEXC spec8	{ outcode($1, &$2); }
77e887ea33SDavid du Colombier |	LTYPEX spec9	{ outcode($1, &$2); }
78*40d01547SDavid du Colombier |	LTYPEG spec10	{ outcode($1, &$2); }
79*40d01547SDavid du Colombier |	LTYPEY spec11	{ outcode($1, &$2); }
80*40d01547SDavid du Colombier |	LTYPERT spec12	{ outcode($1, &$2); }
81e887ea33SDavid du Colombier 
82e887ea33SDavid du Colombier nonnon:
83e887ea33SDavid du Colombier 	{
84e887ea33SDavid du Colombier 		$$.from = nullgen;
85e887ea33SDavid du Colombier 		$$.to = nullgen;
86e887ea33SDavid du Colombier 	}
87e887ea33SDavid du Colombier |	','
88e887ea33SDavid du Colombier 	{
89e887ea33SDavid du Colombier 		$$.from = nullgen;
90e887ea33SDavid du Colombier 		$$.to = nullgen;
91e887ea33SDavid du Colombier 	}
92e887ea33SDavid du Colombier 
93e887ea33SDavid du Colombier rimrem:
94e887ea33SDavid du Colombier 	rim ',' rem
95e887ea33SDavid du Colombier 	{
96e887ea33SDavid du Colombier 		$$.from = $1;
97e887ea33SDavid du Colombier 		$$.to = $3;
98e887ea33SDavid du Colombier 	}
99e887ea33SDavid du Colombier 
100e887ea33SDavid du Colombier remrim:
101e887ea33SDavid du Colombier 	rem ',' rim
102e887ea33SDavid du Colombier 	{
103e887ea33SDavid du Colombier 		$$.from = $1;
104e887ea33SDavid du Colombier 		$$.to = $3;
105e887ea33SDavid du Colombier 	}
106e887ea33SDavid du Colombier 
107e887ea33SDavid du Colombier rimnon:
108e887ea33SDavid du Colombier 	rim ','
109e887ea33SDavid du Colombier 	{
110e887ea33SDavid du Colombier 		$$.from = $1;
111e887ea33SDavid du Colombier 		$$.to = nullgen;
112e887ea33SDavid du Colombier 	}
113e887ea33SDavid du Colombier |	rim
114e887ea33SDavid du Colombier 	{
115e887ea33SDavid du Colombier 		$$.from = $1;
116e887ea33SDavid du Colombier 		$$.to = nullgen;
117e887ea33SDavid du Colombier 	}
118e887ea33SDavid du Colombier 
119e887ea33SDavid du Colombier nonrem:
120e887ea33SDavid du Colombier 	',' rem
121e887ea33SDavid du Colombier 	{
122e887ea33SDavid du Colombier 		$$.from = nullgen;
123e887ea33SDavid du Colombier 		$$.to = $2;
124e887ea33SDavid du Colombier 	}
125e887ea33SDavid du Colombier |	rem
126e887ea33SDavid du Colombier 	{
127e887ea33SDavid du Colombier 		$$.from = nullgen;
128e887ea33SDavid du Colombier 		$$.to = $1;
129e887ea33SDavid du Colombier 	}
130e887ea33SDavid du Colombier 
131e887ea33SDavid du Colombier nonrel:
132e887ea33SDavid du Colombier 	',' rel
133e887ea33SDavid du Colombier 	{
134e887ea33SDavid du Colombier 		$$.from = nullgen;
135e887ea33SDavid du Colombier 		$$.to = $2;
136e887ea33SDavid du Colombier 	}
137e887ea33SDavid du Colombier |	rel
138e887ea33SDavid du Colombier 	{
139e887ea33SDavid du Colombier 		$$.from = nullgen;
140e887ea33SDavid du Colombier 		$$.to = $1;
141e887ea33SDavid du Colombier 	}
142e887ea33SDavid du Colombier 
143e887ea33SDavid du Colombier spec1:	/* DATA */
144e887ea33SDavid du Colombier 	nam '/' con ',' imm
145e887ea33SDavid du Colombier 	{
146e887ea33SDavid du Colombier 		$$.from = $1;
147e887ea33SDavid du Colombier 		$$.from.scale = $3;
148e887ea33SDavid du Colombier 		$$.to = $5;
149e887ea33SDavid du Colombier 	}
150e887ea33SDavid du Colombier 
151e887ea33SDavid du Colombier spec2:	/* TEXT */
152e887ea33SDavid du Colombier 	mem ',' imm
153e887ea33SDavid du Colombier 	{
154e887ea33SDavid du Colombier 		$$.from = $1;
155e887ea33SDavid du Colombier 		$$.to = $3;
156e887ea33SDavid du Colombier 	}
157e887ea33SDavid du Colombier |	mem ',' con ',' imm
158e887ea33SDavid du Colombier 	{
159e887ea33SDavid du Colombier 		$$.from = $1;
160e887ea33SDavid du Colombier 		$$.from.scale = $3;
161e887ea33SDavid du Colombier 		$$.to = $5;
162e887ea33SDavid du Colombier 	}
163e887ea33SDavid du Colombier 
164e887ea33SDavid du Colombier spec3:	/* JMP/CALL */
165e887ea33SDavid du Colombier 	',' rom
166e887ea33SDavid du Colombier 	{
167e887ea33SDavid du Colombier 		$$.from = nullgen;
168e887ea33SDavid du Colombier 		$$.to = $2;
169e887ea33SDavid du Colombier 	}
170e887ea33SDavid du Colombier |	rom
171e887ea33SDavid du Colombier 	{
172e887ea33SDavid du Colombier 		$$.from = nullgen;
173e887ea33SDavid du Colombier 		$$.to = $1;
174e887ea33SDavid du Colombier 	}
175e887ea33SDavid du Colombier 
176e887ea33SDavid du Colombier spec4:	/* NOP */
177e887ea33SDavid du Colombier 	nonnon
178e887ea33SDavid du Colombier |	nonrem
179e887ea33SDavid du Colombier 
180e887ea33SDavid du Colombier spec5:	/* SHL/SHR */
181e887ea33SDavid du Colombier 	rim ',' rem
182e887ea33SDavid du Colombier 	{
183e887ea33SDavid du Colombier 		$$.from = $1;
184e887ea33SDavid du Colombier 		$$.to = $3;
185e887ea33SDavid du Colombier 	}
186e887ea33SDavid du Colombier |	rim ',' rem ':' LLREG
187e887ea33SDavid du Colombier 	{
188e887ea33SDavid du Colombier 		$$.from = $1;
189e887ea33SDavid du Colombier 		$$.to = $3;
190e887ea33SDavid du Colombier 		if($$.from.index != D_NONE)
191e887ea33SDavid du Colombier 			yyerror("dp shift with lhs index");
192e887ea33SDavid du Colombier 		$$.from.index = $5;
193e887ea33SDavid du Colombier 	}
194e887ea33SDavid du Colombier 
195e887ea33SDavid du Colombier spec6:	/* MOVW/MOVL */
196e887ea33SDavid du Colombier 	rim ',' rem
197e887ea33SDavid du Colombier 	{
198e887ea33SDavid du Colombier 		$$.from = $1;
199e887ea33SDavid du Colombier 		$$.to = $3;
200e887ea33SDavid du Colombier 	}
201e887ea33SDavid du Colombier |	rim ',' rem ':' LSREG
202e887ea33SDavid du Colombier 	{
203e887ea33SDavid du Colombier 		$$.from = $1;
204e887ea33SDavid du Colombier 		$$.to = $3;
205e887ea33SDavid du Colombier 		if($$.to.index != D_NONE)
206e887ea33SDavid du Colombier 			yyerror("dp move with lhs index");
207e887ea33SDavid du Colombier 		$$.to.index = $5;
208e887ea33SDavid du Colombier 	}
209e887ea33SDavid du Colombier 
210e887ea33SDavid du Colombier spec7:
211e887ea33SDavid du Colombier 	rim ','
212e887ea33SDavid du Colombier 	{
213e887ea33SDavid du Colombier 		$$.from = $1;
214e887ea33SDavid du Colombier 		$$.to = nullgen;
215e887ea33SDavid du Colombier 	}
216e887ea33SDavid du Colombier |	rim
217e887ea33SDavid du Colombier 	{
218e887ea33SDavid du Colombier 		$$.from = $1;
219e887ea33SDavid du Colombier 		$$.to = nullgen;
220e887ea33SDavid du Colombier 	}
221e887ea33SDavid du Colombier |	rim ',' rem
222e887ea33SDavid du Colombier 	{
223e887ea33SDavid du Colombier 		$$.from = $1;
224e887ea33SDavid du Colombier 		$$.to = $3;
225e887ea33SDavid du Colombier 	}
226e887ea33SDavid du Colombier 
227e887ea33SDavid du Colombier spec8:	/* CMPPS/CMPPD */
228e887ea33SDavid du Colombier 	reg ',' rem ',' con
229e887ea33SDavid du Colombier 	{
230e887ea33SDavid du Colombier 		$$.from = $1;
231e887ea33SDavid du Colombier 		$$.to = $3;
232e887ea33SDavid du Colombier 		$$.from.offset = $5;
233e887ea33SDavid du Colombier 	}
234*40d01547SDavid du Colombier |	reg ',' reg ',' rem ',' con	/* VCMPPS/VCMPPD */
235*40d01547SDavid du Colombier 	{
236*40d01547SDavid du Colombier 		$$.from = $1;
237*40d01547SDavid du Colombier 		if(!isxyreg($3.type))
238*40d01547SDavid du Colombier 			yyerror("second source operand must be X/Y register");
239*40d01547SDavid du Colombier 		$$.from.index = $3.type;
240*40d01547SDavid du Colombier 		$$.to = $5;
241*40d01547SDavid du Colombier 		$$.from.offset = $7;
242*40d01547SDavid du Colombier 	}
243e887ea33SDavid du Colombier 
244*40d01547SDavid du Colombier spec9:	/* SHUFL */
245e887ea33SDavid du Colombier 	imm ',' rem ',' reg
246e887ea33SDavid du Colombier 	{
247e887ea33SDavid du Colombier 		$$.from = $3;
248e887ea33SDavid du Colombier 		$$.to = $5;
249e887ea33SDavid du Colombier 		if($1.type != D_CONST)
250e887ea33SDavid du Colombier 			yyerror("illegal constant");
251e887ea33SDavid du Colombier 		$$.to.offset = $1.offset;
252e887ea33SDavid du Colombier 	}
253*40d01547SDavid du Colombier |	imm ',' rem ',' reg ',' reg
254*40d01547SDavid du Colombier 	{
255*40d01547SDavid du Colombier 		$$.from = $3;
256*40d01547SDavid du Colombier 		$$.to = $7;
257*40d01547SDavid du Colombier 		if($1.type != D_CONST)
258*40d01547SDavid du Colombier 			yyerror("illegal constant");
259*40d01547SDavid du Colombier 		$$.to.offset = $1.offset;
260*40d01547SDavid du Colombier 		if(!isxyreg($5.type))
261*40d01547SDavid du Colombier 			yyerror("second source operand must be X/Y register");
262*40d01547SDavid du Colombier 		$$.to.index = $5.type;
263*40d01547SDavid du Colombier 	}
264e887ea33SDavid du Colombier 
265*40d01547SDavid du Colombier spec10:	/* GLOBL */
266*40d01547SDavid du Colombier 	mem ',' imm
267*40d01547SDavid du Colombier 	{
268*40d01547SDavid du Colombier 		$$.from = $1;
269*40d01547SDavid du Colombier 		$$.to = $3;
270*40d01547SDavid du Colombier 	}
271*40d01547SDavid du Colombier |	mem ',' con ',' imm
272*40d01547SDavid du Colombier 	{
273*40d01547SDavid du Colombier 		$$.from = $1;
274*40d01547SDavid du Colombier 		$$.from.scale = $3;
275*40d01547SDavid du Colombier 		$$.to = $5;
276*40d01547SDavid du Colombier 	}
277*40d01547SDavid du Colombier 
278*40d01547SDavid du Colombier spec11:
279*40d01547SDavid du Colombier 	rimrem
280*40d01547SDavid du Colombier |	rim ',' reg ',' rem
281*40d01547SDavid du Colombier 	{
282*40d01547SDavid du Colombier 		$$.from = $1;
283*40d01547SDavid du Colombier 		$$.to = $5;
284*40d01547SDavid du Colombier 		if(isxyreg($3.type)) {
285*40d01547SDavid du Colombier 			if(isxyreg($1.type))
286*40d01547SDavid du Colombier 				$$.from.index = $3.type;
287*40d01547SDavid du Colombier 			else if(isxyreg($5.type))
288*40d01547SDavid du Colombier 				$$.to.index = $3.type;
289*40d01547SDavid du Colombier 		} else
290*40d01547SDavid du Colombier 			yyerror("second source operand must be X or Y register");
291*40d01547SDavid du Colombier 	}
292*40d01547SDavid du Colombier 
293*40d01547SDavid du Colombier spec12:	/* RET/RETF */
294e887ea33SDavid du Colombier 	{
295e887ea33SDavid du Colombier 		$$.from = nullgen;
296e887ea33SDavid du Colombier 		$$.to = nullgen;
297e887ea33SDavid du Colombier 	}
298e887ea33SDavid du Colombier |	imm
299e887ea33SDavid du Colombier 	{
300e887ea33SDavid du Colombier 		$$.from = $1;
301e887ea33SDavid du Colombier 		$$.to = nullgen;
302e887ea33SDavid du Colombier 	}
303e887ea33SDavid du Colombier 
304e887ea33SDavid du Colombier rem:
305e887ea33SDavid du Colombier 	reg
306e887ea33SDavid du Colombier |	mem
307e887ea33SDavid du Colombier 
308e887ea33SDavid du Colombier rom:
309e887ea33SDavid du Colombier 	rel
310e887ea33SDavid du Colombier |	nmem
311e887ea33SDavid du Colombier |	'*' reg
312e887ea33SDavid du Colombier 	{
313e887ea33SDavid du Colombier 		$$ = $2;
314e887ea33SDavid du Colombier 	}
315e887ea33SDavid du Colombier |	'*' omem
316e887ea33SDavid du Colombier 	{
317e887ea33SDavid du Colombier 		$$ = $2;
318e887ea33SDavid du Colombier 	}
319e887ea33SDavid du Colombier |	reg
320e887ea33SDavid du Colombier |	omem
321*40d01547SDavid du Colombier |	imm
322e887ea33SDavid du Colombier 
323e887ea33SDavid du Colombier rim:
324e887ea33SDavid du Colombier 	rem
325e887ea33SDavid du Colombier |	imm
326e887ea33SDavid du Colombier 
327e887ea33SDavid du Colombier rel:
328e887ea33SDavid du Colombier 	con '(' LPC ')'
329e887ea33SDavid du Colombier 	{
330e887ea33SDavid du Colombier 		$$ = nullgen;
331e887ea33SDavid du Colombier 		$$.type = D_BRANCH;
332e887ea33SDavid du Colombier 		$$.offset = $1 + pc;
333e887ea33SDavid du Colombier 	}
334e887ea33SDavid du Colombier |	LNAME offset
335e887ea33SDavid du Colombier 	{
336e887ea33SDavid du Colombier 		$$ = nullgen;
337e887ea33SDavid du Colombier 		if(pass == 2)
338e887ea33SDavid du Colombier 			yyerror("undefined label: %s", $1->name);
339e887ea33SDavid du Colombier 		$$.type = D_BRANCH;
340e887ea33SDavid du Colombier 		$$.sym = $1;
341e887ea33SDavid du Colombier 		$$.offset = $2;
342e887ea33SDavid du Colombier 	}
343e887ea33SDavid du Colombier |	LLAB offset
344e887ea33SDavid du Colombier 	{
345e887ea33SDavid du Colombier 		$$ = nullgen;
346e887ea33SDavid du Colombier 		$$.type = D_BRANCH;
347e887ea33SDavid du Colombier 		$$.sym = $1;
348e887ea33SDavid du Colombier 		$$.offset = $1->value + $2;
349e887ea33SDavid du Colombier 	}
350e887ea33SDavid du Colombier 
351e887ea33SDavid du Colombier reg:
352e887ea33SDavid du Colombier 	LBREG
353e887ea33SDavid du Colombier 	{
354e887ea33SDavid du Colombier 		$$ = nullgen;
355e887ea33SDavid du Colombier 		$$.type = $1;
356e887ea33SDavid du Colombier 	}
357e887ea33SDavid du Colombier |	LFREG
358e887ea33SDavid du Colombier 	{
359e887ea33SDavid du Colombier 		$$ = nullgen;
360e887ea33SDavid du Colombier 		$$.type = $1;
361e887ea33SDavid du Colombier 	}
362e887ea33SDavid du Colombier |	LLREG
363e887ea33SDavid du Colombier 	{
364e887ea33SDavid du Colombier 		$$ = nullgen;
365e887ea33SDavid du Colombier 		$$.type = $1;
366e887ea33SDavid du Colombier 	}
367e887ea33SDavid du Colombier |	LMREG
368e887ea33SDavid du Colombier 	{
369e887ea33SDavid du Colombier 		$$ = nullgen;
370e887ea33SDavid du Colombier 		$$.type = $1;
371e887ea33SDavid du Colombier 	}
372e887ea33SDavid du Colombier |	LSP
373e887ea33SDavid du Colombier 	{
374e887ea33SDavid du Colombier 		$$ = nullgen;
375e887ea33SDavid du Colombier 		$$.type = D_SP;
376e887ea33SDavid du Colombier 	}
377e887ea33SDavid du Colombier |	LSREG
378e887ea33SDavid du Colombier 	{
379e887ea33SDavid du Colombier 		$$ = nullgen;
380e887ea33SDavid du Colombier 		$$.type = $1;
381e887ea33SDavid du Colombier 	}
382e887ea33SDavid du Colombier |	LXREG
383e887ea33SDavid du Colombier 	{
384e887ea33SDavid du Colombier 		$$ = nullgen;
385e887ea33SDavid du Colombier 		$$.type = $1;
386e887ea33SDavid du Colombier 	}
387*40d01547SDavid du Colombier |	LYREG
388*40d01547SDavid du Colombier 	{
389*40d01547SDavid du Colombier 		$$ = nullgen;
390*40d01547SDavid du Colombier 		$$.type = $1;
391*40d01547SDavid du Colombier 	}
392e887ea33SDavid du Colombier 
393e887ea33SDavid du Colombier imm:
394e887ea33SDavid du Colombier 	'$' con
395e887ea33SDavid du Colombier 	{
396e887ea33SDavid du Colombier 		$$ = nullgen;
397e887ea33SDavid du Colombier 		$$.type = D_CONST;
398e887ea33SDavid du Colombier 		$$.offset = $2;
399e887ea33SDavid du Colombier 	}
400e887ea33SDavid du Colombier |	'$' nam
401e887ea33SDavid du Colombier 	{
402e887ea33SDavid du Colombier 		$$ = $2;
403e887ea33SDavid du Colombier 		$$.index = $2.type;
404e887ea33SDavid du Colombier 		$$.type = D_ADDR;
405e887ea33SDavid du Colombier 		/*
406e887ea33SDavid du Colombier 		if($2.type == D_AUTO || $2.type == D_PARAM)
407e887ea33SDavid du Colombier 			yyerror("constant cannot be automatic: %s",
408e887ea33SDavid du Colombier 				$2.sym->name);
409e887ea33SDavid du Colombier 		 */
410e887ea33SDavid du Colombier 	}
411e887ea33SDavid du Colombier |	'$' LSCONST
412e887ea33SDavid du Colombier 	{
413e887ea33SDavid du Colombier 		$$ = nullgen;
414e887ea33SDavid du Colombier 		$$.type = D_SCONST;
415e887ea33SDavid du Colombier 		memcpy($$.sval, $2, sizeof($$.sval));
416e887ea33SDavid du Colombier 	}
417e887ea33SDavid du Colombier |	'$' LFCONST
418e887ea33SDavid du Colombier 	{
419e887ea33SDavid du Colombier 		$$ = nullgen;
420e887ea33SDavid du Colombier 		$$.type = D_FCONST;
421e887ea33SDavid du Colombier 		$$.dval = $2;
422e887ea33SDavid du Colombier 	}
423e887ea33SDavid du Colombier |	'$' '(' LFCONST ')'
424e887ea33SDavid du Colombier 	{
425e887ea33SDavid du Colombier 		$$ = nullgen;
426e887ea33SDavid du Colombier 		$$.type = D_FCONST;
427e887ea33SDavid du Colombier 		$$.dval = $3;
428e887ea33SDavid du Colombier 	}
429e887ea33SDavid du Colombier |	'$' '-' LFCONST
430e887ea33SDavid du Colombier 	{
431e887ea33SDavid du Colombier 		$$ = nullgen;
432e887ea33SDavid du Colombier 		$$.type = D_FCONST;
433e887ea33SDavid du Colombier 		$$.dval = -$3;
434e887ea33SDavid du Colombier 	}
435e887ea33SDavid du Colombier 
436e887ea33SDavid du Colombier mem:
437e887ea33SDavid du Colombier 	omem
438e887ea33SDavid du Colombier |	nmem
439e887ea33SDavid du Colombier 
440e887ea33SDavid du Colombier omem:
441e887ea33SDavid du Colombier 	con
442e887ea33SDavid du Colombier 	{
443e887ea33SDavid du Colombier 		$$ = nullgen;
444e887ea33SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
445e887ea33SDavid du Colombier 		$$.offset = $1;
446e887ea33SDavid du Colombier 	}
447e887ea33SDavid du Colombier |	con '(' LLREG ')'
448e887ea33SDavid du Colombier 	{
449e887ea33SDavid du Colombier 		$$ = nullgen;
450e887ea33SDavid du Colombier 		$$.type = D_INDIR+$3;
451e887ea33SDavid du Colombier 		$$.offset = $1;
452e887ea33SDavid du Colombier 	}
453e887ea33SDavid du Colombier |	con '(' LSP ')'
454e887ea33SDavid du Colombier 	{
455e887ea33SDavid du Colombier 		$$ = nullgen;
456e887ea33SDavid du Colombier 		$$.type = D_INDIR+D_SP;
457e887ea33SDavid du Colombier 		$$.offset = $1;
458e887ea33SDavid du Colombier 	}
459e887ea33SDavid du Colombier |	con '(' LLREG '*' con ')'
460e887ea33SDavid du Colombier 	{
461e887ea33SDavid du Colombier 		$$ = nullgen;
462e887ea33SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
463e887ea33SDavid du Colombier 		$$.offset = $1;
464e887ea33SDavid du Colombier 		$$.index = $3;
465e887ea33SDavid du Colombier 		$$.scale = $5;
466e887ea33SDavid du Colombier 		checkscale($$.scale);
467e887ea33SDavid du Colombier 	}
468e887ea33SDavid du Colombier |	con '(' LLREG ')' '(' LLREG '*' con ')'
469e887ea33SDavid du Colombier 	{
470e887ea33SDavid du Colombier 		$$ = nullgen;
471e887ea33SDavid du Colombier 		$$.type = D_INDIR+$3;
472e887ea33SDavid du Colombier 		$$.offset = $1;
473e887ea33SDavid du Colombier 		$$.index = $6;
474e887ea33SDavid du Colombier 		$$.scale = $8;
475e887ea33SDavid du Colombier 		checkscale($$.scale);
476e887ea33SDavid du Colombier 	}
477e887ea33SDavid du Colombier |	'(' LLREG ')'
478e887ea33SDavid du Colombier 	{
479e887ea33SDavid du Colombier 		$$ = nullgen;
480e887ea33SDavid du Colombier 		$$.type = D_INDIR+$2;
481e887ea33SDavid du Colombier 	}
482e887ea33SDavid du Colombier |	'(' LSP ')'
483e887ea33SDavid du Colombier 	{
484e887ea33SDavid du Colombier 		$$ = nullgen;
485e887ea33SDavid du Colombier 		$$.type = D_INDIR+D_SP;
486e887ea33SDavid du Colombier 	}
487*40d01547SDavid du Colombier |	con '(' LSREG ')'
488*40d01547SDavid du Colombier 	{
489*40d01547SDavid du Colombier 		$$ = nullgen;
490*40d01547SDavid du Colombier 		$$.type = D_INDIR+$3;
491*40d01547SDavid du Colombier 		$$.offset = $1;
492*40d01547SDavid du Colombier 	}
493e887ea33SDavid du Colombier |	'(' LLREG '*' con ')'
494e887ea33SDavid du Colombier 	{
495e887ea33SDavid du Colombier 		$$ = nullgen;
496e887ea33SDavid du Colombier 		$$.type = D_INDIR+D_NONE;
497e887ea33SDavid du Colombier 		$$.index = $2;
498e887ea33SDavid du Colombier 		$$.scale = $4;
499e887ea33SDavid du Colombier 		checkscale($$.scale);
500e887ea33SDavid du Colombier 	}
501e887ea33SDavid du Colombier |	'(' LLREG ')' '(' LLREG '*' con ')'
502e887ea33SDavid du Colombier 	{
503e887ea33SDavid du Colombier 		$$ = nullgen;
504e887ea33SDavid du Colombier 		$$.type = D_INDIR+$2;
505e887ea33SDavid du Colombier 		$$.index = $5;
506e887ea33SDavid du Colombier 		$$.scale = $7;
507e887ea33SDavid du Colombier 		checkscale($$.scale);
508e887ea33SDavid du Colombier 	}
509e887ea33SDavid du Colombier 
510e887ea33SDavid du Colombier nmem:
511e887ea33SDavid du Colombier 	nam
512e887ea33SDavid du Colombier 	{
513e887ea33SDavid du Colombier 		$$ = $1;
514e887ea33SDavid du Colombier 	}
515e887ea33SDavid du Colombier |	nam '(' LLREG '*' con ')'
516e887ea33SDavid du Colombier 	{
517e887ea33SDavid du Colombier 		$$ = $1;
518e887ea33SDavid du Colombier 		$$.index = $3;
519e887ea33SDavid du Colombier 		$$.scale = $5;
520e887ea33SDavid du Colombier 		checkscale($$.scale);
521e887ea33SDavid du Colombier 	}
522e887ea33SDavid du Colombier 
523e887ea33SDavid du Colombier nam:
524e887ea33SDavid du Colombier 	LNAME offset '(' pointer ')'
525e887ea33SDavid du Colombier 	{
526e887ea33SDavid du Colombier 		$$ = nullgen;
527e887ea33SDavid du Colombier 		$$.type = $4;
528e887ea33SDavid du Colombier 		$$.sym = $1;
529e887ea33SDavid du Colombier 		$$.offset = $2;
530e887ea33SDavid du Colombier 	}
531e887ea33SDavid du Colombier |	LNAME '<' '>' offset '(' LSB ')'
532e887ea33SDavid du Colombier 	{
533e887ea33SDavid du Colombier 		$$ = nullgen;
534e887ea33SDavid du Colombier 		$$.type = D_STATIC;
535e887ea33SDavid du Colombier 		$$.sym = $1;
536e887ea33SDavid du Colombier 		$$.offset = $4;
537e887ea33SDavid du Colombier 	}
538e887ea33SDavid du Colombier 
539e887ea33SDavid du Colombier offset:
540e887ea33SDavid du Colombier 	{
541e887ea33SDavid du Colombier 		$$ = 0;
542e887ea33SDavid du Colombier 	}
543e887ea33SDavid du Colombier |	'+' con
544e887ea33SDavid du Colombier 	{
545e887ea33SDavid du Colombier 		$$ = $2;
546e887ea33SDavid du Colombier 	}
547e887ea33SDavid du Colombier |	'-' con
548e887ea33SDavid du Colombier 	{
549e887ea33SDavid du Colombier 		$$ = -$2;
550e887ea33SDavid du Colombier 	}
551e887ea33SDavid du Colombier 
552e887ea33SDavid du Colombier pointer:
553e887ea33SDavid du Colombier 	LSB
554e887ea33SDavid du Colombier |	LSP
555e887ea33SDavid du Colombier 	{
556e887ea33SDavid du Colombier 		$$ = D_AUTO;
557e887ea33SDavid du Colombier 	}
558e887ea33SDavid du Colombier |	LFP
559e887ea33SDavid du Colombier 
560e887ea33SDavid du Colombier con:
561e887ea33SDavid du Colombier 	LCONST
562e887ea33SDavid du Colombier |	LVAR
563e887ea33SDavid du Colombier 	{
564e887ea33SDavid du Colombier 		$$ = $1->value;
565e887ea33SDavid du Colombier 	}
566e887ea33SDavid du Colombier |	'-' con
567e887ea33SDavid du Colombier 	{
568e887ea33SDavid du Colombier 		$$ = -$2;
569e887ea33SDavid du Colombier 	}
570e887ea33SDavid du Colombier |	'+' con
571e887ea33SDavid du Colombier 	{
572e887ea33SDavid du Colombier 		$$ = $2;
573e887ea33SDavid du Colombier 	}
574e887ea33SDavid du Colombier |	'~' con
575e887ea33SDavid du Colombier 	{
576e887ea33SDavid du Colombier 		$$ = ~$2;
577e887ea33SDavid du Colombier 	}
578e887ea33SDavid du Colombier |	'(' expr ')'
579e887ea33SDavid du Colombier 	{
580e887ea33SDavid du Colombier 		$$ = $2;
581e887ea33SDavid du Colombier 	}
582e887ea33SDavid du Colombier 
583e887ea33SDavid du Colombier expr:
584e887ea33SDavid du Colombier 	con
585e887ea33SDavid du Colombier |	expr '+' expr
586e887ea33SDavid du Colombier 	{
587e887ea33SDavid du Colombier 		$$ = $1 + $3;
588e887ea33SDavid du Colombier 	}
589e887ea33SDavid du Colombier |	expr '-' expr
590e887ea33SDavid du Colombier 	{
591e887ea33SDavid du Colombier 		$$ = $1 - $3;
592e887ea33SDavid du Colombier 	}
593e887ea33SDavid du Colombier |	expr '*' expr
594e887ea33SDavid du Colombier 	{
595e887ea33SDavid du Colombier 		$$ = $1 * $3;
596e887ea33SDavid du Colombier 	}
597e887ea33SDavid du Colombier |	expr '/' expr
598e887ea33SDavid du Colombier 	{
599e887ea33SDavid du Colombier 		$$ = $1 / $3;
600e887ea33SDavid du Colombier 	}
601e887ea33SDavid du Colombier |	expr '%' expr
602e887ea33SDavid du Colombier 	{
603e887ea33SDavid du Colombier 		$$ = $1 % $3;
604e887ea33SDavid du Colombier 	}
605e887ea33SDavid du Colombier |	expr '<' '<' expr
606e887ea33SDavid du Colombier 	{
607e887ea33SDavid du Colombier 		$$ = $1 << $4;
608e887ea33SDavid du Colombier 	}
609e887ea33SDavid du Colombier |	expr '>' '>' expr
610e887ea33SDavid du Colombier 	{
611e887ea33SDavid du Colombier 		$$ = $1 >> $4;
612e887ea33SDavid du Colombier 	}
613e887ea33SDavid du Colombier |	expr '&' expr
614e887ea33SDavid du Colombier 	{
615e887ea33SDavid du Colombier 		$$ = $1 & $3;
616e887ea33SDavid du Colombier 	}
617e887ea33SDavid du Colombier |	expr '^' expr
618e887ea33SDavid du Colombier 	{
619e887ea33SDavid du Colombier 		$$ = $1 ^ $3;
620e887ea33SDavid du Colombier 	}
621e887ea33SDavid du Colombier |	expr '|' expr
622e887ea33SDavid du Colombier 	{
623e887ea33SDavid du Colombier 		$$ = $1 | $3;
624e887ea33SDavid du Colombier 	}
625