aboutsummaryrefslogtreecommitdiffhomepage
path: root/amd64
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-13 12:02:28 +0200
committerlemon <lsof@mailbox.org>2023-06-13 12:02:28 +0200
commitde5aa052f234693698fa27564d12958df3fa433e (patch)
tree837ed316bc13fe8063dde85e3b075c9357202297 /amd64
parent3e5c11563f8cb7c843c71a0f761e5b644f39db46 (diff)
use a hashtable for addr refs
Diffstat (limited to 'amd64')
-rw-r--r--amd64/emit.c4
-rw-r--r--amd64/isel.c5
2 files changed, 4 insertions, 5 deletions
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;
}