X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcopttest.c;h=1ba2182c2968377b7aca049d7c0ac74934453b69;hb=ce931b85be8c41d30510685c6b92fbe74e12aec9;hp=b23ccaffc01c1ef6c8c10cc9c1b221a07300fd68;hpb=62e48d9fd968854621c4d523fee3747a86dee40a;p=cc65 diff --git a/src/cc65/copttest.c b/src/cc65/copttest.c index b23ccaffc..1ba2182c2 100644 --- a/src/cc65/copttest.c +++ b/src/cc65/copttest.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2001 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@cc65.org */ +/* (C) 2001-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -33,8 +33,6 @@ -#include - /* cc65 */ #include "codeent.h" #include "codeinfo.h" @@ -96,15 +94,15 @@ unsigned OptTest1 (CodeSeg* S) /* Check if X is zero */ if (L[0]->RI->In.RegX == 0) { - /* Insert the compare */ - CodeEntry* N = NewCodeEntry (OP65_CMP, AM65_IMM, "$00", 0, L[0]->LI); - CS_InsertEntry (S, N, I+2); + /* Insert the compare */ + CodeEntry* N = NewCodeEntry (OP65_CMP, AM65_IMM, "$00", 0, L[0]->LI); + CS_InsertEntry (S, N, I+2); - /* Remove the two other insns */ - CS_DelEntry (S, I+1); - CS_DelEntry (S, I); + /* Remove the two other insns */ + CS_DelEntry (S, I+1); + CS_DelEntry (S, I); - /* We had changes */ + /* We had changes */ ++Changes; /* Check if A is zero */ @@ -137,3 +135,48 @@ unsigned OptTest1 (CodeSeg* S) +unsigned OptTest2 (CodeSeg* S) +/* Search for an inc/dec operation followed by a load and a conditional + * branch based on the flags from the load. Remove the load if the insn + * isn't used later. + */ +{ + unsigned Changes = 0; + + /* Walk over the entries */ + unsigned I = 0; + while (I < CS_GetEntryCount (S)) { + + CodeEntry* L[3]; + + /* Get next entry */ + L[0] = CS_GetEntry (S, I); + + /* Check if it's the sequence we're searching for */ + if ((L[0]->OPC == OP65_INC || L[0]->OPC == OP65_DEC) && + CS_GetEntries (S, L+1, I+1, 2) && + !CE_HasLabel (L[1]) && + (L[1]->Info & OF_LOAD) != 0 && + (L[2]->Info & OF_FBRA) != 0 && + L[1]->AM == L[0]->AM && + strcmp (L[0]->Arg, L[1]->Arg) == 0 && + (GetRegInfo (S, I+2, L[1]->Chg) & L[1]->Chg) == 0) { + + printf ("Deleting\n"); + + /* Remove the load */ + CS_DelEntry (S, I+1); + ++Changes; + } + + /* Next entry */ + ++I; + + } + + /* Return the number of changes made */ + return Changes; +} + + +