aboutsummaryrefslogtreecommitdiffhomepage
path: root/amd64/sysv.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-11 19:29:30 +0200
committerlemon <lsof@mailbox.org>2023-06-11 19:29:30 +0200
commit1139df03b0edbf08deb9aa26ade3776be3c1e180 (patch)
tree0777ca13c5ae2e12064758f7fd20c78b80fa366b /amd64/sysv.c
parent5ac04c7a3ec11d939a3773876b6924e1ae39f1a5 (diff)
remove RPARAM, add Oparam, lower args/rets to abi regs in abi0
Diffstat (limited to 'amd64/sysv.c')
-rw-r--r--amd64/sysv.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/amd64/sysv.c b/amd64/sysv.c
index 69ebce4..1128cc2 100644
--- a/amd64/sysv.c
+++ b/amd64/sysv.c
@@ -68,8 +68,8 @@ abiarg(short r[2], uchar cls[2], int *ni, int *nf, int *ns, union irtype typ)
} else if (*ni < NINT) {
r[0] = intregs[(*ni)++];
} else {
- ++*ns;
- r[0] = -1;
+ r[0] = -*ns - 8;
+ *ns += 8;
return 0; /* MEMORY */
}
return 1;
@@ -77,7 +77,8 @@ abiarg(short r[2], uchar cls[2], int *ni, int *nf, int *ns, union irtype typ)
cls[0] = cls[1] = 0;
ret = classify(cls, &typedata[typ.dat], 0);
if (!ret) { /*MEMORY*/
- ++*ns;
+ r[0] = -*ns - 8;
+ *ns = alignup(*ns + typedata[typ.dat].siz, 8);
return 0;
}
assert(ret <= 2);
@@ -90,8 +91,9 @@ abiarg(short r[2], uchar cls[2], int *ni, int *nf, int *ns, union irtype typ)
r[i] = intregs[(*ni)++];
else { /* MEMORY */
*ni = ni_save, *nf = nf_save;
- ++*ns;
- r[0] = r[1] = -1;
+ r[0] = -*ns - 8;
+ *ns = alignup(*ns + typedata[typ.dat].siz, 8);
+ r[1] = -1;
return cls[0] = cls[1] = 0;
}
}
@@ -137,6 +139,7 @@ const char amd64_rnames[][6] = {
const struct mctarg t_amd64_sysv = {
.gpr0 = RAX, .ngpr = R15 - RAX + 1,
+ .spr = RSP,
.fpr0 = XMM0, .nfpr = XMM15 - XMM0 + 1,
.rcallee = {{1<<RBX | 1<<R12 | 1<<R13 | 1<<R14 | 1<<R15}},
.rglob = {{1<<RSP | 1<<RBP}},