1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-18 00:07:21 +00:00

Added an additional precondition before replacing code in OptPushPop. Fixed a

few places where new code was inserted after existing code instead the other
way round.


git-svn-id: svn://svn.cc65.org/cc65/trunk@4287 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2009-10-01 14:39:26 +00:00
parent d42ce3b59e
commit 911355178d

View File

@ -1643,11 +1643,11 @@ unsigned OptTransfers3 (CodeSeg* S)
/* If we have a replacement store, change the code */ /* If we have a replacement store, change the code */
if (X) { if (X) {
/* Insert after the xfer insn */ /* Insert before the xfer insn */
CS_InsertEntry (S, X, Xfer+1); CS_InsertEntry (S, X, Xfer);
/* Remove the xfer instead */ /* Remove the xfer instead */
CS_DelEntry (S, Xfer); CS_DelEntry (S, Xfer+1);
/* Remove the final store */ /* Remove the final store */
CS_DelEntry (S, Store); CS_DelEntry (S, Store);
@ -1801,11 +1801,11 @@ unsigned OptTransfers4 (CodeSeg* S)
/* If we have a replacement load, change the code */ /* If we have a replacement load, change the code */
if (X) { if (X) {
/* Insert after the xfer insn */ /* Insert before the xfer insn */
CS_InsertEntry (S, X, Xfer+1); CS_InsertEntry (S, X, Xfer);
/* Remove the xfer instead */ /* Remove the xfer instead */
CS_DelEntry (S, Xfer); CS_DelEntry (S, Xfer+1);
/* Remove the initial load */ /* Remove the initial load */
CS_DelEntry (S, Load); CS_DelEntry (S, Load);
@ -1904,23 +1904,25 @@ unsigned OptPushPop (CodeSeg* S)
case FoundPop: case FoundPop:
/* We're at the instruction after the PLA. /* We're at the instruction after the PLA.
* Check for the following conditions: * Check for the following conditions:
* - If this instruction is a store of A, and A is not used * - If this instruction is a store of A, does not have a
* later, we may replace the PHA by the store and remove * label, and A is not used later, we may replace the PHA
* pla if several other conditions are met. * by the store and remove 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 either unused later, or not changed by the code * is either unused later, or not changed by the code
* between push and pop, we may remove PHA and PLA. * between push and pop, we may remove PHA and PLA.
*/ */
if (E->OPC == OP65_STA && if (E->OPC == OP65_STA &&
!CE_HasLabel (E) &&
!RegAUsed (S, I+1) && !RegAUsed (S, I+1) &&
!MemAccess (S, Push+1, Pop-1, E)) { !MemAccess (S, Push+1, Pop-1, E)) {
/* Insert a STA after the PHA */ /* Insert a STA before the PHA */
X = NewCodeEntry (E->OPC, E->AM, E->Arg, E->JumpTo, E->LI); X = NewCodeEntry (E->OPC, E->AM, E->Arg, E->JumpTo, E->LI);
CS_InsertEntry (S, X, Push+1); CS_InsertEntry (S, X, Push);
/* Remove the PHA instead */ /* Remove the PHA instead */
CS_DelEntry (S, Push); CS_DelEntry (S, Push+1);
/* Remove the PLA/STA sequence */ /* Remove the PLA/STA sequence */
CS_DelEntries (S, Pop, 2); CS_DelEntries (S, Pop, 2);