]> git.sur5r.net Git - cc65/blobdiff - src/cc65/coptadd.c
Restructured search path handling.
[cc65] / src / cc65 / coptadd.c
index 76f697d792a22a55dca4f779e1d3413e98cfdd53..6a4002823434ed953e99b2a884066f6512b4d99a 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001-2002 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2001-2005, Ullrich von Bassewitz                                      */
+/*                Römerstrasse 52                                            */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -33,7 +33,8 @@
 
 
 
-#include <ctype.h>
+/* common */
+#include "chartype.h"
 
 /* cc65 */
 #include "codeent.h"
@@ -62,8 +63,8 @@ unsigned OptAdd1 (CodeSeg* S)
  *
  *      ldy     #xx-1
  *      lda     (sp),y
- *      clc
  *      ldy     #yy-3
+ *      clc
  *      adc     (sp),y
  *      pha
  *      ldy     #xx
@@ -87,13 +88,13 @@ unsigned OptAdd1 (CodeSeg* S)
 
        /* Check for the sequence */
                if (L[0]->OPC == OP65_LDY            &&
-           CE_KnownImm (L[0])               &&
+           CE_IsConstImm (L[0])             &&
            !CS_RangeHasLabel (S, I+1, 5)    &&
                    CS_GetEntries (S, L+1, I+1, 5)   &&
                    CE_IsCallTo (L[1], "ldaxysp")    &&
                    CE_IsCallTo (L[2], "pushax")     &&
                    L[3]->OPC == OP65_LDY            &&
-           CE_KnownImm (L[3])               &&
+           CE_IsConstImm (L[3])             &&
                    CE_IsCallTo (L[4], "ldaxysp")    &&
                    CE_IsCallTo (L[5], "tosaddax")) {
 
@@ -107,13 +108,13 @@ unsigned OptAdd1 (CodeSeg* S)
             X = NewCodeEntry (OP65_LDA, AM65_ZP_INDY, "sp", 0, L[1]->LI);
             CS_InsertEntry (S, X, I+1);
 
-                   /* clc */
-           X = NewCodeEntry (OP65_CLC, AM65_IMP, 0, 0, L[5]->LI);
-           CS_InsertEntry (S, X, I+2);
-
             /* ldy #yy-3 */
            Arg = MakeHexArg (L[3]->Num - 3);
             X = NewCodeEntry (OP65_LDY, AM65_IMM, Arg, 0, L[4]->LI);
+           CS_InsertEntry (S, X, I+2);
+
+                   /* clc */
+           X = NewCodeEntry (OP65_CLC, AM65_IMP, 0, 0, L[5]->LI);
            CS_InsertEntry (S, X, I+3);
 
            /* adc (sp),y */
@@ -207,12 +208,12 @@ unsigned OptAdd2 (CodeSeg* S)
 
        /* Check for the sequence */
        if (L[0]->OPC == OP65_LDY               &&
-           CE_KnownImm (L[0])                  &&
+           CE_IsConstImm (L[0])                &&
            !CS_RangeHasLabel (S, I+1, 3)       &&
                    CS_GetEntries (S, L+1, I+1, 3)      &&
            CE_IsCallTo (L[1], "ldaxysp")       &&
                    L[2]->OPC == OP65_LDY               &&
-           CE_KnownImm (L[2])                  &&
+           CE_IsConstImm (L[2])                &&
                    CE_IsCallTo (L[3], "addeqysp")      &&
                    (GetRegInfo (S, I+4, REG_AX) & REG_AX) == 0) {
 
@@ -286,6 +287,82 @@ unsigned OptAdd2 (CodeSeg* S)
 
 
 unsigned OptAdd3 (CodeSeg* S)
+/* Search for the sequence
+ *
+ *     jsr     pushax
+ *             ldx     #$00
+ *      lda     xxx
+ *      jsr     tosaddax
+ *
+ * and replace it by
+ *
+ *      clc
+ *      adc     xxx
+ *      bcc     L1
+ *      inx
+ * L1:
+ */
+{
+    unsigned Changes = 0;
+
+    /* Walk over the entries */
+    unsigned I = 0;
+    while (I < CS_GetEntryCount (S)) {
+
+       CodeEntry* L[5];
+
+       /* Get next entry */
+               L[0] = CS_GetEntry (S, I);
+
+       /* Check for the sequence */
+        if (CE_IsCallTo (L[0], "pushax")                        &&
+                   CS_GetEntries (S, L+1, I+1, 4)                      &&
+            !CS_RangeHasLabel (S, I+1, 3)                       &&
+            L[1]->OPC == OP65_LDX                               &&
+            CE_IsKnownImm (L[1], 0)                             &&
+            L[2]->OPC == OP65_LDA                               &&
+            CE_IsCallTo (L[3], "tosaddax")) {
+
+            CodeEntry* X;
+            CodeLabel* Label;
+
+            /* Insert new code behind the sequence */
+           X = NewCodeEntry (OP65_CLC, AM65_IMP, 0, 0, L[3]->LI);
+           CS_InsertEntry (S, X, I+4);
+
+            /* adc xxx */
+           X = NewCodeEntry (OP65_ADC, L[2]->AM, L[2]->Arg, 0, L[3]->LI);
+           CS_InsertEntry (S, X, I+5);
+
+            /* bcc L1 */
+            Label = CS_GenLabel (S, L[4]);
+            X = NewCodeEntry (OP65_BCC, AM65_BRA, Label->Name, Label, L[3]->LI);
+           CS_InsertEntry (S, X, I+6);
+
+            /* inx */
+            X = NewCodeEntry (OP65_INX, AM65_IMP, 0, 0, L[3]->LI);
+           CS_InsertEntry (S, X, I+7);
+
+           /* Delete the old code */
+           CS_DelEntries (S, I, 4);
+
+           /* Remember, we had changes */
+           ++Changes;
+
+       }
+
+       /* Next entry */
+       ++I;
+
+    }
+
+    /* Return the number of changes made */
+    return Changes;
+}
+
+
+
+unsigned OptAdd4 (CodeSeg* S)
 /* Search for the sequence
  *
  *     jsr     pushax
@@ -374,7 +451,7 @@ unsigned OptAdd3 (CodeSeg* S)
 
 
 
-unsigned OptAdd4 (CodeSeg* S)
+unsigned OptAdd5 (CodeSeg* S)
 /* Search for a call to incaxn and replace it by an 8 bit add if the X register
  * is not used later.
  */
@@ -393,7 +470,7 @@ unsigned OptAdd4 (CodeSeg* S)
        /* Check for the sequence */
         if (E->OPC == OP65_JSR                          &&
             strncmp (E->Arg, "incax", 5) == 0           &&
-            isdigit (E->Arg[5])                         &&
+            IsDigit (E->Arg[5])                         &&
             E->Arg[6] == '\0'                           &&
             !RegXUsed (S, I+1)) {
 
@@ -427,7 +504,7 @@ unsigned OptAdd4 (CodeSeg* S)
 
 
 
-unsigned OptAdd5 (CodeSeg* S)
+unsigned OptAdd6 (CodeSeg* S)
 /* Search for the sequence
  *
  *     adc     ...