1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00

Added another condition that allows us to remove pha/pla.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4163 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2009-09-13 13:22:27 +00:00
parent 785d8ebb43
commit e035323ab4

View File

@ -1717,6 +1717,7 @@ unsigned OptPushPop (CodeSeg* S)
unsigned Changes = 0; unsigned Changes = 0;
unsigned Push = 0; /* Index of push insn */ unsigned Push = 0; /* Index of push insn */
unsigned Pop = 0; /* Index of pop insn */ unsigned Pop = 0; /* Index of pop insn */
unsigned ChgA = 0; /* Flag for A changed */
enum { enum {
Searching, Searching,
FoundPush, FoundPush,
@ -1746,6 +1747,7 @@ unsigned OptPushPop (CodeSeg* S)
if (E->OPC == OP65_PHA) { if (E->OPC == OP65_PHA) {
/* Found start of sequence */ /* Found start of sequence */
Push = I; Push = I;
ChgA = 0;
State = FoundPush; State = FoundPush;
} }
break; break;
@ -1754,6 +1756,7 @@ unsigned OptPushPop (CodeSeg* S)
if (E->OPC == OP65_PHA) { if (E->OPC == OP65_PHA) {
/* Inner push/pop, restart */ /* Inner push/pop, restart */
Push = I; Push = I;
ChgA = 0;
} else if (E->OPC == OP65_PLA) { } else if (E->OPC == OP65_PLA) {
/* Found a matching pop */ /* Found a matching pop */
Pop = I; Pop = I;
@ -1766,6 +1769,8 @@ unsigned OptPushPop (CodeSeg* S)
/* Go into searching mode again */ /* Go into searching mode again */
State = Searching; State = Searching;
} }
} else if (E->Chg & REG_A) {
ChgA = 1;
} }
break; break;
@ -1776,7 +1781,8 @@ unsigned OptPushPop (CodeSeg* S)
* later, we may replace the PHA by the store and remove * later, we may replace the PHA by the store and remove
* pla if several other conditions are met. * pla if several other conditions are met.
* - If this instruction is not a conditional branch, and A * - If this instruction is not a conditional branch, and A
* is unused later, we may remove PHA and PLA. * is either unused later, or not changed by the code
* between push and pop, we may remove PHA and PLA.
*/ */
if (E->OPC == OP65_STA && if (E->OPC == OP65_STA &&
!RegAUsed (S, I+1) && !RegAUsed (S, I+1) &&
@ -1799,7 +1805,7 @@ unsigned OptPushPop (CodeSeg* S)
++Changes; ++Changes;
} else if ((E->Info & OF_CBRA) == 0 && } else if ((E->Info & OF_CBRA) == 0 &&
!RegAUsed (S, I)) { (!RegAUsed (S, I) || !ChgA)) {
/* We can remove the PHA and PLA instructions */ /* We can remove the PHA and PLA instructions */
CS_DelEntry (S, Pop); CS_DelEntry (S, Pop);