From 2b6d00e9ff2153a3cd5d03bd92d6777814eb6897 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 17 Dec 2016 22:25:26 +0100 Subject: [PATCH] Add a bitmap library to modules/src/data; mcgg now computers register bitmaps. --- modules/src/data/bitmap.c | 61 +++++++++++++++++++++++++++++++++ modules/src/data/bitmap.h | 16 +++++++++ util/mcgg/build.lua | 3 +- util/mcgg/iburg.c | 2 +- util/mcgg/iburg.h | 3 +- util/mcgg/mcgg.h | 19 ++--------- util/mcgg/mcgg_common.h | 21 ++++++++++++ util/mcgg/registers.c | 72 ++++++++++++++++++++++++++++++++++++--- util/mcgg/registers.h | 3 ++ 9 files changed, 175 insertions(+), 25 deletions(-) create mode 100644 modules/src/data/bitmap.c create mode 100644 modules/src/data/bitmap.h create mode 100644 util/mcgg/mcgg_common.h diff --git a/modules/src/data/bitmap.c b/modules/src/data/bitmap.c new file mode 100644 index 000000000..363d22d49 --- /dev/null +++ b/modules/src/data/bitmap.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include "bitmap.h" + +unsigned int* bitmap_alloc(int size) +{ + return calloc(WORDS_FOR_BITMAP_SIZE(size), sizeof(unsigned int)); +} + +void bitmap_set(unsigned int* bitmap, int size, int bit) +{ + int word = bit / BITS_PER_WORD; + bit = bit & (BITS_PER_WORD - 1); + + assert((bit >= 0) && (bit < size)); + bitmap[word] |= 1<= 0) && (bit < size)); + return bitmap[word] & (1< #include #include -#include "mcgg.h" #include "registers.h" #include "smap.h" #include "array.h" @@ -11,10 +10,17 @@ #include "iburg.h" #include "registers.h" #include "hashtable.h" +#include "bitmap.h" static struct hashtable registers = HASHTABLE_OF_STRINGS; static struct hashtable registerattrs = HASHTABLE_OF_STRINGS; +static struct reg** real_registers; +static int real_register_count; + +static struct reg** fake_registers; +static int fake_register_count; + struct reg* makereg(const char* id) { struct reg* p = hashtable_get(®isters, (void*)id); @@ -25,7 +31,6 @@ struct reg* makereg(const char* id) p = calloc(1, sizeof(*p)); p->name = id; p->number = number++; - array_append(&p->aliases, p); hashtable_put(®isters, (void*)id, p); return p; @@ -89,9 +94,11 @@ void addregaliases(struct reg* reg, struct stringlist* aliases) struct reg* r = hashtable_get(®isters, (void*)f->data); if (!r) yyerror("register '%s' is not defined here", f->data); + if (r->aliases.count > 0) + yyerror("can't alias '%s' to '%s' because the latter isn't a true hardware register", + reg->name, r->name); array_appendu(®->aliases, r); - array_appendu(&r->aliases, reg); f = f->next; } @@ -105,6 +112,56 @@ struct regattr* getregattr(const char* id) return p; } +void analyse_registers(void) +{ + struct reg* regs[registers.size]; + struct hashtable_iterator hit = {}; + int i, j; + + while (hashtable_next(®isters, &hit)) + { + struct reg* r = hit.value; + assert((r->number >= 0) && (r->number < registers.size)); + regs[r->number] = r; + } + + real_registers = calloc(registers.size, sizeof(struct reg*)); + fake_registers = calloc(registers.size, sizeof(struct reg*)); + real_register_count = 0; + fake_register_count = 0; + + for (i=0; ialiases.count > 0) + fake_registers[fake_register_count++] = r; + else + real_registers[real_register_count++] = r; + } + + for (i=0; ibitmap = bitmap_alloc(real_register_count); + bitmap_set(r->bitmap, real_register_count, i); + } + + for (i=0; ibitmap = bitmap_alloc(real_register_count); + + for (j=0; jaliases.count; j++) + { + struct reg* alias = r->aliases.item[j]; + bitmap_or(r->bitmap, real_register_count, alias->bitmap); + } + } + + printh("typedef unsigned int %Pregister_bitmap_t[%d];\n", + WORDS_FOR_BITMAP_SIZE(real_register_count)); +} + void emitregisterattrs(void) { int i; @@ -180,8 +237,15 @@ void emitregisters(void) assert(r->number == i); - print("%1{ \"%s\", 0x%x, %Pregister_names_%d_%s, %Pregister_aliases_%d_%s },\n", + print("%1{\n%2\"%s\", 0x%x, %Pregister_names_%d_%s, %Pregister_aliases_%d_%s,\n", r->name, r->attrs, i, r->name, i, r->name); + print("%2{ "); + for (j=0; jbitmap[j]); + } + print("},\n"); + print("%1},\n"); } print("%1{ NULL }\n"); diff --git a/util/mcgg/registers.h b/util/mcgg/registers.h index 51bcfc499..828ab5a2a 100644 --- a/util/mcgg/registers.h +++ b/util/mcgg/registers.h @@ -9,6 +9,7 @@ struct reg int number; /* identifying number */ uint32_t attrs; /* bitfield of register attributes */ struct stringlist* names; /* register names */ + unsigned int* bitmap; /* hardware register bitmap */ ARRAYOF(struct reg) aliases; /* registers that this one aliases */ }; @@ -25,6 +26,8 @@ extern void addregattr(struct reg* reg, const char* regattr); extern void addregaliases(struct reg* reg, struct stringlist* aliases); extern struct regattr* getregattr(const char* name); +extern void analyse_registers(void); + extern void emitregisterattrs(void); extern void emitregisters(void); -- 2.34.1