From de5aa052f234693698fa27564d12958df3fa433e Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 13 Jun 2023 12:02:28 +0200 Subject: use a hashtable for addr refs --- amd64/emit.c | 4 ++-- amd64/isel.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) (limited to 'amd64') diff --git a/amd64/emit.c b/amd64/emit.c index 6be080e..1f6e2b4 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -104,7 +104,7 @@ mkmemoper(union ref r) assert(wop.t == OREG); return mkoper(OMEM, .base = wop.reg, .index = NOINDEX); } else if (r.t == RMORE) { - struct addr *addr = &addrtab.p[r.i]; + const struct addr *addr = &addrht[r.i]; struct oper mem; if (addr->base.t == RTMP && ioper[addr->base.i].t == OMEM) { mem = ioper[addr->base.i]; @@ -432,7 +432,7 @@ gencopy(uchar **pcode, enum irclass cls, struct oper dst, union ref val) assert(dst.t == OREG); if (val.t == RMORE) { /* this is a LEA, but maybe it can be lowered to a 2-address instruction */ - struct addr *addr = &addrtab.p[val.i]; + const struct addr *addr = &addrht[val.i]; if (addr->base.t && dst.reg == mkregoper(addr->base).reg) { /* base = dst */ if (addr->index.t && !addr->disp && !addr->shift){ /* lea Rx, [Rx + Ry] -> add Rx, Ry */ diff --git a/amd64/isel.c b/amd64/isel.c index 3734143..469c56d 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -86,7 +86,7 @@ aadd(struct addr *addr, union ref r, bool rec) if (!ascale(addr, ins->l, ins->r)) return 0; ins->skip = 1; } else if (!rec && ins->op == Ocopy && ins->l.t == RMORE) { - struct addr save = *addr, *addr2 = &addrtab.p[ins->l.i]; + struct addr save = *addr, *addr2 = &addrht[ins->l.i]; if ((!addr2->base.t || aadd(addr, addr2->base, 1)) && aadd(addr, mkintcon(KI4, addr2->disp), 1) && (!addr2->index.t || ascale(addr, addr2->index, mkref(RICON, addr2->shift)))) @@ -121,8 +121,7 @@ fuseaddr(struct function *fn, union ref *r) if (!aadd(&addr, *r, 0)) return 0; - vpush(&addrtab, addr); - *r = mkref(RMORE, addrtab.n-1); + *r = mkaddr(addr); return 1; } -- cgit v1.2.3