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".
5 #define RCSID4 "$Id: mach4.c,v 1.4 1994/06/24 13:41:17 ceriel Exp $"
8 * VAX-11 machine dependent yacc syntax rules
11 /* Branch instructions with as yet unknown size get special treatment */
17 { if ((unsigned) $2 < 0x100) {
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; }
30 { ext_branch($1, $5); }
31 | OP3_l_V_Be { op_ind = 0; opnd[0].size = 4;
34 opnd ',' opnd ',' expr
35 { ext_branch($1, $7); }
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; }
45 : OP1_BX { opnd[0].size = $1>>16; $$ = $1 & 0xffff; }
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; }
71 : OP2_l_Bb { opnd[0].size = 4; opnd[1].size = 1; $$ = $1; }
75 : OP3_b_b_b { opnd[0].size = 1; opnd[1].size = 1;
76 opnd[2].size = 1; $$ = $1;
78 | OP3_b_l_l { opnd[0].size = 1; opnd[1].size = 4;
79 opnd[2].size = 4; $$ = $1;
81 | OP3_b_u_u { opnd[0].size = 1; opnd[1].size = 0;
82 opnd[2].size = 0; $$ = $1;
84 | OP3_l_l_l { opnd[0].size = 4; opnd[1].size = 4;
85 opnd[2].size = 4; $$ = $1;
87 | OP3_u_u_u { opnd[0].size = 0; opnd[1].size = 0;
88 opnd[2].size = 0; $$ = $1;
90 | OP3_w_w_w { opnd[0].size = 2; opnd[1].size = 2;
91 opnd[2].size = 2; $$ = $1;
93 | OP3_b_w_A { opnd[0].size = 1; opnd[1].size = 2;
94 opnd[2].size = -2; $$ = $1;
96 | OP3_l_w_A { opnd[0].size = 4; opnd[1].size = 2;
97 opnd[2].size = -2; $$ = $1;
99 | OP3_u_w_A { opnd[0].size = 0; opnd[1].size = 2;
100 opnd[2].size = -2; $$ = $1;
102 | OP3_w_A_A { opnd[0].size = 2; opnd[1].size = -2;
103 opnd[2].size = -2; $$ = $1;
105 | OP3_w_A_l { opnd[0].size = 2; opnd[1].size = -2;
106 opnd[2].size = 4; $$ = $1;
111 : OP3_l_l_Bb { opnd[0].size = 4; opnd[1].size = 4;
112 opnd[2].size = 1; $$ = $1;
114 | OP3_l_V_Bb { opnd[0].size = 4; opnd[1].size = -1;
115 opnd[2].size = 1; $$ = $1;
120 : OP4_l_b_V_l { opnd[0].size = 4; opnd[1].size = 1;
121 opnd[2].size = -1; opnd[3].size = 4;
124 | OP4_l_l_b_V { opnd[0].size = 4; opnd[1].size = 4;
125 opnd[2].size = 1; opnd[3].size = -1;
128 | OP4_l_l_l_u { opnd[0].size = 4; opnd[1].size = 4;
129 opnd[2].size = 4; opnd[3].size = 0;
132 | OP4_l_u_l_l { opnd[0].size = 4; opnd[1].size = 0;
133 opnd[2].size = 4; opnd[3].size = 4;
136 | OP4_w_A_w_A { opnd[0].size = 2; opnd[1].size = -2;
137 opnd[2].size = 2; opnd[3].size = -2;
140 | OP4_w_A_A_A { opnd[0].size = 2; opnd[1].size = -2;
141 opnd[2].size = -2; opnd[3].size = -2;
144 | OP4_A_l_w_A { opnd[0].size = -2; opnd[1].size = 4;
145 opnd[2].size = 2; opnd[3].size = -2;
148 | OP4_w_A_A_b { opnd[0].size = 2; opnd[1].size = -2;
149 opnd[2].size = -2; opnd[3].size = 1;
155 : OP4_b_b_b_Bw { opnd[0].size = 1; opnd[1].size = 1;
156 opnd[2].size = 1; opnd[3].size = 2;
159 | OP4_l_l_l_Bw { opnd[0].size = 4; opnd[1].size = 4;
160 opnd[2].size = 4; opnd[3].size = 2;
163 | OP4_u_u_u_Bw { opnd[0].size = 0; opnd[1].size = 0;
164 opnd[2].size = 0; opnd[3].size = 2;
167 | OP4_w_w_w_Bw { opnd[0].size = 2; opnd[1].size = 2;
168 opnd[2].size = 2; opnd[3].size = 2;
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;
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;
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;
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;
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;
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;
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;
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;
216 : CASE_X_X_X { opnd[0].size = ($1>>16);
217 opnd[1].size = ($1>>16);
218 opnd[2].size = ($1>>16);
225 | OP1_O opnd { $$ = $1; }
226 | OP1_B expr { $$ = $1;
228 RELOMOVE(opnd[0].relo, relonami);
229 opnd[0].mode = DISPL;
232 | OP2_O_O opnd ',' opnd
234 | OP2_O_B opnd ',' expr
236 opnd[op_ind].exp = $4;
237 RELOMOVE(opnd[op_ind].relo, relonami);
238 opnd[op_ind].mode = DISPL;
241 | OP3_O_O_O opnd ',' opnd ',' opnd
243 | OP3_O_O_B opnd ',' opnd ',' expr
245 opnd[op_ind].exp = $6;
246 RELOMOVE(opnd[op_ind].relo, relonami);
247 opnd[op_ind].mode = DISPL;
250 | OP4_O_O_O_O opnd ',' opnd ',' opnd ',' opnd
252 | OP4_O_O_O_B opnd ',' opnd ',' opnd ',' expr
254 opnd[op_ind].exp = $8;
255 RELOMOVE(opnd[op_ind].relo, relonami);
256 opnd[op_ind].mode = DISPL;
259 | OP5_O_O_O_O_O opnd ',' opnd ',' opnd ',' opnd ',' opnd
261 | OP6_O_O_O_O_O_O opnd ',' opnd ',' opnd ',' opnd ',' opnd ',' opnd
263 | CASE_O_O_O opnd ',' opnd ',' opnd
268 : REG { opnd[op_ind].mode = REG_MODE;
269 opnd[op_ind].reg = $1;
270 opnd[op_ind].index_reg = -1;
273 | eax { opnd[op_ind].index_reg = -1;
276 | eax '[' REG ']' { opnd[op_ind].index_reg = $3;
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);
286 | '*' expr { opnd[op_ind].exp = $2;
287 opnd[op_ind].mode = REL_DEF;
288 RELOMOVE(opnd[op_ind].relo, relonami);
290 | expr { opnd[op_ind].exp = $1;
291 opnd[op_ind].mode = REL;
292 RELOMOVE(opnd[op_ind].relo, relonami);
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);
299 | '(' REG ')' { opnd[op_ind].mode = REGDEF_MODE;
300 opnd[op_ind].reg = $2;
302 | '(' REG ')' '+' { opnd[op_ind].mode = AI_MODE;
303 opnd[op_ind].reg = $2;
305 | '*' '(' REG ')' '+'
306 { opnd[op_ind].mode = AI_DEF_MODE;
307 opnd[op_ind].reg = $3;
309 | '-' '(' REG ')' { opnd[op_ind].mode = AD_MODE;
310 opnd[op_ind].reg = $3;
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);
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);