aboutsummaryrefslogtreecommitdiffhomepage
path: root/abi0.c
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 /abi0.c
parent3e5c11563f8cb7c843c71a0f761e5b644f39db46 (diff)
use a hashtable for addr refs
Diffstat (limited to 'abi0.c')
-rw-r--r--abi0.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/abi0.c b/abi0.c
index 314017b..83e6a0e 100644
--- a/abi0.c
+++ b/abi0.c
@@ -58,6 +58,7 @@ abiarg(struct abiargsvec *abiargs, int *ni, int *nf, int *ns, union irtype ty)
static struct instr
copyparam(struct abiarg abi)
{
+ struct addr addr = {.base = mkref(RREG, mctarg->bpr), .disp = -abi.stk};
if (abi.reg >= 0) { /* reg */
assert(!abi.ty.isagg);
return mkinstr(Ocopy, abi.ty.cls, mkref(RREG, abi.reg));
@@ -71,11 +72,9 @@ copyparam(struct abiarg abi)
case KF4: ld = Oloadf4; break;
case KF8: ld = Oloadf8; break;
}
- vpush(&addrtab, ((struct addr) {.base = mkref(RREG, mctarg->bpr), .disp = -abi.stk}));
- return mkinstr(ld, abi.ty.cls, mkref(RMORE, addrtab.n - 1));
+ return mkinstr(ld, abi.ty.cls, mkaddr(addr));
} else { /* aggregate in stack */
- vpush(&addrtab, ((struct addr) {.base = mkref(RREG, mctarg->bpr), .disp = -abi.stk}));
- return mkinstr(Ocopy, KPTR, mkref(RMORE, addrtab.n - 1));
+ return mkinstr(Ocopy, KPTR, mkaddr(addr));
}
}