]> git.sur5r.net Git - cc65/commitdiff
Added optimization for complax.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 7 Jul 2012 19:54:24 +0000 (19:54 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 7 Jul 2012 19:54:24 +0000 (19:54 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5771 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codeopt.c
src/cc65/coptneg.c
src/cc65/coptneg.h

index 0a5eacc141a8f077b6fdc9d4b7d1bd9cd9e1fc16..83cd948cc4fd4d091efbdb2526c7b6f3ce380dd9 100644 (file)
@@ -601,6 +601,7 @@ static OptFunc DOptCmp6             = { OptCmp6,         "OptCmp6",         100, 0,
 static OptFunc DOptCmp7                = { OptCmp7,         "OptCmp7",          85, 0, 0, 0, 0, 0 };
 static OptFunc DOptCmp8                = { OptCmp8,         "OptCmp8",          50, 0, 0, 0, 0, 0 };
 static OptFunc DOptCmp9                = { OptCmp9,         "OptCmp9",          85, 0, 0, 0, 0, 0 };
+static OptFunc DOptComplAX1     = { OptComplAX1,     "OptComplAX1",      65, 0, 0, 0, 0, 0 };
 static OptFunc DOptCondBranches1= { OptCondBranches1,"OptCondBranches1", 80, 0, 0, 0, 0, 0 };
 static OptFunc DOptCondBranches2= { OptCondBranches2,"OptCondBranches2",  0, 0, 0, 0, 0, 0 };
 static OptFunc DOptDeadCode            = { OptDeadCode,     "OptDeadCode",     100, 0, 0, 0, 0, 0 };
@@ -698,6 +699,7 @@ static OptFunc* OptFuncs[] = {
     &DOptCmp7,
     &DOptCmp8,
     &DOptCmp9,
+    &DOptComplAX1,
     &DOptCondBranches1,
     &DOptCondBranches2,
     &DOptDeadCode,
@@ -1088,6 +1090,7 @@ static unsigned RunOptGroup3 (CodeSeg* S)
                C += RunOptFunc (S, &DOptStackOps, 3);
         C += RunOptFunc (S, &DOptShift1, 1);
         C += RunOptFunc (S, &DOptShift4, 1);
+        C += RunOptFunc (S, &DOptComplAX1, 1);
                C += RunOptFunc (S, &DOptSub1, 1);
                C += RunOptFunc (S, &DOptSub2, 1);
                C += RunOptFunc (S, &DOptSub3, 1);
index a25556a01f992819e2dabfc442c264e61295b9d6..083815e9a7476f198584b9d76897f2c3ce4bb9eb 100644 (file)
@@ -557,3 +557,54 @@ unsigned OptNegAX2 (CodeSeg* S)
 
 
 
+/*****************************************************************************/
+/*                           complax optimizations                           */
+/*****************************************************************************/
+
+
+
+unsigned OptComplAX1 (CodeSeg* S)
+/* Search for a call to complax and replace it by
+ *
+ *      eor     #$FF
+ *
+ * if X isn't used later.
+ */
+{
+    unsigned Changes = 0;
+    unsigned I;
+
+    /* Walk over the entries */
+    I = 0;
+    while (I < CS_GetEntryCount (S)) {
+
+       /* Get next entry */
+               CodeEntry* E = CS_GetEntry (S, I);
+
+       /* Check if this is a call to negax, and if X isn't used later */
+               if (CE_IsCallTo (E, "complax") && !RegXUsed (S, I+1)) {
+
+            CodeEntry* X;
+
+            /* Add replacement code behind */
+           X = NewCodeEntry (OP65_EOR, AM65_IMM, "$FF", 0, E->LI);
+           CS_InsertEntry (S, X, I+1);
+
+            /* Delete the call to negax */
+           CS_DelEntry (S, I);
+
+           /* We had changes */
+           ++Changes;
+       }
+
+       /* Next entry */
+       ++I;
+
+    }
+
+    /* Return the number of changes made */
+    return Changes;
+}
+
+
+
index 82bd2f39d98f664ff68c3422a6c4123cbd61aea0..f5c36f79fa8409e7b918e8d7f23e83ff9a3b27a6 100644 (file)
@@ -164,6 +164,22 @@ unsigned OptNegAX2 (CodeSeg* S);
 
 
 
+/*****************************************************************************/
+/*                           complax optimizations                           */
+/*****************************************************************************/
+
+
+
+unsigned OptComplAX1 (CodeSeg* S);
+/* Search for a call to complax and replace it by
+ *
+ *      eor     #$FF
+ *
+ * if X isn't used later.
+ */
+
+
+
 /* End of coptneg.h */
 
 #endif