} else if (strncmp (p, "src2:", 5) == 0) {
desc->spec [MONO_INST_SRC2] = p [5];
p += 6;
- } else if (strncmp (p, "cost:", 5) == 0) {
- desc->spec [MONO_INST_COST] = p [5];
+ } else if (strncmp (p, "src3:", 5) == 0) {
+ desc->spec [MONO_INST_SRC3] = p [5];
p += 6;
} else if (strncmp (p, "clob:", 5) == 0) {
desc->spec [MONO_INST_CLOB] = p [5];
p += 6;
+ /* Currently unused fields
+ } else if (strncmp (p, "cost:", 5) == 0) {
+ desc->spec [MONO_INST_COST] = p [5];
+ p += 6;
} else if (strncmp (p, "res:", 4) == 0) {
desc->spec [MONO_INST_RES] = p [4];
p += 5;
} else if (strncmp (p, "delay:", 6) == 0) {
desc->spec [MONO_INST_DELAY] = p [6];
p += 7;
+ */
} else if (strncmp (p, "len:", 4) == 0) {
p += 4;
desc->spec [MONO_INST_LEN] = strtoul (p, &p, 10);
table = g_hash_table_new (g_str_hash, g_str_equal);
opcodes = g_new0 (OpDesc, OP_LAST);
- for (i = 0; i < MONO_CEE_LAST; ++i) {
- desc = opcodes + i;
- desc->num = i;
- desc->name = mono_inst_name (i);
- g_hash_table_insert (table, (char *)desc->name, desc);
- }
for (i = OP_LOAD; i < OP_LAST; ++i) {
desc = opcodes + i;
desc->num = i;
static void
build_table (const char *fname, const char *name) {
FILE *f;
- int i, j;
+ int i, j, idx;
OpDesc *desc;
+ GString *idx_array = g_string_new ("");
+ /* use this to remove duplicates */
+ GHashTable *desc_ht = g_hash_table_new (g_str_hash, g_str_equal);
if (!(f = fopen (fname, "w")))
g_error ("Cannot open file '%s'", fname);
fprintf (f, "/* File automatically generated by genmdesc, don't change */\n\n");
- fprintf (f, "static const char * const %s [OP_LAST] = {\n", name);
+ fprintf (f, "const char %s [] = {\n", name);
+ fprintf (f, "\t\"");
+ for (j = 0; j < MONO_INST_MAX; ++j)
+ fprintf (f, "\\x0");
+ fprintf (f, "\"\t/* null entry */\n");
+ idx = 1;
+ g_string_append_printf (idx_array, "const guint16 %s_idx [] = {\n", name);
- for (i = 0; i < MONO_CEE_LAST; ++i) {
- desc = opcodes + i;
- if (!desc->desc)
- fprintf (f, "\tNULL,\t/* %s */\n", desc->name);
- else {
- fprintf (f, "\t\"");
- for (j = 0; j < MONO_INST_MAX; ++j)
- output_char (f, desc->spec [j]);
- fprintf (f, "\",\t/* %s */\n", desc->name);
- }
- }
- for (i = MONO_CEE_LAST; i < OP_LOAD; ++i) {
- fprintf (f, "\tNULL, /* unassigned */\n");
- }
for (i = OP_LOAD; i < OP_LAST; ++i) {
desc = opcodes + i;
if (!desc->desc)
- fprintf (f, "\tNULL,\t/* %s */\n", desc->name);
+ g_string_append_printf (idx_array, "\t0,\t/* %s */\n", desc->name ? desc->name : "");
else {
fprintf (f, "\t\"");
for (j = 0; j < MONO_INST_MAX; ++j)
output_char (f, desc->spec [j]);
- fprintf (f, "\",\t/* %s */\n", desc->name);
+ fprintf (f, "\"\t/* %s */\n", desc->name);
+ g_string_append_printf (idx_array, "\t%d,\t/* %s */\n", idx * MONO_INST_MAX, desc->name);
+ ++idx;
}
}
fprintf (f, "};\n\n");
+ fprintf (f, "%s};\n\n", idx_array->str);
fclose (f);
+ g_string_free (idx_array, TRUE);
+ g_hash_table_destroy (desc_ht);
}
static void
main (int argc, char* argv [])
{
init_table ();
- switch (argc) {
- case 2:
+ if (argc == 2) {
/* useful to get a new file when some opcodes are added: looses the comments, though */
load_file (argv [1]);
dump ();
- break;
- case 4:
- load_file (argv [1]);
- build_table (argv [2], argv [3]);
- break;
- default:
+ } else if (argc < 4) {
g_print ("Usage: genmdesc arguments\n");
- g_print ("\tgenmdesc desc Output to stdout the description file.\n");
- g_print ("\tgenmdesc desc output name Write to output the description in a table named 'name'.\n");
+ g_print ("\tgenmdesc desc Output to stdout the description file.\n");
+ g_print ("\tgenmdesc output name desc [desc1...] Write to output the description in a table named 'name'.\n");
return 1;
+ } else {
+ int i;
+ for (i = 3; i < argc; ++i)
+ load_file (argv [i]);
+ build_table (argv [1], argv [2]);
}
return 0;
}