From: David Given Date: Sat, 4 Feb 2017 21:56:13 +0000 (+0100) Subject: Calculate the worst-case weight of a register in a register class. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=21f015fd328d0b306b12753a8ba7a74631c0cb58;p=ack.git Calculate the worst-case weight of a register in a register class. --- diff --git a/util/mcgg/mcgg.h b/util/mcgg/mcgg.h index 9ddf922c8..6aa304f7d 100644 --- a/util/mcgg/mcgg.h +++ b/util/mcgg/mcgg.h @@ -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[]; diff --git a/util/mcgg/registers.c b/util/mcgg/registers.c index 5d7818851..c26cbd36d 100644 --- a/util/mcgg/registers.c +++ b/util/mcgg/registers.c @@ -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; ibitmap = bitmap_alloc(real_register_count); bitmap_set(r->bitmap, real_register_count, i); + r->weight = 1; } for (i=0; ibitmap = bitmap_alloc(real_register_count); + r->weight = r->uses.count; for (j=0; juses.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"); diff --git a/util/mcgg/registers.h b/util/mcgg/registers.h index 3aaf3eb1a..6b0bc4381 100644 --- a/util/mcgg/registers.h +++ b/util/mcgg/registers.h @@ -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);