2008-11-17 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / mini / genmdesc.c
index 46af20a86ba76736f8396a8e9e1c62d0c58a4814..e9746259d9ebe4e0261b48178700792f4870ee82 100644 (file)
@@ -79,12 +79,13 @@ load_file (const char *name) {
                        } 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;
@@ -94,6 +95,7 @@ load_file (const char *name) {
                        } 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);
@@ -117,12 +119,14 @@ init_table (void) {
        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;
@@ -142,38 +146,41 @@ output_char (FILE *f, char c) {
 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, "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 = 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