Modify e2k-opcode-generator.c so it does generate CSV file instead of C header

This commit is contained in:
Nobody 2021-04-18 22:39:12 +03:00
parent e0892d32d3
commit 32f8ca3a7e
1 changed files with 87 additions and 62 deletions

View File

@ -6,6 +6,8 @@
static int mcpu; static int mcpu;
static int forward_incompat; static int forward_incompat;
#define GENERATE_CSV
void void
print_common_part_minimal (const char *type, const char *name, print_common_part_minimal (const char *type, const char *name,
const char *parse_args) const char *parse_args)
@ -13,12 +15,15 @@ print_common_part_minimal (const char *type, const char *name,
/* Note that elbrus-v1 "forward-compatible" instructions are generic ones and /* Note that elbrus-v1 "forward-compatible" instructions are generic ones and
shouldn't be placed under a special condition, while "forward-incompatible" shouldn't be placed under a special condition, while "forward-incompatible"
really should. */ really should. */
#ifdef GENERATE_CSV
printf("%s%d,%s", forward_incompat ? "=" : ">=", mcpu, name);
#else
if (mcpu >= 2 || forward_incompat) if (mcpu >= 2 || forward_incompat)
printf ("if (mcpu %s %d)\n", forward_incompat ? "==" : ">=", mcpu); printf ("if (mcpu %s %d)\n", forward_incompat ? "==" : ">=", mcpu);
printf ("{\n\tstatic %s dummy =", type); printf ("{\n\tstatic %s dummy =", type);
printf ("\n\t\t{\"%s\", %s", name, parse_args); printf ("\n\t\t{\"%s\", %s", name, parse_args);
#endif
/* FIXME: zero it out so as to avoid FALSE "forward incompatible" instructions /* FIXME: zero it out so as to avoid FALSE "forward incompatible" instructions
in case `fetch_cop_channels ()' isn't invoked prior to this function. See in case `fetch_cop_channels ()' isn't invoked prior to this function. See
also my comment when setting `forward_incompat' to 1. */ also my comment when setting `forward_incompat' to 1. */
@ -29,7 +34,7 @@ void
print_common_part (const char *type, const char *name, const char *parse_args) print_common_part (const char *type, const char *name, const char *parse_args)
{ {
print_common_part_minimal (type, name, parse_args); print_common_part_minimal (type, name, parse_args);
printf (", NULL"); printf (",NULL");
} }
void void
@ -37,7 +42,7 @@ print_common_part_with_merge (const char *type, const char *name,
const char *parse_args, const char *merge) const char *parse_args, const char *merge)
{ {
print_common_part_minimal (type, name, parse_args); print_common_part_minimal (type, name, parse_args);
printf (", %s", merge); printf (",%s", merge);
} }
@ -49,12 +54,22 @@ print_alf_part (const char *alopf, const char *mas, int cop, const int *chns,
const char *format) const char *format)
{ {
int i; int i;
#ifdef GENERATE_CSV
int is_mas = strcmp(mas, "NO_MAS");
printf (",%s%s,0x%x,", alopf, is_mas? "_MAS" : "", cop);
for (i = 0; i < 6; i++)
printf ("%d%s", chns[i], i < 5 ? "," : "");
printf (",%s", format);
#else
printf (", %s, %s, 0x%x, {", alopf, mas, cop); printf (", %s, %s, 0x%x, {", alopf, mas, cop);
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
printf ("%d%s", chns[i], i < 5 ? ", " : ""); printf ("%d%s", chns[i], i < 5 ? ", " : "");
printf ("}, %s", format); printf ("}, %s", format);
#endif
} }
void void
@ -62,6 +77,9 @@ print_alopf11_tail (const char *opce, const int *chns, const char *opc2,
int explicit_ales25_v4) int explicit_ales25_v4)
{ {
int i; int i;
#ifdef GENERATE_CSV
printf (",%s,,,%s,%d", opce,opc2,explicit_ales25_v4);
#else
printf (", %s, ", opce); printf (", %s, ", opce);
printf ("{"); printf ("{");
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
@ -69,14 +87,19 @@ print_alopf11_tail (const char *opce, const int *chns, const char *opc2,
printf ("}"); printf ("}");
printf (", %d", explicit_ales25_v4); printf (", %d", explicit_ales25_v4);
#endif
} }
void void
print_final_part () print_final_part ()
{ {
#ifdef GENERATE_CSV
printf("\n");
#else
printf ("};\n"); printf ("};\n");
printf ("\tadd_to_insn_table ((e2k_opcode_templ *) &dummy);\n"); printf ("\tadd_to_insn_table ((e2k_opcode_templ *) &dummy);\n");
printf ("}\n"); printf ("}\n");
#endif
} }
@ -639,7 +662,7 @@ gen_alopf2 ()
custom[i].format); custom[i].format);
/* These ones have ALF2.opce == NONE == 0xc0, don't they? */ /* These ones have ALF2.opce == NONE == 0xc0, don't they? */
printf (", 0xc0"); printf (",0xc0");
print_final_part (); print_final_part ();
} }
} }
@ -703,7 +726,7 @@ gen_alopf2 ()
crnt->format); crnt->format);
/* It's time to initialize ALF2.opce now. */ /* It's time to initialize ALF2.opce now. */
printf (", 0x%x", custom_movts[j][i].opce); printf (",0x%x", custom_movts[j][i].opce);
print_final_part (); print_final_part ();
} }
} }
@ -852,7 +875,7 @@ gen_alopf2 ()
custom[i][j].format); custom[i][j].format);
/* It's time to initialize ALF2.opce now. */ /* It's time to initialize ALF2.opce now. */
printf (", 0x%x", opce[i]); printf (",0x%x", opce[i]);
print_final_part (); print_final_part ();
} }
} }
@ -868,7 +891,7 @@ gen_alopf2 ()
print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels, print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels,
"ARGS_SD"); "ARGS_SD");
/* ALF2.opce == CUD == 0xf0 (see Table B.5.1) */ /* ALF2.opce == CUD == 0xf0 (see Table B.5.1) */
printf (", 0xf0"); printf (",0xf0");
print_final_part (); print_final_part ();
} }
} }
@ -889,7 +912,7 @@ gen_alopf2 ()
print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels, print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels,
"ARGS_SQ"); "ARGS_SQ");
/* ALF2.opce == USD == 0xec (see Table B.5.1) */ /* ALF2.opce == USD == 0xec (see Table B.5.1) */
printf (", 0xec"); printf (",0xec");
print_final_part (); print_final_part ();
} }
} }
@ -910,7 +933,7 @@ gen_alopf2 ()
print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop,
cop_chn.channels, "ARGS_SQ"); cop_chn.channels, "ARGS_SQ");
/* ALF2.opce == GD == 0xf2 (see Table B.5.1) */ /* ALF2.opce == GD == 0xf2 (see Table B.5.1) */
printf (", 0x%x", alf2_opce[i]); printf (",0x%x", alf2_opce[i]);
print_final_part (); print_final_part ();
} }
} }
@ -930,7 +953,7 @@ gen_alopf2 ()
"merge_alopf_simple"); "merge_alopf_simple");
print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels, print_alf_part ("ALOPF2", "NO_MAS", cop_chn.cop, cop_chn.channels,
"ARGS_DD"); "ARGS_DD");
printf (", 0x%x", opce[i]); printf (",0x%x", opce[i]);
print_final_part (); print_final_part ();
} }
} }
@ -1053,13 +1076,14 @@ gen_alopf7 ()
/* It's time to initialize ALF7.dst2.cmpopce here which is equal to J /* It's time to initialize ALF7.dst2.cmpopce here which is equal to J
according to `Table B.2.1' in iset.single. */ according to `Table B.2.1' in iset.single. */
printf (", 0x%x", j); printf (",,0x%x", j);
#ifndef GENERATE_CSV
/* Output an implicit number of NOPs implied by the comparison under /* Output an implicit number of NOPs implied by the comparison under
consideration. As far as I know, floating-point ones require 4, consideration. As far as I know, floating-point ones require 4,
while integer just 2. */ while integer just 2. */
printf (", %d", ins_name[i][j][0] == 'f' ? 4 : 2); printf (", %d", ins_name[i][j][0] == 'f' ? 4 : 2);
#endif
print_final_part (); print_final_part ();
} }
@ -1108,12 +1132,14 @@ gen_alopf17 ()
/* It's time to initialize ALES.opce here which is equal to `0xc0 + J' /* It's time to initialize ALES.opce here which is equal to `0xc0 + J'
according to `Table B.2.5' in iset-v6.single. */ according to `Table B.2.5' in iset-v6.single. */
printf (", 0x%x", 0xc0 + j); printf (",,,0x%x", 0xc0 + j);
#ifndef GENERATE_CSV
/* Output an implicit number of NOPs implied by the comparison. /* Output an implicit number of NOPs implied by the comparison.
According to the behaviour of LAS, these ones are likely to be According to the behaviour of LAS, these ones are likely to be
treated as integer ones. */ treated as integer ones. */
printf (", 2"); printf (", 2");
#endif
print_final_part (); print_final_part ();
} }
@ -1140,7 +1166,7 @@ gen_alopf8 ()
print_alf_part ("ALOPF8", "NO_MAS", cop_chn.cop, cop_chn.channels, print_alf_part ("ALOPF8", "NO_MAS", cop_chn.cop, cop_chn.channels,
"ARGS_S"); "ARGS_S");
/* Encode ALF8.dst2.cmpopce which determines the tested relation. */ /* Encode ALF8.dst2.cmpopce which determines the tested relation. */
printf (", 0x%x", i); printf (",,0x%x", i);
print_final_part (); print_final_part ();
} }
@ -1398,7 +1424,7 @@ is_alopf11_lit8 (const char *name, struct extra_alopf11_lit8 *extra)
static void static void
print_alopf11_lit8 (const struct extra_alopf11_lit8 *extra) print_alopf11_lit8 (const struct extra_alopf11_lit8 *extra)
{ {
printf (", %d, ", extra->max); printf (",%d,", extra->max);
if (extra->warn) if (extra->warn)
printf ("\"%s\"", extra->warn); printf ("\"%s\"", extra->warn);
else else
@ -2090,7 +2116,7 @@ gen_alopf12_fsqrts ()
/* It's time to initialize `ALS.opce = 0xc0 (NONE)', /* It's time to initialize `ALS.opce = 0xc0 (NONE)',
`ALES.opce = 0xc0 (NONE)' and `ALES.opc2 = 0x1 (EXT)'. */ `ALES.opce = 0xc0 (NONE)' and `ALES.opc2 = 0x1 (EXT)'. */
printf (", 0xc0, 0xc0, 0x1"); printf (",0xc0,,0xc0,0x1");
print_final_part (); print_final_part ();
} }
} }
@ -2115,7 +2141,7 @@ gen_pshufh ()
/* I believe that `ALS.opce = 0xc0 (NONE)' because nothing else is said about /* I believe that `ALS.opce = 0xc0 (NONE)' because nothing else is said about
it, `ALES.opce should be determined from a literal8 argument' and it, `ALES.opce should be determined from a literal8 argument' and
`ALES.opc2 = 0x1 (EXT)'. */ `ALES.opc2 = 0x1 (EXT)'. */
printf (", 0xc0, 0x0, 0x1"); printf (",0xc0,,0x0,0x1");
print_final_part (); print_final_part ();
} }
@ -2152,7 +2178,7 @@ gen_alopf12 ()
/* It's time to initialize `ALS.opce = 0xec', `ALES.opce = 0xc0 (NONE)' /* It's time to initialize `ALS.opce = 0xec', `ALES.opce = 0xc0 (NONE)'
and `ALES.opc2 = 0x1 (EXT)'. */ and `ALES.opc2 = 0x1 (EXT)'. */
printf (", 0xec, 0xc0, 0x1"); printf (",0xec,,0xc0,0x1");
print_final_part (); print_final_part ();
} }
@ -2182,7 +2208,7 @@ gen_alopf12 ()
/* Here I print ALS.opce (I guess that it's NONE, because I've been /* Here I print ALS.opce (I guess that it's NONE, because I've been
unable to find another value in iset-v5.single), ALES.opce and unable to find another value in iset-v5.single), ALES.opce and
ALES.opc2. */ ALES.opc2. */
printf (", NONE, NONE, EXT1"); printf (",NONE,,NONE,EXT1");
print_final_part (); print_final_part ();
} }
} }
@ -2222,7 +2248,7 @@ gen_alopf12 ()
/* ALS.opce == NONE for IBRANCHD, but will be replaced with WBS for /* ALS.opce == NONE for IBRANCHD, but will be replaced with WBS for
ICALLD. ALES.opce is likely to be NONE for both of them, while ICALLD. ALES.opce is likely to be NONE for both of them, while
ALES.opc2 is explicitly said to be EXT for both instructions. */ ALES.opc2 is explicitly said to be EXT for both instructions. */
printf (", NONE, NONE, EXT"); printf (",NONE,,NONE,EXT");
print_final_part (); print_final_part ();
} }
} }
@ -2257,7 +2283,7 @@ gen_alopf12 ()
/* Here I print ALS.opce (I guess that it's NONE, because I've been /* Here I print ALS.opce (I guess that it's NONE, because I've been
unable to find another value in iset-v5.single), ALES.opce and unable to find another value in iset-v5.single), ALES.opce and
ALES.opc2. */ ALES.opc2. */
printf (", NONE, 0x%x, EXT1", qpcext_info[i].ales_opce); printf (",NONE,,0x%x,EXT1", qpcext_info[i].ales_opce);
print_final_part (); print_final_part ();
} }
} }
@ -2301,7 +2327,7 @@ gen_alopf12 ()
qptoqp_transforms[i].arg_fmt); qptoqp_transforms[i].arg_fmt);
/* ALS.opce, ALES.opce and ALES.opc2 */ /* ALS.opce, ALES.opce and ALES.opc2 */
printf (", 0x%x, NONE, EXT1", qptoqp_transforms[i].opce); printf (",0x%x,,NONE,EXT1", qptoqp_transforms[i].opce);
print_final_part (); print_final_part ();
} }
} }
@ -2404,7 +2430,7 @@ gen_alopf13 ()
stores[i].format); stores[i].format);
/* `ALEF2.opce = 0xc0 (NONE)' and `ALES.opc2 = 0x1 (EXT)'. */ /* `ALEF2.opce = 0xc0 (NONE)' and `ALES.opc2 = 0x1 (EXT)'. */
printf (", NONE, %s", ext); printf (",,,NONE,%s", ext);
print_final_part (); print_final_part ();
} }
} }
@ -2489,7 +2515,7 @@ output_alopf21_insn (const char *name, int cop, const int *channels,
print_alf_part ("ALOPF21", "NO_MAS", cop, channels, arg_fmts); print_alf_part ("ALOPF21", "NO_MAS", cop, channels, arg_fmts);
/* Now print ALEF1.opc2. */ /* Now print ALEF1.opc2. */
printf (", %s", opc2); printf (",,,,%s", opc2);
print_final_part (); print_final_part ();
} }
@ -3067,47 +3093,42 @@ print_combined_table (const char *opc2, const combined_table *table,
int i; int i;
char cond[64]; char cond[64];
if (first == 1 && last == 6) if (first == 1 && last == 6)
cond[0] = '\0'; sprintf(cond,">=1");
else if (first == last) else if (first == last)
sprintf (cond, "if (mcpu == %d)\n", first); sprintf(cond,"=%d", first);
else if (last == 6) else if (last == 6)
sprintf (cond, "if (mcpu >= %d)\n", first); sprintf(cond,">=%d",first);
else else
sprintf (cond, "if (mcpu >= %d && mcpu <= %d)\n", first, last); sprintf(cond,">=%d <=%d", first, last);
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
{ {
const char *mrg; const char *mrg;
const char *name = table->entry[i].name; const char *name = table->entry[i].name;
int merge = 0; int merge = 0;
if (name[0] == '\0')
if (name[0] == '\0') continue;
continue;
/* Be very careful so as not to mark `{q,}pmerge' and other similar
/* Be very careful so as not to mark `{q,}pmerge' and other similar * "combined" instructions not really making use of MRGC as
"combined" instructions not really making use of MRGC as * ALOPF21_MERGE. */
ALOPF21_MERGE. */ mrg = strstr (name, "merge");
mrg = strstr (name, "merge"); if (mrg
if (mrg && ((mrg > name && mrg[-1] == '_'
&& ((mrg > name && mrg[-1] == '_' && (mrg[5] == 's' || mrg[5] == 'd'))
&& (mrg[5] == 's' || mrg[5] == 'd')) || (mrg == name && mrg[5] == '_')))
|| (mrg == name && mrg[5] == '_'))) merge = 1;
merge = 1;
printf("%s,%s,merge_alopf_simple",cond,table->entry[i].name);
printf ("%s", cond); print_alf_part (merge ? "ALOPF21_MERGE" : "ALOPF21", "NO_MAS", i,
printf ("{\n\tstatic e2k_alopf21_opcode_templ dummy ="); table->entry[i].channels, table->entry[i].arg_fmts);
printf ("\n\t\t{\"%s\", parse_alf_args, merge_alopf_simple",
table->entry[i].name); /* Now print ALEF1.opc2. */
printf (",,,,%s", opc2);
print_alf_part (merge ? "ALOPF21_MERGE" : "ALOPF21", "NO_MAS", i,
table->entry[i].channels, table->entry[i].arg_fmts); print_final_part ();
}
/* Now print ALEF1.opc2. */
printf (", %s", opc2);
print_final_part ();
}
} }
static void static void
@ -3379,7 +3400,7 @@ gen_alopf22 ()
"ARGS_QQ"); "ARGS_QQ");
/* It's time to initialize ALF2.opce now. */ /* It's time to initialize ALF2.opce now. */
printf (", 0x%x", custom_movtq[i].opce); printf (",0x%x", custom_movtq[i].opce);
print_final_part (); print_final_part ();
} }
} }
@ -3429,6 +3450,8 @@ main ()
{ {
int i; int i;
printf("ver,name,merge,format,opc1,ch0,ch1,ch2,ch3,ch4,ch5,args,opce,opc_cmp,ales_opce,ales_opc2,explicit_ales25_v4,alopf11_lit8_count,alopf11_lit8_warn\n");
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
{ {
short_opers = &oper_tables[i][0]; short_opers = &oper_tables[i][0];
@ -3460,8 +3483,10 @@ main ()
gen_alopf21_combined (); gen_alopf21_combined ();
#if 0
print_usage (1); print_usage (1);
print_usage (0); print_usage (0);
#endif
return 0; return 0;
} }