Pristine Ack-5.5
[Ack-5.5.git] / mach / vax4 / as / mach4.c
1 /*
2  * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  */
5 #define RCSID4 "$Id: mach4.c,v 1.4 1994/06/24 13:41:17 ceriel Exp $"
6
7 /*
8  * VAX-11 machine dependent yacc syntax rules
9  */
10
11 /* Branch instructions with as yet unknown size get special treatment */
12
13 operation
14         :
15                                 { op_ind = 0; }
16                 oper
17                                 { if ((unsigned) $2 < 0x100) {
18                                         emit1((int)$2);
19                                   }
20                                   else {
21                                         emit1((int)$2&0xff);
22                                         emit1((int)$2>>8);
23                                   }
24                                   operands();
25                                 }
26         |       OP1_Bx expr     { branch($1, $2); }
27         |       OP1_Be expr     { op_ind = 0; ext_branch($1, $2); }
28         |       OP2_l_Be        { op_ind = 0; opnd[0].size = 4; }
29                 opnd ',' expr
30                                 { ext_branch($1, $5); }
31         |       OP3_l_V_Be      { op_ind = 0; opnd[0].size = 4;
32                                   opnd[1].size = -1;
33                                 }
34                 opnd ',' opnd ',' expr
35                                 { ext_branch($1, $7); }
36         ;
37
38 OP1_O
39         :       OP1_X           { opnd[0].size = $1>>16; $$ = $1 & 0xffff; }
40         |       OP1_A           { opnd[0].size = -2; $$ = $1; }
41         |       OP1_u           { opnd[0].size = 0; $$ = $1; }
42         ;
43
44 OP1_B
45         :       OP1_BX          { opnd[0].size = $1>>16; $$ = $1 & 0xffff; }
46         ;
47
48 OP2_O_O
49         :       OP2_b_b         { opnd[0].size = 1; opnd[1].size = 1; $$ = $1; }
50         |       OP2_b_l         { opnd[0].size = 1; opnd[1].size = 4; $$ = $1; }
51         |       OP2_b_u         { opnd[0].size = 1; opnd[1].size = 0; $$ = $1; }
52         |       OP2_b_w         { opnd[0].size = 1; opnd[1].size = 2; $$ = $1; }
53         |       OP2_l_b         { opnd[0].size = 4; opnd[1].size = 1; $$ = $1; }
54         |       OP2_l_l         { opnd[0].size = 4; opnd[1].size = 4; $$ = $1; }
55         |       OP2_l_u         { opnd[0].size = 4; opnd[1].size = 0; $$ = $1; }
56         |       OP2_l_w         { opnd[0].size = 4; opnd[1].size = 2; $$ = $1; }
57         |       OP2_u_b         { opnd[0].size = 0; opnd[1].size = 1; $$ = $1; }
58         |       OP2_u_l         { opnd[0].size = 0; opnd[1].size = 4; $$ = $1; }
59         |       OP2_u_u         { opnd[0].size = 0; opnd[1].size = 0; $$ = $1; }
60         |       OP2_u_w         { opnd[0].size = 0; opnd[1].size = 2; $$ = $1; }
61         |       OP2_w_b         { opnd[0].size = 2; opnd[1].size = 1; $$ = $1; }
62         |       OP2_w_l         { opnd[0].size = 2; opnd[1].size = 4; $$ = $1; }
63         |       OP2_w_u         { opnd[0].size = 2; opnd[1].size = 0; $$ = $1; }
64         |       OP2_w_w         { opnd[0].size = 2; opnd[1].size = 2; $$ = $1; }
65         |       OP2_A_l         { opnd[0].size = -2;opnd[1].size = 4; $$ = $1; }
66         |       OP2_l_A         { opnd[0].size = 4; opnd[1].size = -2;$$ = $1; }
67         |       OP2_A_A         { opnd[0].size = -2;opnd[1].size = -2;$$ = $1; }
68         ;
69
70 OP2_O_B
71         :       OP2_l_Bb        { opnd[0].size = 4; opnd[1].size = 1; $$ = $1; }
72         ;
73
74 OP3_O_O_O
75         :       OP3_b_b_b       { opnd[0].size = 1; opnd[1].size = 1;
76                                   opnd[2].size = 1; $$ = $1;
77                                 }
78         |       OP3_b_l_l       { opnd[0].size = 1; opnd[1].size = 4;
79                                   opnd[2].size = 4; $$ = $1;
80                                 }
81         |       OP3_b_u_u       { opnd[0].size = 1; opnd[1].size = 0;
82                                   opnd[2].size = 0; $$ = $1;
83                                 }
84         |       OP3_l_l_l       { opnd[0].size = 4; opnd[1].size = 4;
85                                   opnd[2].size = 4; $$ = $1;
86                                 }
87         |       OP3_u_u_u       { opnd[0].size = 0; opnd[1].size = 0;
88                                   opnd[2].size = 0; $$ = $1;
89                                 }
90         |       OP3_w_w_w       { opnd[0].size = 2; opnd[1].size = 2;
91                                   opnd[2].size = 2; $$ = $1;
92                                 }
93         |       OP3_b_w_A       { opnd[0].size = 1; opnd[1].size = 2;
94                                   opnd[2].size = -2; $$ = $1;
95                                 }
96         |       OP3_l_w_A       { opnd[0].size = 4; opnd[1].size = 2;
97                                   opnd[2].size = -2; $$ = $1;
98                                 }
99         |       OP3_u_w_A       { opnd[0].size = 0; opnd[1].size = 2;
100                                   opnd[2].size = -2; $$ = $1;
101                                 }
102         |       OP3_w_A_A       { opnd[0].size = 2; opnd[1].size = -2;
103                                   opnd[2].size = -2; $$ = $1;
104                                 }
105         |       OP3_w_A_l       { opnd[0].size = 2; opnd[1].size = -2;
106                                   opnd[2].size = 4; $$ = $1;
107                                 }
108         ;
109
110 OP3_O_O_B
111         :       OP3_l_l_Bb      { opnd[0].size = 4; opnd[1].size = 4;
112                                   opnd[2].size = 1; $$ = $1;
113                                 }
114         |       OP3_l_V_Bb      { opnd[0].size = 4; opnd[1].size = -1;
115                                   opnd[2].size = 1; $$ = $1;
116                                 }
117         ;
118
119 OP4_O_O_O_O
120         :       OP4_l_b_V_l     { opnd[0].size = 4; opnd[1].size = 1;
121                                   opnd[2].size = -1; opnd[3].size = 4;
122                                   $$ = $1;
123                                 }
124         |       OP4_l_l_b_V     { opnd[0].size = 4; opnd[1].size = 4;
125                                   opnd[2].size = 1; opnd[3].size = -1;
126                                   $$ = $1;
127                                 }
128         |       OP4_l_l_l_u     { opnd[0].size = 4; opnd[1].size = 4;
129                                   opnd[2].size = 4; opnd[3].size = 0;
130                                   $$ = $1;
131                                 }
132         |       OP4_l_u_l_l     { opnd[0].size = 4; opnd[1].size = 0;
133                                   opnd[2].size = 4; opnd[3].size = 4;
134                                   $$ = $1;
135                                 }
136         |       OP4_w_A_w_A     { opnd[0].size = 2; opnd[1].size = -2;
137                                   opnd[2].size = 2; opnd[3].size = -2;
138                                   $$ = $1;
139                                 }
140         |       OP4_w_A_A_A     { opnd[0].size = 2; opnd[1].size = -2;
141                                   opnd[2].size = -2; opnd[3].size = -2;
142                                   $$ = $1;
143                                 }
144         |       OP4_A_l_w_A     { opnd[0].size = -2; opnd[1].size = 4;
145                                   opnd[2].size = 2; opnd[3].size = -2;
146                                   $$ = $1;
147                                 }
148         |       OP4_w_A_A_b     { opnd[0].size = 2; opnd[1].size = -2;
149                                   opnd[2].size = -2; opnd[3].size = 1;
150                                   $$ = $1;
151                                 }
152         ;       
153
154 OP4_O_O_O_B
155         :       OP4_b_b_b_Bw    { opnd[0].size = 1; opnd[1].size = 1;
156                                   opnd[2].size = 1; opnd[3].size = 2;
157                                   $$ = $1;
158                                 }
159         |       OP4_l_l_l_Bw    { opnd[0].size = 4; opnd[1].size = 4;
160                                   opnd[2].size = 4; opnd[3].size = 2;
161                                   $$ = $1;
162                                 }
163         |       OP4_u_u_u_Bw    { opnd[0].size = 0; opnd[1].size = 0;
164                                   opnd[2].size = 0; opnd[3].size = 2;
165                                   $$ = $1;
166                                 }
167         |       OP4_w_w_w_Bw    { opnd[0].size = 2; opnd[1].size = 2;
168                                   opnd[2].size = 2; opnd[3].size = 2;
169                                   $$ = $1;
170                                 }
171         ;
172
173 OP5_O_O_O_O_O
174         :       OP5_u_b_u_l_u   { opnd[0].size = 0; opnd[1].size = 1;
175                                   opnd[2].size = 0; opnd[3].size = 4;
176                                   opnd[4].size = 0; $$ = $1;
177                                 }
178         |       OP5_u_w_u_l_u   { opnd[0].size = 0; opnd[1].size = 2;
179                                   opnd[2].size = 0; opnd[3].size = 4;
180                                   opnd[4].size = 0; $$ = $1;
181                                 }
182         |       OP5_w_A_A_w_A   { opnd[0].size = 2; opnd[1].size = -2;
183                                   opnd[2].size = -2; opnd[3].size = 2;
184                                   opnd[4].size = -2; $$ = $1;
185                                 }
186         |       OP5_w_A_b_w_A   { opnd[0].size = 2; opnd[1].size = -2;
187                                   opnd[2].size = 1; opnd[3].size = 2;
188                                   opnd[4].size = -2; $$ = $1;
189                                 }
190         ;
191
192 OP6_O_O_O_O_O_O
193         :       OP6_l_l_l_l_l_l { opnd[0].size = 4; opnd[1].size = 4;
194                                   opnd[2].size = 4; opnd[3].size = 4;
195                                   opnd[4].size = 4; opnd[5].size = 4;
196                                   $$ = $1;
197                                 }
198         |       OP6_w_A_b_A_w_A { opnd[0].size = 2; opnd[1].size = -2;
199                                   opnd[2].size = 1; opnd[3].size = -2;
200                                   opnd[4].size = 2; opnd[5].size = -2;
201                                   $$ = $1;
202                                 }
203         |       OP6_w_A_w_A_w_A { opnd[0].size = 2; opnd[1].size = -2;
204                                   opnd[2].size = 2; opnd[3].size = -2;
205                                   opnd[4].size = 2; opnd[5].size = -2;
206                                   $$ = $1;
207                                 }
208         |       OP6_b_w_A_b_w_A { opnd[0].size = 1; opnd[1].size = 2;
209                                   opnd[2].size = -2; opnd[3].size = 1;
210                                   opnd[4].size = 2; opnd[5].size = -2;
211                                   $$ = $1;
212                                 }
213         ;
214
215 CASE_O_O_O
216         :       CASE_X_X_X      { opnd[0].size = ($1>>16);
217                                   opnd[1].size = ($1>>16);
218                                   opnd[2].size = ($1>>16);
219                                   $$ = $1 & 0xffff;
220                                 }
221         ;
222
223 oper
224         :       OP0
225         |       OP1_O opnd      { $$ = $1; }
226         |       OP1_B expr      { $$ = $1;
227                                   opnd[0].exp = $2;
228                                   RELOMOVE(opnd[0].relo, relonami);
229                                   opnd[0].mode = DISPL;
230                                   op_ind = 1;
231                                 }
232         |       OP2_O_O opnd ',' opnd   
233                                 { $$ = $1; }
234         |       OP2_O_B opnd ',' expr
235                                 { $$ = $1;
236                                   opnd[op_ind].exp = $4;
237                                   RELOMOVE(opnd[op_ind].relo, relonami);
238                                   opnd[op_ind].mode = DISPL;
239                                   op_ind++;
240                                 }
241         |       OP3_O_O_O opnd ',' opnd ',' opnd
242                                 { $$ = $1; }
243         |       OP3_O_O_B opnd ',' opnd ',' expr
244                                 { $$ = $1;
245                                   opnd[op_ind].exp = $6;
246                                   RELOMOVE(opnd[op_ind].relo, relonami);
247                                   opnd[op_ind].mode = DISPL;
248                                   op_ind++;
249                                 }
250         |       OP4_O_O_O_O opnd ',' opnd ',' opnd ',' opnd
251                                 { $$ = $1; }
252         |       OP4_O_O_O_B opnd ',' opnd ',' opnd ',' expr
253                                 { $$ = $1;
254                                   opnd[op_ind].exp = $8;
255                                   RELOMOVE(opnd[op_ind].relo, relonami);
256                                   opnd[op_ind].mode = DISPL;
257                                   op_ind++;
258                                 }
259         |       OP5_O_O_O_O_O opnd ',' opnd ',' opnd ',' opnd ',' opnd
260                                 { $$ = $1; }
261         |       OP6_O_O_O_O_O_O opnd ',' opnd ',' opnd ',' opnd ',' opnd ',' opnd
262                                 { $$ = $1; }
263         |       CASE_O_O_O opnd ',' opnd ',' opnd
264                                 { $$ = $1; }
265         ;
266
267 opnd
268         :       REG             { opnd[op_ind].mode = REG_MODE;
269                                   opnd[op_ind].reg = $1;
270                                   opnd[op_ind].index_reg = -1;
271                                   op_ind++;
272                                 }
273         |       eax             { opnd[op_ind].index_reg = -1;
274                                   op_ind++;
275                                 }
276         |       eax '[' REG ']' { opnd[op_ind].index_reg = $3;
277                                   op_ind++;
278                                 }
279         ;
280 eax
281         :       '$' expr        { opnd[op_ind].mode = IMM;
282                                   opnd[op_ind].exp = $2;
283                                   opnd[op_ind].index_reg = -1;
284                                   RELOMOVE(opnd[op_ind].relo, relonami);
285                                 }
286         |       '*' expr        { opnd[op_ind].exp = $2;
287                                   opnd[op_ind].mode = REL_DEF;
288                                   RELOMOVE(opnd[op_ind].relo, relonami);
289                                 }
290         |       expr            { opnd[op_ind].exp = $1;
291                                   opnd[op_ind].mode = REL;
292                                   RELOMOVE(opnd[op_ind].relo, relonami);
293                                 }
294         |       '*' '$' expr    { opnd[op_ind].mode = ABS;
295                                   opnd[op_ind].exp = $3;
296                                   opnd[op_ind].index_reg = -1;
297                                   RELOMOVE(opnd[op_ind].relo, relonami);
298                                 }
299         |       '(' REG ')'     { opnd[op_ind].mode = REGDEF_MODE;
300                                   opnd[op_ind].reg = $2;
301                                 }
302         |       '(' REG ')' '+' { opnd[op_ind].mode = AI_MODE;
303                                   opnd[op_ind].reg = $2;
304                                 }
305         |       '*' '(' REG ')' '+'
306                                 { opnd[op_ind].mode = AI_DEF_MODE;
307                                   opnd[op_ind].reg = $3;
308                                 }
309         |       '-' '(' REG ')' { opnd[op_ind].mode = AD_MODE;
310                                   opnd[op_ind].reg = $3;
311                                 }
312         |       expr '(' REG ')'
313                                 { opnd[op_ind].exp = $1;
314                                   opnd[op_ind].mode = DISPLL_MODE;
315                                   opnd[op_ind].reg = $3;
316                                   RELOMOVE(opnd[op_ind].relo, relonami);
317                                 }
318         |       '*' expr '(' REG ')'
319                                 { opnd[op_ind].exp = $2;
320                                   opnd[op_ind].mode = DISPLL_DEF_MODE;
321                                   opnd[op_ind].reg = $4;
322                                   RELOMOVE(opnd[op_ind].relo, relonami);
323                                 }
324         ;
325