X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcoptadd.c;h=6a4002823434ed953e99b2a884066f6512b4d99a;hb=77bfcc1ff0a88e0430f077d22b6fad07c7d0c86b;hp=d490574d9cdff5dd96091097d4d017bf41945c22;hpb=d7234541e29fa424d63c866868062dede4a181d6;p=cc65 diff --git a/src/cc65/coptadd.c b/src/cc65/coptadd.c index d490574d9..6a4002823 100644 --- a/src/cc65/coptadd.c +++ b/src/cc65/coptadd.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2001-2002 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@cc65.org */ +/* (C) 2001-2005, Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -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 @@ -88,13 +88,13 @@ unsigned OptAdd1 (CodeSeg* S) /* Check for the sequence */ if (L[0]->OPC == OP65_LDY && - CE_KnownImm (L[0]) && + CE_IsConstImm (L[0]) && !CS_RangeHasLabel (S, I+1, 5) && CS_GetEntries (S, L+1, I+1, 5) && CE_IsCallTo (L[1], "ldaxysp") && CE_IsCallTo (L[2], "pushax") && L[3]->OPC == OP65_LDY && - CE_KnownImm (L[3]) && + CE_IsConstImm (L[3]) && CE_IsCallTo (L[4], "ldaxysp") && CE_IsCallTo (L[5], "tosaddax")) { @@ -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 */ @@ -208,12 +208,12 @@ unsigned OptAdd2 (CodeSeg* S) /* Check for the sequence */ if (L[0]->OPC == OP65_LDY && - CE_KnownImm (L[0]) && + CE_IsConstImm (L[0]) && !CS_RangeHasLabel (S, I+1, 3) && CS_GetEntries (S, L+1, I+1, 3) && CE_IsCallTo (L[1], "ldaxysp") && L[2]->OPC == OP65_LDY && - CE_KnownImm (L[2]) && + CE_IsConstImm (L[2]) && CE_IsCallTo (L[3], "addeqysp") && (GetRegInfo (S, I+4, REG_AX) & REG_AX) == 0) { @@ -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 ...