X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcoptsize.c;h=9ab398ff6f82dfc63807f6fb062efc8840526a97;hb=c130e597b013e37c94afd6651be1e8859ba7e5ac;hp=b6b86e6781d0633bee5c41908ac96170e231c093;hpb=571ea849d97e9cd26a06b3101c894fb680aa02a7;p=cc65 diff --git a/src/cc65/coptsize.c b/src/cc65/coptsize.c index b6b86e678..9ab398ff6 100644 --- a/src/cc65/coptsize.c +++ b/src/cc65/coptsize.c @@ -35,10 +35,12 @@ #include +/* 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,21 +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 && - D < CallTable + (sizeof (CallTable) / sizeof (CallTable[0])) && - 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); @@ -233,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; } }