aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-22 09:50:14 +0100
committerlemon <lsof@mailbox.org>2025-11-22 09:50:14 +0100
commite471cfe5d94f47b7bcd95ce37e7d5c75997a7a67 (patch)
treed8082d30d1036ebafcd2e73789fa80940335a7ab
parentfd74f66379b45e2ce29fd83a00f4cbebb2214269 (diff)
amd64/emit: fix REX-requiring 8-bit GPR encoding checking wrong reg
-rw-r--r--amd64/emit.c4
-rw-r--r--c/c.c2
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;