From c0db7d92c14b242daf008f7e3731a5d080e23fa1 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 28 Feb 2026 09:12:18 +0100 Subject: regalloc: fix defn of spilled var with immediate With `i64 %a = copy 0xabcdef12345`, if `%a` was spilled, this would turn into a `storei64` instruction with an unencondable immediate operand (larger than 32 bits in x86, non-zero in aarch64). --- aarch64/emit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'aarch64') diff --git a/aarch64/emit.c b/aarch64/emit.c index 3fd3278..fdcb866 100644 --- a/aarch64/emit.c +++ b/aarch64/emit.c @@ -831,7 +831,8 @@ emitinstr(uchar **pcode, struct function *fn, struct block *blk, int curi, struc case Ostorei32: cls = KI32; X2 = Xstr; goto Store; case Ostorei64: cls = KI64; X2 = Xstr; Store: - X2(pcode, cls, ref2oper(ins->r), mkmemoper(1<<(ins->op-Ostorei8), ins->l)); + X2(pcode, cls, ins->r.bits == ZEROREF.bits ? REGZR : ref2oper(ins->r), + mkmemoper(1<<(ins->op-Ostorei8), ins->l)); break; case Ostoref32: case Ostoref64: Xfstr(pcode, KF32 + ins->op-Ostoref32, ref2oper(ins->r), mkmemoper(ins->op == Oloadf32 ? 4 : 8, ins->l)); -- cgit v1.2.3