aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--amd64/emit.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/amd64/emit.c b/amd64/emit.c
index c10e751..6634c64 100644
--- a/amd64/emit.c
+++ b/amd64/emit.c
@@ -837,6 +837,9 @@ emitinstr(uchar **pcode, struct function *fn, struct block *blk, int curi, struc
Xaddf(pcode, cls, dst, mkimmdatregoper(ins->r));
} else if (ins->reg-1 == dst.reg) { /* two-address add */
Xadd(pcode, cls, dst, mkimmdatregoper(ins->r));
+ } 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));
} else { /* three-address add (lea) */
struct oper mem = { OMEM, .base = NOBASE, .index = NOINDEX };
dst = reg2oper(ins->reg-1);