X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fpcodepeep.c;h=0465edb61f76b27e01ee03f2b58e2a57da1bd3ec;hb=e2d5ecab4daf154db6b8505dbb6892847139cc3f;hp=3a8d52654825b78bde9cf56ea9c0d87bf890074c;hpb=5df1b9a579235d42fcec8a8884808334ed99a246;p=fw%2Fsdcc diff --git a/src/pic/pcodepeep.c b/src/pic/pcodepeep.c index 3a8d5265..0465edb6 100644 --- a/src/pic/pcodepeep.c +++ b/src/pic/pcodepeep.c @@ -1219,227 +1219,7 @@ static void * DLL_append(_DLL *list, _DLL *next) -----------------------------------------------------------------*/ -#if 0 -/*-----------------------------------------------------------------*/ -/* pCodePeep */ -/*-----------------------------------------------------------------*/ -int pCodePeepCompare(pCode *pc, pCodePeep *pcp) -{ - pCode *pcfrom,*pcto; - pcfrom = pc; - for( pcto=pcp->target; pcto; pcto=pcto->next) { - - pcfrom = findNextInstruction(pcfrom); - - if( pcfrom && - (PCI(pcfrom)->op == PCI(pcto)->op || - PCI(pcto)->op == POC_WILD)) - continue; - return 0; - } - return 0; -} - -/*-----------------------------------------------------------------*/ -/* pCodePeep */ -/*-----------------------------------------------------------------*/ -void pCodePeepSearch(pCodePeep *snippet) -{ - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return; - - /* compare the chain to the pCode that we've - got so far. If a match is found, then replace - the pCode chain. - */ - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - for(pc = pb->pcHead; pc; pc = pc->next) { - pCodePeepCompare(pc,snippet); - } - } - -} -#endif - -#if 0 -pBlock *pBlockAppend(pBlock *pb1, pBlock *pb2) -{ - pBlock *pb; - - if(!pb1->tail) - return pb2; - - pb = pb1->tail; - - pb2->head = pb1; - pb2->tail = NULL; - pb1->tail = pb2; - -} - -#endif - -void pCodePeepInit(void) -{ -#if 0 - pBlock *pb; - // pCode *pc; - pCodePeep *pcp; - pCodePeepSnippets *pcps; - - /* Declare a peep code snippet */ - /* do I really need a separate struct just to DLL the snippets? */ - /* e.g. I could put the DLL into the pCodePeep structure */ - - /* - - target: - - movwf %1 - movf %1,w - - replace: - - movwf %1 - - Condition: - false condition - PCC_Z (Z bit is not used as input to subsequent code) - true condition - none - */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - - pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - addpCode2pBlock( pb, newpCode(POC_MOVFW, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - - pcp->target = pb; - - pcp->replace = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 1; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 0; - pcp->wildpCodes = NULL; - - pcp->postFalseCond = PCC_Z; - pcp->postTrueCond = PCC_NONE; - - fprintf(stderr,"Peep rule\nTarget:\n"); - printpCodeString(stderr,pcp->target->pcHead, 10); - fprintf(stderr,"Replaced with:\n"); - printpCodeString(stderr,pcp->replace->pcHead, 10); - - /* Now for another peep example */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - { - /* - target: - - btfsc %0 - goto %1 - %3 - %1: %4 - - replace: - btfss %0 - %3 - %1: %4 - - The %3 and %4 are wild opcodes. Since the opcodes - are stored in a different array than the wild operands, - they can have the same indices and not conflict. So - below, the %3 is really a %0, %4 is a %1. - - */ - pCodeOp *pcl; - pCodeOp *pcw; - pCodeOp *pcwb; - - // Create a new wild operand subtyped as a bit - pcwb = newpCodeOpWild(0,pcp,newpCodeOpBit(NULL,-1,0)); - - // Create a - pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSC,pcwb)); - - pcl = newpCodeOpLabel(-1); - pcw = newpCodeOpWild(1, pcp, pcl); - addpCode2pBlock( pb, newpCode(POC_GOTO, pcw)); - addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); - addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); - - - pcp->target = pb; - - pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSS, pcwb)); - addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); - addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); - - pcp->replace = pb; - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 2; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 2; - pcp->wildpCodes = Safe_calloc(pcp->nwildpCodes, sizeof(pCode *)); - - pcp->postFalseCond = PCC_NONE; - pcp->postTrueCond = PCC_NONE; - } - - - - - - - - - - - //------------- - - /* Now for another peep example */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - { - pCodeOp *pcw; - - pcw = newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER)); - - pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, pcw)); - addpCode2pBlock( pb, newpCode(POC_MOVWF, pcw)); - - pcp->target = pb; - - pb = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, pcw)); - - pcp->replace = pb; - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 1; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 0; - pcp->wildpCodes = NULL; - - pcp->postFalseCond = PCC_NONE; - pcp->postTrueCond = PCC_NONE; - } - - - -#endif -} /*-----------------------------------------------------------------*/ /* pCodeSearchCondition - Search a pCode chain for a 'condition' */ @@ -1580,10 +1360,18 @@ int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) { char *n; - if(PCI(pcs)->pcop->type == PO_GPR_TEMP) + fprintf(stderr,"line %d\n",__LINE__); + switch(PCI(pcs)->pcop->type) { + case PO_GPR_TEMP: + case PO_FSR: + //case PO_INDF: n = PCOR(PCI(pcs)->pcop)->r->name; - else + + break; + default: + fprintf(stderr,"line %d\n",__LINE__); n = PCI(pcs)->pcop->name; + } if(peepBlock->vars[index]) return (strcmp(peepBlock->vars[index],n) == 0); @@ -1738,6 +1526,8 @@ static pCodeOp *pCodeOpCopy(pCodeOp *pcop) case PO_GPR_REGISTER: case PO_GPR_TEMP: case PO_GPR_BIT: + case PO_FSR: + case PO_INDF: fprintf(stderr,"pCodeOpCopy GPR register\n"); pcopnew = Safe_calloc(1,sizeof(pCodeOpReg) ); PCOR(pcopnew)->r = PCOR(pcop)->r; @@ -1752,8 +1542,6 @@ static pCodeOp *pCodeOpCopy(pCodeOp *pcop) case PO_NONE: case PO_W: case PO_STATUS: - case PO_FSR: - case PO_INDF: case PO_PCL: case PO_PCLATH: @@ -1763,7 +1551,10 @@ static pCodeOp *pCodeOpCopy(pCodeOp *pcop) } pcopnew->type = pcop->type; - pcopnew->name = Safe_strdup(pcop->name); + if(pcop->name) + pcopnew->name = Safe_strdup(pcop->name); + else + pcopnew->name = NULL; return pcopnew; }