diff options
| author | 2026-04-13 19:25:11 +0200 | |
|---|---|---|
| committer | 2026-04-13 19:30:01 +0200 | |
| commit | ddbd42e66cc71b470730037d76f4f267e98d8d40 (patch) | |
| tree | aae9ff541b3e0690e23e391bb2e5e8927d34bf38 /src/ir_abi0.c | |
| parent | 36143af2748b6fcae02ca320baaac417d77ebe58 (diff) | |
C99 complex types MVP
Missing: static eval of complex values,
Silly inefficient implementation of equality comparisons between them
The whole thing is pretty inefficient without proper aggregate mem2reg
anyway
Diffstat (limited to 'src/ir_abi0.c')
| -rw-r--r-- | src/ir_abi0.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/ir_abi0.c b/src/ir_abi0.c index b8ae90f..7a976fe 100644 --- a/src/ir_abi0.c +++ b/src/ir_abi0.c @@ -297,6 +297,7 @@ abi0_call(Function *fn, Instr *ins, Block *blk, int *curi) for (int i = 0, i2 = ni + sretarghidden; i < call->narg; ++i) { int arginst = *curi - (call->narg - i); Instr *arg = &instrtab[blk->ins.p[arginst]]; + assert(arg->op == Oarg); IRType pty = ref2type(arg->l); uchar r2off; int first = abiargs.n; @@ -361,14 +362,16 @@ abi0(Function *fn) uchar r2off; Block *blk; Ref sret = {0}; + Type retty = fn->retty; + if (iscomplex(retty)) retty = complex2struct(retty); FREQUIRE(FNUSE); - if (fn->retty.t == TYVOID) { + if (retty.t == TYVOID) { fn->nabiret = 0; } else { - fn->nabiret = abiret(fn->abiret, &abiargs, &r2off, &ni, mkirtype(fn->retty)); - if (!fn->nabiret && isagg(fn->retty)) { /* ret agg by hidden pointer */ + fn->nabiret = abiret(fn->abiret, &abiargs, &r2off, &ni, mkirtype(retty)); + if (!fn->nabiret && isagg(retty)) { /* ret agg by hidden pointer */ Instr param = copyparam(fn, NULL, 0, abiargs.p[0]); sret = insertinstr(fn->entry, 0, param); ++istart; @@ -392,7 +395,7 @@ abi0(Function *fn) fn->nabiarg = abiargs.n; vfree(&abiargs); - if (!fn->nabiret && isagg(fn->retty)) { + if (!fn->nabiret && isagg(retty)) { /* for structures returned by hidden pointer argument, * if all return instrs return local var X, make X point to the result location, * (return value optimization (RVO)) */ @@ -428,13 +431,13 @@ abi0(Function *fn) } /* adjust returns */ - if (isagg(fn->retty) && blk->jmp.t == Jret && blk->jmp.arg[0].bits) { + if (isagg(retty) && blk->jmp.t == Jret && blk->jmp.arg[0].bits) { assert(!blk->jmp.arg[1].bits); if (fn->nabiret) { /* aggregate return in register(s) */ deluse(blk, USERJUMP, blk->jmp.arg[0]); Ref r[2]; int curi = blk->ins.n; - load2regs(r, mkirtype(fn->retty), blk->jmp.arg[0], fn->nabiret, fn->abiret, r2off, blk, &curi); + load2regs(r, mkirtype(retty), blk->jmp.arg[0], fn->nabiret, fn->abiret, r2off, blk, &curi); for (int i = 0; i < fn->nabiret; ++i) { blk->jmp.arg[i] = r[i]; adduse(blk, USERJUMP, r[i]); @@ -443,7 +446,7 @@ abi0(Function *fn) /* aggregate return (arg[0] is pointer to return value) */ if (rvovar == -1) { /* blit %sret, %arg */ - IRType typ = mkirtype(fn->retty); + IRType typ = mkirtype(retty); insertinstr(blk, blk->ins.n, mkarginstr(typ, sret)); insertinstr(blk, blk->ins.n, mkarginstr(typ, blk->jmp.arg[0])); insertinstr(blk, blk->ins.n, mkintrin(INstructcopy, 0, 2)); |