aboutsummaryrefslogtreecommitdiffhomepage
path: root/amd64
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-12 12:04:38 +0100
committerlemon <lsof@mailbox.org>2025-12-12 12:04:38 +0100
commit3cd8e39ff61217a37b41cee47f2682f5291317d6 (patch)
tree220206ee9a02ce093de5f9c375581157501ddba6 /amd64
parent53be85354860d39e15208ad765fbc3d373369a3d (diff)
emit: turn ADD -imm into SUB imm
Diffstat (limited to 'amd64')
-rw-r--r--amd64/emit.c6
1 files changed, 5 insertions, 1 deletions
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));