diff options
Diffstat (limited to 'ir/optmem.c')
| -rw-r--r-- | ir/optmem.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/ir/optmem.c b/ir/optmem.c index 471f11c..9b71c8d 100644 --- a/ir/optmem.c +++ b/ir/optmem.c @@ -246,6 +246,20 @@ mem2reg(struct function *fn) k, mkref(RREG, mctarg->bpr)); } else { adduse(use->blk, use->u, val); + if (isintcon(val) && ext != Ocopy) { + vlong x = intconval(val); + switch (ext) { + case Oexts1: x = (schar)x; break; + case Oextu1: x = (uchar)x; break; + case Oexts2: x = (short)x; break; + case Oextu2: x = (ushort)x; break; + case Oexts4: x = (int)x; break; + case Oextu4: x = (uint)x; break; + default: assert(0); + } + val = mkintcon(k, x); + ext = Ocopy; + } *m = mkinstr(ext, k, val); } } |