} 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];
- 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);
+#ifndef MONO_ARCH_ENABLE_NORMALIZE_OPCODES
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);
}
+#endif
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);
-
- 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) {
+ 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 < 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