diff options
| author | 2023-06-11 19:29:30 +0200 | |
|---|---|---|
| committer | 2023-06-11 19:29:30 +0200 | |
| commit | 1139df03b0edbf08deb9aa26ade3776be3c1e180 (patch) | |
| tree | 0777ca13c5ae2e12064758f7fd20c78b80fa366b /amd64/sysv.c | |
| parent | 5ac04c7a3ec11d939a3773876b6924e1ae39f1a5 (diff) | |
remove RPARAM, add Oparam, lower args/rets to abi regs in abi0
Diffstat (limited to 'amd64/sysv.c')
| -rw-r--r-- | amd64/sysv.c | 13 |
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}}, |