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:
parent
d42ce3b59e
commit
911355178d
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user