aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir/optmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'ir/optmem.c')
-rw-r--r--ir/optmem.c14
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);
}
}