]> git.sur5r.net Git - cc65/blobdiff - src/cc65/copttest.c
In case of parse errors for structs, don't just set the type of the result to
[cc65] / src / cc65 / copttest.c
index b23ccaffc01c1ef6c8c10cc9c1b221a07300fd68..1ba2182c2968377b7aca049d7c0ac74934453b69 100644 (file)
@@ -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 <string.h>
-
 /* 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;
+}
+
+
+