X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcoptsize.c;h=9ab398ff6f82dfc63807f6fb062efc8840526a97;hb=92dfde6c4e748946c5e13323bb48bf2abd72c2b3;hp=3eaf48dce23fb082efb435e24590d6abcf88067e;hpb=914b2a7e370709a9fe45d738fc8aaa9b7382f76f;p=cc65 diff --git a/src/cc65/coptsize.c b/src/cc65/coptsize.c index 3eaf48dce..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,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; } }