diff options
Diffstat (limited to 'amd64/isel.c')
| -rw-r--r-- | amd64/isel.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/amd64/isel.c b/amd64/isel.c index 6541c10..26ee6e0 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -147,6 +147,11 @@ selcall(struct function *fn, struct instr *ins, struct block *blk, int *curi) ++*curi; insertinstr(blk, *curi+1, (struct instr){Oadd, KPTR, .keep=1, .reg = RSP+1, .l=mkref(RREG,RSP), disp}); } + if (call->vararg >= 0 && ins->l.t == RTMP) { + /* variadic calls write number of sse regs used to AL, so mark it as clobbered such that + * the function pointer of an indirect calls does not get allocated to RAX by regalloc */ + insertinstr(blk, (*curi)++, mkinstr(Omove, KPTR, mkref(RREG, RAX), mkref(RREG, RAX))); + } cls = ins->cls; ins->cls = 0; if (cls) { |