]> git.sur5r.net Git - cc65/blobdiff - src/cc65/coptsize.c
Order of keywords on the keyword table was wrong
[cc65] / src / cc65 / coptsize.c
index 3eaf48dce23fb082efb435e24590d6abcf88067e..9ab398ff6f82dfc63807f6fb062efc8840526a97 100644 (file)
 
 #include <stdlib.h>
 
+/* common */
+#include "cpu.h"
+
 /* cc65 */
 #include "codeent.h"
 #include "codeinfo.h"
-#include "cpu.h"
 #include "coptsize.h"
 
 
@@ -82,6 +84,8 @@ static const CallDesc CallTable [] = {
     { "pushax",     -1,    0,   -1, "pusha0"        },
     { "pushax",     -1, 0xFF,   -1, "pushaFF"       },
     { "pushaysp",   -1,   -1,    0, "pusha0sp"      },
+    { "pushwidx",   -1,   -1,    1, "pushw"         },
+    { "pushwysp",   -1,   -1,    3, "pushw0sp"      },
     { "staxysp",    -1,   -1,    0, "stax0sp"       },
     { "tosaddax",   -1,    0,   -1, "tosadda0"      },
     { "tosandax",   -1,    0,   -1, "tosanda0"      },
@@ -112,7 +116,6 @@ static const CallDesc CallTable [] = {
     { "tosumodax",  -1,    0,   -1, "tosumoda0"     },
     { "tosumulax",  -1,    0,   -1, "tosumula0"     },
     { "tosxorax",   -1,    0,   -1, "tosxora0"      },
-    { "zzzzzzzz",   -1,   -1,   -1, "zzzzzzzz"      },
 
 #if 0
     "tosadd0ax",         /* tosaddeax, sreg = 0 */
@@ -155,18 +158,16 @@ static const CallDesc* FindCall (const char* Name)
 {
     /* Do a binary search */
     int First = 0;
-    int Last = (sizeof(CallTable) / sizeof(CallTable[0])) - 1;
-    int Current;
-    int Result;
+    int Last = CALL_COUNT - 1;
     int Found = 0;
 
     while (First <= Last) {
 
                /* Set current to mid of range */
-       Current = (Last + First) / 2;
+       int Current = (Last + First) / 2;
 
                /* Do a compare */
-               Result = strcmp (CallTable[Current].LongFunc, Name);
+               int Result = strcmp (CallTable[Current].LongFunc, Name);
        if (Result < 0) {
            First = Current + 1;
        } else {
@@ -178,7 +179,6 @@ static const CallDesc* FindCall (const char* Name)
                Found = 1;
            }
        }
-
     }
 
     /* Return the first entry if found, or NULL otherwise */
@@ -210,19 +210,22 @@ unsigned OptSize1 (CodeSeg* S)
     I = 0;
     while (I < CS_GetEntryCount (S)) {
 
+        const CallDesc* D;
+
        /* Get next entry */
                E = CS_GetEntry (S, I);
 
        /* Check if it's a subroutine call */
-       if (E->OPC == OP65_JSR) {
+       if (E->OPC == OP65_JSR && (D = FindCall (E->Arg)) != 0) {
 
            /* Check for any of the known functions. */
-            const CallDesc* D = FindCall (E->Arg);
-            while (D && strcmp (D->LongFunc, E->Arg) == 0) {
+            while (1) {
+
                 /* Check the registers */
                 if ((D->A < 0 || D->A == E->RI->In.RegA) &&
                     (D->X < 0 || D->X == E->RI->In.RegX) &&
                     (D->Y < 0 || D->Y == E->RI->In.RegY)) {
+
                     /* Ok, match for all registers */
                     CodeEntry* X;
                     X = NewCodeEntry (E->OPC, E->AM, D->ShortFunc, 0, E->LI);
@@ -231,8 +234,17 @@ unsigned OptSize1 (CodeSeg* S)
 
                     /* Remember that we had changes */
                     ++Changes;
+
+                    /* Done */
+                    break;
+                }
+
+                /* Next table entry, bail out if next entry not valid */
+                if (++D >= CallTable + CALL_COUNT ||
+                    strcmp (D->LongFunc, E->Arg) != 0) {
+                    /* End of table or entries reached */
+                    break;
                 }
-                ++D;
             }
         }