diff options
| author | 2026-03-25 16:36:29 +0100 | |
|---|---|---|
| committer | 2026-03-25 16:36:29 +0100 | |
| commit | 79d6ac719042371d255ed1cf412e3232d13d1e56 (patch) | |
| tree | f7d7ac5b94f68575bbfbf43f5f295c8a6c146b8f /src/t_aarch64_isel.c | |
| parent | 3eb74e33d9fb2fa1bfe3ba4757c79ed13330c104 (diff) | |
aarch64 struct arg passing ABI wip
Diffstat (limited to 'src/t_aarch64_isel.c')
| -rw-r--r-- | src/t_aarch64_isel.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/t_aarch64_isel.c b/src/t_aarch64_isel.c index 0e43ea7..4490831 100644 --- a/src/t_aarch64_isel.c +++ b/src/t_aarch64_isel.c @@ -343,14 +343,18 @@ static void loadstoreaddr(Block *blk, Ref *r, int *curi, enum op op) { uint siz = oisload(op) ? loadsz[op-Oloads8] : storesz[op-Ostorei8]; + bool pcrelok = in_range(op, Oloads32, Oloadf64); /* LDR-LDRSW have PC-relative literal form */ if (isimm32(*r)) { - *r = mkaddr((IRAddr){.base = *r}); + regarg(r, KPTR, blk, curi); } else if (isaddrcon(*r, 0)) { - bool pcrelok = in_range(op, Oloads32, Oloadi64); /* LDR-LDRSW have PC-relative literal form */ if (!pcrelok || !(contab.p[r->i].flag & SLOCAL)) regarg(r, KPTR, blk, curi); } else if (r->t == RTMP || r->t == RSTACK) { - fuseaddr(r, blk, curi, siz); + Ref b; + if (fuseaddr(r, blk, curi, siz) + && isaddrcon(b = addrtab.p[r->i].base,0) + && (!pcrelok || !(contab.p[b.i].flag & SLOCAL))) + regarg(r, KPTR, blk, curi); } else if (r->t != RREG) { *r = insertinstr(blk, (*curi)++, mkinstr1(Ocopy, KPTR, *r)); } @@ -369,7 +373,7 @@ sel(Function *fn, Instr *ins, Block *blk, int *curi) } switch (op) { - //default: assert(0); + default: assert(0); case Onop: break; case Oalloca1: case Oalloca2: case Oalloca4: case Oalloca8: case Oalloca16: assert(!"unlowered alloca"); |