From 3cd8e39ff61217a37b41cee47f2682f5291317d6 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 12 Dec 2025 12:04:38 +0100 Subject: emit: turn ADD -imm into SUB imm --- amd64/emit.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'amd64/emit.c') diff --git a/amd64/emit.c b/amd64/emit.c index 128d8ad..6121f5e 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -1012,7 +1012,11 @@ emitinstr(uchar **pcode, struct function *fn, struct block *blk, int curi, struc if (kisflt(cls)) { Xaddf(pcode, cls, dst, mkimmdatregoper(ins->r)); } else if (ins->reg-1 == dst.reg) { /* two-address add */ - Xadd(pcode, cls, dst, ref2oper(ins->r)); + src = ref2oper(ins->r); + if (src.t == OIMM && src.imm < 0) /* ADD -imm -> SUB imm, for niceness */ + Xsub(pcode, cls, dst, (src.imm = -src.imm, src)); + else + Xadd(pcode, cls, dst, src); } else if (isregref(ins->r) && ins->reg-1 == mkregoper(ins->r).reg) { /* also two-address after swapping operands */ Xadd(pcode, cls, reg2oper(ins->reg-1), mkimmdatregoper(ins->l)); -- cgit v1.2.3