diff options
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}}, |