summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--src/z80/gen.c25
2 files changed, 16 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 2d5ce9b74..755bcdb34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@
debugger/mcs51/sdcdb.c,
debugger/mcs51/symtab.c:
Fix bug #3823.
+ * src/z80/gen.c:
+ Fix bug #3854.
2025-08-08 Philipp Klaus Krause <philipp@colecovision.eu>
diff --git a/src/z80/gen.c b/src/z80/gen.c
index 10d69dfca..188357e2c 100644
--- a/src/z80/gen.c
+++ b/src/z80/gen.c
@@ -8479,12 +8479,13 @@ genPlus (iCode * ic)
i += 2;
}
else if (!maskedword && (!premoved || i) && !started && i == size - 2 && aopInReg (ic->result->aop, i, HL_IDX) &&
- aopInReg (rightop, i, C_IDX) && isRegDead (B_IDX, ic))
+ aopInReg (rightop, i, C_IDX) && isRegDead (B_IDX, ic) && leftop->regs[B_IDX] <= i + 1 &&
+ !((aopInReg (rightop, i + 1, H_IDX) || aopInReg (rightop, i + 1, L_IDX)) && leftop->regs[B_IDX] >= i))
{
if (aopInReg (rightop, i + 1, H_IDX) || aopInReg (rightop, i + 1, L_IDX))
{
- cheapMove (ASMOP_B, 0, ic->right->aop, i + 1, true);
- genMove_o (ASMOP_HL, 0, ic->left->aop, i, 2, false, true, de_dead, false, !started);
+ cheapMove (ASMOP_B, 0, rightop, i + 1, true);
+ genMove_o (ASMOP_HL, 0, leftop, i, 2, false, true, de_dead, false, !started);
}
else
{
@@ -8497,12 +8498,13 @@ genPlus (iCode * ic)
i += 2;
}
else if (!maskedword && (!premoved || i) && !started && i == size - 2 && aopInReg (IC_RESULT (ic)->aop, i, HL_IDX) &&
- aopInReg (rightop, i, E_IDX) && isRegDead (D_IDX, ic))
+ aopInReg (rightop, i, E_IDX) && isRegDead (D_IDX, ic) && leftop->regs[D_IDX] <= i + 1 &&
+ !((aopInReg (rightop, i + 1, H_IDX) || aopInReg (rightop, i + 1, L_IDX)) && leftop->regs[D_IDX] >= i))
{
if (aopInReg (rightop, i + 1, H_IDX) || aopInReg (rightop, i + 1, L_IDX))
{
- cheapMove (ASMOP_D, 0, IC_RIGHT (ic)->aop, i + 1, true);
- genMove_o (ASMOP_HL, 0, ic->left->aop, i, 2, false, true, de_dead, false, true);
+ cheapMove (ASMOP_D, 0, rightop, i + 1, true);
+ genMove_o (ASMOP_HL, 0, leftop, i, 2, false, true, de_dead, false, true);
}
else
{
@@ -8515,17 +8517,18 @@ genPlus (iCode * ic)
i += 2;
}
else if (!maskedword && (!premoved || i) && !started && i == size - 2 && aopInReg (IC_RESULT (ic)->aop, i, HL_IDX) &&
- aopInReg (leftop, i, E_IDX) && isRegDead (D_IDX, ic))
+ aopInReg (leftop, i, E_IDX) && isRegDead (D_IDX, ic) && rightop->regs[D_IDX] <= i + 1 &&
+ !((aopInReg (leftop, i + 1, H_IDX) || aopInReg (leftop, i + 1, L_IDX)) && rightop->regs[D_IDX] >= i))
{
if (aopInReg (leftop, i + 1, H_IDX) || aopInReg (leftop, i + 1, L_IDX))
{
- cheapMove (ASMOP_D, 0, IC_LEFT (ic)->aop, i + 1, true);
- fetchPairLong (PAIR_HL, IC_RIGHT (ic)->aop, 0, i);
+ cheapMove (ASMOP_D, 0, leftop, i + 1, true);
+ fetchPairLong (PAIR_HL, rightop, 0, i);
}
else
{
- fetchPairLong (PAIR_HL, IC_RIGHT (ic)->aop, 0, i);
- cheapMove (ASMOP_D, 0, IC_LEFT (ic)->aop, i + 1, true);
+ fetchPairLong (PAIR_HL, rightop, 0, i);
+ cheapMove (ASMOP_D, 0, leftop, i + 1, true);
}
emit3w (A_ADD, ASMOP_HL, ASMOP_DE);
started = true;