diff options
Diffstat (limited to 'lisc/isel.c')
-rw-r--r-- | lisc/isel.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lisc/isel.c b/lisc/isel.c index 36466ee..30c9b1f 100644 --- a/lisc/isel.c +++ b/lisc/isel.c @@ -117,6 +117,33 @@ sel(Ins i, Fn *fn) case OCopy: emit(i.op, i.to, i.arg[0], i.arg[1]); break; + case OStore: + case OStoreb: + case OStores: + r0 = i.arg[0]; + goto Load; + case OLoad: + case OLoadss: + case OLoadus: + case OLoadsb: + case OLoadub: + r0 = i.arg[0]; + if (rtype(r0) == RCon) { + t = newtmp(TLong, fn); + r0 = TMP(t); + } + Load: + r1 = i.arg[1]; + if (rtype(r1) == RCon) { + t = newtmp(TLong, fn); + r1 = TMP(t); + } + emit(i.op, i.to, r0, r1); + if (!req(r0, i.arg[0])) + emit(OCopy, r0, i.arg[0], R); + if (!req(r1, i.arg[1])) + emit(OCopy, r1, i.arg[1], R); + break; case ONop: break; default: |