diff --git a/src/cc65/codeopt.c b/src/cc65/codeopt.c index e90e47454..e8f20e39f 100644 --- a/src/cc65/codeopt.c +++ b/src/cc65/codeopt.c @@ -52,6 +52,7 @@ #include "coptind.h" #include "coptstop.h" #include "coptsub.h" +#include "copttest.h" #include "error.h" #include "global.h" #include "codeopt.h" @@ -112,101 +113,6 @@ static unsigned OptShift1 (CodeSeg* S) -/*****************************************************************************/ -/* Optimize tests */ -/*****************************************************************************/ - - - -static unsigned OptTest1 (CodeSeg* S) -/* On a sequence - * - * stx xxx - * ora xxx - * beq/bne ... - * - * if X is zero, the sequence may be changed to - * - * cmp #$00 - * beq/bne ... - * - * which may be optimized further by another step. - * - * If A is zero, the sequence may be changed to - * - * txa - * beq/bne ... - * - */ -{ - unsigned Changes = 0; - unsigned I; - - /* Generate register info for this step */ - CS_GenRegInfo (S); - - /* Walk over the entries */ - I = 0; - while (I < CS_GetEntryCount (S)) { - - CodeEntry* L[3]; - - /* Get next entry */ - L[0] = CS_GetEntry (S, I); - - /* Check if it's the sequence we're searching for */ - if (L[0]->OPC == OP65_STX && - CS_GetEntries (S, L+1, I+1, 2) && - !CE_HasLabel (L[1]) && - L[1]->OPC == OP65_ORA && - strcmp (L[0]->Arg, L[1]->Arg) == 0 && - !CE_HasLabel (L[2]) && - (L[2]->Info & OF_ZBRA) != 0) { - - /* Check if X is zero */ - if (L[0]->RI->In.RegX == 0) { - - /* Insert the compare */ - CodeEntry* N = NewCodeEntry (OP65_CMP, AM65_IMM, "$00", 0, L[0]->LI); - CS_InsertEntry (S, N, I+2); - - /* Remove the two other insns */ - CS_DelEntry (S, I+1); - CS_DelEntry (S, I); - - /* We had changes */ - ++Changes; - - /* Check if A is zero */ - } else if (L[1]->RI->In.RegA == 0) { - - /* Insert the txa */ - CodeEntry* N = NewCodeEntry (OP65_TXA, AM65_IMP, 0, 0, L[1]->LI); - CS_InsertEntry (S, N, I+2); - - /* Remove the two other insns */ - CS_DelEntry (S, I+1); - CS_DelEntry (S, I); - - /* We had changes */ - ++Changes; - } - } - - /* Next entry */ - ++I; - - } - - /* Free register info */ - CS_FreeRegInfo (S); - - /* Return the number of changes made */ - return Changes; -} - - - /*****************************************************************************/ /* nega optimizations */ /*****************************************************************************/ @@ -1679,7 +1585,7 @@ static unsigned RunOptFunc (CodeSeg* S, OptFunc* F, unsigned Max) /* Run this until there are no more changes */ Changes = 0; do { - + /* Run the function */ C = F->Func (S); Changes += C; diff --git a/src/cc65/copttest.c b/src/cc65/copttest.c new file mode 100644 index 000000000..b23ccaffc --- /dev/null +++ b/src/cc65/copttest.c @@ -0,0 +1,139 @@ +/*****************************************************************************/ +/* */ +/* copttest.c */ +/* */ +/* Optimize test sequences */ +/* */ +/* */ +/* */ +/* (C) 2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include + +/* cc65 */ +#include "codeent.h" +#include "codeinfo.h" +#include "copttest.h" + + + +/*****************************************************************************/ +/* Optimize tests */ +/*****************************************************************************/ + + + +unsigned OptTest1 (CodeSeg* S) +/* Given a sequence + * + * stx xxx + * ora xxx + * beq/bne ... + * + * If X is zero, the sequence may be changed to + * + * cmp #$00 + * beq/bne ... + * + * which may be optimized further by another step. + * + * If A is zero, the sequence may be changed to + * + * txa + * beq/bne ... + * + */ +{ + unsigned Changes = 0; + unsigned I; + + /* Generate register info for this step */ + CS_GenRegInfo (S); + + /* Walk over the entries */ + I = 0; + while (I < CS_GetEntryCount (S)) { + + CodeEntry* L[3]; + + /* Get next entry */ + L[0] = CS_GetEntry (S, I); + + /* Check if it's the sequence we're searching for */ + if (L[0]->OPC == OP65_STX && + CS_GetEntries (S, L+1, I+1, 2) && + !CE_HasLabel (L[1]) && + L[1]->OPC == OP65_ORA && + strcmp (L[0]->Arg, L[1]->Arg) == 0 && + !CE_HasLabel (L[2]) && + (L[2]->Info & OF_ZBRA) != 0) { + + /* Check if X is zero */ + if (L[0]->RI->In.RegX == 0) { + + /* Insert the compare */ + CodeEntry* N = NewCodeEntry (OP65_CMP, AM65_IMM, "$00", 0, L[0]->LI); + CS_InsertEntry (S, N, I+2); + + /* Remove the two other insns */ + CS_DelEntry (S, I+1); + CS_DelEntry (S, I); + + /* We had changes */ + ++Changes; + + /* Check if A is zero */ + } else if (L[1]->RI->In.RegA == 0) { + + /* Insert the txa */ + CodeEntry* N = NewCodeEntry (OP65_TXA, AM65_IMP, 0, 0, L[1]->LI); + CS_InsertEntry (S, N, I+2); + + /* Remove the two other insns */ + CS_DelEntry (S, I+1); + CS_DelEntry (S, I); + + /* We had changes */ + ++Changes; + } + } + + /* Next entry */ + ++I; + + } + + /* Free register info */ + CS_FreeRegInfo (S); + + /* Return the number of changes made */ + return Changes; +} + + + diff --git a/src/cc65/copttest.h b/src/cc65/copttest.h new file mode 100644 index 000000000..0a0af4add --- /dev/null +++ b/src/cc65/copttest.h @@ -0,0 +1,80 @@ +/*****************************************************************************/ +/* */ +/* copttest.h */ +/* */ +/* Optimize test sequences */ +/* */ +/* */ +/* */ +/* (C) 2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef COPTTEST_H +#define COPTTEST_H + + + +/* cc65 */ +#include "codeseg.h" + + + +/*****************************************************************************/ +/* Optimize tests */ +/*****************************************************************************/ + + + +unsigned OptTest1 (CodeSeg* S); +/* Given a sequence + * + * stx xxx + * ora xxx + * beq/bne ... + * + * If X is zero, the sequence may be changed to + * + * cmp #$00 + * beq/bne ... + * + * which may be optimized further by another step. + * + * If A is zero, the sequence may be changed to + * + * txa + * beq/bne ... + * + */ + + + +/* End of copttest.h */ + +#endif + + + diff --git a/src/cc65/make/gcc.mak b/src/cc65/make/gcc.mak index 4a6db126b..f0848f198 100644 --- a/src/cc65/make/gcc.mak +++ b/src/cc65/make/gcc.mak @@ -38,6 +38,7 @@ OBJS = anonname.o \ coptind.o \ coptstop.o \ coptsub.o \ + copttest.o \ cpu.o \ dataseg.o \ datatype.o \ diff --git a/src/cc65/make/watcom.mak b/src/cc65/make/watcom.mak index 0d4c05a5f..270998fe9 100644 --- a/src/cc65/make/watcom.mak +++ b/src/cc65/make/watcom.mak @@ -83,6 +83,7 @@ OBJS = anonname.obj \ coptind.obj \ coptstop.obj \ coptsub.obj \ + copttest.obj \ cpu.obj \ dataseg.obj \ datatype.obj \ @@ -156,6 +157,7 @@ FILE coptcmp.obj FILE coptind.obj FILE coptstop.obj FILE coptsub.obj +FILE copttest.obj FILE cpu.obj FILE dataseg.obj FILE datatype.obj