]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/1a/a.y
remove old copies of kernels l.s from cmd/?a
[plan9front.git] / sys / src / cmd / 1a / a.y
1 %{
2 #include "a.h"
3 %}
4 %union  {
5         Sym     *sym;
6         long    lval;
7         double  dval;
8         char    sval[8];
9         Addr    addr;
10         Gen     gen;
11         Gen2    gen2;
12 }
13 %left   '|'
14 %left   '^'
15 %left   '&'
16 %left   '<' '>'
17 %left   '+' '-'
18 %left   '*' '/' '%'
19 %token  <lval>  LTYPE1 LTYPE2 LTYPE3 LTYPE4 LTYPE5
20 %token  <lval>  LTYPE6 LTYPE7 LTYPE8 LTYPE9 LTYPEA LTYPEB
21 %token  <lval>  LCONST LSP LSB LFP LPC LTOS LAREG LDREG LFREG
22 %token  <dval>  LFCONST
23 %token  <sval>  LSCONST
24 %token  <sym>   LNAME LLAB LVAR
25 %type   <lval>  con expr type pointer reg offset
26 %type   <addr>  name areg
27 %type   <gen>   gen rel
28 %type   <gen2>  noaddr gengen dstgen spec1 spec2 spec3 srcgen dstrel genrel
29 %%
30 prog:
31 |       prog line
32
33 line:
34         LLAB ':'
35         {
36                 if($1->value != pc)
37                         yyerror("redeclaration of %s", $1->name);
38                 $1->value = pc;
39         }
40         line
41 |       LNAME ':'
42         {
43                 $1->type = LLAB;
44                 $1->value = pc;
45         }
46         line
47 |       ';'
48 |       inst ';'
49 |       error ';'
50
51 inst:
52         LNAME '=' expr
53         {
54                 $1->type = LVAR;
55                 $1->value = $3;
56         }
57 |       LVAR '=' expr
58         {
59                 if($1->value != $3)
60                         yyerror("redeclaration of %s", $1->name);
61                 $1->value = $3;
62         }
63 |       LTYPE1 gengen   { outcode($1, &$2); }
64 |       LTYPE2 noaddr   { outcode($1, &$2); }
65 |       LTYPE3 dstgen   { outcode($1, &$2); }
66 |       LTYPE4 spec1    { outcode($1, &$2); }
67 |       LTYPE5 srcgen   { outcode($1, &$2); }
68 |       LTYPE6 dstrel   { outcode($1, &$2); }
69 |       LTYPE7 genrel   { outcode($1, &$2); }
70 |       LTYPE8 dstgen   { outcode($1, &$2); }
71 |       LTYPE8 gengen   { outcode($1, &$2); }
72 |       LTYPE9 noaddr   { outcode($1, &$2); }
73 |       LTYPE9 dstgen   { outcode($1, &$2); }
74 |       LTYPEA spec2    { outcode($1, &$2); }
75 |       LTYPEB spec3    { outcode($1, &$2); }
76
77 noaddr:
78         {
79                 $$.from = nullgen;
80                 $$.to = nullgen;
81         }
82 |       ','
83         {
84                 $$.from = nullgen;
85                 $$.to = nullgen;
86         }
87
88 srcgen:
89         gen
90         {
91                 $$.from = $1;
92                 $$.to = nullgen;
93         }
94 |       gen ','
95         {
96                 $$.from = $1;
97                 $$.to = nullgen;
98         }
99
100 dstgen:
101         gen
102         {
103                 $$.from = nullgen;
104                 $$.to = $1;
105         }
106 |       ',' gen
107         {
108                 $$.from = nullgen;
109                 $$.to = $2;
110         }
111
112 gengen:
113         gen ',' gen
114         {
115                 $$.from = $1;
116                 $$.to = $3;
117         }
118
119 dstrel:
120         rel
121         {
122                 $$.from = nullgen;
123                 $$.to = $1;
124         }
125 |       ',' rel
126         {
127                 $$.from = nullgen;
128                 $$.to = $2;
129         }
130
131 genrel:
132         gen ',' rel
133         {
134                 $$.from = $1;
135                 $$.to = $3;
136         }
137
138 spec1:  /* DATA opcode */
139         gen '/' con ',' gen
140         {
141                 $1.displace = $3;
142                 $$.from = $1;
143                 $$.to = $5;
144         }
145
146 spec2:  /* bit field opcodes */
147         gen ',' gen ',' con ',' con
148         {
149                 $1.field = $7;
150                 $3.field = $5;
151                 $$.from = $1;
152                 $$.to = $3;
153         }
154
155 spec3:  /* TEXT opcode */
156         gengen
157 |       gen ',' con ',' gen
158         {
159                 $1.displace = $3;
160                 $$.from = $1;
161                 $$.to = $5;
162         }
163
164 rel:
165         con '(' LPC ')'
166         {
167                 $$ = nullgen;
168                 $$.type = D_BRANCH;
169                 $$.offset = $1 + pc;
170         }
171 |       LNAME offset
172         {
173                 $$ = nullgen;
174                 if(pass == 2)
175                         yyerror("undefined label: %s", $1->name);
176                 $$.type = D_BRANCH;
177                 $$.sym = $1;
178                 $$.offset = $2;
179         }
180 |       LLAB offset
181         {
182                 $$ = nullgen;
183                 $$.type = D_BRANCH;
184                 $$.sym = $1;
185                 $$.offset = $1->value + $2;
186         }
187
188 gen:
189         type
190         {
191                 $$ = nullgen;
192                 $$.type = $1;
193         }
194 |       '$' con
195         {
196                 $$ = nullgen;
197                 $$.type = D_CONST;
198                 $$.offset = $2;
199         }
200 |       '$' name
201         {
202                 $$ = nullgen;
203                 {
204                         Addr *a;
205                         a = &$$;
206                         *a = $2;
207                 }
208                 if($2.type == D_AUTO || $2.type == D_PARAM)
209                         yyerror("constant cannot be automatic: %s",
210                                 $2.sym->name);
211                 $$.type = $2.type | I_ADDR;
212         }
213 |       '$' LSCONST
214         {
215                 $$ = nullgen;
216                 $$.type = D_SCONST;
217                 memcpy($$.sval, $2, sizeof($$.sval));
218         }
219 |       '$' LFCONST
220         {
221                 $$ = nullgen;
222                 $$.type = D_FCONST;
223                 $$.dval = $2;
224         }
225 |       '$' '-' LFCONST
226         {
227                 $$ = nullgen;
228                 $$.type = D_FCONST;
229                 $$.dval = -$3;
230         }
231 |       LTOS '+' con
232         {
233                 $$ = nullgen;
234                 $$.type = D_STACK;
235                 $$.offset = $3;
236         }
237 |       LTOS '-' con
238         {
239                 $$ = nullgen;
240                 $$.type = D_STACK;
241                 $$.offset = -$3;
242         }
243 |       con
244         {
245                 $$ = nullgen;
246                 $$.type = D_CONST | I_INDIR;
247                 $$.offset = $1;
248         }
249 |       '-' '(' LAREG ')'
250         {
251                 $$ = nullgen;
252                 $$.type = $3 | I_INDDEC;
253         }
254 |       '(' LAREG ')' '+'
255         {
256                 $$ = nullgen;
257                 $$.type = $2 | I_INDINC;
258         }
259 |       areg
260         {
261                 $$ = nullgen;
262                 $$.type = $1.type;
263                 {
264                         Addr *a;
265                         a = &$$;
266                         *a = $1;
267                 }
268         }
269
270 type:
271         reg
272 |       LFREG
273
274 reg:
275         LAREG
276 |       LDREG
277 |       LTOS
278
279 areg:
280         '(' LAREG ')'
281         {
282                 $$.type = $2 | I_INDIR;
283                 $$.sym = S;
284                 $$.offset = 0;
285         }
286 |       con '(' LAREG ')'
287         {
288                 $$.type = $3 | I_INDIR;
289                 $$.sym = S;
290                 $$.offset = $1;
291         }
292 |       '(' ')'
293         {
294                 $$.type = D_NONE | I_INDIR;
295                 $$.sym = S;
296                 $$.offset = 0;
297         }
298 |       con '(' ')'
299         {
300                 $$.type = D_NONE | I_INDIR;
301                 $$.sym = S;
302                 $$.offset = $1;
303         }
304 |       name
305
306 name:
307         LNAME offset '(' pointer ')'
308         {
309                 $$.type = $4;
310                 $$.sym = $1;
311                 $$.offset = $2;
312         }
313 |       LNAME '<' '>' offset '(' LSB ')'
314         {
315                 $$.type = D_STATIC;
316                 $$.sym = $1;
317                 $$.offset = $4;
318         }
319
320 offset:
321         {
322                 $$ = 0;
323         }
324 |       '+' con
325         {
326                 $$ = $2;
327         }
328 |       '-' con
329         {
330                 $$ = -$2;
331         }
332
333 pointer:
334         LSB
335 |       LSP
336 |       LFP
337
338 con:
339         LCONST
340 |       LVAR
341         {
342                 $$ = $1->value;
343         }
344 |       '-' con
345         {
346                 $$ = -$2;
347         }
348 |       '+' con
349         {
350                 $$ = $2;
351         }
352 |       '~' con
353         {
354                 $$ = ~$2;
355         }
356 |       '(' expr ')'
357         {
358                 $$ = $2;
359         }
360
361 expr:
362         con
363 |       expr '+' expr
364         {
365                 $$ = $1 + $3;
366         }
367 |       expr '-' expr
368         {
369                 $$ = $1 - $3;
370         }
371 |       expr '*' expr
372         {
373                 $$ = $1 * $3;
374         }
375 |       expr '/' expr
376         {
377                 $$ = $1 / $3;
378         }
379 |       expr '%' expr
380         {
381                 $$ = $1 % $3;
382         }
383 |       expr '<' '<' expr
384         {
385                 $$ = $1 << $4;
386         }
387 |       expr '>' '>' expr
388         {
389                 $$ = $1 >> $4;
390         }
391 |       expr '&' expr
392         {
393                 $$ = $1 & $3;
394         }
395 |       expr '^' expr
396         {
397                 $$ = $1 ^ $3;
398         }
399 |       expr '|' expr
400         {
401                 $$ = $1 | $3;
402         }