aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/t_aarch64_isel.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-04-12 11:49:17 +0200
committerlemon <lsof@mailbox.org>2026-04-12 11:51:25 +0200
commitf13b3021eb273af3093a498fb3b09271546ae3cc (patch)
tree712ff8a744a5126748858658485939054c249107 /src/t_aarch64_isel.c
parent104c0812ac073ceab75c45f82c1341fd5b8aab80 (diff)
aarch64: fix stack frame layout, again
Turns out hardware enforces SP 16-bit alignment in every SP relative load/store, but QEMU doesn't emulate this.
Diffstat (limited to 'src/t_aarch64_isel.c')
-rw-r--r--src/t_aarch64_isel.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/t_aarch64_isel.c b/src/t_aarch64_isel.c
index 178fa23..1d49012 100644
--- a/src/t_aarch64_isel.c
+++ b/src/t_aarch64_isel.c
@@ -264,6 +264,10 @@ aadd(IRAddr *addr, Block *blk, int *curi, Ref r, uint siz/*1,2,4,8*/)
if (r.t == RSTACK) {
if (addr->base.bits) goto Ref;
addr->base = r;
+ } else if (r.t == RADDR) {
+ if (!addr->base.bits && !addr->index.bits && !addr->disp) {
+ *addr = addrtab.p[r.i];
+ } else goto Ref;
} else if (r.t == RTMP) {
Instr *ins = &instrtab[r.i];
if (ins->op == Oadd) {
@@ -534,6 +538,7 @@ seljmp(Function *fn, Block *blk)
if (blk->jmp.arg[1].bits) {
r = mkref(RREG, fn->abiret[1].reg);
ins = &instrtab[insertinstr(blk, blk->ins.n, mkinstr2(Omove, fn->abiret[1].ty.cls, r, blk->jmp.arg[1])).i];
+ blk->jmp.arg[1] = r;
}
}
}