qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit 5371a70266f3ff343e4b05dd4b1498cd9d30bc16
parent ecb2fe88dca4b3c6b695451373d71eed0aeb7830
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date:   Sun,  3 Apr 2016 22:01:58 -0400

fix alignment code in selpar()

Diffstat:
Msysv.c | 15+++++----------
1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/sysv.c b/sysv.c @@ -263,7 +263,7 @@ selcall(Fn *fn, Ins *i0, Ins *i1, RAlloc **rap) { Ins *i; AClass *ac, *a, aret; - int ca, ni, ns; + int ca, ni, ns, al; uint stk, off; Ref r, r1, r2, reg[2], regcp[2]; RAlloc *ra; @@ -316,13 +316,8 @@ selcall(Fn *fn, Ins *i0, Ins *i1, RAlloc **rap) /* allocate return pad */ ra = alloc(sizeof *ra); /* specific to NAlign == 3 */ - aret.align -= 2; - if (aret.align < 0) - aret.align = 0; - ra->i.op = OAlloc + aret.align; - ra->i.cls = Kl; - ra->i.to = r1; - ra->i.arg[0] = getcon(aret.size, fn); + al = aret.align >= 2 ? aret.align - 2 : 0; + ra->i = (Ins){OAlloc+al, r1, {getcon(aret.size, fn)}, Kl}; ra->link = (*rap); *rap = ra; } else { @@ -399,8 +394,6 @@ selpar_(Fn *fn, Ins *i0, Ins *i1) for (i=i0, a=ac; i<i1; i++, a++) { if (i->op != OParc || a->inmem) continue; - for (al=0; a->align >> (al+2); al++) /* CHECK IF NOT STUPID */ - ; if (a->size > 8) { r = newtmp("abi", Kl, fn); a->ref[1] = newtmp("abi", Kl, fn); @@ -409,6 +402,8 @@ selpar_(Fn *fn, Ins *i0, Ins *i1) } a->ref[0] = newtmp("abi", Kl, fn); emit(OStorel, 0, R, a->ref[0], i->to); + /* specific to NAlign == 3 */ + al = a->align >= 2 ? a->align - 2 : 0; emit(OAlloc+al, Kl, i->to, getcon(a->size, fn), R); }