commit 7a7a5f480312b997dcac0e4cc3befb502e54c836
parent 905e9cef302727fdaacd7069826ff448c2d88361
Author: Quentin Carbonneaux <quentin@c9x.me>
Date: Mon, 14 Mar 2022 10:40:30 +0100
improve consistency in abis
Diffstat:
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,