#include "common.h" // Include everything in the SDCC src directory
#include "newalloc.h"
-
-
+//#define PCODE_DEBUG
#include "pcode.h"
#include "pcodeflow.h"
#include "ralloc.h"
#endif
pCodeOp *popCopyGPR2Bit(pCodeOpReg *pc, int bitval);
+pCodeOp *popRegFromString(char *str, int size, int offset);
-
-pCodeOp *newpCodeOpWild(int id, pCodePeep *pcp, pCodeOp *subtype);
+pCodeOp *newpCodeOpWild(int id, pCodeWildBlock *pcwb, pCodeOp *subtype);
pCode *newpCodeWild(int pCodeID, pCodeOp *optional_operand, pCodeOp *optional_label);
pCode * findNextInstruction(pCode *pc);
int getpCode(char *mnem,int dest);
+int getpCodePeepCommand(char *cmd);
void pBlockMergeLabels(pBlock *pb);
char *pCode2str(char *str, int size, pCode *pc);
+char *get_op( pCodeOp *pcop,char *buf,int buf_size);
extern pCodeInstruction *pic14Mnemonics[];
+#define IS_PCCOMMENT(x) ( x && (x->type==PC_COMMENT))
+
/****************************************************************/
/*
* rootRules - defined in SDCCpeep.c
/* */
/****************************************************************/
-static pCodePeep *curPeep=NULL;
+//static pCodePeep *curPeep=NULL;
/****************************************************************/
/* */
/* */
/****************************************************************/
-static pBlock *curBlock=NULL;
+//static pBlock *curBlock=NULL;
/****************************************************************/
/* */
/****************************************************************/
-static int sMaxWildVar = 0;
-static int sMaxWildMnem = 0;
+//static int sMaxWildVar = 0;
+//static int sMaxWildMnem = 0;
typedef struct pCodeToken
PCT_NULL=0,
PCT_SPACE=1,
PCT_PERCENT,
+ PCT_LESSTHAN,
+ PCT_GREATERTHAN,
PCT_COLON,
PCT_COMMA,
PCT_COMMENT,
typedef struct pcPattern {
char pt; // Pattern type
char *tokens; // list of tokens that describe the pattern
- void * (*f) (void *);
+ void * (*f) (void *,pCodeWildBlock *);
} pcPattern;
pcPattern pcpArr[] = {
ALT_MNEM1A,
ALT_MNEM1B,
ALT_MNEM2,
- ALT_MNEM2A
+ ALT_MNEM2A,
+ ALT_MNEM3
} altPatterns;
static char alt_comment[] = { PCP_COMMENT, 0};
static char alt_mnem1b[] = { PCP_STR, PCP_NUMBER, 0};
static char alt_mnem2[] = { PCP_STR, PCP_STR, PCP_COMMA, PCP_STR, 0};
static char alt_mnem2a[] = { PCP_STR, PCP_WILDVAR, PCP_COMMA, PCP_STR, 0};
-
-static void * cvt_altpat_label(void *pp);
-static void * cvt_altpat_comment(void *pp);
-static void * cvt_altpat_mnem0(void *pp);
-static void * cvt_altpat_mnem0a(void *pp);
-static void * cvt_altpat_mnem1(void *pp);
-static void * cvt_altpat_mnem1a(void *pp);
-static void * cvt_altpat_mnem1b(void *pp);
-static void * cvt_altpat_mnem2(void *pp);
-static void * cvt_altpat_mnem2a(void *pp);
+static char alt_mnem3[] = { PCP_STR, PCP_STR, PCP_COMMA, PCP_NUMBER, 0};
+
+static void * cvt_altpat_label(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_comment(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem0(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem0a(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem1(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem1a(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem1b(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem2(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem2a(void *pp,pCodeWildBlock *pcwb);
+static void * cvt_altpat_mnem3(void *pp,pCodeWildBlock *pcwb);
pcPattern altArr[] = {
{ALT_LABEL, alt_label, cvt_altpat_label},
{ALT_COMMENT, alt_comment,cvt_altpat_comment},
+ {ALT_MNEM3, alt_mnem3, cvt_altpat_mnem3},
{ALT_MNEM2A, alt_mnem2a, cvt_altpat_mnem2a},
{ALT_MNEM2, alt_mnem2, cvt_altpat_mnem2},
{ALT_MNEM1B, alt_mnem1b, cvt_altpat_mnem1b},
/* at this point, we wish to extract only the 'number' */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_label(void *pp)
+static void * cvt_altpat_label(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
/* */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_comment(void *pp)
+static void * cvt_altpat_comment(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
}
/*-----------------------------------------------------------------*/
+/* cvt_altpat_mem0 - convert assembly line type to a wild pCode */
+/* instruction */
+/* */
+/* pp[0] - str */
+/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem0(void *pp)
+static void * cvt_altpat_mnem0(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
int opcode;
DFPRINTF((stderr,"altpat_mnem0 %s\n", p->pct[0].tok.s));
opcode = getpCode(p->pct[0].tok.s,0);
+
if(opcode < 0) {
- fprintf(stderr, "Bad mnemonic\n");
+ /* look for special command strings like _NOTBITSKIP_ */
+
+ //fprintf(stderr, "Bad mnemonic\n");
+
+ opcode = getpCodePeepCommand(p->pct[0].tok.s);
+ //if(opcode > 0)
+ // fprintf(stderr," but valid peep command: %s, key = %d\n",p->pct[0].tok.s,opcode);
return NULL;
}
/* pp[0] - wild var */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem0a(void *pp)
+static void * cvt_altpat_mnem0a(void *pp, pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
/* Save the index of the maximum wildcard mnemonic */
- if(p[0].pct[1].tok.n > sMaxWildVar)
- sMaxWildMnem = p[0].pct[1].tok.n;
+ //if(p[0].pct[1].tok.n > sMaxWildVar)
+ // sMaxWildMnem = p[0].pct[1].tok.n;
+
+ if(p[0].pct[1].tok.n > pcwb->nwildpCodes)
+ pcwb->nwildpCodes = p[0].pct[1].tok.n;
return newpCodeWild(p[0].pct[1].tok.n,NULL,NULL);
/* pp[1] - Operand */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem1(void *pp)
+static void * cvt_altpat_mnem1(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
opcode = getpCode(p->pct[0].tok.s,0);
if(opcode < 0) {
- fprintf(stderr, "Bad mnemonic\n");
+ //fprintf(stderr, "Bad mnemonic\n");
+ opcode = getpCodePeepCommand(p->pct[0].tok.s);
+ //if(opcode > 0)
+ //fprintf(stderr," but valid peep command: %s, key = %d\n",p->pct[0].tok.s,opcode);
+
return NULL;
}
/* pp[1] - wild var */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem1a(void *pp)
+static void * cvt_altpat_mnem1a(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
int opcode;
opcode = getpCode(p->pct[0].tok.s,0);
if(opcode < 0) {
- fprintf(stderr, "Bad mnemonic\n");
- return NULL;
+ int cmd_id = getpCodePeepCommand(p->pct[0].tok.s);
+ pCode *pc=NULL;
+
+ if(cmd_id<0) {
+ fprintf(stderr, "Bad mnemonic\n");
+ return NULL;
+ }
+
+ if(p[0].pct[1].tok.n > pcwb->nwildpCodes)
+ pcwb->nwildpCodes = p[0].pct[1].tok.n;
+
+ pc = newpCodeWild(p[1].pct[1].tok.n,NULL,NULL);
+
+ switch(cmd_id) {
+ case NOTBITSKIP:
+ PCW(pc)->mustNotBeBitSkipInst = 1;
+ break;
+ case BITSKIP:
+ PCW(pc)->mustBeBitSkipInst = 1;
+ break;
+ case INVERTBITSKIP:
+ PCW(pc)->invertBitSkipInst = 1;
+ }
+ return pc;
}
if(pic14Mnemonics[opcode]->isBitInst)
pci = PCI(newpCode(opcode,
- newpCodeOpWild(p[1].pct[1].tok.n, curPeep, pcosubtype)));
+ newpCodeOpWild(p[1].pct[1].tok.n, pcwb, pcosubtype)));
/* Save the index of the maximum wildcard variable */
- if(p[1].pct[1].tok.n > sMaxWildVar)
- sMaxWildVar = p[1].pct[1].tok.n;
+ //if(p[1].pct[1].tok.n > sMaxWildVar)
+ // sMaxWildVar = p[1].pct[1].tok.n;
+
+ if(p[1].pct[1].tok.n > pcwb->nvars)
+ pcwb->nvars = p[1].pct[1].tok.n;
if(!pci)
fprintf(stderr,"couldn't find mnemonic\n");
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem1b(void *pp)
+static void * cvt_altpat_mnem1b(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
int opcode;
}
/*-----------------------------------------------------------------*/
+/* cvt_altpat_mnem2 */
+/* */
+/* pp[0] - mnem */
+/* pp[1] - var */
+/* pp[2] - comma */
+/* pp[3] - destination */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem2(void *pp)
+static void * cvt_altpat_mnem2(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
int opcode;
/* pp[3] - destination */
/* */
/*-----------------------------------------------------------------*/
-static void * cvt_altpat_mnem2a(void *pp)
+static void * cvt_altpat_mnem2a(void *pp,pCodeWildBlock *pcwb)
{
parsedPattern *p = pp;
int opcode;
pCodeInstruction *pci=NULL;
pCodeOp *pcosubtype;
+ if(!pcwb) {
+ fprintf(stderr,"ERROR %s:%d - can't assemble line\n",__FILE__,__LINE__);
+ return NULL;
+ }
+
dest = cvt_extract_destination(&p[3]);
DFPRINTF((stderr,"altpat_mnem2a %s var %d destination %s(%d)\n",
pci = PCI(newpCode(opcode,
- newpCodeOpWild(p[1].pct[1].tok.n, curPeep, pcosubtype)));
+ newpCodeOpWild(p[1].pct[1].tok.n, pcwb, pcosubtype)));
/* Save the index of the maximum wildcard variable */
- if(p[1].pct[1].tok.n > sMaxWildVar)
- sMaxWildVar = p[1].pct[1].tok.n;
+ //if(p[1].pct[1].tok.n > sMaxWildVar)
+ // sMaxWildVar = p[1].pct[1].tok.n;
+
+ if(p[1].pct[1].tok.n > pcwb->nvars)
+ pcwb->nvars = p[1].pct[1].tok.n;
+
+ if(!pci)
+ fprintf(stderr,"couldn't find mnemonic\n");
+
+ return pci;
+
+}
+
+
+/*-----------------------------------------------------------------*/
+/* cvt_altpat_mem3 - convert assembly line type to a pCode */
+/* This rule is for bsf/bcf type instructions */
+/* */
+/* */
+/* pp[0] - mnem */
+/* pp[1] - register */
+/* pp[2] - comma */
+/* pp[3] - number */
+/* */
+/*-----------------------------------------------------------------*/
+static void * cvt_altpat_mnem3(void *pp,pCodeWildBlock *pcwb)
+{
+ parsedPattern *p = pp;
+ int opcode;
+ int dest; // or could be bit position in the register
+
+ pCodeInstruction *pci=NULL;
+ pCodeOp *pcosubtype=NULL;
+
+ dest = cvt_extract_destination(&p[3]);
+
+ DFPRINTF((stderr,"altpat_mnem3 %s var %s bit (%d)\n",
+ p->pct[0].tok.s,
+ p[1].pct[0].tok.s,
+ p[3].pct[0].tok.n));
+
+
+ opcode = getpCode(p->pct[0].tok.s,0);
+ if(opcode < 0) {
+ fprintf(stderr, "Bad mnemonic\n");
+ return NULL;
+ }
+
+
+ if(pic14Mnemonics[opcode]->isBitInst) {
+ //pcosubtype = cvt_extract_status(p[1].pct[0].tok.s, p[3].pct[0].tok.s);
+
+ //if(pcosubtype == NULL) {
+ pcosubtype = newpCodeOpBit(p[1].pct[0].tok.s,p[3].pct[0].tok.n,0);
+ //}
+ } else
+ pcosubtype = newpCodeOp(p[1].pct[0].tok.s,PO_GPR_REGISTER);
+
+ if(pcosubtype == NULL) {
+ fprintf(stderr, "Bad operand\n");
+ return NULL;
+ }
+
+ pci = PCI(newpCode(opcode, pcosubtype));
if(!pci)
fprintf(stderr,"couldn't find mnemonic\n");
static void tokenizeLineNode(char *ln)
{
-
+ char *lnstart=ln;
tokIdx = 0; // Starting off at the beginning
tokArr[0].tt = PCT_NULL; // and assume invalid character for first token.
if(!ln || !*ln)
return;
+
while(*ln) {
if(isspace(*ln)) {
case '%':
tokArr[tokIdx++].tt = PCT_PERCENT;
break;
+ case '<':
+ tokArr[tokIdx++].tt = PCT_LESSTHAN;
+ break;
+ case '>':
+ tokArr[tokIdx++].tt = PCT_GREATERTHAN;
+ break;
case ':':
tokArr[tokIdx++].tt = PCT_COLON;
break;
default:
- if(isalpha(*ln)) {
+ if(isalpha(*ln) || (*ln == '_') ) {
char buffer[50];
int i=0;
- while( (isalpha(*ln) || isdigit(*ln)) && i<49)
+ while( (isalpha(*ln) || isdigit(*ln) || (*ln == '_')) && i<49)
buffer[i++] = *ln++;
ln--;
tokArr[tokIdx].tok.s = Safe_strdup(buffer);
tokArr[tokIdx++].tt = PCT_STRING;
+ } else {
+ fprintf(stderr, "Error while parsing peep rules (check peeph.def)\n");
+ fprintf(stderr, "Line: %s\n",lnstart);
+ fprintf(stderr, "Token: '%c'\n",*ln);
+ exit(1);
}
}
void dump1Token(pCodeTokens tt)
{
-#ifdef PCODE_DEBUG
+
switch(tt) {
case PCT_SPACE:
fprintf(stderr, " space ");
break;
case PCT_PERCENT:
- fprintf(stderr, " pct ");
- fputc('%', stderr);
+ fprintf(stderr, " pct %%");
+ break;
+ case PCT_LESSTHAN:
+ fprintf(stderr, " pct <");
+ break;
+ case PCT_GREATERTHAN:
+ fprintf(stderr, " pct >");
break;
case PCT_COLON:
- fprintf(stderr, " col ");
- fputc(':',stderr);
+ fprintf(stderr, " col :");
break;
case PCT_COMMA:
fprintf(stderr, " comma , ");
fprintf(stderr, " null ");
}
-#endif
+
}
/* pcode. */
/*-----------------------------------------------------------------*/
-void parseTokens(void)
+int parseTokens(pCodeWildBlock *pcwb, pCode **pcret)
{
- unsigned i;
pCode *pc;
+ int error = 0;
if(!tokIdx)
- return;
+ return error;
- for(i=0; i<=tokIdx; i++)
- dump1Token(tokArr[i].tt);
#ifdef PCODE_DEBUG
- fputc('\n',stderr);
+ {
+ unsigned i;
+ for(i=0; i<=tokIdx; i++)
+ dump1Token(tokArr[i].tt);
+ fputc('\n',stderr);
+ }
#endif
+
{
int lparsedPatIdx=0;
int lpcpIdx;
state = PS_HAVE_COMMA;
} else
fprintf(stderr," unexpected comma\n");
+ break;
+
}
matching = 1;
if( (c=altComparePattern( altArr[k].tokens, &parsedPatArr[j],10) ) ) {
if( altArr[k].f) {
- pc = altArr[k].f(&parsedPatArr[j]);
+ pc = altArr[k].f(&parsedPatArr[j],pcwb);
//if(pc && pc->print)
// pc->print(stderr,pc);
//if(pc && pc->destruct) pc->destruct(pc); dumps core?
- if(curBlock && pc)
- addpCode2pBlock(curBlock, pc);
+
+ //if(curBlock && pc)
+ //addpCode2pBlock(curBlock, pc);
+ if(pc) {
+ if (pcret) {
+ *pcret = pc;
+ return 0; // Only accept one line for now.
+ } else
+ addpCode2pBlock(pcwb->pb, pc);
+ } else
+ error++;
}
j += c;
}
}
-
+ return error;
}
/*-----------------------------------------------------------------*/
/* */
/*-----------------------------------------------------------------*/
-void peepRuleBlock2pCodeBlock( lineNode *ln)
+void peepRuleBlock2pCodeBlock( lineNode *ln, pCodeWildBlock *pcwb)
{
if(!ln)
//DFPRINTF((stderr,"%s\n",ln->line));
tokenizeLineNode(ln->line);
- parseTokens();
+
+ if(parseTokens(pcwb,NULL)) {
+ int i;
+ fprintf(stderr,"ERROR assembling line:\n%s\n",ln->line);
+ fprintf(stderr,"Tokens:\n");
+ for(i=0; i<5; i++)
+ dump1Token(tokArr[i].tt);
+ fputc('\n',stderr);
+ exit (1);
+ }
+ }
+}
+/*-----------------------------------------------------------------*/
+/* */
+/*-----------------------------------------------------------------*/
+pCode *AssembleLine(char *line)
+{
+ pCode *pc=NULL;
+
+ if(!line || !*line) {
+ fprintf(stderr,"WARNING returning NULL in AssembleLine\n");
+ return NULL;
}
+
+ tokenizeLineNode(line);
+
+ if(parseTokens(NULL,&pc))
+ fprintf(stderr, "WARNING: unable to assemble line:\n%s\n",line);
+
+ return pc;
+
}
/*-----------------------------------------------------------------*/
/* peepRuleCondition */
/*-----------------------------------------------------------------*/
-static void peepRuleCondition(char *cond)
+static void peepRuleCondition(char *cond, pCodePeep *pcp)
{
- if(!cond)
+ if(!cond || !pcp)
return;
//DFPRINTF((stderr,"\nCondition: %s\n",cond));
-
/* brute force compares for now */
if(STRCASECMP(cond, "NZ") == 0) {
//DFPRINTF((stderr,"found NZ\n"));
- curPeep->postFalseCond = PCC_Z;
+ pcp->postFalseCond = PCC_Z;
}
}
+
+
+void initpCodeWildBlock(pCodeWildBlock *pcwb)
+{
+
+ // pcwb = Safe_calloc(1,sizeof(pCodeWildBlock));
+
+ if(!pcwb)
+ return;
+
+ pcwb->vars = NULL;
+ pcwb->wildpCodes = NULL;
+ pcwb->wildpCodeOps = NULL;
+
+ pcwb->nvars = 0;
+ pcwb->nwildpCodes = 0;
+ pcwb->nops = 0;
+
+}
+
+void postinit_pCodeWildBlock(pCodeWildBlock *pcwb)
+{
+
+ if(!pcwb)
+ return;
+
+ pcwb->nvars+=2;
+ pcwb->nops = pcwb->nvars;
+
+ pcwb->vars = Safe_calloc(pcwb->nvars, sizeof(char *));
+ pcwb->wildpCodeOps = Safe_calloc(pcwb->nvars, sizeof(pCodeOp *));
+
+ pcwb->nwildpCodes+=2;
+ pcwb->wildpCodes = Safe_calloc(pcwb->nwildpCodes, sizeof(pCode *));
+
+}
+
+void initpCodePeep(pCodePeep *pcp)
+{
+
+ // pcwb = Safe_calloc(1,sizeof(pCodeWildBlock));
+
+ if(!pcp)
+ return;
+
+ initpCodeWildBlock(&pcp->target);
+ pcp->target.pb = newpCodeChain(NULL, 'W', NULL);
+
+ initpCodeWildBlock(&pcp->replace);
+ pcp->replace.pb = newpCodeChain(NULL, 'W', NULL);
+
+}
+
/*-----------------------------------------------------------------*/
/* peepRules2pCode - parse the "parsed" peep hole rules to generate*/
/* pCode. */
/* taking raw text to produce machine code, it produces pCode. */
/* */
/*-----------------------------------------------------------------*/
+extern void pic14initpCodePeepCommands(void);
void peepRules2pCode(peepRule *rules)
{
peepRule *pr;
+ pCodePeep *currentRule;
pCodePeepSnippets *pcps;
+ pic14initpCodePeepCommands();
+
/* The rules are in a linked-list. Each rule has two portions */
/* There's the `target' and there's the `replace'. The target */
/* is compared against the SDCC generated code and if it */
//DFPRINTF((stderr,"\nRule:\n\n"));
pcps = Safe_calloc(1,sizeof(pCodePeepSnippets));
- curPeep = pcps->peep = Safe_calloc(1,sizeof(pCodePeep));
-
- curPeep->vars = NULL;
- curPeep->wildpCodes = NULL; curPeep->wildpCodeOps = NULL;
- curPeep->postFalseCond = PCC_NONE;
- curPeep->postTrueCond = PCC_NONE;
-
peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps);
- curPeep->target = curBlock = newpCodeChain(NULL, 'W', NULL);
- sMaxWildVar = 0;
- sMaxWildMnem = 0;
+ currentRule = pcps->peep = Safe_calloc(1,sizeof(pCodePeep));
+ initpCodePeep(currentRule);
/* Convert the target block */
- peepRuleBlock2pCodeBlock(pr->match);
+ peepRuleBlock2pCodeBlock(pr->match, ¤tRule->target);
//DFPRINTF((stderr,"finished target, here it is in pcode form:\n"));
- //printpBlock(stderr, curBlock);
+ //printpBlock(stderr, currentRule->target.pb);
//DFPRINTF((stderr,"target with labels merged:\n"));
- pBlockMergeLabels(curBlock);
-#ifdef PCODE_DEBUG
- printpBlock(stderr, curBlock);
-#endif
+ //pBlockMergeLabels(curBlock);
+ pBlockMergeLabels(currentRule->target.pb);
+ //printpBlock(stderr, currentRule->replace.pb);
+ //#ifdef PCODE_DEBUG
+ // printpBlock(stderr, curBlock);
+ //#endif
//DFPRINTF((stderr,"\nReplaced by:\n"));
- curPeep->replace = curBlock = newpCodeChain(NULL, 'W', NULL);
-
/* Convert the replace block */
- peepRuleBlock2pCodeBlock(pr->replace);
+ peepRuleBlock2pCodeBlock(pr->replace, ¤tRule->replace);
//DFPRINTF((stderr,"finished replace block, here it is in pcode form:\n"));
//printpBlock(stderr, curBlock);
//DFPRINTF((stderr,"replace with labels merged:\n"));
- pBlockMergeLabels(curBlock);
- //printpBlock(stderr, curBlock);
- peepRuleCondition(pr->cond);
+ pBlockMergeLabels(currentRule->replace.pb);
+ //printpBlock(stderr, currentRule->replace.pb);
+
+ peepRuleCondition(pr->cond,currentRule);
/* The rule has been converted to pCode. Now allocate
* space for the wildcards */
-
- ++sMaxWildVar;
- curPeep->nvars = sMaxWildVar;
- curPeep->vars = Safe_calloc(sMaxWildVar, sizeof(char *));
-
- curPeep->nops = sMaxWildVar;
- curPeep->wildpCodeOps = Safe_calloc(sMaxWildVar, sizeof(pCodeOp *));
-
- curPeep->nwildpCodes = ++sMaxWildMnem;
- curPeep->wildpCodes = Safe_calloc(sMaxWildMnem, sizeof(char *));
-
+
+ postinit_pCodeWildBlock(¤tRule->target);
+ postinit_pCodeWildBlock(¤tRule->replace);
//return; // debug ... don't want to go through all the rules yet
}
+ {
+ pCodePeep *peepBlock;
+ _DLL *peeprules;
+
+ peeprules = (_DLL *)peepSnippets;
+ //fprintf(stderr,"target rules\n");
+ while(peeprules) {
+ //fprintf(stderr," rule:\n");
+ peepBlock = ((pCodePeepSnippets*)peeprules)->peep;
+ //printpBlock(stderr, peepBlock->target.pb);
+ peeprules = peeprules->next;
+ }
+ //fprintf(stderr," ... done\n");
+ }
+
}
void printpCodeString(FILE *of, pCode *pc, int max)
/*-----------------------------------------------------------------*/
int pCodeSearchCondition(pCode *pc, unsigned int cond)
{
-
+ //fprintf(stderr,"Checking conditions %d\n",cond);
while(pc) {
/* If we reach a function end (presumably an end since we most
return 0;
if(pc->type == PC_OPCODE) {
+ //fprintf(stderr," checking conditions of: ");
+ //pc->print(stderr,pc);
+ //fprintf(stderr,"\t\tinCond=%d\toutCond=%d\n",PCI(pc)->inCond,PCI(pc)->outCond);
if(PCI(pc)->inCond & cond)
return 1;
if(PCI(pc)->outCond & cond)
return 0;
}
+/*-----------------------------------------------------------------
+ * int pCodeOpCompare(pCodeOp *pcops, pCodeOp *pcopd)
+ *
+ * Compare two pCodeOp's and return 1 if they're the same
+ *-----------------------------------------------------------------*/
+int pCodeOpCompare(pCodeOp *pcops, pCodeOp *pcopd)
+{
+ char b[50], *n2;
+
+ if(!pcops || !pcopd)
+ return 0;
+/*
+ fprintf(stderr," Comparing operands %s",
+ get_op( pcops,NULL,0));
+
+ fprintf(stderr," to %s\n",
+ get_op( pcopd,NULL,0));
+*/
+
+ if(pcops->type != pcopd->type) {
+ //fprintf(stderr," - fail - diff types\n");
+ return 0; // different types
+ }
+
+ if(pcops->type == PO_LITERAL) {
+
+ if((PCOL(pcops)->lit >= 0) && (PCOL(pcops)->lit == PCOL(pcopd)->lit))
+ return 1;
+
+ return 0;
+ }
+
+ b[0]=0;
+ get_op(pcops,b,50);
+
+ n2 = get_op(pcopd,NULL,0);
+
+ if( !n2 || strcmp(b,n2)) {
+ //fprintf(stderr," - fail - diff names: %s, len=%d, %s, len=%d\n",b,strlen(b), n2, strlen(n2) );
+ return 0; // different names
+ }
+
+ switch(pcops->type) {
+ case PO_DIR:
+ if( PCOR(pcops)->instance != PCOR(pcopd)->instance) {
+ //fprintf(stderr, " - fail different instances\n");
+ return 0;
+ }
+ break;
+ default:
+ break;
+ }
+
+ //fprintf(stderr," - pass\n");
+
+ return 1;
+}
+
int pCodePeepMatchLabels(pCodePeep *peepBlock, pCode *pcs, pCode *pcd)
{
int labindex;
/* Check for a label associated with this wild pCode */
// If the wild card has a label, make sure the source code does too.
if(PCI(pcd)->label) {
- pCode *pcl;
+ pCode *pcl = PCI(pcd)->label->pc;
+
+#ifdef PCODE_DEBUG
+ int li = -PCL(pcl)->key;
+
+ if(peepBlock->target.vars[li] == NULL) {
+ if(PCI(pcs)->label) {
+ DFPRINTF((stderr,"first time for a label: %d %s\n",li,PCL(PCI(pcs)->label->pc)->label));
+ }
+ } else {
+ // DFPRINTF((stderr,"label id = %d \n",PCL(PCI(pcd)->label->pc)->key));
+ DFPRINTF((stderr," label id: %d %s\n",li,peepBlock->target.vars[li]));
+ if(PCI(pcs)->label) {
+ DFPRINTF((stderr," src %s\n",PCL(PCI(pcs)->label->pc)->label));
+ }
+ }
+#endif
+
if(!PCI(pcs)->label)
return 0;
- pcl = PCI(pcd)->label->pc;
-
labindex = -PCL(pcl)->key;
- //DFPRINTF((stderr,"label id = %d (labindex = %d)\n",PCL(pcl)->key,labindex));
- if(peepBlock->vars[labindex] == NULL) {
+ if(peepBlock->target.vars[labindex] == NULL) {
// First time to encounter this label
- peepBlock->vars[labindex] = PCL(PCI(pcs)->label->pc)->label;
- //DFPRINTF((stderr,"first time for a label: %d %s\n",labindex, peepBlock->vars[labindex]));
+ peepBlock->target.vars[labindex] = PCL(PCI(pcs)->label->pc)->label;
+ DFPRINTF((stderr,"first time for a label: %d %s\n",labindex,PCL(PCI(pcs)->label->pc)->label));
+
} else {
- if(strcmp(peepBlock->vars[labindex],PCL(PCI(pcs)->label->pc)->label) != 0) {
- // DFPRINTF((stderr,"labels don't match\n"));
+ if(strcmp(peepBlock->target.vars[labindex],PCL(PCI(pcs)->label->pc)->label) != 0) {
+ DFPRINTF((stderr,"labels don't match dest %s != src %s\n",peepBlock->target.vars[labindex],PCL(PCI(pcs)->label->pc)->label));
return 0;
}
- //DFPRINTF((stderr,"matched a label\n"));
+ DFPRINTF((stderr,"matched a label %d %s -hey\n",labindex,peepBlock->target.vars[labindex]));
}
} else {
- // DFPRINTF((stderr,"destination doesn't have a label\n"));
+ //DFPRINTF((stderr,"destination doesn't have a label\n"));
if(PCI(pcs)->label)
return 0;
+
+ //DFPRINTF((stderr,"neither src nor dest have labels\n"));
+
}
return 1;
{
int index; // index into wild card arrays
+ /* one-for-one match. Here the source and destination opcodes
+ * are not wild. However, there may be a label or a wild operand */
+
+ if(pcs) {
+ if(PCI(pcs)->label) {
+ DFPRINTF((stderr,"Match line source label: %s\n",PCL(PCI(pcs)->label->pc)->label));
+ }
+ }
+
if(pcs->type == pcd->type) {
if(pcs->type == PC_OPCODE) {
if(PCI(pcs)->op != PCI(pcd)->op)
return 0;
- /*
+#ifdef PCODE_DEBUG
DFPRINTF((stderr,"%s comparing\n",__FUNCTION__));
pcs->print(stderr,pcs);
pcd->print(stderr,pcd);
- */
+#endif
if(!pCodePeepMatchLabels(peepBlock, pcs, pcd))
return 0;
if(PCI(pcd)->pcop) {
if (PCI(pcd)->pcop->type == PO_WILD) {
index = PCOW(PCI(pcd)->pcop)->id;
-
//DFPRINTF((stderr,"destination is wild\n"));
#ifdef DEBUG_PCODEPEEP
if (index > peepBlock->nops) {
exit(1);
}
#endif
- PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop;
- if(!peepBlock->wildpCodeOps[index]) {
- peepBlock->wildpCodeOps[index] = PCI(pcs)->pcop;
-
- //if(PCI(pcs)->pcop->type == PO_GPR_TEMP)
+ PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop;
+ if(!peepBlock->target.wildpCodeOps[index]) {
+ peepBlock->target.wildpCodeOps[index] = PCI(pcs)->pcop;
+
+ //fprintf(stderr, "first time for wild opcode #%d\n",index);
+ return 1;
+
+ } else {
+ /*
+ pcs->print(stderr,pcs);
+ pcd->print(stderr,pcd);
+ fprintf(stderr, "comparing operands of these instructions, result %d\n",
+ pCodeOpCompare(PCI(pcs)->pcop, peepBlock->target.wildpCodeOps[index])
+ );
+ */
+
+ return pCodeOpCompare(PCI(pcs)->pcop, peepBlock->target.wildpCodeOps[index]);
}
+
{
char *n;
case PO_GPR_TEMP:
case PO_FSR:
//case PO_INDF:
- n = PCOR(PCI(pcs)->pcop)->r->name;
+ //n = PCOR(PCI(pcs)->pcop)->r->name;
+ n = PCI(pcs)->pcop->name;
break;
default:
n = PCI(pcs)->pcop->name;
}
- if(peepBlock->vars[index])
- return (strcmp(peepBlock->vars[index],n) == 0);
+ if(peepBlock->target.vars[index])
+ return (strcmp(peepBlock->target.vars[index],n) == 0);
else {
- // DFPRINTF((stderr,"first time for a variable: %d, %s\n",index,n));
- peepBlock->vars[index] = n;
+ DFPRINTF((stderr,"first time for a variable: %d, %s\n",index,n));
+ peepBlock->target.vars[index] = n;
return 1;
}
}
+
+ } else if (PCI(pcd)->pcop->type == PO_LITERAL) {
+ /*
+ pcs->print(stderr,pcs);
+ pcd->print(stderr,pcd);
+
+ fprintf(stderr, "comparing literal operands of these instructions, result %d\n",
+ pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop));
+ */
+ return pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop);
+
+ } else {
+ /* FIXME - need an else to check the case when the destination
+ * isn't a wild card */
+ /*
+ fprintf(stderr, "Destination is not wild: operand compare =%d\n",
+ pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop));
+ */
+ return pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop);
+
}
- /* FIXME - need an else to check the case when the destination
- * isn't a wild card */
} else
/* The pcd has no operand. Lines match if pcs has no operand either*/
return (PCI(pcs)->pcop == NULL);
}
}
+ /* Compare a wild instruction to a regular one. */
if((pcd->type == PC_WILD) && (pcs->type == PC_OPCODE)) {
-
index = PCW(pcd)->id;
+#ifdef PCODE_DEBUG
+ DFPRINTF((stderr,"%s comparing wild cards\n",__FUNCTION__));
+ pcs->print(stderr,pcs);
+ pcd->print(stderr,pcd);
+#endif
+ peepBlock->target.wildpCodes[PCW(pcd)->id] = pcs;
- // DFPRINTF((stderr,"%s comparing wild cards\n",__FUNCTION__));
- //pcs->print(stderr,pcs);
- //pcd->print(stderr,pcd);
+ if(!pCodePeepMatchLabels(peepBlock, pcs, pcd)) {
+ DFPRINTF((stderr," Failing because labels don't match\n"));
+ return 0;
+ }
- peepBlock->wildpCodes[PCW(pcd)->id] = pcs;
+ if(PCW(pcd)->mustBeBitSkipInst & !(PCI(pcs)->isBitInst && PCI(pcs)->isSkip)) {
+ // doesn't match because the wild pcode must be a bit skip
+ DFPRINTF((stderr," Failing match because bit skip is req\n"));
+ //pcd->print(stderr,pcd);
+ //pcs->print(stderr,pcs);
+ return 0;
+ }
- if(!pCodePeepMatchLabels(peepBlock, pcs, pcd))
+ if(PCW(pcd)->mustNotBeBitSkipInst & (PCI(pcs)->isBitInst && PCI(pcs)->isSkip)) {
+ // doesn't match because the wild pcode must *not* be a bit skip
+ DFPRINTF((stderr," Failing match because shouldn't be bit skip\n"));
+ //pcd->print(stderr,pcd);
+ //pcs->print(stderr,pcs);
return 0;
+ }
if(PCW(pcd)->operand) {
PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop;
- if(peepBlock->vars[index]) {
- int i = (strcmp(peepBlock->vars[index],PCI(pcs)->pcop->name) == 0);
- /*
+ if(peepBlock->target.vars[index]) {
+ int i = (strcmp(peepBlock->target.vars[index],PCI(pcs)->pcop->name) == 0);
+#ifdef PCODE_DEBUG
+
if(i)
DFPRINTF((stderr," (matched)\n"));
else {
DFPRINTF((stderr," (no match: wild card operand mismatch\n"));
- DFPRINTF((stderr," peepblock= %s, pcodeop= %s\n"),
- peepBlock->vars[index],
- PCI(pcs)->pcop->name);
+ DFPRINTF((stderr," peepblock= %s, pcodeop= %s\n",
+ peepBlock->target.vars[index],
+ PCI(pcs)->pcop->name));
}
- */
+#endif
return i;
} else {
- peepBlock->vars[index] = PCI(pcs)->pcop->name;
+ DFPRINTF((stderr," (matched %s\n",PCI(pcs)->pcop->name));
+ peepBlock->target.vars[index] = PCI(pcs)->pcop->name;
return 1;
}
}
int i;
if(!pcp)
return;
+/*
+ DFPRINTF((stderr," Clearing peep rule vars\n"));
+ DFPRINTF((stderr," %d %d %d %d %d %d\n",
+ pcp->target.nvars,pcp->target.nops,pcp->target.nwildpCodes,
+ pcp->replace.nvars,pcp->replace.nops,pcp->replace.nwildpCodes));
+*/
+ for(i=0;i<pcp->target.nvars; i++)
+ pcp->target.vars[i] = NULL;
+ for(i=0;i<pcp->target.nops; i++)
+ pcp->target.wildpCodeOps[i] = NULL;
+ for(i=0;i<pcp->target.nwildpCodes; i++)
+ pcp->target.wildpCodes[i] = NULL;
+
+ for(i=0;i<pcp->replace.nvars; i++)
+ pcp->replace.vars[i] = NULL;
+ for(i=0;i<pcp->replace.nops; i++)
+ pcp->replace.wildpCodeOps[i] = NULL;
+ for(i=0;i<pcp->replace.nwildpCodes; i++)
+ pcp->replace.wildpCodes[i] = NULL;
+
+
- for(i=0;i<pcp->nvars; i++) {
- pcp->vars[i] = NULL;
- pcp->wildpCodeOps[i] = NULL;
- }
}
/*-----------------------------------------------------------------*/
}
+/*------------------------------------------------------------------*/
+/* pCodeInsertBefore - splice in the pCode chain starting with pc2 */
+/* into the pCode chain containing pc1 */
+/*------------------------------------------------------------------*/
+void pCodeInsertBefore(pCode *pc1, pCode *pc2)
+{
+
+ if(!pc1 || !pc2)
+ return;
+
+ pc2->prev = pc1->prev;
+ if(pc1->prev)
+ pc1->prev->next = pc2;
+
+ pc2->pb = pc1->pb;
+ pc2->next = pc1;
+ pc1->prev = pc2;
+
+}
+
/*-----------------------------------------------------------------*/
/* pCodeOpCopy - copy a pcode operator */
/*-----------------------------------------------------------------*/
-static pCodeOp *pCodeOpCopy(pCodeOp *pcop)
+pCodeOp *pCodeOpCopy(pCodeOp *pcop)
{
pCodeOp *pcopnew=NULL;
else {
// Probably a label
pcopnew = pCodeOpCopy(PCOW(pcop)->subtype);
- pcopnew->name = Safe_strdup(PCOW(pcop)->pcp->vars[PCOW(pcop)->id]);
+ pcopnew->name = Safe_strdup(PCOW(pcop)->pcwb->vars[PCOW(pcop)->id]);
//DFPRINTF((stderr,"copied a wild op named %s\n",pcopnew->name));
}
PCOLAB(pcopnew)->key = PCOLAB(pcop)->key;
break;
- case PO_LITERAL:
case PO_IMMEDIATE:
+ pcopnew = Safe_calloc(1,sizeof(pCodeOpImmd) );
+ PCOI(pcopnew)->index = PCOI(pcop)->index;
+ PCOI(pcopnew)->offset = PCOI(pcop)->offset;
+ PCOI(pcopnew)->_const = PCOI(pcop)->_const;
+ PCOI(pcopnew)->_function = PCOI(pcop)->_function;
+ break;
+
+ case PO_LITERAL:
//DFPRINTF((stderr,"pCodeOpCopy lit\n"));
pcopnew = Safe_calloc(1,sizeof(pCodeOpLit) );
PCOL(pcopnew)->lit = PCOL(pcop)->lit;
break;
+ case PO_GPR_BIT:
+
+ pcopnew = newpCodeOpBit(pcop->name, PCORB(pcop)->bit,PCORB(pcop)->inBitSpace);
+ PCOR(pcopnew)->r = PCOR(pcop)->r;
+ PCOR(pcopnew)->rIdx = PCOR(pcop)->rIdx;
+ DFPRINTF((stderr," pCodeOpCopy Bit -register index\n"));
+ return pcopnew;
+ break;
+
+ case PO_GPR_POINTER:
case PO_GPR_REGISTER:
case PO_GPR_TEMP:
- case PO_GPR_BIT:
case PO_FSR:
case PO_INDF:
//DFPRINTF((stderr,"pCodeOpCopy GPR register\n"));
pcopnew = Safe_calloc(1,sizeof(pCodeOpReg) );
PCOR(pcopnew)->r = PCOR(pcop)->r;
PCOR(pcopnew)->rIdx = PCOR(pcop)->rIdx;
+ PCOR(pcopnew)->instance = PCOR(pcop)->instance;
DFPRINTF((stderr," register index %d\n", PCOR(pcop)->r->rIdx));
break;
case PO_DIR:
- //DFPRINTF((stderr,"pCodeOpCopy PO_DIR\n"));
+ //fprintf(stderr,"pCodeOpCopy PO_DIR\n");
+ pcopnew = Safe_calloc(1,sizeof(pCodeOpReg) );
+ PCOR(pcopnew)->r = PCOR(pcop)->r;
+ PCOR(pcopnew)->rIdx = PCOR(pcop)->rIdx;
+ PCOR(pcopnew)->instance = PCOR(pcop)->instance;
+ break;
+ case PO_STATUS:
+ DFPRINTF((stderr,"pCodeOpCopy PO_STATUS\n"));
case PO_SFR_REGISTER:
case PO_STR:
case PO_NONE:
case PO_W:
case PO_INTCON:
- case PO_STATUS:
case PO_PCL:
case PO_PCLATH:
return pcopnew;
}
-#if 0
+
/*-----------------------------------------------------------------*/
/* pCodeCopy - copy a pcode */
/*-----------------------------------------------------------------*/
-static pCode *pCodeCopy(pCode *pc)
+static pCode *pCodeInstructionCopy(pCodeInstruction *pci,int invert)
{
+ pCodeInstruction *new_pci;
+
+ if(invert)
+ new_pci = PCI(newpCode(pci->inverted_op,pci->pcop));
+ else
+ new_pci = PCI(newpCode(pci->op,pci->pcop));
- pCode *pcnew;
+ new_pci->pc.pb = pci->pc.pb;
+ new_pci->from = pci->from;
+ new_pci->to = pci->to;
+ new_pci->label = pci->label;
+ new_pci->pcflow = pci->pcflow;
- pcnew = newpCode(pc->type,pc->pcop);
+ return PCODE(new_pci);
}
-#endif
+
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
void pCodeDeleteChain(pCode *f,pCode *t)
while(f && f!=t) {
DFPRINTF((stderr,"delete pCode:\n"));
pc = f->next;
- f->print(stderr,f);
+ //f->print(stderr,f);
//f->delete(f); this dumps core...
f = pc;
{
pCodePeep *peepBlock;
pCode *pct, *pcin;
+ pCodeCSource *pc_cline=NULL;
_DLL *peeprules;
int matched;
while(peeprules) {
peepBlock = ((pCodePeepSnippets*)peeprules)->peep;
- if(!peepBlock || !peepBlock->target || !peepBlock->target->pcHead)
+
+ if(!peepBlock || /*!peepBlock->target ||*/ !peepBlock->target.pb->pcHead) {
+ fprintf(stderr, "skipping rule because target pb is NULL\n");
goto next_rule;
+ }
pCodePeepClrVars(peepBlock);
-
+/*
pcin = pc;
- pct = peepBlock->target->pcHead;
+ if(IS_PCCOMMENT(pcin))
+ pc = pcin = findNextInstruction(pcin->next);
+*/
+ pcin = pc = findNextInstruction(pc);
+
+ pct = peepBlock->target.pb->pcHead;
+#ifdef PCODE_DEBUG
+ {
+ pCode *pcr = peepBlock->replace.pb->pcHead;
+ if(pcr) pct->print(stderr,pcr);
+ }
+#endif
matched = 0;
while(pct && pcin) {
pct = pct->next;
//debug:
//DFPRINTF((stderr," matched\n"));
- if(!pcin)
- DFPRINTF((stderr," end of code\n"));
- if(!pct)
+
+ if(!pcin && pct) {
+ DFPRINTF((stderr," partial match... no more code\n"));
+ matched = 0;
+ }
+ if(!pct) {
DFPRINTF((stderr," end of rule\n"));
+ }
}
- if(matched) {
+ if(matched && pcin) {
/* So far we matched the rule up to the point of the conditions .
* In other words, all of the opcodes match. Now we need to see
* the `postFalseCond' as input then we abort the match
*/
DFPRINTF((stderr," matched rule so far, now checking conditions\n"));
+ //pcin->print(stderr,pcin);
+
if (pcin && peepBlock->postFalseCond &&
(pCodeSearchCondition(pcin,peepBlock->postFalseCond) > 0) )
matched = 0;
+
+ //fprintf(stderr," condition results = %d\n",pCodeSearchCondition(pcin,peepBlock->postFalseCond));
+
+
+ //if(!matched) fprintf(stderr,"failed on conditions\n");
}
if(matched) {
inefficient code with the optimized version */
#ifdef PCODE_DEBUG
DFPRINTF((stderr, "Found a pcode peep match:\nRule:\n"));
- printpCodeString(stderr,peepBlock->target->pcHead,10);
+ printpCodeString(stderr,peepBlock->target.pb->pcHead,10);
DFPRINTF((stderr,"first thing matched\n"));
pc->print(stderr,pc);
-#endif
if(pcin) {
DFPRINTF((stderr,"last thing matched\n"));
pcin->print(stderr,pcin);
}
+#endif
+
/* Unlink the original code */
pcprev = pc->prev;
if(pcin)
pcin->prev = pc->prev;
+
+#if 0
{
/* DEBUG */
/* Converted the deleted pCodes into comments */
char buf[256];
+ pCodeCSource *pc_cline2=NULL;
buf[0] = ';';
buf[1] = '#';
while(pc && pc!=pcin) {
+
+ if(pc->type == PC_OPCODE && PCI(pc)->cline) {
+ if(pc_cline) {
+ pc_cline2->pc.next = PCODE(PCI(pc)->cline);
+ pc_cline2 = PCCS(pc_cline2->pc.next);
+ } else {
+ pc_cline = pc_cline2 = PCI(pc)->cline;
+ pc_cline->pc.seq = pc->seq;
+ }
+ }
+
pCode2str(&buf[2], 254, pc);
pCodeInsertAfter(pcprev, newpCodeCharP(buf));
pcprev = pcprev->next;
pc = pc->next;
+
}
+ if(pc_cline2)
+ pc_cline2->pc.next = NULL;
}
+#endif
if(pcin)
pCodeDeleteChain(pc,pcin);
/* Generate the replacement code */
pc = pcprev;
- pcr = peepBlock->replace->pcHead; // This is the replacement code
+ pcr = peepBlock->replace.pb->pcHead; // This is the replacement code
while (pcr) {
pCodeOp *pcop=NULL;
+
/* If the replace pcode is an instruction with an operand, */
/* then duplicate the operand (and expand wild cards in the process). */
if(pcr->type == PC_OPCODE) {
if(PCI(pcr)->pcop->type == PO_WILD) {
int index = PCOW(PCI(pcr)->pcop)->id;
//DFPRINTF((stderr,"copying wildopcode\n"));
- if(peepBlock->wildpCodeOps[index])
- pcop = pCodeOpCopy(peepBlock->wildpCodeOps[index]);
+ if(peepBlock->target.wildpCodeOps[index])
+ pcop = pCodeOpCopy(peepBlock->target.wildpCodeOps[index]);
else
DFPRINTF((stderr,"error, wildopcode in replace but not source?\n"));
} else
//DFPRINTF((stderr,"inserting pCode\n"));
pCodeInsertAfter(pc, newpCode(PCI(pcr)->op,pcop));
} else if (pcr->type == PC_WILD) {
- pCodeInsertAfter(pc,peepBlock->wildpCodes[PCW(pcr)->id]);
+ if(PCW(pcr)->invertBitSkipInst)
+ DFPRINTF((stderr,"We need to invert the bit skip instruction\n"));
+ pCodeInsertAfter(pc,
+ pCodeInstructionCopy(PCI(peepBlock->target.wildpCodes[PCW(pcr)->id]),
+ PCW(pcr)->invertBitSkipInst));
} else if (pcr->type == PC_COMMENT) {
pCodeInsertAfter(pc, newpCodeCharP( ((pCodeComment *)(pcr))->comment));
}
pc = pc->next;
- //if(pc)
- // pc->print(stderr,pc);
+#ifdef PCODE_DEBUG
+ DFPRINTF((stderr," NEW Code:"));
+ if(pc) pc->print(stderr,pc);
+#endif
pcr = pcr->next;
}
+ /* We have just replaced the inefficient code with the rule.
+ * Now, we need to re-add the C-source symbols if there are any */
+ pc = pcprev;
+ while(pc_cline ) {
+
+ pc = findNextInstruction(pc->next);
+ PCI(pc)->cline = pc_cline;
+ pc_cline = PCCS(pc_cline->pc.next);
+
+ }
+
return 1;
}
next_rule:
peeprules = peeprules->next;
}
+ DFPRINTF((stderr," no rule matched\n"));
return 0;
}