+++ /dev/null
-#include <stdlib.h>
-#include <stdbool.h>
-#include <string.h>
-#include "smap.h"
-
-static void append(void* mapp, const char* left, void* right)
-{
- struct smap* map = mapp;
- struct smap_node* node;
-
- if (map->count == map->max)
- {
- int newmax = (map->max == 0) ? 8 : (map->max * 2);
- struct smap_node* newarray = realloc(map->item, newmax * sizeof(*newarray));
-
- map->max = newmax;
- map->item = newarray;
- }
-
- node = &map->item[map->count];
- map->count++;
-
- node->left = left;
- node->right = right;
-}
-
-void smap_put(void* mapp, const char* left, void* right)
-{
- struct smap* map = mapp;
- int i;
-
- for (i=0; i<map->count; i++)
- {
- struct smap_node* node = &map->item[i];
- if (strcmp(node->left, left) == 0)
- {
- node->right = right;
- return;
- }
- }
-
- append(map, left, right);
-}
-
-void smap_add(void* mapp, const char* left, void* right)
-{
- struct smap* map = mapp;
- int i;
-
- for (i=0; i<map->count; i++)
- {
- struct smap_node* node = &map->item[i];
- if ((strcmp(node->left, left) == 0) && (node->right == right))
- return;
- }
-
- append(map, left, right);
-}
-
-void* smap_get(void* mapp, const char* left)
-{
- struct smap* map = mapp;
- int i;
-
- for (i=0; i<map->count; i++)
- {
- struct smap_node* node = &map->item[i];
- if (strcmp(node->left, left) == 0)
- return node->right;
- }
-
- return NULL;
-}
-
#include "stringlist.h"
#include "iburg.h"
#include "registers.h"
+#include "hashtable.h"
-static SMAPOF(struct reg) registers;
-static SMAPOF(struct regattr) registerattrs;
+static struct hashtable registers = HASHTABLE_OF_STRINGS;
+static struct hashtable registerattrs = HASHTABLE_OF_STRINGS;
struct reg* makereg(const char* id)
{
- struct reg* p = smap_get(®isters, id);
+ struct reg* p = hashtable_get(®isters, (void*)id);
static int number = 0;
if (p)
p->name = id;
p->number = number++;
array_append(&p->aliases, p);
- smap_put(®isters, id, p);
+ hashtable_put(®isters, (void*)id, p);
return p;
}
struct regattr* findregattr(const char* id)
{
- return smap_get(®isterattrs, id);
+ return hashtable_get(®isterattrs, (void*)id);
}
struct regattr* makeregattr(const char* id)
{
- struct regattr* p = smap_get(®isterattrs, id);
+ struct regattr* p = hashtable_get(®isterattrs, (void*)id);
static int number = 0;
if (p)
p = calloc(1, sizeof(*p));
p->name = id;
p->number = number++;
- smap_put(®isterattrs, id, p);
+ hashtable_put(®isterattrs, (void*)id, p);
return p;
}
void addregattr(struct reg* reg, const char* id)
{
- struct regattr* p = smap_get(®isterattrs, id);
+ struct regattr* p = hashtable_get(®isterattrs, (void*) id);
if (!p)
p = makeregattr(id);
while (f)
{
- struct reg* r = smap_get(®isters, f->data);
+ struct reg* r = hashtable_get(®isters, (void*)f->data);
if (!r)
yyerror("register '%s' is not defined here", f->data);
struct regattr* getregattr(const char* id)
{
- struct regattr* p = smap_get(®isterattrs, id);
+ struct regattr* p = hashtable_get(®isterattrs, (void*)id);
if (!p)
yyerror("'%s' is not the name of a register class", id);
return p;
void emitregisterattrs(void)
{
int i;
+ struct regattr* regattrs[registerattrs.size];
+ struct hashtable_iterator hit = {};
+
+ while (hashtable_next(®isterattrs, &hit))
+ {
+ struct regattr* rc = hit.value;
+ assert((rc->number >= 0) && (rc->number < registerattrs.size));
+ regattrs[rc->number] = rc;
+ }
print("const char* %Pregister_class_names[] = {\n");
- for (i=0; i<registerattrs.count; i++)
+ for (i=0; i<registerattrs.size; i++)
{
- struct regattr* rc = registerattrs.item[i].right;
+ struct regattr* rc = regattrs[i];
assert(rc->number == i);
print("%1\"%s\",\n", rc->name);
void emitregisters(void)
{
int i, j;
+ struct reg* regs[registers.size];
+ struct hashtable_iterator hit = {};
+
+ while (hashtable_next(®isters, &hit))
+ {
+ struct reg* r = hit.value;
+ assert((r->number >= 0) && (r->number < registers.size));
+ regs[r->number] = r;
+ }
- for (i=0; i<registers.count; i++)
+ for (i=0; i<registers.size; i++)
{
- struct reg* r = registers.item[i].right;
+ struct reg* r = regs[i];
print("const struct %Pregister_data* %Pregister_aliases_%d_%s[] = {\n%1", i, r->name);
for (j=0; j<r->aliases.count; j++)
print("NULL\n};\n");
}
- for (i=0; i<registers.count; i++)
+ for (i=0; i<registers.size; i++)
{
- struct reg* r = registers.item[i].right;
+ struct reg* r = regs[i];
print("const char* %Pregister_names_%d_%s[] = {\n%1", i, r->name);
if (r->names)
}
print("const struct %Pregister_data %Pregister_data[] = {\n");
- for (i=0; i<registers.count; i++)
+ for (i=0; i<registers.size; i++)
{
- struct reg* r = registers.item[i].right;
+ struct reg* r = regs[i];
+
assert(r->number == i);
print("%1{ \"%s\", 0x%x, %Pregister_names_%d_%s, %Pregister_aliases_%d_%s },\n",
r->name, r->attrs, i, r->name, i, r->name);
}
+
print("%1{ NULL }\n");
print("};\n\n");
}