]> git.sur5r.net Git - cc65/blobdiff - src/cc65/coptadd.c
Fixed two compiler warnings.
[cc65] / src / cc65 / coptadd.c
index 4a74bce5ef3ae7c3f11c1844432e4241c7303417..6a4002823434ed953e99b2a884066f6512b4d99a 100644 (file)
@@ -63,8 +63,8 @@ unsigned OptAdd1 (CodeSeg* S)
  *
  *      ldy     #xx-1
  *      lda     (sp),y
- *      clc
  *      ldy     #yy-3
+ *      clc
  *      adc     (sp),y
  *      pha
  *      ldy     #xx
@@ -108,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 */
@@ -287,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
@@ -375,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.
  */
@@ -428,7 +504,7 @@ unsigned OptAdd4 (CodeSeg* S)
 
 
 
-unsigned OptAdd5 (CodeSeg* S)
+unsigned OptAdd6 (CodeSeg* S)
 /* Search for the sequence
  *
  *     adc     ...