aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir/optmem.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-05 13:56:54 +0100
committerlemon <lsof@mailbox.org>2025-11-05 19:02:44 +0100
commit13471741b538baa45cd53a521cf7d52087f3200f (patch)
tree15624e0f3a2e8a11f2c114f8309af6e3207193c0 /ir/optmem.c
parent088c3c1ce51de82ef317592bae766ad20f82208d (diff)
amd64: fix aggregate abi stuff;; ir: fold, peephole optimizing constructors
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);
}
}