qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit 7a7a5f480312b997dcac0e4cc3befb502e54c836
parent 905e9cef302727fdaacd7069826ff448c2d88361
Author: Quentin Carbonneaux <quentin@c9x.me>
Date:   Mon, 14 Mar 2022 10:40:30 +0100

improve consistency in abis

Diffstat:
Marm64/abi.c | 15++++++---------
Mrv64/abi.c | 14+++++++++-----
2 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/arm64/abi.c b/arm64/abi.c @@ -397,6 +397,7 @@ selcall(Fn *fn, Ins *i0, Ins *i1, Insl **ilp) ldregs(c->reg, c->cls, c->nreg, i->arg[1], fn); } + /* populate the stack */ off = 0; for (i=i0, c=ca; i<i1; i++, c++) { if ((c->class & Cstk) == 0) @@ -456,9 +457,9 @@ selpar(Fn *fn, Ins *i0, Ins *i1) } t = tmp; - for (i=i0, c=ca, s=2; i<i1; i++, c++) { - if (i->op == Oparc - && (c->class & Cptr) == 0) { + s = 2; + for (i=i0, c=ca; i<i1; i++, c++) + if (i->op == Oparc && !(c->class & Cptr)) { if (c->class & Cstk) { fn->tmp[i->to.val].slot = -s; s += c->size / 8; @@ -468,15 +469,11 @@ selpar(Fn *fn, Ins *i0, Ins *i1) emit(Ocopy, c->cls[n], *t++, r, R); } } else if (c->class & Cstk) { - r = newtmp("abi", Kl, fn); - emit(Oload, *c->cls, i->to, r, R); - emit(Oaddr, Kl, r, SLOT(-s), R); + emit(Oload, *c->cls, i->to, SLOT(-s), R); s++; } else { - r = TMP(*c->reg); - emit(Ocopy, *c->cls, i->to, r, R); + emit(Ocopy, *c->cls, i->to, TMP(*c->reg), R); } - } if (!req(R, env)) die("todo: env calls"); diff --git a/rv64/abi.c b/rv64/abi.c @@ -425,17 +425,20 @@ selcall(Fn *fn, Ins *i0, Ins *i1, Insl **ilp) if (!stk) return; + /* populate the stack */ + off = 0; r = newtmp("abi", Kl, fn); - for (i=i0, c=ca, off=0; i<i1; i++, c++) { + for (i=i0, c=ca; i<i1; i++, c++) { if (i->op == Oargv || !(c->class & Cstk)) continue; if (i->op == Oarg) { r1 = newtmp("abi", Kl, fn); emit(Ostorew+i->cls, Kw, R, i->arg[0], r1); if (i->cls == Kw) { - /* TODO: we only need this sign extension - * for subtyped l temporaries passed as w - * arguments (see rv64/isel.c:fixarg) + /* TODO: we only need this sign + * extension for l temps passed + * as w arguments + * (see rv64/isel.c:fixarg) */ curi->op = Ostorel; curi->arg[0] = newtmp("abi", Kl, fn); @@ -530,8 +533,9 @@ selpar(Fn *fn, Ins *i0, Ins *i1) } else if (c->class & Cstk1) { emit(Oload, *c->cls, i->to, SLOT(-s), R); s++; - } else + } else { emit(Ocopy, *c->cls, i->to, TMP(*c->reg), R); + } return (Params){ .stk = s,