4 /* This file contains two arrays with information concerning the C_INSTR tokens:
5 * t_C_info C_info[]; - Describes the arguments of EM-instructions
6 * struct ? EM_instr[]; - Contains per entry:
7 * 1) The name of the C_INSTR
8 * 2) The type of its argument, an index in
10 * 3) The segment for which code/data must
12 * The array is sorted on the C_INSTR-name.
14 * Furthermore there are two routines present in this file :
15 * set_C_instr_info( instr) - It looks 'instr' up in EM_instr[] and
16 * char *instr; - sets the global variables
17 * - 'C_instr_info' and 'segment'.
19 * arg_type( arg) - 'arg' must be a string starting with a '$'
20 * char *arg; - and a number. arg_type() will return the
21 * - type of the 'number'th argment of the current
23 * - For example, if the EM_table contains:
24 * C_loc ==> "pushl $1".
25 * then arg_type( "$1") will return ARITH.
30 /* NO_ARGS */ { "()\n{\n",
34 /* C_ARG */ { "( c)\narith c;\n{\n",
38 /* D_ARG */ { "( d)\narith d;\n{\n",
42 /* F_ARG */ { "( f)\narith f;\n{\n",
46 /* L_ARG */ { "( l)\narith l;\n{\n",
49 { "(l >= 0 ? l + EM_BSIZE : l)", 0, 0, 0}},
50 /* N_ARG */ { "( n)\narith n;\n{\n",
54 /* O_ARG */ { "( o)\narith o;\n{\n",
58 /* R_ARG */ { "( r)\narith r;\n{\n",
62 /* S_ARG */ { "( s)\narith s;\n{\n",
66 /* Z_ARG */ { "( z)\narith z;\n{\n",
70 /* W_ARG */ { "( w)\narith w;\n{\n",
74 /* EXTERNAL */ { "( g)\narith g;\n{\n",
75 { STRING, ARITH, 0, 0},
76 { "FAKE-ARGUMENT", "g", 0, 0},
77 { "extnd_hol( B_holno)", "g", 0, 0}},
78 /* EXTERNAL_DNAM*/ { "( g, o)\nchar *g;\narith o;\n{\n",
79 { STRING, ARITH, 0, 0},
81 { "extnd_dnam( g)", "o", 0, 0}},
82 /* EXTERNAL_DLB */ { "( g, o)\nlabel g;\narith o;\n{\n",
83 { LABEL, ARITH, 0, 0},
85 { "extnd_dlb( g)", "o", 0, 0}},
86 /* P_ARG */ { "( p)\nchar *p;\n{\n",
89 { "extnd_name( p)", 0, 0, 0}},
90 /* B_ARG */ { "( b)\nlabel b;\n{\n",
93 { "extnd_ilb( b, B_procno)", 0, 0, 0}},
94 /* STRING+ARITH */ { "( val, sz)\nchar *val;\narith sz;\n{\n",
95 { STRING, ARITH, 0, 0},
97 { "val", "sz", 0, 0}},
98 /* BSS_EXT_DNAM */ { "( n, g, o, i)\nchar *g;\narith n, o;\nint i;\n{\n",
99 { ARITH, STRING, ARITH, INT},
100 { "n", "g", "o", "i"},
101 { "n", "extnd_dnam( g)", "o", "i"}},
102 /* BSS_EXT_DLB */ { "( n, g, o, i)\nlabel g;\narith n, o;\nint i;\n{\n",
103 { ARITH, LABEL, ARITH, INT},
104 { "n", "g", "o", "i"},
105 { "n", "extnd_dlb( g)", "o", "i"}},
106 /* BSS_STR+AR */ { "( n, val, sz, i)\nchar *val;\narith n, sz;\nint i;\n{\n",
107 { ARITH, STRING, ARITH, INT},
108 { "n", "val", "sz", "i"},
109 { "n", "val", "sz", "i"}},
110 /* BSS_W_ARG */ { "( n, w, i)\narith n, w;\nint i;\n{\n",
111 { ARITH, ARITH, INT, 0},
113 { "n", "w", "i", 0}},
114 /* BSS_PNAM */ { "( n, p, i)\narith n;\nchar *p;int i;\n\n{\n",
115 { ARITH, STRING, INT, 0},
117 { "n", "extnd_name( p)", "i", 0}},
118 /* BSS_ILB */ { "( n, b, i)\narith n;\nlabel b;int i;\n\n{\n",
119 { ARITH, STRING, INT, 0},
121 { "n", "extnd_ilb( b, B_procno)", "i", 0}},
122 /* ID+N_ARG */ { "( p, n)\nchar *p;\narith n;\n{\n",
123 { STRING, ARITH, 0, 0},
125 { "extnd_name( p)", "n", 0, 0}},
126 /* ARITH+ARITH */ { "( n, w)\narith n, w;\n{\n",
127 { ARITH, ARITH, 0, 0},
130 /* EXT_DNAM */ { "( g)\nchar *g;\n{\n",
133 { "extnd_dnam( g)", 0, 0, 0}},
134 /* EXT_DLB */ { "( g)\nlabel g;\n{\n",
137 { "extnd_dlb( g)", 0, 0, 0}},
138 /* ONE_INT */ { "( i)\nint i;\n{\n",
142 /* _STRING */ { "( str)\nchar *str;\n{\n",
150 struct { char *name; int class, segment;}
151 EM_instr[ N_INSTR ] = {
152 { "C_aar", W_ARG, SEGTXT},
153 { "C_aar_narg", NO_ARGS, SEGTXT},
154 { "C_adf", W_ARG, SEGTXT},
155 { "C_adf_narg", NO_ARGS, SEGTXT},
156 { "C_adi", W_ARG, SEGTXT},
157 { "C_adi_narg", NO_ARGS, SEGTXT},
158 { "C_adp", F_ARG, SEGTXT},
159 { "C_ads", W_ARG, SEGTXT},
160 { "C_ads_narg", NO_ARGS, SEGTXT},
161 { "C_adu", W_ARG, SEGTXT},
162 { "C_adu_narg", NO_ARGS, SEGTXT},
163 { "C_and", W_ARG, SEGTXT},
164 { "C_and_narg", NO_ARGS, SEGTXT},
165 { "C_asp", F_ARG, SEGTXT},
166 { "C_ass", W_ARG, SEGTXT},
167 { "C_ass_narg", NO_ARGS, SEGTXT},
168 { "C_beq", B_ARG, SEGTXT},
169 { "C_bge", B_ARG, SEGTXT},
170 { "C_bgt", B_ARG, SEGTXT},
171 { "C_ble", B_ARG, SEGTXT},
172 { "C_blm", Z_ARG, SEGTXT},
173 { "C_bls", W_ARG, SEGTXT},
174 { "C_bls_narg", NO_ARGS, SEGTXT},
175 { "C_blt", B_ARG, SEGTXT},
176 { "C_bne", B_ARG, SEGTXT},
177 { "C_bra", B_ARG, SEGTXT},
178 { "C_bss_cst", BSS_W_ARG, SEGBSS},
179 { "C_bss_dlb", BSS_EXT_DLB, SEGBSS},
180 { "C_bss_dnam", BSS_EXT_DNAM, SEGBSS},
181 { "C_bss_fcon", BSS_STR_AR, SEGBSS},
182 { "C_bss_icon", BSS_STR_AR, SEGBSS},
183 { "C_bss_ilb", BSS_ILB, SEGBSS},
184 { "C_bss_pnam", BSS_PNAM, SEGBSS},
185 { "C_bss_ucon", BSS_STR_AR, SEGBSS},
186 { "C_cai", NO_ARGS, SEGTXT},
187 { "C_cal", P_ARG, SEGTXT},
188 { "C_cff", NO_ARGS, SEGTXT},
189 { "C_cfi", NO_ARGS, SEGTXT},
190 { "C_cfu", NO_ARGS, SEGTXT},
191 { "C_cif", NO_ARGS, SEGTXT},
192 { "C_cii", NO_ARGS, SEGTXT},
193 { "C_ciu", NO_ARGS, SEGTXT},
194 { "C_close", NO_ARGS, NOSEG},
195 { "C_cmf", W_ARG, SEGTXT},
196 { "C_cmf_narg", NO_ARGS, SEGTXT},
197 { "C_cmi", W_ARG, SEGTXT},
198 { "C_cmi_narg", NO_ARGS, SEGTXT},
199 { "C_cmp", NO_ARGS, SEGTXT},
200 { "C_cms", W_ARG, SEGTXT},
201 { "C_cms_narg", NO_ARGS, SEGTXT},
202 { "C_cmu", W_ARG, SEGTXT},
203 { "C_cmu_narg", NO_ARGS, SEGTXT},
204 { "C_com", W_ARG, SEGTXT},
205 { "C_com_narg", NO_ARGS, SEGTXT},
206 { "C_con_cst", C_ARG, SEGCON},
207 { "C_con_dlb", EXTERNAL_DLB, SEGCON},
208 { "C_con_dnam", EXTERNAL_DNAM, SEGCON},
209 { "C_con_fcon", STRING_ARITH, SEGCON},
210 { "C_con_icon", STRING_ARITH, SEGCON},
211 { "C_con_ilb", B_ARG, SEGCON},
212 { "C_con_pnam", P_ARG, SEGCON},
213 { "C_con_scon", STRING_ARITH, SEGCON},
214 { "C_con_ucon", STRING_ARITH, SEGCON},
215 { "C_csa", W_ARG, SEGTXT},
216 { "C_csa_narg", NO_ARGS, SEGTXT},
217 { "C_csb", W_ARG, SEGTXT},
218 { "C_csb_narg", NO_ARGS, SEGTXT},
219 { "C_cst", C_ARG, NOSEG},
220 { "C_cuf", NO_ARGS, SEGTXT},
221 { "C_cui", NO_ARGS, SEGTXT},
222 { "C_cuu", NO_ARGS, SEGTXT},
223 { "C_db_sline", NO_ARGS, SEGTXT},
224 { "C_dch", NO_ARGS, SEGTXT},
225 { "C_dec", NO_ARGS, SEGTXT},
226 { "C_dee", EXTERNAL, SEGTXT},
227 { "C_dee_dlb", EXTERNAL_DLB, SEGTXT},
228 { "C_dee_dnam", EXTERNAL_DNAM, SEGTXT},
229 { "C_del", L_ARG, SEGTXT},
230 { "C_df_dlb", EXT_DLB, NOSEG},
231 { "C_df_dnam", EXT_DNAM, NOSEG},
232 { "C_df_ilb", B_ARG, SEGTXT},
233 { "C_dlb", STRING_ARITH, SEGTXT},
234 { "C_dnam", STRING_ARITH, SEGTXT},
235 { "C_dup", S_ARG, SEGTXT},
236 { "C_dus", W_ARG, SEGTXT},
237 { "C_dus_narg", NO_ARGS, SEGTXT},
238 { "C_dvf", W_ARG, SEGTXT},
239 { "C_dvf_narg", NO_ARGS, SEGTXT},
240 { "C_dvi", W_ARG, SEGTXT},
241 { "C_dvi_narg", NO_ARGS, SEGTXT},
242 { "C_dvu", W_ARG, SEGTXT},
243 { "C_dvu_narg", NO_ARGS, SEGTXT},
244 { "C_end", Z_ARG, SEGTXT},
245 { "C_end_narg", NO_ARGS, SEGTXT},
246 { "C_exa_dlb", EXT_DLB, NOSEG},
247 { "C_exa_dnam", EXT_DNAM, NOSEG},
248 { "C_exc", ARITH_ARITH, NOSEG},
249 { "C_exg", W_ARG, SEGTXT},
250 { "C_exg_narg", NO_ARGS, SEGTXT},
251 { "C_exp", P_ARG, SEGTXT},
252 { "C_fcon", STRING_ARITH, SEGTXT},
253 { "C_fef", W_ARG, SEGTXT},
254 { "C_fef_narg", NO_ARGS, SEGTXT},
255 { "C_fif", W_ARG, SEGTXT},
256 { "C_fif_narg", NO_ARGS, SEGTXT},
257 { "C_fil", EXTERNAL, SEGTXT},
258 { "C_fil_dlb", EXTERNAL_DLB, SEGTXT},
259 { "C_fil_dnam", EXTERNAL_DNAM, SEGTXT},
260 { "C_gto", EXTERNAL, SEGTXT},
261 { "C_gto_dlb", EXTERNAL_DLB, SEGTXT},
262 { "C_gto_dnam", EXTERNAL_DNAM, SEGTXT},
263 { "C_hol_cst", BSS_W_ARG, SEGHOL},
264 { "C_hol_dlb", BSS_EXT_DLB, SEGHOL},
265 { "C_hol_dnam", BSS_EXT_DNAM, SEGHOL},
266 { "C_hol_fcon", BSS_STR_AR, SEGHOL},
267 { "C_hol_icon", BSS_STR_AR, SEGHOL},
268 { "C_hol_ilb", BSS_ILB, SEGHOL},
269 { "C_hol_pnam", BSS_PNAM, SEGHOL},
270 { "C_hol_ucon", BSS_STR_AR, SEGHOL},
271 { "C_icon", STRING_ARITH, SEGTXT},
272 { "C_ilb", B_ARG, SEGTXT},
273 { "C_ina_dlb", EXT_DLB, SEGTXT},
274 { "C_ina_dnam", EXT_DNAM, SEGTXT},
275 { "C_inc", NO_ARGS, SEGTXT},
276 { "C_ine", EXTERNAL, SEGTXT},
277 { "C_ine_dlb", EXTERNAL_DLB, SEGTXT},
278 { "C_ine_dnam", EXTERNAL_DNAM, SEGTXT},
279 { "C_init", ARITH_ARITH, SEGTXT},
280 { "C_inl", L_ARG, SEGTXT},
281 { "C_inn", W_ARG, SEGTXT},
282 { "C_inn_narg", NO_ARGS, SEGTXT},
283 { "C_inp", P_ARG, NOSEG},
284 { "C_ior", W_ARG, SEGTXT},
285 { "C_ior_narg", NO_ARGS, SEGTXT},
286 { "C_jump", _STRING, SEGTXT},
287 { "C_lae", EXTERNAL, SEGTXT},
288 { "C_lae_dlb", EXTERNAL_DLB, SEGTXT},
289 { "C_lae_dnam", EXTERNAL_DNAM, SEGTXT},
290 { "C_lal", L_ARG, SEGTXT},
291 { "C_lar", W_ARG, SEGTXT},
292 { "C_lar_narg", NO_ARGS, SEGTXT},
293 { "C_ldc", D_ARG, SEGTXT},
294 { "C_lde", EXTERNAL, SEGTXT},
295 { "C_lde_dlb", EXTERNAL_DLB, SEGTXT},
296 { "C_lde_dnam", EXTERNAL_DNAM, SEGTXT},
297 { "C_ldf", F_ARG, SEGTXT},
298 { "C_ldl", L_ARG, SEGTXT},
299 { "C_lfr", S_ARG, SEGTXT},
300 { "C_lil", L_ARG, SEGTXT},
301 { "C_lim", NO_ARGS, SEGTXT},
302 { "C_lin", N_ARG, SEGTXT},
303 { "C_lni", NO_ARGS, SEGTXT},
304 { "C_loc", C_ARG, SEGTXT},
305 { "C_locals", N_ARG, SEGTXT},
306 { "C_loe", EXTERNAL, SEGTXT},
307 { "C_loe_dlb", EXTERNAL_DLB, SEGTXT},
308 { "C_loe_dnam", EXTERNAL_DNAM, SEGTXT},
309 { "C_lof", F_ARG, SEGTXT},
310 { "C_loi", O_ARG, SEGTXT},
311 { "C_lol", L_ARG, SEGTXT},
312 { "C_lor", R_ARG, SEGTXT},
313 { "C_los", W_ARG, SEGTXT},
314 { "C_los_narg", NO_ARGS, SEGTXT},
315 { "C_lpb", NO_ARGS, SEGTXT},
316 { "C_lpi", P_ARG, SEGTXT},
317 { "C_lxa", N_ARG, SEGTXT},
318 { "C_lxl", N_ARG, SEGTXT},
319 { "C_magic", NO_ARGS, NOSEG},
320 { "C_mes_begin", ONE_INT, NOSEG},
321 { "C_mes_end", NO_ARGS, NOSEG},
322 { "C_mlf", W_ARG, SEGTXT},
323 { "C_mlf_narg", NO_ARGS, SEGTXT},
324 { "C_mli", W_ARG, SEGTXT},
325 { "C_mli_narg", NO_ARGS, SEGTXT},
326 { "C_mlu", W_ARG, SEGTXT},
327 { "C_mlu_narg", NO_ARGS, SEGTXT},
328 { "C_mon", NO_ARGS, SEGTXT},
329 { "C_ngf", W_ARG, SEGTXT},
330 { "C_ngf_narg", NO_ARGS, SEGTXT},
331 { "C_ngi", W_ARG, SEGTXT},
332 { "C_ngi_narg", NO_ARGS, SEGTXT},
333 { "C_nop", NO_ARGS, SEGTXT},
334 { "C_open", _STRING, NOSEG},
335 { "C_pnam", P_ARG, NOSEG},
336 { "C_pro", P_ARG, SEGTXT},
337 { "C_pro_narg", NO_ARGS, SEGTXT},
338 { "C_prolog", NO_ARGS, SEGTXT},
339 { "C_rck", W_ARG, SEGTXT},
340 { "C_rck_narg", NO_ARGS, SEGTXT},
341 { "C_ret", Z_ARG, SEGTXT},
342 { "C_rmi", W_ARG, SEGTXT},
343 { "C_rmi_narg", NO_ARGS, SEGTXT},
344 { "C_rmu", W_ARG, SEGTXT},
345 { "C_rmu_narg", NO_ARGS, SEGTXT},
346 { "C_rol", W_ARG, SEGTXT},
347 { "C_rol_narg", NO_ARGS, SEGTXT},
348 { "C_rom_cst", C_ARG, SEGROM},
349 { "C_rom_dlb", EXTERNAL_DLB, SEGROM},
350 { "C_rom_dnam", EXTERNAL_DNAM, SEGROM},
351 { "C_rom_fcon", STRING_ARITH, SEGROM},
352 { "C_rom_icon", STRING_ARITH, SEGROM},
353 { "C_rom_ilb", B_ARG, SEGROM},
354 { "C_rom_pnam", P_ARG, SEGROM},
355 { "C_rom_scon", STRING_ARITH, SEGROM},
356 { "C_rom_ucon", STRING_ARITH, SEGROM},
357 { "C_ror", W_ARG, SEGTXT},
358 { "C_ror_narg", NO_ARGS, SEGTXT},
359 { "C_rtt", NO_ARGS, SEGTXT},
360 { "C_sar", W_ARG, SEGTXT},
361 { "C_sar_narg", NO_ARGS, SEGTXT},
362 { "C_sbf", W_ARG, SEGTXT},
363 { "C_sbf_narg", NO_ARGS, SEGTXT},
364 { "C_sbi", W_ARG, SEGTXT},
365 { "C_sbi_narg", NO_ARGS, SEGTXT},
366 { "C_sbs", W_ARG, SEGTXT},
367 { "C_sbs_narg", NO_ARGS, SEGTXT},
368 { "C_sbu", W_ARG, SEGTXT},
369 { "C_sbu_narg", NO_ARGS, SEGTXT},
370 { "C_scon", STRING_ARITH, NOSEG},
371 { "C_sde", EXTERNAL, SEGTXT},
372 { "C_sde_dlb", EXTERNAL_DLB, SEGTXT},
373 { "C_sde_dnam", EXTERNAL_DNAM, SEGTXT},
374 { "C_sdf", F_ARG, SEGTXT},
375 { "C_sdl", L_ARG, SEGTXT},
376 { "C_set", W_ARG, SEGTXT},
377 { "C_set_narg", NO_ARGS, SEGTXT},
378 { "C_sig", NO_ARGS, SEGTXT},
379 { "C_sil", L_ARG, SEGTXT},
380 { "C_sim", NO_ARGS, SEGTXT},
381 { "C_sli", W_ARG, SEGTXT},
382 { "C_sli_narg", NO_ARGS, SEGTXT},
383 { "C_slu", W_ARG, SEGTXT},
384 { "C_slu_narg", NO_ARGS, SEGTXT},
385 { "C_sri", W_ARG, SEGTXT},
386 { "C_sri_narg", NO_ARGS, SEGTXT},
387 { "C_sru", W_ARG, SEGTXT},
388 { "C_sru_narg", NO_ARGS, SEGTXT},
389 { "C_ste", EXTERNAL, SEGTXT},
390 { "C_ste_dlb", EXTERNAL_DLB, SEGTXT},
391 { "C_ste_dnam", EXTERNAL_DNAM, SEGTXT},
392 { "C_stf", F_ARG, SEGTXT},
393 { "C_sti", O_ARG, SEGTXT},
394 { "C_stl", L_ARG, SEGTXT},
395 { "C_str", R_ARG, SEGTXT},
396 { "C_sts", W_ARG, SEGTXT},
397 { "C_sts_narg", NO_ARGS, SEGTXT},
398 { "C_teq", NO_ARGS, SEGTXT},
399 { "C_tge", NO_ARGS, SEGTXT},
400 { "C_tgt", NO_ARGS, SEGTXT},
401 { "C_tle", NO_ARGS, SEGTXT},
402 { "C_tlt", NO_ARGS, SEGTXT},
403 { "C_tne", NO_ARGS, SEGTXT},
404 { "C_trp", NO_ARGS, SEGTXT},
405 { "C_ucon", STRING_ARITH, NOSEG},
406 { "C_xor", W_ARG, SEGTXT},
407 { "C_xor_narg", NO_ARGS, SEGTXT},
408 { "C_zeq", B_ARG, SEGTXT},
409 { "C_zer", W_ARG, SEGTXT},
410 { "C_zer_narg", NO_ARGS, SEGTXT},
411 { "C_zge", B_ARG, SEGTXT},
412 { "C_zgt", B_ARG, SEGTXT},
413 { "C_zle", B_ARG, SEGTXT},
414 { "C_zlt", B_ARG, SEGTXT},
415 { "C_zne", B_ARG, SEGTXT},
416 { "C_zre", EXTERNAL, SEGTXT},
417 { "C_zre_dlb", EXTERNAL_DLB, SEGTXT},
418 { "C_zre_dnam", EXTERNAL_DNAM, SEGTXT},
419 { "C_zrf", W_ARG, SEGTXT},
420 { "C_zrf_narg", NO_ARGS, SEGTXT},
421 { "C_zrl", L_ARG, SEGTXT}
424 set_C_instr_info( instr)
427 int low, high, mid, rel;
433 mid = ( low + high) / 2;
434 rel = strcmp( instr, EM_instr[mid].name);
438 else if ( high == low) {
439 fprint(STDERR, "ERROR : can't find >>%s<< !!\n", instr);
445 /* watch it, mit is truncated !! */
446 low = ( mid == low ? low + 1: mid);
448 C_instr_info = &C_info[ EM_instr[mid].class];
449 segment = EM_instr[mid].segment;
455 /* return argument-type from $i */
460 i = *(arg+1) - '0' - 1;
461 return( C_instr_info->arg_type[i]);