qbe

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

commit 4999d6ebf001ab3c1ae735cc0888521e0a27f9aa
parent 422c2eebaef3a5e88af8a3c2b663530534e0e6fd
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date:   Tue, 12 Apr 2016 13:13:34 -0400

more extensive handling of fast locals

Diffstat:
Misel.c | 7+++++++
1 file changed, 7 insertions(+), 0 deletions(-)

diff --git a/isel.c b/isel.c @@ -230,6 +230,9 @@ sel(Ins i, ANum *an, Fn *fn) r0 = newtmp("isel", k, fn); } else r0 = i.arg[1]; + if (fn->tmp[r0.val].slot != -1) + err("unlikely argument %%%s in %s", + fn->tmp[r0.val].name, opdesc[i.op].name); if (i.op == ODiv || i.op == ORem) { emit(OXIDiv, k, R, r0, R); emit(OSign, k, TMP(RDX), TMP(RAX), R); @@ -238,6 +241,7 @@ sel(Ins i, ANum *an, Fn *fn) emit(OCopy, k, TMP(RDX), CON_Z, R); } emit(OCopy, k, TMP(RAX), i.arg[0], R); + fixarg(&curi->arg[0], k, 0, fn); if (rtype(i.arg[1]) == RCon) emit(OCopy, k, r0, i.arg[1], R); break; @@ -312,6 +316,9 @@ Emit: emit(OSAlloc, Kl, i.to, r0, R); emit(OAnd, Kl, r0, r1, getcon(-16, fn)); emit(OAdd, Kl, r1, i.arg[0], getcon(15, fn)); + if (fn->tmp[i.arg[0].val].slot != -1) + err("unlikely argument %%%s in %s", + fn->tmp[i.arg[0].val].name, opdesc[i.op].name); } break; default: