Calculate the worst-case weight of a register in a register class.
authorDavid Given <dg@cowlark.com>
Sat, 4 Feb 2017 21:56:13 +0000 (22:56 +0100)
committerDavid Given <dg@cowlark.com>
Sat, 4 Feb 2017 21:56:13 +0000 (22:56 +0100)
util/mcgg/mcgg.h
util/mcgg/registers.c
util/mcgg/registers.h

index 9ddf922..6aa304f 100644 (file)
@@ -66,6 +66,7 @@ struct burm_regclass_data
     const char* name;
     const struct burm_register_data** registers;
     burm_register_bitmap_t bitmap;
+    int weight;
 };
 
 extern const struct burm_register_data burm_register_data[];
index 5d78188..c26cbd3 100644 (file)
@@ -132,19 +132,21 @@ void analyse_registers(void)
                        real_registers[real_register_count++] = r;
        }
 
-       /* Set the register bitmaps. */
+       /* Set the register bitmaps and weight. */
 
        for (i=0; i<real_register_count; i++)
        {
                struct reg* r = real_registers[i];
                r->bitmap = bitmap_alloc(real_register_count);
                bitmap_set(r->bitmap, real_register_count, i);
+               r->weight = 1;
        }
 
        for (i=0; i<fake_register_count; i++)
        {
                struct reg* r = fake_registers[i];
                r->bitmap = bitmap_alloc(real_register_count);
+               r->weight = r->uses.count;
 
                for (j=0; j<r->uses.count; j++)
                {
@@ -174,6 +176,9 @@ void analyse_registers(void)
                        {
                                struct regattr* rc = sit.item;
                                bitmap_or(rc->bitmap, real_register_count, r->bitmap);
+
+                               if (r->weight > rc->weight)
+                                       rc->weight = r->weight;
                        }
                }
        }
@@ -237,7 +242,9 @@ void emitregisterattrs(void)
                {
                        print("0x%x, ", rc->bitmap[j]);
                }
-               print("}},\n");
+               print("}, ");
+               print("%d,", rc->weight);
+               print("},\n");
                printh("#define %P%s_ATTR (1U<<%d)\n", rc->name, rc->number);
        }
        print("};\n\n");
index 3aaf3eb..6b0bc43 100644 (file)
@@ -13,6 +13,7 @@ struct reg
        struct stringlist* names;  /* register names */
        unsigned int* bitmap;      /* hardware register bitmap */
        ARRAYOF(struct reg) uses;  /* registers that this one uses */
+       int weight;                /* weight of this register */
 };
 
 struct regattr
@@ -20,6 +21,7 @@ struct regattr
        const char* name;      /* class name */
        int number;            /* identifying number */
        unsigned int* bitmap;  /* hardware register bitmap */
+       int weight;            /* maximum weight of all registers in this class */
 };
 
 extern struct reg* makereg(const char* name);