From e471cfe5d94f47b7bcd95ce37e7d5c75997a7a67 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 22 Nov 2025 09:50:14 +0100 Subject: amd64/emit: fix REX-requiring 8-bit GPR encoding checking wrong reg --- amd64/emit.c | 4 ++-- c/c.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/amd64/emit.c b/amd64/emit.c index 5a63a61..4ad0a04 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -293,7 +293,7 @@ encode(uchar **pcode, const struct desc *tab, int ntab, enum irclass k, struct o rex |= (dst.reg >> 3) << 2; /* REX.R */ rex |= (src.reg >> 3) << 0; /* REX.B */ if (rex) B(0x40 | rex); - else if (en->r8 && in_range(dst.reg, RSP, RDI)) { + else if (en->r8 && in_range(src.reg, RSP, RDI)) { /* /r8 needs REX to encode SP,BP,SI,DI (otherwise -> AH..BH) */ B(0x40); } @@ -304,7 +304,7 @@ encode(uchar **pcode, const struct desc *tab, int ntab, enum irclass k, struct o rex |= (src.reg >> 3) << 2; /* REX.R */ rex |= (dst.reg >> 3) << 0; /* REX.B */ if (rex) B(0x40 | rex); - else if (en->r8 && in_range(src.reg, RSP, RDI)) { + else if (en->r8 && in_range(dst.reg, RSP, RDI)) { /* /r8 needs REX to encode SP,BP,SI,DI (otherwise -> AH..BH) */ B(0x40); } diff --git a/c/c.c b/c/c.c index 5708419..5a0f5bd 100644 --- a/c/c.c +++ b/c/c.c @@ -3227,6 +3227,8 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) case EPLUS: r = compileexpr(fn, sub, discard); if (discard) return NOREF; + if (isscalar(ex->ty) && typesize(ex->ty) < typesize(sub->ty)) + return narrow(fn, type2cls[scalartypet(ex->ty)], ex->ty, r, 0); return cvt(fn, ex->ty, sub->ty, r); case ENEG: op = Oneg; -- cgit v1.2.3