diff options
| author | 2025-09-11 10:56:10 +0200 | |
|---|---|---|
| committer | 2025-09-11 10:56:10 +0200 | |
| commit | bed033d3ac67a9c5d88e061c6070d049bd7527fd (patch) | |
| tree | 54a7e64843002361469151876b9b28371875c272 /amd64 | |
| parent | 4bdc5566635cd4a538fdc5503d60a589700f47e6 (diff) | |
amd64: improve codegen for ADD
Diffstat (limited to 'amd64')
| -rw-r--r-- | amd64/emit.c | 3 |
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); |