diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-04-12 13:13:34 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2016-04-12 14:51:45 -0400 |
commit | 4999d6ebf001ab3c1ae735cc0888521e0a27f9aa (patch) | |
tree | f6c687da0641387eaa89a98b800b0fac7c3fe5a4 | |
parent | 422c2eebaef3a5e88af8a3c2b663530534e0e6fd (diff) | |
download | roux-4999d6ebf001ab3c1ae735cc0888521e0a27f9aa.tar.gz |
more extensive handling of fast locals
-rw-r--r-- | isel.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/isel.c b/isel.c index fa5b617..faf6fa8 100644 --- 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: |