From aaa8b9fedeebcbc459d2e8047d73cf23d697ce40 Mon Sep 17 00:00:00 2001 From: sdattalo Date: Mon, 22 Mar 2004 04:30:08 +0000 Subject: [PATCH] Bit operands were not being handled properly in the pic14 port. (now src/regression/add.c passes again). git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3273 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 5 + src/pic/gen.c | 17791 +++++++++++++++++++++---------------------- src/pic/gen.h | 78 +- src/pic/genarith.c | 3642 ++++----- src/pic/pcode.c | 9595 +++++++++++------------ src/pic/ralloc.h | 68 +- 6 files changed, 15623 insertions(+), 15556 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2dc1f3b1..85845494 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-03-21 Scott Dattalo + * src/pic/gen.c, src/pic/gen.h, src/pic/genarith.c, src/pic/pcode.c: + Bit operands were not being handled properly in the pic14 port. + (now src/regression/add.c passes again). + 2004-03-20 Erik Petrich * src/SDCC.y (labeled_statement): case and default no longer require diff --git a/src/pic/gen.c b/src/pic/gen.c index bc284a3e..a31f3652 100644 --- a/src/pic/gen.c +++ b/src/pic/gen.c @@ -25,8 +25,8 @@ what you give them. Help stamp out software-hoarding! Notes: - 000123 mlh Moved aopLiteral to SDCCglue.c to help the split - Made everything static + 000123 mlh Moved aopLiteral to SDCCglue.c to help the split + Made everything static -------------------------------------------------------------------------*/ #include @@ -86,23 +86,23 @@ static char *accUse[] = {"a","b"}; //static short rbank = -1; static struct { - short r0Pushed; - short r1Pushed; - short accInUse; - short inLine; - short debugLine; - short nRegsSaved; - set *sendSet; + short r0Pushed; + short r1Pushed; + short accInUse; + short inLine; + short debugLine; + short nRegsSaved; + set *sendSet; } _G; /* Resolved ifx structure. This structure stores information about an iCode ifx that makes it easier to generate code. */ typedef struct resolvedIfx { - symbol *lbl; /* pointer to a label */ - int condition; /* true or false ifx */ - int generated; /* set true when the code associated with the ifx - * is generated */ + symbol *lbl; /* pointer to a label */ + int condition; /* true or false ifx */ + int generated; /* set true when the code associated with the ifx + * is generated */ } resolvedIfx; extern int pic14_ptrRegReq ; @@ -131,102 +131,102 @@ static pBlock *pb; /*-----------------------------------------------------------------*/ static int my_powof2 (unsigned long num) { - if(num) { - if( (num & (num-1)) == 0) { - int nshifts = -1; - while(num) { - num>>=1; - nshifts++; - } - return nshifts; - } - } - - return -1; + if(num) { + if( (num & (num-1)) == 0) { + int nshifts = -1; + while(num) { + num>>=1; + nshifts++; + } + return nshifts; + } + } + + return -1; } void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result) { - - DEBUGpic14_emitcode ("; ","line = %d result %s=%s, left %s=%s, right %s=%s, size = %d", - line_no, - ((result) ? AopType(AOP_TYPE(result)) : "-"), - ((result) ? aopGet(AOP(result),0,TRUE,FALSE) : "-"), - ((left) ? AopType(AOP_TYPE(left)) : "-"), - ((left) ? aopGet(AOP(left),0,TRUE,FALSE) : "-"), - ((right) ? AopType(AOP_TYPE(right)) : "-"), - ((right) ? aopGet(AOP(right),0,FALSE,FALSE) : "-"), - ((result) ? AOP_SIZE(result) : 0)); - + + DEBUGpic14_emitcode ("; ","line = %d result %s=%s, left %s=%s, right %s=%s, size = %d", + line_no, + ((result) ? AopType(AOP_TYPE(result)) : "-"), + ((result) ? aopGet(AOP(result),0,TRUE,FALSE) : "-"), + ((left) ? AopType(AOP_TYPE(left)) : "-"), + ((left) ? aopGet(AOP(left),0,TRUE,FALSE) : "-"), + ((right) ? AopType(AOP_TYPE(right)) : "-"), + ((right) ? aopGet(AOP(right),0,FALSE,FALSE) : "-"), + ((result) ? AOP_SIZE(result) : 0)); + } void DEBUGpic14_AopTypeSign(int line_no, operand *left, operand *right, operand *result) { - - DEBUGpic14_emitcode ("; ","line = %d, signs: result %s=%c, left %s=%c, right %s=%c", - line_no, - ((result) ? AopType(AOP_TYPE(result)) : "-"), - ((result) ? (SPEC_USIGN(operandType(result)) ? 'u' : 's') : '-'), - ((left) ? AopType(AOP_TYPE(left)) : "-"), - ((left) ? (SPEC_USIGN(operandType(left)) ? 'u' : 's') : '-'), - ((right) ? AopType(AOP_TYPE(right)) : "-"), - ((right) ? (SPEC_USIGN(operandType(right)) ? 'u' : 's') : '-')); - + + DEBUGpic14_emitcode ("; ","line = %d, signs: result %s=%c, left %s=%c, right %s=%c", + line_no, + ((result) ? AopType(AOP_TYPE(result)) : "-"), + ((result) ? (SPEC_USIGN(operandType(result)) ? 'u' : 's') : '-'), + ((left) ? AopType(AOP_TYPE(left)) : "-"), + ((left) ? (SPEC_USIGN(operandType(left)) ? 'u' : 's') : '-'), + ((right) ? AopType(AOP_TYPE(right)) : "-"), + ((right) ? (SPEC_USIGN(operandType(right)) ? 'u' : 's') : '-')); + } void DEBUGpic14_emitcode (char *inst,char *fmt, ...) { - va_list ap; - char lb[INITIAL_INLINEASM]; - char *lbp = lb; - - if(!debug_verbose) - return; - - va_start(ap,fmt); - - if (inst && *inst) { - if (fmt && *fmt) - sprintf(lb,"%s\t",inst); - else - sprintf(lb,"%s",inst); - vsprintf(lb+(strlen(lb)),fmt,ap); - } else - vsprintf(lb,fmt,ap); - - while (isspace(*lbp)) lbp++; - - if (lbp && *lbp) - lineCurr = (lineCurr ? - connectLine(lineCurr,newLineNode(lb)) : - (lineHead = newLineNode(lb))); - lineCurr->isInline = _G.inLine; - lineCurr->isDebug = _G.debugLine; - - addpCode2pBlock(pb,newpCodeCharP(lb)); - - va_end(ap); + va_list ap; + char lb[INITIAL_INLINEASM]; + char *lbp = lb; + + if(!debug_verbose) + return; + + va_start(ap,fmt); + + if (inst && *inst) { + if (fmt && *fmt) + sprintf(lb,"%s\t",inst); + else + sprintf(lb,"%s",inst); + vsprintf(lb+(strlen(lb)),fmt,ap); + } else + vsprintf(lb,fmt,ap); + + while (isspace(*lbp)) lbp++; + + if (lbp && *lbp) + lineCurr = (lineCurr ? + connectLine(lineCurr,newLineNode(lb)) : + (lineHead = newLineNode(lb))); + lineCurr->isInline = _G.inLine; + lineCurr->isDebug = _G.debugLine; + + addpCode2pBlock(pb,newpCodeCharP(lb)); + + va_end(ap); } void emitpLabel(int key) { - addpCode2pBlock(pb,newpCodeLabel(NULL,key+100+labelOffset)); + addpCode2pBlock(pb,newpCodeLabel(NULL,key+100+labelOffset)); } void emitpcode(PIC_OPCODE poc, pCodeOp *pcop) { - if(pcop) - addpCode2pBlock(pb,newpCode(poc,pcop)); - else - DEBUGpic14_emitcode(";","%s ignoring NULL pcop",__FUNCTION__); + if(pcop) + addpCode2pBlock(pb,newpCode(poc,pcop)); + else + DEBUGpic14_emitcode(";","%s ignoring NULL pcop",__FUNCTION__); } void emitpcodeNULLop(PIC_OPCODE poc) { - - addpCode2pBlock(pb,newpCode(poc,NULL)); - + + addpCode2pBlock(pb,newpCode(poc,NULL)); + } @@ -235,34 +235,34 @@ void emitpcodeNULLop(PIC_OPCODE poc) /*-----------------------------------------------------------------*/ void pic14_emitcode (char *inst,char *fmt, ...) { - va_list ap; - char lb[INITIAL_INLINEASM]; - char *lbp = lb; - - va_start(ap,fmt); - - if (inst && *inst) { - if (fmt && *fmt) - sprintf(lb,"%s\t",inst); - else - sprintf(lb,"%s",inst); - vsprintf(lb+(strlen(lb)),fmt,ap); - } else - vsprintf(lb,fmt,ap); - - while (isspace(*lbp)) lbp++; - - if (lbp && *lbp) - lineCurr = (lineCurr ? - connectLine(lineCurr,newLineNode(lb)) : - (lineHead = newLineNode(lb))); - lineCurr->isInline = _G.inLine; - lineCurr->isDebug = _G.debugLine; - - if(debug_verbose) - addpCode2pBlock(pb,newpCodeCharP(lb)); - - va_end(ap); + va_list ap; + char lb[INITIAL_INLINEASM]; + char *lbp = lb; + + va_start(ap,fmt); + + if (inst && *inst) { + if (fmt && *fmt) + sprintf(lb,"%s\t",inst); + else + sprintf(lb,"%s",inst); + vsprintf(lb+(strlen(lb)),fmt,ap); + } else + vsprintf(lb,fmt,ap); + + while (isspace(*lbp)) lbp++; + + if (lbp && *lbp) + lineCurr = (lineCurr ? + connectLine(lineCurr,newLineNode(lb)) : + (lineHead = newLineNode(lb))); + lineCurr->isInline = _G.inLine; + lineCurr->isDebug = _G.debugLine; + + if(debug_verbose) + addpCode2pBlock(pb,newpCodeCharP(lb)); + + va_end(ap); } @@ -271,82 +271,82 @@ void pic14_emitcode (char *inst,char *fmt, ...) /*-----------------------------------------------------------------*/ static regs *getFreePtr (iCode *ic, asmop **aopp, bool result) { - bool r0iu = FALSE , r1iu = FALSE; - bool r0ou = FALSE , r1ou = FALSE; - - /* the logic: if r0 & r1 used in the instruction - then we are in trouble otherwise */ - - /* first check if r0 & r1 are used by this - instruction, in which case we are in trouble */ - if ((r0iu = bitVectBitValue(ic->rUsed,R0_IDX)) && - (r1iu = bitVectBitValue(ic->rUsed,R1_IDX))) - { - goto endOfWorld; - } - - r0ou = bitVectBitValue(ic->rMask,R0_IDX); - r1ou = bitVectBitValue(ic->rMask,R1_IDX); - - /* if no usage of r0 then return it */ - if (!r0iu && !r0ou) { - ic->rUsed = bitVectSetBit(ic->rUsed,R0_IDX); - (*aopp)->type = AOP_R0; - - return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R0_IDX); - } - - /* if no usage of r1 then return it */ - if (!r1iu && !r1ou) { - ic->rUsed = bitVectSetBit(ic->rUsed,R1_IDX); - (*aopp)->type = AOP_R1; - - return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R1_IDX); - } - - /* now we know they both have usage */ - /* if r0 not used in this instruction */ - if (!r0iu) { - /* push it if not already pushed */ - if (!_G.r0Pushed) { - //pic14_emitcode ("push","%s", - // pic14_regWithIdx(R0_IDX)->dname); - _G.r0Pushed++ ; - } - - ic->rUsed = bitVectSetBit(ic->rUsed,R0_IDX); - (*aopp)->type = AOP_R0; - - return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R0_IDX); - } - - /* if r1 not used then */ - - if (!r1iu) { - /* push it if not already pushed */ - if (!_G.r1Pushed) { - //pic14_emitcode ("push","%s", - // pic14_regWithIdx(R1_IDX)->dname); - _G.r1Pushed++ ; - } - - ic->rUsed = bitVectSetBit(ic->rUsed,R1_IDX); - (*aopp)->type = AOP_R1; - return pic14_regWithIdx(R1_IDX); - } - + bool r0iu = FALSE , r1iu = FALSE; + bool r0ou = FALSE , r1ou = FALSE; + + /* the logic: if r0 & r1 used in the instruction + then we are in trouble otherwise */ + + /* first check if r0 & r1 are used by this + instruction, in which case we are in trouble */ + if ((r0iu = bitVectBitValue(ic->rUsed,R0_IDX)) && + (r1iu = bitVectBitValue(ic->rUsed,R1_IDX))) + { + goto endOfWorld; + } + + r0ou = bitVectBitValue(ic->rMask,R0_IDX); + r1ou = bitVectBitValue(ic->rMask,R1_IDX); + + /* if no usage of r0 then return it */ + if (!r0iu && !r0ou) { + ic->rUsed = bitVectSetBit(ic->rUsed,R0_IDX); + (*aopp)->type = AOP_R0; + + return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R0_IDX); + } + + /* if no usage of r1 then return it */ + if (!r1iu && !r1ou) { + ic->rUsed = bitVectSetBit(ic->rUsed,R1_IDX); + (*aopp)->type = AOP_R1; + + return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R1_IDX); + } + + /* now we know they both have usage */ + /* if r0 not used in this instruction */ + if (!r0iu) { + /* push it if not already pushed */ + if (!_G.r0Pushed) { + //pic14_emitcode ("push","%s", + // pic14_regWithIdx(R0_IDX)->dname); + _G.r0Pushed++ ; + } + + ic->rUsed = bitVectSetBit(ic->rUsed,R0_IDX); + (*aopp)->type = AOP_R0; + + return (*aopp)->aopu.aop_ptr = pic14_regWithIdx(R0_IDX); + } + + /* if r1 not used then */ + + if (!r1iu) { + /* push it if not already pushed */ + if (!_G.r1Pushed) { + //pic14_emitcode ("push","%s", + // pic14_regWithIdx(R1_IDX)->dname); + _G.r1Pushed++ ; + } + + ic->rUsed = bitVectSetBit(ic->rUsed,R1_IDX); + (*aopp)->type = AOP_R1; + return pic14_regWithIdx(R1_IDX); + } + endOfWorld : - /* I said end of world but not quite end of world yet */ - /* if this is a result then we can push it on the stack*/ - if (result) { - (*aopp)->type = AOP_STK; - return NULL; - } - - /* other wise this is true end of the world */ - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "getFreePtr should never reach here"); - exit(0); + /* I said end of world but not quite end of world yet */ + /* if this is a result then we can push it on the stack*/ + if (result) { + (*aopp)->type = AOP_STK; + return NULL; + } + + /* other wise this is true end of the world */ + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "getFreePtr should never reach here"); + exit(0); } /*-----------------------------------------------------------------*/ @@ -354,25 +354,25 @@ endOfWorld : /*-----------------------------------------------------------------*/ asmop *newAsmop (short type) { - asmop *aop; - - aop = Safe_calloc(1,sizeof(asmop)); - aop->type = type; - return aop; + asmop *aop; + + aop = Safe_calloc(1,sizeof(asmop)); + aop->type = type; + return aop; } static void genSetDPTR(int n) { - if (!n) - { - pic14_emitcode(";", "Select standard DPTR"); - pic14_emitcode("mov", "dps, #0x00"); - } - else - { - pic14_emitcode(";", "Select alternate DPTR"); - pic14_emitcode("mov", "dps, #0x01"); - } + if (!n) + { + pic14_emitcode(";", "Select standard DPTR"); + pic14_emitcode("mov", "dps, #0x00"); + } + else + { + pic14_emitcode(";", "Select alternate DPTR"); + pic14_emitcode("mov", "dps, #0x01"); + } } /*-----------------------------------------------------------------*/ @@ -381,46 +381,46 @@ static void genSetDPTR(int n) /*-----------------------------------------------------------------*/ static void resolveIfx(resolvedIfx *resIfx, iCode *ifx) { - if(!resIfx) - return; - - // DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - - resIfx->condition = 1; /* assume that the ifx is true */ - resIfx->generated = 0; /* indicate that the ifx has not been used */ - - if(!ifx) { - resIfx->lbl = newiTempLabel(NULL); /* oops, there is no ifx. so create a label */ - /* - DEBUGpic14_emitcode("; ***","%s %d null ifx creating new label key =%d", - __FUNCTION__,__LINE__,resIfx->lbl->key); - */ - } else { - if(IC_TRUE(ifx)) { - resIfx->lbl = IC_TRUE(ifx); - } else { - resIfx->lbl = IC_FALSE(ifx); - resIfx->condition = 0; - } - /* - if(IC_TRUE(ifx)) - DEBUGpic14_emitcode("; ***","ifx true is non-null"); - if(IC_FALSE(ifx)) - DEBUGpic14_emitcode("; ***","ifx false is non-null"); - */ - } - - // DEBUGpic14_emitcode("; ***","%s lbl->key=%d, (lab offset=%d)",__FUNCTION__,resIfx->lbl->key,labelOffset); - + if(!resIfx) + return; + + // DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + + resIfx->condition = 1; /* assume that the ifx is true */ + resIfx->generated = 0; /* indicate that the ifx has not been used */ + + if(!ifx) { + resIfx->lbl = newiTempLabel(NULL); /* oops, there is no ifx. so create a label */ + /* + DEBUGpic14_emitcode("; ***","%s %d null ifx creating new label key =%d", + __FUNCTION__,__LINE__,resIfx->lbl->key); + */ + } else { + if(IC_TRUE(ifx)) { + resIfx->lbl = IC_TRUE(ifx); + } else { + resIfx->lbl = IC_FALSE(ifx); + resIfx->condition = 0; + } + /* + if(IC_TRUE(ifx)) + DEBUGpic14_emitcode("; ***","ifx true is non-null"); + if(IC_FALSE(ifx)) + DEBUGpic14_emitcode("; ***","ifx false is non-null"); + */ + } + + // DEBUGpic14_emitcode("; ***","%s lbl->key=%d, (lab offset=%d)",__FUNCTION__,resIfx->lbl->key,labelOffset); + } /*-----------------------------------------------------------------*/ /* pointerCode - returns the code for a pointer type */ /*-----------------------------------------------------------------*/ static int pointerCode (sym_link *etype) { - - return PTR_TYPE(SPEC_OCLS(etype)); - + + return PTR_TYPE(SPEC_OCLS(etype)); + } /*-----------------------------------------------------------------*/ @@ -428,147 +428,147 @@ static int pointerCode (sym_link *etype) /*-----------------------------------------------------------------*/ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) { - asmop *aop; - memmap *space= SPEC_OCLS(sym->etype); - - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - /* if already has one */ - if (sym->aop) - return sym->aop; - - /* assign depending on the storage class */ - /* if it is on the stack or indirectly addressable */ - /* space we need to assign either r0 or r1 to it */ - if ((sym->onStack && !options.stack10bit) || sym->iaccess) { - sym->aop = aop = newAsmop(0); - aop->aopu.aop_ptr = getFreePtr(ic,&aop,result); - aop->size = getSize(sym->type); - - /* now assign the address of the variable to - the pointer register */ - if (aop->type != AOP_STK) { - - if (sym->onStack) { - if ( _G.accInUse ) - pic14_emitcode("push","acc"); - - pic14_emitcode("mov","a,_bp"); - pic14_emitcode("add","a,#0x%02x", - ((sym->stack < 0) ? - ((char)(sym->stack - _G.nRegsSaved )) : - ((char)sym->stack)) & 0xff); - pic14_emitcode("mov","%s,a", - aop->aopu.aop_ptr->name); - - if ( _G.accInUse ) - pic14_emitcode("pop","acc"); - } else - pic14_emitcode("mov","%s,#%s", - aop->aopu.aop_ptr->name, - sym->rname); - aop->paged = space->paged; - } else - aop->aopu.aop_stk = sym->stack; - return aop; - } - - if (sym->onStack && options.stack10bit) - { - /* It's on the 10 bit stack, which is located in - * far data space. - */ - - //DEBUGpic14_emitcode(";","%d",__LINE__); - - if ( _G.accInUse ) - pic14_emitcode("push","acc"); - - pic14_emitcode("mov","a,_bp"); - pic14_emitcode("add","a,#0x%02x", - ((sym->stack < 0) ? - ((char)(sym->stack - _G.nRegsSaved )) : - ((char)sym->stack)) & 0xff); - - genSetDPTR(1); - pic14_emitcode ("mov","dpx1,#0x40"); - pic14_emitcode ("mov","dph1,#0x00"); - pic14_emitcode ("mov","dpl1, a"); - genSetDPTR(0); - - if ( _G.accInUse ) - pic14_emitcode("pop","acc"); - - sym->aop = aop = newAsmop(AOP_DPTR2); - aop->size = getSize(sym->type); - return aop; - } - - //DEBUGpic14_emitcode(";","%d",__LINE__); - /* if in bit space */ - if (IN_BITSPACE(space)) { - sym->aop = aop = newAsmop (AOP_CRY); - aop->aopu.aop_dir = sym->rname ; - aop->size = getSize(sym->type); - //DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); - return aop; - } - /* if it is in direct space */ - if (IN_DIRSPACE(space)) { - sym->aop = aop = newAsmop (AOP_DIR); - aop->aopu.aop_dir = sym->rname ; - aop->size = getSize(sym->type); - DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); - return aop; - } - - /* special case for a function */ - if (IS_FUNC(sym->type)) { - - sym->aop = aop = newAsmop(AOP_PCODE); - aop->aopu.pcop = popGetImmd(sym->rname,0,0,1); - PCOI(aop->aopu.pcop)->_const = IN_CODESPACE(space); - PCOI(aop->aopu.pcop)->_function = 1; - PCOI(aop->aopu.pcop)->index = 0; - aop->size = FPTRSIZE; - /* - sym->aop = aop = newAsmop(AOP_IMMD); - aop->aopu.aop_immd = Safe_calloc(1,strlen(sym->rname)+1); - strcpy(aop->aopu.aop_immd,sym->rname); - aop->size = FPTRSIZE; - */ - DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname); - return aop; - } - - - /* only remaining is far space */ - /* in which case DPTR gets the address */ - sym->aop = aop = newAsmop(AOP_PCODE); - - aop->aopu.pcop = popGetImmd(sym->rname,0,0,0); - PCOI(aop->aopu.pcop)->_const = IN_CODESPACE(space); - PCOI(aop->aopu.pcop)->index = 0; - - DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", - __LINE__,sym->rname, 0, PCOI(aop->aopu.pcop)->_const); - - allocDirReg (IC_LEFT(ic)); - - aop->size = FPTRSIZE; - /* - DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname); - sym->aop = aop = newAsmop(AOP_DPTR); - pic14_emitcode ("mov","dptr,#%s", sym->rname); - aop->size = getSize(sym->type); - - DEBUGpic14_emitcode(";","%d size = %d",__LINE__,aop->size); - */ - - /* if it is in code space */ - if (IN_CODESPACE(space)) - aop->code = 1; - - return aop; + asmop *aop; + memmap *space= SPEC_OCLS(sym->etype); + + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + /* if already has one */ + if (sym->aop) + return sym->aop; + + /* assign depending on the storage class */ + /* if it is on the stack or indirectly addressable */ + /* space we need to assign either r0 or r1 to it */ + if ((sym->onStack && !options.stack10bit) || sym->iaccess) { + sym->aop = aop = newAsmop(0); + aop->aopu.aop_ptr = getFreePtr(ic,&aop,result); + aop->size = getSize(sym->type); + + /* now assign the address of the variable to + the pointer register */ + if (aop->type != AOP_STK) { + + if (sym->onStack) { + if ( _G.accInUse ) + pic14_emitcode("push","acc"); + + pic14_emitcode("mov","a,_bp"); + pic14_emitcode("add","a,#0x%02x", + ((sym->stack < 0) ? + ((char)(sym->stack - _G.nRegsSaved )) : + ((char)sym->stack)) & 0xff); + pic14_emitcode("mov","%s,a", + aop->aopu.aop_ptr->name); + + if ( _G.accInUse ) + pic14_emitcode("pop","acc"); + } else + pic14_emitcode("mov","%s,#%s", + aop->aopu.aop_ptr->name, + sym->rname); + aop->paged = space->paged; + } else + aop->aopu.aop_stk = sym->stack; + return aop; + } + + if (sym->onStack && options.stack10bit) + { + /* It's on the 10 bit stack, which is located in + * far data space. + */ + + //DEBUGpic14_emitcode(";","%d",__LINE__); + + if ( _G.accInUse ) + pic14_emitcode("push","acc"); + + pic14_emitcode("mov","a,_bp"); + pic14_emitcode("add","a,#0x%02x", + ((sym->stack < 0) ? + ((char)(sym->stack - _G.nRegsSaved )) : + ((char)sym->stack)) & 0xff); + + genSetDPTR(1); + pic14_emitcode ("mov","dpx1,#0x40"); + pic14_emitcode ("mov","dph1,#0x00"); + pic14_emitcode ("mov","dpl1, a"); + genSetDPTR(0); + + if ( _G.accInUse ) + pic14_emitcode("pop","acc"); + + sym->aop = aop = newAsmop(AOP_DPTR2); + aop->size = getSize(sym->type); + return aop; + } + + //DEBUGpic14_emitcode(";","%d",__LINE__); + /* if in bit space */ + if (IN_BITSPACE(space)) { + sym->aop = aop = newAsmop (AOP_CRY); + aop->aopu.aop_dir = sym->rname ; + aop->size = getSize(sym->type); + //DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); + return aop; + } + /* if it is in direct space */ + if (IN_DIRSPACE(space)) { + sym->aop = aop = newAsmop (AOP_DIR); + aop->aopu.aop_dir = sym->rname ; + aop->size = getSize(sym->type); + DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); + return aop; + } + + /* special case for a function */ + if (IS_FUNC(sym->type)) { + + sym->aop = aop = newAsmop(AOP_PCODE); + aop->aopu.pcop = popGetImmd(sym->rname,0,0,1); + PCOI(aop->aopu.pcop)->_const = IN_CODESPACE(space); + PCOI(aop->aopu.pcop)->_function = 1; + PCOI(aop->aopu.pcop)->index = 0; + aop->size = FPTRSIZE; + /* + sym->aop = aop = newAsmop(AOP_IMMD); + aop->aopu.aop_immd = Safe_calloc(1,strlen(sym->rname)+1); + strcpy(aop->aopu.aop_immd,sym->rname); + aop->size = FPTRSIZE; + */ + DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname); + return aop; + } + + + /* only remaining is far space */ + /* in which case DPTR gets the address */ + sym->aop = aop = newAsmop(AOP_PCODE); + + aop->aopu.pcop = popGetImmd(sym->rname,0,0,0); + PCOI(aop->aopu.pcop)->_const = IN_CODESPACE(space); + PCOI(aop->aopu.pcop)->index = 0; + + DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", + __LINE__,sym->rname, 0, PCOI(aop->aopu.pcop)->_const); + + allocDirReg (IC_LEFT(ic)); + + aop->size = FPTRSIZE; + /* + DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname); + sym->aop = aop = newAsmop(AOP_DPTR); + pic14_emitcode ("mov","dptr,#%s", sym->rname); + aop->size = getSize(sym->type); + + DEBUGpic14_emitcode(";","%d size = %d",__LINE__,aop->size); + */ + + /* if it is in code space */ + if (IN_CODESPACE(space)) + aop->code = 1; + + return aop; } /*-----------------------------------------------------------------*/ @@ -576,89 +576,89 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) /*-----------------------------------------------------------------*/ static asmop *aopForRemat (operand *op) // x symbol *sym) { - symbol *sym = OP_SYMBOL(op); - iCode *ic = NULL; - asmop *aop = newAsmop(AOP_PCODE); - int val = 0; - int offset = 0; - - ic = sym->rematiCode; - - DEBUGpic14_emitcode(";","%s %d",__FUNCTION__,__LINE__); - if(IS_OP_POINTER(op)) { - DEBUGpic14_emitcode(";","%s %d IS_OP_POINTER",__FUNCTION__,__LINE__); - } - for (;;) { - if (ic->op == '+') { - val += (int) operandLitValue(IC_RIGHT(ic)); - } else if (ic->op == '-') { - val -= (int) operandLitValue(IC_RIGHT(ic)); - } else - break; - - ic = OP_SYMBOL(IC_LEFT(ic))->rematiCode; - } - - offset = OP_SYMBOL(IC_LEFT(ic))->offset; - aop->aopu.pcop = popGetImmd(OP_SYMBOL(IC_LEFT(ic))->rname,0,val,0); - PCOI(aop->aopu.pcop)->_const = IS_PTR_CONST(operandType(op)); - PCOI(aop->aopu.pcop)->index = val; - - DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", - __LINE__,OP_SYMBOL(IC_LEFT(ic))->rname, - val, IS_PTR_CONST(operandType(op))); - - // DEBUGpic14_emitcode(";","aop type %s",AopType(AOP_TYPE(IC_LEFT(ic)))); - - allocDirReg (IC_LEFT(ic)); - - return aop; + symbol *sym = OP_SYMBOL(op); + iCode *ic = NULL; + asmop *aop = newAsmop(AOP_PCODE); + int val = 0; + int offset = 0; + + ic = sym->rematiCode; + + DEBUGpic14_emitcode(";","%s %d",__FUNCTION__,__LINE__); + if(IS_OP_POINTER(op)) { + DEBUGpic14_emitcode(";","%s %d IS_OP_POINTER",__FUNCTION__,__LINE__); + } + for (;;) { + if (ic->op == '+') { + val += (int) operandLitValue(IC_RIGHT(ic)); + } else if (ic->op == '-') { + val -= (int) operandLitValue(IC_RIGHT(ic)); + } else + break; + + ic = OP_SYMBOL(IC_LEFT(ic))->rematiCode; + } + + offset = OP_SYMBOL(IC_LEFT(ic))->offset; + aop->aopu.pcop = popGetImmd(OP_SYMBOL(IC_LEFT(ic))->rname,0,val,0); + PCOI(aop->aopu.pcop)->_const = IS_PTR_CONST(operandType(op)); + PCOI(aop->aopu.pcop)->index = val; + + DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", + __LINE__,OP_SYMBOL(IC_LEFT(ic))->rname, + val, IS_PTR_CONST(operandType(op))); + + // DEBUGpic14_emitcode(";","aop type %s",AopType(AOP_TYPE(IC_LEFT(ic)))); + + allocDirReg (IC_LEFT(ic)); + + return aop; } int aopIdx (asmop *aop, int offset) { - if(!aop) - return -1; - - if(aop->type != AOP_REG) - return -2; - - return aop->aopu.aop_reg[offset]->rIdx; - + if(!aop) + return -1; + + if(aop->type != AOP_REG) + return -2; + + return aop->aopu.aop_reg[offset]->rIdx; + } /*-----------------------------------------------------------------*/ /* regsInCommon - two operands have some registers in common */ /*-----------------------------------------------------------------*/ static bool regsInCommon (operand *op1, operand *op2) { - symbol *sym1, *sym2; - int i; - - /* if they have registers in common */ - if (!IS_SYMOP(op1) || !IS_SYMOP(op2)) - return FALSE ; - - sym1 = OP_SYMBOL(op1); - sym2 = OP_SYMBOL(op2); - - if (sym1->nRegs == 0 || sym2->nRegs == 0) - return FALSE ; - - for (i = 0 ; i < sym1->nRegs ; i++) { - int j; - if (!sym1->regs[i]) - continue ; - - for (j = 0 ; j < sym2->nRegs ;j++ ) { - if (!sym2->regs[j]) - continue ; - - if (sym2->regs[j] == sym1->regs[i]) - return TRUE ; - } - } - - return FALSE ; + symbol *sym1, *sym2; + int i; + + /* if they have registers in common */ + if (!IS_SYMOP(op1) || !IS_SYMOP(op2)) + return FALSE ; + + sym1 = OP_SYMBOL(op1); + sym2 = OP_SYMBOL(op2); + + if (sym1->nRegs == 0 || sym2->nRegs == 0) + return FALSE ; + + for (i = 0 ; i < sym1->nRegs ; i++) { + int j; + if (!sym1->regs[i]) + continue ; + + for (j = 0 ; j < sym2->nRegs ;j++ ) { + if (!sym2->regs[j]) + continue ; + + if (sym2->regs[j] == sym1->regs[i]) + return TRUE ; + } + } + + return FALSE ; } /*-----------------------------------------------------------------*/ @@ -666,44 +666,44 @@ static bool regsInCommon (operand *op1, operand *op2) /*-----------------------------------------------------------------*/ static bool operandsEqu ( operand *op1, operand *op2) { - symbol *sym1, *sym2; - - /* if they not symbols */ - if (!IS_SYMOP(op1) || !IS_SYMOP(op2)) - return FALSE; - - sym1 = OP_SYMBOL(op1); - sym2 = OP_SYMBOL(op2); - - /* if both are itemps & one is spilt - and the other is not then false */ - if (IS_ITEMP(op1) && IS_ITEMP(op2) && - sym1->isspilt != sym2->isspilt ) - return FALSE ; - - /* if they are the same */ - if (sym1 == sym2) - return TRUE ; - - if (strcmp(sym1->rname,sym2->rname) == 0) - return TRUE; - - - /* if left is a tmp & right is not */ - if (IS_ITEMP(op1) && - !IS_ITEMP(op2) && - sym1->isspilt && - (sym1->usl.spillLoc == sym2)) - return TRUE; - - if (IS_ITEMP(op2) && - !IS_ITEMP(op1) && - sym2->isspilt && - sym1->level > 0 && - (sym2->usl.spillLoc == sym1)) - return TRUE ; - - return FALSE ; + symbol *sym1, *sym2; + + /* if they not symbols */ + if (!IS_SYMOP(op1) || !IS_SYMOP(op2)) + return FALSE; + + sym1 = OP_SYMBOL(op1); + sym2 = OP_SYMBOL(op2); + + /* if both are itemps & one is spilt + and the other is not then false */ + if (IS_ITEMP(op1) && IS_ITEMP(op2) && + sym1->isspilt != sym2->isspilt ) + return FALSE ; + + /* if they are the same */ + if (sym1 == sym2) + return TRUE ; + + if (strcmp(sym1->rname,sym2->rname) == 0) + return TRUE; + + + /* if left is a tmp & right is not */ + if (IS_ITEMP(op1) && + !IS_ITEMP(op2) && + sym1->isspilt && + (sym1->usl.spillLoc == sym2)) + return TRUE; + + if (IS_ITEMP(op2) && + !IS_ITEMP(op1) && + sym2->isspilt && + sym1->level > 0 && + (sym2->usl.spillLoc == sym1)) + return TRUE ; + + return FALSE ; } /*-----------------------------------------------------------------*/ @@ -711,24 +711,24 @@ static bool operandsEqu ( operand *op1, operand *op2) /*-----------------------------------------------------------------*/ bool pic14_sameRegs (asmop *aop1, asmop *aop2 ) { - int i; - - if (aop1 == aop2) - return TRUE ; - - if (aop1->type != AOP_REG || - aop2->type != AOP_REG ) - return FALSE ; - - if (aop1->size != aop2->size ) - return FALSE ; - - for (i = 0 ; i < aop1->size ; i++ ) - if (aop1->aopu.aop_reg[i] != - aop2->aopu.aop_reg[i] ) - return FALSE ; - - return TRUE ; + int i; + + if (aop1 == aop2) + return TRUE ; + + if (aop1->type != AOP_REG || + aop2->type != AOP_REG ) + return FALSE ; + + if (aop1->size != aop2->size ) + return FALSE ; + + for (i = 0 ; i < aop1->size ; i++ ) + if (aop1->aopu.aop_reg[i] != + aop2->aopu.aop_reg[i] ) + return FALSE ; + + return TRUE ; } /*-----------------------------------------------------------------*/ @@ -736,153 +736,153 @@ bool pic14_sameRegs (asmop *aop1, asmop *aop2 ) /*-----------------------------------------------------------------*/ void aopOp (operand *op, iCode *ic, bool result) { - asmop *aop; - symbol *sym; - int i; - - if (!op) - return ; - - // DEBUGpic14_emitcode(";","%d",__LINE__); - /* if this a literal */ - if (IS_OP_LITERAL(op)) { - op->aop = aop = newAsmop(AOP_LIT); - aop->aopu.aop_lit = op->operand.valOperand; - aop->size = getSize(operandType(op)); - return; - } - - { - sym_link *type = operandType(op); - if(IS_PTR_CONST(type)) - DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__); - } - - /* if already has a asmop then continue */ - if (op->aop) - return ; - - /* if the underlying symbol has a aop */ - if (IS_SYMOP(op) && OP_SYMBOL(op)->aop) { - DEBUGpic14_emitcode(";","%d",__LINE__); - op->aop = OP_SYMBOL(op)->aop; - return; - } - - /* if this is a true symbol */ - if (IS_TRUE_SYMOP(op)) { - //DEBUGpic14_emitcode(";","%d - true symop",__LINE__); - op->aop = aopForSym(ic,OP_SYMBOL(op),result); - return ; - } - - /* this is a temporary : this has - only four choices : - a) register - b) spillocation - c) rematerialize - d) conditional - e) can be a return use only */ - - sym = OP_SYMBOL(op); - - - /* if the type is a conditional */ - if (sym->regType == REG_CND) { - aop = op->aop = sym->aop = newAsmop(AOP_CRY); - aop->size = 0; - return; - } - - /* if it is spilt then two situations - a) is rematerialize - b) has a spill location */ - if (sym->isspilt || sym->nRegs == 0) { - - DEBUGpic14_emitcode(";","%d",__LINE__); - /* rematerialize it NOW */ - if (sym->remat) { - - sym->aop = op->aop = aop = - aopForRemat (op); - aop->size = getSize(sym->type); - //DEBUGpic14_emitcode(";"," %d: size %d, %s\n",__LINE__,aop->size,aop->aopu.aop_immd); - return; - } - - if (sym->accuse) { - int i; - aop = op->aop = sym->aop = newAsmop(AOP_ACC); - aop->size = getSize(sym->type); - for ( i = 0 ; i < 2 ; i++ ) - aop->aopu.aop_str[i] = accUse[i]; - DEBUGpic14_emitcode(";","%d size=%d",__LINE__,aop->size); - return; - } - - if (sym->ruonly ) { - if(sym->isptr) { // && sym->uptr - aop = op->aop = sym->aop = newAsmop(AOP_PCODE); - aop->aopu.pcop = newpCodeOp(NULL,PO_GPR_POINTER); //popCopyReg(&pc_fsr); - - //PCOI(aop->aopu.pcop)->_const = 0; - //PCOI(aop->aopu.pcop)->index = 0; - /* - DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", - __LINE__,sym->rname, 0, PCOI(aop->aopu.pcop)->_const); - */ - //allocDirReg (IC_LEFT(ic)); - - aop->size = getSize(sym->type); - DEBUGpic14_emitcode(";","%d",__LINE__); - return; - - } else { - - unsigned i; - - aop = op->aop = sym->aop = newAsmop(AOP_STR); - aop->size = getSize(sym->type); - for ( i = 0 ; i < fReturnSizePic ; i++ ) - aop->aopu.aop_str[i] = fReturn[i]; - - DEBUGpic14_emitcode(";","%d",__LINE__); - return; - } - } - - /* else spill location */ - if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) { - /* force a new aop if sizes differ */ - sym->usl.spillLoc->aop = NULL; - } - DEBUGpic14_emitcode(";","%s %d %s sym->rname = %s, offset %d", - __FUNCTION__,__LINE__, - sym->usl.spillLoc->rname, - sym->rname, sym->usl.spillLoc->offset); - - sym->aop = op->aop = aop = newAsmop(AOP_PCODE); - //aop->aopu.pcop = popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset); - aop->aopu.pcop = popRegFromString(sym->usl.spillLoc->rname, - getSize(sym->type), - sym->usl.spillLoc->offset); - aop->size = getSize(sym->type); - - return; - } - - { - sym_link *type = operandType(op); - if(IS_PTR_CONST(type)) - DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__); - } - - /* must be in a register */ - DEBUGpic14_emitcode(";","%d register type nRegs=%d",__LINE__,sym->nRegs); - sym->aop = op->aop = aop = newAsmop(AOP_REG); - aop->size = sym->nRegs; - for ( i = 0 ; i < sym->nRegs ;i++) - aop->aopu.aop_reg[i] = sym->regs[i]; + asmop *aop; + symbol *sym; + int i; + + if (!op) + return ; + + // DEBUGpic14_emitcode(";","%d",__LINE__); + /* if this a literal */ + if (IS_OP_LITERAL(op)) { + op->aop = aop = newAsmop(AOP_LIT); + aop->aopu.aop_lit = op->operand.valOperand; + aop->size = getSize(operandType(op)); + return; + } + + { + sym_link *type = operandType(op); + if(IS_PTR_CONST(type)) + DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__); + } + + /* if already has a asmop then continue */ + if (op->aop) + return ; + + /* if the underlying symbol has a aop */ + if (IS_SYMOP(op) && OP_SYMBOL(op)->aop) { + DEBUGpic14_emitcode(";","%d",__LINE__); + op->aop = OP_SYMBOL(op)->aop; + return; + } + + /* if this is a true symbol */ + if (IS_TRUE_SYMOP(op)) { + //DEBUGpic14_emitcode(";","%d - true symop",__LINE__); + op->aop = aopForSym(ic,OP_SYMBOL(op),result); + return ; + } + + /* this is a temporary : this has + only four choices : + a) register + b) spillocation + c) rematerialize + d) conditional + e) can be a return use only */ + + sym = OP_SYMBOL(op); + + + /* if the type is a conditional */ + if (sym->regType == REG_CND) { + aop = op->aop = sym->aop = newAsmop(AOP_CRY); + aop->size = 0; + return; + } + + /* if it is spilt then two situations + a) is rematerialize + b) has a spill location */ + if (sym->isspilt || sym->nRegs == 0) { + + DEBUGpic14_emitcode(";","%d",__LINE__); + /* rematerialize it NOW */ + if (sym->remat) { + + sym->aop = op->aop = aop = + aopForRemat (op); + aop->size = getSize(sym->type); + //DEBUGpic14_emitcode(";"," %d: size %d, %s\n",__LINE__,aop->size,aop->aopu.aop_immd); + return; + } + + if (sym->accuse) { + int i; + aop = op->aop = sym->aop = newAsmop(AOP_ACC); + aop->size = getSize(sym->type); + for ( i = 0 ; i < 2 ; i++ ) + aop->aopu.aop_str[i] = accUse[i]; + DEBUGpic14_emitcode(";","%d size=%d",__LINE__,aop->size); + return; + } + + if (sym->ruonly ) { + if(sym->isptr) { // && sym->uptr + aop = op->aop = sym->aop = newAsmop(AOP_PCODE); + aop->aopu.pcop = newpCodeOp(NULL,PO_GPR_POINTER); //popCopyReg(&pc_fsr); + + //PCOI(aop->aopu.pcop)->_const = 0; + //PCOI(aop->aopu.pcop)->index = 0; + /* + DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d", + __LINE__,sym->rname, 0, PCOI(aop->aopu.pcop)->_const); + */ + //allocDirReg (IC_LEFT(ic)); + + aop->size = getSize(sym->type); + DEBUGpic14_emitcode(";","%d",__LINE__); + return; + + } else { + + unsigned i; + + aop = op->aop = sym->aop = newAsmop(AOP_STR); + aop->size = getSize(sym->type); + for ( i = 0 ; i < fReturnSizePic ; i++ ) + aop->aopu.aop_str[i] = fReturn[i]; + + DEBUGpic14_emitcode(";","%d",__LINE__); + return; + } + } + + /* else spill location */ + if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) { + /* force a new aop if sizes differ */ + sym->usl.spillLoc->aop = NULL; + } + DEBUGpic14_emitcode(";","%s %d %s sym->rname = %s, offset %d", + __FUNCTION__,__LINE__, + sym->usl.spillLoc->rname, + sym->rname, sym->usl.spillLoc->offset); + + sym->aop = op->aop = aop = newAsmop(AOP_PCODE); + //aop->aopu.pcop = popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset); + aop->aopu.pcop = popRegFromString(sym->usl.spillLoc->rname, + getSize(sym->type), + sym->usl.spillLoc->offset); + aop->size = getSize(sym->type); + + return; + } + + { + sym_link *type = operandType(op); + if(IS_PTR_CONST(type)) + DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__); + } + + /* must be in a register */ + DEBUGpic14_emitcode(";","%d register type nRegs=%d",__LINE__,sym->nRegs); + sym->aop = op->aop = aop = newAsmop(AOP_REG); + aop->size = sym->nRegs; + for ( i = 0 ; i < sym->nRegs ;i++) + aop->aopu.aop_reg[i] = sym->regs[i]; } /*-----------------------------------------------------------------*/ @@ -890,103 +890,103 @@ void aopOp (operand *op, iCode *ic, bool result) /*----------------------------------------------------------------*/ void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) { - asmop *aop ; - - if (!op) - aop = aaop; - else - aop = op->aop; - - if (!aop) - return ; - - if (aop->freed) - goto dealloc; - - aop->freed = 1; - - /* depending on the asmop type only three cases need work AOP_RO - , AOP_R1 && AOP_STK */ + asmop *aop ; + + if (!op) + aop = aaop; + else + aop = op->aop; + + if (!aop) + return ; + + if (aop->freed) + goto dealloc; + + aop->freed = 1; + + /* depending on the asmop type only three cases need work AOP_RO + , AOP_R1 && AOP_STK */ #if 0 - switch (aop->type) { - case AOP_R0 : - if (_G.r0Pushed ) { - if (pop) { - pic14_emitcode ("pop","ar0"); - _G.r0Pushed--; - } - } - bitVectUnSetBit(ic->rUsed,R0_IDX); - break; - - case AOP_R1 : - if (_G.r1Pushed ) { - if (pop) { - pic14_emitcode ("pop","ar1"); - _G.r1Pushed--; - } - } - bitVectUnSetBit(ic->rUsed,R1_IDX); - break; - - case AOP_STK : - { - int sz = aop->size; - int stk = aop->aopu.aop_stk + aop->size; - bitVectUnSetBit(ic->rUsed,R0_IDX); - bitVectUnSetBit(ic->rUsed,R1_IDX); - - getFreePtr(ic,&aop,FALSE); - - if (options.stack10bit) - { - /* I'm not sure what to do here yet... */ - /* #STUB */ - fprintf(stderr, - "*** Warning: probably generating bad code for " - "10 bit stack mode.\n"); - } - - if (stk) { - pic14_emitcode ("mov","a,_bp"); - pic14_emitcode ("add","a,#0x%02x",((char)stk) & 0xff); - pic14_emitcode ("mov","%s,a",aop->aopu.aop_ptr->name); - } else { - pic14_emitcode ("mov","%s,_bp",aop->aopu.aop_ptr->name); - } - - while (sz--) { - pic14_emitcode("pop","acc"); - pic14_emitcode("mov","@%s,a",aop->aopu.aop_ptr->name); - if (!sz) break; - pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); - } - op->aop = aop; - freeAsmop(op,NULL,ic,TRUE); - if (_G.r0Pushed) { - pic14_emitcode("pop","ar0"); - _G.r0Pushed--; - } - - if (_G.r1Pushed) { - pic14_emitcode("pop","ar1"); - _G.r1Pushed--; - } - } - } + switch (aop->type) { + case AOP_R0 : + if (_G.r0Pushed ) { + if (pop) { + pic14_emitcode ("pop","ar0"); + _G.r0Pushed--; + } + } + bitVectUnSetBit(ic->rUsed,R0_IDX); + break; + + case AOP_R1 : + if (_G.r1Pushed ) { + if (pop) { + pic14_emitcode ("pop","ar1"); + _G.r1Pushed--; + } + } + bitVectUnSetBit(ic->rUsed,R1_IDX); + break; + + case AOP_STK : + { + int sz = aop->size; + int stk = aop->aopu.aop_stk + aop->size; + bitVectUnSetBit(ic->rUsed,R0_IDX); + bitVectUnSetBit(ic->rUsed,R1_IDX); + + getFreePtr(ic,&aop,FALSE); + + if (options.stack10bit) + { + /* I'm not sure what to do here yet... */ + /* #STUB */ + fprintf(stderr, + "*** Warning: probably generating bad code for " + "10 bit stack mode.\n"); + } + + if (stk) { + pic14_emitcode ("mov","a,_bp"); + pic14_emitcode ("add","a,#0x%02x",((char)stk) & 0xff); + pic14_emitcode ("mov","%s,a",aop->aopu.aop_ptr->name); + } else { + pic14_emitcode ("mov","%s,_bp",aop->aopu.aop_ptr->name); + } + + while (sz--) { + pic14_emitcode("pop","acc"); + pic14_emitcode("mov","@%s,a",aop->aopu.aop_ptr->name); + if (!sz) break; + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); + } + op->aop = aop; + freeAsmop(op,NULL,ic,TRUE); + if (_G.r0Pushed) { + pic14_emitcode("pop","ar0"); + _G.r0Pushed--; + } + + if (_G.r1Pushed) { + pic14_emitcode("pop","ar1"); + _G.r1Pushed--; + } + } + } #endif - + dealloc: - /* all other cases just dealloc */ - if (op ) { - op->aop = NULL; - if (IS_SYMOP(op)) { - OP_SYMBOL(op)->aop = NULL; - /* if the symbol has a spill */ - if (SPIL_LOC(op)) - SPIL_LOC(op)->aop = NULL; - } - } + /* all other cases just dealloc */ + if (op ) { + op->aop = NULL; + if (IS_SYMOP(op)) { + OP_SYMBOL(op)->aop = NULL; + /* if the symbol has a spill */ + if (SPIL_LOC(op)) + SPIL_LOC(op)->aop = NULL; + } + } } /*-----------------------------------------------------------------*/ @@ -994,156 +994,156 @@ dealloc: /*-----------------------------------------------------------------*/ char *aopGet (asmop *aop, int offset, bool bit16, bool dname) { - char *s = buffer ; - char *rs; - - //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* offset is greater than - size then zero */ - if (offset > (aop->size - 1) && - aop->type != AOP_LIT) - return zero; - - /* depending on type */ - switch (aop->type) { - - case AOP_R0: - case AOP_R1: - DEBUGpic14_emitcode(";","%d",__LINE__); - /* if we need to increment it */ - while (offset > aop->coff) { - pic14_emitcode ("inc","%s",aop->aopu.aop_ptr->name); - aop->coff++; - } - - while (offset < aop->coff) { - pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); - aop->coff--; - } - - aop->coff = offset ; - if (aop->paged) { - pic14_emitcode("movx","a,@%s",aop->aopu.aop_ptr->name); - return (dname ? "acc" : "a"); - } - sprintf(s,"@%s",aop->aopu.aop_ptr->name); - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - case AOP_DPTR: - case AOP_DPTR2: - DEBUGpic14_emitcode(";","%d",__LINE__); - if (aop->type == AOP_DPTR2) - { - genSetDPTR(1); - } - - while (offset > aop->coff) { - pic14_emitcode ("inc","dptr"); - aop->coff++; - } - - while (offset < aop->coff) { - pic14_emitcode("lcall","__decdptr"); - aop->coff--; - } - - aop->coff = offset; - if (aop->code) { - pic14_emitcode("clr","a"); - pic14_emitcode("movc","a,@a+dptr"); - } - else { - pic14_emitcode("movx","a,@dptr"); - } - - if (aop->type == AOP_DPTR2) - { - genSetDPTR(0); - } - - return (dname ? "acc" : "a"); - - - case AOP_IMMD: - if (bit16) - sprintf (s,"%s",aop->aopu.aop_immd); - else - if (offset) - sprintf(s,"(%s >> %d)", - aop->aopu.aop_immd, - offset*8); - else - sprintf(s,"%s", - aop->aopu.aop_immd); - DEBUGpic14_emitcode(";","%d immd %s",__LINE__,s); - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - case AOP_DIR: - if (offset) { - sprintf(s,"(%s + %d)", - aop->aopu.aop_dir, - offset); - DEBUGpic14_emitcode(";","oops AOP_DIR did this %s\n",s); - } else - sprintf(s,"%s",aop->aopu.aop_dir); - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - case AOP_REG: - //if (dname) - // return aop->aopu.aop_reg[offset]->dname; - //else - return aop->aopu.aop_reg[offset]->name; - - case AOP_CRY: - //pic14_emitcode(";","%d",__LINE__); - return aop->aopu.aop_dir; - - case AOP_ACC: - DEBUGpic14_emitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__); - return "AOP_accumulator_bug"; - - case AOP_LIT: - sprintf(s,"0x%02x", pic14aopLiteral (aop->aopu.aop_lit,offset)); - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - case AOP_STR: - aop->coff = offset ; - if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && - dname) - return "acc"; - DEBUGpic14_emitcode(";","%d - %s",__LINE__, aop->aopu.aop_str[offset]); - - return aop->aopu.aop_str[offset]; - - case AOP_PCODE: - { - pCodeOp *pcop = aop->aopu.pcop; - DEBUGpic14_emitcode(";","%d: aopGet AOP_PCODE type %s",__LINE__,pCodeOpType(pcop)); - if(pcop->name) { - DEBUGpic14_emitcode(";","%s offset %d",pcop->name,PCOI(pcop)->offset); - //sprintf(s,"(%s+0x%02x)", pcop->name,PCOI(aop->aopu.pcop)->offset); - sprintf(s,"%s", pcop->name); - } else - sprintf(s,"0x%02x", PCOI(aop->aopu.pcop)->offset); - - } - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - } - - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "aopget got unsupported aop->type"); - exit(0); + char *s = buffer ; + char *rs; + + //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* offset is greater than + size then zero */ + if (offset > (aop->size - 1) && + aop->type != AOP_LIT) + return zero; + + /* depending on type */ + switch (aop->type) { + + case AOP_R0: + case AOP_R1: + DEBUGpic14_emitcode(";","%d",__LINE__); + /* if we need to increment it */ + while (offset > aop->coff) { + pic14_emitcode ("inc","%s",aop->aopu.aop_ptr->name); + aop->coff++; + } + + while (offset < aop->coff) { + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); + aop->coff--; + } + + aop->coff = offset ; + if (aop->paged) { + pic14_emitcode("movx","a,@%s",aop->aopu.aop_ptr->name); + return (dname ? "acc" : "a"); + } + sprintf(s,"@%s",aop->aopu.aop_ptr->name); + rs = Safe_calloc(1,strlen(s)+1); + strcpy(rs,s); + return rs; + + case AOP_DPTR: + case AOP_DPTR2: + DEBUGpic14_emitcode(";","%d",__LINE__); + if (aop->type == AOP_DPTR2) + { + genSetDPTR(1); + } + + while (offset > aop->coff) { + pic14_emitcode ("inc","dptr"); + aop->coff++; + } + + while (offset < aop->coff) { + pic14_emitcode("lcall","__decdptr"); + aop->coff--; + } + + aop->coff = offset; + if (aop->code) { + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a,@a+dptr"); + } + else { + pic14_emitcode("movx","a,@dptr"); + } + + if (aop->type == AOP_DPTR2) + { + genSetDPTR(0); + } + + return (dname ? "acc" : "a"); + + + case AOP_IMMD: + if (bit16) + sprintf (s,"%s",aop->aopu.aop_immd); + else + if (offset) + sprintf(s,"(%s >> %d)", + aop->aopu.aop_immd, + offset*8); + else + sprintf(s,"%s", + aop->aopu.aop_immd); + DEBUGpic14_emitcode(";","%d immd %s",__LINE__,s); + rs = Safe_calloc(1,strlen(s)+1); + strcpy(rs,s); + return rs; + + case AOP_DIR: + if (offset) { + sprintf(s,"(%s + %d)", + aop->aopu.aop_dir, + offset); + DEBUGpic14_emitcode(";","oops AOP_DIR did this %s\n",s); + } else + sprintf(s,"%s",aop->aopu.aop_dir); + rs = Safe_calloc(1,strlen(s)+1); + strcpy(rs,s); + return rs; + + case AOP_REG: + //if (dname) + // return aop->aopu.aop_reg[offset]->dname; + //else + return aop->aopu.aop_reg[offset]->name; + + case AOP_CRY: + //pic14_emitcode(";","%d",__LINE__); + return aop->aopu.aop_dir; + + case AOP_ACC: + DEBUGpic14_emitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__); + return "AOP_accumulator_bug"; + + case AOP_LIT: + sprintf(s,"0x%02x", pic14aopLiteral (aop->aopu.aop_lit,offset)); + rs = Safe_calloc(1,strlen(s)+1); + strcpy(rs,s); + return rs; + + case AOP_STR: + aop->coff = offset ; + if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && + dname) + return "acc"; + DEBUGpic14_emitcode(";","%d - %s",__LINE__, aop->aopu.aop_str[offset]); + + return aop->aopu.aop_str[offset]; + + case AOP_PCODE: + { + pCodeOp *pcop = aop->aopu.pcop; + DEBUGpic14_emitcode(";","%d: aopGet AOP_PCODE type %s",__LINE__,pCodeOpType(pcop)); + if(pcop->name) { + DEBUGpic14_emitcode(";","%s offset %d",pcop->name,PCOI(pcop)->offset); + //sprintf(s,"(%s+0x%02x)", pcop->name,PCOI(aop->aopu.pcop)->offset); + sprintf(s,"%s", pcop->name); + } else + sprintf(s,"0x%02x", PCOI(aop->aopu.pcop)->offset); + + } + rs = Safe_calloc(1,strlen(s)+1); + strcpy(rs,s); + return rs; + + } + + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "aopget got unsupported aop->type"); + exit(0); } @@ -1152,16 +1152,16 @@ char *aopGet (asmop *aop, int offset, bool bit16, bool dname) /*-----------------------------------------------------------------*/ pCodeOp *popGetTempReg(void) { - - pCodeOp *pcop; - - pcop = newpCodeOp(NULL, PO_GPR_TEMP); - if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r) { - PCOR(pcop)->r->wasUsed=1; - PCOR(pcop)->r->isFree=0; - } - - return pcop; + + pCodeOp *pcop; + + pcop = newpCodeOp(NULL, PO_GPR_TEMP); + if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r) { + PCOR(pcop)->r->wasUsed=1; + PCOR(pcop)->r->isFree=0; + } + + return pcop; } /*-----------------------------------------------------------------*/ @@ -1169,23 +1169,23 @@ pCodeOp *popGetTempReg(void) /*-----------------------------------------------------------------*/ void popReleaseTempReg(pCodeOp *pcop) { - - if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r) - PCOR(pcop)->r->isFree = 1; - + + if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r) + PCOR(pcop)->r->isFree = 1; + } /*-----------------------------------------------------------------*/ /* popGetLabel - create a new pCodeOp of type PO_LABEL */ /*-----------------------------------------------------------------*/ pCodeOp *popGetLabel(unsigned int key) { - - DEBUGpic14_emitcode ("; ***","%s key=%d, label offset %d",__FUNCTION__,key, labelOffset); - - if(key>(unsigned int)max_key) - max_key = key; - - return newpCodeOpLabel(NULL,key+100+labelOffset); + + DEBUGpic14_emitcode ("; ***","%s key=%d, label offset %d",__FUNCTION__,key, labelOffset); + + if(key>(unsigned int)max_key) + max_key = key; + + return newpCodeOpLabel(NULL,key+100+labelOffset); } /*-------------------------------------------------------------------*/ @@ -1193,10 +1193,10 @@ pCodeOp *popGetLabel(unsigned int key) /*-------------------------------------------------------------------*/ pCodeOp *popGetHighLabel(unsigned int key) { - pCodeOp *pcop; - pcop = popGetLabel(key); - PCOLAB(pcop)->offset = 1; - return pcop; + pCodeOp *pcop; + pcop = popGetLabel(key); + PCOLAB(pcop)->offset = 1; + return pcop; } /*-----------------------------------------------------------------*/ @@ -1204,18 +1204,17 @@ pCodeOp *popGetHighLabel(unsigned int key) /*-----------------------------------------------------------------*/ pCodeOp *popGetLit(unsigned int lit) { - - return newpCodeOpLit(lit); + + return newpCodeOpLit(lit); } - /*-----------------------------------------------------------------*/ /* popGetImmd - asm operator to pcode immediate conversion */ /*-----------------------------------------------------------------*/ pCodeOp *popGetImmd(char *name, unsigned int offset, int index,int is_func) { - - return newpCodeOpImmd(name, offset,index, 0, is_func); + + return newpCodeOpImmd(name, offset,index, 0, is_func); } @@ -1224,18 +1223,18 @@ pCodeOp *popGetImmd(char *name, unsigned int offset, int index,int is_func) /*-----------------------------------------------------------------*/ pCodeOp *popGetWithString(char *str, int isExtern) { - pCodeOp *pcop; - - - if(!str) { - fprintf(stderr,"NULL string %s %d\n",__FILE__,__LINE__); - exit (1); - } - - pcop = newpCodeOp(str,PO_STR); - PCOS(pcop)->isPublic = isExtern ? 1 : 0; - - return pcop; + pCodeOp *pcop; + + + if(!str) { + fprintf(stderr,"NULL string %s %d\n",__FILE__,__LINE__); + exit (1); + } + + pcop = newpCodeOp(str,PO_STR); + PCOS(pcop)->isPublic = isExtern ? 1 : 0; + + return pcop; } /*-----------------------------------------------------------------*/ @@ -1243,53 +1242,53 @@ pCodeOp *popGetWithString(char *str, int isExtern) /*-----------------------------------------------------------------*/ pCodeOp *popRegFromString(char *str, int size, int offset) { - - pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - pcop->type = PO_DIR; - - DEBUGpic14_emitcode(";","%d",__LINE__); - - if(!str) - str = "BAD_STRING"; - - pcop->name = Safe_calloc(1,strlen(str)+1); - strcpy(pcop->name,str); - - //pcop->name = Safe_strdup( ( (str) ? str : "BAD STRING")); - - PCOR(pcop)->r = dirregWithName(pcop->name); - if(PCOR(pcop)->r == NULL) { - //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size); - PCOR(pcop)->r = allocRegByName (pcop->name,size); - DEBUGpic14_emitcode(";","%d %s offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset); - } else { - DEBUGpic14_emitcode(";","%d %s offset=%d",__LINE__,pcop->name,offset); - } - PCOR(pcop)->instance = offset; - - return pcop; + + pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + pcop->type = PO_DIR; + + DEBUGpic14_emitcode(";","%d",__LINE__); + + if(!str) + str = "BAD_STRING"; + + pcop->name = Safe_calloc(1,strlen(str)+1); + strcpy(pcop->name,str); + + //pcop->name = Safe_strdup( ( (str) ? str : "BAD STRING")); + + PCOR(pcop)->r = dirregWithName(pcop->name); + if(PCOR(pcop)->r == NULL) { + //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size); + PCOR(pcop)->r = allocRegByName (pcop->name,size); + DEBUGpic14_emitcode(";","%d %s offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset); + } else { + DEBUGpic14_emitcode(";","%d %s offset=%d",__LINE__,pcop->name,offset); + } + PCOR(pcop)->instance = offset; + + return pcop; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeOp *popRegFromIdx(int rIdx) { - pCodeOp *pcop; - - DEBUGpic14_emitcode ("; ***","%s,%d , rIdx=0x%x", - __FUNCTION__,__LINE__,rIdx); - - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - - PCOR(pcop)->rIdx = rIdx; - PCOR(pcop)->r = typeRegWithIdx(rIdx,REG_STK,1); - PCOR(pcop)->r->isFree = 0; - PCOR(pcop)->r->wasUsed = 1; - - pcop->type = PCOR(pcop)->r->pc_type; - - - return pcop; + pCodeOp *pcop; + + DEBUGpic14_emitcode ("; ***","%s,%d , rIdx=0x%x", + __FUNCTION__,__LINE__,rIdx); + + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + + PCOR(pcop)->rIdx = rIdx; + PCOR(pcop)->r = typeRegWithIdx(rIdx,REG_STK,1); + PCOR(pcop)->r->isFree = 0; + PCOR(pcop)->r->wasUsed = 1; + + pcop->type = PCOR(pcop)->r->pc_type; + + + return pcop; } /*-----------------------------------------------------------------*/ @@ -1297,347 +1296,347 @@ pCodeOp *popRegFromIdx(int rIdx) /*-----------------------------------------------------------------*/ pCodeOp *popGet (asmop *aop, int offset) //, bool bit16, bool dname) { - //char *s = buffer ; - //char *rs; - - pCodeOp *pcop; - - //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* offset is greater than - size then zero */ - - if (offset > (aop->size - 1) && - aop->type != AOP_LIT) - return NULL; //zero; - - /* depending on type */ - switch (aop->type) { - - case AOP_R0: - case AOP_R1: - case AOP_DPTR: - case AOP_DPTR2: - case AOP_ACC: - DEBUGpic14_emitcode(";8051 legacy","%d type = %s",__LINE__,AopType(aop->type)); - return NULL; - - case AOP_IMMD: - DEBUGpic14_emitcode(";","%d",__LINE__); - return popGetImmd(aop->aopu.aop_immd,offset,0,0); - - case AOP_DIR: - return popRegFromString(aop->aopu.aop_dir, aop->size, offset); + //char *s = buffer ; + //char *rs; + + pCodeOp *pcop; + + //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* offset is greater than + size then zero */ + + if (offset > (aop->size - 1) && + aop->type != AOP_LIT) + return NULL; //zero; + + /* depending on type */ + switch (aop->type) { + + case AOP_R0: + case AOP_R1: + case AOP_DPTR: + case AOP_DPTR2: + case AOP_ACC: + DEBUGpic14_emitcode(";8051 legacy","%d type = %s",__LINE__,AopType(aop->type)); + return NULL; + + case AOP_IMMD: + DEBUGpic14_emitcode(";","%d",__LINE__); + return popGetImmd(aop->aopu.aop_immd,offset,0,0); + + case AOP_DIR: + return popRegFromString(aop->aopu.aop_dir, aop->size, offset); #if 0 - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - pcop->type = PO_DIR; - - /* - if (offset) - sprintf(s,"(%s + %d)", - aop->aopu.aop_dir, - offset); - else - sprintf(s,"%s",aop->aopu.aop_dir); - pcop->name = Safe_calloc(1,strlen(s)+1); - strcpy(pcop->name,s); - */ - pcop->name = Safe_calloc(1,strlen(aop->aopu.aop_dir)+1); - strcpy(pcop->name,aop->aopu.aop_dir); - PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir); - if(PCOR(pcop)->r == NULL) { - //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size); - PCOR(pcop)->r = allocRegByName (aop->aopu.aop_dir,aop->size); - DEBUGpic14_emitcode(";","%d %s offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset); - } else { - DEBUGpic14_emitcode(";","%d %s offset=%d",__LINE__,pcop->name,offset); - } - PCOR(pcop)->instance = offset; - - return pcop; + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + pcop->type = PO_DIR; + + /* + if (offset) + sprintf(s,"(%s + %d)", + aop->aopu.aop_dir, + offset); + else + sprintf(s,"%s",aop->aopu.aop_dir); + pcop->name = Safe_calloc(1,strlen(s)+1); + strcpy(pcop->name,s); + */ + pcop->name = Safe_calloc(1,strlen(aop->aopu.aop_dir)+1); + strcpy(pcop->name,aop->aopu.aop_dir); + PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir); + if(PCOR(pcop)->r == NULL) { + //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size); + PCOR(pcop)->r = allocRegByName (aop->aopu.aop_dir,aop->size); + DEBUGpic14_emitcode(";","%d %s offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset); + } else { + DEBUGpic14_emitcode(";","%d %s offset=%d",__LINE__,pcop->name,offset); + } + PCOR(pcop)->instance = offset; + + return pcop; #endif - - case AOP_REG: - { - int rIdx = aop->aopu.aop_reg[offset]->rIdx; - - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - PCOR(pcop)->rIdx = rIdx; - PCOR(pcop)->r = pic14_regWithIdx(rIdx); - PCOR(pcop)->r->wasUsed=1; - PCOR(pcop)->r->isFree=0; - - PCOR(pcop)->instance = offset; - pcop->type = PCOR(pcop)->r->pc_type; - //rs = aop->aopu.aop_reg[offset]->name; - DEBUGpic14_emitcode(";","%d regiser idx = %d ",__LINE__,rIdx); - return pcop; - } - - case AOP_CRY: - pcop = newpCodeOpBit(aop->aopu.aop_dir,-1,1); - PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir); - //if(PCOR(pcop)->r == NULL) - //fprintf(stderr,"%d - couldn't find %s in allocated registers\n",__LINE__,aop->aopu.aop_dir); - return pcop; - - case AOP_LIT: - return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset)); - - case AOP_STR: - DEBUGpic14_emitcode(";","%d %s",__LINE__,aop->aopu.aop_str[offset]); - return newpCodeOpRegFromStr(aop->aopu.aop_str[offset]); - /* - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - PCOR(pcop)->r = allocRegByName(aop->aopu.aop_str[offset]); - PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; - pcop->type = PCOR(pcop)->r->pc_type; - pcop->name = PCOR(pcop)->r->name; - - return pcop; - */ - - case AOP_PCODE: - DEBUGpic14_emitcode(";","popGet AOP_PCODE (%s) %d %s",pCodeOpType(aop->aopu.pcop), - __LINE__, - ((aop->aopu.pcop->name)? (aop->aopu.pcop->name) : "no name")); - pcop = pCodeOpCopy(aop->aopu.pcop); - PCOI(pcop)->offset = offset; - return pcop; - } - - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "popGet got unsupported aop->type"); - exit(0); + + case AOP_REG: + { + int rIdx = aop->aopu.aop_reg[offset]->rIdx; + + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + PCOR(pcop)->rIdx = rIdx; + PCOR(pcop)->r = pic14_regWithIdx(rIdx); + PCOR(pcop)->r->wasUsed=1; + PCOR(pcop)->r->isFree=0; + + PCOR(pcop)->instance = offset; + pcop->type = PCOR(pcop)->r->pc_type; + //rs = aop->aopu.aop_reg[offset]->name; + DEBUGpic14_emitcode(";","%d regiser idx = %d ",__LINE__,rIdx); + return pcop; + } + + case AOP_CRY: + pcop = newpCodeOpBit(aop->aopu.aop_dir,-1,1); + PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir); + //if(PCOR(pcop)->r == NULL) + //fprintf(stderr,"%d - couldn't find %s in allocated registers\n",__LINE__,aop->aopu.aop_dir); + return pcop; + + case AOP_LIT: + return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset)); + + case AOP_STR: + DEBUGpic14_emitcode(";","%d %s",__LINE__,aop->aopu.aop_str[offset]); + return newpCodeOpRegFromStr(aop->aopu.aop_str[offset]); + /* + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + PCOR(pcop)->r = allocRegByName(aop->aopu.aop_str[offset]); + PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; + pcop->type = PCOR(pcop)->r->pc_type; + pcop->name = PCOR(pcop)->r->name; + + return pcop; + */ + + case AOP_PCODE: + DEBUGpic14_emitcode(";","popGet AOP_PCODE (%s) %d %s",pCodeOpType(aop->aopu.pcop), + __LINE__, + ((aop->aopu.pcop->name)? (aop->aopu.pcop->name) : "no name")); + pcop = pCodeOpCopy(aop->aopu.pcop); + PCOI(pcop)->offset = offset; + return pcop; + } + + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "popGet got unsupported aop->type"); + exit(0); } /*-----------------------------------------------------------------*/ /* aopPut - puts a string for a aop */ /*-----------------------------------------------------------------*/ void aopPut (asmop *aop, char *s, int offset) { - char *d = buffer ; - symbol *lbl ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (aop->size && offset > ( aop->size - 1)) { - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "aopPut got offset > aop->size"); - exit(0); - } - - /* will assign value to value */ - /* depending on where it is ofcourse */ - switch (aop->type) { - case AOP_DIR: - if (offset) { - sprintf(d,"(%s + %d)", - aop->aopu.aop_dir,offset); - fprintf(stderr,"oops aopPut:AOP_DIR did this %s\n",s); - - } else - sprintf(d,"%s",aop->aopu.aop_dir); - - if (strcmp(d,s)) { - DEBUGpic14_emitcode(";","%d",__LINE__); - if(strcmp(s,"W")) - pic14_emitcode("movf","%s,w",s); - pic14_emitcode("movwf","%s",d); - - if(strcmp(s,"W")) { - pic14_emitcode(";BUG!? should have this:movf","%s,w %d",s,__LINE__); - if(offset >= aop->size) { - emitpcode(POC_CLRF,popGet(aop,offset)); - break; - } else - emitpcode(POC_MOVLW,popGetImmd(s,offset,0,0)); - } - - emitpcode(POC_MOVWF,popGet(aop,offset)); - - - } - break; - - case AOP_REG: - if (strcmp(aop->aopu.aop_reg[offset]->name,s) != 0) { // && - //strcmp(aop->aopu.aop_reg[offset]->dname,s)!= 0){ - /* - if (*s == '@' || - strcmp(s,"r0") == 0 || - strcmp(s,"r1") == 0 || - strcmp(s,"r2") == 0 || - strcmp(s,"r3") == 0 || - strcmp(s,"r4") == 0 || - strcmp(s,"r5") == 0 || - strcmp(s,"r6") == 0 || - strcmp(s,"r7") == 0 ) - pic14_emitcode("mov","%s,%s ; %d", - aop->aopu.aop_reg[offset]->dname,s,__LINE__); - else - */ - - if(strcmp(s,"W")==0 ) - pic14_emitcode("movf","%s,w ; %d",s,__LINE__); - - pic14_emitcode("movwf","%s", - aop->aopu.aop_reg[offset]->name); - - if(strcmp(s,zero)==0) { - emitpcode(POC_CLRF,popGet(aop,offset)); - - } else if(strcmp(s,"W")==0) { - pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - pcop->type = PO_GPR_REGISTER; - - PCOR(pcop)->rIdx = -1; - PCOR(pcop)->r = NULL; - - DEBUGpic14_emitcode(";","%d",__LINE__); - pcop->name = Safe_strdup(s); - emitpcode(POC_MOVFW,pcop); - emitpcode(POC_MOVWF,popGet(aop,offset)); - } else if(strcmp(s,one)==0) { - emitpcode(POC_CLRF,popGet(aop,offset)); - emitpcode(POC_INCF,popGet(aop,offset)); - } else { - emitpcode(POC_MOVWF,popGet(aop,offset)); - } - } - break; - - case AOP_DPTR: - case AOP_DPTR2: - - if (aop->type == AOP_DPTR2) - { - genSetDPTR(1); - } - - if (aop->code) { - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "aopPut writting to code space"); - exit(0); - } - - while (offset > aop->coff) { - aop->coff++; - pic14_emitcode ("inc","dptr"); - } - - while (offset < aop->coff) { - aop->coff-- ; - pic14_emitcode("lcall","__decdptr"); - } - - aop->coff = offset; - - /* if not in accumulater */ - MOVA(s); - - pic14_emitcode ("movx","@dptr,a"); - - if (aop->type == AOP_DPTR2) - { - genSetDPTR(0); - } - break; - - case AOP_R0: - case AOP_R1: - while (offset > aop->coff) { - aop->coff++; - pic14_emitcode("inc","%s",aop->aopu.aop_ptr->name); - } - while (offset < aop->coff) { - aop->coff-- ; - pic14_emitcode ("dec","%s",aop->aopu.aop_ptr->name); - } - aop->coff = offset; - - if (aop->paged) { - MOVA(s); - pic14_emitcode("movx","@%s,a",aop->aopu.aop_ptr->name); - - } else - if (*s == '@') { - MOVA(s); - pic14_emitcode("mov","@%s,a ; %d",aop->aopu.aop_ptr->name,__LINE__); - } else - if (strcmp(s,"r0") == 0 || - strcmp(s,"r1") == 0 || - strcmp(s,"r2") == 0 || - strcmp(s,"r3") == 0 || - strcmp(s,"r4") == 0 || - strcmp(s,"r5") == 0 || - strcmp(s,"r6") == 0 || - strcmp(s,"r7") == 0 ) { - char buffer[10]; - sprintf(buffer,"a%s",s); - pic14_emitcode("mov","@%s,%s", - aop->aopu.aop_ptr->name,buffer); - } else - pic14_emitcode("mov","@%s,%s",aop->aopu.aop_ptr->name,s); - - break; - - case AOP_STK: - if (strcmp(s,"a") == 0) - pic14_emitcode("push","acc"); - else - pic14_emitcode("push","%s",s); - - break; - - case AOP_CRY: - /* if bit variable */ - if (!aop->aopu.aop_dir) { - pic14_emitcode("clr","a"); - pic14_emitcode("rlc","a"); - } else { - if (s == zero) - pic14_emitcode("clr","%s",aop->aopu.aop_dir); - else - if (s == one) - pic14_emitcode("setb","%s",aop->aopu.aop_dir); - else - if (!strcmp(s,"c")) - pic14_emitcode("mov","%s,c",aop->aopu.aop_dir); - else { - lbl = newiTempLabel(NULL); - - if (strcmp(s,"a")) { - MOVA(s); - } - pic14_emitcode("clr","c"); - pic14_emitcode("jz","%05d_DS_",lbl->key+100); - pic14_emitcode("cpl","c"); - pic14_emitcode("","%05d_DS_:",lbl->key+100); - pic14_emitcode("mov","%s,c",aop->aopu.aop_dir); - } - } - break; - - case AOP_STR: - aop->coff = offset; - if (strcmp(aop->aopu.aop_str[offset],s)) - pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s,__LINE__); - break; - - case AOP_ACC: - aop->coff = offset; - if (!offset && (strcmp(s,"acc") == 0)) - break; - - if (strcmp(aop->aopu.aop_str[offset],s)) - pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s, __LINE__); - break; - - default : - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "aopPut got unsupported aop->type"); - exit(0); - } - + char *d = buffer ; + symbol *lbl ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (aop->size && offset > ( aop->size - 1)) { + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "aopPut got offset > aop->size"); + exit(0); + } + + /* will assign value to value */ + /* depending on where it is ofcourse */ + switch (aop->type) { + case AOP_DIR: + if (offset) { + sprintf(d,"(%s + %d)", + aop->aopu.aop_dir,offset); + fprintf(stderr,"oops aopPut:AOP_DIR did this %s\n",s); + + } else + sprintf(d,"%s",aop->aopu.aop_dir); + + if (strcmp(d,s)) { + DEBUGpic14_emitcode(";","%d",__LINE__); + if(strcmp(s,"W")) + pic14_emitcode("movf","%s,w",s); + pic14_emitcode("movwf","%s",d); + + if(strcmp(s,"W")) { + pic14_emitcode(";BUG!? should have this:movf","%s,w %d",s,__LINE__); + if(offset >= aop->size) { + emitpcode(POC_CLRF,popGet(aop,offset)); + break; + } else + emitpcode(POC_MOVLW,popGetImmd(s,offset,0,0)); + } + + emitpcode(POC_MOVWF,popGet(aop,offset)); + + + } + break; + + case AOP_REG: + if (strcmp(aop->aopu.aop_reg[offset]->name,s) != 0) { // && + //strcmp(aop->aopu.aop_reg[offset]->dname,s)!= 0){ + /* + if (*s == '@' || + strcmp(s,"r0") == 0 || + strcmp(s,"r1") == 0 || + strcmp(s,"r2") == 0 || + strcmp(s,"r3") == 0 || + strcmp(s,"r4") == 0 || + strcmp(s,"r5") == 0 || + strcmp(s,"r6") == 0 || + strcmp(s,"r7") == 0 ) + pic14_emitcode("mov","%s,%s ; %d", + aop->aopu.aop_reg[offset]->dname,s,__LINE__); + else + */ + + if(strcmp(s,"W")==0 ) + pic14_emitcode("movf","%s,w ; %d",s,__LINE__); + + pic14_emitcode("movwf","%s", + aop->aopu.aop_reg[offset]->name); + + if(strcmp(s,zero)==0) { + emitpcode(POC_CLRF,popGet(aop,offset)); + + } else if(strcmp(s,"W")==0) { + pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + pcop->type = PO_GPR_REGISTER; + + PCOR(pcop)->rIdx = -1; + PCOR(pcop)->r = NULL; + + DEBUGpic14_emitcode(";","%d",__LINE__); + pcop->name = Safe_strdup(s); + emitpcode(POC_MOVFW,pcop); + emitpcode(POC_MOVWF,popGet(aop,offset)); + } else if(strcmp(s,one)==0) { + emitpcode(POC_CLRF,popGet(aop,offset)); + emitpcode(POC_INCF,popGet(aop,offset)); + } else { + emitpcode(POC_MOVWF,popGet(aop,offset)); + } + } + break; + + case AOP_DPTR: + case AOP_DPTR2: + + if (aop->type == AOP_DPTR2) + { + genSetDPTR(1); + } + + if (aop->code) { + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "aopPut writting to code space"); + exit(0); + } + + while (offset > aop->coff) { + aop->coff++; + pic14_emitcode ("inc","dptr"); + } + + while (offset < aop->coff) { + aop->coff-- ; + pic14_emitcode("lcall","__decdptr"); + } + + aop->coff = offset; + + /* if not in accumulater */ + MOVA(s); + + pic14_emitcode ("movx","@dptr,a"); + + if (aop->type == AOP_DPTR2) + { + genSetDPTR(0); + } + break; + + case AOP_R0: + case AOP_R1: + while (offset > aop->coff) { + aop->coff++; + pic14_emitcode("inc","%s",aop->aopu.aop_ptr->name); + } + while (offset < aop->coff) { + aop->coff-- ; + pic14_emitcode ("dec","%s",aop->aopu.aop_ptr->name); + } + aop->coff = offset; + + if (aop->paged) { + MOVA(s); + pic14_emitcode("movx","@%s,a",aop->aopu.aop_ptr->name); + + } else + if (*s == '@') { + MOVA(s); + pic14_emitcode("mov","@%s,a ; %d",aop->aopu.aop_ptr->name,__LINE__); + } else + if (strcmp(s,"r0") == 0 || + strcmp(s,"r1") == 0 || + strcmp(s,"r2") == 0 || + strcmp(s,"r3") == 0 || + strcmp(s,"r4") == 0 || + strcmp(s,"r5") == 0 || + strcmp(s,"r6") == 0 || + strcmp(s,"r7") == 0 ) { + char buffer[10]; + sprintf(buffer,"a%s",s); + pic14_emitcode("mov","@%s,%s", + aop->aopu.aop_ptr->name,buffer); + } else + pic14_emitcode("mov","@%s,%s",aop->aopu.aop_ptr->name,s); + + break; + + case AOP_STK: + if (strcmp(s,"a") == 0) + pic14_emitcode("push","acc"); + else + pic14_emitcode("push","%s",s); + + break; + + case AOP_CRY: + /* if bit variable */ + if (!aop->aopu.aop_dir) { + pic14_emitcode("clr","a"); + pic14_emitcode("rlc","a"); + } else { + if (s == zero) + pic14_emitcode("clr","%s",aop->aopu.aop_dir); + else + if (s == one) + pic14_emitcode("setb","%s",aop->aopu.aop_dir); + else + if (!strcmp(s,"c")) + pic14_emitcode("mov","%s,c",aop->aopu.aop_dir); + else { + lbl = newiTempLabel(NULL); + + if (strcmp(s,"a")) { + MOVA(s); + } + pic14_emitcode("clr","c"); + pic14_emitcode("jz","%05d_DS_",lbl->key+100); + pic14_emitcode("cpl","c"); + pic14_emitcode("","%05d_DS_:",lbl->key+100); + pic14_emitcode("mov","%s,c",aop->aopu.aop_dir); + } + } + break; + + case AOP_STR: + aop->coff = offset; + if (strcmp(aop->aopu.aop_str[offset],s)) + pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s,__LINE__); + break; + + case AOP_ACC: + aop->coff = offset; + if (!offset && (strcmp(s,"acc") == 0)) + break; + + if (strcmp(aop->aopu.aop_str[offset],s)) + pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s, __LINE__); + break; + + default : + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "aopPut got unsupported aop->type"); + exit(0); + } + } /*-----------------------------------------------------------------*/ @@ -1645,19 +1644,19 @@ void aopPut (asmop *aop, char *s, int offset) /*-----------------------------------------------------------------*/ void mov2w (asmop *aop, int offset) { - - if(!aop) - return; - - DEBUGpic14_emitcode ("; ***","%s %d offset=%d",__FUNCTION__,__LINE__,offset); - - if ( aop->type == AOP_PCODE || - aop->type == AOP_LIT || - aop->type == AOP_IMMD ) - emitpcode(POC_MOVLW,popGet(aop,offset)); - else - emitpcode(POC_MOVFW,popGet(aop,offset)); - + + if(!aop) + return; + + DEBUGpic14_emitcode ("; ***","%s %d offset=%d",__FUNCTION__,__LINE__,offset); + + if ( aop->type == AOP_PCODE || + aop->type == AOP_LIT || + aop->type == AOP_IMMD ) + emitpcode(POC_MOVLW,popGet(aop,offset)); + else + emitpcode(POC_MOVFW,popGet(aop,offset)); + } /*-----------------------------------------------------------------*/ @@ -1665,56 +1664,56 @@ void mov2w (asmop *aop, int offset) /*-----------------------------------------------------------------*/ static void reAdjustPreg (asmop *aop) { - int size ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aop->coff = 0; - if ((size = aop->size) <= 1) - return ; - size-- ; - switch (aop->type) { - case AOP_R0 : - case AOP_R1 : - while (size--) - pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); - break; - case AOP_DPTR : - case AOP_DPTR2: - if (aop->type == AOP_DPTR2) - { - genSetDPTR(1); - } - while (size--) - { - pic14_emitcode("lcall","__decdptr"); - } - - if (aop->type == AOP_DPTR2) - { - genSetDPTR(0); - } - break; - - } - + int size ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aop->coff = 0; + if ((size = aop->size) <= 1) + return ; + size-- ; + switch (aop->type) { + case AOP_R0 : + case AOP_R1 : + while (size--) + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); + break; + case AOP_DPTR : + case AOP_DPTR2: + if (aop->type == AOP_DPTR2) + { + genSetDPTR(1); + } + while (size--) + { + pic14_emitcode("lcall","__decdptr"); + } + + if (aop->type == AOP_DPTR2) + { + genSetDPTR(0); + } + break; + + } + } #if 0 /*-----------------------------------------------------------------*/ -/* opIsGptr: returns non-zero if the passed operand is */ -/* a generic pointer type. */ +/* opIsGptr: returns non-zero if the passed operand is */ +/* a generic pointer type. */ /*-----------------------------------------------------------------*/ static int opIsGptr(operand *op) { - sym_link *type = operandType(op); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if ((AOP_SIZE(op) == GPTRSIZE) && IS_GENPTR(type)) - { - return 1; - } - return 0; + sym_link *type = operandType(op); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if ((AOP_SIZE(op) == GPTRSIZE) && IS_GENPTR(type)) + { + return 1; + } + return 0; } #endif @@ -1723,29 +1722,29 @@ static int opIsGptr(operand *op) /*-----------------------------------------------------------------*/ int pic14_getDataSize(operand *op) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - - return AOP_SIZE(op); - - // tsd- in the pic port, the genptr size is 1, so this code here - // fails. ( in the 8051 port, the size was 4). + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + + return AOP_SIZE(op); + + // tsd- in the pic port, the genptr size is 1, so this code here + // fails. ( in the 8051 port, the size was 4). #if 0 - int size; - size = AOP_SIZE(op); - if (size == GPTRSIZE) - { - sym_link *type = operandType(op); - if (IS_GENPTR(type)) - { - /* generic pointer; arithmetic operations - * should ignore the high byte (pointer type). - */ - size--; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - } - } - return size; + int size; + size = AOP_SIZE(op); + if (size == GPTRSIZE) + { + sym_link *type = operandType(op); + if (IS_GENPTR(type)) + { + /* generic pointer; arithmetic operations + * should ignore the high byte (pointer type). + */ + size--; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + } + } + return size; #endif } @@ -1754,21 +1753,21 @@ int pic14_getDataSize(operand *op) /*-----------------------------------------------------------------*/ void pic14_outAcc(operand *result) { - int size,offset; - DEBUGpic14_emitcode ("; ***","%s %d - ",__FUNCTION__,__LINE__); - DEBUGpic14_AopType(__LINE__,NULL,NULL,result); - - - size = pic14_getDataSize(result); - if(size){ - emitpcode(POC_MOVWF,popGet(AOP(result),0)); - size--; - offset = 1; - /* unsigned or positive */ - while(size--) - emitpcode(POC_CLRF,popGet(AOP(result),offset++)); - } - + int size,offset; + DEBUGpic14_emitcode ("; ***","%s %d - ",__FUNCTION__,__LINE__); + DEBUGpic14_AopType(__LINE__,NULL,NULL,result); + + + size = pic14_getDataSize(result); + if(size){ + emitpcode(POC_MOVWF,popGet(AOP(result),0)); + size--; + offset = 1; + /* unsigned or positive */ + while(size--) + emitpcode(POC_CLRF,popGet(AOP(result),offset++)); + } + } /*-----------------------------------------------------------------*/ @@ -1776,16 +1775,16 @@ void pic14_outAcc(operand *result) /*-----------------------------------------------------------------*/ void pic14_outBitC(operand *result) { - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if the result is bit */ - if (AOP_TYPE(result) == AOP_CRY) - aopPut(AOP(result),"c",0); - else { - pic14_emitcode("clr","a ; %d", __LINE__); - pic14_emitcode("rlc","a"); - pic14_outAcc(result); - } + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if the result is bit */ + if (AOP_TYPE(result) == AOP_CRY) + aopPut(AOP(result),"c",0); + else { + pic14_emitcode("clr","a ; %d", __LINE__); + pic14_emitcode("rlc","a"); + pic14_outAcc(result); + } } /*-----------------------------------------------------------------*/ @@ -1793,17 +1792,17 @@ void pic14_outBitC(operand *result) /*-----------------------------------------------------------------*/ void pic14_toBoolean(operand *oper) { - int size = AOP_SIZE(oper) - 1; - int offset = 1; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if ( AOP_TYPE(oper) != AOP_ACC) { - emitpcode(POC_MOVFW,popGet(AOP(oper),0)); - } - while (size--) { - emitpcode(POC_IORFW, popGet(AOP(oper),offset++)); - } + int size = AOP_SIZE(oper) - 1; + int offset = 1; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if ( AOP_TYPE(oper) != AOP_ACC) { + emitpcode(POC_MOVFW,popGet(AOP(oper),0)); + } + while (size--) { + emitpcode(POC_IORFW, popGet(AOP(oper),offset++)); + } } @@ -1812,46 +1811,46 @@ void pic14_toBoolean(operand *oper) /*-----------------------------------------------------------------*/ static void genNot (iCode *ic) { - symbol *tlbl; - int size; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* assign asmOps to operand & result */ - aopOp (IC_LEFT(ic),ic,FALSE); - aopOp (IC_RESULT(ic),ic,TRUE); - - DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic)); - /* if in bit space then a special case */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) { - if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { - emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_XORWF,popGet(AOP(IC_RESULT(ic)),0)); - } else { - emitpcode(POC_CLRF,popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_BTFSS,popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_INCF,popGet(AOP(IC_RESULT(ic)),0)); - } - goto release; - } - - size = AOP_SIZE(IC_LEFT(ic)); - if(size == 1) { - emitpcode(POC_COMFW,popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_ANDLW,popGetLit(1)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - goto release; - } - pic14_toBoolean(IC_LEFT(ic)); - - tlbl = newiTempLabel(NULL); - pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_outBitC(IC_RESULT(ic)); - + symbol *tlbl; + int size; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* assign asmOps to operand & result */ + aopOp (IC_LEFT(ic),ic,FALSE); + aopOp (IC_RESULT(ic),ic,TRUE); + + DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic)); + /* if in bit space then a special case */ + if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) { + if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { + emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_XORWF,popGet(AOP(IC_RESULT(ic)),0)); + } else { + emitpcode(POC_CLRF,popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_BTFSS,popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_INCF,popGet(AOP(IC_RESULT(ic)),0)); + } + goto release; + } + + size = AOP_SIZE(IC_LEFT(ic)); + if(size == 1) { + emitpcode(POC_COMFW,popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_ANDLW,popGetLit(1)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + goto release; + } + pic14_toBoolean(IC_LEFT(ic)); + + tlbl = newiTempLabel(NULL); + pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(IC_RESULT(ic)); + release: - /* release the aops */ - freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1)); - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + /* release the aops */ + freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1)); + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); } @@ -1860,42 +1859,42 @@ release: /*-----------------------------------------------------------------*/ static void genCpl (iCode *ic) { - operand *left, *result; - int size, offset=0; - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp((left = IC_LEFT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - /* if both are in bit space then - a special case */ - if (AOP_TYPE(result) == AOP_CRY && - AOP_TYPE(left) == AOP_CRY ) { - - pic14_emitcode("mov","c,%s",left->aop->aopu.aop_dir); - pic14_emitcode("cpl","c"); - pic14_emitcode("mov","%s,c",result->aop->aopu.aop_dir); - goto release; - } - - size = AOP_SIZE(result); - while (size--) { - - if(AOP_TYPE(left) == AOP_ACC) - emitpcode(POC_XORLW, popGetLit(0xff)); - else - emitpcode(POC_COMFW,popGet(AOP(left),offset)); - - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - - } - - + operand *left, *result; + int size, offset=0; + + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp((left = IC_LEFT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + /* if both are in bit space then + a special case */ + if (AOP_TYPE(result) == AOP_CRY && + AOP_TYPE(left) == AOP_CRY ) { + + pic14_emitcode("mov","c,%s",left->aop->aopu.aop_dir); + pic14_emitcode("cpl","c"); + pic14_emitcode("mov","%s,c",result->aop->aopu.aop_dir); + goto release; + } + + size = AOP_SIZE(result); + while (size--) { + + if(AOP_TYPE(left) == AOP_ACC) + emitpcode(POC_XORLW, popGetLit(0xff)); + else + emitpcode(POC_COMFW,popGet(AOP(left),offset)); + + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + + } + + release: - /* release the aops */ - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? 0 : 1)); - freeAsmop(result,NULL,ic,TRUE); + /* release the aops */ + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? 0 : 1)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -1903,26 +1902,26 @@ release: /*-----------------------------------------------------------------*/ static void genUminusFloat(operand *op,operand *result) { - int size ,offset =0 ; - char *l; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* for this we just need to flip the - first it then copy the rest in place */ - size = AOP_SIZE(op) - 1; - l = aopGet(AOP(op),3,FALSE,FALSE); - - MOVA(l); - - pic14_emitcode("cpl","acc.7"); - aopPut(AOP(result),"a",3); - - while(size--) { - aopPut(AOP(result), - aopGet(AOP(op),offset,FALSE,FALSE), - offset); - offset++; - } + int size ,offset =0 ; + char *l; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* for this we just need to flip the + first it then copy the rest in place */ + size = AOP_SIZE(op) - 1; + l = aopGet(AOP(op),3,FALSE,FALSE); + + MOVA(l); + + pic14_emitcode("cpl","acc.7"); + aopPut(AOP(result),"a",3); + + while(size--) { + aopPut(AOP(result), + aopGet(AOP(op),offset,FALSE,FALSE), + offset); + offset++; + } } /*-----------------------------------------------------------------*/ @@ -1930,58 +1929,58 @@ static void genUminusFloat(operand *op,operand *result) /*-----------------------------------------------------------------*/ static void genUminus (iCode *ic) { - int size, i; - sym_link *optype, *rtype; - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* assign asmops */ - aopOp(IC_LEFT(ic),ic,FALSE); - aopOp(IC_RESULT(ic),ic,TRUE); - - /* if both in bit space then special - case */ - if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && - AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { - - emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_BTFSS, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0)); - - goto release; - } - - optype = operandType(IC_LEFT(ic)); - rtype = operandType(IC_RESULT(ic)); - - /* if float then do float stuff */ - if (IS_FLOAT(optype)) { - genUminusFloat(IC_LEFT(ic),IC_RESULT(ic)); - goto release; - } - - /* otherwise subtract from zero by taking the 2's complement */ - size = AOP_SIZE(IC_LEFT(ic)); - - for(i=0; inext) - if (ic->op == CALL || ic->op == PCALL) - break; - - if (!ic) { - fprintf(stderr,"found parameter push with no function call\n"); - return ; - } - - /* if the registers have been saved already then - do nothing */ - if (ic->regsSaved || IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type)) - return ; - - /* find the registers in use at this time - and push them away to safety */ - rsave = bitVectCplAnd(bitVectCopy(ic->rMask), - ic->rUsed); - - ic->regsSaved = 1; - if (options.useXstack) { - if (bitVectBitValue(rsave,R0_IDX)) - pic14_emitcode("mov","b,r0"); - pic14_emitcode("mov","r0,%s",spname); - for (i = 0 ; i < pic14_nRegs ; i++) { - if (bitVectBitValue(rsave,i)) { - if (i == R0_IDX) - pic14_emitcode("mov","a,b"); - else - pic14_emitcode("mov","a,%s",pic14_regWithIdx(i)->name); - pic14_emitcode("movx","@r0,a"); - pic14_emitcode("inc","r0"); - } - } - pic14_emitcode("mov","%s,r0",spname); - if (bitVectBitValue(rsave,R0_IDX)) - pic14_emitcode("mov","r0,b"); - }// else - //for (i = 0 ; i < pic14_nRegs ; i++) { - // if (bitVectBitValue(rsave,i)) - // pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); - //} - - dtype = operandType(IC_LEFT(ic)); - if (currFunc && dtype && - (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) && - IFFUNC_ISISR(currFunc->type) && - !ic->bankSaved) - - saverbank(FUNC_REGBANK(dtype),ic,TRUE); - + int i; + iCode *ic; + bitVect *rsave; + sym_link *dtype; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* look for call */ + for (ic = lic ; ic ; ic = ic->next) + if (ic->op == CALL || ic->op == PCALL) + break; + + if (!ic) { + fprintf(stderr,"found parameter push with no function call\n"); + return ; + } + + /* if the registers have been saved already then + do nothing */ + if (ic->regsSaved || IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type)) + return ; + + /* find the registers in use at this time + and push them away to safety */ + rsave = bitVectCplAnd(bitVectCopy(ic->rMask), + ic->rUsed); + + ic->regsSaved = 1; + if (options.useXstack) { + if (bitVectBitValue(rsave,R0_IDX)) + pic14_emitcode("mov","b,r0"); + pic14_emitcode("mov","r0,%s",spname); + for (i = 0 ; i < pic14_nRegs ; i++) { + if (bitVectBitValue(rsave,i)) { + if (i == R0_IDX) + pic14_emitcode("mov","a,b"); + else + pic14_emitcode("mov","a,%s",pic14_regWithIdx(i)->name); + pic14_emitcode("movx","@r0,a"); + pic14_emitcode("inc","r0"); + } + } + pic14_emitcode("mov","%s,r0",spname); + if (bitVectBitValue(rsave,R0_IDX)) + pic14_emitcode("mov","r0,b"); + }// else + //for (i = 0 ; i < pic14_nRegs ; i++) { + // if (bitVectBitValue(rsave,i)) + // pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); + //} + + dtype = operandType(IC_LEFT(ic)); + if (currFunc && dtype && + (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) && + IFFUNC_ISISR(currFunc->type) && + !ic->bankSaved) + + saverbank(FUNC_REGBANK(dtype),ic,TRUE); + } /*-----------------------------------------------------------------*/ /* unsaveRegisters - pop the pushed registers */ /*-----------------------------------------------------------------*/ static void unsaveRegisters (iCode *ic) { - int i; - bitVect *rsave; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* find the registers in use at this time - and push them away to safety */ - rsave = bitVectCplAnd(bitVectCopy(ic->rMask), - ic->rUsed); - - if (options.useXstack) { - pic14_emitcode("mov","r0,%s",spname); - for (i = pic14_nRegs ; i >= 0 ; i--) { - if (bitVectBitValue(rsave,i)) { - pic14_emitcode("dec","r0"); - pic14_emitcode("movx","a,@r0"); - if (i == R0_IDX) - pic14_emitcode("mov","b,a"); - else - pic14_emitcode("mov","%s,a",pic14_regWithIdx(i)->name); - } - - } - pic14_emitcode("mov","%s,r0",spname); - if (bitVectBitValue(rsave,R0_IDX)) - pic14_emitcode("mov","r0,b"); - } //else - //for (i = pic14_nRegs ; i >= 0 ; i--) { - // if (bitVectBitValue(rsave,i)) - // pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname); - //} - + int i; + bitVect *rsave; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* find the registers in use at this time + and push them away to safety */ + rsave = bitVectCplAnd(bitVectCopy(ic->rMask), + ic->rUsed); + + if (options.useXstack) { + pic14_emitcode("mov","r0,%s",spname); + for (i = pic14_nRegs ; i >= 0 ; i--) { + if (bitVectBitValue(rsave,i)) { + pic14_emitcode("dec","r0"); + pic14_emitcode("movx","a,@r0"); + if (i == R0_IDX) + pic14_emitcode("mov","b,a"); + else + pic14_emitcode("mov","%s,a",pic14_regWithIdx(i)->name); + } + + } + pic14_emitcode("mov","%s,r0",spname); + if (bitVectBitValue(rsave,R0_IDX)) + pic14_emitcode("mov","r0,b"); + } //else + //for (i = pic14_nRegs ; i >= 0 ; i--) { + // if (bitVectBitValue(rsave,i)) + // pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname); + //} + } /*-----------------------------------------------------------------*/ -/* pushSide - */ +/* pushSide - */ /*-----------------------------------------------------------------*/ static void pushSide(operand * oper, int size) { #if 0 - int offset = 0; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - while (size--) { - char *l = aopGet(AOP(oper),offset++,FALSE,TRUE); - if (AOP_TYPE(oper) != AOP_REG && - AOP_TYPE(oper) != AOP_DIR && - strcmp(l,"a") ) { - pic14_emitcode("mov","a,%s",l); - pic14_emitcode("push","acc"); - } else - pic14_emitcode("push","%s",l); - } + int offset = 0; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + while (size--) { + char *l = aopGet(AOP(oper),offset++,FALSE,TRUE); + if (AOP_TYPE(oper) != AOP_REG && + AOP_TYPE(oper) != AOP_DIR && + strcmp(l,"a") ) { + pic14_emitcode("mov","a,%s",l); + pic14_emitcode("push","acc"); + } else + pic14_emitcode("push","%s",l); + } #endif } /*-----------------------------------------------------------------*/ -/* assignResultValue - */ +/* assignResultValue - */ /*-----------------------------------------------------------------*/ static void assignResultValue(operand * oper) { - int size = AOP_SIZE(oper); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - DEBUGpic14_AopType(__LINE__,oper,NULL,NULL); - - while (size--) { - if (GpsuedoStkPtr++) - emitpcode(POC_MOVFW,popRegFromIdx(Gstack_base_addr+2-GpsuedoStkPtr)); - emitpcode(POC_MOVWF, popGet(AOP(oper),size)); - } + int size = AOP_SIZE(oper); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + DEBUGpic14_AopType(__LINE__,oper,NULL,NULL); + + while (size--) { + if (GpsuedoStkPtr++) + emitpcode(POC_MOVFW,popRegFromIdx(Gstack_base_addr+2-GpsuedoStkPtr)); + emitpcode(POC_MOVWF, popGet(AOP(oper),size)); + } } @@ -2132,59 +2131,59 @@ static void assignResultValue(operand * oper) /*-----------------------------------------------------------------*/ static void genIpush (iCode *ic) { - - DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); + + DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); #if 0 - int size, offset = 0 ; - char *l; - - - /* if this is not a parm push : ie. it is spill push - and spill push is always done on the local stack */ - if (!ic->parmPush) { - - /* and the item is spilt then do nothing */ - if (OP_SYMBOL(IC_LEFT(ic))->isspilt) - return ; - - aopOp(IC_LEFT(ic),ic,FALSE); - size = AOP_SIZE(IC_LEFT(ic)); - /* push it on the stack */ - while(size--) { - l = aopGet(AOP(IC_LEFT(ic)),offset++,FALSE,TRUE); - if (*l == '#') { - MOVA(l); - l = "acc"; - } - pic14_emitcode("push","%s",l); - } - return ; - } - - /* this is a paramter push: in this case we call - the routine to find the call and save those - registers that need to be saved */ - saveRegisters(ic); - - /* then do the push */ - aopOp(IC_LEFT(ic),ic,FALSE); - - - // pushSide(IC_LEFT(ic), AOP_SIZE(IC_LEFT(ic))); - size = AOP_SIZE(IC_LEFT(ic)); - - while (size--) { - l = aopGet(AOP(IC_LEFT(ic)),offset++,FALSE,TRUE); - if (AOP_TYPE(IC_LEFT(ic)) != AOP_REG && - AOP_TYPE(IC_LEFT(ic)) != AOP_DIR && - strcmp(l,"a") ) { - pic14_emitcode("mov","a,%s",l); - pic14_emitcode("push","acc"); - } else - pic14_emitcode("push","%s",l); - } - - freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); + int size, offset = 0 ; + char *l; + + + /* if this is not a parm push : ie. it is spill push + and spill push is always done on the local stack */ + if (!ic->parmPush) { + + /* and the item is spilt then do nothing */ + if (OP_SYMBOL(IC_LEFT(ic))->isspilt) + return ; + + aopOp(IC_LEFT(ic),ic,FALSE); + size = AOP_SIZE(IC_LEFT(ic)); + /* push it on the stack */ + while(size--) { + l = aopGet(AOP(IC_LEFT(ic)),offset++,FALSE,TRUE); + if (*l == '#') { + MOVA(l); + l = "acc"; + } + pic14_emitcode("push","%s",l); + } + return ; + } + + /* this is a paramter push: in this case we call + the routine to find the call and save those + registers that need to be saved */ + saveRegisters(ic); + + /* then do the push */ + aopOp(IC_LEFT(ic),ic,FALSE); + + + // pushSide(IC_LEFT(ic), AOP_SIZE(IC_LEFT(ic))); + size = AOP_SIZE(IC_LEFT(ic)); + + while (size--) { + l = aopGet(AOP(IC_LEFT(ic)),offset++,FALSE,TRUE); + if (AOP_TYPE(IC_LEFT(ic)) != AOP_REG && + AOP_TYPE(IC_LEFT(ic)) != AOP_DIR && + strcmp(l,"a") ) { + pic14_emitcode("mov","a,%s",l); + pic14_emitcode("push","acc"); + } else + pic14_emitcode("push","%s",l); + } + + freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); #endif } @@ -2193,23 +2192,23 @@ static void genIpush (iCode *ic) /*-----------------------------------------------------------------*/ static void genIpop (iCode *ic) { - DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); #if 0 - int size,offset ; - - - /* if the temp was not pushed then */ - if (OP_SYMBOL(IC_LEFT(ic))->isspilt) - return ; - - aopOp(IC_LEFT(ic),ic,FALSE); - size = AOP_SIZE(IC_LEFT(ic)); - offset = (size-1); - while (size--) - pic14_emitcode("pop","%s",aopGet(AOP(IC_LEFT(ic)),offset--, - FALSE,TRUE)); - - freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); + int size,offset ; + + + /* if the temp was not pushed then */ + if (OP_SYMBOL(IC_LEFT(ic))->isspilt) + return ; + + aopOp(IC_LEFT(ic),ic,FALSE); + size = AOP_SIZE(IC_LEFT(ic)); + offset = (size-1); + while (size--) + pic14_emitcode("pop","%s",aopGet(AOP(IC_LEFT(ic)),offset--, + FALSE,TRUE)); + + freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); #endif } @@ -2218,46 +2217,46 @@ static void genIpop (iCode *ic) /*-----------------------------------------------------------------*/ static void unsaverbank (int bank,iCode *ic,bool popPsw) { - DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); #if 0 - int i; - asmop *aop ; - regs *r = NULL; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (popPsw) { - if (options.useXstack) { - aop = newAsmop(0); - r = getFreePtr(ic,&aop,FALSE); - - - pic14_emitcode("mov","%s,_spx",r->name); - pic14_emitcode("movx","a,@%s",r->name); - pic14_emitcode("mov","psw,a"); - pic14_emitcode("dec","%s",r->name); - - }else - pic14_emitcode ("pop","psw"); - } - - for (i = (pic14_nRegs - 1) ; i >= 0 ;i--) { - if (options.useXstack) { - pic14_emitcode("movx","a,@%s",r->name); - //pic14_emitcode("mov","(%s+%d),a", - // regspic14[i].base,8*bank+regspic14[i].offset); - pic14_emitcode("dec","%s",r->name); - - } else - pic14_emitcode("pop",""); //"(%s+%d)", - //regspic14[i].base,8*bank); //+regspic14[i].offset); - } - - if (options.useXstack) { - - pic14_emitcode("mov","_spx,%s",r->name); - freeAsmop(NULL,aop,ic,TRUE); - - } + int i; + asmop *aop ; + regs *r = NULL; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (popPsw) { + if (options.useXstack) { + aop = newAsmop(0); + r = getFreePtr(ic,&aop,FALSE); + + + pic14_emitcode("mov","%s,_spx",r->name); + pic14_emitcode("movx","a,@%s",r->name); + pic14_emitcode("mov","psw,a"); + pic14_emitcode("dec","%s",r->name); + + }else + pic14_emitcode ("pop","psw"); + } + + for (i = (pic14_nRegs - 1) ; i >= 0 ;i--) { + if (options.useXstack) { + pic14_emitcode("movx","a,@%s",r->name); + //pic14_emitcode("mov","(%s+%d),a", + // regspic14[i].base,8*bank+regspic14[i].offset); + pic14_emitcode("dec","%s",r->name); + + } else + pic14_emitcode("pop",""); //"(%s+%d)", + //regspic14[i].base,8*bank); //+regspic14[i].offset); + } + + if (options.useXstack) { + + pic14_emitcode("mov","_spx,%s",r->name); + freeAsmop(NULL,aop,ic,TRUE); + + } #endif } @@ -2266,47 +2265,47 @@ static void unsaverbank (int bank,iCode *ic,bool popPsw) /*-----------------------------------------------------------------*/ static void saverbank (int bank, iCode *ic, bool pushPsw) { - DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); #if 0 - int i; - asmop *aop ; - regs *r = NULL; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (options.useXstack) { - - aop = newAsmop(0); - r = getFreePtr(ic,&aop,FALSE); - pic14_emitcode("mov","%s,_spx",r->name); - - } - - for (i = 0 ; i < pic14_nRegs ;i++) { - if (options.useXstack) { - pic14_emitcode("inc","%s",r->name); - //pic14_emitcode("mov","a,(%s+%d)", - // regspic14[i].base,8*bank+regspic14[i].offset); - pic14_emitcode("movx","@%s,a",r->name); - } else - pic14_emitcode("push","");// "(%s+%d)", - //regspic14[i].base,8*bank+regspic14[i].offset); - } - - if (pushPsw) { - if (options.useXstack) { - pic14_emitcode("mov","a,psw"); - pic14_emitcode("movx","@%s,a",r->name); - pic14_emitcode("inc","%s",r->name); - pic14_emitcode("mov","_spx,%s",r->name); - freeAsmop (NULL,aop,ic,TRUE); - - } else - pic14_emitcode("push","psw"); - - pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff); - } - ic->bankSaved = 1; -#endif + int i; + asmop *aop ; + regs *r = NULL; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (options.useXstack) { + + aop = newAsmop(0); + r = getFreePtr(ic,&aop,FALSE); + pic14_emitcode("mov","%s,_spx",r->name); + + } + + for (i = 0 ; i < pic14_nRegs ;i++) { + if (options.useXstack) { + pic14_emitcode("inc","%s",r->name); + //pic14_emitcode("mov","a,(%s+%d)", + // regspic14[i].base,8*bank+regspic14[i].offset); + pic14_emitcode("movx","@%s,a",r->name); + } else + pic14_emitcode("push","");// "(%s+%d)", + //regspic14[i].base,8*bank+regspic14[i].offset); + } + + if (pushPsw) { + if (options.useXstack) { + pic14_emitcode("mov","a,psw"); + pic14_emitcode("movx","@%s,a",r->name); + pic14_emitcode("inc","%s",r->name); + pic14_emitcode("mov","_spx,%s",r->name); + freeAsmop (NULL,aop,ic,TRUE); + + } else + pic14_emitcode("push","psw"); + + pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff); + } + ic->bankSaved = 1; +#endif } /*-----------------------------------------------------------------*/ @@ -2314,131 +2313,131 @@ static void saverbank (int bank, iCode *ic, bool pushPsw) /*-----------------------------------------------------------------*/ static void genCall (iCode *ic) { - sym_link *dtype; - symbol *sym; - unsigned char *name; - int isExtern; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - /* if caller saves & we have not saved then */ - if (!ic->regsSaved) - saveRegisters(ic); - - /* if we are calling a function that is not using - the same register bank then we need to save the - destination registers on the stack */ - dtype = operandType(IC_LEFT(ic)); - if (currFunc && dtype && - (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) && - IFFUNC_ISISR(currFunc->type) && - !ic->bankSaved) - - saverbank(FUNC_REGBANK(dtype),ic,TRUE); - - /* if send set is not empty the assign */ - if (_G.sendSet) { - iCode *sic; - /* For the Pic port, there is no data stack. - * So parameters passed to functions are stored - * in registers. (The pCode optimizer will get - * rid of most of these :). - */ - int psuedoStkPtr=-1; - int firstTimeThruLoop = 1; - - _G.sendSet = reverseSet(_G.sendSet); - - /* First figure how many parameters are getting passed */ - for (sic = setFirstItem(_G.sendSet) ; sic ; - sic = setNextItem(_G.sendSet)) { - - aopOp(IC_LEFT(sic),sic,FALSE); - psuedoStkPtr += AOP_SIZE(IC_LEFT(sic)); - freeAsmop (IC_LEFT(sic),NULL,sic,FALSE); - } - - for (sic = setFirstItem(_G.sendSet) ; sic ; - sic = setNextItem(_G.sendSet)) { - int size, offset = 0; - - aopOp(IC_LEFT(sic),sic,FALSE); - size = AOP_SIZE(IC_LEFT(sic)); - - while (size--) { - DEBUGpic14_emitcode ("; ","%d left %s",__LINE__, - AopType(AOP_TYPE(IC_LEFT(sic)))); - - if(!firstTimeThruLoop) { - /* If this is not the first time we've been through the loop - * then we need to save the parameter in a temporary - * register. The last byte of the last parameter is - * passed in W. */ - emitpcode(POC_MOVWF,popRegFromIdx(Gstack_base_addr - --psuedoStkPtr)); - - } - firstTimeThruLoop=0; - - mov2w (AOP(IC_LEFT(sic)), offset); - offset++; - } - freeAsmop (IC_LEFT(sic),NULL,sic,TRUE); - } - _G.sendSet = NULL; - } - /* make the call */ - sym = OP_SYMBOL(IC_LEFT(ic)); - name = sym->rname[0] ? sym->rname : sym->name; - isExtern = IS_EXTERN(sym->etype); - if (isExtern) { - emitpcode(POC_PAGESEL,popGetWithString(name,1)); /* Extern functions maybe on another page - must call pagesel */ - } - emitpcode(POC_CALL,popGetWithString(name,isExtern)); - if (isExtern) { - emitpcode(POC_PAGESEL,popGetWithString("$",0)); /* May have returned from another page - must call pagesel */ - } - GpsuedoStkPtr=0; - /* if we need assign a result value */ - if ((IS_ITEMP(IC_RESULT(ic)) && - (OP_SYMBOL(IC_RESULT(ic))->nRegs || - OP_SYMBOL(IC_RESULT(ic))->spildir )) || - IS_TRUE_SYMOP(IC_RESULT(ic)) ) { - - _G.accInUse++; - aopOp(IC_RESULT(ic),ic,FALSE); - _G.accInUse--; - - assignResultValue(IC_RESULT(ic)); - - DEBUGpic14_emitcode ("; ","%d left %s",__LINE__, - AopType(AOP_TYPE(IC_RESULT(ic)))); - - freeAsmop(IC_RESULT(ic),NULL, ic,TRUE); - } - - /* adjust the stack for parameters if - required */ - if (ic->parmBytes) { - int i; - if (ic->parmBytes > 3) { - pic14_emitcode("mov","a,%s",spname); - pic14_emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff); - pic14_emitcode("mov","%s,a",spname); - } else - for ( i = 0 ; i < ic->parmBytes ;i++) - pic14_emitcode("dec","%s",spname); - - } - - /* if register bank was saved then pop them */ - if (ic->bankSaved) - unsaverbank(FUNC_REGBANK(dtype),ic,TRUE); - - /* if we hade saved some registers then unsave them */ - if (ic->regsSaved && !IFFUNC_CALLEESAVES(dtype)) - unsaveRegisters (ic); - - + sym_link *dtype; + symbol *sym; + unsigned char *name; + int isExtern; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + /* if caller saves & we have not saved then */ + if (!ic->regsSaved) + saveRegisters(ic); + + /* if we are calling a function that is not using + the same register bank then we need to save the + destination registers on the stack */ + dtype = operandType(IC_LEFT(ic)); + if (currFunc && dtype && + (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) && + IFFUNC_ISISR(currFunc->type) && + !ic->bankSaved) + + saverbank(FUNC_REGBANK(dtype),ic,TRUE); + + /* if send set is not empty the assign */ + if (_G.sendSet) { + iCode *sic; + /* For the Pic port, there is no data stack. + * So parameters passed to functions are stored + * in registers. (The pCode optimizer will get + * rid of most of these :). + */ + int psuedoStkPtr=-1; + int firstTimeThruLoop = 1; + + _G.sendSet = reverseSet(_G.sendSet); + + /* First figure how many parameters are getting passed */ + for (sic = setFirstItem(_G.sendSet) ; sic ; + sic = setNextItem(_G.sendSet)) { + + aopOp(IC_LEFT(sic),sic,FALSE); + psuedoStkPtr += AOP_SIZE(IC_LEFT(sic)); + freeAsmop (IC_LEFT(sic),NULL,sic,FALSE); + } + + for (sic = setFirstItem(_G.sendSet) ; sic ; + sic = setNextItem(_G.sendSet)) { + int size, offset = 0; + + aopOp(IC_LEFT(sic),sic,FALSE); + size = AOP_SIZE(IC_LEFT(sic)); + + while (size--) { + DEBUGpic14_emitcode ("; ","%d left %s",__LINE__, + AopType(AOP_TYPE(IC_LEFT(sic)))); + + if(!firstTimeThruLoop) { + /* If this is not the first time we've been through the loop + * then we need to save the parameter in a temporary + * register. The last byte of the last parameter is + * passed in W. */ + emitpcode(POC_MOVWF,popRegFromIdx(Gstack_base_addr - --psuedoStkPtr)); + + } + firstTimeThruLoop=0; + + mov2w (AOP(IC_LEFT(sic)), offset); + offset++; + } + freeAsmop (IC_LEFT(sic),NULL,sic,TRUE); + } + _G.sendSet = NULL; + } + /* make the call */ + sym = OP_SYMBOL(IC_LEFT(ic)); + name = sym->rname[0] ? sym->rname : sym->name; + isExtern = IS_EXTERN(sym->etype); + if (isExtern) { + emitpcode(POC_PAGESEL,popGetWithString(name,1)); /* Extern functions maybe on another page - must call pagesel */ + } + emitpcode(POC_CALL,popGetWithString(name,isExtern)); + if (isExtern) { + emitpcode(POC_PAGESEL,popGetWithString("$",0)); /* May have returned from another page - must call pagesel */ + } + GpsuedoStkPtr=0; + /* if we need assign a result value */ + if ((IS_ITEMP(IC_RESULT(ic)) && + (OP_SYMBOL(IC_RESULT(ic))->nRegs || + OP_SYMBOL(IC_RESULT(ic))->spildir )) || + IS_TRUE_SYMOP(IC_RESULT(ic)) ) { + + _G.accInUse++; + aopOp(IC_RESULT(ic),ic,FALSE); + _G.accInUse--; + + assignResultValue(IC_RESULT(ic)); + + DEBUGpic14_emitcode ("; ","%d left %s",__LINE__, + AopType(AOP_TYPE(IC_RESULT(ic)))); + + freeAsmop(IC_RESULT(ic),NULL, ic,TRUE); + } + + /* adjust the stack for parameters if + required */ + if (ic->parmBytes) { + int i; + if (ic->parmBytes > 3) { + pic14_emitcode("mov","a,%s",spname); + pic14_emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff); + pic14_emitcode("mov","%s,a",spname); + } else + for ( i = 0 ; i < ic->parmBytes ;i++) + pic14_emitcode("dec","%s",spname); + + } + + /* if register bank was saved then pop them */ + if (ic->bankSaved) + unsaverbank(FUNC_REGBANK(dtype),ic,TRUE); + + /* if we hade saved some registers then unsave them */ + if (ic->regsSaved && !IFFUNC_CALLEESAVES(dtype)) + unsaveRegisters (ic); + + } /*-----------------------------------------------------------------*/ @@ -2446,95 +2445,95 @@ static void genCall (iCode *ic) /*-----------------------------------------------------------------*/ static void genPcall (iCode *ic) { - sym_link *dtype; - symbol *albl = newiTempLabel(NULL); - symbol *blbl = newiTempLabel(NULL); - PIC_OPCODE poc; - pCodeOp *pcop; - operand *left; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if caller saves & we have not saved then */ - if (!ic->regsSaved) - saveRegisters(ic); - - /* if we are calling a function that is not using - the same register bank then we need to save the - destination registers on the stack */ - dtype = operandType(IC_LEFT(ic)); - if (currFunc && dtype && - IFFUNC_ISISR(currFunc->type) && - (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype))) - saverbank(FUNC_REGBANK(dtype),ic,TRUE); - - left = IC_LEFT(ic); - aopOp(left,ic,FALSE); - DEBUGpic14_AopType(__LINE__,left,NULL,NULL); - - pushSide(IC_LEFT(ic), FPTRSIZE); - - /* if send set is not empty, assign parameters */ - if (_G.sendSet) { - - DEBUGpic14_emitcode ("; ***","%s %d - WARNING arg-passing to indirect call not supported",__FUNCTION__,__LINE__); - /* no way to pass args - W always gets used to make the call */ - } - /* first idea - factor out a common helper function and call it. - But don't know how to get it generated only once in its own block - - if(AOP_TYPE(IC_LEFT(ic)) == AOP_DIR) { - char *rname; - char *buffer; - rname = IC_LEFT(ic)->aop->aopu.aop_dir; - DEBUGpic14_emitcode ("; ***","%s %d AOP_DIR %s",__FUNCTION__,__LINE__,rname); - buffer = Safe_calloc(1,strlen(rname)+16); - sprintf(buffer, "%s_goto_helper", rname); - addpCode2pBlock(pb,newpCode(POC_CALL,newpCodeOp(buffer,PO_STR))); - free(buffer); - } - */ - emitpcode(POC_CALL,popGetLabel(albl->key)); - pcop = popGetLabel(blbl->key); - emitpcode(POC_PAGESEL,popGetWithString(pcop->name,0)); /* Must restore PCLATH before goto, without destroying W */ - emitpcode(POC_GOTO,pcop); - emitpLabel(albl->key); - - poc = ( (AOP_TYPE(left) == AOP_PCODE) ? POC_MOVLW : POC_MOVFW); - - emitpcode(poc,popGet(AOP(left),1)); - emitpcode(POC_MOVWF,popCopyReg(&pc_pclath)); - emitpcode(poc,popGet(AOP(left),0)); - emitpcode(POC_MOVWF,popCopyReg(&pc_pcl)); - - emitpLabel(blbl->key); - - freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); - - /* if we need to assign a result value */ - if ((IS_ITEMP(IC_RESULT(ic)) && - (OP_SYMBOL(IC_RESULT(ic))->nRegs || - OP_SYMBOL(IC_RESULT(ic))->spildir)) || - IS_TRUE_SYMOP(IC_RESULT(ic)) ) { - - _G.accInUse++; - aopOp(IC_RESULT(ic),ic,FALSE); - _G.accInUse--; - - assignResultValue(IC_RESULT(ic)); - - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); - } - - /* if register bank was saved then unsave them */ - if (currFunc && dtype && - (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype))) - unsaverbank(FUNC_REGBANK(dtype),ic,TRUE); - - /* if we hade saved some registers then - unsave them */ - if (ic->regsSaved) - unsaveRegisters (ic); - + sym_link *dtype; + symbol *albl = newiTempLabel(NULL); + symbol *blbl = newiTempLabel(NULL); + PIC_OPCODE poc; + pCodeOp *pcop; + operand *left; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if caller saves & we have not saved then */ + if (!ic->regsSaved) + saveRegisters(ic); + + /* if we are calling a function that is not using + the same register bank then we need to save the + destination registers on the stack */ + dtype = operandType(IC_LEFT(ic)); + if (currFunc && dtype && + IFFUNC_ISISR(currFunc->type) && + (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype))) + saverbank(FUNC_REGBANK(dtype),ic,TRUE); + + left = IC_LEFT(ic); + aopOp(left,ic,FALSE); + DEBUGpic14_AopType(__LINE__,left,NULL,NULL); + + pushSide(IC_LEFT(ic), FPTRSIZE); + + /* if send set is not empty, assign parameters */ + if (_G.sendSet) { + + DEBUGpic14_emitcode ("; ***","%s %d - WARNING arg-passing to indirect call not supported",__FUNCTION__,__LINE__); + /* no way to pass args - W always gets used to make the call */ + } + /* first idea - factor out a common helper function and call it. + But don't know how to get it generated only once in its own block + + if(AOP_TYPE(IC_LEFT(ic)) == AOP_DIR) { + char *rname; + char *buffer; + rname = IC_LEFT(ic)->aop->aopu.aop_dir; + DEBUGpic14_emitcode ("; ***","%s %d AOP_DIR %s",__FUNCTION__,__LINE__,rname); + buffer = Safe_calloc(1,strlen(rname)+16); + sprintf(buffer, "%s_goto_helper", rname); + addpCode2pBlock(pb,newpCode(POC_CALL,newpCodeOp(buffer,PO_STR))); + free(buffer); + } + */ + emitpcode(POC_CALL,popGetLabel(albl->key)); + pcop = popGetLabel(blbl->key); + emitpcode(POC_PAGESEL,popGetWithString(pcop->name,0)); /* Must restore PCLATH before goto, without destroying W */ + emitpcode(POC_GOTO,pcop); + emitpLabel(albl->key); + + poc = ( (AOP_TYPE(left) == AOP_PCODE) ? POC_MOVLW : POC_MOVFW); + + emitpcode(poc,popGet(AOP(left),1)); + emitpcode(POC_MOVWF,popCopyReg(&pc_pclath)); + emitpcode(poc,popGet(AOP(left),0)); + emitpcode(POC_MOVWF,popCopyReg(&pc_pcl)); + + emitpLabel(blbl->key); + + freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); + + /* if we need to assign a result value */ + if ((IS_ITEMP(IC_RESULT(ic)) && + (OP_SYMBOL(IC_RESULT(ic))->nRegs || + OP_SYMBOL(IC_RESULT(ic))->spildir)) || + IS_TRUE_SYMOP(IC_RESULT(ic)) ) { + + _G.accInUse++; + aopOp(IC_RESULT(ic),ic,FALSE); + _G.accInUse--; + + assignResultValue(IC_RESULT(ic)); + + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + } + + /* if register bank was saved then unsave them */ + if (currFunc && dtype && + (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype))) + unsaverbank(FUNC_REGBANK(dtype),ic,TRUE); + + /* if we hade saved some registers then + unsave them */ + if (ic->regsSaved) + unsaveRegisters (ic); + } /*-----------------------------------------------------------------*/ @@ -2542,17 +2541,17 @@ static void genPcall (iCode *ic) /*-----------------------------------------------------------------*/ static int resultRemat (iCode *ic) { - // DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (SKIP_IC(ic) || ic->op == IFX) - return 0; - - if (IC_RESULT(ic) && IS_ITEMP(IC_RESULT(ic))) { - symbol *sym = OP_SYMBOL(IC_RESULT(ic)); - if (sym->remat && !POINTER_SET(ic)) - return 1; - } - - return 0; + // DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (SKIP_IC(ic) || ic->op == IFX) + return 0; + + if (IC_RESULT(ic) && IS_ITEMP(IC_RESULT(ic))) { + symbol *sym = OP_SYMBOL(IC_RESULT(ic)); + if (sym->remat && !POINTER_SET(ic)) + return 1; + } + + return 0; } #if defined(__BORLANDC__) || defined(_MSC_VER) @@ -2567,20 +2566,20 @@ static int resultRemat (iCode *ic) /*-----------------------------------------------------------------*/ static bool inExcludeList(char *s) { - DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); - int i =0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (options.excludeRegs[i] && - STRCASECMP(options.excludeRegs[i],"none") == 0) - return FALSE ; - - for ( i = 0 ; options.excludeRegs[i]; i++) { - if (options.excludeRegs[i] && - STRCASECMP(s,options.excludeRegs[i]) == 0) - return TRUE; - } - return FALSE ; + DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__); + int i =0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (options.excludeRegs[i] && + STRCASECMP(options.excludeRegs[i],"none") == 0) + return FALSE ; + + for ( i = 0 ; options.excludeRegs[i]; i++) { + if (options.excludeRegs[i] && + STRCASECMP(s,options.excludeRegs[i]) == 0) + return TRUE; + } + return FALSE ; } #endif @@ -2589,187 +2588,187 @@ static bool inExcludeList(char *s) /*-----------------------------------------------------------------*/ static void genFunction (iCode *ic) { - symbol *sym; - sym_link *ftype; - - DEBUGpic14_emitcode ("; ***","%s %d curr label offset=%dprevious max_key=%d ",__FUNCTION__,__LINE__,labelOffset,max_key); - - labelOffset += (max_key+4); - max_key=0; - GpsuedoStkPtr=0; - _G.nRegsSaved = 0; - /* create the function header */ - pic14_emitcode(";","-----------------------------------------"); - pic14_emitcode(";"," function %s",(sym = OP_SYMBOL(IC_LEFT(ic)))->name); - pic14_emitcode(";","-----------------------------------------"); - - pic14_emitcode("","%s:",sym->rname); - addpCode2pBlock(pb,newpCodeFunction(NULL,sym->rname,!IS_STATIC (sym->etype))); - - ftype = operandType(IC_LEFT(ic)); - - /* if critical function then turn interrupts off */ - if (IFFUNC_ISCRITICAL(ftype)) - pic14_emitcode("clr","ea"); - - /* here we need to generate the equates for the - register bank if required */ + symbol *sym; + sym_link *ftype; + + DEBUGpic14_emitcode ("; ***","%s %d curr label offset=%dprevious max_key=%d ",__FUNCTION__,__LINE__,labelOffset,max_key); + + labelOffset += (max_key+4); + max_key=0; + GpsuedoStkPtr=0; + _G.nRegsSaved = 0; + /* create the function header */ + pic14_emitcode(";","-----------------------------------------"); + pic14_emitcode(";"," function %s",(sym = OP_SYMBOL(IC_LEFT(ic)))->name); + pic14_emitcode(";","-----------------------------------------"); + + pic14_emitcode("","%s:",sym->rname); + addpCode2pBlock(pb,newpCodeFunction(NULL,sym->rname,!IS_STATIC (sym->etype))); + + ftype = operandType(IC_LEFT(ic)); + + /* if critical function then turn interrupts off */ + if (IFFUNC_ISCRITICAL(ftype)) + pic14_emitcode("clr","ea"); + + /* here we need to generate the equates for the + register bank if required */ #if 0 - if (FUNC_REGBANK(ftype) != rbank) { - int i ; - - rbank = FUNC_REGBANK(ftype); - for ( i = 0 ; i < pic14_nRegs ; i++ ) { - if (strcmp(regspic14[i].base,"0") == 0) - pic14_emitcode("","%s = 0x%02x", - regspic14[i].dname, - 8*rbank+regspic14[i].offset); - else - pic14_emitcode ("","%s = %s + 0x%02x", - regspic14[i].dname, - regspic14[i].base, - 8*rbank+regspic14[i].offset); - } - } + if (FUNC_REGBANK(ftype) != rbank) { + int i ; + + rbank = FUNC_REGBANK(ftype); + for ( i = 0 ; i < pic14_nRegs ; i++ ) { + if (strcmp(regspic14[i].base,"0") == 0) + pic14_emitcode("","%s = 0x%02x", + regspic14[i].dname, + 8*rbank+regspic14[i].offset); + else + pic14_emitcode ("","%s = %s + 0x%02x", + regspic14[i].dname, + regspic14[i].base, + 8*rbank+regspic14[i].offset); + } + } #endif - - /* if this is an interrupt service routine */ - if (IFFUNC_ISISR(sym->type)) { - /* already done in pic14createInterruptVect() - delete me - addpCode2pBlock(pb,newpCode(POC_GOTO,newpCodeOp("END_OF_INTERRUPT+1",PO_STR))); - emitpcodeNULLop(POC_NOP); - emitpcodeNULLop(POC_NOP); - emitpcodeNULLop(POC_NOP); - */ - emitpcode(POC_MOVWF, popCopyReg(&pc_wsave)); - emitpcode(POC_SWAPFW, popCopyReg(&pc_status)); - emitpcode(POC_CLRF, popCopyReg(&pc_status)); - emitpcode(POC_MOVWF, popCopyReg(&pc_ssave)); - emitpcode(POC_MOVFW, popCopyReg(&pc_pclath)); - emitpcode(POC_MOVWF, popCopyReg(&pc_psave)); - emitpcode(POC_CLRF, popCopyReg(&pc_pclath));/* during an interrupt PCLATH must be cleared before a goto or call statement */ - - pBlockConvert2ISR(pb); + + /* if this is an interrupt service routine */ + if (IFFUNC_ISISR(sym->type)) { + /* already done in pic14createInterruptVect() - delete me + addpCode2pBlock(pb,newpCode(POC_GOTO,newpCodeOp("END_OF_INTERRUPT+1",PO_STR))); + emitpcodeNULLop(POC_NOP); + emitpcodeNULLop(POC_NOP); + emitpcodeNULLop(POC_NOP); + */ + emitpcode(POC_MOVWF, popCopyReg(&pc_wsave)); + emitpcode(POC_SWAPFW, popCopyReg(&pc_status)); + emitpcode(POC_CLRF, popCopyReg(&pc_status)); + emitpcode(POC_MOVWF, popCopyReg(&pc_ssave)); + emitpcode(POC_MOVFW, popCopyReg(&pc_pclath)); + emitpcode(POC_MOVWF, popCopyReg(&pc_psave)); + emitpcode(POC_CLRF, popCopyReg(&pc_pclath));/* during an interrupt PCLATH must be cleared before a goto or call statement */ + + pBlockConvert2ISR(pb); #if 0 - if (!inExcludeList("acc")) - pic14_emitcode ("push","acc"); - if (!inExcludeList("b")) - pic14_emitcode ("push","b"); - if (!inExcludeList("dpl")) - pic14_emitcode ("push","dpl"); - if (!inExcludeList("dph")) - pic14_emitcode ("push","dph"); - if (options.model == MODEL_FLAT24 && !inExcludeList("dpx")) - { - pic14_emitcode ("push", "dpx"); - /* Make sure we're using standard DPTR */ - pic14_emitcode ("push", "dps"); - pic14_emitcode ("mov", "dps, #0x00"); - if (options.stack10bit) - { - /* This ISR could conceivably use DPTR2. Better save it. */ - pic14_emitcode ("push", "dpl1"); - pic14_emitcode ("push", "dph1"); - pic14_emitcode ("push", "dpx1"); - } - } - /* if this isr has no bank i.e. is going to - run with bank 0 , then we need to save more + if (!inExcludeList("acc")) + pic14_emitcode ("push","acc"); + if (!inExcludeList("b")) + pic14_emitcode ("push","b"); + if (!inExcludeList("dpl")) + pic14_emitcode ("push","dpl"); + if (!inExcludeList("dph")) + pic14_emitcode ("push","dph"); + if (options.model == MODEL_FLAT24 && !inExcludeList("dpx")) + { + pic14_emitcode ("push", "dpx"); + /* Make sure we're using standard DPTR */ + pic14_emitcode ("push", "dps"); + pic14_emitcode ("mov", "dps, #0x00"); + if (options.stack10bit) + { + /* This ISR could conceivably use DPTR2. Better save it. */ + pic14_emitcode ("push", "dpl1"); + pic14_emitcode ("push", "dph1"); + pic14_emitcode ("push", "dpx1"); + } + } + /* if this isr has no bank i.e. is going to + run with bank 0 , then we need to save more registers :-) */ - if (!FUNC_REGBANK(sym->type)) { - - /* if this function does not call any other - function then we can be economical and - save only those registers that are used */ - if (! IFFUNC_HASFCALL(sym->type)) { - int i; - - /* if any registers used */ - if (sym->regsUsed) { - /* save the registers used */ - for ( i = 0 ; i < sym->regsUsed->size ; i++) { - if (bitVectBitValue(sym->regsUsed,i) || - (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - pic14_emitcode("push","junk");//"%s",pic14_regWithIdx(i)->dname); - } - } - - } else { - /* this function has a function call cannot - determines register usage so we will have the - entire bank */ - saverbank(0,ic,FALSE); - } - } + if (!FUNC_REGBANK(sym->type)) { + + /* if this function does not call any other + function then we can be economical and + save only those registers that are used */ + if (! IFFUNC_HASFCALL(sym->type)) { + int i; + + /* if any registers used */ + if (sym->regsUsed) { + /* save the registers used */ + for ( i = 0 ; i < sym->regsUsed->size ; i++) { + if (bitVectBitValue(sym->regsUsed,i) || + (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) + pic14_emitcode("push","junk");//"%s",pic14_regWithIdx(i)->dname); + } + } + + } else { + /* this function has a function call cannot + determines register usage so we will have the + entire bank */ + saverbank(0,ic,FALSE); + } + } #endif - } else { - /* if callee-save to be used for this function - then save the registers being used in this function */ - if (IFFUNC_CALLEESAVES(sym->type)) { - int i; - - /* if any registers used */ - if (sym->regsUsed) { - /* save the registers used */ - for ( i = 0 ; i < sym->regsUsed->size ; i++) { - if (bitVectBitValue(sym->regsUsed,i) || - (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) { - //pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); - _G.nRegsSaved++; - } - } - } - } - } - - /* set the register bank to the desired value */ - if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type)) { - pic14_emitcode("push","psw"); - pic14_emitcode("mov","psw,#0x%02x",(FUNC_REGBANK(sym->type) << 3)&0x00ff); - } - - if (IFFUNC_ISREENT(sym->type) || options.stackAuto) { - - if (options.useXstack) { - pic14_emitcode("mov","r0,%s",spname); - pic14_emitcode("mov","a,_bp"); - pic14_emitcode("movx","@r0,a"); - pic14_emitcode("inc","%s",spname); - } - else - { - /* set up the stack */ - pic14_emitcode ("push","_bp"); /* save the callers stack */ - } - pic14_emitcode ("mov","_bp,%s",spname); - } - - /* adjust the stack for the function */ - if (sym->stack) { - - int i = sym->stack; - if (i > 256 ) - werror(W_STACK_OVERFLOW,sym->name); - - if (i > 3 && sym->recvSize < 4) { - - pic14_emitcode ("mov","a,sp"); - pic14_emitcode ("add","a,#0x%02x",((char)sym->stack & 0xff)); - pic14_emitcode ("mov","sp,a"); - - } - else - while(i--) - pic14_emitcode("inc","sp"); - } - - if (sym->xstack) { - - pic14_emitcode ("mov","a,_spx"); - pic14_emitcode ("add","a,#0x%02x",((char)sym->xstack & 0xff)); - pic14_emitcode ("mov","_spx,a"); - } - + } else { + /* if callee-save to be used for this function + then save the registers being used in this function */ + if (IFFUNC_CALLEESAVES(sym->type)) { + int i; + + /* if any registers used */ + if (sym->regsUsed) { + /* save the registers used */ + for ( i = 0 ; i < sym->regsUsed->size ; i++) { + if (bitVectBitValue(sym->regsUsed,i) || + (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) { + //pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); + _G.nRegsSaved++; + } + } + } + } + } + + /* set the register bank to the desired value */ + if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type)) { + pic14_emitcode("push","psw"); + pic14_emitcode("mov","psw,#0x%02x",(FUNC_REGBANK(sym->type) << 3)&0x00ff); + } + + if (IFFUNC_ISREENT(sym->type) || options.stackAuto) { + + if (options.useXstack) { + pic14_emitcode("mov","r0,%s",spname); + pic14_emitcode("mov","a,_bp"); + pic14_emitcode("movx","@r0,a"); + pic14_emitcode("inc","%s",spname); + } + else + { + /* set up the stack */ + pic14_emitcode ("push","_bp"); /* save the callers stack */ + } + pic14_emitcode ("mov","_bp,%s",spname); + } + + /* adjust the stack for the function */ + if (sym->stack) { + + int i = sym->stack; + if (i > 256 ) + werror(W_STACK_OVERFLOW,sym->name); + + if (i > 3 && sym->recvSize < 4) { + + pic14_emitcode ("mov","a,sp"); + pic14_emitcode ("add","a,#0x%02x",((char)sym->stack & 0xff)); + pic14_emitcode ("mov","sp,a"); + + } + else + while(i--) + pic14_emitcode("inc","sp"); + } + + if (sym->xstack) { + + pic14_emitcode ("mov","a,_spx"); + pic14_emitcode ("add","a,#0x%02x",((char)sym->xstack & 0xff)); + pic14_emitcode ("mov","_spx,a"); + } + } /*-----------------------------------------------------------------*/ @@ -2777,162 +2776,162 @@ registers :-) */ /*-----------------------------------------------------------------*/ static void genEndFunction (iCode *ic) { - symbol *sym = OP_SYMBOL(IC_LEFT(ic)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (IFFUNC_ISREENT(sym->type) || options.stackAuto) - { - pic14_emitcode ("mov","%s,_bp",spname); - } - - /* if use external stack but some variables were - added to the local stack then decrement the - local stack */ - if (options.useXstack && sym->stack) { - pic14_emitcode("mov","a,sp"); - pic14_emitcode("add","a,#0x%02x",((char)-sym->stack) & 0xff); - pic14_emitcode("mov","sp,a"); - } - - - if ((IFFUNC_ISREENT(sym->type) || options.stackAuto)) { - if (options.useXstack) { - pic14_emitcode("mov","r0,%s",spname); - pic14_emitcode("movx","a,@r0"); - pic14_emitcode("mov","_bp,a"); - pic14_emitcode("dec","%s",spname); - } - else - { - pic14_emitcode ("pop","_bp"); - } - } - - /* restore the register bank */ - if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type)) - pic14_emitcode ("pop","psw"); - - if (IFFUNC_ISISR(sym->type)) { - - /* now we need to restore the registers */ - /* if this isr has no bank i.e. is going to - run with bank 0 , then we need to save more + symbol *sym = OP_SYMBOL(IC_LEFT(ic)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (IFFUNC_ISREENT(sym->type) || options.stackAuto) + { + pic14_emitcode ("mov","%s,_bp",spname); + } + + /* if use external stack but some variables were + added to the local stack then decrement the + local stack */ + if (options.useXstack && sym->stack) { + pic14_emitcode("mov","a,sp"); + pic14_emitcode("add","a,#0x%02x",((char)-sym->stack) & 0xff); + pic14_emitcode("mov","sp,a"); + } + + + if ((IFFUNC_ISREENT(sym->type) || options.stackAuto)) { + if (options.useXstack) { + pic14_emitcode("mov","r0,%s",spname); + pic14_emitcode("movx","a,@r0"); + pic14_emitcode("mov","_bp,a"); + pic14_emitcode("dec","%s",spname); + } + else + { + pic14_emitcode ("pop","_bp"); + } + } + + /* restore the register bank */ + if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type)) + pic14_emitcode ("pop","psw"); + + if (IFFUNC_ISISR(sym->type)) { + + /* now we need to restore the registers */ + /* if this isr has no bank i.e. is going to + run with bank 0 , then we need to save more registers :-) */ - if (!FUNC_REGBANK(sym->type)) { - - /* if this function does not call any other - function then we can be economical and - save only those registers that are used */ - if (! IFFUNC_HASFCALL(sym->type)) { - int i; - - /* if any registers used */ - if (sym->regsUsed) { - /* save the registers used */ - for ( i = sym->regsUsed->size ; i >= 0 ; i--) { - if (bitVectBitValue(sym->regsUsed,i) || - (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname); - } - } - - } else { - /* this function has a function call cannot - determines register usage so we will have the - entire bank */ - unsaverbank(0,ic,FALSE); - } - } + if (!FUNC_REGBANK(sym->type)) { + + /* if this function does not call any other + function then we can be economical and + save only those registers that are used */ + if (! IFFUNC_HASFCALL(sym->type)) { + int i; + + /* if any registers used */ + if (sym->regsUsed) { + /* save the registers used */ + for ( i = sym->regsUsed->size ; i >= 0 ; i--) { + if (bitVectBitValue(sym->regsUsed,i) || + (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) + pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname); + } + } + + } else { + /* this function has a function call cannot + determines register usage so we will have the + entire bank */ + unsaverbank(0,ic,FALSE); + } + } #if 0 - if (options.model == MODEL_FLAT24 && !inExcludeList("dpx")) - { - if (options.stack10bit) - { - pic14_emitcode ("pop", "dpx1"); - pic14_emitcode ("pop", "dph1"); - pic14_emitcode ("pop", "dpl1"); - } - pic14_emitcode ("pop", "dps"); - pic14_emitcode ("pop", "dpx"); - } - if (!inExcludeList("dph")) - pic14_emitcode ("pop","dph"); - if (!inExcludeList("dpl")) - pic14_emitcode ("pop","dpl"); - if (!inExcludeList("b")) - pic14_emitcode ("pop","b"); - if (!inExcludeList("acc")) - pic14_emitcode ("pop","acc"); - - if (IFFUNC_ISCRITICAL(sym->type)) - pic14_emitcode("setb","ea"); + if (options.model == MODEL_FLAT24 && !inExcludeList("dpx")) + { + if (options.stack10bit) + { + pic14_emitcode ("pop", "dpx1"); + pic14_emitcode ("pop", "dph1"); + pic14_emitcode ("pop", "dpl1"); + } + pic14_emitcode ("pop", "dps"); + pic14_emitcode ("pop", "dpx"); + } + if (!inExcludeList("dph")) + pic14_emitcode ("pop","dph"); + if (!inExcludeList("dpl")) + pic14_emitcode ("pop","dpl"); + if (!inExcludeList("b")) + pic14_emitcode ("pop","b"); + if (!inExcludeList("acc")) + pic14_emitcode ("pop","acc"); + + if (IFFUNC_ISCRITICAL(sym->type)) + pic14_emitcode("setb","ea"); #endif - - /* if debug then send end of function */ - /* if (options.debug && currFunc) { */ - if (currFunc) { - _G.debugLine = 1; - pic14_emitcode(";","C$%s$%d$%d$%d ==.", - FileBaseName(ic->filename),currFunc->lastLine, - ic->level,ic->block); - if (IS_STATIC(currFunc->etype)) - pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); - else - pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); - _G.debugLine = 0; - } - - pic14_emitcode ("reti",""); - emitpcode(POC_MOVFW, popCopyReg(&pc_psave)); - emitpcode(POC_MOVWF, popCopyReg(&pc_pclath)); - emitpcode(POC_CLRF, popCopyReg(&pc_status)); - emitpcode(POC_SWAPFW, popCopyReg(&pc_ssave)); - emitpcode(POC_MOVWF, popCopyReg(&pc_status)); - emitpcode(POC_SWAPF, popCopyReg(&pc_wsave)); - emitpcode(POC_SWAPFW, popCopyReg(&pc_wsave)); - addpCode2pBlock(pb,newpCodeLabel("END_OF_INTERRUPT",-1)); - emitpcodeNULLop(POC_RETFIE); - } - else { - if (IFFUNC_ISCRITICAL(sym->type)) - pic14_emitcode("setb","ea"); - - if (IFFUNC_CALLEESAVES(sym->type)) { - int i; - - /* if any registers used */ - if (sym->regsUsed) { - /* save the registers used */ - for ( i = sym->regsUsed->size ; i >= 0 ; i--) { - if (bitVectBitValue(sym->regsUsed,i) || - (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname); - } - } - - } - - /* if debug then send end of function */ - if (currFunc) { - _G.debugLine = 1; - pic14_emitcode(";","C$%s$%d$%d$%d ==.", - FileBaseName(ic->filename),currFunc->lastLine, - ic->level,ic->block); - if (IS_STATIC(currFunc->etype)) - pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); - else - pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); - _G.debugLine = 0; - } - - pic14_emitcode ("return",""); - emitpcodeNULLop(POC_RETURN); - - /* Mark the end of a function */ - addpCode2pBlock(pb,newpCodeFunction(NULL,NULL,0)); - } - + + /* if debug then send end of function */ + /* if (options.debug && currFunc) { */ + if (currFunc) { + _G.debugLine = 1; + pic14_emitcode(";","C$%s$%d$%d$%d ==.", + FileBaseName(ic->filename),currFunc->lastLine, + ic->level,ic->block); + if (IS_STATIC(currFunc->etype)) + pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); + else + pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); + _G.debugLine = 0; + } + + pic14_emitcode ("reti",""); + emitpcode(POC_MOVFW, popCopyReg(&pc_psave)); + emitpcode(POC_MOVWF, popCopyReg(&pc_pclath)); + emitpcode(POC_CLRF, popCopyReg(&pc_status)); + emitpcode(POC_SWAPFW, popCopyReg(&pc_ssave)); + emitpcode(POC_MOVWF, popCopyReg(&pc_status)); + emitpcode(POC_SWAPF, popCopyReg(&pc_wsave)); + emitpcode(POC_SWAPFW, popCopyReg(&pc_wsave)); + addpCode2pBlock(pb,newpCodeLabel("END_OF_INTERRUPT",-1)); + emitpcodeNULLop(POC_RETFIE); + } + else { + if (IFFUNC_ISCRITICAL(sym->type)) + pic14_emitcode("setb","ea"); + + if (IFFUNC_CALLEESAVES(sym->type)) { + int i; + + /* if any registers used */ + if (sym->regsUsed) { + /* save the registers used */ + for ( i = sym->regsUsed->size ; i >= 0 ; i--) { + if (bitVectBitValue(sym->regsUsed,i) || + (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) + pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname); + } + } + + } + + /* if debug then send end of function */ + if (currFunc) { + _G.debugLine = 1; + pic14_emitcode(";","C$%s$%d$%d$%d ==.", + FileBaseName(ic->filename),currFunc->lastLine, + ic->level,ic->block); + if (IS_STATIC(currFunc->etype)) + pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); + else + pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); + _G.debugLine = 0; + } + + pic14_emitcode ("return",""); + emitpcodeNULLop(POC_RETURN); + + /* Mark the end of a function */ + addpCode2pBlock(pb,newpCodeFunction(NULL,NULL,0)); + } + } /*-----------------------------------------------------------------*/ @@ -2940,68 +2939,68 @@ registers :-) */ /*-----------------------------------------------------------------*/ static void genRet (iCode *ic) { - int size,offset = 0 , pushed = 0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if we have no return value then - just generate the "ret" */ - if (!IC_LEFT(ic)) - goto jumpret; - - /* we have something to return then - move the return value into place */ - aopOp(IC_LEFT(ic),ic,FALSE); - size = AOP_SIZE(IC_LEFT(ic)); - - while (size--) { - char *l ; - if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR) { - /* #NOCHANGE */ - l = aopGet(AOP(IC_LEFT(ic)),offset++, - FALSE,TRUE); - pic14_emitcode("push","%s",l); - pushed++; - } else { - l = aopGet(AOP(IC_LEFT(ic)),offset, - FALSE,FALSE); - if (strcmp(fReturn[offset],l)) { - if ((((AOP(IC_LEFT(ic))->type) == AOP_PCODE) && - AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE) || - ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) || - ( (AOP(IC_LEFT(ic))->type) == AOP_LIT) ) { - emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset)); - }else { - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); - } - if(size) { - emitpcode(POC_MOVWF,popRegFromIdx(Gstack_base_addr+1-size)); - } - offset++; - } - } - } - - if (pushed) { - while(pushed) { - pushed--; - if (strcmp(fReturn[pushed],"a")) - pic14_emitcode("pop",fReturn[pushed]); - else - pic14_emitcode("pop","acc"); - } - } - freeAsmop (IC_LEFT(ic),NULL,ic,TRUE); - + int size,offset = 0 , pushed = 0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if we have no return value then + just generate the "ret" */ + if (!IC_LEFT(ic)) + goto jumpret; + + /* we have something to return then + move the return value into place */ + aopOp(IC_LEFT(ic),ic,FALSE); + size = AOP_SIZE(IC_LEFT(ic)); + + while (size--) { + char *l ; + if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR) { + /* #NOCHANGE */ + l = aopGet(AOP(IC_LEFT(ic)),offset++, + FALSE,TRUE); + pic14_emitcode("push","%s",l); + pushed++; + } else { + l = aopGet(AOP(IC_LEFT(ic)),offset, + FALSE,FALSE); + if (strcmp(fReturn[offset],l)) { + if ((((AOP(IC_LEFT(ic))->type) == AOP_PCODE) && + AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE) || + ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) || + ( (AOP(IC_LEFT(ic))->type) == AOP_LIT) ) { + emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset)); + }else { + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); + } + if(size) { + emitpcode(POC_MOVWF,popRegFromIdx(Gstack_base_addr+1-size)); + } + offset++; + } + } + } + + if (pushed) { + while(pushed) { + pushed--; + if (strcmp(fReturn[pushed],"a")) + pic14_emitcode("pop",fReturn[pushed]); + else + pic14_emitcode("pop","acc"); + } + } + freeAsmop (IC_LEFT(ic),NULL,ic,TRUE); + jumpret: /* generate a jump to the return label - if the next is not the return statement */ - if (!(ic->next && ic->next->op == LABEL && - IC_LABEL(ic->next) == returnLabel)) { - - emitpcode(POC_GOTO,popGetLabel(returnLabel->key)); - pic14_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset); - } - + if the next is not the return statement */ + if (!(ic->next && ic->next->op == LABEL && + IC_LABEL(ic->next) == returnLabel)) { + + emitpcode(POC_GOTO,popGetLabel(returnLabel->key)); + pic14_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset); + } + } /*-----------------------------------------------------------------*/ @@ -3009,13 +3008,13 @@ jumpret: /*-----------------------------------------------------------------*/ static void genLabel (iCode *ic) { - /* special case never generate */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (IC_LABEL(ic) == entryLabel) - return ; - - emitpLabel(IC_LABEL(ic)->key); - pic14_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset)); + /* special case never generate */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (IC_LABEL(ic) == entryLabel) + return ; + + emitpLabel(IC_LABEL(ic)->key); + pic14_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset)); } /*-----------------------------------------------------------------*/ @@ -3024,8 +3023,8 @@ static void genLabel (iCode *ic) //tsd static void genGoto (iCode *ic) { - emitpcode(POC_GOTO,popGetLabel(IC_LABEL(ic)->key)); - pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset); + emitpcode(POC_GOTO,popGetLabel(IC_LABEL(ic)->key)); + pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset); } @@ -3033,18 +3032,18 @@ static void genGoto (iCode *ic) /* genMultbits :- multiplication of bits */ /*-----------------------------------------------------------------*/ static void genMultbits (operand *left, - operand *right, - operand *result) + operand *right, + operand *result) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(!pic14_sameRegs(AOP(result),AOP(right))) - emitpcode(POC_BSF, popGet(AOP(result),0)); - - emitpcode(POC_BTFSC,popGet(AOP(right),0)); - emitpcode(POC_BTFSS,popGet(AOP(left),0)); - emitpcode(POC_BCF, popGet(AOP(result),0)); - + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(!pic14_sameRegs(AOP(result),AOP(right))) + emitpcode(POC_BSF, popGet(AOP(result),0)); + + emitpcode(POC_BTFSC,popGet(AOP(right),0)); + emitpcode(POC_BTFSS,popGet(AOP(left),0)); + emitpcode(POC_BCF, popGet(AOP(result),0)); + } @@ -3052,106 +3051,106 @@ static void genMultbits (operand *left, /* genMultOneByte : 8 bit multiplication & division */ /*-----------------------------------------------------------------*/ static void genMultOneByte (operand *left, - operand *right, - operand *result) -{ - sym_link *opetype = operandType(result); - - // symbol *lbl ; - int size,offset; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - DEBUGpic14_AopType(__LINE__,left,right,result); - DEBUGpic14_AopTypeSign(__LINE__,left,right,result); - - /* (if two literals, the value is computed before) */ - /* if one literal, literal on the right */ - if (AOP_TYPE(left) == AOP_LIT){ - operand *t = right; - right = left; - left = t; - } - - size = AOP_SIZE(result); - if(size == 1) { - - if (AOP_TYPE(right) == AOP_LIT){ - pic14_emitcode("multiply ","lit val:%s by variable %s and store in %s", - aopGet(AOP(right),0,FALSE,FALSE), - aopGet(AOP(left),0,FALSE,FALSE), - aopGet(AOP(result),0,FALSE,FALSE)); - pic14_emitcode("call","genMultLit"); - } else { - pic14_emitcode("multiply ","variable :%s by variable %s and store in %s", - aopGet(AOP(right),0,FALSE,FALSE), - aopGet(AOP(left),0,FALSE,FALSE), - aopGet(AOP(result),0,FALSE,FALSE)); - pic14_emitcode("call","genMult8X8_8"); - - } - genMult8X8_8 (left, right,result); - - - /* signed or unsigned */ - //pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); - //l = aopGet(AOP(left),0,FALSE,FALSE); - //MOVA(l); - //pic14_emitcode("mul","ab"); - /* if result size = 1, mul signed = mul unsigned */ - //aopPut(AOP(result),"a",0); - - } else { // (size > 1) - - pic14_emitcode("multiply (size>1) ","variable :%s by variable %s and store in %s", - aopGet(AOP(right),0,FALSE,FALSE), - aopGet(AOP(left),0,FALSE,FALSE), - aopGet(AOP(result),0,FALSE,FALSE)); - - if (SPEC_USIGN(opetype)){ - pic14_emitcode("multiply ","unsigned result. size = %d",AOP_SIZE(result)); - genUMult8X8_16 (left, right, result, NULL); - - if (size > 2) { - /* for filling the MSBs */ - emitpcode(POC_CLRF, popGet(AOP(result),2)); - emitpcode(POC_CLRF, popGet(AOP(result),3)); - } - } - else{ - pic14_emitcode("multiply ","signed result. size = %d",AOP_SIZE(result)); - - pic14_emitcode("mov","a,b"); - - /* adjust the MSB if left or right neg */ - - /* if one literal */ - if (AOP_TYPE(right) == AOP_LIT){ - pic14_emitcode("multiply ","right is a lit"); - /* AND literal negative */ - if((int) floatFromVal (AOP(right)->aopu.aop_lit) < 0){ - /* adjust MSB (c==0 after mul) */ - pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); - } - } - else{ - genSMult8X8_16 (left, right, result, NULL); - } - - if(size > 2){ - pic14_emitcode("multiply ","size is greater than 2, so propogate sign"); - /* get the sign */ - pic14_emitcode("rlc","a"); - pic14_emitcode("subb","a,acc"); - } - } - - size -= 2; - offset = 2; - if (size > 0) - while (size--) - pic14_emitcode("multiply ","size is way greater than 2, so propogate sign"); - //aopPut(AOP(result),"a",offset++); - } + operand *right, + operand *result) +{ + sym_link *opetype = operandType(result); + + // symbol *lbl ; + int size,offset; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_AopType(__LINE__,left,right,result); + DEBUGpic14_AopTypeSign(__LINE__,left,right,result); + + /* (if two literals, the value is computed before) */ + /* if one literal, literal on the right */ + if (AOP_TYPE(left) == AOP_LIT){ + operand *t = right; + right = left; + left = t; + } + + size = AOP_SIZE(result); + if(size == 1) { + + if (AOP_TYPE(right) == AOP_LIT){ + pic14_emitcode("multiply ","lit val:%s by variable %s and store in %s", + aopGet(AOP(right),0,FALSE,FALSE), + aopGet(AOP(left),0,FALSE,FALSE), + aopGet(AOP(result),0,FALSE,FALSE)); + pic14_emitcode("call","genMultLit"); + } else { + pic14_emitcode("multiply ","variable :%s by variable %s and store in %s", + aopGet(AOP(right),0,FALSE,FALSE), + aopGet(AOP(left),0,FALSE,FALSE), + aopGet(AOP(result),0,FALSE,FALSE)); + pic14_emitcode("call","genMult8X8_8"); + + } + genMult8X8_8 (left, right,result); + + + /* signed or unsigned */ + //pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + //l = aopGet(AOP(left),0,FALSE,FALSE); + //MOVA(l); + //pic14_emitcode("mul","ab"); + /* if result size = 1, mul signed = mul unsigned */ + //aopPut(AOP(result),"a",0); + + } else { // (size > 1) + + pic14_emitcode("multiply (size>1) ","variable :%s by variable %s and store in %s", + aopGet(AOP(right),0,FALSE,FALSE), + aopGet(AOP(left),0,FALSE,FALSE), + aopGet(AOP(result),0,FALSE,FALSE)); + + if (SPEC_USIGN(opetype)){ + pic14_emitcode("multiply ","unsigned result. size = %d",AOP_SIZE(result)); + genUMult8X8_16 (left, right, result, NULL); + + if (size > 2) { + /* for filling the MSBs */ + emitpcode(POC_CLRF, popGet(AOP(result),2)); + emitpcode(POC_CLRF, popGet(AOP(result),3)); + } + } + else{ + pic14_emitcode("multiply ","signed result. size = %d",AOP_SIZE(result)); + + pic14_emitcode("mov","a,b"); + + /* adjust the MSB if left or right neg */ + + /* if one literal */ + if (AOP_TYPE(right) == AOP_LIT){ + pic14_emitcode("multiply ","right is a lit"); + /* AND literal negative */ + if((int) floatFromVal (AOP(right)->aopu.aop_lit) < 0){ + /* adjust MSB (c==0 after mul) */ + pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); + } + } + else{ + genSMult8X8_16 (left, right, result, NULL); + } + + if(size > 2){ + pic14_emitcode("multiply ","size is greater than 2, so propogate sign"); + /* get the sign */ + pic14_emitcode("rlc","a"); + pic14_emitcode("subb","a,acc"); + } + } + + size -= 2; + offset = 2; + if (size > 0) + while (size--) + pic14_emitcode("multiply ","size is way greater than 2, so propogate sign"); + //aopPut(AOP(result),"a",offset++); + } } /*-----------------------------------------------------------------*/ @@ -3159,148 +3158,148 @@ static void genMultOneByte (operand *left, /*-----------------------------------------------------------------*/ static void genMult (iCode *ic) { - operand *left = IC_LEFT(ic); - operand *right = IC_RIGHT(ic); - operand *result= IC_RESULT(ic); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* assign the amsops */ - aopOp (left,ic,FALSE); - aopOp (right,ic,FALSE); - aopOp (result,ic,TRUE); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - /* special cases first */ - /* both are bits */ - if (AOP_TYPE(left) == AOP_CRY && - AOP_TYPE(right)== AOP_CRY) { - genMultbits(left,right,result); - goto release ; - } - - /* if both are of size == 1 */ - if (AOP_SIZE(left) == 1 && - AOP_SIZE(right) == 1 ) { - genMultOneByte(left,right,result); - goto release ; - } - - pic14_emitcode("multiply ","sizes are greater than 2... need to insert proper algor."); - - /* should have been converted to function call */ - //assert(0) ; - + operand *left = IC_LEFT(ic); + operand *right = IC_RIGHT(ic); + operand *result= IC_RESULT(ic); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* assign the amsops */ + aopOp (left,ic,FALSE); + aopOp (right,ic,FALSE); + aopOp (result,ic,TRUE); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + /* special cases first */ + /* both are bits */ + if (AOP_TYPE(left) == AOP_CRY && + AOP_TYPE(right)== AOP_CRY) { + genMultbits(left,right,result); + goto release ; + } + + /* if both are of size == 1 */ + if (AOP_SIZE(left) == 1 && + AOP_SIZE(right) == 1 ) { + genMultOneByte(left,right,result); + goto release ; + } + + pic14_emitcode("multiply ","sizes are greater than 2... need to insert proper algor."); + + /* should have been converted to function call */ + //assert(0) ; + release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genDivbits :- division of bits */ /*-----------------------------------------------------------------*/ static void genDivbits (operand *left, - operand *right, - operand *result) + operand *right, + operand *result) { - - char *l; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* the result must be bit */ - pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - l = aopGet(AOP(left),0,FALSE,FALSE); - - MOVA(l); - - pic14_emitcode("div","ab"); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"c",0); + + char *l; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* the result must be bit */ + pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + l = aopGet(AOP(left),0,FALSE,FALSE); + + MOVA(l); + + pic14_emitcode("div","ab"); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"c",0); } /*-----------------------------------------------------------------*/ /* genDivOneByte : 8 bit division */ /*-----------------------------------------------------------------*/ static void genDivOneByte (operand *left, - operand *right, - operand *result) -{ - sym_link *opetype = operandType(result); - char *l ; - symbol *lbl ; - int size,offset; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - size = AOP_SIZE(result) - 1; - offset = 1; - /* signed or unsigned */ - if (SPEC_USIGN(opetype)) { - /* unsigned is easy */ - pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - pic14_emitcode("div","ab"); - aopPut(AOP(result),"a",0); - while (size--) - aopPut(AOP(result),zero,offset++); - return ; - } - - /* signed is a little bit more difficult */ - - /* save the signs of the operands */ - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - pic14_emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,TRUE)); - pic14_emitcode("push","acc"); /* save it on the stack */ - - /* now sign adjust for both left & right */ - l = aopGet(AOP(right),0,FALSE,FALSE); - MOVA(l); - lbl = newiTempLabel(NULL); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - pic14_emitcode("cpl","a"); - pic14_emitcode("inc","a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - pic14_emitcode("mov","b,a"); - - /* sign adjust left side */ - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - - lbl = newiTempLabel(NULL); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - pic14_emitcode("cpl","a"); - pic14_emitcode("inc","a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - - /* now the division */ - pic14_emitcode("div","ab"); - /* we are interested in the lower order - only */ - pic14_emitcode("mov","b,a"); - lbl = newiTempLabel(NULL); - pic14_emitcode("pop","acc"); - /* if there was an over flow we don't - adjust the sign of the result */ - pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - CLRC; - pic14_emitcode("clr","a"); - pic14_emitcode("subb","a,b"); - pic14_emitcode("mov","b,a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - - /* now we are done */ - aopPut(AOP(result),"b",0); - if(size > 0){ - pic14_emitcode("mov","c,b.7"); - pic14_emitcode("subb","a,acc"); - } - while (size--) - aopPut(AOP(result),"a",offset++); - + operand *right, + operand *result) +{ + sym_link *opetype = operandType(result); + char *l ; + symbol *lbl ; + int size,offset; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + size = AOP_SIZE(result) - 1; + offset = 1; + /* signed or unsigned */ + if (SPEC_USIGN(opetype)) { + /* unsigned is easy */ + pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + pic14_emitcode("div","ab"); + aopPut(AOP(result),"a",0); + while (size--) + aopPut(AOP(result),zero,offset++); + return ; + } + + /* signed is a little bit more difficult */ + + /* save the signs of the operands */ + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + pic14_emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,TRUE)); + pic14_emitcode("push","acc"); /* save it on the stack */ + + /* now sign adjust for both left & right */ + l = aopGet(AOP(right),0,FALSE,FALSE); + MOVA(l); + lbl = newiTempLabel(NULL); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("cpl","a"); + pic14_emitcode("inc","a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("mov","b,a"); + + /* sign adjust left side */ + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + + lbl = newiTempLabel(NULL); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("cpl","a"); + pic14_emitcode("inc","a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + + /* now the division */ + pic14_emitcode("div","ab"); + /* we are interested in the lower order + only */ + pic14_emitcode("mov","b,a"); + lbl = newiTempLabel(NULL); + pic14_emitcode("pop","acc"); + /* if there was an over flow we don't + adjust the sign of the result */ + pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + CLRC; + pic14_emitcode("clr","a"); + pic14_emitcode("subb","a,b"); + pic14_emitcode("mov","b,a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + + /* now we are done */ + aopPut(AOP(result),"b",0); + if(size > 0){ + pic14_emitcode("mov","c,b.7"); + pic14_emitcode("subb","a,acc"); + } + while (size--) + aopPut(AOP(result),"a",offset++); + } /*-----------------------------------------------------------------*/ @@ -3308,133 +3307,133 @@ static void genDivOneByte (operand *left, /*-----------------------------------------------------------------*/ static void genDiv (iCode *ic) { - operand *left = IC_LEFT(ic); - operand *right = IC_RIGHT(ic); - operand *result= IC_RESULT(ic); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* assign the amsops */ - aopOp (left,ic,FALSE); - aopOp (right,ic,FALSE); - aopOp (result,ic,TRUE); - - /* special cases first */ - /* both are bits */ - if (AOP_TYPE(left) == AOP_CRY && - AOP_TYPE(right)== AOP_CRY) { - genDivbits(left,right,result); - goto release ; - } - - /* if both are of size == 1 */ - if (AOP_SIZE(left) == 1 && - AOP_SIZE(right) == 1 ) { - genDivOneByte(left,right,result); - goto release ; - } - - /* should have been converted to function call */ - assert(0); + operand *left = IC_LEFT(ic); + operand *right = IC_RIGHT(ic); + operand *result= IC_RESULT(ic); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* assign the amsops */ + aopOp (left,ic,FALSE); + aopOp (right,ic,FALSE); + aopOp (result,ic,TRUE); + + /* special cases first */ + /* both are bits */ + if (AOP_TYPE(left) == AOP_CRY && + AOP_TYPE(right)== AOP_CRY) { + genDivbits(left,right,result); + goto release ; + } + + /* if both are of size == 1 */ + if (AOP_SIZE(left) == 1 && + AOP_SIZE(right) == 1 ) { + genDivOneByte(left,right,result); + goto release ; + } + + /* should have been converted to function call */ + assert(0); release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genModbits :- modulus of bits */ /*-----------------------------------------------------------------*/ static void genModbits (operand *left, - operand *right, - operand *result) + operand *right, + operand *result) { - - char *l; - - /* the result must be bit */ - pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - l = aopGet(AOP(left),0,FALSE,FALSE); - - MOVA(l); - - pic14_emitcode("div","ab"); - pic14_emitcode("mov","a,b"); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"c",0); + + char *l; + + /* the result must be bit */ + pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + l = aopGet(AOP(left),0,FALSE,FALSE); + + MOVA(l); + + pic14_emitcode("div","ab"); + pic14_emitcode("mov","a,b"); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"c",0); } /*-----------------------------------------------------------------*/ /* genModOneByte : 8 bit modulus */ /*-----------------------------------------------------------------*/ static void genModOneByte (operand *left, - operand *right, - operand *result) -{ - sym_link *opetype = operandType(result); - char *l ; - symbol *lbl ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* signed or unsigned */ - if (SPEC_USIGN(opetype)) { - /* unsigned is easy */ - pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - pic14_emitcode("div","ab"); - aopPut(AOP(result),"b",0); - return ; - } - - /* signed is a little bit more difficult */ - - /* save the signs of the operands */ - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - - pic14_emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); - pic14_emitcode("push","acc"); /* save it on the stack */ - - /* now sign adjust for both left & right */ - l = aopGet(AOP(right),0,FALSE,FALSE); - MOVA(l); - - lbl = newiTempLabel(NULL); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - pic14_emitcode("cpl","a"); - pic14_emitcode("inc","a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - pic14_emitcode("mov","b,a"); - - /* sign adjust left side */ - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - - lbl = newiTempLabel(NULL); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - pic14_emitcode("cpl","a"); - pic14_emitcode("inc","a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - - /* now the multiplication */ - pic14_emitcode("div","ab"); - /* we are interested in the lower order - only */ - lbl = newiTempLabel(NULL); - pic14_emitcode("pop","acc"); - /* if there was an over flow we don't - adjust the sign of the result */ - pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); - pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - CLRC ; - pic14_emitcode("clr","a"); - pic14_emitcode("subb","a,b"); - pic14_emitcode("mov","b,a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - - /* now we are done */ - aopPut(AOP(result),"b",0); - + operand *right, + operand *result) +{ + sym_link *opetype = operandType(result); + char *l ; + symbol *lbl ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* signed or unsigned */ + if (SPEC_USIGN(opetype)) { + /* unsigned is easy */ + pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + pic14_emitcode("div","ab"); + aopPut(AOP(result),"b",0); + return ; + } + + /* signed is a little bit more difficult */ + + /* save the signs of the operands */ + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + + pic14_emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("push","acc"); /* save it on the stack */ + + /* now sign adjust for both left & right */ + l = aopGet(AOP(right),0,FALSE,FALSE); + MOVA(l); + + lbl = newiTempLabel(NULL); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("cpl","a"); + pic14_emitcode("inc","a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("mov","b,a"); + + /* sign adjust left side */ + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + + lbl = newiTempLabel(NULL); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("cpl","a"); + pic14_emitcode("inc","a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + + /* now the multiplication */ + pic14_emitcode("div","ab"); + /* we are interested in the lower order + only */ + lbl = newiTempLabel(NULL); + pic14_emitcode("pop","acc"); + /* if there was an over flow we don't + adjust the sign of the result */ + pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + CLRC ; + pic14_emitcode("clr","a"); + pic14_emitcode("subb","a,b"); + pic14_emitcode("mov","b,a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + + /* now we are done */ + aopPut(AOP(result),"b",0); + } /*-----------------------------------------------------------------*/ @@ -3442,38 +3441,38 @@ static void genModOneByte (operand *left, /*-----------------------------------------------------------------*/ static void genMod (iCode *ic) { - operand *left = IC_LEFT(ic); - operand *right = IC_RIGHT(ic); - operand *result= IC_RESULT(ic); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* assign the amsops */ - aopOp (left,ic,FALSE); - aopOp (right,ic,FALSE); - aopOp (result,ic,TRUE); - - /* special cases first */ - /* both are bits */ - if (AOP_TYPE(left) == AOP_CRY && - AOP_TYPE(right)== AOP_CRY) { - genModbits(left,right,result); - goto release ; - } - - /* if both are of size == 1 */ - if (AOP_SIZE(left) == 1 && - AOP_SIZE(right) == 1 ) { - genModOneByte(left,right,result); - goto release ; - } - - /* should have been converted to function call */ - assert(0); - + operand *left = IC_LEFT(ic); + operand *right = IC_RIGHT(ic); + operand *result= IC_RESULT(ic); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* assign the amsops */ + aopOp (left,ic,FALSE); + aopOp (right,ic,FALSE); + aopOp (result,ic,TRUE); + + /* special cases first */ + /* both are bits */ + if (AOP_TYPE(left) == AOP_CRY && + AOP_TYPE(right)== AOP_CRY) { + genModbits(left,right,result); + goto release ; + } + + /* if both are of size == 1 */ + if (AOP_SIZE(left) == 1 && + AOP_SIZE(right) == 1 ) { + genModOneByte(left,right,result); + goto release ; + } + + /* should have been converted to function call */ + assert(0); + release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -3484,44 +3483,44 @@ note: May need to add parameter to indicate when a variable is in bit space. */ static void genIfxJump (iCode *ic, char *jval) { - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if true label then we jump if condition - supplied is true */ - if ( IC_TRUE(ic) ) { - - if(strcmp(jval,"a") == 0) - emitSKPZ; - else if (strcmp(jval,"c") == 0) - emitSKPC; - else { - DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); - emitpcode(POC_BTFSC, newpCodeOpBit(jval,-1,1)); - } - - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ic)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + labelOffset); - - } - else { - /* false label is present */ - if(strcmp(jval,"a") == 0) - emitSKPNZ; - else if (strcmp(jval,"c") == 0) - emitSKPNC; - else { - DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); - emitpcode(POC_BTFSS, newpCodeOpBit(jval,-1,1)); - } - - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ic)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + labelOffset); - - } - - - /* mark the icode as generated */ - ic->generated = 1; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if true label then we jump if condition + supplied is true */ + if ( IC_TRUE(ic) ) { + + if(strcmp(jval,"a") == 0) + emitSKPZ; + else if (strcmp(jval,"c") == 0) + emitSKPC; + else { + DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); + emitpcode(POC_BTFSC, newpCodeOpBit(jval,-1,1)); + } + + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ic)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + labelOffset); + + } + else { + /* false label is present */ + if(strcmp(jval,"a") == 0) + emitSKPNZ; + else if (strcmp(jval,"c") == 0) + emitSKPNC; + else { + DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); + emitpcode(POC_BTFSS, newpCodeOpBit(jval,-1,1)); + } + + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ic)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + labelOffset); + + } + + + /* mark the icode as generated */ + ic->generated = 1; } /*-----------------------------------------------------------------*/ @@ -3529,49 +3528,49 @@ static void genIfxJump (iCode *ic, char *jval) /*-----------------------------------------------------------------*/ static void genSkip(iCode *ifx,int status_bit) { - if(!ifx) - return; - - if ( IC_TRUE(ifx) ) { - switch(status_bit) { - case 'z': - emitSKPNZ; - break; - - case 'c': - emitSKPNC; - break; - - case 'd': - emitSKPDC; - break; - - } - - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); - - } else { - - switch(status_bit) { - - case 'z': - emitSKPZ; - break; - - case 'c': - emitSKPC; - break; - - case 'd': - emitSKPDC; - break; - } - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); - - } - + if(!ifx) + return; + + if ( IC_TRUE(ifx) ) { + switch(status_bit) { + case 'z': + emitSKPNZ; + break; + + case 'c': + emitSKPNC; + break; + + case 'd': + emitSKPDC; + break; + + } + + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + + } else { + + switch(status_bit) { + + case 'z': + emitSKPZ; + break; + + case 'c': + emitSKPC; + break; + + case 'd': + emitSKPDC; + break; + } + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + + } + } /*-----------------------------------------------------------------*/ @@ -3579,16 +3578,16 @@ static void genSkip(iCode *ifx,int status_bit) /*-----------------------------------------------------------------*/ static void genSkipc(resolvedIfx *rifx) { - if(!rifx) - return; - - if(rifx->condition) - emitSKPC; - else - emitSKPNC; - - emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); - rifx->generated = 1; + if(!rifx) + return; + + if(rifx->condition) + emitSKPC; + else + emitSKPNC; + + emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); + rifx->generated = 1; } /*-----------------------------------------------------------------*/ @@ -3596,16 +3595,16 @@ static void genSkipc(resolvedIfx *rifx) /*-----------------------------------------------------------------*/ static void genSkipz2(resolvedIfx *rifx, int invert_condition) { - if(!rifx) - return; - - if( (rifx->condition ^ invert_condition) & 1) - emitSKPZ; - else - emitSKPNZ; - - emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); - rifx->generated = 1; + if(!rifx) + return; + + if( (rifx->condition ^ invert_condition) & 1) + emitSKPZ; + else + emitSKPNZ; + + emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); + rifx->generated = 1; } /*-----------------------------------------------------------------*/ @@ -3613,41 +3612,41 @@ static void genSkipz2(resolvedIfx *rifx, int invert_condition) /*-----------------------------------------------------------------*/ static void genSkipz(iCode *ifx, int condition) { - if(!ifx) - return; - - if(condition) - emitSKPNZ; - else - emitSKPZ; - - if ( IC_TRUE(ifx) ) - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - else - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - - if ( IC_TRUE(ifx) ) - pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); - else - pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); - + if(!ifx) + return; + + if(condition) + emitSKPNZ; + else + emitSKPZ; + + if ( IC_TRUE(ifx) ) + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + else + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + + if ( IC_TRUE(ifx) ) + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + else + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + } /*-----------------------------------------------------------------*/ /* genSkipCond */ /*-----------------------------------------------------------------*/ static void genSkipCond(resolvedIfx *rifx,operand *op, int offset, int bit) { - if(!rifx) - return; - - if(rifx->condition) - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); - else - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); - - - emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); - rifx->generated = 1; + if(!rifx) + return; + + if(rifx->condition) + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); + else + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); + + + emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key)); + rifx->generated = 1; } #if 0 @@ -3659,23 +3658,23 @@ static void genSkipCond(resolvedIfx *rifx,operand *op, int offset, int bit) /*-----------------------------------------------------------------*/ static int genChkZeroes(operand *op, int lit, int size) { - - int i; - int flag =1; - - while(size--) { - i = (lit >> (size*8)) & 0xff; - - if(i==0) { - if(flag) - emitpcode(POC_MOVFW, popGet(AOP(op),size)); - else - emitpcode(POC_IORFW, popGet(AOP(op),size)); - flag = 0; - } - } - - return (flag==0); + + int i; + int flag =1; + + while(size--) { + i = (lit >> (size*8)) & 0xff; + + if(i==0) { + if(flag) + emitpcode(POC_MOVFW, popGet(AOP(op),size)); + else + emitpcode(POC_IORFW, popGet(AOP(op),size)); + flag = 0; + } + } + + return (flag==0); } #endif @@ -3683,660 +3682,660 @@ static int genChkZeroes(operand *op, int lit, int size) /* genCmp :- greater or less than comparison */ /*-----------------------------------------------------------------*/ static void genCmp (operand *left,operand *right, - operand *result, iCode *ifx, int sign) -{ - int size; //, offset = 0 ; - unsigned long lit = 0L,i = 0; - resolvedIfx rFalseIfx; - // resolvedIfx rTrueIfx; - symbol *truelbl; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* - if(ifx) { - DEBUGpic14_emitcode ("; ***","true ifx is %s",((IC_TRUE(ifx) == NULL) ? "false" : "true")); - DEBUGpic14_emitcode ("; ***","false ifx is %s",((IC_FALSE(ifx) == NULL) ? "false" : "true")); - } - */ - - resolveIfx(&rFalseIfx,ifx); - truelbl = newiTempLabel(NULL); - size = max(AOP_SIZE(left),AOP_SIZE(right)); - - DEBUGpic14_AopType(__LINE__,left,right,result); - + operand *result, iCode *ifx, int sign) +{ + int size; //, offset = 0 ; + unsigned long lit = 0L,i = 0; + resolvedIfx rFalseIfx; + // resolvedIfx rTrueIfx; + symbol *truelbl; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* + if(ifx) { + DEBUGpic14_emitcode ("; ***","true ifx is %s",((IC_TRUE(ifx) == NULL) ? "false" : "true")); + DEBUGpic14_emitcode ("; ***","false ifx is %s",((IC_FALSE(ifx) == NULL) ? "false" : "true")); + } + */ + + resolveIfx(&rFalseIfx,ifx); + truelbl = newiTempLabel(NULL); + size = max(AOP_SIZE(left),AOP_SIZE(right)); + + DEBUGpic14_AopType(__LINE__,left,right,result); + #define _swapp - - /* if literal is on the right then swap with left */ - if ((AOP_TYPE(right) == AOP_LIT)) { - operand *tmp = right ; - unsigned long mask = (0x100 << (8*(size-1))) - 1; - lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + + /* if literal is on the right then swap with left */ + if ((AOP_TYPE(right) == AOP_LIT)) { + operand *tmp = right ; + unsigned long mask = (0x100 << (8*(size-1))) - 1; + lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); #ifdef _swapp - - lit = (lit - 1) & mask; - right = left; - left = tmp; - rFalseIfx.condition ^= 1; + + lit = (lit - 1) & mask; + right = left; + left = tmp; + rFalseIfx.condition ^= 1; #endif - - } else if ((AOP_TYPE(left) == AOP_LIT)) { - lit = (unsigned long)floatFromVal(AOP(left)->aopu.aop_lit); - } - - - //if(IC_TRUE(ifx) == NULL) - /* if left & right are bit variables */ - if (AOP_TYPE(left) == AOP_CRY && - AOP_TYPE(right) == AOP_CRY ) { - pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); - pic14_emitcode("anl","c,/%s",AOP(left)->aopu.aop_dir); - } else { - /* subtract right from left if at the - end the carry flag is set then we know that - left is greater than right */ - - // { - - symbol *lbl = newiTempLabel(NULL); - + + } else if ((AOP_TYPE(left) == AOP_LIT)) { + lit = (unsigned long)floatFromVal(AOP(left)->aopu.aop_lit); + } + + + //if(IC_TRUE(ifx) == NULL) + /* if left & right are bit variables */ + if (AOP_TYPE(left) == AOP_CRY && + AOP_TYPE(right) == AOP_CRY ) { + pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); + pic14_emitcode("anl","c,/%s",AOP(left)->aopu.aop_dir); + } else { + /* subtract right from left if at the + end the carry flag is set then we know that + left is greater than right */ + + // { + + symbol *lbl = newiTempLabel(NULL); + #ifndef _swapp - if(AOP_TYPE(right) == AOP_LIT) { - - //lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - - DEBUGpic14_emitcode(";right lit","lit = 0x%x,sign=%d",lit,sign); - - /* special cases */ - - if(lit == 0) { - - if(sign != 0) - genSkipCond(&rFalseIfx,left,size-1,7); - else - /* no need to compare to 0...*/ - /* NOTE: this is a de-generate compare that most certainly - * creates some dead code. */ - emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key)); - - if(ifx) ifx->generated = 1; - return; - - } - size--; - - if(size == 0) { - //i = (lit >> (size*8)) & 0xff; - DEBUGpic14_emitcode(";right lit","line = %d",__LINE__); - - emitpcode(POC_MOVFW, popGet(AOP(left),size)); - - i = ((0-lit) & 0xff); - if(sign) { - if( i == 0x81) { - /* lit is 0x7f, all signed chars are less than - * this except for 0x7f itself */ - emitpcode(POC_XORLW, popGetLit(0x7f)); - genSkipz2(&rFalseIfx,0); - } else { - emitpcode(POC_ADDLW, popGetLit(0x80)); - emitpcode(POC_ADDLW, popGetLit(i^0x80)); - genSkipc(&rFalseIfx); - } - - } else { - if(lit == 1) { - genSkipz2(&rFalseIfx,1); - } else { - emitpcode(POC_ADDLW, popGetLit(i)); - genSkipc(&rFalseIfx); - } - } - - if(ifx) ifx->generated = 1; - return; - } - - /* chars are out of the way. now do ints and longs */ - - - DEBUGpic14_emitcode(";right lit","line = %d",__LINE__); - - /* special cases */ - - if(sign) { - - if(lit == 0) { - genSkipCond(&rFalseIfx,left,size,7); - if(ifx) ifx->generated = 1; - return; - } - - if(lit <0x100) { - DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - - //rFalseIfx.condition ^= 1; - //genSkipCond(&rFalseIfx,left,size,7); - //rFalseIfx.condition ^= 1; - - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - emitpcode(POC_MOVLW, popGetLit(0x100-lit)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); - emitpcode(POC_MOVFW, popGet(AOP(left),1)); - - while(size > 1) - emitpcode(POC_IORFW, popGet(AOP(left),size--)); - - if(rFalseIfx.condition) { - emitSKPZ; - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - } else { - emitSKPNZ; - } - - genSkipc(&rFalseIfx); - emitpLabel(truelbl->key); - if(ifx) ifx->generated = 1; - return; - - } - - if(size == 1) { - - if( (lit & 0xff) == 0) { - /* lower byte is zero */ - DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - i = ((lit >> 8) & 0xff) ^0x80; - emitpcode(POC_MOVFW, popGet(AOP(left),size)); - emitpcode(POC_ADDLW, popGetLit( 0x80)); - emitpcode(POC_ADDLW, popGetLit(0x100-i)); - genSkipc(&rFalseIfx); - - - if(ifx) ifx->generated = 1; - return; - - } - } else { - /* Special cases for signed longs */ - if( (lit & 0xffffff) == 0) { - /* lower byte is zero */ - DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - i = ((lit >> 8*3) & 0xff) ^0x80; - emitpcode(POC_MOVFW, popGet(AOP(left),size)); - emitpcode(POC_ADDLW, popGetLit( 0x80)); - emitpcode(POC_ADDLW, popGetLit(0x100-i)); - genSkipc(&rFalseIfx); - - - if(ifx) ifx->generated = 1; - return; - - } - - } - - - if(lit & (0x80 << (size*8))) { - /* lit is negative */ - DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - - //genSkipCond(&rFalseIfx,left,size,7); - - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); - - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - - - } else { - /* lit is positive */ - DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - } - - /* There are no more special cases, so perform a general compare */ - - emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff)); - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - - while(size--) { - - emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff)); - emitSKPNZ; - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - } - //rFalseIfx.condition ^= 1; - genSkipc(&rFalseIfx); - - emitpLabel(truelbl->key); - - if(ifx) ifx->generated = 1; - return; - - - } - - - /* sign is out of the way. So now do an unsigned compare */ - DEBUGpic14_emitcode(";right lit","line = %d unsigned compare to 0x%x",__LINE__,lit); - - - /* General case - compare to an unsigned literal on the right.*/ - - i = (lit >> (size*8)) & 0xff; - emitpcode(POC_MOVLW, popGetLit(i)); - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - while(size--) { - i = (lit >> (size*8)) & 0xff; - - if(i) { - emitpcode(POC_MOVLW, popGetLit(i)); - emitSKPNZ; - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - } else { - /* this byte of the lit is zero, - *if it's not the last then OR in the variable */ - if(size) - emitpcode(POC_IORFW, popGet(AOP(left),size)); - } - } - - - emitpLabel(lbl->key); - //if(emitFinalCheck) - genSkipc(&rFalseIfx); - if(sign) - emitpLabel(truelbl->key); - - if(ifx) ifx->generated = 1; - return; - - - } + if(AOP_TYPE(right) == AOP_LIT) { + + //lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + + DEBUGpic14_emitcode(";right lit","lit = 0x%x,sign=%d",lit,sign); + + /* special cases */ + + if(lit == 0) { + + if(sign != 0) + genSkipCond(&rFalseIfx,left,size-1,7); + else + /* no need to compare to 0...*/ + /* NOTE: this is a de-generate compare that most certainly + * creates some dead code. */ + emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key)); + + if(ifx) ifx->generated = 1; + return; + + } + size--; + + if(size == 0) { + //i = (lit >> (size*8)) & 0xff; + DEBUGpic14_emitcode(";right lit","line = %d",__LINE__); + + emitpcode(POC_MOVFW, popGet(AOP(left),size)); + + i = ((0-lit) & 0xff); + if(sign) { + if( i == 0x81) { + /* lit is 0x7f, all signed chars are less than + * this except for 0x7f itself */ + emitpcode(POC_XORLW, popGetLit(0x7f)); + genSkipz2(&rFalseIfx,0); + } else { + emitpcode(POC_ADDLW, popGetLit(0x80)); + emitpcode(POC_ADDLW, popGetLit(i^0x80)); + genSkipc(&rFalseIfx); + } + + } else { + if(lit == 1) { + genSkipz2(&rFalseIfx,1); + } else { + emitpcode(POC_ADDLW, popGetLit(i)); + genSkipc(&rFalseIfx); + } + } + + if(ifx) ifx->generated = 1; + return; + } + + /* chars are out of the way. now do ints and longs */ + + + DEBUGpic14_emitcode(";right lit","line = %d",__LINE__); + + /* special cases */ + + if(sign) { + + if(lit == 0) { + genSkipCond(&rFalseIfx,left,size,7); + if(ifx) ifx->generated = 1; + return; + } + + if(lit <0x100) { + DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); + + //rFalseIfx.condition ^= 1; + //genSkipCond(&rFalseIfx,left,size,7); + //rFalseIfx.condition ^= 1; + + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + emitpcode(POC_MOVLW, popGetLit(0x100-lit)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); + emitpcode(POC_MOVFW, popGet(AOP(left),1)); + + while(size > 1) + emitpcode(POC_IORFW, popGet(AOP(left),size--)); + + if(rFalseIfx.condition) { + emitSKPZ; + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + } else { + emitSKPNZ; + } + + genSkipc(&rFalseIfx); + emitpLabel(truelbl->key); + if(ifx) ifx->generated = 1; + return; + + } + + if(size == 1) { + + if( (lit & 0xff) == 0) { + /* lower byte is zero */ + DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); + i = ((lit >> 8) & 0xff) ^0x80; + emitpcode(POC_MOVFW, popGet(AOP(left),size)); + emitpcode(POC_ADDLW, popGetLit( 0x80)); + emitpcode(POC_ADDLW, popGetLit(0x100-i)); + genSkipc(&rFalseIfx); + + + if(ifx) ifx->generated = 1; + return; + + } + } else { + /* Special cases for signed longs */ + if( (lit & 0xffffff) == 0) { + /* lower byte is zero */ + DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); + i = ((lit >> 8*3) & 0xff) ^0x80; + emitpcode(POC_MOVFW, popGet(AOP(left),size)); + emitpcode(POC_ADDLW, popGetLit( 0x80)); + emitpcode(POC_ADDLW, popGetLit(0x100-i)); + genSkipc(&rFalseIfx); + + + if(ifx) ifx->generated = 1; + return; + + } + + } + + + if(lit & (0x80 << (size*8))) { + /* lit is negative */ + DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); + + //genSkipCond(&rFalseIfx,left,size,7); + + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); + + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + + + } else { + /* lit is positive */ + DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0)); + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + } + + /* There are no more special cases, so perform a general compare */ + + emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff)); + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + + while(size--) { + + emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff)); + emitSKPNZ; + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + } + //rFalseIfx.condition ^= 1; + genSkipc(&rFalseIfx); + + emitpLabel(truelbl->key); + + if(ifx) ifx->generated = 1; + return; + + + } + + + /* sign is out of the way. So now do an unsigned compare */ + DEBUGpic14_emitcode(";right lit","line = %d unsigned compare to 0x%x",__LINE__,lit); + + + /* General case - compare to an unsigned literal on the right.*/ + + i = (lit >> (size*8)) & 0xff; + emitpcode(POC_MOVLW, popGetLit(i)); + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + while(size--) { + i = (lit >> (size*8)) & 0xff; + + if(i) { + emitpcode(POC_MOVLW, popGetLit(i)); + emitSKPNZ; + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + } else { + /* this byte of the lit is zero, + *if it's not the last then OR in the variable */ + if(size) + emitpcode(POC_IORFW, popGet(AOP(left),size)); + } + } + + + emitpLabel(lbl->key); + //if(emitFinalCheck) + genSkipc(&rFalseIfx); + if(sign) + emitpLabel(truelbl->key); + + if(ifx) ifx->generated = 1; + return; + + + } #endif // _swapp - - if(AOP_TYPE(left) == AOP_LIT) { - //symbol *lbl = newiTempLabel(NULL); - - //EXPERIMENTAL lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit)); - - - DEBUGpic14_emitcode(";left lit","lit = 0x%x,sign=%d",lit,sign); - - /* Special cases */ - if((lit == 0) && (sign == 0)){ - - size--; - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - while(size) - emitpcode(POC_IORFW, popGet(AOP(right),--size)); - - genSkipz2(&rFalseIfx,0); - if(ifx) ifx->generated = 1; - return; - } - - if(size==1) { - /* Special cases */ - lit &= 0xff; - if(((lit == 0xff) && !sign) || ((lit==0x7f) && sign)) { - /* degenerate compare can never be true */ - if(rFalseIfx.condition == 0) - emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key)); - - if(ifx) ifx->generated = 1; - return; - } - - if(sign) { - /* signed comparisons to a literal byte */ - - int lp1 = (lit+1) & 0xff; - - DEBUGpic14_emitcode(";left lit","line = %d lit = 0x%x",__LINE__,lit); - switch (lp1) { - case 0: - rFalseIfx.condition ^= 1; - genSkipCond(&rFalseIfx,right,0,7); - break; - case 0x7f: - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - emitpcode(POC_XORLW, popGetLit(0x7f)); - genSkipz2(&rFalseIfx,1); - break; - default: - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - emitpcode(POC_ADDLW, popGetLit(0x80)); - emitpcode(POC_ADDLW, popGetLit(((-(lit+1)) & 0xff) ^ 0x80)); - rFalseIfx.condition ^= 1; - genSkipc(&rFalseIfx); - break; - } - if(ifx) ifx->generated = 1; - } else { - /* unsigned comparisons to a literal byte */ - - switch(lit & 0xff ) { - case 0: - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - genSkipz2(&rFalseIfx,0); - if(ifx) ifx->generated = 1; - break; - case 0x7f: - genSkipCond(&rFalseIfx,right,0,7); - if(ifx) ifx->generated = 1; - break; - - default: - emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); - emitpcode(POC_SUBFW, popGet(AOP(right),0)); - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - rFalseIfx.condition ^= 1; - if (AOP_TYPE(result) == AOP_CRY) { - genSkipc(&rFalseIfx); - if(ifx) ifx->generated = 1; - } else { - DEBUGpic14_emitcode ("; ***","%s %d RFIfx.cond=%d",__FUNCTION__,__LINE__, rFalseIfx.condition); - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_RLF, popGet(AOP(result),0)); - emitpcode(POC_MOVLW, popGetLit(0x01)); - emitpcode(POC_XORWF, popGet(AOP(result),0)); - } - break; - } - } - - //goto check_carry; - return; - - } else { - - /* Size is greater than 1 */ - - if(sign) { - int lp1 = lit+1; - - size--; - - if(lp1 == 0) { - /* this means lit = 0xffffffff, or -1 */ - - - DEBUGpic14_emitcode(";left lit = -1","line = %d ",__LINE__); - rFalseIfx.condition ^= 1; - genSkipCond(&rFalseIfx,right,size,7); - if(ifx) ifx->generated = 1; - return; - } - - if(lit == 0) { - int s = size; - - if(rFalseIfx.condition) { - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - } - - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - while(size--) - emitpcode(POC_IORFW, popGet(AOP(right),size)); - - - emitSKPZ; - if(rFalseIfx.condition) { - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - emitpLabel(truelbl->key); - }else { - rFalseIfx.condition ^= 1; - genSkipCond(&rFalseIfx,right,s,7); - } - - if(ifx) ifx->generated = 1; - return; - } - - if((size == 1) && (0 == (lp1&0xff))) { - /* lower byte of signed word is zero */ - DEBUGpic14_emitcode(";left lit","line = %d 0x%x+1 low byte is zero",__LINE__,lit); - i = ((lp1 >> 8) & 0xff) ^0x80; - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - emitpcode(POC_ADDLW, popGetLit( 0x80)); - emitpcode(POC_ADDLW, popGetLit(0x100-i)); - rFalseIfx.condition ^= 1; - genSkipc(&rFalseIfx); - - - if(ifx) ifx->generated = 1; - return; - } - - if(lit & (0x80 << (size*8))) { - /* Lit is less than zero */ - DEBUGpic14_emitcode(";left lit","line = %d 0x%x is less than 0",__LINE__,lit); - //rFalseIfx.condition ^= 1; - //genSkipCond(&rFalseIfx,left,size,7); - //rFalseIfx.condition ^= 1; - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); - //emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - - } else { - /* Lit is greater than or equal to zero */ - DEBUGpic14_emitcode(";left lit","line = %d 0x%x is greater than 0",__LINE__,lit); - //rFalseIfx.condition ^= 1; - //genSkipCond(&rFalseIfx,right,size,7); - //rFalseIfx.condition ^= 1; - - //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); - //emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - - } - - - emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff)); - emitpcode(POC_SUBFW, popGet(AOP(right),size)); - - while(size--) { - - emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff)); - emitSKPNZ; - emitpcode(POC_SUBFW, popGet(AOP(right),size)); - } - rFalseIfx.condition ^= 1; - //rFalseIfx.condition = 1; - genSkipc(&rFalseIfx); - - emitpLabel(truelbl->key); - - if(ifx) ifx->generated = 1; - return; - // end of if (sign) - } else { - - /* compare word or long to an unsigned literal on the right.*/ - - - size--; - if(lit < 0xff) { - DEBUGpic14_emitcode ("; ***","%s %d lit =0x%x < 0xff",__FUNCTION__,__LINE__,lit); - switch (lit) { - case 0: - break; /* handled above */ - /* - case 0xff: - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - while(size--) - emitpcode(POC_IORFW, popGet(AOP(right),size)); - genSkipz2(&rFalseIfx,0); - break; - */ - default: - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - while(--size) - emitpcode(POC_IORFW, popGet(AOP(right),size)); - - emitSKPZ; - if(rFalseIfx.condition) - emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); - else - emitpcode(POC_GOTO, popGetLabel(truelbl->key)); - - - emitpcode(POC_MOVLW, popGetLit(lit+1)); - emitpcode(POC_SUBFW, popGet(AOP(right),0)); - - rFalseIfx.condition ^= 1; - genSkipc(&rFalseIfx); - } - - emitpLabel(truelbl->key); - - if(ifx) ifx->generated = 1; - return; - } - - - lit++; - DEBUGpic14_emitcode ("; ***","%s %d lit =0x%x",__FUNCTION__,__LINE__,lit); - i = (lit >> (size*8)) & 0xff; - - emitpcode(POC_MOVLW, popGetLit(i)); - emitpcode(POC_SUBFW, popGet(AOP(right),size)); - - while(size--) { - i = (lit >> (size*8)) & 0xff; - - if(i) { - emitpcode(POC_MOVLW, popGetLit(i)); - emitSKPNZ; - emitpcode(POC_SUBFW, popGet(AOP(right),size)); - } else { - /* this byte of the lit is zero, - *if it's not the last then OR in the variable */ - if(size) - emitpcode(POC_IORFW, popGet(AOP(right),size)); - } - } - - - emitpLabel(lbl->key); - - rFalseIfx.condition ^= 1; - genSkipc(&rFalseIfx); - } - - if(sign) - emitpLabel(truelbl->key); - if(ifx) ifx->generated = 1; - return; - } - } - /* Compare two variables */ - - DEBUGpic14_emitcode(";sign","%d",sign); - - size--; - if(sign) { - /* Sigh. thus sucks... */ - if(size) { - emitpcode(POC_MOVFW, popGet(AOP(left),size)); - emitpcode(POC_MOVWF, popRegFromIdx(Gstack_base_addr)); - emitpcode(POC_MOVLW, popGetLit(0x80)); - emitpcode(POC_XORWF, popRegFromIdx(Gstack_base_addr)); - emitpcode(POC_XORFW, popGet(AOP(right),size)); - emitpcode(POC_SUBFW, popRegFromIdx(Gstack_base_addr)); - } else { - /* Signed char comparison */ - /* Special thanks to Nikolai Golovchenko for this snippet */ - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - emitpcode(POC_SUBFW, popGet(AOP(left),0)); - emitpcode(POC_RRFW, popGet(AOP(left),0)); /* could be any register */ - emitpcode(POC_XORFW, popGet(AOP(left),0)); - emitpcode(POC_XORFW, popGet(AOP(right),0)); - emitpcode(POC_ADDLW, popGetLit(0x80)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - genSkipc(&rFalseIfx); - - if(ifx) ifx->generated = 1; - return; - } - - } else { - - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - } - - - /* The rest of the bytes of a multi-byte compare */ - while (size) { - - emitSKPZ; - emitpcode(POC_GOTO, popGetLabel(lbl->key)); - size--; - - emitpcode(POC_MOVFW, popGet(AOP(right),size)); - emitpcode(POC_SUBFW, popGet(AOP(left),size)); - - - } - - emitpLabel(lbl->key); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if ((AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) || - (AOP_TYPE(result) == AOP_REG)) { - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_RLF, popGet(AOP(result),0)); - } else { - genSkipc(&rFalseIfx); - } - //genSkipc(&rFalseIfx); - if(ifx) ifx->generated = 1; - - return; - + + if(AOP_TYPE(left) == AOP_LIT) { + //symbol *lbl = newiTempLabel(NULL); + + //EXPERIMENTAL lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit)); + + + DEBUGpic14_emitcode(";left lit","lit = 0x%x,sign=%d",lit,sign); + + /* Special cases */ + if((lit == 0) && (sign == 0)){ + + size--; + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + while(size) + emitpcode(POC_IORFW, popGet(AOP(right),--size)); + + genSkipz2(&rFalseIfx,0); + if(ifx) ifx->generated = 1; + return; + } + + if(size==1) { + /* Special cases */ + lit &= 0xff; + if(((lit == 0xff) && !sign) || ((lit==0x7f) && sign)) { + /* degenerate compare can never be true */ + if(rFalseIfx.condition == 0) + emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key)); + + if(ifx) ifx->generated = 1; + return; + } + + if(sign) { + /* signed comparisons to a literal byte */ + + int lp1 = (lit+1) & 0xff; + + DEBUGpic14_emitcode(";left lit","line = %d lit = 0x%x",__LINE__,lit); + switch (lp1) { + case 0: + rFalseIfx.condition ^= 1; + genSkipCond(&rFalseIfx,right,0,7); + break; + case 0x7f: + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + emitpcode(POC_XORLW, popGetLit(0x7f)); + genSkipz2(&rFalseIfx,1); + break; + default: + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + emitpcode(POC_ADDLW, popGetLit(0x80)); + emitpcode(POC_ADDLW, popGetLit(((-(lit+1)) & 0xff) ^ 0x80)); + rFalseIfx.condition ^= 1; + genSkipc(&rFalseIfx); + break; + } + if(ifx) ifx->generated = 1; + } else { + /* unsigned comparisons to a literal byte */ + + switch(lit & 0xff ) { + case 0: + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + genSkipz2(&rFalseIfx,0); + if(ifx) ifx->generated = 1; + break; + case 0x7f: + genSkipCond(&rFalseIfx,right,0,7); + if(ifx) ifx->generated = 1; + break; + + default: + emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); + emitpcode(POC_SUBFW, popGet(AOP(right),0)); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + rFalseIfx.condition ^= 1; + if (AOP_TYPE(result) == AOP_CRY) { + genSkipc(&rFalseIfx); + if(ifx) ifx->generated = 1; + } else { + DEBUGpic14_emitcode ("; ***","%s %d RFIfx.cond=%d",__FUNCTION__,__LINE__, rFalseIfx.condition); + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_RLF, popGet(AOP(result),0)); + emitpcode(POC_MOVLW, popGetLit(0x01)); + emitpcode(POC_XORWF, popGet(AOP(result),0)); + } + break; + } + } + + //goto check_carry; + return; + + } else { + + /* Size is greater than 1 */ + + if(sign) { + int lp1 = lit+1; + + size--; + + if(lp1 == 0) { + /* this means lit = 0xffffffff, or -1 */ + + + DEBUGpic14_emitcode(";left lit = -1","line = %d ",__LINE__); + rFalseIfx.condition ^= 1; + genSkipCond(&rFalseIfx,right,size,7); + if(ifx) ifx->generated = 1; + return; + } + + if(lit == 0) { + int s = size; + + if(rFalseIfx.condition) { + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + } + + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + while(size--) + emitpcode(POC_IORFW, popGet(AOP(right),size)); + + + emitSKPZ; + if(rFalseIfx.condition) { + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + emitpLabel(truelbl->key); + }else { + rFalseIfx.condition ^= 1; + genSkipCond(&rFalseIfx,right,s,7); + } + + if(ifx) ifx->generated = 1; + return; + } + + if((size == 1) && (0 == (lp1&0xff))) { + /* lower byte of signed word is zero */ + DEBUGpic14_emitcode(";left lit","line = %d 0x%x+1 low byte is zero",__LINE__,lit); + i = ((lp1 >> 8) & 0xff) ^0x80; + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + emitpcode(POC_ADDLW, popGetLit( 0x80)); + emitpcode(POC_ADDLW, popGetLit(0x100-i)); + rFalseIfx.condition ^= 1; + genSkipc(&rFalseIfx); + + + if(ifx) ifx->generated = 1; + return; + } + + if(lit & (0x80 << (size*8))) { + /* Lit is less than zero */ + DEBUGpic14_emitcode(";left lit","line = %d 0x%x is less than 0",__LINE__,lit); + //rFalseIfx.condition ^= 1; + //genSkipCond(&rFalseIfx,left,size,7); + //rFalseIfx.condition ^= 1; + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); + //emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + + } else { + /* Lit is greater than or equal to zero */ + DEBUGpic14_emitcode(";left lit","line = %d 0x%x is greater than 0",__LINE__,lit); + //rFalseIfx.condition ^= 1; + //genSkipCond(&rFalseIfx,right,size,7); + //rFalseIfx.condition ^= 1; + + //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); + //emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0)); + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + + } + + + emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff)); + emitpcode(POC_SUBFW, popGet(AOP(right),size)); + + while(size--) { + + emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff)); + emitSKPNZ; + emitpcode(POC_SUBFW, popGet(AOP(right),size)); + } + rFalseIfx.condition ^= 1; + //rFalseIfx.condition = 1; + genSkipc(&rFalseIfx); + + emitpLabel(truelbl->key); + + if(ifx) ifx->generated = 1; + return; + // end of if (sign) + } else { + + /* compare word or long to an unsigned literal on the right.*/ + + + size--; + if(lit < 0xff) { + DEBUGpic14_emitcode ("; ***","%s %d lit =0x%x < 0xff",__FUNCTION__,__LINE__,lit); + switch (lit) { + case 0: + break; /* handled above */ + /* + case 0xff: + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + while(size--) + emitpcode(POC_IORFW, popGet(AOP(right),size)); + genSkipz2(&rFalseIfx,0); + break; + */ + default: + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + while(--size) + emitpcode(POC_IORFW, popGet(AOP(right),size)); + + emitSKPZ; + if(rFalseIfx.condition) + emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key)); + else + emitpcode(POC_GOTO, popGetLabel(truelbl->key)); + + + emitpcode(POC_MOVLW, popGetLit(lit+1)); + emitpcode(POC_SUBFW, popGet(AOP(right),0)); + + rFalseIfx.condition ^= 1; + genSkipc(&rFalseIfx); + } + + emitpLabel(truelbl->key); + + if(ifx) ifx->generated = 1; + return; + } + + + lit++; + DEBUGpic14_emitcode ("; ***","%s %d lit =0x%x",__FUNCTION__,__LINE__,lit); + i = (lit >> (size*8)) & 0xff; + + emitpcode(POC_MOVLW, popGetLit(i)); + emitpcode(POC_SUBFW, popGet(AOP(right),size)); + + while(size--) { + i = (lit >> (size*8)) & 0xff; + + if(i) { + emitpcode(POC_MOVLW, popGetLit(i)); + emitSKPNZ; + emitpcode(POC_SUBFW, popGet(AOP(right),size)); + } else { + /* this byte of the lit is zero, + *if it's not the last then OR in the variable */ + if(size) + emitpcode(POC_IORFW, popGet(AOP(right),size)); + } + } + + + emitpLabel(lbl->key); + + rFalseIfx.condition ^= 1; + genSkipc(&rFalseIfx); + } + + if(sign) + emitpLabel(truelbl->key); + if(ifx) ifx->generated = 1; + return; + } + } + /* Compare two variables */ + + DEBUGpic14_emitcode(";sign","%d",sign); + + size--; + if(sign) { + /* Sigh. thus sucks... */ + if(size) { + emitpcode(POC_MOVFW, popGet(AOP(left),size)); + emitpcode(POC_MOVWF, popRegFromIdx(Gstack_base_addr)); + emitpcode(POC_MOVLW, popGetLit(0x80)); + emitpcode(POC_XORWF, popRegFromIdx(Gstack_base_addr)); + emitpcode(POC_XORFW, popGet(AOP(right),size)); + emitpcode(POC_SUBFW, popRegFromIdx(Gstack_base_addr)); + } else { + /* Signed char comparison */ + /* Special thanks to Nikolai Golovchenko for this snippet */ + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + emitpcode(POC_SUBFW, popGet(AOP(left),0)); + emitpcode(POC_RRFW, popGet(AOP(left),0)); /* could be any register */ + emitpcode(POC_XORFW, popGet(AOP(left),0)); + emitpcode(POC_XORFW, popGet(AOP(right),0)); + emitpcode(POC_ADDLW, popGetLit(0x80)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + genSkipc(&rFalseIfx); + + if(ifx) ifx->generated = 1; + return; + } + + } else { + + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + } + + + /* The rest of the bytes of a multi-byte compare */ + while (size) { + + emitSKPZ; + emitpcode(POC_GOTO, popGetLabel(lbl->key)); + size--; + + emitpcode(POC_MOVFW, popGet(AOP(right),size)); + emitpcode(POC_SUBFW, popGet(AOP(left),size)); + + + } + + emitpLabel(lbl->key); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if ((AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) || + (AOP_TYPE(result) == AOP_REG)) { + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_RLF, popGet(AOP(result),0)); + } else { + genSkipc(&rFalseIfx); + } + //genSkipc(&rFalseIfx); + if(ifx) ifx->generated = 1; + + return; + } // check_carry: if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - pic14_outBitC(result); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + pic14_outBitC(result); } else { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if the result is used in the next - ifx conditional branch then generate - code a little differently */ - if (ifx ) - genIfxJump (ifx,"c"); - else - pic14_outBitC(result); - /* leave the result in acc */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if the result is used in the next + ifx conditional branch then generate + code a little differently */ + if (ifx ) + genIfxJump (ifx,"c"); + else + pic14_outBitC(result); + /* leave the result in acc */ } } @@ -4346,28 +4345,28 @@ static void genCmp (operand *left,operand *right, /*-----------------------------------------------------------------*/ static void genCmpGt (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - sym_link *letype , *retype; - int sign ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - left = IC_LEFT(ic); - right= IC_RIGHT(ic); - result = IC_RESULT(ic); - - letype = getSpec(operandType(left)); - retype =getSpec(operandType(right)); - sign = !(SPEC_USIGN(letype) | SPEC_USIGN(retype)); - /* assign the amsops */ - aopOp (left,ic,FALSE); - aopOp (right,ic,FALSE); - aopOp (result,ic,TRUE); - - genCmp(right, left, result, ifx, sign); - - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + operand *left, *right, *result; + sym_link *letype , *retype; + int sign ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + left = IC_LEFT(ic); + right= IC_RIGHT(ic); + result = IC_RESULT(ic); + + letype = getSpec(operandType(left)); + retype =getSpec(operandType(right)); + sign = !(SPEC_USIGN(letype) | SPEC_USIGN(retype)); + /* assign the amsops */ + aopOp (left,ic,FALSE); + aopOp (right,ic,FALSE); + aopOp (result,ic,TRUE); + + genCmp(right, left, result, ifx, sign); + + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -4375,29 +4374,29 @@ static void genCmpGt (iCode *ic, iCode *ifx) /*-----------------------------------------------------------------*/ static void genCmpLt (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - sym_link *letype , *retype; - int sign ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - left = IC_LEFT(ic); - right= IC_RIGHT(ic); - result = IC_RESULT(ic); - - letype = getSpec(operandType(left)); - retype =getSpec(operandType(right)); - sign = !(SPEC_USIGN(letype) | SPEC_USIGN(retype)); - - /* assign the amsops */ - aopOp (left,ic,FALSE); - aopOp (right,ic,FALSE); - aopOp (result,ic,TRUE); - - genCmp(left, right, result, ifx, sign); - - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + operand *left, *right, *result; + sym_link *letype , *retype; + int sign ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + left = IC_LEFT(ic); + right= IC_RIGHT(ic); + result = IC_RESULT(ic); + + letype = getSpec(operandType(left)); + retype =getSpec(operandType(right)); + sign = !(SPEC_USIGN(letype) | SPEC_USIGN(retype)); + + /* assign the amsops */ + aopOp (left,ic,FALSE); + aopOp (right,ic,FALSE); + aopOp (result,ic,TRUE); + + genCmp(left, right, result, ifx, sign); + + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -4405,50 +4404,50 @@ static void genCmpLt (iCode *ic, iCode *ifx) /*-----------------------------------------------------------------*/ static void genc16bit2lit(operand *op, int lit, int offset) { - int i; - - DEBUGpic14_emitcode ("; ***","%s %d, lit = %d",__FUNCTION__,__LINE__,lit); - if( (lit&0xff) == 0) - i=1; - else - i=0; - - switch( BYTEofLONG(lit,i)) { - case 0: - emitpcode(POC_MOVFW,popGet(AOP(op),offset+i)); - break; - case 1: - emitpcode(POC_DECFW,popGet(AOP(op),offset+i)); - break; - case 0xff: - emitpcode(POC_INCFW,popGet(AOP(op),offset+i)); - break; - default: - emitpcode(POC_MOVFW,popGet(AOP(op),offset+i)); - emitpcode(POC_XORLW,popGetLit(BYTEofLONG(lit,i))); - } - - i ^= 1; - - switch( BYTEofLONG(lit,i)) { - case 0: - emitpcode(POC_IORFW,popGet(AOP(op),offset+i)); - break; - case 1: - emitSKPNZ; - emitpcode(POC_DECFW,popGet(AOP(op),offset+i)); - break; - case 0xff: - emitSKPNZ; - emitpcode(POC_INCFW,popGet(AOP(op),offset+i)); - break; - default: - emitpcode(POC_MOVLW,popGetLit(BYTEofLONG(lit,i))); - emitSKPNZ; - emitpcode(POC_XORFW,popGet(AOP(op),offset+i)); - - } - + int i; + + DEBUGpic14_emitcode ("; ***","%s %d, lit = %d",__FUNCTION__,__LINE__,lit); + if( (lit&0xff) == 0) + i=1; + else + i=0; + + switch( BYTEofLONG(lit,i)) { + case 0: + emitpcode(POC_MOVFW,popGet(AOP(op),offset+i)); + break; + case 1: + emitpcode(POC_DECFW,popGet(AOP(op),offset+i)); + break; + case 0xff: + emitpcode(POC_INCFW,popGet(AOP(op),offset+i)); + break; + default: + emitpcode(POC_MOVFW,popGet(AOP(op),offset+i)); + emitpcode(POC_XORLW,popGetLit(BYTEofLONG(lit,i))); + } + + i ^= 1; + + switch( BYTEofLONG(lit,i)) { + case 0: + emitpcode(POC_IORFW,popGet(AOP(op),offset+i)); + break; + case 1: + emitSKPNZ; + emitpcode(POC_DECFW,popGet(AOP(op),offset+i)); + break; + case 0xff: + emitSKPNZ; + emitpcode(POC_INCFW,popGet(AOP(op),offset+i)); + break; + default: + emitpcode(POC_MOVLW,popGetLit(BYTEofLONG(lit,i))); + emitSKPNZ; + emitpcode(POC_XORFW,popGet(AOP(op),offset+i)); + + } + } /*-----------------------------------------------------------------*/ @@ -4456,192 +4455,192 @@ static void genc16bit2lit(operand *op, int lit, int offset) /*-----------------------------------------------------------------*/ static void gencjne(operand *left, operand *right, operand *result, iCode *ifx) { - int size = max(AOP_SIZE(left),AOP_SIZE(right)); - int offset = 0; - int res_offset = 0; /* the result may be a different size then left or right */ - int res_size = AOP_SIZE(result); - resolvedIfx rIfx; - symbol *lbl; - - unsigned long lit = 0L; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - DEBUGpic14_AopType(__LINE__,left,right,result); - if(result) - DEBUGpic14_emitcode ("; ***","%s %d result is not null",__FUNCTION__,__LINE__); - resolveIfx(&rIfx,ifx); - lbl = newiTempLabel(NULL); - - - /* if the left side is a literal or - if the right is in a pointer register and left - is not */ - if ((AOP_TYPE(left) == AOP_LIT) || - (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) { - operand *t = right; - right = left; - left = t; - } - if(AOP_TYPE(right) == AOP_LIT) - lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - - /* if the right side is a literal then anything goes */ - if (AOP_TYPE(right) == AOP_LIT && - AOP_TYPE(left) != AOP_DIR ) { - switch(size) { - case 2: - genc16bit2lit(left, lit, 0); - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(lbl->key)); - break; - default: - while (size--) { - if(lit & 0xff) { - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode(POC_XORLW,popGetLit(lit & 0xff)); - } else { - emitpcode(POC_MOVF,popGet(AOP(left),offset)); - } - - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(lbl->key)); - offset++; - if(res_offset < res_size-1) - res_offset++; - lit >>= 8; - } - break; - } - } - - /* if the right side is in a register or in direct space or - if the left is a pointer register & right is not */ - else if (AOP_TYPE(right) == AOP_REG || - AOP_TYPE(right) == AOP_DIR || - (AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) || - (IS_AOP_PREG(left) && !IS_AOP_PREG(right))) { - //int lbl_key = (rIfx.condition) ? rIfx.lbl->key : lbl->key; - int lbl_key = lbl->key; - - if(result) { - emitpcode(POC_CLRF,popGet(AOP(result),res_offset)); - //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); - }else { - DEBUGpic14_emitcode ("; ***","%s %d -- ERROR",__FUNCTION__,__LINE__); - fprintf(stderr, "%s %d error - expecting result to be non_null\n", - __FUNCTION__,__LINE__); - return; - } - - /* switch(size) { */ - /* case 2: */ - /* genc16bit2lit(left, lit, 0); */ - /* emitSKPNZ; */ - /* emitpcode(POC_GOTO,popGetLabel(lbl->key)); */ - /* break; */ - /* default: */ - while (size--) { - int emit_skip=1; - if((AOP_TYPE(left) == AOP_DIR) && - ((AOP_TYPE(right) == AOP_REG) || (AOP_TYPE(right) == AOP_DIR))) { - - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode(POC_XORFW,popGet(AOP(right),offset)); - - } else if((AOP_TYPE(left) == AOP_DIR) && (AOP_TYPE(right) == AOP_LIT)){ - - switch (lit & 0xff) { - case 0: - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - break; - case 1: - emitpcode(POC_DECFSZW,popGet(AOP(left),offset)); - emitpcode(POC_INCF,popGet(AOP(result),res_offset)); - //emitpcode(POC_GOTO,popGetLabel(lbl->key)); - emit_skip=0; - break; - case 0xff: - emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); - //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); - //emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); - emitpcode(POC_GOTO,popGetLabel(lbl_key)); - emit_skip=0; - break; - default: - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode(POC_XORLW,popGetLit(lit & 0xff)); - } - lit >>= 8; - - } else { - emitpcode(POC_MOVF,popGet(AOP(left),offset)); - } - if(emit_skip) { - if(AOP_TYPE(result) == AOP_CRY) { - pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__); - if(rIfx.condition) - emitSKPNZ; - else - emitSKPZ; - emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); - } else { - /* fix me. probably need to check result size too */ - //emitpcode(POC_CLRF,popGet(AOP(result),0)); - if(rIfx.condition) - emitSKPZ; - else - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(lbl_key)); - //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); - } - if(ifx) - ifx->generated=1; - } - emit_skip++; - offset++; - if(res_offset < res_size-1) - res_offset++; - } - /* break; */ - /* } */ - } else if(AOP_TYPE(right) == AOP_REG && - AOP_TYPE(left) != AOP_DIR){ - - while(size--) { - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode(POC_XORFW,popGet(AOP(right),offset)); - pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__); - if(rIfx.condition) - emitSKPNZ; - else - emitSKPZ; - emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); - offset++; - if(res_offset < res_size-1) - res_offset++; - } - - }else{ - /* right is a pointer reg need both a & b */ - while(size--) { - char *l = aopGet(AOP(left),offset,FALSE,FALSE); - if(strcmp(l,"b")) - pic14_emitcode("mov","b,%s",l); - MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("cjne","a,b,%05d_DS_",lbl->key+100); - offset++; - } - } - - emitpcode(POC_INCF,popGet(AOP(result),res_offset)); - if(!rIfx.condition) - emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); - - emitpLabel(lbl->key); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(ifx) - ifx->generated = 1; + int size = max(AOP_SIZE(left),AOP_SIZE(right)); + int offset = 0; + int res_offset = 0; /* the result may be a different size then left or right */ + int res_size = AOP_SIZE(result); + resolvedIfx rIfx; + symbol *lbl; + + unsigned long lit = 0L; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_AopType(__LINE__,left,right,result); + if(result) + DEBUGpic14_emitcode ("; ***","%s %d result is not null",__FUNCTION__,__LINE__); + resolveIfx(&rIfx,ifx); + lbl = newiTempLabel(NULL); + + + /* if the left side is a literal or + if the right is in a pointer register and left + is not */ + if ((AOP_TYPE(left) == AOP_LIT) || + (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) { + operand *t = right; + right = left; + left = t; + } + if(AOP_TYPE(right) == AOP_LIT) + lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + + /* if the right side is a literal then anything goes */ + if (AOP_TYPE(right) == AOP_LIT && + AOP_TYPE(left) != AOP_DIR ) { + switch(size) { + case 2: + genc16bit2lit(left, lit, 0); + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(lbl->key)); + break; + default: + while (size--) { + if(lit & 0xff) { + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode(POC_XORLW,popGetLit(lit & 0xff)); + } else { + emitpcode(POC_MOVF,popGet(AOP(left),offset)); + } + + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(lbl->key)); + offset++; + if(res_offset < res_size-1) + res_offset++; + lit >>= 8; + } + break; + } + } + + /* if the right side is in a register or in direct space or + if the left is a pointer register & right is not */ + else if (AOP_TYPE(right) == AOP_REG || + AOP_TYPE(right) == AOP_DIR || + (AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) || + (IS_AOP_PREG(left) && !IS_AOP_PREG(right))) { + //int lbl_key = (rIfx.condition) ? rIfx.lbl->key : lbl->key; + int lbl_key = lbl->key; + + if(result) { + emitpcode(POC_CLRF,popGet(AOP(result),res_offset)); + //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); + }else { + DEBUGpic14_emitcode ("; ***","%s %d -- ERROR",__FUNCTION__,__LINE__); + fprintf(stderr, "%s %d error - expecting result to be non_null\n", + __FUNCTION__,__LINE__); + return; + } + + /* switch(size) { */ + /* case 2: */ + /* genc16bit2lit(left, lit, 0); */ + /* emitSKPNZ; */ + /* emitpcode(POC_GOTO,popGetLabel(lbl->key)); */ + /* break; */ + /* default: */ + while (size--) { + int emit_skip=1; + if((AOP_TYPE(left) == AOP_DIR) && + ((AOP_TYPE(right) == AOP_REG) || (AOP_TYPE(right) == AOP_DIR))) { + + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode(POC_XORFW,popGet(AOP(right),offset)); + + } else if((AOP_TYPE(left) == AOP_DIR) && (AOP_TYPE(right) == AOP_LIT)){ + + switch (lit & 0xff) { + case 0: + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + break; + case 1: + emitpcode(POC_DECFSZW,popGet(AOP(left),offset)); + emitpcode(POC_INCF,popGet(AOP(result),res_offset)); + //emitpcode(POC_GOTO,popGetLabel(lbl->key)); + emit_skip=0; + break; + case 0xff: + emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); + //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); + //emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); + emitpcode(POC_GOTO,popGetLabel(lbl_key)); + emit_skip=0; + break; + default: + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode(POC_XORLW,popGetLit(lit & 0xff)); + } + lit >>= 8; + + } else { + emitpcode(POC_MOVF,popGet(AOP(left),offset)); + } + if(emit_skip) { + if(AOP_TYPE(result) == AOP_CRY) { + pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__); + if(rIfx.condition) + emitSKPNZ; + else + emitSKPZ; + emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); + } else { + /* fix me. probably need to check result size too */ + //emitpcode(POC_CLRF,popGet(AOP(result),0)); + if(rIfx.condition) + emitSKPZ; + else + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(lbl_key)); + //emitpcode(POC_INCF,popGet(AOP(result),res_offset)); + } + if(ifx) + ifx->generated=1; + } + emit_skip++; + offset++; + if(res_offset < res_size-1) + res_offset++; + } + /* break; */ + /* } */ + } else if(AOP_TYPE(right) == AOP_REG && + AOP_TYPE(left) != AOP_DIR){ + + while(size--) { + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode(POC_XORFW,popGet(AOP(right),offset)); + pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__); + if(rIfx.condition) + emitSKPNZ; + else + emitSKPZ; + emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); + offset++; + if(res_offset < res_size-1) + res_offset++; + } + + }else{ + /* right is a pointer reg need both a & b */ + while(size--) { + char *l = aopGet(AOP(left),offset,FALSE,FALSE); + if(strcmp(l,"b")) + pic14_emitcode("mov","b,%s",l); + MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("cjne","a,b,%05d_DS_",lbl->key+100); + offset++; + } + } + + emitpcode(POC_INCF,popGet(AOP(result),res_offset)); + if(!rIfx.condition) + emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); + + emitpLabel(lbl->key); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(ifx) + ifx->generated = 1; } #if 0 @@ -4650,20 +4649,20 @@ static void gencjne(operand *left, operand *right, operand *result, iCode *ifx) /*-----------------------------------------------------------------*/ static void gencjne(operand *left, operand *right, iCode *ifx) { - symbol *tlbl = newiTempLabel(NULL); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - gencjneshort(left, right, lbl); - - pic14_emitcode("mov","a,%s",one); - pic14_emitcode("sjmp","%05d_DS_",tlbl->key+100); - pic14_emitcode("","%05d_DS_:",lbl->key+100); - pic14_emitcode("clr","a"); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - - emitpLabel(lbl->key); - emitpLabel(tlbl->key); - + symbol *tlbl = newiTempLabel(NULL); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + gencjneshort(left, right, lbl); + + pic14_emitcode("mov","a,%s",one); + pic14_emitcode("sjmp","%05d_DS_",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",lbl->key+100); + pic14_emitcode("clr","a"); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + + emitpLabel(lbl->key); + emitpLabel(tlbl->key); + } #endif @@ -4672,296 +4671,296 @@ static void gencjne(operand *left, operand *right, iCode *ifx) /*-----------------------------------------------------------------*/ static void genCmpEq (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - unsigned long lit = 0L; - int size,offset=0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(ifx) - DEBUGpic14_emitcode ("; ifx is non-null",""); - else - DEBUGpic14_emitcode ("; ifx is null",""); - - aopOp((left=IC_LEFT(ic)),ic,FALSE); - aopOp((right=IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - size = max(AOP_SIZE(left),AOP_SIZE(right)); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - /* if literal, literal on the right or - if the right is in a pointer register and left - is not */ - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) || - (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) { - operand *tmp = right ; - right = left; - left = tmp; - } - - - if(ifx && !AOP_SIZE(result)){ - symbol *tlbl; - /* if they are both bit variables */ - if (AOP_TYPE(left) == AOP_CRY && - ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) { - if(AOP_TYPE(right) == AOP_LIT){ - unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - if(lit == 0L){ - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - pic14_emitcode("cpl","c"); - } else if(lit == 1L) { - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - } else { - pic14_emitcode("clr","c"); - } - /* AOP_TYPE(right) == AOP_CRY */ - } else { - symbol *lbl = newiTempLabel(NULL); - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - pic14_emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); - pic14_emitcode("cpl","c"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - } - /* if true label then we jump if condition - supplied is true */ - tlbl = newiTempLabel(NULL); - if ( IC_TRUE(ifx) ) { - pic14_emitcode("jnc","%05d_DS_",tlbl->key+100); - pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); - } else { - pic14_emitcode("jc","%05d_DS_",tlbl->key+100); - pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100); - } - pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); - - { - /* left and right are both bit variables, result is carry */ - resolvedIfx rIfx; - - resolveIfx(&rIfx,ifx); - - emitpcode(POC_MOVLW,popGet(AOP(left),0)); - emitpcode(POC_ANDFW,popGet(AOP(left),0)); - emitpcode(POC_BTFSC,popGet(AOP(right),0)); - emitpcode(POC_ANDLW,popGet(AOP(left),0)); - genSkipz2(&rIfx,0); - } - } else { - - /* They're not both bit variables. Is the right a literal? */ - if(AOP_TYPE(right) == AOP_LIT) { - lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - - switch(size) { - - case 1: - switch(lit & 0xff) { - case 1: - if ( IC_TRUE(ifx) ) { - emitpcode(POC_DECFW,popGet(AOP(left),offset)); - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - } else { - emitpcode(POC_DECFSZW,popGet(AOP(left),offset)); - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - } - break; - case 0xff: - if ( IC_TRUE(ifx) ) { - emitpcode(POC_INCFW,popGet(AOP(left),offset)); - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - } else { - emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - } - break; - default: - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - if(lit) - emitpcode(POC_XORLW,popGetLit(lit & 0xff)); - genSkip(ifx,'z'); - } - - - /* end of size == 1 */ - break; - - case 2: - genc16bit2lit(left,lit,offset); - genSkip(ifx,'z'); - break; - /* end of size == 2 */ - - default: - /* size is 4 */ - if(lit==0) { - emitpcode(POC_MOVFW,popGet(AOP(left),0)); - emitpcode(POC_IORFW,popGet(AOP(left),1)); - emitpcode(POC_IORFW,popGet(AOP(left),2)); - emitpcode(POC_IORFW,popGet(AOP(left),3)); - - } else { - - /* search for patterns that can be optimized */ - - genc16bit2lit(left,lit,0); - lit >>= 16; - if(lit) { - genSkipz(ifx,IC_TRUE(ifx) == NULL); - //genSkip(ifx,'z'); - genc16bit2lit(left,lit,2); - } else { - emitpcode(POC_IORFW,popGet(AOP(left),2)); - emitpcode(POC_IORFW,popGet(AOP(left),3)); - - } - - } - - genSkip(ifx,'z'); - } - - ifx->generated = 1; - goto release ; - - - } else if(AOP_TYPE(right) == AOP_CRY ) { - /* we know the left is not a bit, but that the right is */ - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode( ( (IC_TRUE(ifx)) ? POC_BTFSC : POC_BTFSS), - popGet(AOP(right),offset)); - emitpcode(POC_XORLW,popGetLit(1)); - - /* if the two are equal, then W will be 0 and the Z bit is set - * we could test Z now, or go ahead and check the high order bytes if - * the variable we're comparing is larger than a byte. */ - - while(--size) - emitpcode(POC_IORFW,popGet(AOP(left),offset)); - - if ( IC_TRUE(ifx) ) { - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); - } else { - emitSKPZ; - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); - } - - } else { - /* They're both variables that are larger than bits */ - int s = size; - - tlbl = newiTempLabel(NULL); - - while(size--) { - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - emitpcode(POC_XORFW,popGet(AOP(right),offset)); - - if ( IC_TRUE(ifx) ) { - if(size) { - emitSKPZ; - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - pic14_emitcode(" goto","_%05d_DS_",tlbl->key+100+labelOffset); - } else { - emitSKPNZ; - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); - } - } else { - emitSKPZ; - emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); - } - offset++; - } - if(s>1 && IC_TRUE(ifx)) { - emitpLabel(tlbl->key); - pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); - } - } - } - /* mark the icode as generated */ - ifx->generated = 1; - goto release ; - } - - /* if they are both bit variables */ - if (AOP_TYPE(left) == AOP_CRY && - ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) { - if(AOP_TYPE(right) == AOP_LIT){ - unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - if(lit == 0L){ - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - pic14_emitcode("cpl","c"); - } else if(lit == 1L) { - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - } else { - pic14_emitcode("clr","c"); - } - /* AOP_TYPE(right) == AOP_CRY */ - } else { - symbol *lbl = newiTempLabel(NULL); - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - pic14_emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); - pic14_emitcode("cpl","c"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - } - /* c = 1 if egal */ - if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)){ - pic14_outBitC(result); - goto release ; - } - if (ifx) { - genIfxJump (ifx,"c"); - goto release ; - } - /* if the result is used in an arithmetic operation - then put the result in place */ - pic14_outBitC(result); - } else { - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - gencjne(left,right,result,ifx); - /* - if(ifx) - gencjne(left,right,newiTempLabel(NULL)); - else { - if(IC_TRUE(ifx)->key) - gencjne(left,right,IC_TRUE(ifx)->key); - else - gencjne(left,right,IC_FALSE(ifx)->key); - ifx->generated = 1; - goto release ; - } - if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) { - aopPut(AOP(result),"a",0); - goto release ; - } - - if (ifx) { - genIfxJump (ifx,"a"); - goto release ; - } - */ - /* if the result is used in an arithmetic operation - then put the result in place */ - /* - if (AOP_TYPE(result) != AOP_CRY) - pic14_outAcc(result); - */ - /* leave the result in acc */ - } - + operand *left, *right, *result; + unsigned long lit = 0L; + int size,offset=0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(ifx) + DEBUGpic14_emitcode ("; ifx is non-null",""); + else + DEBUGpic14_emitcode ("; ifx is null",""); + + aopOp((left=IC_LEFT(ic)),ic,FALSE); + aopOp((right=IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + size = max(AOP_SIZE(left),AOP_SIZE(right)); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + /* if literal, literal on the right or + if the right is in a pointer register and left + is not */ + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) || + (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) { + operand *tmp = right ; + right = left; + left = tmp; + } + + + if(ifx && !AOP_SIZE(result)){ + symbol *tlbl; + /* if they are both bit variables */ + if (AOP_TYPE(left) == AOP_CRY && + ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) { + if(AOP_TYPE(right) == AOP_LIT){ + unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + if(lit == 0L){ + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); + } else if(lit == 1L) { + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + } else { + pic14_emitcode("clr","c"); + } + /* AOP_TYPE(right) == AOP_CRY */ + } else { + symbol *lbl = newiTempLabel(NULL); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); + pic14_emitcode("cpl","c"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + } + /* if true label then we jump if condition + supplied is true */ + tlbl = newiTempLabel(NULL); + if ( IC_TRUE(ifx) ) { + pic14_emitcode("jnc","%05d_DS_",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); + } else { + pic14_emitcode("jc","%05d_DS_",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100); + } + pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + + { + /* left and right are both bit variables, result is carry */ + resolvedIfx rIfx; + + resolveIfx(&rIfx,ifx); + + emitpcode(POC_MOVLW,popGet(AOP(left),0)); + emitpcode(POC_ANDFW,popGet(AOP(left),0)); + emitpcode(POC_BTFSC,popGet(AOP(right),0)); + emitpcode(POC_ANDLW,popGet(AOP(left),0)); + genSkipz2(&rIfx,0); + } + } else { + + /* They're not both bit variables. Is the right a literal? */ + if(AOP_TYPE(right) == AOP_LIT) { + lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + + switch(size) { + + case 1: + switch(lit & 0xff) { + case 1: + if ( IC_TRUE(ifx) ) { + emitpcode(POC_DECFW,popGet(AOP(left),offset)); + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + } else { + emitpcode(POC_DECFSZW,popGet(AOP(left),offset)); + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + } + break; + case 0xff: + if ( IC_TRUE(ifx) ) { + emitpcode(POC_INCFW,popGet(AOP(left),offset)); + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + } else { + emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + } + break; + default: + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + if(lit) + emitpcode(POC_XORLW,popGetLit(lit & 0xff)); + genSkip(ifx,'z'); + } + + + /* end of size == 1 */ + break; + + case 2: + genc16bit2lit(left,lit,offset); + genSkip(ifx,'z'); + break; + /* end of size == 2 */ + + default: + /* size is 4 */ + if(lit==0) { + emitpcode(POC_MOVFW,popGet(AOP(left),0)); + emitpcode(POC_IORFW,popGet(AOP(left),1)); + emitpcode(POC_IORFW,popGet(AOP(left),2)); + emitpcode(POC_IORFW,popGet(AOP(left),3)); + + } else { + + /* search for patterns that can be optimized */ + + genc16bit2lit(left,lit,0); + lit >>= 16; + if(lit) { + genSkipz(ifx,IC_TRUE(ifx) == NULL); + //genSkip(ifx,'z'); + genc16bit2lit(left,lit,2); + } else { + emitpcode(POC_IORFW,popGet(AOP(left),2)); + emitpcode(POC_IORFW,popGet(AOP(left),3)); + + } + + } + + genSkip(ifx,'z'); + } + + ifx->generated = 1; + goto release ; + + + } else if(AOP_TYPE(right) == AOP_CRY ) { + /* we know the left is not a bit, but that the right is */ + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode( ( (IC_TRUE(ifx)) ? POC_BTFSC : POC_BTFSS), + popGet(AOP(right),offset)); + emitpcode(POC_XORLW,popGetLit(1)); + + /* if the two are equal, then W will be 0 and the Z bit is set + * we could test Z now, or go ahead and check the high order bytes if + * the variable we're comparing is larger than a byte. */ + + while(--size) + emitpcode(POC_IORFW,popGet(AOP(left),offset)); + + if ( IC_TRUE(ifx) ) { + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + } else { + emitSKPZ; + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + } + + } else { + /* They're both variables that are larger than bits */ + int s = size; + + tlbl = newiTempLabel(NULL); + + while(size--) { + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + emitpcode(POC_XORFW,popGet(AOP(right),offset)); + + if ( IC_TRUE(ifx) ) { + if(size) { + emitSKPZ; + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + pic14_emitcode(" goto","_%05d_DS_",tlbl->key+100+labelOffset); + } else { + emitSKPNZ; + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + } + } else { + emitSKPZ; + emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + } + offset++; + } + if(s>1 && IC_TRUE(ifx)) { + emitpLabel(tlbl->key); + pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); + } + } + } + /* mark the icode as generated */ + ifx->generated = 1; + goto release ; + } + + /* if they are both bit variables */ + if (AOP_TYPE(left) == AOP_CRY && + ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) { + if(AOP_TYPE(right) == AOP_LIT){ + unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + if(lit == 0L){ + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); + } else if(lit == 1L) { + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + } else { + pic14_emitcode("clr","c"); + } + /* AOP_TYPE(right) == AOP_CRY */ + } else { + symbol *lbl = newiTempLabel(NULL); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); + pic14_emitcode("cpl","c"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + } + /* c = 1 if egal */ + if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)){ + pic14_outBitC(result); + goto release ; + } + if (ifx) { + genIfxJump (ifx,"c"); + goto release ; + } + /* if the result is used in an arithmetic operation + then put the result in place */ + pic14_outBitC(result); + } else { + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + gencjne(left,right,result,ifx); + /* + if(ifx) + gencjne(left,right,newiTempLabel(NULL)); + else { + if(IC_TRUE(ifx)->key) + gencjne(left,right,IC_TRUE(ifx)->key); + else + gencjne(left,right,IC_FALSE(ifx)->key); + ifx->generated = 1; + goto release ; + } + if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) { + aopPut(AOP(result),"a",0); + goto release ; + } + + if (ifx) { + genIfxJump (ifx,"a"); + goto release ; + } + */ + /* if the result is used in an arithmetic operation + then put the result in place */ + /* + if (AOP_TYPE(result) != AOP_CRY) + pic14_outAcc(result); + */ + /* leave the result in acc */ + } + release: - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -4969,87 +4968,87 @@ release: /*-----------------------------------------------------------------*/ static iCode *ifxForOp ( operand *op, iCode *ic ) { - /* if true symbol then needs to be assigned */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (IS_TRUE_SYMOP(op)) - return NULL ; - - /* if this has register type condition and - the next instruction is ifx with the same operand - and live to of the operand is upto the ifx only then */ - if (ic->next && - ic->next->op == IFX && - IC_COND(ic->next)->key == op->key && - OP_SYMBOL(op)->liveTo <= ic->next->seq ) - return ic->next; - - if (ic->next && - ic->next->op == IFX && - IC_COND(ic->next)->key == op->key) { - DEBUGpic14_emitcode ("; WARNING ","%d IGNORING liveTo range in %s",__LINE__,__FUNCTION__); - return ic->next; - } - - DEBUGpic14_emitcode ("; NULL :(","%d",__LINE__); - if (ic->next && - ic->next->op == IFX) - DEBUGpic14_emitcode ("; ic-next"," is an IFX"); - - if (ic->next && - ic->next->op == IFX && - IC_COND(ic->next)->key == op->key) { - DEBUGpic14_emitcode ("; "," key is okay"); - DEBUGpic14_emitcode ("; "," key liveTo %d, next->seq = %d", - OP_SYMBOL(op)->liveTo, - ic->next->seq); - } - - - return NULL; + /* if true symbol then needs to be assigned */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (IS_TRUE_SYMOP(op)) + return NULL ; + + /* if this has register type condition and + the next instruction is ifx with the same operand + and live to of the operand is upto the ifx only then */ + if (ic->next && + ic->next->op == IFX && + IC_COND(ic->next)->key == op->key && + OP_SYMBOL(op)->liveTo <= ic->next->seq ) + return ic->next; + + if (ic->next && + ic->next->op == IFX && + IC_COND(ic->next)->key == op->key) { + DEBUGpic14_emitcode ("; WARNING ","%d IGNORING liveTo range in %s",__LINE__,__FUNCTION__); + return ic->next; + } + + DEBUGpic14_emitcode ("; NULL :(","%d",__LINE__); + if (ic->next && + ic->next->op == IFX) + DEBUGpic14_emitcode ("; ic-next"," is an IFX"); + + if (ic->next && + ic->next->op == IFX && + IC_COND(ic->next)->key == op->key) { + DEBUGpic14_emitcode ("; "," key is okay"); + DEBUGpic14_emitcode ("; "," key liveTo %d, next->seq = %d", + OP_SYMBOL(op)->liveTo, + ic->next->seq); + } + + + return NULL; } /*-----------------------------------------------------------------*/ /* genAndOp - for && operation */ /*-----------------------------------------------------------------*/ static void genAndOp (iCode *ic) { - operand *left,*right, *result; - /* symbol *tlbl; */ - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* note here that && operations that are in an - if statement are taken away by backPatchLabels - only those used in arthmetic operations remain */ - aopOp((left=IC_LEFT(ic)),ic,FALSE); - aopOp((right=IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,FALSE); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - emitpcode(POC_MOVFW,popGet(AOP(left),0)); - emitpcode(POC_ANDFW,popGet(AOP(right),0)); - emitpcode(POC_MOVWF,popGet(AOP(result),0)); - - /* if both are bit variables */ - /* if (AOP_TYPE(left) == AOP_CRY && */ - /* AOP_TYPE(right) == AOP_CRY ) { */ - /* pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); */ - /* pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); */ - /* pic14_outBitC(result); */ - /* } else { */ - /* tlbl = newiTempLabel(NULL); */ - /* pic14_toBoolean(left); */ - /* pic14_emitcode("jz","%05d_DS_",tlbl->key+100); */ - /* pic14_toBoolean(right); */ - /* pic14_emitcode("","%05d_DS_:",tlbl->key+100); */ - /* pic14_outBitAcc(result); */ - /* } */ - - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); -} - - + operand *left,*right, *result; + /* symbol *tlbl; */ + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* note here that && operations that are in an + if statement are taken away by backPatchLabels + only those used in arthmetic operations remain */ + aopOp((left=IC_LEFT(ic)),ic,FALSE); + aopOp((right=IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,FALSE); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + emitpcode(POC_MOVFW,popGet(AOP(left),0)); + emitpcode(POC_ANDFW,popGet(AOP(right),0)); + emitpcode(POC_MOVWF,popGet(AOP(result),0)); + + /* if both are bit variables */ + /* if (AOP_TYPE(left) == AOP_CRY && */ + /* AOP_TYPE(right) == AOP_CRY ) { */ + /* pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); */ + /* pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); */ + /* pic14_outBitC(result); */ + /* } else { */ + /* tlbl = newiTempLabel(NULL); */ + /* pic14_toBoolean(left); */ + /* pic14_emitcode("jz","%05d_DS_",tlbl->key+100); */ + /* pic14_toBoolean(right); */ + /* pic14_emitcode("","%05d_DS_:",tlbl->key+100); */ + /* pic14_outBitAcc(result); */ + /* } */ + + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); +} + + /*-----------------------------------------------------------------*/ /* genOrOp - for || operation */ /*-----------------------------------------------------------------*/ @@ -5060,45 +5059,45 @@ modified this code, but it doesn't appear to ever get called static void genOrOp (iCode *ic) { - operand *left,*right, *result; - symbol *tlbl; - - /* note here that || operations that are in an - if statement are taken away by backPatchLabels - only those used in arthmetic operations remain */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp((left=IC_LEFT(ic)),ic,FALSE); - aopOp((right=IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,FALSE); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - /* if both are bit variables */ - if (AOP_TYPE(left) == AOP_CRY && - AOP_TYPE(right) == AOP_CRY ) { - pic14_emitcode("clrc",""); - pic14_emitcode("btfss","(%s >> 3), (%s & 7)", - AOP(left)->aopu.aop_dir, - AOP(left)->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(right)->aopu.aop_dir, - AOP(right)->aopu.aop_dir); - pic14_emitcode("setc",""); - - } else { - tlbl = newiTempLabel(NULL); - pic14_toBoolean(left); - emitSKPZ; - pic14_emitcode("goto","%05d_DS_",tlbl->key+100+labelOffset); - pic14_toBoolean(right); - pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); - - pic14_outBitAcc(result); - } - - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + operand *left,*right, *result; + symbol *tlbl; + + /* note here that || operations that are in an + if statement are taken away by backPatchLabels + only those used in arthmetic operations remain */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp((left=IC_LEFT(ic)),ic,FALSE); + aopOp((right=IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,FALSE); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + /* if both are bit variables */ + if (AOP_TYPE(left) == AOP_CRY && + AOP_TYPE(right) == AOP_CRY ) { + pic14_emitcode("clrc",""); + pic14_emitcode("btfss","(%s >> 3), (%s & 7)", + AOP(left)->aopu.aop_dir, + AOP(left)->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(right)->aopu.aop_dir, + AOP(right)->aopu.aop_dir); + pic14_emitcode("setc",""); + + } else { + tlbl = newiTempLabel(NULL); + pic14_toBoolean(left); + emitSKPZ; + pic14_emitcode("goto","%05d_DS_",tlbl->key+100+labelOffset); + pic14_toBoolean(right); + pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + + pic14_outBitAcc(result); + } + + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -5106,20 +5105,20 @@ static void genOrOp (iCode *ic) /*-----------------------------------------------------------------*/ static int isLiteralBit(unsigned long lit) { - unsigned long pw[32] = {1L,2L,4L,8L,16L,32L,64L,128L, - 0x100L,0x200L,0x400L,0x800L, - 0x1000L,0x2000L,0x4000L,0x8000L, - 0x10000L,0x20000L,0x40000L,0x80000L, - 0x100000L,0x200000L,0x400000L,0x800000L, - 0x1000000L,0x2000000L,0x4000000L,0x8000000L, - 0x10000000L,0x20000000L,0x40000000L,0x80000000L}; - int idx; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - for(idx = 0; idx < 32; idx++) - if(lit == pw[idx]) - return idx+1; - return 0; + unsigned long pw[32] = {1L,2L,4L,8L,16L,32L,64L,128L, + 0x100L,0x200L,0x400L,0x800L, + 0x1000L,0x2000L,0x4000L,0x8000L, + 0x10000L,0x20000L,0x40000L,0x80000L, + 0x100000L,0x200000L,0x400000L,0x800000L, + 0x1000000L,0x2000000L,0x4000000L,0x8000000L, + 0x10000000L,0x20000000L,0x40000000L,0x80000000L}; + int idx; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + for(idx = 0; idx < 32; idx++) + if(lit == pw[idx]) + return idx+1; + return 0; } /*-----------------------------------------------------------------*/ @@ -5127,10 +5126,10 @@ static int isLiteralBit(unsigned long lit) /*-----------------------------------------------------------------*/ static void continueIfTrue (iCode *ic) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(IC_TRUE(ic)) - pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); - ic->generated = 1; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(IC_TRUE(ic)) + pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); + ic->generated = 1; } /*-----------------------------------------------------------------*/ @@ -5138,10 +5137,10 @@ static void continueIfTrue (iCode *ic) /*-----------------------------------------------------------------*/ static void jumpIfTrue (iCode *ic) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(!IC_TRUE(ic)) - pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); - ic->generated = 1; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(!IC_TRUE(ic)) + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); + ic->generated = 1; } /*-----------------------------------------------------------------*/ @@ -5149,20 +5148,20 @@ static void jumpIfTrue (iCode *ic) /*-----------------------------------------------------------------*/ static void jmpTrueOrFalse (iCode *ic, symbol *tlbl) { - // ugly but optimized by peephole - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(IC_TRUE(ic)){ - symbol *nlbl = newiTempLabel(NULL); - pic14_emitcode("sjmp","%05d_DS_",nlbl->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); - pic14_emitcode("","%05d_DS_:",nlbl->key+100); - } - else{ - pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - } - ic->generated = 1; + // ugly but optimized by peephole + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(IC_TRUE(ic)){ + symbol *nlbl = newiTempLabel(NULL); + pic14_emitcode("sjmp","%05d_DS_",nlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); + pic14_emitcode("","%05d_DS_:",nlbl->key+100); + } + else{ + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + } + ic->generated = 1; } /*-----------------------------------------------------------------*/ @@ -5170,286 +5169,286 @@ static void jmpTrueOrFalse (iCode *ic, symbol *tlbl) /*-----------------------------------------------------------------*/ static void genAnd (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - int size, offset=0; - unsigned long lit = 0L; - int bytelit = 0; - resolvedIfx rIfx; - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp((left = IC_LEFT(ic)),ic,FALSE); - aopOp((right= IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - resolveIfx(&rIfx,ifx); - - /* if left is a literal & right is not then exchange them */ - if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || - AOP_NEEDSACC(left)) { - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if result = right then exchange them */ - if(pic14_sameRegs(AOP(result),AOP(right))){ - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if right is bit then exchange them */ - if (AOP_TYPE(right) == AOP_CRY && - AOP_TYPE(left) != AOP_CRY){ - operand *tmp = right ; - right = left; - left = tmp; - } - if(AOP_TYPE(right) == AOP_LIT) - lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); - - size = AOP_SIZE(result); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - // if(bit & yy) - // result = bit & yy; - if (AOP_TYPE(left) == AOP_CRY){ - // c = bit & literal; - if(AOP_TYPE(right) == AOP_LIT){ - if(lit & 1) { - if(size && pic14_sameRegs(AOP(result),AOP(left))) - // no change - goto release; - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - } else { - // bit(result) = 0; - if(size && (AOP_TYPE(result) == AOP_CRY)){ - pic14_emitcode("clr","%s",AOP(result)->aopu.aop_dir); - goto release; - } - if((AOP_TYPE(result) == AOP_CRY) && ifx){ - jumpIfTrue(ifx); - goto release; - } - pic14_emitcode("clr","c"); - } - } else { - if (AOP_TYPE(right) == AOP_CRY){ - // c = bit & bit; - pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); - pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); - } else { - // c = bit & val; - MOVA(aopGet(AOP(right),0,FALSE,FALSE)); - // c = lsb - pic14_emitcode("rrc","a"); - pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); - } - } - // bit = c - // val = c - if(size) - pic14_outBitC(result); - // if(bit & ...) - else if((AOP_TYPE(result) == AOP_CRY) && ifx) - genIfxJump(ifx, "c"); - goto release ; - } - - // if(val & 0xZZ) - size = 0, ifx != FALSE - - // bit = val & 0xZZ - size = 1, ifx = FALSE - - if((AOP_TYPE(right) == AOP_LIT) && - (AOP_TYPE(result) == AOP_CRY) && - (AOP_TYPE(left) != AOP_CRY)){ - int posbit = isLiteralBit(lit); - /* left & 2^n */ - if(posbit){ - posbit--; - //MOVA(aopGet(AOP(left),posbit>>3,FALSE,FALSE)); - // bit = left & 2^n - if(size) - pic14_emitcode("mov","c,acc.%d",posbit&0x07); - // if(left & 2^n) - else{ - if(ifx){ - int offset = 0; - while (posbit > 7) { - posbit -= 8; - offset++; - } - emitpcode(((rIfx.condition) ? POC_BTFSC : POC_BTFSS), - newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),posbit,0)); - emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); - - ifx->generated = 1; - } - goto release; - } - } else { - symbol *tlbl = newiTempLabel(NULL); - int sizel = AOP_SIZE(left); - if(size) - pic14_emitcode("setb","c"); - while(sizel--){ - if((bytelit = ((lit >> (offset*8)) & 0x0FFL)) != 0x0L){ - MOVA( aopGet(AOP(left),offset,FALSE,FALSE)); - // byte == 2^n ? - if((posbit = isLiteralBit(bytelit)) != 0) - pic14_emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100); - else{ - if(bytelit != 0x0FFL) - pic14_emitcode("anl","a,%s", - aopGet(AOP(right),offset,FALSE,TRUE)); - pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); - } - } - offset++; - } - // bit = left & literal - if(size){ - pic14_emitcode("clr","c"); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - } - // if(left & literal) - else{ - if(ifx) - jmpTrueOrFalse(ifx, tlbl); - goto release ; - } - } - pic14_outBitC(result); - goto release ; - } - - /* if left is same as result */ - if(pic14_sameRegs(AOP(result),AOP(left))){ - int know_W = -1; - for(;size--; offset++,lit>>=8) { - if(AOP_TYPE(right) == AOP_LIT){ - switch(lit & 0xff) { - case 0x00: - /* and'ing with 0 has clears the result */ - pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); - emitpcode(POC_CLRF,popGet(AOP(result),offset)); - break; - case 0xff: - /* and'ing with 0xff is a nop when the result and left are the same */ - break; - - default: - { - int p = my_powof2( (~lit) & 0xff ); - if(p>=0) { - /* only one bit is set in the literal, so use a bcf instruction */ - pic14_emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); - emitpcode(POC_BCF,newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0)); - - } else { - pic14_emitcode("movlw","0x%x", (lit & 0xff)); - pic14_emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE)); - if(know_W != (int)(lit&0xff)) - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - know_W = lit &0xff; - emitpcode(POC_ANDWF,popGet(AOP(left),offset)); - } - } - } - } else { - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_ANDFW,popGet(AOP(right),offset)); - } else { - emitpcode(POC_MOVFW,popGet(AOP(right),offset)); - emitpcode(POC_ANDWF,popGet(AOP(left),offset)); - - } - } - } - - } else { - // left & result in different registers - if(AOP_TYPE(result) == AOP_CRY){ - // result = bit - // if(size), result in bit - // if(!size && ifx), conditional oper: if(left & right) - symbol *tlbl = newiTempLabel(NULL); - int sizer = min(AOP_SIZE(left),AOP_SIZE(right)); - if(size) - pic14_emitcode("setb","c"); - while(sizer--){ - MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("anl","a,%s", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); - offset++; - } - if(size){ - CLRC; - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_outBitC(result); - } else if(ifx) - jmpTrueOrFalse(ifx, tlbl); - } else { - for(;(size--);offset++) { - // normal case - // result = left & right - if(AOP_TYPE(right) == AOP_LIT){ - int t = (lit >> (offset*8)) & 0x0FFL; - switch(t) { - case 0x00: - pic14_emitcode("clrf","%s", - aopGet(AOP(result),offset,FALSE,FALSE)); - emitpcode(POC_CLRF,popGet(AOP(result),offset)); - break; - case 0xff: - if(AOP_TYPE(left) != AOP_ACC) { - pic14_emitcode("movf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s", - aopGet(AOP(result),offset,FALSE,FALSE)); - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - break; - default: - if(AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_ANDLW, popGetLit(t)); - } else { - pic14_emitcode("movlw","0x%x",t); - pic14_emitcode("andwf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s", - aopGet(AOP(result),offset,FALSE,FALSE)); - - emitpcode(POC_MOVLW, popGetLit(t)); - emitpcode(POC_ANDFW,popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - } - continue; - } - - if (AOP_TYPE(left) == AOP_ACC) { - pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitpcode(POC_ANDFW,popGet(AOP(right),offset)); - } else { - pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("andwf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - emitpcode(POC_MOVFW,popGet(AOP(right),offset)); - emitpcode(POC_ANDFW,popGet(AOP(left),offset)); - } - pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - } - } - } - + operand *left, *right, *result; + int size, offset=0; + unsigned long lit = 0L; + int bytelit = 0; + resolvedIfx rIfx; + + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp((left = IC_LEFT(ic)),ic,FALSE); + aopOp((right= IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + resolveIfx(&rIfx,ifx); + + /* if left is a literal & right is not then exchange them */ + if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || + AOP_NEEDSACC(left)) { + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if result = right then exchange them */ + if(pic14_sameRegs(AOP(result),AOP(right))){ + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if right is bit then exchange them */ + if (AOP_TYPE(right) == AOP_CRY && + AOP_TYPE(left) != AOP_CRY){ + operand *tmp = right ; + right = left; + left = tmp; + } + if(AOP_TYPE(right) == AOP_LIT) + lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); + + size = AOP_SIZE(result); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + // if(bit & yy) + // result = bit & yy; + if (AOP_TYPE(left) == AOP_CRY){ + // c = bit & literal; + if(AOP_TYPE(right) == AOP_LIT){ + if(lit & 1) { + if(size && pic14_sameRegs(AOP(result),AOP(left))) + // no change + goto release; + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + } else { + // bit(result) = 0; + if(size && (AOP_TYPE(result) == AOP_CRY)){ + pic14_emitcode("clr","%s",AOP(result)->aopu.aop_dir); + goto release; + } + if((AOP_TYPE(result) == AOP_CRY) && ifx){ + jumpIfTrue(ifx); + goto release; + } + pic14_emitcode("clr","c"); + } + } else { + if (AOP_TYPE(right) == AOP_CRY){ + // c = bit & bit; + pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); + pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); + } else { + // c = bit & val; + MOVA(aopGet(AOP(right),0,FALSE,FALSE)); + // c = lsb + pic14_emitcode("rrc","a"); + pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); + } + } + // bit = c + // val = c + if(size) + pic14_outBitC(result); + // if(bit & ...) + else if((AOP_TYPE(result) == AOP_CRY) && ifx) + genIfxJump(ifx, "c"); + goto release ; + } + + // if(val & 0xZZ) - size = 0, ifx != FALSE - + // bit = val & 0xZZ - size = 1, ifx = FALSE - + if((AOP_TYPE(right) == AOP_LIT) && + (AOP_TYPE(result) == AOP_CRY) && + (AOP_TYPE(left) != AOP_CRY)){ + int posbit = isLiteralBit(lit); + /* left & 2^n */ + if(posbit){ + posbit--; + //MOVA(aopGet(AOP(left),posbit>>3,FALSE,FALSE)); + // bit = left & 2^n + if(size) + pic14_emitcode("mov","c,acc.%d",posbit&0x07); + // if(left & 2^n) + else{ + if(ifx){ + int offset = 0; + while (posbit > 7) { + posbit -= 8; + offset++; + } + emitpcode(((rIfx.condition) ? POC_BTFSC : POC_BTFSS), + newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),posbit,0)); + emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key)); + + ifx->generated = 1; + } + goto release; + } + } else { + symbol *tlbl = newiTempLabel(NULL); + int sizel = AOP_SIZE(left); + if(size) + pic14_emitcode("setb","c"); + while(sizel--){ + if((bytelit = ((lit >> (offset*8)) & 0x0FFL)) != 0x0L){ + MOVA( aopGet(AOP(left),offset,FALSE,FALSE)); + // byte == 2^n ? + if((posbit = isLiteralBit(bytelit)) != 0) + pic14_emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100); + else{ + if(bytelit != 0x0FFL) + pic14_emitcode("anl","a,%s", + aopGet(AOP(right),offset,FALSE,TRUE)); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); + } + } + offset++; + } + // bit = left & literal + if(size){ + pic14_emitcode("clr","c"); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + } + // if(left & literal) + else{ + if(ifx) + jmpTrueOrFalse(ifx, tlbl); + goto release ; + } + } + pic14_outBitC(result); + goto release ; + } + + /* if left is same as result */ + if(pic14_sameRegs(AOP(result),AOP(left))){ + int know_W = -1; + for(;size--; offset++,lit>>=8) { + if(AOP_TYPE(right) == AOP_LIT){ + switch(lit & 0xff) { + case 0x00: + /* and'ing with 0 has clears the result */ + pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + emitpcode(POC_CLRF,popGet(AOP(result),offset)); + break; + case 0xff: + /* and'ing with 0xff is a nop when the result and left are the same */ + break; + + default: + { + int p = my_powof2( (~lit) & 0xff ); + if(p>=0) { + /* only one bit is set in the literal, so use a bcf instruction */ + pic14_emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); + emitpcode(POC_BCF,newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0)); + + } else { + pic14_emitcode("movlw","0x%x", (lit & 0xff)); + pic14_emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE)); + if(know_W != (int)(lit&0xff)) + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + know_W = lit &0xff; + emitpcode(POC_ANDWF,popGet(AOP(left),offset)); + } + } + } + } else { + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_ANDFW,popGet(AOP(right),offset)); + } else { + emitpcode(POC_MOVFW,popGet(AOP(right),offset)); + emitpcode(POC_ANDWF,popGet(AOP(left),offset)); + + } + } + } + + } else { + // left & result in different registers + if(AOP_TYPE(result) == AOP_CRY){ + // result = bit + // if(size), result in bit + // if(!size && ifx), conditional oper: if(left & right) + symbol *tlbl = newiTempLabel(NULL); + int sizer = min(AOP_SIZE(left),AOP_SIZE(right)); + if(size) + pic14_emitcode("setb","c"); + while(sizer--){ + MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("anl","a,%s", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); + offset++; + } + if(size){ + CLRC; + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); + } else if(ifx) + jmpTrueOrFalse(ifx, tlbl); + } else { + for(;(size--);offset++) { + // normal case + // result = left & right + if(AOP_TYPE(right) == AOP_LIT){ + int t = (lit >> (offset*8)) & 0x0FFL; + switch(t) { + case 0x00: + pic14_emitcode("clrf","%s", + aopGet(AOP(result),offset,FALSE,FALSE)); + emitpcode(POC_CLRF,popGet(AOP(result),offset)); + break; + case 0xff: + if(AOP_TYPE(left) != AOP_ACC) { + pic14_emitcode("movf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", + aopGet(AOP(result),offset,FALSE,FALSE)); + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + break; + default: + if(AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_ANDLW, popGetLit(t)); + } else { + pic14_emitcode("movlw","0x%x",t); + pic14_emitcode("andwf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", + aopGet(AOP(result),offset,FALSE,FALSE)); + + emitpcode(POC_MOVLW, popGetLit(t)); + emitpcode(POC_ANDFW,popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + } + continue; + } + + if (AOP_TYPE(left) == AOP_ACC) { + pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + emitpcode(POC_ANDFW,popGet(AOP(right),offset)); + } else { + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("andwf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + emitpcode(POC_MOVFW,popGet(AOP(right),offset)); + emitpcode(POC_ANDFW,popGet(AOP(left),offset)); + } + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + } + } + } + release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -5457,299 +5456,299 @@ release : /*-----------------------------------------------------------------*/ static void genOr (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - int size, offset=0; - unsigned long lit = 0L; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp((left = IC_LEFT(ic)),ic,FALSE); - aopOp((right= IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - /* if left is a literal & right is not then exchange them */ - if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || - AOP_NEEDSACC(left)) { - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if result = right then exchange them */ - if(pic14_sameRegs(AOP(result),AOP(right))){ - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if right is bit then exchange them */ - if (AOP_TYPE(right) == AOP_CRY && - AOP_TYPE(left) != AOP_CRY){ - operand *tmp = right ; - right = left; - left = tmp; - } - - DEBUGpic14_AopType(__LINE__,left,right,result); - - if(AOP_TYPE(right) == AOP_LIT) - lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); - - size = AOP_SIZE(result); - - // if(bit | yy) - // xx = bit | yy; - if (AOP_TYPE(left) == AOP_CRY){ - if(AOP_TYPE(right) == AOP_LIT){ - // c = bit & literal; - if(lit){ - // lit != 0 => result = 1 - if(AOP_TYPE(result) == AOP_CRY){ - if(size) - emitpcode(POC_BSF, popGet(AOP(result),0)); - //pic14_emitcode("bsf","(%s >> 3), (%s & 7)", - // AOP(result)->aopu.aop_dir, - // AOP(result)->aopu.aop_dir); - else if(ifx) - continueIfTrue(ifx); - goto release; - } - } else { - // lit == 0 => result = left - if(size && pic14_sameRegs(AOP(result),AOP(left))) - goto release; - pic14_emitcode(";XXX mov","c,%s %s,%d",AOP(left)->aopu.aop_dir,__FILE__,__LINE__); - } - } else { - if (AOP_TYPE(right) == AOP_CRY){ - if(pic14_sameRegs(AOP(result),AOP(left))){ - // c = bit | bit; - emitpcode(POC_BCF, popGet(AOP(result),0)); - emitpcode(POC_BTFSC, popGet(AOP(right),0)); - emitpcode(POC_BSF, popGet(AOP(result),0)); - - pic14_emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(right)->aopu.aop_dir, - AOP(right)->aopu.aop_dir); - pic14_emitcode("bsf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - } else { - if( AOP_TYPE(result) == AOP_ACC) { - emitpcode(POC_MOVLW, popGetLit(0)); - emitpcode(POC_BTFSS, popGet(AOP(right),0)); - emitpcode(POC_BTFSC, popGet(AOP(left),0)); - emitpcode(POC_MOVLW, popGetLit(1)); - - } else { - - emitpcode(POC_BCF, popGet(AOP(result),0)); - emitpcode(POC_BTFSS, popGet(AOP(right),0)); - emitpcode(POC_BTFSC, popGet(AOP(left),0)); - emitpcode(POC_BSF, popGet(AOP(result),0)); - - pic14_emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - pic14_emitcode("btfss","(%s >> 3), (%s & 7)", - AOP(right)->aopu.aop_dir, - AOP(right)->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(left)->aopu.aop_dir, - AOP(left)->aopu.aop_dir); - pic14_emitcode("bsf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - } - } - } else { - // c = bit | val; - symbol *tlbl = newiTempLabel(NULL); - pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); - - - emitpcode(POC_BCF, popGet(AOP(result),0)); - if( AOP_TYPE(right) == AOP_ACC) { - emitpcode(POC_IORLW, popGetLit(0)); - emitSKPNZ; - emitpcode(POC_BTFSC, popGet(AOP(left),0)); - emitpcode(POC_BSF, popGet(AOP(result),0)); - } - - - - if(!((AOP_TYPE(result) == AOP_CRY) && ifx)) - pic14_emitcode(";XXX setb","c"); - pic14_emitcode(";XXX jb","%s,%05d_DS_", - AOP(left)->aopu.aop_dir,tlbl->key+100); - pic14_toBoolean(right); - pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); - if((AOP_TYPE(result) == AOP_CRY) && ifx){ - jmpTrueOrFalse(ifx, tlbl); - goto release; - } else { - CLRC; - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - } - } - } - // bit = c - // val = c - if(size) - pic14_outBitC(result); - // if(bit | ...) - else if((AOP_TYPE(result) == AOP_CRY) && ifx) - genIfxJump(ifx, "c"); - goto release ; - } - - // if(val | 0xZZ) - size = 0, ifx != FALSE - - // bit = val | 0xZZ - size = 1, ifx = FALSE - - if((AOP_TYPE(right) == AOP_LIT) && - (AOP_TYPE(result) == AOP_CRY) && - (AOP_TYPE(left) != AOP_CRY)){ - if(lit){ - pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); - // result = 1 - if(size) - pic14_emitcode(";XXX setb","%s",AOP(result)->aopu.aop_dir); - else - continueIfTrue(ifx); - goto release; - } else { - pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); - // lit = 0, result = boolean(left) - if(size) - pic14_emitcode(";XXX setb","c"); - pic14_toBoolean(right); - if(size){ - symbol *tlbl = newiTempLabel(NULL); - pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); - CLRC; - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - } else { - genIfxJump (ifx,"a"); - goto release; - } - } - pic14_outBitC(result); - goto release ; - } - - /* if left is same as result */ - if(pic14_sameRegs(AOP(result),AOP(left))){ - int know_W = -1; - for(;size--; offset++,lit>>=8) { - if(AOP_TYPE(right) == AOP_LIT){ - if((lit & 0xff) == 0) - /* or'ing with 0 has no effect */ - continue; - else { - int p = my_powof2(lit & 0xff); - if(p>=0) { - /* only one bit is set in the literal, so use a bsf instruction */ - emitpcode(POC_BSF, - newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0)); - } else { - if(know_W != (int)(lit & 0xff)) - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - know_W = lit & 0xff; - emitpcode(POC_IORWF, popGet(AOP(left),offset)); - } - - } - } else { - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_IORFW, popGet(AOP(right),offset)); - pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - } else { - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - emitpcode(POC_IORWF, popGet(AOP(left),offset)); - - pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); - - } - } - } - } else { - // left & result in different registers - if(AOP_TYPE(result) == AOP_CRY){ - // result = bit - // if(size), result in bit - // if(!size && ifx), conditional oper: if(left | right) - symbol *tlbl = newiTempLabel(NULL); - int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); - pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); - - - if(size) - pic14_emitcode(";XXX setb","c"); - while(sizer--){ - MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode(";XXX orl","a,%s", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); - offset++; - } - if(size){ - CLRC; - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_outBitC(result); - } else if(ifx) - jmpTrueOrFalse(ifx, tlbl); - } else for(;(size--);offset++){ - // normal case - // result = left & right - if(AOP_TYPE(right) == AOP_LIT){ - int t = (lit >> (offset*8)) & 0x0FFL; - switch(t) { - case 0x00: - if (AOP_TYPE(left) != AOP_ACC) { - emitpcode(POC_MOVFW, popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - - break; - default: - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_IORLW, popGetLit(t)); - } else { - emitpcode(POC_MOVLW, popGetLit(t)); - emitpcode(POC_IORFW, popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } - continue; - } - - // faster than result <- left, anl result,right - // and better if result is SFR - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_IORWF, popGet(AOP(right),offset)); - pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - } else { - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - emitpcode(POC_IORFW, popGet(AOP(left),offset)); - - pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("iorwf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - } - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); - } - } - + operand *left, *right, *result; + int size, offset=0; + unsigned long lit = 0L; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp((left = IC_LEFT(ic)),ic,FALSE); + aopOp((right= IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + /* if left is a literal & right is not then exchange them */ + if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || + AOP_NEEDSACC(left)) { + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if result = right then exchange them */ + if(pic14_sameRegs(AOP(result),AOP(right))){ + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if right is bit then exchange them */ + if (AOP_TYPE(right) == AOP_CRY && + AOP_TYPE(left) != AOP_CRY){ + operand *tmp = right ; + right = left; + left = tmp; + } + + DEBUGpic14_AopType(__LINE__,left,right,result); + + if(AOP_TYPE(right) == AOP_LIT) + lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); + + size = AOP_SIZE(result); + + // if(bit | yy) + // xx = bit | yy; + if (AOP_TYPE(left) == AOP_CRY){ + if(AOP_TYPE(right) == AOP_LIT){ + // c = bit & literal; + if(lit){ + // lit != 0 => result = 1 + if(AOP_TYPE(result) == AOP_CRY){ + if(size) + emitpcode(POC_BSF, popGet(AOP(result),0)); + //pic14_emitcode("bsf","(%s >> 3), (%s & 7)", + // AOP(result)->aopu.aop_dir, + // AOP(result)->aopu.aop_dir); + else if(ifx) + continueIfTrue(ifx); + goto release; + } + } else { + // lit == 0 => result = left + if(size && pic14_sameRegs(AOP(result),AOP(left))) + goto release; + pic14_emitcode(";XXX mov","c,%s %s,%d",AOP(left)->aopu.aop_dir,__FILE__,__LINE__); + } + } else { + if (AOP_TYPE(right) == AOP_CRY){ + if(pic14_sameRegs(AOP(result),AOP(left))){ + // c = bit | bit; + emitpcode(POC_BCF, popGet(AOP(result),0)); + emitpcode(POC_BTFSC, popGet(AOP(right),0)); + emitpcode(POC_BSF, popGet(AOP(result),0)); + + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(right)->aopu.aop_dir, + AOP(right)->aopu.aop_dir); + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + } else { + if( AOP_TYPE(result) == AOP_ACC) { + emitpcode(POC_MOVLW, popGetLit(0)); + emitpcode(POC_BTFSS, popGet(AOP(right),0)); + emitpcode(POC_BTFSC, popGet(AOP(left),0)); + emitpcode(POC_MOVLW, popGetLit(1)); + + } else { + + emitpcode(POC_BCF, popGet(AOP(result),0)); + emitpcode(POC_BTFSS, popGet(AOP(right),0)); + emitpcode(POC_BTFSC, popGet(AOP(left),0)); + emitpcode(POC_BSF, popGet(AOP(result),0)); + + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + pic14_emitcode("btfss","(%s >> 3), (%s & 7)", + AOP(right)->aopu.aop_dir, + AOP(right)->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(left)->aopu.aop_dir, + AOP(left)->aopu.aop_dir); + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + } + } + } else { + // c = bit | val; + symbol *tlbl = newiTempLabel(NULL); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + + + emitpcode(POC_BCF, popGet(AOP(result),0)); + if( AOP_TYPE(right) == AOP_ACC) { + emitpcode(POC_IORLW, popGetLit(0)); + emitSKPNZ; + emitpcode(POC_BTFSC, popGet(AOP(left),0)); + emitpcode(POC_BSF, popGet(AOP(result),0)); + } + + + + if(!((AOP_TYPE(result) == AOP_CRY) && ifx)) + pic14_emitcode(";XXX setb","c"); + pic14_emitcode(";XXX jb","%s,%05d_DS_", + AOP(left)->aopu.aop_dir,tlbl->key+100); + pic14_toBoolean(right); + pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); + if((AOP_TYPE(result) == AOP_CRY) && ifx){ + jmpTrueOrFalse(ifx, tlbl); + goto release; + } else { + CLRC; + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + } + } + } + // bit = c + // val = c + if(size) + pic14_outBitC(result); + // if(bit | ...) + else if((AOP_TYPE(result) == AOP_CRY) && ifx) + genIfxJump(ifx, "c"); + goto release ; + } + + // if(val | 0xZZ) - size = 0, ifx != FALSE - + // bit = val | 0xZZ - size = 1, ifx = FALSE - + if((AOP_TYPE(right) == AOP_LIT) && + (AOP_TYPE(result) == AOP_CRY) && + (AOP_TYPE(left) != AOP_CRY)){ + if(lit){ + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + // result = 1 + if(size) + pic14_emitcode(";XXX setb","%s",AOP(result)->aopu.aop_dir); + else + continueIfTrue(ifx); + goto release; + } else { + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + // lit = 0, result = boolean(left) + if(size) + pic14_emitcode(";XXX setb","c"); + pic14_toBoolean(right); + if(size){ + symbol *tlbl = newiTempLabel(NULL); + pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); + CLRC; + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + } else { + genIfxJump (ifx,"a"); + goto release; + } + } + pic14_outBitC(result); + goto release ; + } + + /* if left is same as result */ + if(pic14_sameRegs(AOP(result),AOP(left))){ + int know_W = -1; + for(;size--; offset++,lit>>=8) { + if(AOP_TYPE(right) == AOP_LIT){ + if((lit & 0xff) == 0) + /* or'ing with 0 has no effect */ + continue; + else { + int p = my_powof2(lit & 0xff); + if(p>=0) { + /* only one bit is set in the literal, so use a bsf instruction */ + emitpcode(POC_BSF, + newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0)); + } else { + if(know_W != (int)(lit & 0xff)) + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + know_W = lit & 0xff; + emitpcode(POC_IORWF, popGet(AOP(left),offset)); + } + + } + } else { + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_IORFW, popGet(AOP(right),offset)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + } else { + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + emitpcode(POC_IORWF, popGet(AOP(left),offset)); + + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); + + } + } + } + } else { + // left & result in different registers + if(AOP_TYPE(result) == AOP_CRY){ + // result = bit + // if(size), result in bit + // if(!size && ifx), conditional oper: if(left | right) + symbol *tlbl = newiTempLabel(NULL); + int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + + + if(size) + pic14_emitcode(";XXX setb","c"); + while(sizer--){ + MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode(";XXX orl","a,%s", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); + offset++; + } + if(size){ + CLRC; + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); + } else if(ifx) + jmpTrueOrFalse(ifx, tlbl); + } else for(;(size--);offset++){ + // normal case + // result = left & right + if(AOP_TYPE(right) == AOP_LIT){ + int t = (lit >> (offset*8)) & 0x0FFL; + switch(t) { + case 0x00: + if (AOP_TYPE(left) != AOP_ACC) { + emitpcode(POC_MOVFW, popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + + break; + default: + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_IORLW, popGetLit(t)); + } else { + emitpcode(POC_MOVLW, popGetLit(t)); + emitpcode(POC_IORFW, popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } + continue; + } + + // faster than result <- left, anl result,right + // and better if result is SFR + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_IORWF, popGet(AOP(right),offset)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + } else { + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + emitpcode(POC_IORFW, popGet(AOP(left),offset)); + + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + } + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + } + } + release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -5757,246 +5756,246 @@ release : /*-----------------------------------------------------------------*/ static void genXor (iCode *ic, iCode *ifx) { - operand *left, *right, *result; - int size, offset=0; - unsigned long lit = 0L; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp((left = IC_LEFT(ic)),ic,FALSE); - aopOp((right= IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - /* if left is a literal & right is not || - if left needs acc & right does not */ - if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || - (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) { - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if result = right then exchange them */ - if(pic14_sameRegs(AOP(result),AOP(right))){ - operand *tmp = right ; - right = left; - left = tmp; - } - - /* if right is bit then exchange them */ - if (AOP_TYPE(right) == AOP_CRY && - AOP_TYPE(left) != AOP_CRY){ - operand *tmp = right ; - right = left; - left = tmp; - } - if(AOP_TYPE(right) == AOP_LIT) - lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); - - size = AOP_SIZE(result); - - // if(bit ^ yy) - // xx = bit ^ yy; - if (AOP_TYPE(left) == AOP_CRY){ - if(AOP_TYPE(right) == AOP_LIT){ - // c = bit & literal; - if(lit>>1){ - // lit>>1 != 0 => result = 1 - if(AOP_TYPE(result) == AOP_CRY){ - if(size) - {emitpcode(POC_BSF, popGet(AOP(result),offset)); - pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);} - else if(ifx) - continueIfTrue(ifx); - goto release; - } - pic14_emitcode("setb","c"); - } else{ - // lit == (0 or 1) - if(lit == 0){ - // lit == 0, result = left - if(size && pic14_sameRegs(AOP(result),AOP(left))) - goto release; - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - } else{ - // lit == 1, result = not(left) - if(size && pic14_sameRegs(AOP(result),AOP(left))){ - emitpcode(POC_MOVLW, popGet(AOP(result),offset)); - emitpcode(POC_XORWF, popGet(AOP(result),offset)); - pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir); - goto release; - } else { - pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - pic14_emitcode("cpl","c"); - } - } - } - - } else { - // right != literal - symbol *tlbl = newiTempLabel(NULL); - if (AOP_TYPE(right) == AOP_CRY){ - // c = bit ^ bit; - pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); - } - else{ - int sizer = AOP_SIZE(right); - // c = bit ^ val - // if val>>1 != 0, result = 1 - pic14_emitcode("setb","c"); - while(sizer){ - MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE)); - if(sizer == 1) - // test the msb of the lsb - pic14_emitcode("anl","a,#0xfe"); - pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); - sizer--; - } - // val = (0,1) - pic14_emitcode("rrc","a"); - } - pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100)); - pic14_emitcode("cpl","c"); - pic14_emitcode("","%05d_DS_:",(tlbl->key+100)); - } - // bit = c - // val = c - if(size) - pic14_outBitC(result); - // if(bit | ...) - else if((AOP_TYPE(result) == AOP_CRY) && ifx) - genIfxJump(ifx, "c"); - goto release ; - } - - if(pic14_sameRegs(AOP(result),AOP(left))){ - /* if left is same as result */ - for(;size--; offset++) { - if(AOP_TYPE(right) == AOP_LIT){ - int t = (lit >> (offset*8)) & 0x0FFL; - if(t == 0x00L) - continue; - else - if (IS_AOP_PREG(left)) { - MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); - aopPut(AOP(result),"a",offset); - } else { - emitpcode(POC_MOVLW, popGetLit(t)); - emitpcode(POC_XORWF,popGet(AOP(left),offset)); - pic14_emitcode("xrl","%s,%s", - aopGet(AOP(left),offset,FALSE,TRUE), - aopGet(AOP(right),offset,FALSE,FALSE)); - } - } else { - if (AOP_TYPE(left) == AOP_ACC) - pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE)); - else { - emitpcode(POC_MOVFW,popGet(AOP(right),offset)); - emitpcode(POC_XORWF,popGet(AOP(left),offset)); - /* - if (IS_AOP_PREG(left)) { - pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); - aopPut(AOP(result),"a",offset); - } else - pic14_emitcode("xrl","%s,a", - aopGet(AOP(left),offset,FALSE,TRUE)); - */ - } - } - } - } else { - // left & result in different registers - if(AOP_TYPE(result) == AOP_CRY){ - // result = bit - // if(size), result in bit - // if(!size && ifx), conditional oper: if(left ^ right) - symbol *tlbl = newiTempLabel(NULL); - int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); - if(size) - pic14_emitcode("setb","c"); - while(sizer--){ - if((AOP_TYPE(right) == AOP_LIT) && - (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){ - MOVA(aopGet(AOP(left),offset,FALSE,FALSE)); - } else { - MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("xrl","a,%s", - aopGet(AOP(left),offset,FALSE,FALSE)); - } - pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); - offset++; - } - if(size){ - CLRC; - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_outBitC(result); - } else if(ifx) - jmpTrueOrFalse(ifx, tlbl); - } else for(;(size--);offset++){ - // normal case - // result = left & right - if(AOP_TYPE(right) == AOP_LIT){ - int t = (lit >> (offset*8)) & 0x0FFL; - switch(t) { - case 0x00: - if (AOP_TYPE(left) != AOP_ACC) { - emitpcode(POC_MOVFW,popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - pic14_emitcode("movf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s", - aopGet(AOP(result),offset,FALSE,FALSE)); - break; - case 0xff: - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_XORLW, popGetLit(t)); - } else { - emitpcode(POC_COMFW,popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - break; - default: - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_XORLW, popGetLit(t)); - } else { - emitpcode(POC_MOVLW, popGetLit(t)); - emitpcode(POC_XORFW,popGet(AOP(left),offset)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - pic14_emitcode("movlw","0x%x",t); - pic14_emitcode("xorwf","%s,w", - aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s", - aopGet(AOP(result),offset,FALSE,FALSE)); - - } - continue; - } - - // faster than result <- left, anl result,right - // and better if result is SFR - if (AOP_TYPE(left) == AOP_ACC) { - emitpcode(POC_XORFW,popGet(AOP(right),offset)); - pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - } else { - emitpcode(POC_MOVFW,popGet(AOP(right),offset)); - emitpcode(POC_XORFW,popGet(AOP(left),offset)); - pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - } - if ( AOP_TYPE(result) != AOP_ACC){ - emitpcode(POC_MOVWF,popGet(AOP(result),offset)); - pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); - } - } - } - + operand *left, *right, *result; + int size, offset=0; + unsigned long lit = 0L; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp((left = IC_LEFT(ic)),ic,FALSE); + aopOp((right= IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + /* if left is a literal & right is not || + if left needs acc & right does not */ + if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) || + (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) { + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if result = right then exchange them */ + if(pic14_sameRegs(AOP(result),AOP(right))){ + operand *tmp = right ; + right = left; + left = tmp; + } + + /* if right is bit then exchange them */ + if (AOP_TYPE(right) == AOP_CRY && + AOP_TYPE(left) != AOP_CRY){ + operand *tmp = right ; + right = left; + left = tmp; + } + if(AOP_TYPE(right) == AOP_LIT) + lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit); + + size = AOP_SIZE(result); + + // if(bit ^ yy) + // xx = bit ^ yy; + if (AOP_TYPE(left) == AOP_CRY){ + if(AOP_TYPE(right) == AOP_LIT){ + // c = bit & literal; + if(lit>>1){ + // lit>>1 != 0 => result = 1 + if(AOP_TYPE(result) == AOP_CRY){ + if(size) + {emitpcode(POC_BSF, popGet(AOP(result),offset)); + pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);} + else if(ifx) + continueIfTrue(ifx); + goto release; + } + pic14_emitcode("setb","c"); + } else{ + // lit == (0 or 1) + if(lit == 0){ + // lit == 0, result = left + if(size && pic14_sameRegs(AOP(result),AOP(left))) + goto release; + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + } else{ + // lit == 1, result = not(left) + if(size && pic14_sameRegs(AOP(result),AOP(left))){ + emitpcode(POC_MOVLW, popGet(AOP(result),offset)); + emitpcode(POC_XORWF, popGet(AOP(result),offset)); + pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir); + goto release; + } else { + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); + } + } + } + + } else { + // right != literal + symbol *tlbl = newiTempLabel(NULL); + if (AOP_TYPE(right) == AOP_CRY){ + // c = bit ^ bit; + pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); + } + else{ + int sizer = AOP_SIZE(right); + // c = bit ^ val + // if val>>1 != 0, result = 1 + pic14_emitcode("setb","c"); + while(sizer){ + MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE)); + if(sizer == 1) + // test the msb of the lsb + pic14_emitcode("anl","a,#0xfe"); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); + sizer--; + } + // val = (0,1) + pic14_emitcode("rrc","a"); + } + pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100)); + pic14_emitcode("cpl","c"); + pic14_emitcode("","%05d_DS_:",(tlbl->key+100)); + } + // bit = c + // val = c + if(size) + pic14_outBitC(result); + // if(bit | ...) + else if((AOP_TYPE(result) == AOP_CRY) && ifx) + genIfxJump(ifx, "c"); + goto release ; + } + + if(pic14_sameRegs(AOP(result),AOP(left))){ + /* if left is same as result */ + for(;size--; offset++) { + if(AOP_TYPE(right) == AOP_LIT){ + int t = (lit >> (offset*8)) & 0x0FFL; + if(t == 0x00L) + continue; + else + if (IS_AOP_PREG(left)) { + MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); + aopPut(AOP(result),"a",offset); + } else { + emitpcode(POC_MOVLW, popGetLit(t)); + emitpcode(POC_XORWF,popGet(AOP(left),offset)); + pic14_emitcode("xrl","%s,%s", + aopGet(AOP(left),offset,FALSE,TRUE), + aopGet(AOP(right),offset,FALSE,FALSE)); + } + } else { + if (AOP_TYPE(left) == AOP_ACC) + pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE)); + else { + emitpcode(POC_MOVFW,popGet(AOP(right),offset)); + emitpcode(POC_XORWF,popGet(AOP(left),offset)); + /* + if (IS_AOP_PREG(left)) { + pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); + aopPut(AOP(result),"a",offset); + } else + pic14_emitcode("xrl","%s,a", + aopGet(AOP(left),offset,FALSE,TRUE)); + */ + } + } + } + } else { + // left & result in different registers + if(AOP_TYPE(result) == AOP_CRY){ + // result = bit + // if(size), result in bit + // if(!size && ifx), conditional oper: if(left ^ right) + symbol *tlbl = newiTempLabel(NULL); + int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); + if(size) + pic14_emitcode("setb","c"); + while(sizer--){ + if((AOP_TYPE(right) == AOP_LIT) && + (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){ + MOVA(aopGet(AOP(left),offset,FALSE,FALSE)); + } else { + MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("xrl","a,%s", + aopGet(AOP(left),offset,FALSE,FALSE)); + } + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); + offset++; + } + if(size){ + CLRC; + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); + } else if(ifx) + jmpTrueOrFalse(ifx, tlbl); + } else for(;(size--);offset++){ + // normal case + // result = left & right + if(AOP_TYPE(right) == AOP_LIT){ + int t = (lit >> (offset*8)) & 0x0FFL; + switch(t) { + case 0x00: + if (AOP_TYPE(left) != AOP_ACC) { + emitpcode(POC_MOVFW,popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + pic14_emitcode("movf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", + aopGet(AOP(result),offset,FALSE,FALSE)); + break; + case 0xff: + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_XORLW, popGetLit(t)); + } else { + emitpcode(POC_COMFW,popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + break; + default: + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_XORLW, popGetLit(t)); + } else { + emitpcode(POC_MOVLW, popGetLit(t)); + emitpcode(POC_XORFW,popGet(AOP(left),offset)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + pic14_emitcode("movlw","0x%x",t); + pic14_emitcode("xorwf","%s,w", + aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", + aopGet(AOP(result),offset,FALSE,FALSE)); + + } + continue; + } + + // faster than result <- left, anl result,right + // and better if result is SFR + if (AOP_TYPE(left) == AOP_ACC) { + emitpcode(POC_XORFW,popGet(AOP(right),offset)); + pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + } else { + emitpcode(POC_MOVFW,popGet(AOP(right),offset)); + emitpcode(POC_XORFW,popGet(AOP(left),offset)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + } + if ( AOP_TYPE(result) != AOP_ACC){ + emitpcode(POC_MOVWF,popGet(AOP(result),offset)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + } + } + } + release : - freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -6004,40 +6003,40 @@ release : /*-----------------------------------------------------------------*/ static void genInline (iCode *ic) { - char *buffer, *bp, *bp1; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - _G.inLine += (!options.asmpeep); - - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy(buffer,IC_INLINE(ic)); - - /* emit each line as a code */ - while (*bp) { - if (*bp == '\n') { - *bp++ = '\0'; - - if(*bp1) - addpCode2pBlock(pb,AssembleLine(bp1)); - bp1 = bp; - } else { - if (*bp == ':') { - bp++; - *bp = '\0'; - bp++; - pic14_emitcode(bp1,""); - bp1 = bp; - } else - bp++; - } - } - if ((bp1 != bp) && *bp1) - addpCode2pBlock(pb,AssembleLine(bp1)); - - Safe_free(buffer); - - _G.inLine -= (!options.asmpeep); + char *buffer, *bp, *bp1; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + _G.inLine += (!options.asmpeep); + + buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); + strcpy(buffer,IC_INLINE(ic)); + + /* emit each line as a code */ + while (*bp) { + if (*bp == '\n') { + *bp++ = '\0'; + + if(*bp1) + addpCode2pBlock(pb,AssembleLine(bp1)); + bp1 = bp; + } else { + if (*bp == ':') { + bp++; + *bp = '\0'; + bp++; + pic14_emitcode(bp1,""); + bp1 = bp; + } else + bp++; + } + } + if ((bp1 != bp) && *bp1) + addpCode2pBlock(pb,AssembleLine(bp1)); + + Safe_free(buffer); + + _G.inLine -= (!options.asmpeep); } /*-----------------------------------------------------------------*/ @@ -6045,40 +6044,40 @@ static void genInline (iCode *ic) /*-----------------------------------------------------------------*/ static void genRRC (iCode *ic) { - operand *left , *result ; - int size, offset = 0, same; - - /* rotate right with carry */ - left = IC_LEFT(ic); - result=IC_RESULT(ic); - aopOp (left,ic,FALSE); - aopOp (result,ic,FALSE); - - DEBUGpic14_AopType(__LINE__,left,NULL,result); - - same = pic14_sameRegs(AOP(result),AOP(left)); - - size = AOP_SIZE(result); - - /* get the lsb and put it into the carry */ - emitpcode(POC_RRFW, popGet(AOP(left),size-1)); - - offset = 0 ; - - while(size--) { - - if(same) { - emitpcode(POC_RRF, popGet(AOP(left),offset)); - } else { - emitpcode(POC_RRFW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } - - offset++; - } - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + operand *left , *result ; + int size, offset = 0, same; + + /* rotate right with carry */ + left = IC_LEFT(ic); + result=IC_RESULT(ic); + aopOp (left,ic,FALSE); + aopOp (result,ic,FALSE); + + DEBUGpic14_AopType(__LINE__,left,NULL,result); + + same = pic14_sameRegs(AOP(result),AOP(left)); + + size = AOP_SIZE(result); + + /* get the lsb and put it into the carry */ + emitpcode(POC_RRFW, popGet(AOP(left),size-1)); + + offset = 0 ; + + while(size--) { + + if(same) { + emitpcode(POC_RRF, popGet(AOP(left),offset)); + } else { + emitpcode(POC_RRFW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } + + offset++; + } + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -6086,44 +6085,44 @@ static void genRRC (iCode *ic) /*-----------------------------------------------------------------*/ static void genRLC (iCode *ic) { - operand *left , *result ; - int size, offset = 0; - int same; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* rotate right with carry */ - left = IC_LEFT(ic); - result=IC_RESULT(ic); - aopOp (left,ic,FALSE); - aopOp (result,ic,FALSE); - - DEBUGpic14_AopType(__LINE__,left,NULL,result); - - same = pic14_sameRegs(AOP(result),AOP(left)); - - /* move it to the result */ - size = AOP_SIZE(result); - - /* get the msb and put it into the carry */ - emitpcode(POC_RLFW, popGet(AOP(left),size-1)); - - offset = 0 ; - - while(size--) { - - if(same) { - emitpcode(POC_RLF, popGet(AOP(left),offset)); - } else { - emitpcode(POC_RLFW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } - - offset++; - } - - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + operand *left , *result ; + int size, offset = 0; + int same; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* rotate right with carry */ + left = IC_LEFT(ic); + result=IC_RESULT(ic); + aopOp (left,ic,FALSE); + aopOp (result,ic,FALSE); + + DEBUGpic14_AopType(__LINE__,left,NULL,result); + + same = pic14_sameRegs(AOP(result),AOP(left)); + + /* move it to the result */ + size = AOP_SIZE(result); + + /* get the msb and put it into the carry */ + emitpcode(POC_RLFW, popGet(AOP(left),size-1)); + + offset = 0 ; + + while(size--) { + + if(same) { + emitpcode(POC_RLF, popGet(AOP(left),offset)); + } else { + emitpcode(POC_RLFW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } + + offset++; + } + + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -6131,28 +6130,28 @@ static void genRLC (iCode *ic) /*-----------------------------------------------------------------*/ static void genGetHbit (iCode *ic) { - operand *left, *result; - left = IC_LEFT(ic); - result=IC_RESULT(ic); - aopOp (left,ic,FALSE); - aopOp (result,ic,FALSE); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* get the highest order byte into a */ - MOVA(aopGet(AOP(left),AOP_SIZE(left) - 1,FALSE,FALSE)); - if(AOP_TYPE(result) == AOP_CRY){ - pic14_emitcode("rlc","a"); - pic14_outBitC(result); - } - else{ - pic14_emitcode("rl","a"); - pic14_emitcode("anl","a,#0x01"); - pic14_outAcc(result); - } - - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + operand *left, *result; + left = IC_LEFT(ic); + result=IC_RESULT(ic); + aopOp (left,ic,FALSE); + aopOp (result,ic,FALSE); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* get the highest order byte into a */ + MOVA(aopGet(AOP(left),AOP_SIZE(left) - 1,FALSE,FALSE)); + if(AOP_TYPE(result) == AOP_CRY){ + pic14_emitcode("rlc","a"); + pic14_outBitC(result); + } + else{ + pic14_emitcode("rl","a"); + pic14_emitcode("anl","a,#0x01"); + pic14_outAcc(result); + } + + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -6160,37 +6159,37 @@ static void genGetHbit (iCode *ic) /*-----------------------------------------------------------------*/ static void AccRol (int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - shCount &= 0x0007; // shCount : 0..7 - switch(shCount){ - case 0 : - break; - case 1 : - pic14_emitcode("rl","a"); - break; - case 2 : - pic14_emitcode("rl","a"); - pic14_emitcode("rl","a"); - break; - case 3 : - pic14_emitcode("swap","a"); - pic14_emitcode("rr","a"); - break; - case 4 : - pic14_emitcode("swap","a"); - break; - case 5 : - pic14_emitcode("swap","a"); - pic14_emitcode("rl","a"); - break; - case 6 : - pic14_emitcode("rr","a"); - pic14_emitcode("rr","a"); - break; - case 7 : - pic14_emitcode("rr","a"); - break; - } + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + shCount &= 0x0007; // shCount : 0..7 + switch(shCount){ + case 0 : + break; + case 1 : + pic14_emitcode("rl","a"); + break; + case 2 : + pic14_emitcode("rl","a"); + pic14_emitcode("rl","a"); + break; + case 3 : + pic14_emitcode("swap","a"); + pic14_emitcode("rr","a"); + break; + case 4 : + pic14_emitcode("swap","a"); + break; + case 5 : + pic14_emitcode("swap","a"); + pic14_emitcode("rl","a"); + break; + case 6 : + pic14_emitcode("rr","a"); + pic14_emitcode("rr","a"); + break; + case 7 : + pic14_emitcode("rr","a"); + break; + } } /*-----------------------------------------------------------------*/ @@ -6198,21 +6197,21 @@ static void AccRol (int shCount) /*-----------------------------------------------------------------*/ static void AccLsh (int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(shCount != 0){ - if(shCount == 1) - pic14_emitcode("add","a,acc"); - else - if(shCount == 2) { - pic14_emitcode("add","a,acc"); - pic14_emitcode("add","a,acc"); - } else { - /* rotate left accumulator */ - AccRol(shCount); - /* and kill the lower order bits */ - pic14_emitcode("anl","a,#0x%02x", SLMask[shCount]); - } - } + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(shCount != 0){ + if(shCount == 1) + pic14_emitcode("add","a,acc"); + else + if(shCount == 2) { + pic14_emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); + } else { + /* rotate left accumulator */ + AccRol(shCount); + /* and kill the lower order bits */ + pic14_emitcode("anl","a,#0x%02x", SLMask[shCount]); + } + } } /*-----------------------------------------------------------------*/ @@ -6220,18 +6219,18 @@ static void AccLsh (int shCount) /*-----------------------------------------------------------------*/ static void AccRsh (int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(shCount != 0){ - if(shCount == 1){ - CLRC; - pic14_emitcode("rrc","a"); - } else { - /* rotate right accumulator */ - AccRol(8 - shCount); - /* and kill the higher order bits */ - pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); - } - } + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(shCount != 0){ + if(shCount == 1){ + CLRC; + pic14_emitcode("rrc","a"); + } else { + /* rotate right accumulator */ + AccRol(8 - shCount); + /* and kill the higher order bits */ + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); + } + } } #if 0 @@ -6240,604 +6239,604 @@ static void AccRsh (int shCount) /*-----------------------------------------------------------------*/ static void AccSRsh (int shCount) { - symbol *tlbl ; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(shCount != 0){ - if(shCount == 1){ - pic14_emitcode("mov","c,acc.7"); - pic14_emitcode("rrc","a"); - } else if(shCount == 2){ - pic14_emitcode("mov","c,acc.7"); - pic14_emitcode("rrc","a"); - pic14_emitcode("mov","c,acc.7"); - pic14_emitcode("rrc","a"); - } else { - tlbl = newiTempLabel(NULL); - /* rotate right accumulator */ - AccRol(8 - shCount); - /* and kill the higher order bits */ - pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); - pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); - pic14_emitcode("orl","a,#0x%02x", - (unsigned char)~SRMask[shCount]); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - } - } + symbol *tlbl ; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(shCount != 0){ + if(shCount == 1){ + pic14_emitcode("mov","c,acc.7"); + pic14_emitcode("rrc","a"); + } else if(shCount == 2){ + pic14_emitcode("mov","c,acc.7"); + pic14_emitcode("rrc","a"); + pic14_emitcode("mov","c,acc.7"); + pic14_emitcode("rrc","a"); + } else { + tlbl = newiTempLabel(NULL); + /* rotate right accumulator */ + AccRol(8 - shCount); + /* and kill the higher order bits */ + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); + pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); + pic14_emitcode("orl","a,#0x%02x", + (unsigned char)~SRMask[shCount]); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + } + } } #endif /*-----------------------------------------------------------------*/ /* shiftR1Left2Result - shift right one byte from left to result */ /*-----------------------------------------------------------------*/ static void shiftR1Left2ResultSigned (operand *left, int offl, - operand *result, int offr, - int shCount) -{ - int same; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); - - switch(shCount) { - case 1: - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - if(same) - emitpcode(POC_RRF, popGet(AOP(result),offr)); - else { - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - - break; - case 2: - - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - if(same) - emitpcode(POC_RRF, popGet(AOP(result),offr)); - else { - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - - break; - - case 3: - if(same) - emitpcode(POC_SWAPF, popGet(AOP(result),offr)); - else { - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_ANDLW, popGetLit(0x1f)); - - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0)); - emitpcode(POC_IORLW, popGetLit(0xe0)); - - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - break; - - case 4: - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x0f)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); - emitpcode(POC_IORLW, popGetLit(0xf0)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - break; - case 5: - if(same) { - emitpcode(POC_SWAPF, popGet(AOP(result),offr)); - } else { - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - emitpcode(POC_RRFW, popGet(AOP(result),offr)); - emitpcode(POC_ANDLW, popGetLit(0x07)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0)); - emitpcode(POC_IORLW, popGetLit(0xf8)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - break; - - case 6: - if(same) { - emitpcode(POC_MOVLW, popGetLit(0x00)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); - emitpcode(POC_MOVLW, popGetLit(0xfe)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0)); - emitpcode(POC_IORLW, popGetLit(0x01)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } else { - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),offr)); - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0)); - emitpcode(POC_BCF, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),0,0)); - } - break; - - case 7: - if(same) { - emitpcode(POC_MOVLW, popGetLit(0x00)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); - emitpcode(POC_MOVLW, popGetLit(0xff)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } else { - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),offr)); - } - - default: - break; - } + operand *result, int offr, + int shCount) +{ + int same; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); + + switch(shCount) { + case 1: + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + if(same) + emitpcode(POC_RRF, popGet(AOP(result),offr)); + else { + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + + break; + case 2: + + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + if(same) + emitpcode(POC_RRF, popGet(AOP(result),offr)); + else { + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + + break; + + case 3: + if(same) + emitpcode(POC_SWAPF, popGet(AOP(result),offr)); + else { + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_ANDLW, popGetLit(0x1f)); + + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0)); + emitpcode(POC_IORLW, popGetLit(0xe0)); + + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + break; + + case 4: + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x0f)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + emitpcode(POC_IORLW, popGetLit(0xf0)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + break; + case 5: + if(same) { + emitpcode(POC_SWAPF, popGet(AOP(result),offr)); + } else { + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + emitpcode(POC_RRFW, popGet(AOP(result),offr)); + emitpcode(POC_ANDLW, popGetLit(0x07)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0)); + emitpcode(POC_IORLW, popGetLit(0xf8)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + break; + + case 6: + if(same) { + emitpcode(POC_MOVLW, popGetLit(0x00)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + emitpcode(POC_MOVLW, popGetLit(0xfe)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0)); + emitpcode(POC_IORLW, popGetLit(0x01)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } else { + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),offr)); + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0)); + emitpcode(POC_BCF, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),0,0)); + } + break; + + case 7: + if(same) { + emitpcode(POC_MOVLW, popGetLit(0x00)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); + emitpcode(POC_MOVLW, popGetLit(0xff)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } else { + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),offr)); + } + + default: + break; + } } /*-----------------------------------------------------------------*/ /* shiftR1Left2Result - shift right one byte from left to result */ /*-----------------------------------------------------------------*/ static void shiftR1Left2Result (operand *left, int offl, - operand *result, int offr, - int shCount, int sign) -{ - int same; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); - - /* Copy the msb into the carry if signed. */ - if(sign) { - shiftR1Left2ResultSigned(left,offl,result,offr,shCount); - return; - } - - - - switch(shCount) { - case 1: - emitCLRC; - if(same) - emitpcode(POC_RRF, popGet(AOP(result),offr)); - else { - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - break; - case 2: - emitCLRC; - if(same) { - emitpcode(POC_RRF, popGet(AOP(result),offr)); - } else { - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - emitCLRC; - emitpcode(POC_RRF, popGet(AOP(result),offr)); - - break; - case 3: - if(same) - emitpcode(POC_SWAPF, popGet(AOP(result),offr)); - else { - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_ANDLW, popGetLit(0x1f)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - break; - - case 4: - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x0f)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - break; - - case 5: - emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x0f)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - emitCLRC; - emitpcode(POC_RRF, popGet(AOP(result),offr)); - - break; - case 6: - - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x80)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - break; - - case 7: - - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - - break; - - default: - break; - } + operand *result, int offr, + int shCount, int sign) +{ + int same; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); + + /* Copy the msb into the carry if signed. */ + if(sign) { + shiftR1Left2ResultSigned(left,offl,result,offr,shCount); + return; + } + + + + switch(shCount) { + case 1: + emitCLRC; + if(same) + emitpcode(POC_RRF, popGet(AOP(result),offr)); + else { + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + break; + case 2: + emitCLRC; + if(same) { + emitpcode(POC_RRF, popGet(AOP(result),offr)); + } else { + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + emitCLRC; + emitpcode(POC_RRF, popGet(AOP(result),offr)); + + break; + case 3: + if(same) + emitpcode(POC_SWAPF, popGet(AOP(result),offr)); + else { + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_ANDLW, popGetLit(0x1f)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + break; + + case 4: + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x0f)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + break; + + case 5: + emitpcode(POC_SWAPFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x0f)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + emitCLRC; + emitpcode(POC_RRF, popGet(AOP(result),offr)); + + break; + case 6: + + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x80)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + break; + + case 7: + + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + + break; + + default: + break; + } } /*-----------------------------------------------------------------*/ /* shiftL1Left2Result - shift left one byte from left to result */ /*-----------------------------------------------------------------*/ static void shiftL1Left2Result (operand *left, int offl, - operand *result, int offr, int shCount) -{ - int same; - - // char *l; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - same = ((left == result) || (AOP(left) == AOP(result))) && (offl==offr); - DEBUGpic14_emitcode ("; ***","same = %d",same); - // l = aopGet(AOP(left),offl,FALSE,FALSE); - // MOVA(l); - /* shift left accumulator */ - //AccLsh(shCount); // don't comment out just yet... - // aopPut(AOP(result),"a",offr); - - switch(shCount) { - case 1: - /* Shift left 1 bit position */ - emitpcode(POC_MOVFW, popGet(AOP(left),offl)); - if(same) { - emitpcode(POC_ADDWF, popGet(AOP(left),offl)); - } else { - emitpcode(POC_ADDFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - break; - case 2: - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW,popGetLit(0x7e)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - break; - case 3: - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_ANDLW,popGetLit(0x3e)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - break; - case 4: - emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - break; - case 5: - emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - break; - case 6: - emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x30)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - break; - case 7: - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - break; - - default: - DEBUGpic14_emitcode ("; ***","%s %d, shift count is %d",__FUNCTION__,__LINE__,shCount); - } - + operand *result, int offr, int shCount) +{ + int same; + + // char *l; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + same = ((left == result) || (AOP(left) == AOP(result))) && (offl==offr); + DEBUGpic14_emitcode ("; ***","same = %d",same); + // l = aopGet(AOP(left),offl,FALSE,FALSE); + // MOVA(l); + /* shift left accumulator */ + //AccLsh(shCount); // don't comment out just yet... + // aopPut(AOP(result),"a",offr); + + switch(shCount) { + case 1: + /* Shift left 1 bit position */ + emitpcode(POC_MOVFW, popGet(AOP(left),offl)); + if(same) { + emitpcode(POC_ADDWF, popGet(AOP(left),offl)); + } else { + emitpcode(POC_ADDFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + break; + case 2: + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW,popGetLit(0x7e)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + break; + case 3: + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_ANDLW,popGetLit(0x3e)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + break; + case 4: + emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + break; + case 5: + emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + break; + case 6: + emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x30)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + break; + case 7: + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + break; + + default: + DEBUGpic14_emitcode ("; ***","%s %d, shift count is %d",__FUNCTION__,__LINE__,shCount); + } + } /*-----------------------------------------------------------------*/ /* movLeft2Result - move byte from left to result */ /*-----------------------------------------------------------------*/ static void movLeft2Result (operand *left, int offl, - operand *result, int offr) -{ - char *l; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(!pic14_sameRegs(AOP(left),AOP(result)) || (offl != offr)){ - l = aopGet(AOP(left),offl,FALSE,FALSE); - - if (*l == '@' && (IS_AOP_PREG(result))) { - pic14_emitcode("mov","a,%s",l); - aopPut(AOP(result),"a",offr); - } else { - emitpcode(POC_MOVFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - } - } + operand *result, int offr) +{ + char *l; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(!pic14_sameRegs(AOP(left),AOP(result)) || (offl != offr)){ + l = aopGet(AOP(left),offl,FALSE,FALSE); + + if (*l == '@' && (IS_AOP_PREG(result))) { + pic14_emitcode("mov","a,%s",l); + aopPut(AOP(result),"a",offr); + } else { + emitpcode(POC_MOVFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + } + } } /*-----------------------------------------------------------------*/ /* shiftL2Left2Result - shift left two bytes from left to result */ /*-----------------------------------------------------------------*/ static void shiftL2Left2Result (operand *left, int offl, - operand *result, int offr, int shCount) -{ - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(pic14_sameRegs(AOP(result), AOP(left))) { - switch(shCount) { - case 0: - break; - case 1: - case 2: - case 3: - - emitpcode(POC_MOVFW,popGet(AOP(result),offr)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - - while(--shCount) { - emitCLRC; - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - } - - break; - case 4: - case 5: - emitpcode(POC_MOVLW, popGetLit(0x0f)); - emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_SWAPF, popGet(AOP(result),offr)); - emitpcode(POC_ANDFW, popGet(AOP(result),offr)); - emitpcode(POC_XORWF, popGet(AOP(result),offr)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); - if(shCount >=5) { - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - } - break; - case 6: - emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ANDLW,popGetLit(0xc0)); - emitpcode(POC_XORFW,popGet(AOP(result),offr)); - emitpcode(POC_XORWF,popGet(AOP(result),offr)); - emitpcode(POC_XORFW,popGet(AOP(result),offr)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - break; - case 7: - emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRFW, popGet(AOP(result),offr)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - } - - } else { - switch(shCount) { - case 0: - break; - case 1: - case 2: - case 3: - /* note, use a mov/add for the shift since the mov has a - chance of getting optimized out */ - emitpcode(POC_MOVFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr)); - emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); - - while(--shCount) { - emitCLRC; - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - } - break; - - case 4: - case 5: - emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16)); - emitpcode(POC_ANDLW, popGetLit(0xF0)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - emitpcode(POC_ANDLW, popGetLit(0xF0)); - emitpcode(POC_XORWF, popGet(AOP(result),offr)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); - - - if(shCount == 5) { - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - } - break; - case 6: - emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRFW, popGet(AOP(result),offl)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - - emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ANDLW,popGetLit(0xc0)); - emitpcode(POC_XORFW,popGet(AOP(result),offr)); - emitpcode(POC_XORWF,popGet(AOP(result),offr)); - emitpcode(POC_XORFW,popGet(AOP(result),offr)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - break; - case 7: - emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_CLRF, popGet(AOP(result),offr)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - } - } - + operand *result, int offr, int shCount) +{ + + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(pic14_sameRegs(AOP(result), AOP(left))) { + switch(shCount) { + case 0: + break; + case 1: + case 2: + case 3: + + emitpcode(POC_MOVFW,popGet(AOP(result),offr)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + + while(--shCount) { + emitCLRC; + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + } + + break; + case 4: + case 5: + emitpcode(POC_MOVLW, popGetLit(0x0f)); + emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_SWAPF, popGet(AOP(result),offr)); + emitpcode(POC_ANDFW, popGet(AOP(result),offr)); + emitpcode(POC_XORWF, popGet(AOP(result),offr)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); + if(shCount >=5) { + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + } + break; + case 6: + emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ANDLW,popGetLit(0xc0)); + emitpcode(POC_XORFW,popGet(AOP(result),offr)); + emitpcode(POC_XORWF,popGet(AOP(result),offr)); + emitpcode(POC_XORFW,popGet(AOP(result),offr)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + break; + case 7: + emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRFW, popGet(AOP(result),offr)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + } + + } else { + switch(shCount) { + case 0: + break; + case 1: + case 2: + case 3: + /* note, use a mov/add for the shift since the mov has a + chance of getting optimized out */ + emitpcode(POC_MOVFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr)); + emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); + + while(--shCount) { + emitCLRC; + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + } + break; + + case 4: + case 5: + emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16)); + emitpcode(POC_ANDLW, popGetLit(0xF0)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + emitpcode(POC_ANDLW, popGetLit(0xF0)); + emitpcode(POC_XORWF, popGet(AOP(result),offr)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); + + + if(shCount == 5) { + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + } + break; + case 6: + emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRFW, popGet(AOP(result),offl)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + + emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ANDLW,popGetLit(0xc0)); + emitpcode(POC_XORFW,popGet(AOP(result),offr)); + emitpcode(POC_XORWF,popGet(AOP(result),offr)); + emitpcode(POC_XORFW,popGet(AOP(result),offr)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + break; + case 7: + emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_CLRF, popGet(AOP(result),offr)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + } + } + } /*-----------------------------------------------------------------*/ /* shiftR2Left2Result - shift right two bytes from left to result */ /*-----------------------------------------------------------------*/ static void shiftR2Left2Result (operand *left, int offl, - operand *result, int offr, - int shCount, int sign) -{ - int same=0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - same = pic14_sameRegs(AOP(result), AOP(left)); - - if(same && ((offl + MSB16) == offr)){ - same=1; - /* don't crash result[offr] */ - MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); - pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); - } - /* else { - movLeft2Result(left,offl, result, offr); - MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); - } - */ - /* a:x >> shCount (x = lsb(result))*/ - /* - if(sign) - AccAXRshS( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); - else { - AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); - */ - switch(shCount) { - case 0: - break; - case 1: - case 2: - case 3: - if(sign) - emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16)); - else - emitCLRC; - - if(same) { - emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF,popGet(AOP(result),offr)); - } else { - emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - } - - while(--shCount) { - if(sign) - emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16)); - else - emitCLRC; - emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF,popGet(AOP(result),offr)); - } - break; - case 4: - case 5: - if(same) { - - emitpcode(POC_MOVLW, popGetLit(0xf0)); - emitpcode(POC_ANDWF, popGet(AOP(result),offr)); - emitpcode(POC_SWAPF, popGet(AOP(result),offr)); - - emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr)); - } else { - emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); - emitpcode(POC_ANDLW, popGetLit(0x0f)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr)); - - emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr)); - } - - if(shCount >=5) { - emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RRF, popGet(AOP(result),offr)); - } - - if(sign) { - emitpcode(POC_MOVLW, popGetLit(0xf0 + (shCount-4)*8 )); - emitpcode(POC_BTFSC, - newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),7-shCount,0)); - emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); - } - - break; - - case 6: - if(same) { - - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RLFW, popGet(AOP(result),offr)); - emitpcode(POC_ANDLW,popGetLit(0x03)); - if(sign) { - emitpcode(POC_BTFSC, - newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),1,0)); - emitpcode(POC_IORLW,popGetLit(0xfc)); - } - emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - } else { - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_RLF, popGet(AOP(result),offr)); - emitpcode(POC_RLFW, popGet(AOP(result),offr+MSB16)); - emitpcode(POC_ANDLW,popGetLit(0x03)); - if(sign) { - emitpcode(POC_BTFSC, - newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),0,0)); - emitpcode(POC_IORLW,popGetLit(0xfc)); - } - emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); - //emitpcode(POC_RLF, popGet(AOP(result),offr)); - - - } - - break; - case 7: - emitpcode(POC_RLFW, popGet(AOP(left),offl)); - emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); - emitpcode(POC_MOVWF,popGet(AOP(result),offr)); - emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16)); - if(sign) { - emitSKPNC; - emitpcode(POC_DECF, popGet(AOP(result),offr+MSB16)); - } else - emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + operand *result, int offr, + int shCount, int sign) +{ + int same=0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + same = pic14_sameRegs(AOP(result), AOP(left)); + + if(same && ((offl + MSB16) == offr)){ + same=1; + /* don't crash result[offr] */ + MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); + pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); + } + /* else { + movLeft2Result(left,offl, result, offr); + MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); + } + */ + /* a:x >> shCount (x = lsb(result))*/ + /* + if(sign) + AccAXRshS( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); + else { + AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); + */ + switch(shCount) { + case 0: + break; + case 1: + case 2: + case 3: + if(sign) + emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16)); + else + emitCLRC; + + if(same) { + emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF,popGet(AOP(result),offr)); + } else { + emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + } + + while(--shCount) { + if(sign) + emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16)); + else + emitCLRC; + emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF,popGet(AOP(result),offr)); + } + break; + case 4: + case 5: + if(same) { + + emitpcode(POC_MOVLW, popGetLit(0xf0)); + emitpcode(POC_ANDWF, popGet(AOP(result),offr)); + emitpcode(POC_SWAPF, popGet(AOP(result),offr)); + + emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr)); + } else { + emitpcode(POC_SWAPFW,popGet(AOP(left),offl)); + emitpcode(POC_ANDLW, popGetLit(0x0f)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr)); + + emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr)); + } + + if(shCount >=5) { + emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RRF, popGet(AOP(result),offr)); + } + + if(sign) { + emitpcode(POC_MOVLW, popGetLit(0xf0 + (shCount-4)*8 )); + emitpcode(POC_BTFSC, + newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),7-shCount,0)); + emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16)); + } + + break; + + case 6: + if(same) { + + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RLFW, popGet(AOP(result),offr)); + emitpcode(POC_ANDLW,popGetLit(0x03)); + if(sign) { + emitpcode(POC_BTFSC, + newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),1,0)); + emitpcode(POC_IORLW,popGetLit(0xfc)); + } + emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + } else { + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_RLF, popGet(AOP(result),offr)); + emitpcode(POC_RLFW, popGet(AOP(result),offr+MSB16)); + emitpcode(POC_ANDLW,popGetLit(0x03)); + if(sign) { + emitpcode(POC_BTFSC, + newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),0,0)); + emitpcode(POC_IORLW,popGetLit(0xfc)); + } + emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16)); + //emitpcode(POC_RLF, popGet(AOP(result),offr)); + + + } + + break; + case 7: + emitpcode(POC_RLFW, popGet(AOP(left),offl)); + emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16)); + emitpcode(POC_MOVWF,popGet(AOP(result),offr)); + emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16)); + if(sign) { + emitSKPNC; + emitpcode(POC_DECF, popGet(AOP(result),offr+MSB16)); + } else + emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16)); } } @@ -6846,32 +6845,32 @@ static void shiftR2Left2Result (operand *left, int offl, /* shiftLLeftOrResult - shift left one byte from left, or to result*/ /*-----------------------------------------------------------------*/ static void shiftLLeftOrResult (operand *left, int offl, - operand *result, int offr, int shCount) + operand *result, int offr, int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); - /* shift left accumulator */ - AccLsh(shCount); - /* or with result */ - pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); - /* back to result */ - aopPut(AOP(result),"a",offr); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); + /* shift left accumulator */ + AccLsh(shCount); + /* or with result */ + pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); + /* back to result */ + aopPut(AOP(result),"a",offr); } /*-----------------------------------------------------------------*/ /* shiftRLeftOrResult - shift right one byte from left,or to result*/ /*-----------------------------------------------------------------*/ static void shiftRLeftOrResult (operand *left, int offl, - operand *result, int offr, int shCount) + operand *result, int offr, int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); - /* shift right accumulator */ - AccRsh(shCount); - /* or with result */ - pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); - /* back to result */ - aopPut(AOP(result),"a",offr); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); + /* shift right accumulator */ + AccRsh(shCount); + /* or with result */ + pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); + /* back to result */ + aopPut(AOP(result),"a",offr); } /*-----------------------------------------------------------------*/ @@ -6879,8 +6878,8 @@ static void shiftRLeftOrResult (operand *left, int offl, /*-----------------------------------------------------------------*/ static void genlshOne (operand *result, operand *left, int shCount) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - shiftL1Left2Result(left, LSB, result, LSB, shCount); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + shiftL1Left2Result(left, LSB, result, LSB, shCount); } /*-----------------------------------------------------------------*/ @@ -6888,31 +6887,31 @@ static void genlshOne (operand *result, operand *left, int shCount) /*-----------------------------------------------------------------*/ static void genlshTwo (operand *result,operand *left, int shCount) { - int size; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - size = pic14_getDataSize(result); - - /* if shCount >= 8 */ - if (shCount >= 8) { - shCount -= 8 ; - - if (size > 1){ - if (shCount) - shiftL1Left2Result(left, LSB, result, MSB16, shCount); - else - movLeft2Result(left, LSB, result, MSB16); - } - emitpcode(POC_CLRF,popGet(AOP(result),LSB)); - } - - /* 1 <= shCount <= 7 */ - else { - if(size == 1) - shiftL1Left2Result(left, LSB, result, LSB, shCount); - else - shiftL2Left2Result(left, LSB, result, LSB, shCount); - } + int size; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + size = pic14_getDataSize(result); + + /* if shCount >= 8 */ + if (shCount >= 8) { + shCount -= 8 ; + + if (size > 1){ + if (shCount) + shiftL1Left2Result(left, LSB, result, MSB16, shCount); + else + movLeft2Result(left, LSB, result, MSB16); + } + emitpcode(POC_CLRF,popGet(AOP(result),LSB)); + } + + /* 1 <= shCount <= 7 */ + else { + if(size == 1) + shiftL1Left2Result(left, LSB, result, LSB, shCount); + else + shiftL2Left2Result(left, LSB, result, LSB, shCount); + } } /*-----------------------------------------------------------------*/ @@ -6921,60 +6920,60 @@ static void genlshTwo (operand *result,operand *left, int shCount) /*-----------------------------------------------------------------*/ static void shiftLLong (operand *left, operand *result, int offr ) { - char *l; - int size = AOP_SIZE(result); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(size >= LSB+offr){ - l = aopGet(AOP(left),LSB,FALSE,FALSE); - MOVA(l); - pic14_emitcode("add","a,acc"); - if (pic14_sameRegs(AOP(left),AOP(result)) && - size >= MSB16+offr && offr != LSB ) - pic14_emitcode("xch","a,%s", - aopGet(AOP(left),LSB+offr,FALSE,FALSE)); - else - aopPut(AOP(result),"a",LSB+offr); - } - - if(size >= MSB16+offr){ - if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB16+offr && offr != LSB) ) { - l = aopGet(AOP(left),MSB16,FALSE,FALSE); - MOVA(l); - } - pic14_emitcode("rlc","a"); - if (pic14_sameRegs(AOP(left),AOP(result)) && - size >= MSB24+offr && offr != LSB) - pic14_emitcode("xch","a,%s", - aopGet(AOP(left),MSB16+offr,FALSE,FALSE)); - else - aopPut(AOP(result),"a",MSB16+offr); - } - - if(size >= MSB24+offr){ - if (!(pic14_sameRegs(AOP(left),AOP(left)) && size >= MSB24+offr && offr != LSB)) { - l = aopGet(AOP(left),MSB24,FALSE,FALSE); - MOVA(l); - } - pic14_emitcode("rlc","a"); - if (pic14_sameRegs(AOP(left),AOP(result)) && - size >= MSB32+offr && offr != LSB ) - pic14_emitcode("xch","a,%s", - aopGet(AOP(left),MSB24+offr,FALSE,FALSE)); - else - aopPut(AOP(result),"a",MSB24+offr); - } - - if(size > MSB32+offr){ - if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB32+offr && offr != LSB)) { - l = aopGet(AOP(left),MSB32,FALSE,FALSE); - MOVA(l); - } - pic14_emitcode("rlc","a"); - aopPut(AOP(result),"a",MSB32+offr); - } - if(offr != LSB) - aopPut(AOP(result),zero,LSB); + char *l; + int size = AOP_SIZE(result); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(size >= LSB+offr){ + l = aopGet(AOP(left),LSB,FALSE,FALSE); + MOVA(l); + pic14_emitcode("add","a,acc"); + if (pic14_sameRegs(AOP(left),AOP(result)) && + size >= MSB16+offr && offr != LSB ) + pic14_emitcode("xch","a,%s", + aopGet(AOP(left),LSB+offr,FALSE,FALSE)); + else + aopPut(AOP(result),"a",LSB+offr); + } + + if(size >= MSB16+offr){ + if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB16+offr && offr != LSB) ) { + l = aopGet(AOP(left),MSB16,FALSE,FALSE); + MOVA(l); + } + pic14_emitcode("rlc","a"); + if (pic14_sameRegs(AOP(left),AOP(result)) && + size >= MSB24+offr && offr != LSB) + pic14_emitcode("xch","a,%s", + aopGet(AOP(left),MSB16+offr,FALSE,FALSE)); + else + aopPut(AOP(result),"a",MSB16+offr); + } + + if(size >= MSB24+offr){ + if (!(pic14_sameRegs(AOP(left),AOP(left)) && size >= MSB24+offr && offr != LSB)) { + l = aopGet(AOP(left),MSB24,FALSE,FALSE); + MOVA(l); + } + pic14_emitcode("rlc","a"); + if (pic14_sameRegs(AOP(left),AOP(result)) && + size >= MSB32+offr && offr != LSB ) + pic14_emitcode("xch","a,%s", + aopGet(AOP(left),MSB24+offr,FALSE,FALSE)); + else + aopPut(AOP(result),"a",MSB24+offr); + } + + if(size > MSB32+offr){ + if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB32+offr && offr != LSB)) { + l = aopGet(AOP(left),MSB32,FALSE,FALSE); + MOVA(l); + } + pic14_emitcode("rlc","a"); + aopPut(AOP(result),"a",MSB32+offr); + } + if(offr != LSB) + aopPut(AOP(result),zero,LSB); } /*-----------------------------------------------------------------*/ @@ -6982,136 +6981,136 @@ static void shiftLLong (operand *left, operand *result, int offr ) /*-----------------------------------------------------------------*/ static void genlshFour (operand *result, operand *left, int shCount) { - int size; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - size = AOP_SIZE(result); - - /* if shifting more that 3 bytes */ - if (shCount >= 24 ) { - shCount -= 24; - if (shCount) - /* lowest order of left goes to the highest - order of the destination */ - shiftL1Left2Result(left, LSB, result, MSB32, shCount); - else - movLeft2Result(left, LSB, result, MSB32); - aopPut(AOP(result),zero,LSB); - aopPut(AOP(result),zero,MSB16); - aopPut(AOP(result),zero,MSB32); - return; - } - - /* more than two bytes */ - else if ( shCount >= 16 ) { - /* lower order two bytes goes to higher order two bytes */ - shCount -= 16; - /* if some more remaining */ - if (shCount) - shiftL2Left2Result(left, LSB, result, MSB24, shCount); - else { - movLeft2Result(left, MSB16, result, MSB32); - movLeft2Result(left, LSB, result, MSB24); - } - aopPut(AOP(result),zero,MSB16); - aopPut(AOP(result),zero,LSB); - return; - } - - /* if more than 1 byte */ - else if ( shCount >= 8 ) { - /* lower order three bytes goes to higher order three bytes */ - shCount -= 8; - if(size == 2){ - if(shCount) - shiftL1Left2Result(left, LSB, result, MSB16, shCount); - else - movLeft2Result(left, LSB, result, MSB16); - } - else{ /* size = 4 */ - if(shCount == 0){ - movLeft2Result(left, MSB24, result, MSB32); - movLeft2Result(left, MSB16, result, MSB24); - movLeft2Result(left, LSB, result, MSB16); - aopPut(AOP(result),zero,LSB); - } - else if(shCount == 1) - shiftLLong(left, result, MSB16); - else{ - shiftL2Left2Result(left, MSB16, result, MSB24, shCount); - shiftL1Left2Result(left, LSB, result, MSB16, shCount); - shiftRLeftOrResult(left, LSB, result, MSB24, 8 - shCount); - aopPut(AOP(result),zero,LSB); - } - } - } - - /* 1 <= shCount <= 7 */ - else if(shCount <= 2){ - shiftLLong(left, result, LSB); - if(shCount == 2) - shiftLLong(result, result, LSB); - } - /* 3 <= shCount <= 7, optimize */ - else{ - shiftL2Left2Result(left, MSB24, result, MSB24, shCount); - shiftRLeftOrResult(left, MSB16, result, MSB24, 8 - shCount); - shiftL2Left2Result(left, LSB, result, LSB, shCount); - } + int size; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + size = AOP_SIZE(result); + + /* if shifting more that 3 bytes */ + if (shCount >= 24 ) { + shCount -= 24; + if (shCount) + /* lowest order of left goes to the highest + order of the destination */ + shiftL1Left2Result(left, LSB, result, MSB32, shCount); + else + movLeft2Result(left, LSB, result, MSB32); + aopPut(AOP(result),zero,LSB); + aopPut(AOP(result),zero,MSB16); + aopPut(AOP(result),zero,MSB32); + return; + } + + /* more than two bytes */ + else if ( shCount >= 16 ) { + /* lower order two bytes goes to higher order two bytes */ + shCount -= 16; + /* if some more remaining */ + if (shCount) + shiftL2Left2Result(left, LSB, result, MSB24, shCount); + else { + movLeft2Result(left, MSB16, result, MSB32); + movLeft2Result(left, LSB, result, MSB24); + } + aopPut(AOP(result),zero,MSB16); + aopPut(AOP(result),zero,LSB); + return; + } + + /* if more than 1 byte */ + else if ( shCount >= 8 ) { + /* lower order three bytes goes to higher order three bytes */ + shCount -= 8; + if(size == 2){ + if(shCount) + shiftL1Left2Result(left, LSB, result, MSB16, shCount); + else + movLeft2Result(left, LSB, result, MSB16); + } + else{ /* size = 4 */ + if(shCount == 0){ + movLeft2Result(left, MSB24, result, MSB32); + movLeft2Result(left, MSB16, result, MSB24); + movLeft2Result(left, LSB, result, MSB16); + aopPut(AOP(result),zero,LSB); + } + else if(shCount == 1) + shiftLLong(left, result, MSB16); + else{ + shiftL2Left2Result(left, MSB16, result, MSB24, shCount); + shiftL1Left2Result(left, LSB, result, MSB16, shCount); + shiftRLeftOrResult(left, LSB, result, MSB24, 8 - shCount); + aopPut(AOP(result),zero,LSB); + } + } + } + + /* 1 <= shCount <= 7 */ + else if(shCount <= 2){ + shiftLLong(left, result, LSB); + if(shCount == 2) + shiftLLong(result, result, LSB); + } + /* 3 <= shCount <= 7, optimize */ + else{ + shiftL2Left2Result(left, MSB24, result, MSB24, shCount); + shiftRLeftOrResult(left, MSB16, result, MSB24, 8 - shCount); + shiftL2Left2Result(left, LSB, result, LSB, shCount); + } } /*-----------------------------------------------------------------*/ /* genLeftShiftLiteral - left shifting by known count */ /*-----------------------------------------------------------------*/ static void genLeftShiftLiteral (operand *left, - operand *right, - operand *result, - iCode *ic) + operand *right, + operand *result, + iCode *ic) { - int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); - int size; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - freeAsmop(right,NULL,ic,TRUE); - - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - size = getSize(operandType(result)); - + int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); + int size; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + freeAsmop(right,NULL,ic,TRUE); + + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + size = getSize(operandType(result)); + #if VIEW_SIZE - pic14_emitcode("; shift left ","result %d, left %d",size, - AOP_SIZE(left)); + pic14_emitcode("; shift left ","result %d, left %d",size, + AOP_SIZE(left)); #endif - - /* I suppose that the left size >= result size */ - if(shCount == 0){ - while(size--){ - movLeft2Result(left, size, result, size); - } - } - - else if(shCount >= (size * 8)) - while(size--) - aopPut(AOP(result),zero,size); - else{ - switch (size) { - case 1: - genlshOne (result,left,shCount); - break; - - case 2: - case 3: - genlshTwo (result,left,shCount); - break; - - case 4: - genlshFour (result,left,shCount); - break; - } - } - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + + /* I suppose that the left size >= result size */ + if(shCount == 0){ + while(size--){ + movLeft2Result(left, size, result, size); + } + } + + else if(shCount >= (size * 8)) + while(size--) + aopPut(AOP(result),zero,size); + else{ + switch (size) { + case 1: + genlshOne (result,left,shCount); + break; + + case 2: + case 3: + genlshTwo (result,left,shCount); + break; + + case 4: + genlshFour (result,left,shCount); + break; + } + } + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------* @@ -7121,233 +7120,233 @@ static void genLeftShiftLiteral (operand *left, *-----------------------------------------------------------------*/ static void genMultiAsm( PIC_OPCODE poc, operand *reg, int size, int endian) { - - int offset = 0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(!reg) - return; - - if(!endian) { - endian = 1; - } else { - endian = -1; - offset = size-1; - } - - while(size--) { - emitpcode(poc, popGet(AOP(reg),offset)); - offset += endian; - } - + + int offset = 0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(!reg) + return; + + if(!endian) { + endian = 1; + } else { + endian = -1; + offset = size-1; + } + + while(size--) { + emitpcode(poc, popGet(AOP(reg),offset)); + offset += endian; + } + } /*-----------------------------------------------------------------*/ /* genLeftShift - generates code for left shifting */ /*-----------------------------------------------------------------*/ static void genLeftShift (iCode *ic) { - operand *left,*right, *result; - int size, offset; - char *l; - symbol *tlbl , *tlbl1; - pCodeOp *pctemp; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - right = IC_RIGHT(ic); - left = IC_LEFT(ic); - result = IC_RESULT(ic); - - aopOp(right,ic,FALSE); - - /* if the shift count is known then do it - as efficiently as possible */ - if (AOP_TYPE(right) == AOP_LIT) { - genLeftShiftLiteral (left,right,result,ic); - return ; - } - - /* shift count is unknown then we have to form - a loop get the loop count in B : Note: we take - only the lower order byte since shifting - more that 32 bits make no sense anyway, ( the - largest size of an object can be only 32 bits ) */ - - - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - /* now move the left to the result if they are not the - same */ - if (!pic14_sameRegs(AOP(left),AOP(result)) && - AOP_SIZE(result) > 1) { - - size = AOP_SIZE(result); - offset=0; - while (size--) { - l = aopGet(AOP(left),offset,FALSE,TRUE); - if (*l == '@' && (IS_AOP_PREG(result))) { - - pic14_emitcode("mov","a,%s",l); - aopPut(AOP(result),"a",offset); - } else { - emitpcode(POC_MOVFW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - //aopPut(AOP(result),l,offset); - } - offset++; - } - } - - size = AOP_SIZE(result); - - /* if it is only one byte then */ - if (size == 1) { - if(optimized_for_speed) { - emitpcode(POC_SWAPFW, popGet(AOP(left),0)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),2,0)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0)); - emitpcode(POC_ADDWF, popGet(AOP(result),0)); - emitpcode(POC_RLFW, popGet(AOP(result),0)); - emitpcode(POC_ANDLW, popGetLit(0xfe)); - emitpcode(POC_ADDFW, popGet(AOP(result),0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),1,0)); - emitpcode(POC_ADDWF, popGet(AOP(result),0)); - } else { - - tlbl = newiTempLabel(NULL); - if (!pic14_sameRegs(AOP(left),AOP(result))) { - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - } - - emitpcode(POC_COMFW, popGet(AOP(right),0)); - emitpcode(POC_RRF, popGet(AOP(result),0)); - emitpLabel(tlbl->key); - emitpcode(POC_RLF, popGet(AOP(result),0)); - emitpcode(POC_ADDLW, popGetLit(1)); - emitSKPC; - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - } - goto release ; - } - - if (pic14_sameRegs(AOP(left),AOP(result))) { - - tlbl = newiTempLabel(NULL); - emitpcode(POC_COMFW, popGet(AOP(right),0)); - genMultiAsm(POC_RRF, result, size,1); - emitpLabel(tlbl->key); - genMultiAsm(POC_RLF, result, size,0); - emitpcode(POC_ADDLW, popGetLit(1)); - emitSKPC; - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - goto release; - } - - //tlbl = newiTempLabel(NULL); - //offset = 0 ; - //tlbl1 = newiTempLabel(NULL); - - //reAdjustPreg(AOP(result)); - - //pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); - //pic14_emitcode("","%05d_DS_:",tlbl->key+100); - //l = aopGet(AOP(result),offset,FALSE,FALSE); - //MOVA(l); - //pic14_emitcode("add","a,acc"); - //aopPut(AOP(result),"a",offset++); - //while (--size) { - // l = aopGet(AOP(result),offset,FALSE,FALSE); - // MOVA(l); - // pic14_emitcode("rlc","a"); - // aopPut(AOP(result),"a",offset++); - //} - //reAdjustPreg(AOP(result)); - - //pic14_emitcode("","%05d_DS_:",tlbl1->key+100); - //pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); - - - tlbl = newiTempLabel(NULL); - tlbl1= newiTempLabel(NULL); - - size = AOP_SIZE(result); - offset = 1; - - pctemp = popGetTempReg(); /* grab a temporary working register. */ - - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - - /* offset should be 0, 1 or 3 */ - emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3))); - emitSKPNZ; - emitpcode(POC_GOTO, popGetLabel(tlbl1->key)); - - emitpcode(POC_MOVWF, pctemp); - - - emitpLabel(tlbl->key); - - emitCLRC; - emitpcode(POC_RLF, popGet(AOP(result),0)); - while(--size) - emitpcode(POC_RLF, popGet(AOP(result),offset++)); - - emitpcode(POC_DECFSZ, pctemp); - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - emitpLabel(tlbl1->key); - - popReleaseTempReg(pctemp); - - + operand *left,*right, *result; + int size, offset; + char *l; + symbol *tlbl , *tlbl1; + pCodeOp *pctemp; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + right = IC_RIGHT(ic); + left = IC_LEFT(ic); + result = IC_RESULT(ic); + + aopOp(right,ic,FALSE); + + /* if the shift count is known then do it + as efficiently as possible */ + if (AOP_TYPE(right) == AOP_LIT) { + genLeftShiftLiteral (left,right,result,ic); + return ; + } + + /* shift count is unknown then we have to form + a loop get the loop count in B : Note: we take + only the lower order byte since shifting + more that 32 bits make no sense anyway, ( the + largest size of an object can be only 32 bits ) */ + + + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + /* now move the left to the result if they are not the + same */ + if (!pic14_sameRegs(AOP(left),AOP(result)) && + AOP_SIZE(result) > 1) { + + size = AOP_SIZE(result); + offset=0; + while (size--) { + l = aopGet(AOP(left),offset,FALSE,TRUE); + if (*l == '@' && (IS_AOP_PREG(result))) { + + pic14_emitcode("mov","a,%s",l); + aopPut(AOP(result),"a",offset); + } else { + emitpcode(POC_MOVFW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + //aopPut(AOP(result),l,offset); + } + offset++; + } + } + + size = AOP_SIZE(result); + + /* if it is only one byte then */ + if (size == 1) { + if(optimized_for_speed) { + emitpcode(POC_SWAPFW, popGet(AOP(left),0)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),2,0)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0)); + emitpcode(POC_ADDWF, popGet(AOP(result),0)); + emitpcode(POC_RLFW, popGet(AOP(result),0)); + emitpcode(POC_ANDLW, popGetLit(0xfe)); + emitpcode(POC_ADDFW, popGet(AOP(result),0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),1,0)); + emitpcode(POC_ADDWF, popGet(AOP(result),0)); + } else { + + tlbl = newiTempLabel(NULL); + if (!pic14_sameRegs(AOP(left),AOP(result))) { + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + } + + emitpcode(POC_COMFW, popGet(AOP(right),0)); + emitpcode(POC_RRF, popGet(AOP(result),0)); + emitpLabel(tlbl->key); + emitpcode(POC_RLF, popGet(AOP(result),0)); + emitpcode(POC_ADDLW, popGetLit(1)); + emitSKPC; + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + } + goto release ; + } + + if (pic14_sameRegs(AOP(left),AOP(result))) { + + tlbl = newiTempLabel(NULL); + emitpcode(POC_COMFW, popGet(AOP(right),0)); + genMultiAsm(POC_RRF, result, size,1); + emitpLabel(tlbl->key); + genMultiAsm(POC_RLF, result, size,0); + emitpcode(POC_ADDLW, popGetLit(1)); + emitSKPC; + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + goto release; + } + + //tlbl = newiTempLabel(NULL); + //offset = 0 ; + //tlbl1 = newiTempLabel(NULL); + + //reAdjustPreg(AOP(result)); + + //pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + //pic14_emitcode("","%05d_DS_:",tlbl->key+100); + //l = aopGet(AOP(result),offset,FALSE,FALSE); + //MOVA(l); + //pic14_emitcode("add","a,acc"); + //aopPut(AOP(result),"a",offset++); + //while (--size) { + // l = aopGet(AOP(result),offset,FALSE,FALSE); + // MOVA(l); + // pic14_emitcode("rlc","a"); + // aopPut(AOP(result),"a",offset++); + //} + //reAdjustPreg(AOP(result)); + + //pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + //pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); + + + tlbl = newiTempLabel(NULL); + tlbl1= newiTempLabel(NULL); + + size = AOP_SIZE(result); + offset = 1; + + pctemp = popGetTempReg(); /* grab a temporary working register. */ + + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + + /* offset should be 0, 1 or 3 */ + emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3))); + emitSKPNZ; + emitpcode(POC_GOTO, popGetLabel(tlbl1->key)); + + emitpcode(POC_MOVWF, pctemp); + + + emitpLabel(tlbl->key); + + emitCLRC; + emitpcode(POC_RLF, popGet(AOP(result),0)); + while(--size) + emitpcode(POC_RLF, popGet(AOP(result),offset++)); + + emitpcode(POC_DECFSZ, pctemp); + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + emitpLabel(tlbl1->key); + + popReleaseTempReg(pctemp); + + release: - freeAsmop (right,NULL,ic,TRUE); - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop (right,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genrshOne - right shift a one byte quantity by known count */ /*-----------------------------------------------------------------*/ static void genrshOne (operand *result, operand *left, - int shCount, int sign) + int shCount, int sign) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - shiftR1Left2Result(left, LSB, result, LSB, shCount, sign); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + shiftR1Left2Result(left, LSB, result, LSB, shCount, sign); } /*-----------------------------------------------------------------*/ /* genrshTwo - right shift two bytes by known amount != 0 */ /*-----------------------------------------------------------------*/ static void genrshTwo (operand *result,operand *left, - int shCount, int sign) -{ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if shCount >= 8 */ - if (shCount >= 8) { - shCount -= 8 ; - if (shCount) - shiftR1Left2Result(left, MSB16, result, LSB, - shCount, sign); - else - movLeft2Result(left, MSB16, result, LSB); - - emitpcode(POC_CLRF,popGet(AOP(result),MSB16)); - - if(sign) { - emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),MSB16)); - } - } - - /* 1 <= shCount <= 7 */ - else - shiftR2Left2Result(left, LSB, result, LSB, shCount, sign); + int shCount, int sign) +{ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if shCount >= 8 */ + if (shCount >= 8) { + shCount -= 8 ; + if (shCount) + shiftR1Left2Result(left, MSB16, result, LSB, + shCount, sign); + else + movLeft2Result(left, MSB16, result, LSB); + + emitpcode(POC_CLRF,popGet(AOP(result),MSB16)); + + if(sign) { + emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),MSB16)); + } + } + + /* 1 <= shCount <= 7 */ + else + shiftR2Left2Result(left, LSB, result, LSB, shCount, sign); } /*-----------------------------------------------------------------*/ @@ -7355,172 +7354,172 @@ static void genrshTwo (operand *result,operand *left, /* offl = LSB or MSB16 */ /*-----------------------------------------------------------------*/ static void shiftRLong (operand *left, int offl, - operand *result, int sign) -{ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(!sign) - pic14_emitcode("clr","c"); - MOVA(aopGet(AOP(left),MSB32,FALSE,FALSE)); - if(sign) - pic14_emitcode("mov","c,acc.7"); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",MSB32-offl); - if(offl == MSB16) - /* add sign of "a" */ - addSign(result, MSB32, sign); - - MOVA(aopGet(AOP(left),MSB24,FALSE,FALSE)); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",MSB24-offl); - - MOVA(aopGet(AOP(left),MSB16,FALSE,FALSE)); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",MSB16-offl); - - if(offl == LSB){ - MOVA(aopGet(AOP(left),LSB,FALSE,FALSE)); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",LSB); - } + operand *result, int sign) +{ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(!sign) + pic14_emitcode("clr","c"); + MOVA(aopGet(AOP(left),MSB32,FALSE,FALSE)); + if(sign) + pic14_emitcode("mov","c,acc.7"); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",MSB32-offl); + if(offl == MSB16) + /* add sign of "a" */ + addSign(result, MSB32, sign); + + MOVA(aopGet(AOP(left),MSB24,FALSE,FALSE)); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",MSB24-offl); + + MOVA(aopGet(AOP(left),MSB16,FALSE,FALSE)); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",MSB16-offl); + + if(offl == LSB){ + MOVA(aopGet(AOP(left),LSB,FALSE,FALSE)); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",LSB); + } } /*-----------------------------------------------------------------*/ /* genrshFour - shift four byte by a known amount != 0 */ /*-----------------------------------------------------------------*/ static void genrshFour (operand *result, operand *left, - int shCount, int sign) -{ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* if shifting more that 3 bytes */ - if(shCount >= 24 ) { - shCount -= 24; - if(shCount) - shiftR1Left2Result(left, MSB32, result, LSB, shCount, sign); - else - movLeft2Result(left, MSB32, result, LSB); - - addSign(result, MSB16, sign); - } - else if(shCount >= 16){ - shCount -= 16; - if(shCount) - shiftR2Left2Result(left, MSB24, result, LSB, shCount, sign); - else{ - movLeft2Result(left, MSB24, result, LSB); - movLeft2Result(left, MSB32, result, MSB16); - } - addSign(result, MSB24, sign); - } - else if(shCount >= 8){ - shCount -= 8; - if(shCount == 1) - shiftRLong(left, MSB16, result, sign); - else if(shCount == 0){ - movLeft2Result(left, MSB16, result, LSB); - movLeft2Result(left, MSB24, result, MSB16); - movLeft2Result(left, MSB32, result, MSB24); - addSign(result, MSB32, sign); - } - else{ - shiftR2Left2Result(left, MSB16, result, LSB, shCount, 0); - shiftLLeftOrResult(left, MSB32, result, MSB16, 8 - shCount); - /* the last shift is signed */ - shiftR1Left2Result(left, MSB32, result, MSB24, shCount, sign); - addSign(result, MSB32, sign); - } - } - else{ /* 1 <= shCount <= 7 */ - if(shCount <= 2){ - shiftRLong(left, LSB, result, sign); - if(shCount == 2) - shiftRLong(result, LSB, result, sign); - } - else{ - shiftR2Left2Result(left, LSB, result, LSB, shCount, 0); - shiftLLeftOrResult(left, MSB24, result, MSB16, 8 - shCount); - shiftR2Left2Result(left, MSB24, result, MSB24, shCount, sign); - } - } + int shCount, int sign) +{ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* if shifting more that 3 bytes */ + if(shCount >= 24 ) { + shCount -= 24; + if(shCount) + shiftR1Left2Result(left, MSB32, result, LSB, shCount, sign); + else + movLeft2Result(left, MSB32, result, LSB); + + addSign(result, MSB16, sign); + } + else if(shCount >= 16){ + shCount -= 16; + if(shCount) + shiftR2Left2Result(left, MSB24, result, LSB, shCount, sign); + else{ + movLeft2Result(left, MSB24, result, LSB); + movLeft2Result(left, MSB32, result, MSB16); + } + addSign(result, MSB24, sign); + } + else if(shCount >= 8){ + shCount -= 8; + if(shCount == 1) + shiftRLong(left, MSB16, result, sign); + else if(shCount == 0){ + movLeft2Result(left, MSB16, result, LSB); + movLeft2Result(left, MSB24, result, MSB16); + movLeft2Result(left, MSB32, result, MSB24); + addSign(result, MSB32, sign); + } + else{ + shiftR2Left2Result(left, MSB16, result, LSB, shCount, 0); + shiftLLeftOrResult(left, MSB32, result, MSB16, 8 - shCount); + /* the last shift is signed */ + shiftR1Left2Result(left, MSB32, result, MSB24, shCount, sign); + addSign(result, MSB32, sign); + } + } + else{ /* 1 <= shCount <= 7 */ + if(shCount <= 2){ + shiftRLong(left, LSB, result, sign); + if(shCount == 2) + shiftRLong(result, LSB, result, sign); + } + else{ + shiftR2Left2Result(left, LSB, result, LSB, shCount, 0); + shiftLLeftOrResult(left, MSB24, result, MSB16, 8 - shCount); + shiftR2Left2Result(left, MSB24, result, MSB24, shCount, sign); + } + } } /*-----------------------------------------------------------------*/ /* genRightShiftLiteral - right shifting by known count */ /*-----------------------------------------------------------------*/ static void genRightShiftLiteral (operand *left, - operand *right, - operand *result, - iCode *ic, - int sign) + operand *right, + operand *result, + iCode *ic, + int sign) { - int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); - int lsize,res_size; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - freeAsmop(right,NULL,ic,TRUE); - - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - + int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); + int lsize,res_size; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + freeAsmop(right,NULL,ic,TRUE); + + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + #if VIEW_SIZE - pic14_emitcode("; shift right ","result %d, left %d",AOP_SIZE(result), - AOP_SIZE(left)); + pic14_emitcode("; shift right ","result %d, left %d",AOP_SIZE(result), + AOP_SIZE(left)); #endif - - lsize = pic14_getDataSize(left); - res_size = pic14_getDataSize(result); - /* test the LEFT size !!! */ - - /* I suppose that the left size >= result size */ - if(shCount == 0){ - while(res_size--) - movLeft2Result(left, lsize, result, res_size); - } - - else if(shCount >= (lsize * 8)){ - - if(res_size == 1) { - emitpcode(POC_CLRF, popGet(AOP(result),LSB)); - if(sign) { - emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),LSB)); - } - } else { - - if(sign) { - emitpcode(POC_MOVLW, popGetLit(0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); - emitpcode(POC_MOVLW, popGetLit(0xff)); - while(res_size--) - emitpcode(POC_MOVWF, popGet(AOP(result),res_size)); - - } else { - - while(res_size--) - emitpcode(POC_CLRF, popGet(AOP(result),res_size)); - } - } - } else { - - switch (res_size) { - case 1: - genrshOne (result,left,shCount,sign); - break; - - case 2: - genrshTwo (result,left,shCount,sign); - break; - - case 4: - genrshFour (result,left,shCount,sign); - break; - default : - break; - } - - } - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + + lsize = pic14_getDataSize(left); + res_size = pic14_getDataSize(result); + /* test the LEFT size !!! */ + + /* I suppose that the left size >= result size */ + if(shCount == 0){ + while(res_size--) + movLeft2Result(left, lsize, result, res_size); + } + + else if(shCount >= (lsize * 8)){ + + if(res_size == 1) { + emitpcode(POC_CLRF, popGet(AOP(result),LSB)); + if(sign) { + emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),LSB)); + } + } else { + + if(sign) { + emitpcode(POC_MOVLW, popGetLit(0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); + emitpcode(POC_MOVLW, popGetLit(0xff)); + while(res_size--) + emitpcode(POC_MOVWF, popGet(AOP(result),res_size)); + + } else { + + while(res_size--) + emitpcode(POC_CLRF, popGet(AOP(result),res_size)); + } + } + } else { + + switch (res_size) { + case 1: + genrshOne (result,left,shCount,sign); + break; + + case 2: + genrshTwo (result,left,shCount,sign); + break; + + case 4: + genrshFour (result,left,shCount,sign); + break; + default : + break; + } + + } + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -7528,140 +7527,140 @@ static void genRightShiftLiteral (operand *left, /*-----------------------------------------------------------------*/ static void genSignedRightShift (iCode *ic) { - operand *right, *left, *result; - int size, offset; - // char *l; - symbol *tlbl, *tlbl1 ; - pCodeOp *pctemp; - - //same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); - - /* we do it the hard way put the shift count in b - and loop thru preserving the sign */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - right = IC_RIGHT(ic); - left = IC_LEFT(ic); - result = IC_RESULT(ic); - - aopOp(right,ic,FALSE); - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - - if ( AOP_TYPE(right) == AOP_LIT) { - genRightShiftLiteral (left,right,result,ic,1); - return ; - } - /* shift count is unknown then we have to form - a loop get the loop count in B : Note: we take - only the lower order byte since shifting - more that 32 bits make no sense anyway, ( the - largest size of an object can be only 32 bits ) */ - - //pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - //pic14_emitcode("inc","b"); - //freeAsmop (right,NULL,ic,TRUE); - //aopOp(left,ic,FALSE); - //aopOp(result,ic,FALSE); - - /* now move the left to the result if they are not the - same */ - if (!pic14_sameRegs(AOP(left),AOP(result)) && - AOP_SIZE(result) > 1) { - - size = AOP_SIZE(result); - offset=0; - while (size--) { - /* - l = aopGet(AOP(left),offset,FALSE,TRUE); - if (*l == '@' && IS_AOP_PREG(result)) { - - pic14_emitcode("mov","a,%s",l); - aopPut(AOP(result),"a",offset); - } else - aopPut(AOP(result),l,offset); - */ - emitpcode(POC_MOVFW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - - offset++; - } - } - - /* mov the highest order bit to OVR */ - tlbl = newiTempLabel(NULL); - tlbl1= newiTempLabel(NULL); - - size = AOP_SIZE(result); - offset = size - 1; - - pctemp = popGetTempReg(); /* grab a temporary working register. */ - - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - - /* offset should be 0, 1 or 3 */ - emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3))); - emitSKPNZ; - emitpcode(POC_GOTO, popGetLabel(tlbl1->key)); - - emitpcode(POC_MOVWF, pctemp); - - - emitpLabel(tlbl->key); - - emitpcode(POC_RLFW, popGet(AOP(result),offset)); - emitpcode(POC_RRF, popGet(AOP(result),offset)); - - while(--size) { - emitpcode(POC_RRF, popGet(AOP(result),--offset)); - } - - emitpcode(POC_DECFSZ, pctemp); - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - emitpLabel(tlbl1->key); - - popReleaseTempReg(pctemp); + operand *right, *left, *result; + int size, offset; + // char *l; + symbol *tlbl, *tlbl1 ; + pCodeOp *pctemp; + + //same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr); + + /* we do it the hard way put the shift count in b + and loop thru preserving the sign */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + right = IC_RIGHT(ic); + left = IC_LEFT(ic); + result = IC_RESULT(ic); + + aopOp(right,ic,FALSE); + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + + if ( AOP_TYPE(right) == AOP_LIT) { + genRightShiftLiteral (left,right,result,ic,1); + return ; + } + /* shift count is unknown then we have to form + a loop get the loop count in B : Note: we take + only the lower order byte since shifting + more that 32 bits make no sense anyway, ( the + largest size of an object can be only 32 bits ) */ + + //pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + //pic14_emitcode("inc","b"); + //freeAsmop (right,NULL,ic,TRUE); + //aopOp(left,ic,FALSE); + //aopOp(result,ic,FALSE); + + /* now move the left to the result if they are not the + same */ + if (!pic14_sameRegs(AOP(left),AOP(result)) && + AOP_SIZE(result) > 1) { + + size = AOP_SIZE(result); + offset=0; + while (size--) { + /* + l = aopGet(AOP(left),offset,FALSE,TRUE); + if (*l == '@' && IS_AOP_PREG(result)) { + + pic14_emitcode("mov","a,%s",l); + aopPut(AOP(result),"a",offset); + } else + aopPut(AOP(result),l,offset); + */ + emitpcode(POC_MOVFW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + + offset++; + } + } + + /* mov the highest order bit to OVR */ + tlbl = newiTempLabel(NULL); + tlbl1= newiTempLabel(NULL); + + size = AOP_SIZE(result); + offset = size - 1; + + pctemp = popGetTempReg(); /* grab a temporary working register. */ + + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + + /* offset should be 0, 1 or 3 */ + emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3))); + emitSKPNZ; + emitpcode(POC_GOTO, popGetLabel(tlbl1->key)); + + emitpcode(POC_MOVWF, pctemp); + + + emitpLabel(tlbl->key); + + emitpcode(POC_RLFW, popGet(AOP(result),offset)); + emitpcode(POC_RRF, popGet(AOP(result),offset)); + + while(--size) { + emitpcode(POC_RRF, popGet(AOP(result),--offset)); + } + + emitpcode(POC_DECFSZ, pctemp); + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + emitpLabel(tlbl1->key); + + popReleaseTempReg(pctemp); #if 0 - size = AOP_SIZE(result); - offset = size - 1; - pic14_emitcode("mov","a,%s",aopGet(AOP(left),offset,FALSE,FALSE)); - pic14_emitcode("rlc","a"); - pic14_emitcode("mov","ov,c"); - /* if it is only one byte then */ - if (size == 1) { - l = aopGet(AOP(left),0,FALSE,FALSE); - MOVA(l); - pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_emitcode("mov","c,ov"); - pic14_emitcode("rrc","a"); - pic14_emitcode("","%05d_DS_:",tlbl1->key+100); - pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); - aopPut(AOP(result),"a",0); - goto release ; - } - - reAdjustPreg(AOP(result)); - pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_emitcode("mov","c,ov"); - while (size--) { - l = aopGet(AOP(result),offset,FALSE,FALSE); - MOVA(l); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",offset--); - } - reAdjustPreg(AOP(result)); - pic14_emitcode("","%05d_DS_:",tlbl1->key+100); - pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); - -release: -#endif - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - freeAsmop(right,NULL,ic,TRUE); + size = AOP_SIZE(result); + offset = size - 1; + pic14_emitcode("mov","a,%s",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("rlc","a"); + pic14_emitcode("mov","ov,c"); + /* if it is only one byte then */ + if (size == 1) { + l = aopGet(AOP(left),0,FALSE,FALSE); + MOVA(l); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("mov","c,ov"); + pic14_emitcode("rrc","a"); + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); + aopPut(AOP(result),"a",0); + goto release ; + } + + reAdjustPreg(AOP(result)); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("mov","c,ov"); + while (size--) { + l = aopGet(AOP(result),offset,FALSE,FALSE); + MOVA(l); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",offset--); + } + reAdjustPreg(AOP(result)); + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); + +release: +#endif + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + freeAsmop(right,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -7669,116 +7668,116 @@ release: /*-----------------------------------------------------------------*/ static void genRightShift (iCode *ic) { - operand *right, *left, *result; - sym_link *retype ; - int size, offset; - char *l; - symbol *tlbl, *tlbl1 ; - - /* if signed then we do it the hard way preserve the - sign bit moving it inwards */ - retype = getSpec(operandType(IC_RESULT(ic))); - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (!SPEC_USIGN(retype)) { - genSignedRightShift (ic); - return ; - } - - /* signed & unsigned types are treated the same : i.e. the - signed is NOT propagated inwards : quoting from the - ANSI - standard : "for E1 >> E2, is equivalent to division - by 2**E2 if unsigned or if it has a non-negative value, - otherwise the result is implementation defined ", MY definition - is that the sign does not get propagated */ - - right = IC_RIGHT(ic); - left = IC_LEFT(ic); - result = IC_RESULT(ic); - - aopOp(right,ic,FALSE); - - /* if the shift count is known then do it - as efficiently as possible */ - if (AOP_TYPE(right) == AOP_LIT) { - genRightShiftLiteral (left,right,result,ic, 0); - return ; - } - - /* shift count is unknown then we have to form - a loop get the loop count in B : Note: we take - only the lower order byte since shifting - more that 32 bits make no sense anyway, ( the - largest size of an object can be only 32 bits ) */ - - pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - pic14_emitcode("inc","b"); - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - /* now move the left to the result if they are not the - same */ - if (!pic14_sameRegs(AOP(left),AOP(result)) && - AOP_SIZE(result) > 1) { - - size = AOP_SIZE(result); - offset=0; - while (size--) { - l = aopGet(AOP(left),offset,FALSE,TRUE); - if (*l == '@' && IS_AOP_PREG(result)) { - - pic14_emitcode("mov","a,%s",l); - aopPut(AOP(result),"a",offset); - } else - aopPut(AOP(result),l,offset); - offset++; - } - } - - tlbl = newiTempLabel(NULL); - tlbl1= newiTempLabel(NULL); - size = AOP_SIZE(result); - offset = size - 1; - - /* if it is only one byte then */ - if (size == 1) { - - tlbl = newiTempLabel(NULL); - if (!pic14_sameRegs(AOP(left),AOP(result))) { - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - } - - emitpcode(POC_COMFW, popGet(AOP(right),0)); - emitpcode(POC_RLF, popGet(AOP(result),0)); - emitpLabel(tlbl->key); - emitpcode(POC_RRF, popGet(AOP(result),0)); - emitpcode(POC_ADDLW, popGetLit(1)); - emitSKPC; - emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - - goto release ; - } - - reAdjustPreg(AOP(result)); - pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - CLRC; - while (size--) { - l = aopGet(AOP(result),offset,FALSE,FALSE); - MOVA(l); - pic14_emitcode("rrc","a"); - aopPut(AOP(result),"a",offset--); - } - reAdjustPreg(AOP(result)); - - pic14_emitcode("","%05d_DS_:",tlbl1->key+100); - pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); - + operand *right, *left, *result; + sym_link *retype ; + int size, offset; + char *l; + symbol *tlbl, *tlbl1 ; + + /* if signed then we do it the hard way preserve the + sign bit moving it inwards */ + retype = getSpec(operandType(IC_RESULT(ic))); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (!SPEC_USIGN(retype)) { + genSignedRightShift (ic); + return ; + } + + /* signed & unsigned types are treated the same : i.e. the + signed is NOT propagated inwards : quoting from the + ANSI - standard : "for E1 >> E2, is equivalent to division + by 2**E2 if unsigned or if it has a non-negative value, + otherwise the result is implementation defined ", MY definition + is that the sign does not get propagated */ + + right = IC_RIGHT(ic); + left = IC_LEFT(ic); + result = IC_RESULT(ic); + + aopOp(right,ic,FALSE); + + /* if the shift count is known then do it + as efficiently as possible */ + if (AOP_TYPE(right) == AOP_LIT) { + genRightShiftLiteral (left,right,result,ic, 0); + return ; + } + + /* shift count is unknown then we have to form + a loop get the loop count in B : Note: we take + only the lower order byte since shifting + more that 32 bits make no sense anyway, ( the + largest size of an object can be only 32 bits ) */ + + pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("inc","b"); + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + /* now move the left to the result if they are not the + same */ + if (!pic14_sameRegs(AOP(left),AOP(result)) && + AOP_SIZE(result) > 1) { + + size = AOP_SIZE(result); + offset=0; + while (size--) { + l = aopGet(AOP(left),offset,FALSE,TRUE); + if (*l == '@' && IS_AOP_PREG(result)) { + + pic14_emitcode("mov","a,%s",l); + aopPut(AOP(result),"a",offset); + } else + aopPut(AOP(result),l,offset); + offset++; + } + } + + tlbl = newiTempLabel(NULL); + tlbl1= newiTempLabel(NULL); + size = AOP_SIZE(result); + offset = size - 1; + + /* if it is only one byte then */ + if (size == 1) { + + tlbl = newiTempLabel(NULL); + if (!pic14_sameRegs(AOP(left),AOP(result))) { + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + } + + emitpcode(POC_COMFW, popGet(AOP(right),0)); + emitpcode(POC_RLF, popGet(AOP(result),0)); + emitpLabel(tlbl->key); + emitpcode(POC_RRF, popGet(AOP(result),0)); + emitpcode(POC_ADDLW, popGetLit(1)); + emitSKPC; + emitpcode(POC_GOTO,popGetLabel(tlbl->key)); + + goto release ; + } + + reAdjustPreg(AOP(result)); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + CLRC; + while (size--) { + l = aopGet(AOP(result),offset,FALSE,FALSE); + MOVA(l); + pic14_emitcode("rrc","a"); + aopPut(AOP(result),"a",offset--); + } + reAdjustPreg(AOP(result)); + + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); + release: - freeAsmop(left,NULL,ic,TRUE); - freeAsmop (right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(left,NULL,ic,TRUE); + freeAsmop (right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -7786,105 +7785,105 @@ release: /*-----------------------------------------------------------------*/ static void genUnpackBits (operand *result, char *rname, int ptype) { - int shCnt ; - int rlen = 0 ; - sym_link *etype; - int offset = 0 ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - etype = getSpec(operandType(result)); - - /* read the first byte */ - switch (ptype) { - - case POINTER: - case IPOINTER: - pic14_emitcode("mov","a,@%s",rname); - break; - - case PPOINTER: - pic14_emitcode("movx","a,@%s",rname); - break; - - case FPOINTER: - pic14_emitcode("movx","a,@dptr"); - break; - - case CPOINTER: - pic14_emitcode("clr","a"); - pic14_emitcode("movc","a","@a+dptr"); - break; - - case GPOINTER: - pic14_emitcode("lcall","__gptrget"); - break; - } - - /* if we have bitdisplacement then it fits */ - /* into this byte completely or if length is */ - /* less than a byte */ - if ((shCnt = SPEC_BSTR(etype)) || - (SPEC_BLEN(etype) <= 8)) { - - /* shift right acc */ - AccRsh(shCnt); - - pic14_emitcode("anl","a,#0x%02x", - ((unsigned char) -1)>>(8 - SPEC_BLEN(etype))); - aopPut(AOP(result),"a",offset); - return ; - } - - /* bit field did not fit in a byte */ - rlen = SPEC_BLEN(etype) - 8; - aopPut(AOP(result),"a",offset++); - - while (1) { - - switch (ptype) { - case POINTER: - case IPOINTER: - pic14_emitcode("inc","%s",rname); - pic14_emitcode("mov","a,@%s",rname); - break; - - case PPOINTER: - pic14_emitcode("inc","%s",rname); - pic14_emitcode("movx","a,@%s",rname); - break; - - case FPOINTER: - pic14_emitcode("inc","dptr"); - pic14_emitcode("movx","a,@dptr"); - break; - - case CPOINTER: - pic14_emitcode("clr","a"); - pic14_emitcode("inc","dptr"); - pic14_emitcode("movc","a","@a+dptr"); - break; - - case GPOINTER: - pic14_emitcode("inc","dptr"); - pic14_emitcode("lcall","__gptrget"); - break; - } - - rlen -= 8; - /* if we are done */ - if ( rlen <= 0 ) - break ; - - aopPut(AOP(result),"a",offset++); - - } - - if (rlen) { - pic14_emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(-rlen)); - aopPut(AOP(result),"a",offset); - } - - return ; + int shCnt ; + int rlen = 0 ; + sym_link *etype; + int offset = 0 ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + etype = getSpec(operandType(result)); + + /* read the first byte */ + switch (ptype) { + + case POINTER: + case IPOINTER: + pic14_emitcode("mov","a,@%s",rname); + break; + + case PPOINTER: + pic14_emitcode("movx","a,@%s",rname); + break; + + case FPOINTER: + pic14_emitcode("movx","a,@dptr"); + break; + + case CPOINTER: + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a","@a+dptr"); + break; + + case GPOINTER: + pic14_emitcode("lcall","__gptrget"); + break; + } + + /* if we have bitdisplacement then it fits */ + /* into this byte completely or if length is */ + /* less than a byte */ + if ((shCnt = SPEC_BSTR(etype)) || + (SPEC_BLEN(etype) <= 8)) { + + /* shift right acc */ + AccRsh(shCnt); + + pic14_emitcode("anl","a,#0x%02x", + ((unsigned char) -1)>>(8 - SPEC_BLEN(etype))); + aopPut(AOP(result),"a",offset); + return ; + } + + /* bit field did not fit in a byte */ + rlen = SPEC_BLEN(etype) - 8; + aopPut(AOP(result),"a",offset++); + + while (1) { + + switch (ptype) { + case POINTER: + case IPOINTER: + pic14_emitcode("inc","%s",rname); + pic14_emitcode("mov","a,@%s",rname); + break; + + case PPOINTER: + pic14_emitcode("inc","%s",rname); + pic14_emitcode("movx","a,@%s",rname); + break; + + case FPOINTER: + pic14_emitcode("inc","dptr"); + pic14_emitcode("movx","a,@dptr"); + break; + + case CPOINTER: + pic14_emitcode("clr","a"); + pic14_emitcode("inc","dptr"); + pic14_emitcode("movc","a","@a+dptr"); + break; + + case GPOINTER: + pic14_emitcode("inc","dptr"); + pic14_emitcode("lcall","__gptrget"); + break; + } + + rlen -= 8; + /* if we are done */ + if ( rlen <= 0 ) + break ; + + aopPut(AOP(result),"a",offset++); + + } + + if (rlen) { + pic14_emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(-rlen)); + aopPut(AOP(result),"a",offset); + } + + return ; } #if 0 @@ -7892,1099 +7891,1099 @@ static void genUnpackBits (operand *result, char *rname, int ptype) /* genDataPointerGet - generates code when ptr offset is known */ /*-----------------------------------------------------------------*/ static void genDataPointerGet (operand *left, - operand *result, - iCode *ic) -{ - int size , offset = 0; - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - - /* optimization - most of the time, left and result are the same - * address, but different types. for the pic code, we could omit - * the following - */ - - aopOp(result,ic,TRUE); - - DEBUGpic14_AopType(__LINE__,left,NULL,result); - - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - - size = AOP_SIZE(result); - - while (size--) { - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - offset++; - } - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + operand *result, + iCode *ic) +{ + int size , offset = 0; + + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + + /* optimization - most of the time, left and result are the same + * address, but different types. for the pic code, we could omit + * the following + */ + + aopOp(result,ic,TRUE); + + DEBUGpic14_AopType(__LINE__,left,NULL,result); + + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + + size = AOP_SIZE(result); + + while (size--) { + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + offset++; + } + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } #endif /*-----------------------------------------------------------------*/ /* genNearPointerGet - pic14_emitcode for near pointer fetch */ /*-----------------------------------------------------------------*/ static void genNearPointerGet (operand *left, - operand *result, - iCode *ic) -{ - asmop *aop = NULL; - //regs *preg = NULL ; - char *rname ; - sym_link *rtype, *retype; - sym_link *ltype = operandType(left); - //char buffer[80]; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - rtype = operandType(result); - retype= getSpec(rtype); - - aopOp(left,ic,FALSE); - - /* if left is rematerialisable and - result is not bit variable type and - the left is pointer to data space i.e - lower 128 bytes of space */ - if (AOP_TYPE(left) == AOP_PCODE && //AOP_TYPE(left) == AOP_IMMD && - !IS_BITVAR(retype) && - DCL_TYPE(ltype) == POINTER) { - //genDataPointerGet (left,result,ic); - return ; - } - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - /* if the value is already in a pointer register - then don't need anything more */ - if (!AOP_INPREG(AOP(left))) { - /* otherwise get a free pointer register */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* - aop = newAsmop(0); - preg = getFreePtr(ic,&aop,FALSE); - pic14_emitcode("mov","%s,%s", - preg->name, - aopGet(AOP(left),0,FALSE,TRUE)); - rname = preg->name ; - */ - rname ="BAD"; - } else - rname = aopGet(AOP(left),0,FALSE,FALSE); - - aopOp (result,ic,FALSE); - - /* if bitfield then unpack the bits */ - if (IS_BITFIELD(retype)) - genUnpackBits (result,rname,POINTER); - else { - /* we have can just get the values */ - int size = AOP_SIZE(result); - int offset = 0 ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - emitpcode(POC_MOVFW,popGet(AOP(left),0)); - emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); - while(size--) { - emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); - emitpcode(POC_MOVWF,popGet(AOP(result),offset++)); - if(size) - emitpcode(POC_INCF,popCopyReg(&pc_fsr)); - } - /* - while (size--) { - if (IS_AOP_PREG(result) || AOP_TYPE(result) == AOP_STK ) { - - pic14_emitcode("mov","a,@%s",rname); - aopPut(AOP(result),"a",offset); - } else { - sprintf(buffer,"@%s",rname); - aopPut(AOP(result),buffer,offset); - } - offset++ ; - if (size) - pic14_emitcode("inc","%s",rname); - } - */ - } - - /* now some housekeeping stuff */ - if (aop) { - /* we had to allocate for this iCode */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - freeAsmop(NULL,aop,ic,TRUE); - } else { - /* we did not allocate which means left - already in a pointer register, then - if size > 0 && this could be used again - we have to point it back to where it - belongs */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (AOP_SIZE(result) > 1 && - !OP_SYMBOL(left)->remat && - ( OP_SYMBOL(left)->liveTo > ic->seq || - ic->depth )) { - int size = AOP_SIZE(result) - 1; - while (size--) - pic14_emitcode("dec","%s",rname); - } - } - - /* done */ - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - + operand *result, + iCode *ic) +{ + asmop *aop = NULL; + //regs *preg = NULL ; + char *rname ; + sym_link *rtype, *retype; + sym_link *ltype = operandType(left); + //char buffer[80]; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + rtype = operandType(result); + retype= getSpec(rtype); + + aopOp(left,ic,FALSE); + + /* if left is rematerialisable and + result is not bit variable type and + the left is pointer to data space i.e + lower 128 bytes of space */ + if (AOP_TYPE(left) == AOP_PCODE && //AOP_TYPE(left) == AOP_IMMD && + !IS_BITVAR(retype) && + DCL_TYPE(ltype) == POINTER) { + //genDataPointerGet (left,result,ic); + return ; + } + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + /* if the value is already in a pointer register + then don't need anything more */ + if (!AOP_INPREG(AOP(left))) { + /* otherwise get a free pointer register */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* + aop = newAsmop(0); + preg = getFreePtr(ic,&aop,FALSE); + pic14_emitcode("mov","%s,%s", + preg->name, + aopGet(AOP(left),0,FALSE,TRUE)); + rname = preg->name ; + */ + rname ="BAD"; + } else + rname = aopGet(AOP(left),0,FALSE,FALSE); + + aopOp (result,ic,FALSE); + + /* if bitfield then unpack the bits */ + if (IS_BITFIELD(retype)) + genUnpackBits (result,rname,POINTER); + else { + /* we have can just get the values */ + int size = AOP_SIZE(result); + int offset = 0 ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + emitpcode(POC_MOVFW,popGet(AOP(left),0)); + emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); + while(size--) { + emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); + emitpcode(POC_MOVWF,popGet(AOP(result),offset++)); + if(size) + emitpcode(POC_INCF,popCopyReg(&pc_fsr)); + } + /* + while (size--) { + if (IS_AOP_PREG(result) || AOP_TYPE(result) == AOP_STK ) { + + pic14_emitcode("mov","a,@%s",rname); + aopPut(AOP(result),"a",offset); + } else { + sprintf(buffer,"@%s",rname); + aopPut(AOP(result),buffer,offset); + } + offset++ ; + if (size) + pic14_emitcode("inc","%s",rname); + } + */ + } + + /* now some housekeeping stuff */ + if (aop) { + /* we had to allocate for this iCode */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + freeAsmop(NULL,aop,ic,TRUE); + } else { + /* we did not allocate which means left + already in a pointer register, then + if size > 0 && this could be used again + we have to point it back to where it + belongs */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (AOP_SIZE(result) > 1 && + !OP_SYMBOL(left)->remat && + ( OP_SYMBOL(left)->liveTo > ic->seq || + ic->depth )) { + int size = AOP_SIZE(result) - 1; + while (size--) + pic14_emitcode("dec","%s",rname); + } + } + + /* done */ + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + } /*-----------------------------------------------------------------*/ /* genPagedPointerGet - pic14_emitcode for paged pointer fetch */ /*-----------------------------------------------------------------*/ static void genPagedPointerGet (operand *left, - operand *result, - iCode *ic) -{ - asmop *aop = NULL; - regs *preg = NULL ; - char *rname ; - sym_link *rtype, *retype; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - rtype = operandType(result); - retype= getSpec(rtype); - - aopOp(left,ic,FALSE); - - /* if the value is already in a pointer register - then don't need anything more */ - if (!AOP_INPREG(AOP(left))) { - /* otherwise get a free pointer register */ - aop = newAsmop(0); - preg = getFreePtr(ic,&aop,FALSE); - pic14_emitcode("mov","%s,%s", - preg->name, - aopGet(AOP(left),0,FALSE,TRUE)); - rname = preg->name ; - } else - rname = aopGet(AOP(left),0,FALSE,FALSE); - - freeAsmop(left,NULL,ic,TRUE); - aopOp (result,ic,FALSE); - - /* if bitfield then unpack the bits */ - if (IS_BITFIELD(retype)) - genUnpackBits (result,rname,PPOINTER); - else { - /* we have can just get the values */ - int size = AOP_SIZE(result); - int offset = 0 ; - - while (size--) { - - pic14_emitcode("movx","a,@%s",rname); - aopPut(AOP(result),"a",offset); - - offset++ ; - - if (size) - pic14_emitcode("inc","%s",rname); - } - } - - /* now some housekeeping stuff */ - if (aop) { - /* we had to allocate for this iCode */ - freeAsmop(NULL,aop,ic,TRUE); - } else { - /* we did not allocate which means left - already in a pointer register, then - if size > 0 && this could be used again - we have to point it back to where it - belongs */ - if (AOP_SIZE(result) > 1 && - !OP_SYMBOL(left)->remat && - ( OP_SYMBOL(left)->liveTo > ic->seq || - ic->depth )) { - int size = AOP_SIZE(result) - 1; - while (size--) - pic14_emitcode("dec","%s",rname); - } - } - - /* done */ - freeAsmop(result,NULL,ic,TRUE); - - + operand *result, + iCode *ic) +{ + asmop *aop = NULL; + regs *preg = NULL ; + char *rname ; + sym_link *rtype, *retype; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + rtype = operandType(result); + retype= getSpec(rtype); + + aopOp(left,ic,FALSE); + + /* if the value is already in a pointer register + then don't need anything more */ + if (!AOP_INPREG(AOP(left))) { + /* otherwise get a free pointer register */ + aop = newAsmop(0); + preg = getFreePtr(ic,&aop,FALSE); + pic14_emitcode("mov","%s,%s", + preg->name, + aopGet(AOP(left),0,FALSE,TRUE)); + rname = preg->name ; + } else + rname = aopGet(AOP(left),0,FALSE,FALSE); + + freeAsmop(left,NULL,ic,TRUE); + aopOp (result,ic,FALSE); + + /* if bitfield then unpack the bits */ + if (IS_BITFIELD(retype)) + genUnpackBits (result,rname,PPOINTER); + else { + /* we have can just get the values */ + int size = AOP_SIZE(result); + int offset = 0 ; + + while (size--) { + + pic14_emitcode("movx","a,@%s",rname); + aopPut(AOP(result),"a",offset); + + offset++ ; + + if (size) + pic14_emitcode("inc","%s",rname); + } + } + + /* now some housekeeping stuff */ + if (aop) { + /* we had to allocate for this iCode */ + freeAsmop(NULL,aop,ic,TRUE); + } else { + /* we did not allocate which means left + already in a pointer register, then + if size > 0 && this could be used again + we have to point it back to where it + belongs */ + if (AOP_SIZE(result) > 1 && + !OP_SYMBOL(left)->remat && + ( OP_SYMBOL(left)->liveTo > ic->seq || + ic->depth )) { + int size = AOP_SIZE(result) - 1; + while (size--) + pic14_emitcode("dec","%s",rname); + } + } + + /* done */ + freeAsmop(result,NULL,ic,TRUE); + + } /*-----------------------------------------------------------------*/ /* genFarPointerGet - gget value from far space */ /*-----------------------------------------------------------------*/ static void genFarPointerGet (operand *left, - operand *result, iCode *ic) -{ - int size, offset ; - sym_link *retype = getSpec(operandType(result)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp(left,ic,FALSE); - - /* if the operand is already in dptr - then we do nothing else we move the value to dptr */ - if (AOP_TYPE(left) != AOP_STR) { - /* if this is remateriazable */ - if (AOP_TYPE(left) == AOP_IMMD) - pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); - else { /* we need to get it byte by byte */ - pic14_emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); - pic14_emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); - if (options.model == MODEL_FLAT24) - { - pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); - } - } - } - /* so dptr know contains the address */ - freeAsmop(left,NULL,ic,TRUE); - aopOp(result,ic,FALSE); - - /* if bit then unpack */ - if (IS_BITFIELD(retype)) - genUnpackBits(result,"dptr",FPOINTER); - else { - size = AOP_SIZE(result); - offset = 0 ; - - while (size--) { - pic14_emitcode("movx","a,@dptr"); - aopPut(AOP(result),"a",offset++); - if (size) - pic14_emitcode("inc","dptr"); - } - } - - freeAsmop(result,NULL,ic,TRUE); + operand *result, iCode *ic) +{ + int size, offset ; + sym_link *retype = getSpec(operandType(result)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp(left,ic,FALSE); + + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE(left) != AOP_STR) { + /* if this is remateriazable */ + if (AOP_TYPE(left) == AOP_IMMD) + pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); + else { /* we need to get it byte by byte */ + pic14_emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); + if (options.model == MODEL_FLAT24) + { + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); + } + } + } + /* so dptr know contains the address */ + freeAsmop(left,NULL,ic,TRUE); + aopOp(result,ic,FALSE); + + /* if bit then unpack */ + if (IS_BITFIELD(retype)) + genUnpackBits(result,"dptr",FPOINTER); + else { + size = AOP_SIZE(result); + offset = 0 ; + + while (size--) { + pic14_emitcode("movx","a,@dptr"); + aopPut(AOP(result),"a",offset++); + if (size) + pic14_emitcode("inc","dptr"); + } + } + + freeAsmop(result,NULL,ic,TRUE); } #if 0 /*-----------------------------------------------------------------*/ /* genCodePointerGet - get value from code space */ /*-----------------------------------------------------------------*/ static void genCodePointerGet (operand *left, - operand *result, iCode *ic) -{ - int size, offset ; - sym_link *retype = getSpec(operandType(result)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp(left,ic,FALSE); - - /* if the operand is already in dptr - then we do nothing else we move the value to dptr */ - if (AOP_TYPE(left) != AOP_STR) { - /* if this is remateriazable */ - if (AOP_TYPE(left) == AOP_IMMD) - pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); - else { /* we need to get it byte by byte */ - pic14_emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); - pic14_emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); - if (options.model == MODEL_FLAT24) - { - pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); - } - } - } - /* so dptr know contains the address */ - freeAsmop(left,NULL,ic,TRUE); - aopOp(result,ic,FALSE); - - /* if bit then unpack */ - if (IS_BITFIELD(retype)) - genUnpackBits(result,"dptr",CPOINTER); - else { - size = AOP_SIZE(result); - offset = 0 ; - - while (size--) { - pic14_emitcode("clr","a"); - pic14_emitcode("movc","a,@a+dptr"); - aopPut(AOP(result),"a",offset++); - if (size) - pic14_emitcode("inc","dptr"); - } - } - - freeAsmop(result,NULL,ic,TRUE); + operand *result, iCode *ic) +{ + int size, offset ; + sym_link *retype = getSpec(operandType(result)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp(left,ic,FALSE); + + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE(left) != AOP_STR) { + /* if this is remateriazable */ + if (AOP_TYPE(left) == AOP_IMMD) + pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); + else { /* we need to get it byte by byte */ + pic14_emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); + if (options.model == MODEL_FLAT24) + { + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); + } + } + } + /* so dptr know contains the address */ + freeAsmop(left,NULL,ic,TRUE); + aopOp(result,ic,FALSE); + + /* if bit then unpack */ + if (IS_BITFIELD(retype)) + genUnpackBits(result,"dptr",CPOINTER); + else { + size = AOP_SIZE(result); + offset = 0 ; + + while (size--) { + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a,@a+dptr"); + aopPut(AOP(result),"a",offset++); + if (size) + pic14_emitcode("inc","dptr"); + } + } + + freeAsmop(result,NULL,ic,TRUE); } #endif /*-----------------------------------------------------------------*/ /* genGenPointerGet - gget value from generic pointer space */ /*-----------------------------------------------------------------*/ static void genGenPointerGet (operand *left, - operand *result, iCode *ic) -{ - int size, offset ; - sym_link *retype = getSpec(operandType(result)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - - DEBUGpic14_AopType(__LINE__,left,NULL,result); - - /* if the operand is already in dptr - then we do nothing else we move the value to dptr */ - // if (AOP_TYPE(left) != AOP_STR) { - /* if this is remateriazable */ - if (AOP_TYPE(left) == AOP_IMMD) { - pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); - pic14_emitcode("mov","b,#%d",pointerCode(retype)); - } - else { /* we need to get it byte by byte */ - - emitpcode(POC_MOVFW,popGet(AOP(left),0)); - emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); - - size = AOP_SIZE(result); - offset = 0 ; - - while(size--) { - emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); - emitpcode(POC_MOVWF,popGet(AOP(result),offset++)); - if(size) - emitpcode(POC_INCF,popCopyReg(&pc_fsr)); - } - goto release; - } - //} - /* so dptr know contains the address */ - - /* if bit then unpack */ - //if (IS_BITFIELD(retype)) - // genUnpackBits(result,"dptr",GPOINTER); - + operand *result, iCode *ic) +{ + int size, offset ; + sym_link *retype = getSpec(operandType(result)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + + DEBUGpic14_AopType(__LINE__,left,NULL,result); + + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + // if (AOP_TYPE(left) != AOP_STR) { + /* if this is remateriazable */ + if (AOP_TYPE(left) == AOP_IMMD) { + pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); + pic14_emitcode("mov","b,#%d",pointerCode(retype)); + } + else { /* we need to get it byte by byte */ + + emitpcode(POC_MOVFW,popGet(AOP(left),0)); + emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); + + size = AOP_SIZE(result); + offset = 0 ; + + while(size--) { + emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); + emitpcode(POC_MOVWF,popGet(AOP(result),offset++)); + if(size) + emitpcode(POC_INCF,popCopyReg(&pc_fsr)); + } + goto release; + } + //} + /* so dptr know contains the address */ + + /* if bit then unpack */ + //if (IS_BITFIELD(retype)) + // genUnpackBits(result,"dptr",GPOINTER); + release: - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + } /*-----------------------------------------------------------------*/ /* genConstPointerGet - get value from const generic pointer space */ /*-----------------------------------------------------------------*/ static void genConstPointerGet (operand *left, - operand *result, iCode *ic) -{ - //sym_link *retype = getSpec(operandType(result)); - symbol *albl = newiTempLabel(NULL); - symbol *blbl = newiTempLabel(NULL); - PIC_OPCODE poc; - pCodeOp *pcop; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp(left,ic,FALSE); - aopOp(result,ic,FALSE); - - - DEBUGpic14_AopType(__LINE__,left,NULL,result); - - DEBUGpic14_emitcode ("; "," %d getting const pointer",__LINE__); - - emitpcode(POC_CALL,popGetLabel(albl->key)); - pcop = popGetLabel(blbl->key); - emitpcode(POC_PAGESEL,popGetWithString(pcop->name,0)); /* Must restore PCLATH before goto, without destroying W */ - emitpcode(POC_GOTO,pcop); - emitpLabel(albl->key); - - poc = ( (AOP_TYPE(left) == AOP_PCODE) ? POC_MOVLW : POC_MOVFW); - - emitpcode(poc,popGet(AOP(left),1)); - emitpcode(POC_MOVWF,popCopyReg(&pc_pclath)); - emitpcode(poc,popGet(AOP(left),0)); - emitpcode(POC_MOVWF,popCopyReg(&pc_pcl)); - - emitpLabel(blbl->key); - - emitpcode(POC_MOVWF,popGet(AOP(result),0)); - - - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - + operand *result, iCode *ic) +{ + //sym_link *retype = getSpec(operandType(result)); + symbol *albl = newiTempLabel(NULL); + symbol *blbl = newiTempLabel(NULL); + PIC_OPCODE poc; + pCodeOp *pcop; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp(left,ic,FALSE); + aopOp(result,ic,FALSE); + + + DEBUGpic14_AopType(__LINE__,left,NULL,result); + + DEBUGpic14_emitcode ("; "," %d getting const pointer",__LINE__); + + emitpcode(POC_CALL,popGetLabel(albl->key)); + pcop = popGetLabel(blbl->key); + emitpcode(POC_PAGESEL,popGetWithString(pcop->name,0)); /* Must restore PCLATH before goto, without destroying W */ + emitpcode(POC_GOTO,pcop); + emitpLabel(albl->key); + + poc = ( (AOP_TYPE(left) == AOP_PCODE) ? POC_MOVLW : POC_MOVFW); + + emitpcode(poc,popGet(AOP(left),1)); + emitpcode(POC_MOVWF,popCopyReg(&pc_pclath)); + emitpcode(poc,popGet(AOP(left),0)); + emitpcode(POC_MOVWF,popCopyReg(&pc_pcl)); + + emitpLabel(blbl->key); + + emitpcode(POC_MOVWF,popGet(AOP(result),0)); + + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + } /*-----------------------------------------------------------------*/ /* genPointerGet - generate code for pointer get */ /*-----------------------------------------------------------------*/ static void genPointerGet (iCode *ic) { - operand *left, *result ; - sym_link *type, *etype; - int p_type; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - left = IC_LEFT(ic); - result = IC_RESULT(ic) ; - - /* depending on the type of pointer we need to - move it to the correct pointer register */ - type = operandType(left); - etype = getSpec(type); - - if (IS_PTR_CONST(type)) - DEBUGpic14_emitcode ("; ***","%d - const pointer",__LINE__); - - /* if left is of type of pointer then it is simple */ - if (IS_PTR(type) && !IS_FUNC(type->next)) - p_type = DCL_TYPE(type); - else { - /* we have to go by the storage class */ - p_type = PTR_TYPE(SPEC_OCLS(etype)); - - DEBUGpic14_emitcode ("; ***","%d - resolve pointer by storage class",__LINE__); - - if (SPEC_OCLS(etype)->codesp ) { - DEBUGpic14_emitcode ("; ***","%d - cpointer",__LINE__); - //p_type = CPOINTER ; - } - else - if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) - DEBUGpic14_emitcode ("; ***","%d - fpointer",__LINE__); - /*p_type = FPOINTER ;*/ - else - if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) - DEBUGpic14_emitcode ("; ***","%d - ppointer",__LINE__); - /* p_type = PPOINTER; */ - else - if (SPEC_OCLS(etype) == idata ) - DEBUGpic14_emitcode ("; ***","%d - ipointer",__LINE__); - /* p_type = IPOINTER; */ - else - DEBUGpic14_emitcode ("; ***","%d - pointer",__LINE__); - /* p_type = POINTER ; */ - } - - /* now that we have the pointer type we assign - the pointer values */ - switch (p_type) { - - case POINTER: - case IPOINTER: - genNearPointerGet (left,result,ic); - break; - - case PPOINTER: - genPagedPointerGet(left,result,ic); - break; - - case FPOINTER: - genFarPointerGet (left,result,ic); - break; - - case CPOINTER: - genConstPointerGet (left,result,ic); - //pic14_emitcodePointerGet (left,result,ic); - break; - - case GPOINTER: - if (IS_PTR_CONST(type)) - genConstPointerGet (left,result,ic); - else - genGenPointerGet (left,result,ic); - break; - } - + operand *left, *result ; + sym_link *type, *etype; + int p_type; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + left = IC_LEFT(ic); + result = IC_RESULT(ic) ; + + /* depending on the type of pointer we need to + move it to the correct pointer register */ + type = operandType(left); + etype = getSpec(type); + + if (IS_PTR_CONST(type)) + DEBUGpic14_emitcode ("; ***","%d - const pointer",__LINE__); + + /* if left is of type of pointer then it is simple */ + if (IS_PTR(type) && !IS_FUNC(type->next)) + p_type = DCL_TYPE(type); + else { + /* we have to go by the storage class */ + p_type = PTR_TYPE(SPEC_OCLS(etype)); + + DEBUGpic14_emitcode ("; ***","%d - resolve pointer by storage class",__LINE__); + + if (SPEC_OCLS(etype)->codesp ) { + DEBUGpic14_emitcode ("; ***","%d - cpointer",__LINE__); + //p_type = CPOINTER ; + } + else + if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) + DEBUGpic14_emitcode ("; ***","%d - fpointer",__LINE__); + /*p_type = FPOINTER ;*/ + else + if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) + DEBUGpic14_emitcode ("; ***","%d - ppointer",__LINE__); + /* p_type = PPOINTER; */ + else + if (SPEC_OCLS(etype) == idata ) + DEBUGpic14_emitcode ("; ***","%d - ipointer",__LINE__); + /* p_type = IPOINTER; */ + else + DEBUGpic14_emitcode ("; ***","%d - pointer",__LINE__); + /* p_type = POINTER ; */ + } + + /* now that we have the pointer type we assign + the pointer values */ + switch (p_type) { + + case POINTER: + case IPOINTER: + genNearPointerGet (left,result,ic); + break; + + case PPOINTER: + genPagedPointerGet(left,result,ic); + break; + + case FPOINTER: + genFarPointerGet (left,result,ic); + break; + + case CPOINTER: + genConstPointerGet (left,result,ic); + //pic14_emitcodePointerGet (left,result,ic); + break; + + case GPOINTER: + if (IS_PTR_CONST(type)) + genConstPointerGet (left,result,ic); + else + genGenPointerGet (left,result,ic); + break; + } + } /*-----------------------------------------------------------------*/ /* genPackBits - generates code for packed bit storage */ /*-----------------------------------------------------------------*/ static void genPackBits (sym_link *etype , - operand *right , - char *rname, int p_type) -{ - int shCount = 0 ; - int offset = 0 ; - int rLen = 0 ; - int blen, bstr ; - char *l ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - blen = SPEC_BLEN(etype); - bstr = SPEC_BSTR(etype); - - l = aopGet(AOP(right),offset++,FALSE,FALSE); - MOVA(l); - - /* if the bit lenth is less than or */ - /* it exactly fits a byte then */ - if (SPEC_BLEN(etype) <= 8 ) { - shCount = SPEC_BSTR(etype) ; - - /* shift left acc */ - AccLsh(shCount); - - if (SPEC_BLEN(etype) < 8 ) { /* if smaller than a byte */ - - - switch (p_type) { - case POINTER: - pic14_emitcode ("mov","b,a"); - pic14_emitcode("mov","a,@%s",rname); - break; - - case FPOINTER: - pic14_emitcode ("mov","b,a"); - pic14_emitcode("movx","a,@dptr"); - break; - - case GPOINTER: - pic14_emitcode ("push","b"); - pic14_emitcode ("push","acc"); - pic14_emitcode ("lcall","__gptrget"); - pic14_emitcode ("pop","b"); - break; - } - - pic14_emitcode ("anl","a,#0x%02x",(unsigned char) - ((unsigned char)(0xFF << (blen+bstr)) | - (unsigned char)(0xFF >> (8-bstr)) ) ); - pic14_emitcode ("orl","a,b"); - if (p_type == GPOINTER) - pic14_emitcode("pop","b"); - } - } - - switch (p_type) { - case POINTER: - pic14_emitcode("mov","@%s,a",rname); - break; - - case FPOINTER: - pic14_emitcode("movx","@dptr,a"); - break; - - case GPOINTER: - DEBUGpic14_emitcode(";lcall","__gptrput"); - break; - } - - /* if we r done */ - if ( SPEC_BLEN(etype) <= 8 ) - return ; - - pic14_emitcode("inc","%s",rname); - rLen = SPEC_BLEN(etype) ; - - /* now generate for lengths greater than one byte */ - while (1) { - - l = aopGet(AOP(right),offset++,FALSE,TRUE); - - rLen -= 8 ; - if (rLen <= 0 ) - break ; - - switch (p_type) { - case POINTER: - if (*l == '@') { - MOVA(l); - pic14_emitcode("mov","@%s,a",rname); - } else - pic14_emitcode("mov","@%s,%s",rname,l); - break; - - case FPOINTER: - MOVA(l); - pic14_emitcode("movx","@dptr,a"); - break; - - case GPOINTER: - MOVA(l); - DEBUGpic14_emitcode(";lcall","__gptrput"); - break; - } - pic14_emitcode ("inc","%s",rname); - } - - MOVA(l); - - /* last last was not complete */ - if (rLen) { - /* save the byte & read byte */ - switch (p_type) { - case POINTER: - pic14_emitcode ("mov","b,a"); - pic14_emitcode("mov","a,@%s",rname); - break; - - case FPOINTER: - pic14_emitcode ("mov","b,a"); - pic14_emitcode("movx","a,@dptr"); - break; - - case GPOINTER: - pic14_emitcode ("push","b"); - pic14_emitcode ("push","acc"); - pic14_emitcode ("lcall","__gptrget"); - pic14_emitcode ("pop","b"); - break; - } - - pic14_emitcode ("anl","a,#0x%02x",((unsigned char)-1 << -rLen) ); - pic14_emitcode ("orl","a,b"); - } - - if (p_type == GPOINTER) - pic14_emitcode("pop","b"); - - switch (p_type) { - - case POINTER: - pic14_emitcode("mov","@%s,a",rname); - break; - - case FPOINTER: - pic14_emitcode("movx","@dptr,a"); - break; - - case GPOINTER: - DEBUGpic14_emitcode(";lcall","__gptrput"); - break; - } + operand *right , + char *rname, int p_type) +{ + int shCount = 0 ; + int offset = 0 ; + int rLen = 0 ; + int blen, bstr ; + char *l ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + blen = SPEC_BLEN(etype); + bstr = SPEC_BSTR(etype); + + l = aopGet(AOP(right),offset++,FALSE,FALSE); + MOVA(l); + + /* if the bit lenth is less than or */ + /* it exactly fits a byte then */ + if (SPEC_BLEN(etype) <= 8 ) { + shCount = SPEC_BSTR(etype) ; + + /* shift left acc */ + AccLsh(shCount); + + if (SPEC_BLEN(etype) < 8 ) { /* if smaller than a byte */ + + + switch (p_type) { + case POINTER: + pic14_emitcode ("mov","b,a"); + pic14_emitcode("mov","a,@%s",rname); + break; + + case FPOINTER: + pic14_emitcode ("mov","b,a"); + pic14_emitcode("movx","a,@dptr"); + break; + + case GPOINTER: + pic14_emitcode ("push","b"); + pic14_emitcode ("push","acc"); + pic14_emitcode ("lcall","__gptrget"); + pic14_emitcode ("pop","b"); + break; + } + + pic14_emitcode ("anl","a,#0x%02x",(unsigned char) + ((unsigned char)(0xFF << (blen+bstr)) | + (unsigned char)(0xFF >> (8-bstr)) ) ); + pic14_emitcode ("orl","a,b"); + if (p_type == GPOINTER) + pic14_emitcode("pop","b"); + } + } + + switch (p_type) { + case POINTER: + pic14_emitcode("mov","@%s,a",rname); + break; + + case FPOINTER: + pic14_emitcode("movx","@dptr,a"); + break; + + case GPOINTER: + DEBUGpic14_emitcode(";lcall","__gptrput"); + break; + } + + /* if we r done */ + if ( SPEC_BLEN(etype) <= 8 ) + return ; + + pic14_emitcode("inc","%s",rname); + rLen = SPEC_BLEN(etype) ; + + /* now generate for lengths greater than one byte */ + while (1) { + + l = aopGet(AOP(right),offset++,FALSE,TRUE); + + rLen -= 8 ; + if (rLen <= 0 ) + break ; + + switch (p_type) { + case POINTER: + if (*l == '@') { + MOVA(l); + pic14_emitcode("mov","@%s,a",rname); + } else + pic14_emitcode("mov","@%s,%s",rname,l); + break; + + case FPOINTER: + MOVA(l); + pic14_emitcode("movx","@dptr,a"); + break; + + case GPOINTER: + MOVA(l); + DEBUGpic14_emitcode(";lcall","__gptrput"); + break; + } + pic14_emitcode ("inc","%s",rname); + } + + MOVA(l); + + /* last last was not complete */ + if (rLen) { + /* save the byte & read byte */ + switch (p_type) { + case POINTER: + pic14_emitcode ("mov","b,a"); + pic14_emitcode("mov","a,@%s",rname); + break; + + case FPOINTER: + pic14_emitcode ("mov","b,a"); + pic14_emitcode("movx","a,@dptr"); + break; + + case GPOINTER: + pic14_emitcode ("push","b"); + pic14_emitcode ("push","acc"); + pic14_emitcode ("lcall","__gptrget"); + pic14_emitcode ("pop","b"); + break; + } + + pic14_emitcode ("anl","a,#0x%02x",((unsigned char)-1 << -rLen) ); + pic14_emitcode ("orl","a,b"); + } + + if (p_type == GPOINTER) + pic14_emitcode("pop","b"); + + switch (p_type) { + + case POINTER: + pic14_emitcode("mov","@%s,a",rname); + break; + + case FPOINTER: + pic14_emitcode("movx","@dptr,a"); + break; + + case GPOINTER: + DEBUGpic14_emitcode(";lcall","__gptrput"); + break; + } } /*-----------------------------------------------------------------*/ /* genDataPointerSet - remat pointer to data space */ /*-----------------------------------------------------------------*/ static void genDataPointerSet(operand *right, - operand *result, - iCode *ic) -{ - int size, offset = 0 ; - char *l, buffer[256]; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp(right,ic,FALSE); - - l = aopGet(AOP(result),0,FALSE,TRUE); - size = AOP_SIZE(right); - /* - if ( AOP_TYPE(result) == AOP_PCODE) { - fprintf(stderr,"genDataPointerSet %s, %d\n", - AOP(result)->aopu.pcop->name, - PCOI(AOP(result)->aopu.pcop)->offset); - } - */ - - // tsd, was l+1 - the underline `_' prefix was being stripped - while (size--) { - if (offset) { - sprintf(buffer,"(%s + %d)",l,offset); - fprintf(stderr,"oops %s\n",buffer); - } else - sprintf(buffer,"%s",l); - - if (AOP_TYPE(right) == AOP_LIT) { - unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); - lit = lit >> (8*offset); - if(lit&0xff) { - pic14_emitcode("movlw","%d",lit); - pic14_emitcode("movwf","%s",buffer); - - emitpcode(POC_MOVLW, popGetLit(lit&0xff)); - //emitpcode(POC_MOVWF, popRegFromString(buffer)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - - } else { - pic14_emitcode("clrf","%s",buffer); - //emitpcode(POC_CLRF, popRegFromString(buffer)); - emitpcode(POC_CLRF, popGet(AOP(result),0)); - } - }else { - pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s",buffer); - - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - //emitpcode(POC_MOVWF, popRegFromString(buffer)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - - } - - offset++; - } - - freeAsmop(right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + operand *result, + iCode *ic) +{ + int size, offset = 0 ; + char *l, buffer[256]; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp(right,ic,FALSE); + + l = aopGet(AOP(result),0,FALSE,TRUE); + size = AOP_SIZE(right); + /* + if ( AOP_TYPE(result) == AOP_PCODE) { + fprintf(stderr,"genDataPointerSet %s, %d\n", + AOP(result)->aopu.pcop->name, + PCOI(AOP(result)->aopu.pcop)->offset); + } + */ + + // tsd, was l+1 - the underline `_' prefix was being stripped + while (size--) { + if (offset) { + sprintf(buffer,"(%s + %d)",l,offset); + fprintf(stderr,"oops %s\n",buffer); + } else + sprintf(buffer,"%s",l); + + if (AOP_TYPE(right) == AOP_LIT) { + unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); + lit = lit >> (8*offset); + if(lit&0xff) { + pic14_emitcode("movlw","%d",lit); + pic14_emitcode("movwf","%s",buffer); + + emitpcode(POC_MOVLW, popGetLit(lit&0xff)); + //emitpcode(POC_MOVWF, popRegFromString(buffer)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + + } else { + pic14_emitcode("clrf","%s",buffer); + //emitpcode(POC_CLRF, popRegFromString(buffer)); + emitpcode(POC_CLRF, popGet(AOP(result),0)); + } + }else { + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",buffer); + + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + //emitpcode(POC_MOVWF, popRegFromString(buffer)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + + } + + offset++; + } + + freeAsmop(right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genNearPointerSet - pic14_emitcode for near pointer put */ /*-----------------------------------------------------------------*/ static void genNearPointerSet (operand *right, - operand *result, - iCode *ic) -{ - asmop *aop = NULL; - char *l; - sym_link *retype; - sym_link *ptype = operandType(result); - - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - retype= getSpec(operandType(right)); - - aopOp(result,ic,FALSE); - - - /* if the result is rematerializable & - in data space & not a bit variable */ - //if (AOP_TYPE(result) == AOP_IMMD && - if (AOP_TYPE(result) == AOP_PCODE && //AOP_TYPE(result) == AOP_IMMD && - DCL_TYPE(ptype) == POINTER && - !IS_BITFIELD(retype)) { - genDataPointerSet (right,result,ic); - freeAsmop(result,NULL,ic,TRUE); - return; - } - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp(right,ic,FALSE); - DEBUGpic14_AopType(__LINE__,NULL,right,result); - - /* if the value is already in a pointer register - then don't need anything more */ - if (!AOP_INPREG(AOP(result))) { - /* otherwise get a free pointer register */ - //aop = newAsmop(0); - //preg = getFreePtr(ic,&aop,FALSE); - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - //pic14_emitcode("mov","%s,%s", - // preg->name, - // aopGet(AOP(result),0,FALSE,TRUE)); - //rname = preg->name ; - //pic14_emitcode("movwf","fsr"); - emitpcode(POC_MOVFW, popGet(AOP(result),0)); - emitpcode(POC_MOVWF, popCopyReg(&pc_fsr)); - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - emitpcode(POC_MOVWF, popCopyReg(&pc_indf)); - goto release; - - }// else - // rname = aopGet(AOP(result),0,FALSE,FALSE); - - - /* if bitfield then unpack the bits */ - if (IS_BITFIELD(retype)) { - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "The programmer is obviously confused"); - //genPackBits (retype,right,rname,POINTER); - exit(1); - } - else { - /* we have can just get the values */ - int size = AOP_SIZE(right); - int offset = 0 ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - while (size--) { - l = aopGet(AOP(right),offset,FALSE,TRUE); - if (*l == '@' ) { - //MOVA(l); - //pic14_emitcode("mov","@%s,a",rname); - pic14_emitcode("movf","indf,w ;1"); - } else { - - if (AOP_TYPE(right) == AOP_LIT) { - unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); - if(lit) { - pic14_emitcode("movlw","%s",l); - pic14_emitcode("movwf","indf ;2"); - } else - pic14_emitcode("clrf","indf"); - }else { - pic14_emitcode("movf","%s,w",l); - pic14_emitcode("movwf","indf ;2"); - } - //pic14_emitcode("mov","@%s,%s",rname,l); - } - if (size) - pic14_emitcode("incf","fsr,f ;3"); - //pic14_emitcode("inc","%s",rname); - offset++; - } - } - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* now some housekeeping stuff */ - if (aop) { - /* we had to allocate for this iCode */ - freeAsmop(NULL,aop,ic,TRUE); - } else { - /* we did not allocate which means left - already in a pointer register, then - if size > 0 && this could be used again - we have to point it back to where it - belongs */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (AOP_SIZE(right) > 1 && - !OP_SYMBOL(result)->remat && - ( OP_SYMBOL(result)->liveTo > ic->seq || - ic->depth )) { - int size = AOP_SIZE(right) - 1; - while (size--) - pic14_emitcode("decf","fsr,f"); - //pic14_emitcode("dec","%s",rname); - } - } - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* done */ + operand *result, + iCode *ic) +{ + asmop *aop = NULL; + char *l; + sym_link *retype; + sym_link *ptype = operandType(result); + + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + retype= getSpec(operandType(right)); + + aopOp(result,ic,FALSE); + + + /* if the result is rematerializable & + in data space & not a bit variable */ + //if (AOP_TYPE(result) == AOP_IMMD && + if (AOP_TYPE(result) == AOP_PCODE && //AOP_TYPE(result) == AOP_IMMD && + DCL_TYPE(ptype) == POINTER && + !IS_BITFIELD(retype)) { + genDataPointerSet (right,result,ic); + freeAsmop(result,NULL,ic,TRUE); + return; + } + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp(right,ic,FALSE); + DEBUGpic14_AopType(__LINE__,NULL,right,result); + + /* if the value is already in a pointer register + then don't need anything more */ + if (!AOP_INPREG(AOP(result))) { + /* otherwise get a free pointer register */ + //aop = newAsmop(0); + //preg = getFreePtr(ic,&aop,FALSE); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + //pic14_emitcode("mov","%s,%s", + // preg->name, + // aopGet(AOP(result),0,FALSE,TRUE)); + //rname = preg->name ; + //pic14_emitcode("movwf","fsr"); + emitpcode(POC_MOVFW, popGet(AOP(result),0)); + emitpcode(POC_MOVWF, popCopyReg(&pc_fsr)); + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + emitpcode(POC_MOVWF, popCopyReg(&pc_indf)); + goto release; + + }// else + // rname = aopGet(AOP(result),0,FALSE,FALSE); + + + /* if bitfield then unpack the bits */ + if (IS_BITFIELD(retype)) { + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "The programmer is obviously confused"); + //genPackBits (retype,right,rname,POINTER); + exit(1); + } + else { + /* we have can just get the values */ + int size = AOP_SIZE(right); + int offset = 0 ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + while (size--) { + l = aopGet(AOP(right),offset,FALSE,TRUE); + if (*l == '@' ) { + //MOVA(l); + //pic14_emitcode("mov","@%s,a",rname); + pic14_emitcode("movf","indf,w ;1"); + } else { + + if (AOP_TYPE(right) == AOP_LIT) { + unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); + if(lit) { + pic14_emitcode("movlw","%s",l); + pic14_emitcode("movwf","indf ;2"); + } else + pic14_emitcode("clrf","indf"); + }else { + pic14_emitcode("movf","%s,w",l); + pic14_emitcode("movwf","indf ;2"); + } + //pic14_emitcode("mov","@%s,%s",rname,l); + } + if (size) + pic14_emitcode("incf","fsr,f ;3"); + //pic14_emitcode("inc","%s",rname); + offset++; + } + } + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* now some housekeeping stuff */ + if (aop) { + /* we had to allocate for this iCode */ + freeAsmop(NULL,aop,ic,TRUE); + } else { + /* we did not allocate which means left + already in a pointer register, then + if size > 0 && this could be used again + we have to point it back to where it + belongs */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (AOP_SIZE(right) > 1 && + !OP_SYMBOL(result)->remat && + ( OP_SYMBOL(result)->liveTo > ic->seq || + ic->depth )) { + int size = AOP_SIZE(right) - 1; + while (size--) + pic14_emitcode("decf","fsr,f"); + //pic14_emitcode("dec","%s",rname); + } + } + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* done */ release: - freeAsmop(right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genPagedPointerSet - pic14_emitcode for Paged pointer put */ /*-----------------------------------------------------------------*/ static void genPagedPointerSet (operand *right, - operand *result, - iCode *ic) -{ - asmop *aop = NULL; - regs *preg = NULL ; - char *rname , *l; - sym_link *retype; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - retype= getSpec(operandType(right)); - - aopOp(result,ic,FALSE); - - /* if the value is already in a pointer register - then don't need anything more */ - if (!AOP_INPREG(AOP(result))) { - /* otherwise get a free pointer register */ - aop = newAsmop(0); - preg = getFreePtr(ic,&aop,FALSE); - pic14_emitcode("mov","%s,%s", - preg->name, - aopGet(AOP(result),0,FALSE,TRUE)); - rname = preg->name ; - } else - rname = aopGet(AOP(result),0,FALSE,FALSE); - - freeAsmop(result,NULL,ic,TRUE); - aopOp (right,ic,FALSE); - - /* if bitfield then unpack the bits */ - if (IS_BITFIELD(retype)) - genPackBits (retype,right,rname,PPOINTER); - else { - /* we have can just get the values */ - int size = AOP_SIZE(right); - int offset = 0 ; - - while (size--) { - l = aopGet(AOP(right),offset,FALSE,TRUE); - - MOVA(l); - pic14_emitcode("movx","@%s,a",rname); - - if (size) - pic14_emitcode("inc","%s",rname); - - offset++; - } - } - - /* now some housekeeping stuff */ - if (aop) { - /* we had to allocate for this iCode */ - freeAsmop(NULL,aop,ic,TRUE); - } else { - /* we did not allocate which means left - already in a pointer register, then - if size > 0 && this could be used again - we have to point it back to where it - belongs */ - if (AOP_SIZE(right) > 1 && - !OP_SYMBOL(result)->remat && - ( OP_SYMBOL(result)->liveTo > ic->seq || - ic->depth )) { - int size = AOP_SIZE(right) - 1; - while (size--) - pic14_emitcode("dec","%s",rname); - } - } - - /* done */ - freeAsmop(right,NULL,ic,TRUE); - - + operand *result, + iCode *ic) +{ + asmop *aop = NULL; + regs *preg = NULL ; + char *rname , *l; + sym_link *retype; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + retype= getSpec(operandType(right)); + + aopOp(result,ic,FALSE); + + /* if the value is already in a pointer register + then don't need anything more */ + if (!AOP_INPREG(AOP(result))) { + /* otherwise get a free pointer register */ + aop = newAsmop(0); + preg = getFreePtr(ic,&aop,FALSE); + pic14_emitcode("mov","%s,%s", + preg->name, + aopGet(AOP(result),0,FALSE,TRUE)); + rname = preg->name ; + } else + rname = aopGet(AOP(result),0,FALSE,FALSE); + + freeAsmop(result,NULL,ic,TRUE); + aopOp (right,ic,FALSE); + + /* if bitfield then unpack the bits */ + if (IS_BITFIELD(retype)) + genPackBits (retype,right,rname,PPOINTER); + else { + /* we have can just get the values */ + int size = AOP_SIZE(right); + int offset = 0 ; + + while (size--) { + l = aopGet(AOP(right),offset,FALSE,TRUE); + + MOVA(l); + pic14_emitcode("movx","@%s,a",rname); + + if (size) + pic14_emitcode("inc","%s",rname); + + offset++; + } + } + + /* now some housekeeping stuff */ + if (aop) { + /* we had to allocate for this iCode */ + freeAsmop(NULL,aop,ic,TRUE); + } else { + /* we did not allocate which means left + already in a pointer register, then + if size > 0 && this could be used again + we have to point it back to where it + belongs */ + if (AOP_SIZE(right) > 1 && + !OP_SYMBOL(result)->remat && + ( OP_SYMBOL(result)->liveTo > ic->seq || + ic->depth )) { + int size = AOP_SIZE(right) - 1; + while (size--) + pic14_emitcode("dec","%s",rname); + } + } + + /* done */ + freeAsmop(right,NULL,ic,TRUE); + + } /*-----------------------------------------------------------------*/ /* genFarPointerSet - set value from far space */ /*-----------------------------------------------------------------*/ static void genFarPointerSet (operand *right, - operand *result, iCode *ic) -{ - int size, offset ; - sym_link *retype = getSpec(operandType(right)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp(result,ic,FALSE); - - /* if the operand is already in dptr - then we do nothing else we move the value to dptr */ - if (AOP_TYPE(result) != AOP_STR) { - /* if this is remateriazable */ - if (AOP_TYPE(result) == AOP_IMMD) - pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); - else { /* we need to get it byte by byte */ - pic14_emitcode("mov","dpl,%s",aopGet(AOP(result),0,FALSE,FALSE)); - pic14_emitcode("mov","dph,%s",aopGet(AOP(result),1,FALSE,FALSE)); - if (options.model == MODEL_FLAT24) - { - pic14_emitcode("mov", "dpx,%s",aopGet(AOP(result),2,FALSE,FALSE)); - } - } - } - /* so dptr know contains the address */ - freeAsmop(result,NULL,ic,TRUE); - aopOp(right,ic,FALSE); - - /* if bit then unpack */ - if (IS_BITFIELD(retype)) - genPackBits(retype,right,"dptr",FPOINTER); - else { - size = AOP_SIZE(right); - offset = 0 ; - - while (size--) { - char *l = aopGet(AOP(right),offset++,FALSE,FALSE); - MOVA(l); - pic14_emitcode("movx","@dptr,a"); - if (size) - pic14_emitcode("inc","dptr"); - } - } - - freeAsmop(right,NULL,ic,TRUE); + operand *result, iCode *ic) +{ + int size, offset ; + sym_link *retype = getSpec(operandType(right)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp(result,ic,FALSE); + + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE(result) != AOP_STR) { + /* if this is remateriazable */ + if (AOP_TYPE(result) == AOP_IMMD) + pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); + else { /* we need to get it byte by byte */ + pic14_emitcode("mov","dpl,%s",aopGet(AOP(result),0,FALSE,FALSE)); + pic14_emitcode("mov","dph,%s",aopGet(AOP(result),1,FALSE,FALSE)); + if (options.model == MODEL_FLAT24) + { + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(result),2,FALSE,FALSE)); + } + } + } + /* so dptr know contains the address */ + freeAsmop(result,NULL,ic,TRUE); + aopOp(right,ic,FALSE); + + /* if bit then unpack */ + if (IS_BITFIELD(retype)) + genPackBits(retype,right,"dptr",FPOINTER); + else { + size = AOP_SIZE(right); + offset = 0 ; + + while (size--) { + char *l = aopGet(AOP(right),offset++,FALSE,FALSE); + MOVA(l); + pic14_emitcode("movx","@dptr,a"); + if (size) + pic14_emitcode("inc","dptr"); + } + } + + freeAsmop(right,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ /* genGenPointerSet - set value from generic pointer space */ /*-----------------------------------------------------------------*/ static void genGenPointerSet (operand *right, - operand *result, iCode *ic) -{ - int size, offset ; - sym_link *retype = getSpec(operandType(right)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp(result,ic,FALSE); - aopOp(right,ic,FALSE); - size = AOP_SIZE(right); - - DEBUGpic14_AopType(__LINE__,NULL,right,result); - - /* if the operand is already in dptr - then we do nothing else we move the value to dptr */ - if (AOP_TYPE(result) != AOP_STR) { - /* if this is remateriazable */ - if (AOP_TYPE(result) == AOP_IMMD) { - pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); - pic14_emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE)); - } - else { /* we need to get it byte by byte */ - //char *l = aopGet(AOP(result),0,FALSE,FALSE); - size = AOP_SIZE(right); - offset = 0 ; - - /* hack hack! see if this the FSR. If so don't load W */ - if(AOP_TYPE(right) != AOP_ACC) { - - - emitpcode(POC_MOVFW,popGet(AOP(result),0)); - emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); - - if(AOP_SIZE(result) > 1) { - emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT)); - emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(result),1,FALSE,FALSE),0,0)); - emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT)); - - } - - //if(size==2) - //emitpcode(POC_DECF,popCopyReg(&pc_fsr)); - //if(size==4) { - // emitpcode(POC_MOVLW,popGetLit(0xfd)); - // emitpcode(POC_ADDWF,popCopyReg(&pc_fsr)); - //} - - while(size--) { - emitpcode(POC_MOVFW,popGet(AOP(right),offset++)); - emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); - - if(size) - emitpcode(POC_INCF,popCopyReg(&pc_fsr)); - } - - - goto release; - } - - if(aopIdx(AOP(result),0) != 4) { - - emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); - goto release; - } - - emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); - goto release; - - } - } - /* so dptr know contains the address */ - - - /* if bit then unpack */ - if (IS_BITFIELD(retype)) - genPackBits(retype,right,"dptr",GPOINTER); - else { - size = AOP_SIZE(right); - offset = 0 ; - - DEBUGpic14_emitcode ("; ***","%s %d size=%d",__FUNCTION__,__LINE__,size); - - while (size--) { - - emitpcode(POC_MOVFW,popGet(AOP(result),offset)); - emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); - - if (AOP_TYPE(right) == AOP_LIT) - emitpcode(POC_MOVLW, popGet(AOP(right),offset)); - else - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - - emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); - - offset++; - } - } - + operand *result, iCode *ic) +{ + int size, offset ; + sym_link *retype = getSpec(operandType(right)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp(result,ic,FALSE); + aopOp(right,ic,FALSE); + size = AOP_SIZE(right); + + DEBUGpic14_AopType(__LINE__,NULL,right,result); + + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE(result) != AOP_STR) { + /* if this is remateriazable */ + if (AOP_TYPE(result) == AOP_IMMD) { + pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); + pic14_emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE)); + } + else { /* we need to get it byte by byte */ + //char *l = aopGet(AOP(result),0,FALSE,FALSE); + size = AOP_SIZE(right); + offset = 0 ; + + /* hack hack! see if this the FSR. If so don't load W */ + if(AOP_TYPE(right) != AOP_ACC) { + + + emitpcode(POC_MOVFW,popGet(AOP(result),0)); + emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); + + if(AOP_SIZE(result) > 1) { + emitpcode(POC_BCF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT)); + emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(result),1,FALSE,FALSE),0,0)); + emitpcode(POC_BSF, popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT)); + + } + + //if(size==2) + //emitpcode(POC_DECF,popCopyReg(&pc_fsr)); + //if(size==4) { + // emitpcode(POC_MOVLW,popGetLit(0xfd)); + // emitpcode(POC_ADDWF,popCopyReg(&pc_fsr)); + //} + + while(size--) { + emitpcode(POC_MOVFW,popGet(AOP(right),offset++)); + emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); + + if(size) + emitpcode(POC_INCF,popCopyReg(&pc_fsr)); + } + + + goto release; + } + + if(aopIdx(AOP(result),0) != 4) { + + emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); + goto release; + } + + emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); + goto release; + + } + } + /* so dptr know contains the address */ + + + /* if bit then unpack */ + if (IS_BITFIELD(retype)) + genPackBits(retype,right,"dptr",GPOINTER); + else { + size = AOP_SIZE(right); + offset = 0 ; + + DEBUGpic14_emitcode ("; ***","%s %d size=%d",__FUNCTION__,__LINE__,size); + + while (size--) { + + emitpcode(POC_MOVFW,popGet(AOP(result),offset)); + emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); + + if (AOP_TYPE(right) == AOP_LIT) + emitpcode(POC_MOVLW, popGet(AOP(right),offset)); + else + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + + emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); + + offset++; + } + } + release: - freeAsmop(right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + freeAsmop(right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -8992,68 +8991,68 @@ release: /*-----------------------------------------------------------------*/ static void genPointerSet (iCode *ic) { - operand *right, *result ; - sym_link *type, *etype; - int p_type; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - right = IC_RIGHT(ic); - result = IC_RESULT(ic) ; - - /* depending on the type of pointer we need to - move it to the correct pointer register */ - type = operandType(result); - etype = getSpec(type); - /* if left is of type of pointer then it is simple */ - if (IS_PTR(type) && !IS_FUNC(type->next)) { - p_type = DCL_TYPE(type); - } - else { - /* we have to go by the storage class */ - p_type = PTR_TYPE(SPEC_OCLS(etype)); - - /* if (SPEC_OCLS(etype)->codesp ) { */ - /* p_type = CPOINTER ; */ - /* } */ - /* else */ - /* if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */ - /* p_type = FPOINTER ; */ - /* else */ - /* if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */ - /* p_type = PPOINTER ; */ - /* else */ - /* if (SPEC_OCLS(etype) == idata ) */ - /* p_type = IPOINTER ; */ - /* else */ - /* p_type = POINTER ; */ - } - - /* now that we have the pointer type we assign - the pointer values */ - switch (p_type) { - - case POINTER: - case IPOINTER: - genNearPointerSet (right,result,ic); - break; - - case PPOINTER: - genPagedPointerSet (right,result,ic); - break; - - case FPOINTER: - genFarPointerSet (right,result,ic); - break; - - case GPOINTER: - genGenPointerSet (right,result,ic); - break; - - default: - werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "genPointerSet: illegal pointer type"); - } + operand *right, *result ; + sym_link *type, *etype; + int p_type; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + right = IC_RIGHT(ic); + result = IC_RESULT(ic) ; + + /* depending on the type of pointer we need to + move it to the correct pointer register */ + type = operandType(result); + etype = getSpec(type); + /* if left is of type of pointer then it is simple */ + if (IS_PTR(type) && !IS_FUNC(type->next)) { + p_type = DCL_TYPE(type); + } + else { + /* we have to go by the storage class */ + p_type = PTR_TYPE(SPEC_OCLS(etype)); + + /* if (SPEC_OCLS(etype)->codesp ) { */ + /* p_type = CPOINTER ; */ + /* } */ + /* else */ + /* if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */ + /* p_type = FPOINTER ; */ + /* else */ + /* if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */ + /* p_type = PPOINTER ; */ + /* else */ + /* if (SPEC_OCLS(etype) == idata ) */ + /* p_type = IPOINTER ; */ + /* else */ + /* p_type = POINTER ; */ + } + + /* now that we have the pointer type we assign + the pointer values */ + switch (p_type) { + + case POINTER: + case IPOINTER: + genNearPointerSet (right,result,ic); + break; + + case PPOINTER: + genPagedPointerSet (right,result,ic); + break; + + case FPOINTER: + genFarPointerSet (right,result,ic); + break; + + case GPOINTER: + genGenPointerSet (right,result,ic); + break; + + default: + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "genPointerSet: illegal pointer type"); + } } /*-----------------------------------------------------------------*/ @@ -9061,39 +9060,39 @@ static void genPointerSet (iCode *ic) /*-----------------------------------------------------------------*/ static void genIfx (iCode *ic, iCode *popIc) { - operand *cond = IC_COND(ic); - int isbit =0; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp(cond,ic,FALSE); - - /* get the value into acc */ - if (AOP_TYPE(cond) != AOP_CRY) - pic14_toBoolean(cond); - else - isbit = 1; - /* the result is now in the accumulator */ - freeAsmop(cond,NULL,ic,TRUE); - - /* if there was something to be popped then do it */ - if (popIc) - genIpop(popIc); - - /* if the condition is a bit variable */ - if (isbit && IS_ITEMP(cond) && - SPIL_LOC(cond)) { - genIfxJump(ic,SPIL_LOC(cond)->rname); - DEBUGpic14_emitcode ("; isbit SPIL_LOC","%s",SPIL_LOC(cond)->rname); - } - else { - if (isbit && !IS_ITEMP(cond)) - genIfxJump(ic,OP_SYMBOL(cond)->rname); - else - genIfxJump(ic,"a"); - } - ic->generated = 1; - + operand *cond = IC_COND(ic); + int isbit =0; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp(cond,ic,FALSE); + + /* get the value into acc */ + if (AOP_TYPE(cond) != AOP_CRY) + pic14_toBoolean(cond); + else + isbit = 1; + /* the result is now in the accumulator */ + freeAsmop(cond,NULL,ic,TRUE); + + /* if there was something to be popped then do it */ + if (popIc) + genIpop(popIc); + + /* if the condition is a bit variable */ + if (isbit && IS_ITEMP(cond) && + SPIL_LOC(cond)) { + genIfxJump(ic,SPIL_LOC(cond)->rname); + DEBUGpic14_emitcode ("; isbit SPIL_LOC","%s",SPIL_LOC(cond)->rname); + } + else { + if (isbit && !IS_ITEMP(cond)) + genIfxJump(ic,OP_SYMBOL(cond)->rname); + else + genIfxJump(ic,"a"); + } + ic->generated = 1; + } /*-----------------------------------------------------------------*/ @@ -9101,38 +9100,38 @@ static void genIfx (iCode *ic, iCode *popIc) /*-----------------------------------------------------------------*/ static void genAddrOf (iCode *ic) { - operand *right, *result, *left; - int size, offset ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - - //aopOp(IC_RESULT(ic),ic,FALSE); - - aopOp((left=IC_LEFT(ic)),ic,FALSE); - aopOp((right=IC_RIGHT(ic)),ic,FALSE); - aopOp((result=IC_RESULT(ic)),ic,TRUE); - - DEBUGpic14_AopType(__LINE__,left,right,result); - - size = AOP_SIZE(IC_RESULT(ic)); - offset = 0; - - while (size--) { - /* fixing bug #863624, reported from (errolv) */ - emitpcode(POC_MOVLW, popGetImmd(OP_SYMBOL(left)->rname, offset, 0, IS_FUNC(OP_SYM_TYPE(left)))); - emitpcode(POC_MOVWF, popGet(AOP(result), offset)); - + operand *right, *result, *left; + int size, offset ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + + //aopOp(IC_RESULT(ic),ic,FALSE); + + aopOp((left=IC_LEFT(ic)),ic,FALSE); + aopOp((right=IC_RIGHT(ic)),ic,FALSE); + aopOp((result=IC_RESULT(ic)),ic,TRUE); + + DEBUGpic14_AopType(__LINE__,left,right,result); + + size = AOP_SIZE(IC_RESULT(ic)); + offset = 0; + + while (size--) { + /* fixing bug #863624, reported from (errolv) */ + emitpcode(POC_MOVLW, popGetImmd(OP_SYMBOL(left)->rname, offset, 0, IS_FUNC(OP_SYM_TYPE(left)))); + emitpcode(POC_MOVWF, popGet(AOP(result), offset)); + #if 0 - emitpcode(POC_MOVLW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + emitpcode(POC_MOVLW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); #endif - offset++; - } - - freeAsmop(left,NULL,ic,FALSE); - freeAsmop(result,NULL,ic,TRUE); - + offset++; + } + + freeAsmop(left,NULL,ic,FALSE); + freeAsmop(result,NULL,ic,TRUE); + } #if 0 @@ -9141,26 +9140,26 @@ static void genAddrOf (iCode *ic) /*-----------------------------------------------------------------*/ static void genFarFarAssign (operand *result, operand *right, iCode *ic) { - int size = AOP_SIZE(right); - int offset = 0; - char *l ; - /* first push the right side on to the stack */ - while (size--) { - l = aopGet(AOP(right),offset++,FALSE,FALSE); - MOVA(l); - pic14_emitcode ("push","acc"); - } - - freeAsmop(right,NULL,ic,FALSE); - /* now assign DPTR to result */ - aopOp(result,ic,FALSE); - size = AOP_SIZE(result); - while (size--) { - pic14_emitcode ("pop","acc"); - aopPut(AOP(result),"a",--offset); - } - freeAsmop(result,NULL,ic,FALSE); - + int size = AOP_SIZE(right); + int offset = 0; + char *l ; + /* first push the right side on to the stack */ + while (size--) { + l = aopGet(AOP(right),offset++,FALSE,FALSE); + MOVA(l); + pic14_emitcode ("push","acc"); + } + + freeAsmop(right,NULL,ic,FALSE); + /* now assign DPTR to result */ + aopOp(result,ic,FALSE); + size = AOP_SIZE(result); + while (size--) { + pic14_emitcode ("pop","acc"); + aopPut(AOP(result),"a",--offset); + } + freeAsmop(result,NULL,ic,FALSE); + } #endif @@ -9169,126 +9168,126 @@ static void genFarFarAssign (operand *result, operand *right, iCode *ic) /*-----------------------------------------------------------------*/ static void genAssign (iCode *ic) { - operand *result, *right; - int size, offset,know_W; - unsigned long lit = 0L; - - result = IC_RESULT(ic); - right = IC_RIGHT(ic) ; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - /* if they are the same */ - if (operandsEqu (IC_RESULT(ic),IC_RIGHT(ic))) - return ; - - aopOp(right,ic,FALSE); - aopOp(result,ic,TRUE); - - DEBUGpic14_AopType(__LINE__,NULL,right,result); - - /* if they are the same registers */ - if (pic14_sameRegs(AOP(right),AOP(result))) - goto release; - - /* if the result is a bit */ - if (AOP_TYPE(result) == AOP_CRY) { - - /* if the right size is a literal then - we know what the value is */ - if (AOP_TYPE(right) == AOP_LIT) { - - emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), - popGet(AOP(result),0)); - - if (((int) operandLitValue(right))) - pic14_emitcode("bsf","(%s >> 3),(%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - else - pic14_emitcode("bcf","(%s >> 3),(%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - goto release; - } - - /* the right is also a bit variable */ - if (AOP_TYPE(right) == AOP_CRY) { - emitpcode(POC_BCF, popGet(AOP(result),0)); - emitpcode(POC_BTFSC, popGet(AOP(right),0)); - emitpcode(POC_BSF, popGet(AOP(result),0)); - - pic14_emitcode("bcf","(%s >> 3),(%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3),(%s & 7)", - AOP(right)->aopu.aop_dir, - AOP(right)->aopu.aop_dir); - pic14_emitcode("bsf","(%s >> 3),(%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - goto release ; - } - - /* we need to or */ - emitpcode(POC_BCF, popGet(AOP(result),0)); - pic14_toBoolean(right); - emitSKPZ; - emitpcode(POC_BSF, popGet(AOP(result),0)); - //aopPut(AOP(result),"a",0); - goto release ; - } - - /* bit variables done */ - /* general case */ - size = AOP_SIZE(result); - offset = 0 ; - if(AOP_TYPE(right) == AOP_LIT) - lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); - - if( AOP_TYPE(right) == AOP_DIR && (AOP_TYPE(result) == AOP_REG) && size==1) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(aopIdx(AOP(result),0) == 4) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - goto release; - } else - DEBUGpic14_emitcode ("; WARNING","%s %d ignoring register storage",__FUNCTION__,__LINE__); - } - - know_W=-1; - while (size--) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(AOP_TYPE(right) == AOP_LIT) { - if(lit&0xff) { - if(know_W != (int)(lit&0xff)) - emitpcode(POC_MOVLW,popGetLit(lit&0xff)); - know_W = lit&0xff; - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } else - emitpcode(POC_CLRF, popGet(AOP(result),offset)); - - lit >>= 8; - - } else if (AOP_TYPE(right) == AOP_CRY) { - emitpcode(POC_CLRF, popGet(AOP(result),offset)); - if(offset == 0) { - emitpcode(POC_BTFSS, popGet(AOP(right),0)); - emitpcode(POC_INCF, popGet(AOP(result),0)); - } - } else { - mov2w (AOP(right), offset); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } - - offset++; - } - - + operand *result, *right; + int size, offset,know_W; + unsigned long lit = 0L; + + result = IC_RESULT(ic); + right = IC_RIGHT(ic) ; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + /* if they are the same */ + if (operandsEqu (IC_RESULT(ic),IC_RIGHT(ic))) + return ; + + aopOp(right,ic,FALSE); + aopOp(result,ic,TRUE); + + DEBUGpic14_AopType(__LINE__,NULL,right,result); + + /* if they are the same registers */ + if (pic14_sameRegs(AOP(right),AOP(result))) + goto release; + + /* if the result is a bit */ + if (AOP_TYPE(result) == AOP_CRY) { + + /* if the right size is a literal then + we know what the value is */ + if (AOP_TYPE(right) == AOP_LIT) { + + emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), + popGet(AOP(result),0)); + + if (((int) operandLitValue(right))) + pic14_emitcode("bsf","(%s >> 3),(%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + else + pic14_emitcode("bcf","(%s >> 3),(%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + goto release; + } + + /* the right is also a bit variable */ + if (AOP_TYPE(right) == AOP_CRY) { + emitpcode(POC_BCF, popGet(AOP(result),0)); + emitpcode(POC_BTFSC, popGet(AOP(right),0)); + emitpcode(POC_BSF, popGet(AOP(result),0)); + + pic14_emitcode("bcf","(%s >> 3),(%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3),(%s & 7)", + AOP(right)->aopu.aop_dir, + AOP(right)->aopu.aop_dir); + pic14_emitcode("bsf","(%s >> 3),(%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + goto release ; + } + + /* we need to or */ + emitpcode(POC_BCF, popGet(AOP(result),0)); + pic14_toBoolean(right); + emitSKPZ; + emitpcode(POC_BSF, popGet(AOP(result),0)); + //aopPut(AOP(result),"a",0); + goto release ; + } + + /* bit variables done */ + /* general case */ + size = AOP_SIZE(result); + offset = 0 ; + if(AOP_TYPE(right) == AOP_LIT) + lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); + + if( AOP_TYPE(right) == AOP_DIR && (AOP_TYPE(result) == AOP_REG) && size==1) { + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(aopIdx(AOP(result),0) == 4) { + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + goto release; + } else + DEBUGpic14_emitcode ("; WARNING","%s %d ignoring register storage",__FUNCTION__,__LINE__); + } + + know_W=-1; + while (size--) { + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(AOP_TYPE(right) == AOP_LIT) { + if(lit&0xff) { + if(know_W != (int)(lit&0xff)) + emitpcode(POC_MOVLW,popGetLit(lit&0xff)); + know_W = lit&0xff; + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } else + emitpcode(POC_CLRF, popGet(AOP(result),offset)); + + lit >>= 8; + + } else if (AOP_TYPE(right) == AOP_CRY) { + emitpcode(POC_CLRF, popGet(AOP(result),offset)); + if(offset == 0) { + emitpcode(POC_BTFSS, popGet(AOP(right),0)); + emitpcode(POC_INCF, popGet(AOP(result),0)); + } + } else { + mov2w (AOP(right), offset); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } + + offset++; + } + + release: - freeAsmop (right,NULL,ic,FALSE); - freeAsmop (result,NULL,ic,TRUE); + freeAsmop (right,NULL,ic,FALSE); + freeAsmop (result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -9296,43 +9295,43 @@ release: /*-----------------------------------------------------------------*/ static void genJumpTab (iCode *ic) { - symbol *jtab; - char *l; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp(IC_JTCOND(ic),ic,FALSE); - /* get the condition into accumulator */ - l = aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE); - MOVA(l); - /* multiply by three */ - pic14_emitcode("add","a,acc"); - pic14_emitcode("add","a,%s",aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE)); - - jtab = newiTempLabel(NULL); - pic14_emitcode("mov","dptr,#%05d_DS_",jtab->key+100); - pic14_emitcode("jmp","@a+dptr"); - pic14_emitcode("","%05d_DS_:",jtab->key+100); - - emitpcode(POC_MOVLW, popGetHighLabel(jtab->key)); - emitpcode(POC_MOVWF, popCopyReg(&pc_pclath)); - emitpcode(POC_MOVLW, popGetLabel(jtab->key)); - emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0)); - emitSKPNC; - emitpcode(POC_INCF, popCopyReg(&pc_pclath)); - emitpcode(POC_MOVWF, popCopyReg(&pc_pcl)); - emitpLabel(jtab->key); - - freeAsmop(IC_JTCOND(ic),NULL,ic,TRUE); - - /* now generate the jump labels */ - for (jtab = setFirstItem(IC_JTLABELS(ic)) ; jtab; - jtab = setNextItem(IC_JTLABELS(ic))) { - pic14_emitcode("ljmp","%05d_DS_",jtab->key+100); - emitpcode(POC_GOTO,popGetLabel(jtab->key)); - - } - + symbol *jtab; + char *l; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp(IC_JTCOND(ic),ic,FALSE); + /* get the condition into accumulator */ + l = aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE); + MOVA(l); + /* multiply by three */ + pic14_emitcode("add","a,acc"); + pic14_emitcode("add","a,%s",aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE)); + + jtab = newiTempLabel(NULL); + pic14_emitcode("mov","dptr,#%05d_DS_",jtab->key+100); + pic14_emitcode("jmp","@a+dptr"); + pic14_emitcode("","%05d_DS_:",jtab->key+100); + + emitpcode(POC_MOVLW, popGetHighLabel(jtab->key)); + emitpcode(POC_MOVWF, popCopyReg(&pc_pclath)); + emitpcode(POC_MOVLW, popGetLabel(jtab->key)); + emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0)); + emitSKPNC; + emitpcode(POC_INCF, popCopyReg(&pc_pclath)); + emitpcode(POC_MOVWF, popCopyReg(&pc_pcl)); + emitpLabel(jtab->key); + + freeAsmop(IC_JTCOND(ic),NULL,ic,TRUE); + + /* now generate the jump labels */ + for (jtab = setFirstItem(IC_JTLABELS(ic)) ; jtab; + jtab = setNextItem(IC_JTLABELS(ic))) { + pic14_emitcode("ljmp","%05d_DS_",jtab->key+100); + emitpcode(POC_GOTO,popGetLabel(jtab->key)); + + } + } /*-----------------------------------------------------------------*/ @@ -9349,121 +9348,121 @@ iCode tree, I'm going to not be using this routine :(. static int genMixedOperation (iCode *ic) { #if 0 - operand *result = IC_RESULT(ic); - sym_link *ctype = operandType(IC_LEFT(ic)); - operand *right = IC_RIGHT(ic); - int ret = 0; - int big,small; - int offset; - - iCode *nextic; - operand *nextright=NULL,*nextleft=NULL,*nextresult=NULL; - - pic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - - nextic = ic->next; - if(!nextic) - return 0; - - nextright = IC_RIGHT(nextic); - nextleft = IC_LEFT(nextic); - nextresult = IC_RESULT(nextic); - - aopOp(right,ic,FALSE); - aopOp(result,ic,FALSE); - aopOp(nextright, nextic, FALSE); - aopOp(nextleft, nextic, FALSE); - aopOp(nextresult, nextic, FALSE); - - if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_RIGHT(nextic)))) { - - operand *t = right; - right = nextright; - nextright = t; - - pic14_emitcode(";remove right +",""); - - } else if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_LEFT(nextic)))) { - /* - operand *t = right; - right = nextleft; - nextleft = t; - */ - pic14_emitcode(";remove left +",""); - } else - return 0; - - big = AOP_SIZE(nextleft); - small = AOP_SIZE(nextright); - - switch(nextic->op) { - - case '+': - pic14_emitcode(";optimize a +",""); - /* if unsigned or not an integral type */ - if (AOP_TYPE(IC_LEFT(nextic)) == AOP_CRY) { - pic14_emitcode(";add a bit to something",""); - } else { - - pic14_emitcode("movf","%s,w",AOP(nextright)->aopu.aop_dir); - - if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ) { - pic14_emitcode("addwf","%s,w",AOP(nextleft)->aopu.aop_dir); - pic14_emitcode("movwf","%s",aopGet(AOP(IC_RESULT(nextic)),0,FALSE,FALSE)); - } else - pic14_emitcode("addwf","%s,f",AOP(nextleft)->aopu.aop_dir); - - offset = 0; - while(--big) { - - offset++; - - if(--small) { - if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ - pic14_emitcode("movf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); - } - - pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - emitSKPNC; - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(nextic))->aopu.aop_dir, - AOP(IC_RIGHT(nextic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE)); - - } else { - pic14_emitcode("rlf","known_zero,w"); - - /* - if right is signed - btfsc right,7 - addlw ff - */ - if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ - pic14_emitcode("addwf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - pic14_emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); - } else { - pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); - } - } - } - ret = 1; - } - } - ret = 1; - + operand *result = IC_RESULT(ic); + sym_link *ctype = operandType(IC_LEFT(ic)); + operand *right = IC_RIGHT(ic); + int ret = 0; + int big,small; + int offset; + + iCode *nextic; + operand *nextright=NULL,*nextleft=NULL,*nextresult=NULL; + + pic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + + nextic = ic->next; + if(!nextic) + return 0; + + nextright = IC_RIGHT(nextic); + nextleft = IC_LEFT(nextic); + nextresult = IC_RESULT(nextic); + + aopOp(right,ic,FALSE); + aopOp(result,ic,FALSE); + aopOp(nextright, nextic, FALSE); + aopOp(nextleft, nextic, FALSE); + aopOp(nextresult, nextic, FALSE); + + if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_RIGHT(nextic)))) { + + operand *t = right; + right = nextright; + nextright = t; + + pic14_emitcode(";remove right +",""); + + } else if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_LEFT(nextic)))) { + /* + operand *t = right; + right = nextleft; + nextleft = t; + */ + pic14_emitcode(";remove left +",""); + } else + return 0; + + big = AOP_SIZE(nextleft); + small = AOP_SIZE(nextright); + + switch(nextic->op) { + + case '+': + pic14_emitcode(";optimize a +",""); + /* if unsigned or not an integral type */ + if (AOP_TYPE(IC_LEFT(nextic)) == AOP_CRY) { + pic14_emitcode(";add a bit to something",""); + } else { + + pic14_emitcode("movf","%s,w",AOP(nextright)->aopu.aop_dir); + + if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ) { + pic14_emitcode("addwf","%s,w",AOP(nextleft)->aopu.aop_dir); + pic14_emitcode("movwf","%s",aopGet(AOP(IC_RESULT(nextic)),0,FALSE,FALSE)); + } else + pic14_emitcode("addwf","%s,f",AOP(nextleft)->aopu.aop_dir); + + offset = 0; + while(--big) { + + offset++; + + if(--small) { + if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ + pic14_emitcode("movf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + } + + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); + emitSKPNC; + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(nextic))->aopu.aop_dir, + AOP(IC_RIGHT(nextic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE)); + + } else { + pic14_emitcode("rlf","known_zero,w"); + + /* + if right is signed + btfsc right,7 + addlw ff + */ + if (!pic14_sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ + pic14_emitcode("addwf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + } else { + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + } + } + } + ret = 1; + } + } + ret = 1; + release: - freeAsmop(right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - freeAsmop(nextright,NULL,ic,TRUE); - freeAsmop(nextleft,NULL,ic,TRUE); - if(ret) - nextic->generated = 1; - - return ret; + freeAsmop(right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + freeAsmop(nextright,NULL,ic,TRUE); + freeAsmop(nextleft,NULL,ic,TRUE); + if(ret) + nextic->generated = 1; + + return ret; #else - return 0; + return 0; #endif } /*-----------------------------------------------------------------*/ @@ -9471,274 +9470,274 @@ release: /*-----------------------------------------------------------------*/ static void genCast (iCode *ic) { - operand *result = IC_RESULT(ic); - sym_link *ctype = operandType(IC_LEFT(ic)); - sym_link *rtype = operandType(IC_RIGHT(ic)); - operand *right = IC_RIGHT(ic); - int size, offset ; - - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - /* if they are equivalent then do nothing */ - if (operandsEqu(IC_RESULT(ic),IC_RIGHT(ic))) - return ; - - aopOp(right,ic,FALSE) ; - aopOp(result,ic,FALSE); - - DEBUGpic14_AopType(__LINE__,NULL,right,result); - - /* if the result is a bit */ - if (AOP_TYPE(result) == AOP_CRY) { - /* if the right size is a literal then - we know what the value is */ - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - if (AOP_TYPE(right) == AOP_LIT) { - - emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), - popGet(AOP(result),0)); - - if (((int) operandLitValue(right))) - pic14_emitcode("bsf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - else - pic14_emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(result)->aopu.aop_dir, - AOP(result)->aopu.aop_dir); - - goto release; - } - - /* the right is also a bit variable */ - if (AOP_TYPE(right) == AOP_CRY) { - - emitCLRC; - emitpcode(POC_BTFSC, popGet(AOP(right),0)); - - pic14_emitcode("clrc",""); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(right)->aopu.aop_dir, - AOP(right)->aopu.aop_dir); - aopPut(AOP(result),"c",0); - goto release ; - } - - /* we need to or */ - if (AOP_TYPE(right) == AOP_REG) { - emitpcode(POC_BCF, popGet(AOP(result),0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0)); - emitpcode(POC_BSF, popGet(AOP(result),0)); - } - pic14_toBoolean(right); - aopPut(AOP(result),"a",0); - goto release ; - } - - if ((AOP_TYPE(right) == AOP_CRY) && (AOP_TYPE(result) == AOP_REG)) { - int offset = 1; - size = AOP_SIZE(result); - - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_BTFSC, popGet(AOP(right),0)); - emitpcode(POC_INCF, popGet(AOP(result),0)); - - while (size--) - emitpcode(POC_CLRF, popGet(AOP(result),offset++)); - - goto release; - } - - /* if they are the same size : or less */ - if (AOP_SIZE(result) <= AOP_SIZE(right)) { - - /* if they are in the same place */ - if (pic14_sameRegs(AOP(right),AOP(result))) - goto release; - - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - if (IS_PTR_CONST(rtype)) - DEBUGpic14_emitcode ("; ***","%d - right is const pointer",__LINE__); - if (IS_PTR_CONST(operandType(IC_RESULT(ic)))) - DEBUGpic14_emitcode ("; ***","%d - result is const pointer",__LINE__); - - if ((AOP_TYPE(right) == AOP_PCODE) && AOP(right)->aopu.pcop->type == PO_IMMEDIATE) { - emitpcode(POC_MOVLW, popGet(AOP(right),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - emitpcode(POC_MOVLW, popGet(AOP(right),1)); - emitpcode(POC_MOVWF, popGet(AOP(result),1)); - if(AOP_SIZE(result) <2) - fprintf(stderr,"%d -- result is not big enough to hold a ptr\n",__LINE__); - - } else { - - /* if they in different places then copy */ - size = AOP_SIZE(result); - offset = 0 ; - while (size--) { - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - - //aopPut(AOP(result), - // aopGet(AOP(right),offset,FALSE,FALSE), - // offset); - - offset++; - } - } - goto release; - } - - - /* if the result is of type pointer */ - if (IS_PTR(ctype)) { - - int p_type; - sym_link *type = operandType(right); - sym_link *etype = getSpec(type); - DEBUGpic14_emitcode("; ***","%s %d - pointer cast",__FUNCTION__,__LINE__); - - /* pointer to generic pointer */ - if (IS_GENPTR(ctype)) { - char *l = zero; - - if (IS_PTR(type)) - p_type = DCL_TYPE(type); - else { - /* we have to go by the storage class */ - p_type = PTR_TYPE(SPEC_OCLS(etype)); - - /* if (SPEC_OCLS(etype)->codesp ) */ - /* p_type = CPOINTER ; */ - /* else */ - /* if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */ - /* p_type = FPOINTER ; */ - /* else */ - /* if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */ - /* p_type = PPOINTER; */ - /* else */ - /* if (SPEC_OCLS(etype) == idata ) */ - /* p_type = IPOINTER ; */ - /* else */ - /* p_type = POINTER ; */ - } - - /* the first two bytes are known */ - DEBUGpic14_emitcode("; ***","%s %d - pointer cast2",__FUNCTION__,__LINE__); - size = GPTRSIZE - 1; - offset = 0 ; - while (size--) { - if(offset < AOP_SIZE(right)) { - DEBUGpic14_emitcode("; ***","%s %d - pointer cast3",__FUNCTION__,__LINE__); - if ((AOP_TYPE(right) == AOP_PCODE) && - AOP(right)->aopu.pcop->type == PO_IMMEDIATE) { - emitpcode(POC_MOVLW, popGet(AOP(right),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - } else { - aopPut(AOP(result), - aopGet(AOP(right),offset,FALSE,FALSE), - offset); - } - } else - emitpcode(POC_CLRF,popGet(AOP(result),offset)); - offset++; - } - /* the last byte depending on type */ - switch (p_type) { - case IPOINTER: - case POINTER: - emitpcode(POC_CLRF,popGet(AOP(result),GPTRSIZE - 1)); - break; - case FPOINTER: - pic14_emitcode(";BUG!? ","%d",__LINE__); - l = one; - break; - case CPOINTER: - pic14_emitcode(";BUG!? ","%d",__LINE__); - l = "#0x02"; - break; - case PPOINTER: - pic14_emitcode(";BUG!? ","%d",__LINE__); - l = "#0x03"; - break; - - default: - /* this should never happen */ - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "got unknown pointer type"); - exit(1); - } - //aopPut(AOP(result),l, GPTRSIZE - 1); - goto release ; - } - - /* just copy the pointers */ - size = AOP_SIZE(result); - offset = 0 ; - while (size--) { - aopPut(AOP(result), - aopGet(AOP(right),offset,FALSE,FALSE), - offset); - offset++; - } - goto release ; - } - - - - /* so we now know that the size of destination is greater - than the size of the source. - Now, if the next iCode is an operator then we might be - able to optimize the operation without performing a cast. - */ - if(genMixedOperation(ic)) - goto release; - - DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); - - /* we move to result for the size of source */ - size = AOP_SIZE(right); - offset = 0 ; - while (size--) { - emitpcode(POC_MOVFW, popGet(AOP(right),offset)); - emitpcode(POC_MOVWF, popGet(AOP(result),offset)); - offset++; - } - - /* now depending on the sign of the destination */ - size = AOP_SIZE(result) - AOP_SIZE(right); - /* if unsigned or not an integral type */ - if (SPEC_USIGN(rtype) || !IS_SPEC(rtype)) { - while (size--) - emitpcode(POC_CLRF, popGet(AOP(result),offset++)); - } else { - /* we need to extend the sign :{ */ - - if(size == 1) { - /* Save one instruction of casting char to int */ - emitpcode(POC_CLRF, popGet(AOP(result),offset)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),offset)); - } else { - emitpcodeNULLop(POC_CLRW); - - if(offset) - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); - else - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0)); - - emitpcode(POC_MOVLW, popGetLit(0xff)); - - while (size--) - emitpcode(POC_MOVWF, popGet(AOP(result),offset++)); - } - } - + operand *result = IC_RESULT(ic); + sym_link *ctype = operandType(IC_LEFT(ic)); + sym_link *rtype = operandType(IC_RIGHT(ic)); + operand *right = IC_RIGHT(ic); + int size, offset ; + + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + /* if they are equivalent then do nothing */ + if (operandsEqu(IC_RESULT(ic),IC_RIGHT(ic))) + return ; + + aopOp(right,ic,FALSE) ; + aopOp(result,ic,FALSE); + + DEBUGpic14_AopType(__LINE__,NULL,right,result); + + /* if the result is a bit */ + if (AOP_TYPE(result) == AOP_CRY) { + /* if the right size is a literal then + we know what the value is */ + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + if (AOP_TYPE(right) == AOP_LIT) { + + emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), + popGet(AOP(result),0)); + + if (((int) operandLitValue(right))) + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + else + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", + AOP(result)->aopu.aop_dir, + AOP(result)->aopu.aop_dir); + + goto release; + } + + /* the right is also a bit variable */ + if (AOP_TYPE(right) == AOP_CRY) { + + emitCLRC; + emitpcode(POC_BTFSC, popGet(AOP(right),0)); + + pic14_emitcode("clrc",""); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(right)->aopu.aop_dir, + AOP(right)->aopu.aop_dir); + aopPut(AOP(result),"c",0); + goto release ; + } + + /* we need to or */ + if (AOP_TYPE(right) == AOP_REG) { + emitpcode(POC_BCF, popGet(AOP(result),0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0)); + emitpcode(POC_BSF, popGet(AOP(result),0)); + } + pic14_toBoolean(right); + aopPut(AOP(result),"a",0); + goto release ; + } + + if ((AOP_TYPE(right) == AOP_CRY) && (AOP_TYPE(result) == AOP_REG)) { + int offset = 1; + size = AOP_SIZE(result); + + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_BTFSC, popGet(AOP(right),0)); + emitpcode(POC_INCF, popGet(AOP(result),0)); + + while (size--) + emitpcode(POC_CLRF, popGet(AOP(result),offset++)); + + goto release; + } + + /* if they are the same size : or less */ + if (AOP_SIZE(result) <= AOP_SIZE(right)) { + + /* if they are in the same place */ + if (pic14_sameRegs(AOP(right),AOP(result))) + goto release; + + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + if (IS_PTR_CONST(rtype)) + DEBUGpic14_emitcode ("; ***","%d - right is const pointer",__LINE__); + if (IS_PTR_CONST(operandType(IC_RESULT(ic)))) + DEBUGpic14_emitcode ("; ***","%d - result is const pointer",__LINE__); + + if ((AOP_TYPE(right) == AOP_PCODE) && AOP(right)->aopu.pcop->type == PO_IMMEDIATE) { + emitpcode(POC_MOVLW, popGet(AOP(right),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + emitpcode(POC_MOVLW, popGet(AOP(right),1)); + emitpcode(POC_MOVWF, popGet(AOP(result),1)); + if(AOP_SIZE(result) <2) + fprintf(stderr,"%d -- result is not big enough to hold a ptr\n",__LINE__); + + } else { + + /* if they in different places then copy */ + size = AOP_SIZE(result); + offset = 0 ; + while (size--) { + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + + //aopPut(AOP(result), + // aopGet(AOP(right),offset,FALSE,FALSE), + // offset); + + offset++; + } + } + goto release; + } + + + /* if the result is of type pointer */ + if (IS_PTR(ctype)) { + + int p_type; + sym_link *type = operandType(right); + sym_link *etype = getSpec(type); + DEBUGpic14_emitcode("; ***","%s %d - pointer cast",__FUNCTION__,__LINE__); + + /* pointer to generic pointer */ + if (IS_GENPTR(ctype)) { + char *l = zero; + + if (IS_PTR(type)) + p_type = DCL_TYPE(type); + else { + /* we have to go by the storage class */ + p_type = PTR_TYPE(SPEC_OCLS(etype)); + + /* if (SPEC_OCLS(etype)->codesp ) */ + /* p_type = CPOINTER ; */ + /* else */ + /* if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */ + /* p_type = FPOINTER ; */ + /* else */ + /* if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */ + /* p_type = PPOINTER; */ + /* else */ + /* if (SPEC_OCLS(etype) == idata ) */ + /* p_type = IPOINTER ; */ + /* else */ + /* p_type = POINTER ; */ + } + + /* the first two bytes are known */ + DEBUGpic14_emitcode("; ***","%s %d - pointer cast2",__FUNCTION__,__LINE__); + size = GPTRSIZE - 1; + offset = 0 ; + while (size--) { + if(offset < AOP_SIZE(right)) { + DEBUGpic14_emitcode("; ***","%s %d - pointer cast3",__FUNCTION__,__LINE__); + if ((AOP_TYPE(right) == AOP_PCODE) && + AOP(right)->aopu.pcop->type == PO_IMMEDIATE) { + emitpcode(POC_MOVLW, popGet(AOP(right),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + } else { + aopPut(AOP(result), + aopGet(AOP(right),offset,FALSE,FALSE), + offset); + } + } else + emitpcode(POC_CLRF,popGet(AOP(result),offset)); + offset++; + } + /* the last byte depending on type */ + switch (p_type) { + case IPOINTER: + case POINTER: + emitpcode(POC_CLRF,popGet(AOP(result),GPTRSIZE - 1)); + break; + case FPOINTER: + pic14_emitcode(";BUG!? ","%d",__LINE__); + l = one; + break; + case CPOINTER: + pic14_emitcode(";BUG!? ","%d",__LINE__); + l = "#0x02"; + break; + case PPOINTER: + pic14_emitcode(";BUG!? ","%d",__LINE__); + l = "#0x03"; + break; + + default: + /* this should never happen */ + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "got unknown pointer type"); + exit(1); + } + //aopPut(AOP(result),l, GPTRSIZE - 1); + goto release ; + } + + /* just copy the pointers */ + size = AOP_SIZE(result); + offset = 0 ; + while (size--) { + aopPut(AOP(result), + aopGet(AOP(right),offset,FALSE,FALSE), + offset); + offset++; + } + goto release ; + } + + + + /* so we now know that the size of destination is greater + than the size of the source. + Now, if the next iCode is an operator then we might be + able to optimize the operation without performing a cast. + */ + if(genMixedOperation(ic)) + goto release; + + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + + /* we move to result for the size of source */ + size = AOP_SIZE(right); + offset = 0 ; + while (size--) { + emitpcode(POC_MOVFW, popGet(AOP(right),offset)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset)); + offset++; + } + + /* now depending on the sign of the destination */ + size = AOP_SIZE(result) - AOP_SIZE(right); + /* if unsigned or not an integral type */ + if (SPEC_USIGN(rtype) || !IS_SPEC(rtype)) { + while (size--) + emitpcode(POC_CLRF, popGet(AOP(result),offset++)); + } else { + /* we need to extend the sign :{ */ + + if(size == 1) { + /* Save one instruction of casting char to int */ + emitpcode(POC_CLRF, popGet(AOP(result),offset)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),offset)); + } else { + emitpcodeNULLop(POC_CLRW); + + if(offset) + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); + else + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0)); + + emitpcode(POC_MOVLW, popGetLit(0xff)); + + while (size--) + emitpcode(POC_MOVWF, popGet(AOP(result),offset++)); + } + } + release: - freeAsmop(right,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); - + freeAsmop(right,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); + } /*-----------------------------------------------------------------*/ @@ -9746,61 +9745,61 @@ release: /*-----------------------------------------------------------------*/ static int genDjnz (iCode *ic, iCode *ifx) { - symbol *lbl, *lbl1; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (!ifx) - return 0; - - /* if the if condition has a false label - then we cannot save */ - if (IC_FALSE(ifx)) - return 0; - - /* if the minus is not of the form - a = a - 1 */ - if (!isOperandEqual(IC_RESULT(ic),IC_LEFT(ic)) || - !IS_OP_LITERAL(IC_RIGHT(ic))) - return 0; - - if (operandLitValue(IC_RIGHT(ic)) != 1) - return 0; - - /* if the size of this greater than one then no - saving */ - if (getSize(operandType(IC_RESULT(ic))) > 1) - return 0; - - /* otherwise we can save BIG */ - lbl = newiTempLabel(NULL); - lbl1= newiTempLabel(NULL); - - aopOp(IC_RESULT(ic),ic,FALSE); - - if (IS_AOP_PREG(IC_RESULT(ic))) { - pic14_emitcode("dec","%s", - aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - pic14_emitcode("mov","a,%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - pic14_emitcode("jnz","%05d_DS_",lbl->key+100); - } else { - - - emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - - pic14_emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - pic14_emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + labelOffset); - - } - /* pic14_emitcode ("sjmp","%05d_DS_",lbl1->key+100); */ - /* pic14_emitcode ("","%05d_DS_:",lbl->key+100); */ - /* pic14_emitcode ("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); */ - /* pic14_emitcode ("","%05d_DS_:",lbl1->key+100); */ - - - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); - ifx->generated = 1; - return 1; + symbol *lbl, *lbl1; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (!ifx) + return 0; + + /* if the if condition has a false label + then we cannot save */ + if (IC_FALSE(ifx)) + return 0; + + /* if the minus is not of the form + a = a - 1 */ + if (!isOperandEqual(IC_RESULT(ic),IC_LEFT(ic)) || + !IS_OP_LITERAL(IC_RIGHT(ic))) + return 0; + + if (operandLitValue(IC_RIGHT(ic)) != 1) + return 0; + + /* if the size of this greater than one then no + saving */ + if (getSize(operandType(IC_RESULT(ic))) > 1) + return 0; + + /* otherwise we can save BIG */ + lbl = newiTempLabel(NULL); + lbl1= newiTempLabel(NULL); + + aopOp(IC_RESULT(ic),ic,FALSE); + + if (IS_AOP_PREG(IC_RESULT(ic))) { + pic14_emitcode("dec","%s", + aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + pic14_emitcode("mov","a,%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + pic14_emitcode("jnz","%05d_DS_",lbl->key+100); + } else { + + + emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); + + pic14_emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + pic14_emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + labelOffset); + + } + /* pic14_emitcode ("sjmp","%05d_DS_",lbl1->key+100); */ + /* pic14_emitcode ("","%05d_DS_:",lbl->key+100); */ + /* pic14_emitcode ("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); */ + /* pic14_emitcode ("","%05d_DS_:",lbl1->key+100); */ + + + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + ifx->generated = 1; + return 1; } /*-----------------------------------------------------------------*/ @@ -9808,35 +9807,35 @@ static int genDjnz (iCode *ic, iCode *ifx) /*-----------------------------------------------------------------*/ static void genReceive (iCode *ic) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (isOperandInFarSpace(IC_RESULT(ic)) && - ( OP_SYMBOL(IC_RESULT(ic))->isspilt || - IS_TRUE_SYMOP(IC_RESULT(ic))) ) { - - int size = getSize(operandType(IC_RESULT(ic))); - int offset = fReturnSizePic - size; - while (size--) { - pic14_emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ? - fReturn[fReturnSizePic - offset - 1] : "acc")); - offset++; - } - aopOp(IC_RESULT(ic),ic,FALSE); - size = AOP_SIZE(IC_RESULT(ic)); - offset = 0; - while (size--) { - pic14_emitcode ("pop","acc"); - aopPut (AOP(IC_RESULT(ic)),"a",offset++); - } - - } else { - _G.accInUse++; - aopOp(IC_RESULT(ic),ic,FALSE); - _G.accInUse--; - assignResultValue(IC_RESULT(ic)); - } - - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (isOperandInFarSpace(IC_RESULT(ic)) && + ( OP_SYMBOL(IC_RESULT(ic))->isspilt || + IS_TRUE_SYMOP(IC_RESULT(ic))) ) { + + int size = getSize(operandType(IC_RESULT(ic))); + int offset = fReturnSizePic - size; + while (size--) { + pic14_emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ? + fReturn[fReturnSizePic - offset - 1] : "acc")); + offset++; + } + aopOp(IC_RESULT(ic),ic,FALSE); + size = AOP_SIZE(IC_RESULT(ic)); + offset = 0; + while (size--) { + pic14_emitcode ("pop","acc"); + aopPut (AOP(IC_RESULT(ic)),"a",offset++); + } + + } else { + _G.accInUse++; + aopOp(IC_RESULT(ic),ic,FALSE); + _G.accInUse--; + assignResultValue(IC_RESULT(ic)); + } + + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -9845,10 +9844,10 @@ static void genReceive (iCode *ic) static void genDummyRead (iCode * ic) { - pic14_emitcode ("; genDummyRead",""); - pic14_emitcode ("; not implemented",""); - - ic = ic; + pic14_emitcode ("; genDummyRead",""); + pic14_emitcode ("; not implemented",""); + + ic = ic; } /*-----------------------------------------------------------------*/ @@ -9865,271 +9864,271 @@ genDummyRead (iCode * ic) void genpic14Code (iCode *lic) { - iCode *ic; - int cln = 0; - - lineHead = lineCurr = NULL; - - pb = newpCodeChain(GcurMemmap,0,newpCodeCharP("; Starting pCode block")); - addpBlock(pb); - - /* if debug information required */ - if (options.debug && currFunc) { - if (currFunc) { - debugFile->writeFunction(currFunc); - _G.debugLine = 1; - if (IS_STATIC(currFunc->etype)) { - pic14_emitcode("",";F%s$%s$0$0 %d",moduleName,currFunc->name,__LINE__); - //addpCode2pBlock(pb,newpCodeLabel(moduleName,currFunc->name)); - } else { - pic14_emitcode("",";G$%s$0$0 %d",currFunc->name,__LINE__); - //addpCode2pBlock(pb,newpCodeLabel(NULL,currFunc->name)); - } - _G.debugLine = 0; - } - } - - - for (ic = lic ; ic ; ic = ic->next ) { - - DEBUGpic14_emitcode(";ic",""); - if ( cln != ic->lineno ) { - if ( options.debug ) { - _G.debugLine = 1; - pic14_emitcode("",";C$%s$%d$%d$%d ==.", - FileBaseName(ic->filename),ic->lineno, - ic->level,ic->block); - _G.debugLine = 0; - } - /* - pic14_emitcode("#CSRC","%s %d",FileBaseName(ic->filename),ic->lineno); - pic14_emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, - printCLine(ic->filename, ic->lineno)); - */ - if (!options.noCcodeInAsm) { - addpCode2pBlock(pb, - newpCodeCSource(ic->lineno, - ic->filename, - printCLine(ic->filename, ic->lineno))); - } - - cln = ic->lineno ; - } - - // if you want printILine too, look at ../mcs51/gen.c, i don't understand this :) - - /* if the result is marked as - spilt and rematerializable or code for - this has already been generated then - do nothing */ - if (resultRemat(ic) || ic->generated ) - continue ; - - /* depending on the operation */ - switch (ic->op) { - case '!' : - genNot(ic); - break; - - case '~' : - genCpl(ic); - break; - - case UNARYMINUS: - genUminus (ic); - break; - - case IPUSH: - genIpush (ic); - break; - - case IPOP: - /* IPOP happens only when trying to restore a - spilt live range, if there is an ifx statement - following this pop then the if statement might - be using some of the registers being popped which - would destory the contents of the register so - we need to check for this condition and handle it */ - if (ic->next && - ic->next->op == IFX && - regsInCommon(IC_LEFT(ic),IC_COND(ic->next))) - genIfx (ic->next,ic); - else - genIpop (ic); - break; - - case CALL: - genCall (ic); - break; - - case PCALL: - genPcall (ic); - break; - - case FUNCTION: - genFunction (ic); - break; - - case ENDFUNCTION: - genEndFunction (ic); - break; - - case RETURN: - genRet (ic); - break; - - case LABEL: - genLabel (ic); - break; - - case GOTO: - genGoto (ic); - break; - - case '+' : - genPlus (ic) ; - break; - - case '-' : - if ( ! genDjnz (ic,ifxForOp(IC_RESULT(ic),ic))) - genMinus (ic); - break; - - case '*' : - genMult (ic); - break; - - case '/' : - genDiv (ic) ; - break; - - case '%' : - genMod (ic); - break; - - case '>' : - genCmpGt (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case '<' : - genCmpLt (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case LE_OP: - case GE_OP: - case NE_OP: - - /* note these two are xlated by algebraic equivalence - during parsing SDCC.y */ - werror(E_INTERNAL_ERROR,__FILE__,__LINE__, - "got '>=' or '<=' shouldn't have come here"); - break; - - case EQ_OP: - genCmpEq (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case AND_OP: - genAndOp (ic); - break; - - case OR_OP: - genOrOp (ic); - break; - - case '^' : - genXor (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case '|' : - genOr (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case BITWISEAND: - genAnd (ic,ifxForOp(IC_RESULT(ic),ic)); - break; - - case INLINEASM: - genInline (ic); - break; - - case RRC: - genRRC (ic); - break; - - case RLC: - genRLC (ic); - break; - - case GETHBIT: - genGetHbit (ic); - break; - - case LEFT_OP: - genLeftShift (ic); - break; - - case RIGHT_OP: - genRightShift (ic); - break; - - case GET_VALUE_AT_ADDRESS: - genPointerGet(ic); - break; - - case '=' : - if (POINTER_SET(ic)) - genPointerSet(ic); - else - genAssign(ic); - break; - - case IFX: - genIfx (ic,NULL); - break; - - case ADDRESS_OF: - genAddrOf (ic); - break; - - case JUMPTABLE: - genJumpTab (ic); - break; - - case CAST: - genCast (ic); - break; - - case RECEIVE: - genReceive(ic); - break; - - case SEND: - addSet(&_G.sendSet,ic); - break; - - case DUMMY_READ_VOLATILE: - genDummyRead (ic); - break; - - default : - ic = ic; - } - } - - - /* now we are ready to call the - peep hole optimizer */ - if (!options.nopeep) { - peepHole (&lineHead); - } - /* now do the actual printing */ - printLine (lineHead,codeOutFile); - + iCode *ic; + int cln = 0; + + lineHead = lineCurr = NULL; + + pb = newpCodeChain(GcurMemmap,0,newpCodeCharP("; Starting pCode block")); + addpBlock(pb); + + /* if debug information required */ + if (options.debug && currFunc) { + if (currFunc) { + debugFile->writeFunction(currFunc); + _G.debugLine = 1; + if (IS_STATIC(currFunc->etype)) { + pic14_emitcode("",";F%s$%s$0$0 %d",moduleName,currFunc->name,__LINE__); + //addpCode2pBlock(pb,newpCodeLabel(moduleName,currFunc->name)); + } else { + pic14_emitcode("",";G$%s$0$0 %d",currFunc->name,__LINE__); + //addpCode2pBlock(pb,newpCodeLabel(NULL,currFunc->name)); + } + _G.debugLine = 0; + } + } + + + for (ic = lic ; ic ; ic = ic->next ) { + + DEBUGpic14_emitcode(";ic",""); + if ( cln != ic->lineno ) { + if ( options.debug ) { + _G.debugLine = 1; + pic14_emitcode("",";C$%s$%d$%d$%d ==.", + FileBaseName(ic->filename),ic->lineno, + ic->level,ic->block); + _G.debugLine = 0; + } + /* + pic14_emitcode("#CSRC","%s %d",FileBaseName(ic->filename),ic->lineno); + pic14_emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, + printCLine(ic->filename, ic->lineno)); + */ + if (!options.noCcodeInAsm) { + addpCode2pBlock(pb, + newpCodeCSource(ic->lineno, + ic->filename, + printCLine(ic->filename, ic->lineno))); + } + + cln = ic->lineno ; + } + + // if you want printILine too, look at ../mcs51/gen.c, i don't understand this :) + + /* if the result is marked as + spilt and rematerializable or code for + this has already been generated then + do nothing */ + if (resultRemat(ic) || ic->generated ) + continue ; + + /* depending on the operation */ + switch (ic->op) { + case '!' : + genNot(ic); + break; + + case '~' : + genCpl(ic); + break; + + case UNARYMINUS: + genUminus (ic); + break; + + case IPUSH: + genIpush (ic); + break; + + case IPOP: + /* IPOP happens only when trying to restore a + spilt live range, if there is an ifx statement + following this pop then the if statement might + be using some of the registers being popped which + would destory the contents of the register so + we need to check for this condition and handle it */ + if (ic->next && + ic->next->op == IFX && + regsInCommon(IC_LEFT(ic),IC_COND(ic->next))) + genIfx (ic->next,ic); + else + genIpop (ic); + break; + + case CALL: + genCall (ic); + break; + + case PCALL: + genPcall (ic); + break; + + case FUNCTION: + genFunction (ic); + break; + + case ENDFUNCTION: + genEndFunction (ic); + break; + + case RETURN: + genRet (ic); + break; + + case LABEL: + genLabel (ic); + break; + + case GOTO: + genGoto (ic); + break; + + case '+' : + genPlus (ic) ; + break; + + case '-' : + if ( ! genDjnz (ic,ifxForOp(IC_RESULT(ic),ic))) + genMinus (ic); + break; + + case '*' : + genMult (ic); + break; + + case '/' : + genDiv (ic) ; + break; + + case '%' : + genMod (ic); + break; + + case '>' : + genCmpGt (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case '<' : + genCmpLt (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case LE_OP: + case GE_OP: + case NE_OP: + + /* note these two are xlated by algebraic equivalence + during parsing SDCC.y */ + werror(E_INTERNAL_ERROR,__FILE__,__LINE__, + "got '>=' or '<=' shouldn't have come here"); + break; + + case EQ_OP: + genCmpEq (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case AND_OP: + genAndOp (ic); + break; + + case OR_OP: + genOrOp (ic); + break; + + case '^' : + genXor (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case '|' : + genOr (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case BITWISEAND: + genAnd (ic,ifxForOp(IC_RESULT(ic),ic)); + break; + + case INLINEASM: + genInline (ic); + break; + + case RRC: + genRRC (ic); + break; + + case RLC: + genRLC (ic); + break; + + case GETHBIT: + genGetHbit (ic); + break; + + case LEFT_OP: + genLeftShift (ic); + break; + + case RIGHT_OP: + genRightShift (ic); + break; + + case GET_VALUE_AT_ADDRESS: + genPointerGet(ic); + break; + + case '=' : + if (POINTER_SET(ic)) + genPointerSet(ic); + else + genAssign(ic); + break; + + case IFX: + genIfx (ic,NULL); + break; + + case ADDRESS_OF: + genAddrOf (ic); + break; + + case JUMPTABLE: + genJumpTab (ic); + break; + + case CAST: + genCast (ic); + break; + + case RECEIVE: + genReceive(ic); + break; + + case SEND: + addSet(&_G.sendSet,ic); + break; + + case DUMMY_READ_VOLATILE: + genDummyRead (ic); + break; + + default : + ic = ic; + } + } + + + /* now we are ready to call the + peep hole optimizer */ + if (!options.nopeep) { + peepHole (&lineHead); + } + /* now do the actual printing */ + printLine (lineHead,codeOutFile); + #ifdef PCODE_DEBUG - DFPRINTF((stderr,"printing pBlock\n\n")); - printpBlock(stdout,pb); + DFPRINTF((stderr,"printing pBlock\n\n")); + printpBlock(stdout,pb); #endif - - return; + + return; } diff --git a/src/pic/gen.h b/src/pic/gen.h index 81b407da..4083c1ae 100644 --- a/src/pic/gen.h +++ b/src/pic/gen.h @@ -30,12 +30,12 @@ struct pCodeOp; enum { - AOP_LIT = 1, - AOP_REG, AOP_DIR, - AOP_DPTR, AOP_DPTR2, AOP_R0, AOP_R1, - AOP_STK, AOP_IMMD, AOP_STR, - AOP_CRY, AOP_ACC, - AOP_PCODE + AOP_LIT = 1, + AOP_REG, AOP_DIR, + AOP_DPTR, AOP_DPTR2, AOP_R0, AOP_R1, + AOP_STK, AOP_IMMD, AOP_STR, + AOP_CRY, AOP_ACC, + AOP_PCODE }; @@ -45,47 +45,43 @@ enum typedef struct asmop { - short type; /* can have values - AOP_LIT - operand is a literal value - AOP_REG - is in registers - AOP_DIR - direct just a name - AOP_DPTR - dptr contains address of operand - AOP_DPTR2 - dptr2 contains address of operand (DS80C390 only). - AOP_R0/R1 - r0/r1 contains address of operand - AOP_STK - should be pushed on stack this - can happen only for the result - AOP_IMMD - immediate value for eg. remateriazable - AOP_CRY - carry contains the value of this - AOP_STR - array of strings - AOP_ACC - result is in the acc:b pair - */ - short coff; /* current offset */ - short size; /* total size */ - unsigned code:1; /* is in Code space */ - unsigned paged:1; /* in paged memory */ - unsigned freed:1; /* already freed */ - union - { - value *aop_lit; /* if literal */ - regs *aop_reg[4]; /* array of registers */ - char *aop_dir; /* if direct */ - regs *aop_ptr; /* either -> to r0 or r1 */ - char *aop_immd; /* if immediate others are implied */ - int aop_stk; /* stack offset when AOP_STK */ - char *aop_str[4]; /* just a string array containing the location */ -/* regs *aop_alloc_reg; * points to a dynamically allocated register */ - pCodeOp *pcop; - } - aopu; + short type; /* can have values + AOP_LIT - operand is a literal value + AOP_REG - is in registers + AOP_DIR - direct just a name + AOP_DPTR - dptr contains address of operand + AOP_DPTR2 - dptr2 contains address of operand (DS80C390 only). + AOP_R0/R1 - r0/r1 contains address of operand + AOP_STK - should be pushed on stack this + can happen only for the result + AOP_IMMD - immediate value for eg. remateriazable + AOP_CRY - carry contains the value of this + AOP_STR - array of strings + AOP_ACC - result is in the acc:b pair + */ + short coff; /* current offset */ + short size; /* total size */ + unsigned code:1; /* is in Code space */ + unsigned paged:1; /* in paged memory */ + unsigned freed:1; /* already freed */ + union + { + value *aop_lit; /* if literal */ + regs *aop_reg[4]; /* array of registers */ + char *aop_dir; /* if direct */ + regs *aop_ptr; /* either -> to r0 or r1 */ + char *aop_immd; /* if immediate others are implied */ + int aop_stk; /* stack offset when AOP_STK */ + char *aop_str[4]; /* just a string array containing the location */ + pCodeOp *pcop; + } + aopu; } asmop; void genpic14Code (iCode *); -//extern char *fReturnpic14[]; -//extern char *fReturn390[]; extern unsigned fReturnSizePic; -//extern char **fReturn; #define AOP(op) op->aop diff --git a/src/pic/genarith.c b/src/pic/genarith.c index 8bb07478..be495a96 100644 --- a/src/pic/genarith.c +++ b/src/pic/genarith.c @@ -25,8 +25,8 @@ what you give them. Help stamp out software-hoarding! Notes: - 000123 mlh Moved aopLiteral to SDCCglue.c to help the split - Made everything static + 000123 mlh Moved aopLiteral to SDCCglue.c to help the split + Made everything static -------------------------------------------------------------------------*/ #include @@ -37,7 +37,7 @@ #include "newalloc.h" #if defined(_MSC_VER) && (_MSC_VER < 1300) -#define __FUNCTION__ __FILE__ +#define __FUNCTION__ __FILE__ #endif #include "common.h" @@ -52,104 +52,145 @@ void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *res const char *AopType(short type) { - switch(type) { - case AOP_LIT: - return "AOP_LIT"; - break; - case AOP_REG: - return "AOP_REG"; - break; - case AOP_DIR: - return "AOP_DIR"; - break; - case AOP_DPTR: - return "AOP_DPTR"; - break; - case AOP_DPTR2: - return "AOP_DPTR2"; - break; - case AOP_R0: - return "AOP_R0"; - break; - case AOP_R1: - return "AOP_R1"; - break; - case AOP_STK: - return "AOP_STK"; - break; - case AOP_IMMD: - return "AOP_IMMD"; - break; - case AOP_STR: - return "AOP_STR"; - break; - case AOP_CRY: - return "AOP_CRY"; - break; - case AOP_ACC: - return "AOP_ACC"; - break; - case AOP_PCODE: - return "AOP_PCODE"; - break; - } - - return "BAD TYPE"; + switch(type) { + case AOP_LIT: + return "AOP_LIT"; + break; + case AOP_REG: + return "AOP_REG"; + break; + case AOP_DIR: + return "AOP_DIR"; + break; + case AOP_DPTR: + return "AOP_DPTR"; + break; + case AOP_DPTR2: + return "AOP_DPTR2"; + break; + case AOP_R0: + return "AOP_R0"; + break; + case AOP_R1: + return "AOP_R1"; + break; + case AOP_STK: + return "AOP_STK"; + break; + case AOP_IMMD: + return "AOP_IMMD"; + break; + case AOP_STR: + return "AOP_STR"; + break; + case AOP_CRY: + return "AOP_CRY"; + break; + case AOP_ACC: + return "AOP_ACC"; + break; + case AOP_PCODE: + return "AOP_PCODE"; + break; + } + + return "BAD TYPE"; +} + +void DebugAop(asmop *aop) +{ + if(!aop) + return; + printf("%s\n",AopType(aop->type)); + printf(" current offset: %d\n",aop->coff); + printf(" size: %d\n",aop->size); + + switch(aop->type) { + case AOP_LIT: + printf(" name: %s\n",aop->aopu.aop_lit->name); + break; + case AOP_REG: + printf(" name: %s\n",aop->aopu.aop_reg[0]->name); + break; + case AOP_CRY: + case AOP_DIR: + printf(" name: %s\n",aop->aopu.aop_dir); + break; + case AOP_DPTR: + case AOP_DPTR2: + case AOP_R0: + case AOP_R1: + case AOP_ACC: + printf("not supported\n"); + break; + case AOP_STK: + printf(" Stack offset: %d\n",aop->aopu.aop_stk); + break; + case AOP_IMMD: + printf(" immediate: %s\n",aop->aopu.aop_immd); + break; + case AOP_STR: + printf(" aop_str[0]: %s\n",aop->aopu.aop_str[0]); + break; + case AOP_PCODE: + //printpCode(stdout,aop->aopu.pcop); + break; + } } const char *pCodeOpType( pCodeOp *pcop) { - - if(pcop) { - - switch(pcop->type) { - - case PO_NONE: - return "PO_NONE"; - case PO_W: - return "PO_W"; - case PO_STATUS: - return "PO_STATUS"; - case PO_FSR: - return "PO_FSR"; - case PO_INDF: - return "PO_INDF"; - case PO_INTCON: - return "PO_INTCON"; - case PO_GPR_REGISTER: - return "PO_GPR_REGISTER"; - case PO_GPR_POINTER: - return "PO_GPR_POINTER"; - case PO_GPR_BIT: - return "PO_GPR_BIT"; - case PO_GPR_TEMP: - return "PO_GPR_TEMP"; - case PO_SFR_REGISTER: - return "PO_SFR_REGISTER"; - case PO_PCL: - return "PO_PCL"; - case PO_PCLATH: - return "PO_PCLATH"; - case PO_LITERAL: - return "PO_LITERAL"; - case PO_IMMEDIATE: - return "PO_IMMEDIATE"; - case PO_DIR: - return "PO_DIR"; - case PO_CRY: - return "PO_CRY"; - case PO_BIT: - return "PO_BIT"; - case PO_STR: - return "PO_STR"; - case PO_LABEL: - return "PO_LABEL"; - case PO_WILD: - return "PO_WILD"; - } - } - - return "BAD PO_TYPE"; + + if(pcop) { + + switch(pcop->type) { + + case PO_NONE: + return "PO_NONE"; + case PO_W: + return "PO_W"; + case PO_STATUS: + return "PO_STATUS"; + case PO_FSR: + return "PO_FSR"; + case PO_INDF: + return "PO_INDF"; + case PO_INTCON: + return "PO_INTCON"; + case PO_GPR_REGISTER: + return "PO_GPR_REGISTER"; + case PO_GPR_POINTER: + return "PO_GPR_POINTER"; + case PO_GPR_BIT: + return "PO_GPR_BIT"; + case PO_GPR_TEMP: + return "PO_GPR_TEMP"; + case PO_SFR_REGISTER: + return "PO_SFR_REGISTER"; + case PO_PCL: + return "PO_PCL"; + case PO_PCLATH: + return "PO_PCLATH"; + case PO_LITERAL: + return "PO_LITERAL"; + case PO_IMMEDIATE: + return "PO_IMMEDIATE"; + case PO_DIR: + return "PO_DIR"; + case PO_CRY: + return "PO_CRY"; + case PO_BIT: + return "PO_BIT"; + case PO_STR: + return "PO_STR"; + case PO_LABEL: + return "PO_LABEL"; + case PO_WILD: + return "PO_WILD"; + } + } + + return "BAD PO_TYPE"; } /*-----------------------------------------------------------------*/ @@ -157,91 +198,91 @@ const char *pCodeOpType( pCodeOp *pcop) /*-----------------------------------------------------------------*/ bool genPlusIncr (iCode *ic) { - unsigned int icount ; - unsigned int size = pic14_getDataSize(IC_RESULT(ic)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", - AopType(AOP_TYPE(IC_RESULT(ic))), - AopType(AOP_TYPE(IC_LEFT(ic))), - AopType(AOP_TYPE(IC_RIGHT(ic)))); - - /* will try to generate an increment */ - /* if the right side is not a literal - we cannot */ - if (AOP_TYPE(IC_RIGHT(ic)) != AOP_LIT) - return FALSE ; - - DEBUGpic14_emitcode ("; ","%s %d",__FUNCTION__,__LINE__); - /* if the literal value of the right hand side - is greater than 1 then it is faster to add */ - if ((icount = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)) > 2) - return FALSE ; - - /* if increment 16 bits in register */ - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) && - (icount == 1)) { - - int offset = MSB16; - - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),LSB)); - //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - - while(--size) { - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++)); - //pic14_emitcode(" incf","%s,f",aopGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE)); - } - - return TRUE; - } - - DEBUGpic14_emitcode ("; ","%s %d",__FUNCTION__,__LINE__); - /* if left is in accumulator - probably a bit operation*/ - if( strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") && - (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) ) { - - emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0)); - pic14_emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - if(icount) - emitpcode(POC_XORLW,popGetLit(1)); - //pic14_emitcode("xorlw","1"); - else - emitpcode(POC_ANDLW,popGetLit(1)); - //pic14_emitcode("andlw","1"); - - emitSKPZ; - emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0)); - pic14_emitcode("bsf","(%s >> 3), (%s & 7)", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - - return TRUE; - } - - - - /* if the sizes are greater than 1 then we cannot */ - if (AOP_SIZE(IC_RESULT(ic)) > 1 || - AOP_SIZE(IC_LEFT(ic)) > 1 ) - return FALSE ; - - /* If we are incrementing the same register by two: */ - - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - while (icount--) - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); - //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - return TRUE ; - } - - DEBUGpic14_emitcode ("; ","couldn't increment "); - - return FALSE ; + unsigned int icount ; + unsigned int size = pic14_getDataSize(IC_RESULT(ic)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", + AopType(AOP_TYPE(IC_RESULT(ic))), + AopType(AOP_TYPE(IC_LEFT(ic))), + AopType(AOP_TYPE(IC_RIGHT(ic)))); + + /* will try to generate an increment */ + /* if the right side is not a literal + we cannot */ + if (AOP_TYPE(IC_RIGHT(ic)) != AOP_LIT) + return FALSE ; + + DEBUGpic14_emitcode ("; ","%s %d",__FUNCTION__,__LINE__); + /* if the literal value of the right hand side + is greater than 1 then it is faster to add */ + if ((icount = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)) > 2) + return FALSE ; + + /* if increment 16 bits in register */ + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) && + (icount == 1)) { + + int offset = MSB16; + + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),LSB)); + //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); + + while(--size) { + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++)); + //pic14_emitcode(" incf","%s,f",aopGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE)); + } + + return TRUE; + } + + DEBUGpic14_emitcode ("; ","%s %d",__FUNCTION__,__LINE__); + /* if left is in accumulator - probably a bit operation*/ + if( strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") && + (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) ) { + + emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0)); + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", + AOP(IC_RESULT(ic))->aopu.aop_dir, + AOP(IC_RESULT(ic))->aopu.aop_dir); + if(icount) + emitpcode(POC_XORLW,popGetLit(1)); + //pic14_emitcode("xorlw","1"); + else + emitpcode(POC_ANDLW,popGetLit(1)); + //pic14_emitcode("andlw","1"); + + emitSKPZ; + emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0)); + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", + AOP(IC_RESULT(ic))->aopu.aop_dir, + AOP(IC_RESULT(ic))->aopu.aop_dir); + + return TRUE; + } + + + + /* if the sizes are greater than 1 then we cannot */ + if (AOP_SIZE(IC_RESULT(ic)) > 1 || + AOP_SIZE(IC_LEFT(ic)) > 1 ) + return FALSE ; + + /* If we are incrementing the same register by two: */ + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + + while (icount--) + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); + //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + return TRUE ; + } + + DEBUGpic14_emitcode ("; ","couldn't increment "); + + return FALSE ; } /*-----------------------------------------------------------------*/ @@ -249,19 +290,19 @@ bool genPlusIncr (iCode *ic) /*-----------------------------------------------------------------*/ void pic14_outBitAcc(operand *result) { - symbol *tlbl = newiTempLabel(NULL); - /* if the result is a bit */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (AOP_TYPE(result) == AOP_CRY){ - aopPut(AOP(result),"a",0); - } - else { - pic14_emitcode("jz","%05d_DS_",tlbl->key+100); - pic14_emitcode("mov","a,#01"); - pic14_emitcode("","%05d_DS_:",tlbl->key+100); - pic14_outAcc(result); - } + symbol *tlbl = newiTempLabel(NULL); + /* if the result is a bit */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if (AOP_TYPE(result) == AOP_CRY){ + aopPut(AOP(result),"a",0); + } + else { + pic14_emitcode("jz","%05d_DS_",tlbl->key+100); + pic14_emitcode("mov","a,#01"); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outAcc(result); + } } /*-----------------------------------------------------------------*/ @@ -269,75 +310,90 @@ void pic14_outBitAcc(operand *result) /*-----------------------------------------------------------------*/ void genPlusBits (iCode *ic) { - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", - AopType(AOP_TYPE(IC_RESULT(ic))), - AopType(AOP_TYPE(IC_LEFT(ic))), - AopType(AOP_TYPE(IC_RIGHT(ic)))); - /* - The following block of code will add two bits. - Note that it'll even work if the destination is - the carry (C in the status register). - It won't work if the 'Z' bit is a source or destination. - */ - - /* If the result is stored in the accumulator (w) */ - //if(strcmp(aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE),"a") == 0 ) { - switch(AOP_TYPE(IC_RESULT(ic))) { - case AOP_ACC: - emitpcode(POC_CLRW, NULL); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORLW, popGetLit(1)); - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_XORLW, popGetLit(1)); - - pic14_emitcode("clrw",""); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode("xorlw","1"); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_LEFT(ic))->aopu.aop_dir, - AOP(IC_LEFT(ic))->aopu.aop_dir); - pic14_emitcode("xorlw","1"); - break; - case AOP_REG: - emitpcode(POC_MOVLW, popGetLit(0)); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORLW, popGetLit(1)); - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_XORLW, popGetLit(1)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); - break; - default: - emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); - - pic14_emitcode("movlw","(1 << (%s & 7))", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - pic14_emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode("xorwf","(%s >>3),f", - AOP(IC_RESULT(ic))->aopu.aop_dir); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_LEFT(ic))->aopu.aop_dir, - AOP(IC_LEFT(ic))->aopu.aop_dir); - pic14_emitcode("xorwf","(%s>>3),f", - AOP(IC_RESULT(ic))->aopu.aop_dir); - break; - } - + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", + AopType(AOP_TYPE(IC_RESULT(ic))), + AopType(AOP_TYPE(IC_LEFT(ic))), + AopType(AOP_TYPE(IC_RIGHT(ic)))); + /* + The following block of code will add two bits. + Note that it'll even work if the destination is + the carry (C in the status register). + It won't work if the 'Z' bit is a source or destination. + */ + + /* If the result is stored in the accumulator (w) */ + //if(strcmp(aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE),"a") == 0 ) { + switch(AOP_TYPE(IC_RESULT(ic))) { + case AOP_ACC: + emitpcode(POC_CLRW, NULL); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORLW, popGetLit(1)); + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_XORLW, popGetLit(1)); + + pic14_emitcode("clrw",""); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode("xorlw","1"); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_LEFT(ic))->aopu.aop_dir, + AOP(IC_LEFT(ic))->aopu.aop_dir); + pic14_emitcode("xorlw","1"); + break; + case AOP_REG: + emitpcode(POC_MOVLW, popGetLit(0)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORLW, popGetLit(1)); + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_XORLW, popGetLit(1)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); + break; + /* case AOP_CRY: + if(pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) { + + } else { + + } + break;*/ + default: + if(pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) { + DebugAop(AOP(IC_LEFT(ic))); + emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORWF, popGet(AOP(IC_LEFT(ic)),0)); + } else { + emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); + } + + + pic14_emitcode("movlw","(1 << (%s & 7))", + AOP(IC_RESULT(ic))->aopu.aop_dir, + AOP(IC_RESULT(ic))->aopu.aop_dir); + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", + AOP(IC_RESULT(ic))->aopu.aop_dir, + AOP(IC_RESULT(ic))->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode("xorwf","(%s >>3),f", + AOP(IC_RESULT(ic))->aopu.aop_dir); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_LEFT(ic))->aopu.aop_dir, + AOP(IC_LEFT(ic))->aopu.aop_dir); + pic14_emitcode("xorwf","(%s>>3),f", + AOP(IC_RESULT(ic))->aopu.aop_dir); + break; + } + } #if 0 @@ -348,29 +404,29 @@ void genPlusBits (iCode *ic) */ static void adjustArithmeticResult(iCode *ic) { - if (AOP_SIZE(IC_RESULT(ic)) == 3 && - AOP_SIZE(IC_LEFT(ic)) == 3 && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) - aopPut(AOP(IC_RESULT(ic)), - aopGet(AOP(IC_LEFT(ic)),2,FALSE,FALSE), - 2); - - if (AOP_SIZE(IC_RESULT(ic)) == 3 && - AOP_SIZE(IC_RIGHT(ic)) == 3 && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) - aopPut(AOP(IC_RESULT(ic)), - aopGet(AOP(IC_RIGHT(ic)),2,FALSE,FALSE), - 2); - - if (AOP_SIZE(IC_RESULT(ic)) == 3 && - AOP_SIZE(IC_LEFT(ic)) < 3 && - AOP_SIZE(IC_RIGHT(ic)) < 3 && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) { - char buffer[5]; - sprintf(buffer,"#%d",pointerCode(getSpec(operandType(IC_LEFT(ic))))); - aopPut(AOP(IC_RESULT(ic)),buffer,2); - } + if (AOP_SIZE(IC_RESULT(ic)) == 3 && + AOP_SIZE(IC_LEFT(ic)) == 3 && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) + aopPut(AOP(IC_RESULT(ic)), + aopGet(AOP(IC_LEFT(ic)),2,FALSE,FALSE), + 2); + + if (AOP_SIZE(IC_RESULT(ic)) == 3 && + AOP_SIZE(IC_RIGHT(ic)) == 3 && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) + aopPut(AOP(IC_RESULT(ic)), + aopGet(AOP(IC_RIGHT(ic)),2,FALSE,FALSE), + 2); + + if (AOP_SIZE(IC_RESULT(ic)) == 3 && + AOP_SIZE(IC_LEFT(ic)) < 3 && + AOP_SIZE(IC_RIGHT(ic)) < 3 && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) { + char buffer[5]; + sprintf(buffer,"#%d",pointerCode(getSpec(operandType(IC_LEFT(ic))))); + aopPut(AOP(IC_RESULT(ic)),buffer,2); + } } //#else /* This is the pure and virtuous version of this code. @@ -379,33 +435,33 @@ static void adjustArithmeticResult(iCode *ic) */ static void adjustArithmeticResult(iCode *ic) { - if (opIsGptr(IC_RESULT(ic)) && - opIsGptr(IC_LEFT(ic)) && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) - { - aopPut(AOP(IC_RESULT(ic)), - aopGet(AOP(IC_LEFT(ic)), GPTRSIZE - 1,FALSE,FALSE), - GPTRSIZE - 1); - } - - if (opIsGptr(IC_RESULT(ic)) && - opIsGptr(IC_RIGHT(ic)) && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) - { - aopPut(AOP(IC_RESULT(ic)), - aopGet(AOP(IC_RIGHT(ic)),GPTRSIZE - 1,FALSE,FALSE), - GPTRSIZE - 1); - } - - if (opIsGptr(IC_RESULT(ic)) && - AOP_SIZE(IC_LEFT(ic)) < GPTRSIZE && - AOP_SIZE(IC_RIGHT(ic)) < GPTRSIZE && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && - !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) { - char buffer[5]; - sprintf(buffer,"#%d",pointerCode(getSpec(operandType(IC_LEFT(ic))))); - aopPut(AOP(IC_RESULT(ic)),buffer,GPTRSIZE - 1); - } + if (opIsGptr(IC_RESULT(ic)) && + opIsGptr(IC_LEFT(ic)) && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic)))) + { + aopPut(AOP(IC_RESULT(ic)), + aopGet(AOP(IC_LEFT(ic)), GPTRSIZE - 1,FALSE,FALSE), + GPTRSIZE - 1); + } + + if (opIsGptr(IC_RESULT(ic)) && + opIsGptr(IC_RIGHT(ic)) && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) + { + aopPut(AOP(IC_RESULT(ic)), + aopGet(AOP(IC_RIGHT(ic)),GPTRSIZE - 1,FALSE,FALSE), + GPTRSIZE - 1); + } + + if (opIsGptr(IC_RESULT(ic)) && + AOP_SIZE(IC_LEFT(ic)) < GPTRSIZE && + AOP_SIZE(IC_RIGHT(ic)) < GPTRSIZE && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && + !pic14_sameRegs(AOP(IC_RESULT(ic)),AOP(IC_RIGHT(ic)))) { + char buffer[5]; + sprintf(buffer,"#%d",pointerCode(getSpec(operandType(IC_LEFT(ic))))); + aopPut(AOP(IC_RESULT(ic)),buffer,GPTRSIZE - 1); + } } #endif @@ -414,361 +470,361 @@ static void adjustArithmeticResult(iCode *ic) /*-----------------------------------------------------------------*/ static void genAddLit2byte (operand *result, int offr, int lit) { - - switch(lit & 0xff) { - case 0: - break; - case 1: - emitpcode(POC_INCF, popGet(AOP(result),offr)); - break; - case 0xff: - emitpcode(POC_DECF, popGet(AOP(result),offr)); - break; - default: - emitpcode(POC_MOVLW,popGetLit(lit&0xff)); - emitpcode(POC_ADDWF,popGet(AOP(result),offr)); - } - + + switch(lit & 0xff) { + case 0: + break; + case 1: + emitpcode(POC_INCF, popGet(AOP(result),offr)); + break; + case 0xff: + emitpcode(POC_DECF, popGet(AOP(result),offr)); + break; + default: + emitpcode(POC_MOVLW,popGetLit(lit&0xff)); + emitpcode(POC_ADDWF,popGet(AOP(result),offr)); + } + } static void emitMOVWF(operand *reg, int offset) { - if(!reg) - return; - - if (AOP_TYPE(reg) == AOP_ACC) { - DEBUGpic14_emitcode ("; ***","%s %d ignoring mov into W",__FUNCTION__,__LINE__); - return; - } - - emitpcode(POC_MOVWF, popGet(AOP(reg),offset)); - + if(!reg) + return; + + if (AOP_TYPE(reg) == AOP_ACC) { + DEBUGpic14_emitcode ("; ***","%s %d ignoring mov into W",__FUNCTION__,__LINE__); + return; + } + + emitpcode(POC_MOVWF, popGet(AOP(reg),offset)); + } static void genAddLit (iCode *ic, int lit) { - - int size,same; - int lo; - - operand *result; - operand *left; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - - left = IC_LEFT(ic); - result = IC_RESULT(ic); - same = pic14_sameRegs(AOP(left), AOP(result)); - size = pic14_getDataSize(result); - - if(same) { - - /* Handle special cases first */ - if(size == 1) - genAddLit2byte (result, 0, lit); - - else if(size == 2) { - int hi = 0xff & (lit >> 8); - lo = lit & 0xff; - - switch(hi) { - case 0: - - /* lit = 0x00LL */ - DEBUGpic14_emitcode ("; hi = 0","%s %d",__FUNCTION__,__LINE__); - switch(lo) { - case 0: - break; - case 1: - emitpcode(POC_INCF, popGet(AOP(result),0)); - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - break; - case 0xff: - emitpcode(POC_DECF, popGet(AOP(result),0)); - emitpcode(POC_INCFSZW, popGet(AOP(result),0)); - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - - break; - default: - emitpcode(POC_MOVLW,popGetLit(lit&0xff)); - emitpcode(POC_ADDWF,popGet(AOP(result),0)); - emitSKPNC; - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - - - } - break; - - case 1: - /* lit = 0x01LL */ - DEBUGpic14_emitcode ("; hi = 1","%s %d",__FUNCTION__,__LINE__); - switch(lo) { - case 0: /* 0x0100 */ - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - break; - case 1: /* 0x0101 */ - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - emitpcode(POC_INCF, popGet(AOP(result),0)); - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - break; - case 0xff: /* 0x01ff */ - emitpcode(POC_DECF, popGet(AOP(result),0)); - emitpcode(POC_INCFSZW, popGet(AOP(result),0)); - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - emitpcode(POC_INCF, popGet(AOP(result),MSB16)); - } - break; - - case 0xff: - DEBUGpic14_emitcode ("; hi = ff","%s %d",__FUNCTION__,__LINE__); - /* lit = 0xffLL */ - switch(lo) { - case 0: /* 0xff00 */ - emitpcode(POC_DECF, popGet(AOP(result),MSB16)); - break; - case 1: /*0xff01 */ - emitpcode(POC_INCFSZ, popGet(AOP(result),0)); - emitpcode(POC_DECF, popGet(AOP(result),MSB16)); - break; - /* case 0xff: * 0xffff * - emitpcode(POC_INCFSZW, popGet(AOP(result),0,FALSE,FALSE)); - emitpcode(POC_INCF, popGet(AOP(result),MSB16,FALSE,FALSE)); - emitpcode(POC_DECF, popGet(AOP(result),0,FALSE,FALSE)); - break; - */ - default: - emitpcode(POC_MOVLW,popGetLit(lo)); - emitpcode(POC_ADDWF,popGet(AOP(result),0)); - emitSKPC; - emitpcode(POC_DECF, popGet(AOP(result),MSB16)); - - } - - break; - - default: - DEBUGpic14_emitcode ("; hi is generic","%d %s %d",hi,__FUNCTION__,__LINE__); - - /* lit = 0xHHLL */ - switch(lo) { - case 0: /* 0xHH00 */ - genAddLit2byte (result, MSB16, hi); - break; - case 1: /* 0xHH01 */ - emitpcode(POC_MOVLW,popGetLit((hi+1)&0xff)); - emitpcode(POC_INCFSZ, popGet(AOP(result),0)); - emitpcode(POC_MOVLW,popGetLit(hi)); - emitpcode(POC_ADDWF,popGet(AOP(result),MSB16)); - break; - /* case 0xff: * 0xHHff * - emitpcode(POC_MOVFW, popGet(AOP(result),0,FALSE,FALSE)); - emitpcode(POC_DECF, popGet(AOP(result),MSB16,FALSE,FALSE)); - emitpcode(POC_MOVLW,popGetLit(hi)); - emitpcode(POC_ADDWF,popGet(AOP(result),MSB16,FALSE,FALSE)); - break; - */ default: /* 0xHHLL */ - emitpcode(POC_MOVLW,popGetLit(lo)); - emitpcode(POC_ADDWF, popGet(AOP(result),0)); - emitpcode(POC_MOVLW,popGetLit(hi)); - emitSKPNC; - emitpcode(POC_MOVLW,popGetLit((hi+1) & 0xff)); - emitpcode(POC_ADDWF,popGet(AOP(result),MSB16)); - break; - } - - } - } else { - int carry_info = 0; - int offset = 0; - /* size > 2 */ - DEBUGpic14_emitcode ("; add lit to long","%s %d",__FUNCTION__,__LINE__); - - while(size--) { - lo = BYTEofLONG(lit,0); - - if(carry_info) { - switch(lo) { - case 0: - switch(carry_info) { - case 1: - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(result),offset)); - break; - case 2: - emitpcode(POC_RLFW, popGet(AOP(result),offset)); - emitpcode(POC_ANDLW,popGetLit(1)); - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - break; - default: /* carry_info = 3 */ - emitSKPNC; - emitpcode(POC_INCF, popGet(AOP(result),offset)); - carry_info = 1; - break; - } - break; - case 0xff: - emitpcode(POC_MOVLW,popGetLit(lo)); - if(carry_info==1) - emitSKPZ; - else - emitSKPC; - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - break; - default: - emitpcode(POC_MOVLW,popGetLit(lo)); - if(carry_info==1) - emitSKPNZ; - else - emitSKPNC; - emitpcode(POC_MOVLW,popGetLit(lo+1)); - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - carry_info=2; - break; - } - }else { - /* no carry info from previous step */ - /* this means this is the first time to add */ - switch(lo) { - case 0: - break; - case 1: - emitpcode(POC_INCF, popGet(AOP(result),offset)); - carry_info=1; - break; - default: - emitpcode(POC_MOVLW,popGetLit(lo)); - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - if(lit <0x100) - carry_info = 3; /* Were adding only one byte and propogating the carry */ - else - carry_info = 2; - break; - } - } - offset++; - lit >>= 8; - } - - /* - lo = BYTEofLONG(lit,0); + + int size,same; + int lo; + + operand *result; + operand *left; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + + left = IC_LEFT(ic); + result = IC_RESULT(ic); + same = pic14_sameRegs(AOP(left), AOP(result)); + size = pic14_getDataSize(result); + + if(same) { + + /* Handle special cases first */ + if(size == 1) + genAddLit2byte (result, 0, lit); + + else if(size == 2) { + int hi = 0xff & (lit >> 8); + lo = lit & 0xff; + + switch(hi) { + case 0: + + /* lit = 0x00LL */ + DEBUGpic14_emitcode ("; hi = 0","%s %d",__FUNCTION__,__LINE__); + switch(lo) { + case 0: + break; + case 1: + emitpcode(POC_INCF, popGet(AOP(result),0)); + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + break; + case 0xff: + emitpcode(POC_DECF, popGet(AOP(result),0)); + emitpcode(POC_INCFSZW, popGet(AOP(result),0)); + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + + break; + default: + emitpcode(POC_MOVLW,popGetLit(lit&0xff)); + emitpcode(POC_ADDWF,popGet(AOP(result),0)); + emitSKPNC; + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + + + } + break; + + case 1: + /* lit = 0x01LL */ + DEBUGpic14_emitcode ("; hi = 1","%s %d",__FUNCTION__,__LINE__); + switch(lo) { + case 0: /* 0x0100 */ + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + break; + case 1: /* 0x0101 */ + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + emitpcode(POC_INCF, popGet(AOP(result),0)); + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + break; + case 0xff: /* 0x01ff */ + emitpcode(POC_DECF, popGet(AOP(result),0)); + emitpcode(POC_INCFSZW, popGet(AOP(result),0)); + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + emitpcode(POC_INCF, popGet(AOP(result),MSB16)); + } + break; + + case 0xff: + DEBUGpic14_emitcode ("; hi = ff","%s %d",__FUNCTION__,__LINE__); + /* lit = 0xffLL */ + switch(lo) { + case 0: /* 0xff00 */ + emitpcode(POC_DECF, popGet(AOP(result),MSB16)); + break; + case 1: /*0xff01 */ + emitpcode(POC_INCFSZ, popGet(AOP(result),0)); + emitpcode(POC_DECF, popGet(AOP(result),MSB16)); + break; + /* case 0xff: * 0xffff * + emitpcode(POC_INCFSZW, popGet(AOP(result),0,FALSE,FALSE)); + emitpcode(POC_INCF, popGet(AOP(result),MSB16,FALSE,FALSE)); + emitpcode(POC_DECF, popGet(AOP(result),0,FALSE,FALSE)); + break; + */ + default: + emitpcode(POC_MOVLW,popGetLit(lo)); + emitpcode(POC_ADDWF,popGet(AOP(result),0)); + emitSKPC; + emitpcode(POC_DECF, popGet(AOP(result),MSB16)); + + } + + break; + + default: + DEBUGpic14_emitcode ("; hi is generic","%d %s %d",hi,__FUNCTION__,__LINE__); + + /* lit = 0xHHLL */ + switch(lo) { + case 0: /* 0xHH00 */ + genAddLit2byte (result, MSB16, hi); + break; + case 1: /* 0xHH01 */ + emitpcode(POC_MOVLW,popGetLit((hi+1)&0xff)); + emitpcode(POC_INCFSZ, popGet(AOP(result),0)); + emitpcode(POC_MOVLW,popGetLit(hi)); + emitpcode(POC_ADDWF,popGet(AOP(result),MSB16)); + break; + /* case 0xff: * 0xHHff * + emitpcode(POC_MOVFW, popGet(AOP(result),0,FALSE,FALSE)); + emitpcode(POC_DECF, popGet(AOP(result),MSB16,FALSE,FALSE)); + emitpcode(POC_MOVLW,popGetLit(hi)); + emitpcode(POC_ADDWF,popGet(AOP(result),MSB16,FALSE,FALSE)); + break; + */ default: /* 0xHHLL */ + emitpcode(POC_MOVLW,popGetLit(lo)); + emitpcode(POC_ADDWF, popGet(AOP(result),0)); + emitpcode(POC_MOVLW,popGetLit(hi)); + emitSKPNC; + emitpcode(POC_MOVLW,popGetLit((hi+1) & 0xff)); + emitpcode(POC_ADDWF,popGet(AOP(result),MSB16)); + break; + } + + } + } else { + int carry_info = 0; + int offset = 0; + /* size > 2 */ + DEBUGpic14_emitcode ("; add lit to long","%s %d",__FUNCTION__,__LINE__); + + while(size--) { + lo = BYTEofLONG(lit,0); + + if(carry_info) { + switch(lo) { + case 0: + switch(carry_info) { + case 1: + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(result),offset)); + break; + case 2: + emitpcode(POC_RLFW, popGet(AOP(result),offset)); + emitpcode(POC_ANDLW,popGetLit(1)); + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + break; + default: /* carry_info = 3 */ + emitSKPNC; + emitpcode(POC_INCF, popGet(AOP(result),offset)); + carry_info = 1; + break; + } + break; + case 0xff: + emitpcode(POC_MOVLW,popGetLit(lo)); + if(carry_info==1) + emitSKPZ; + else + emitSKPC; + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + break; + default: + emitpcode(POC_MOVLW,popGetLit(lo)); + if(carry_info==1) + emitSKPNZ; + else + emitSKPNC; + emitpcode(POC_MOVLW,popGetLit(lo+1)); + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + carry_info=2; + break; + } + }else { + /* no carry info from previous step */ + /* this means this is the first time to add */ + switch(lo) { + case 0: + break; + case 1: + emitpcode(POC_INCF, popGet(AOP(result),offset)); + carry_info=1; + break; + default: + emitpcode(POC_MOVLW,popGetLit(lo)); + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + if(lit <0x100) + carry_info = 3; /* Were adding only one byte and propogating the carry */ + else + carry_info = 2; + break; + } + } + offset++; + lit >>= 8; + } + + /* + lo = BYTEofLONG(lit,0); - if(lit < 0x100) { - if(lo) { - if(lo == 1) { - emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE)); - emitSKPNZ; - } else { - emitpcode(POC_MOVLW,popGetLit(lo)); - emitpcode(POC_ADDWF, popGet(AOP(result),0,FALSE,FALSE)); - emitSKPNC; - } - emitpcode(POC_INCF, popGet(AOP(result),1,FALSE,FALSE)); - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(result),2,FALSE,FALSE)); - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(result),3,FALSE,FALSE)); + if(lit < 0x100) { + if(lo) { + if(lo == 1) { + emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE)); + emitSKPNZ; + } else { + emitpcode(POC_MOVLW,popGetLit(lo)); + emitpcode(POC_ADDWF, popGet(AOP(result),0,FALSE,FALSE)); + emitSKPNC; + } + emitpcode(POC_INCF, popGet(AOP(result),1,FALSE,FALSE)); + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(result),2,FALSE,FALSE)); + emitSKPNZ; + emitpcode(POC_INCF, popGet(AOP(result),3,FALSE,FALSE)); - } - } - } - - */ - } + } + } + } + + */ + } } else { - int offset = 1; - DEBUGpic14_emitcode ("; left and result aren't same","%s %d",__FUNCTION__,__LINE__); - - if(size == 1) { - - if(AOP_TYPE(left) == AOP_ACC) { - /* left addend is already in accumulator */ - switch(lit & 0xff) { - case 0: - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - break; - default: - emitpcode(POC_ADDLW, popGetLit(lit & 0xff)); - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - } - } else { - /* left addend is in a register */ - switch(lit & 0xff) { - case 0: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitMOVWF(result, 0); - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - break; - case 1: - emitpcode(POC_INCFW, popGet(AOP(left),0)); - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - break; - case 0xff: - emitpcode(POC_DECFW, popGet(AOP(left),0)); - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - break; - default: - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - } - } - - } else { - int clear_carry=0; - - /* left is not the accumulator */ - if(lit & 0xff) { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); - } else { - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - /* We don't know the state of the carry bit at this point */ - clear_carry = 1; - } - //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); - emitMOVWF(result,0); - while(--size) { - - lit >>= 8; - if(lit & 0xff) { - if(clear_carry) { - /* The ls byte of the lit must've been zero - that - means we don't have to deal with carry */ - - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitpcode(POC_ADDFW, popGet(AOP(left),offset)); - emitpcode(POC_MOVWF, popGet(AOP(left),offset)); - - clear_carry = 0; - - } else { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - //emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); - emitMOVWF(result,offset); - emitpcode(POC_MOVFW, popGet(AOP(left),offset)); - emitSKPNC; - emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - } - - } else { - emitpcode(POC_CLRF, popGet(AOP(result),offset)); - emitpcode(POC_RLF, popGet(AOP(result),offset)); - emitpcode(POC_MOVFW, popGet(AOP(left),offset)); - emitpcode(POC_ADDWF, popGet(AOP(result),offset)); - } - offset++; - } - } + int offset = 1; + DEBUGpic14_emitcode ("; left and result aren't same","%s %d",__FUNCTION__,__LINE__); + + if(size == 1) { + + if(AOP_TYPE(left) == AOP_ACC) { + /* left addend is already in accumulator */ + switch(lit & 0xff) { + case 0: + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + break; + default: + emitpcode(POC_ADDLW, popGetLit(lit & 0xff)); + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + } + } else { + /* left addend is in a register */ + switch(lit & 0xff) { + case 0: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitMOVWF(result, 0); + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + break; + case 1: + emitpcode(POC_INCFW, popGet(AOP(left),0)); + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + break; + case 0xff: + emitpcode(POC_DECFW, popGet(AOP(left),0)); + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + break; + default: + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + } + } + + } else { + int clear_carry=0; + + /* left is not the accumulator */ + if(lit & 0xff) { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); + } else { + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + /* We don't know the state of the carry bit at this point */ + clear_carry = 1; + } + //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE)); + emitMOVWF(result,0); + while(--size) { + + lit >>= 8; + if(lit & 0xff) { + if(clear_carry) { + /* The ls byte of the lit must've been zero - that + means we don't have to deal with carry */ + + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitpcode(POC_ADDFW, popGet(AOP(left),offset)); + emitpcode(POC_MOVWF, popGet(AOP(left),offset)); + + clear_carry = 0; + + } else { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + //emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); + emitMOVWF(result,offset); + emitpcode(POC_MOVFW, popGet(AOP(left),offset)); + emitSKPNC; + emitpcode(POC_INCFSZW,popGet(AOP(left),offset)); + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + } + + } else { + emitpcode(POC_CLRF, popGet(AOP(result),offset)); + emitpcode(POC_RLF, popGet(AOP(result),offset)); + emitpcode(POC_MOVFW, popGet(AOP(left),offset)); + emitpcode(POC_ADDWF, popGet(AOP(result),offset)); + } + offset++; + } + } } } @@ -777,318 +833,318 @@ static void genAddLit (iCode *ic, int lit) /*-----------------------------------------------------------------*/ void genPlus (iCode *ic) { - int size, offset = 0; - - /* special cases :- */ - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp (IC_LEFT(ic),ic,FALSE); - aopOp (IC_RIGHT(ic),ic,FALSE); - aopOp (IC_RESULT(ic),ic,TRUE); - - DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),IC_RIGHT(ic),IC_RESULT(ic)); - - /* if literal, literal on the right or - if left requires ACC or right is already - in ACC */ - - if (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) { - operand *t = IC_RIGHT(ic); - IC_RIGHT(ic) = IC_LEFT(ic); - IC_LEFT(ic) = t; - } - - /* if both left & right are in bit space */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && - AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - genPlusBits (ic); - goto release ; - } - - /* if left in bit space & right literal */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && - AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) { - /* if result in bit space */ - if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){ - if((unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit) != 0L) { - emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0)); - if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); - } - } else { - size = pic14_getDataSize(IC_RESULT(ic)); - while (size--) { - MOVA(aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - pic14_emitcode("addc","a,#00 ;%d",__LINE__); - aopPut(AOP(IC_RESULT(ic)),"a",offset++); - } - } - goto release ; - } - - /* if I can do an increment instead - of add then GOOD for ME */ - if (genPlusIncr (ic) == TRUE) - goto release; - - size = pic14_getDataSize(IC_RESULT(ic)); - - if(AOP(IC_RIGHT(ic))->type == AOP_LIT) { - /* Add a literal to something else */ - //bool know_W=0; - unsigned lit = (unsigned) floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); - // unsigned l1=0; - - // offset = 0; - DEBUGpic14_emitcode(";","adding lit to something. size %d",size); - - genAddLit (ic, lit); - goto release; - - } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - - pic14_emitcode(";bitadd","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - pic14_emitcode(";bitadd","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode(";bitadd","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - /* here we are adding a bit to a char or int */ - if(size == 1) { - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_INCF , popGet(AOP(IC_RESULT(ic)),0)); - - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORLW , popGetLit(1)); - - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" xorlw","1"); - } else { - emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0)); - - pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - } - - if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { - - if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { - emitpcode(POC_ANDLW , popGetLit(1)); - emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); - emitSKPZ; - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); - } else { - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); - pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - } - } - - } else { - int offset = 1; - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitCLRZ; - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); - - pic14_emitcode("clrz",""); - - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } else { - - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0)); - //emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitMOVWF(IC_RIGHT(ic),0); - - pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } - - while(--size){ - emitSKPZ; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++)); - //pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE)); - } - - } - - } else { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - /* Add the first bytes */ - - if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { - emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } else { - - if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } else { - - emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0)); - - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0)); - else { - PIC_OPCODE poc = POC_ADDFW; - - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) - poc = POC_ADDLW; - emitpcode(poc, popGet(AOP(IC_LEFT(ic)),0)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } - } - } - - size = min( AOP_SIZE(IC_RESULT(ic)), AOP_SIZE(IC_RIGHT(ic))) - 1; - offset = 1; - - - if(size){ - if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { - while(size--){ - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPNC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } else { - while(size--){ - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); - emitSKPNC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } - } else { - PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) - poc = POC_MOVLW; - while(size--){ - if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(poc, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - } - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPNC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } - } - } - - if (AOP_SIZE(IC_RESULT(ic)) > AOP_SIZE(IC_RIGHT(ic))) { - int sign = !(SPEC_USIGN(getSpec(operandType(IC_LEFT(ic)))) | - SPEC_USIGN(getSpec(operandType(IC_RIGHT(ic)))) ); - - - /* Need to extend result to higher bytes */ - size = AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_RIGHT(ic)) - 1; - - /* First grab the carry from the lower bytes */ - if (AOP_SIZE(IC_LEFT(ic)) > AOP_SIZE(IC_RIGHT(ic))) { - int leftsize = AOP_SIZE(IC_LEFT(ic)) - AOP_SIZE(IC_RIGHT(ic)); - PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) - poc = POC_MOVLW; - while(leftsize-- > 0) { - emitpcode(poc, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - emitSKPNC; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - if (size) - size--; - else - break; - } - } else { - emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); - emitpcode(POC_RLF, popGet(AOP(IC_RESULT(ic)),offset)); - } - - - if(sign) { - /* Now this is really horrid. Gotta check the sign of the addends and propogate - * to the result */ - - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_LEFT(ic)),offset-1,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RIGHT(ic)),offset-1,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); - - /* if chars or ints or being signed extended to longs: */ - if(size) { - emitpcode(POC_MOVLW, popGetLit(0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE),7,0)); - emitpcode(POC_MOVLW, popGetLit(0xff)); - } - } - - offset++; - while(size--) { - - if(sign) - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - else - emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); - - offset++; - } - } - - - //adjustArithmeticResult(ic); - -release: - freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + int size, offset = 0; + + /* special cases :- */ + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + aopOp (IC_LEFT(ic),ic,FALSE); + aopOp (IC_RIGHT(ic),ic,FALSE); + aopOp (IC_RESULT(ic),ic,TRUE); + + DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),IC_RIGHT(ic),IC_RESULT(ic)); + + /* if literal, literal on the right or + if left requires ACC or right is already + in ACC */ + + if (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) { + operand *t = IC_RIGHT(ic); + IC_RIGHT(ic) = IC_LEFT(ic); + IC_LEFT(ic) = t; + } + + /* if both left & right are in bit space */ + if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && + AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { + genPlusBits (ic); + goto release ; + } + + /* if left in bit space & right literal */ + if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && + AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) { + /* if result in bit space */ + if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){ + if((unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit) != 0L) { + emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0)); + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0)); + } + } else { + size = pic14_getDataSize(IC_RESULT(ic)); + while (size--) { + MOVA(aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + pic14_emitcode("addc","a,#00 ;%d",__LINE__); + aopPut(AOP(IC_RESULT(ic)),"a",offset++); + } + } + goto release ; + } + + /* if I can do an increment instead + of add then GOOD for ME */ + if (genPlusIncr (ic) == TRUE) + goto release; + + size = pic14_getDataSize(IC_RESULT(ic)); + + if(AOP(IC_RIGHT(ic))->type == AOP_LIT) { + /* Add a literal to something else */ + //bool know_W=0; + unsigned lit = (unsigned) floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); + // unsigned l1=0; + + // offset = 0; + DEBUGpic14_emitcode(";","adding lit to something. size %d",size); + + genAddLit (ic, lit); + goto release; + + } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { + + pic14_emitcode(";bitadd","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + pic14_emitcode(";bitadd","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode(";bitadd","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + /* here we are adding a bit to a char or int */ + if(size == 1) { + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_INCF , popGet(AOP(IC_RESULT(ic)),0)); + + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORLW , popGetLit(1)); + + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" xorlw","1"); + } else { + emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0)); + + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + } + + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { + + if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { + emitpcode(POC_ANDLW , popGetLit(1)); + emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); + emitSKPZ; + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); + } else { + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); + pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + } + } + + } else { + int offset = 1; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitCLRZ; + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); + + pic14_emitcode("clrz",""); + + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + } else { + + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0)); + //emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitMOVWF(IC_RIGHT(ic),0); + + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + } + + while(--size){ + emitSKPZ; + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++)); + //pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE)); + } + + } + + } else { + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + /* Add the first bytes */ + + if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { + emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } else { + + if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } else { + + emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0)); + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0)); + else { + PIC_OPCODE poc = POC_ADDFW; + + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + poc = POC_ADDLW; + emitpcode(poc, popGet(AOP(IC_LEFT(ic)),0)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } + } + } + + size = min( AOP_SIZE(IC_RESULT(ic)), AOP_SIZE(IC_RIGHT(ic))) - 1; + offset = 1; + + + if(size){ + if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { + while(size--){ + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPNC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } else { + while(size--){ + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); + emitSKPNC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } + } else { + PIC_OPCODE poc = POC_MOVFW; + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + poc = POC_MOVLW; + while(size--){ + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(poc, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + } + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPNC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } + } + } + + if (AOP_SIZE(IC_RESULT(ic)) > AOP_SIZE(IC_RIGHT(ic))) { + int sign = !(SPEC_USIGN(getSpec(operandType(IC_LEFT(ic)))) | + SPEC_USIGN(getSpec(operandType(IC_RIGHT(ic)))) ); + + + /* Need to extend result to higher bytes */ + size = AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_RIGHT(ic)) - 1; + + /* First grab the carry from the lower bytes */ + if (AOP_SIZE(IC_LEFT(ic)) > AOP_SIZE(IC_RIGHT(ic))) { + int leftsize = AOP_SIZE(IC_LEFT(ic)) - AOP_SIZE(IC_RIGHT(ic)); + PIC_OPCODE poc = POC_MOVFW; + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + poc = POC_MOVLW; + while(leftsize-- > 0) { + emitpcode(poc, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + emitSKPNC; + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + if (size) + size--; + else + break; + } + } else { + emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); + emitpcode(POC_RLF, popGet(AOP(IC_RESULT(ic)),offset)); + } + + + if(sign) { + /* Now this is really horrid. Gotta check the sign of the addends and propogate + * to the result */ + + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_LEFT(ic)),offset-1,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RIGHT(ic)),offset-1,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); + + /* if chars or ints or being signed extended to longs: */ + if(size) { + emitpcode(POC_MOVLW, popGetLit(0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE),7,0)); + emitpcode(POC_MOVLW, popGetLit(0xff)); + } + } + + offset++; + while(size--) { + + if(sign) + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + else + emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); + + offset++; + } + } + + + //adjustArithmeticResult(ic); + + release: + freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ @@ -1096,104 +1152,104 @@ release: /*-----------------------------------------------------------------*/ bool genMinusDec (iCode *ic) { - unsigned int icount ; - unsigned int size = pic14_getDataSize(IC_RESULT(ic)); - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* will try to generate an increment */ - /* if the right side is not a literal - we cannot */ - if ((AOP_TYPE(IC_RIGHT(ic)) != AOP_LIT) || - (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) || - (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) ) - return FALSE ; - - DEBUGpic14_emitcode ("; lit val","%d",(unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)); - - /* if the literal value of the right hand side - is greater than 4 then it is not worth it */ - if ((icount = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)) > 2) - return FALSE ; - - /* if decrement 16 bits in register */ - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) && - (size > 1) && - (icount == 1)) { - - if(size == 2) { - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),LSB)); - emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB)); - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),MSB16)); - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),MSB16)); - - pic14_emitcode("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - pic14_emitcode("incfsz","%s,w",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - pic14_emitcode(" decf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); - } else { - /* size is 3 or 4 */ - emitpcode(POC_MOVLW, popGetLit(0xff)); - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),LSB)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB16)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB24)); - - pic14_emitcode("movlw","0xff"); - pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - - emitSKPNC; - pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); - emitSKPNC; - pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB24,FALSE,FALSE)); - - if(size > 3) { - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB32)); - - pic14_emitcode("skpnc",""); - emitSKPNC; - pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB32,FALSE,FALSE)); - } - - } - - return TRUE; - - } - - /* if the sizes are greater than 1 then we cannot */ - if (AOP_SIZE(IC_RESULT(ic)) > 1 || - AOP_SIZE(IC_LEFT(ic)) > 1 ) - return FALSE ; - - /* we can if the aops of the left & result match or - if they are in registers and the registers are the - same */ - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) { - - while (icount--) - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),0)); - - //pic14_emitcode ("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - return TRUE ; - } - - DEBUGpic14_emitcode ("; returning"," result=%s, left=%s", - aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE), - aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - if(size==1) { - - pic14_emitcode("decf","%s,w",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode("movwf","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); - - return TRUE; - } - - return FALSE ; + unsigned int icount ; + unsigned int size = pic14_getDataSize(IC_RESULT(ic)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* will try to generate an increment */ + /* if the right side is not a literal + we cannot */ + if ((AOP_TYPE(IC_RIGHT(ic)) != AOP_LIT) || + (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) || + (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) ) + return FALSE ; + + DEBUGpic14_emitcode ("; lit val","%d",(unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)); + + /* if the literal value of the right hand side + is greater than 4 then it is not worth it */ + if ((icount = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)) > 2) + return FALSE ; + + /* if decrement 16 bits in register */ + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) && + (size > 1) && + (icount == 1)) { + + if(size == 2) { + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),LSB)); + emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB)); + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),MSB16)); + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),MSB16)); + + pic14_emitcode("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); + pic14_emitcode("incfsz","%s,w",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); + pic14_emitcode(" decf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); + } else { + /* size is 3 or 4 */ + emitpcode(POC_MOVLW, popGetLit(0xff)); + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),LSB)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB16)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB24)); + + pic14_emitcode("movlw","0xff"); + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); + + emitSKPNC; + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); + emitSKPNC; + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB24,FALSE,FALSE)); + + if(size > 3) { + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB32)); + + pic14_emitcode("skpnc",""); + emitSKPNC; + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB32,FALSE,FALSE)); + } + + } + + return TRUE; + + } + + /* if the sizes are greater than 1 then we cannot */ + if (AOP_SIZE(IC_RESULT(ic)) > 1 || + AOP_SIZE(IC_LEFT(ic)) > 1 ) + return FALSE ; + + /* we can if the aops of the left & result match or + if they are in registers and the registers are the + same */ + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) { + + while (icount--) + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),0)); + + //pic14_emitcode ("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + return TRUE ; + } + + DEBUGpic14_emitcode ("; returning"," result=%s, left=%s", + aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE), + aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + if(size==1) { + + pic14_emitcode("decf","%s,w",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode("movwf","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); + + return TRUE; + } + + return FALSE ; } /*-----------------------------------------------------------------*/ @@ -1201,29 +1257,29 @@ bool genMinusDec (iCode *ic) /*-----------------------------------------------------------------*/ void addSign(operand *result, int offset, int sign) { - int size = (pic14_getDataSize(result) - offset); - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if(size > 0){ - if(sign && offset) { - - if(size == 1) { - emitpcode(POC_CLRF,popGet(AOP(result),offset)); - emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); - emitpcode(POC_DECF, popGet(AOP(result),offset)); - } else { - - emitpcode(POC_MOVLW, popGetLit(0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); - emitpcode(POC_MOVLW, popGetLit(0xff)); - while(size--) - emitpcode(POC_MOVWF, popGet(AOP(result),size)); - - } - } else - while(size--) - emitpcode(POC_CLRF,popGet(AOP(result),offset++)); - } + int size = (pic14_getDataSize(result) - offset); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + + if(size > 0){ + if(sign && offset) { + + if(size == 1) { + emitpcode(POC_CLRF,popGet(AOP(result),offset)); + emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); + emitpcode(POC_DECF, popGet(AOP(result),offset)); + } else { + + emitpcode(POC_MOVLW, popGetLit(0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); + emitpcode(POC_MOVLW, popGetLit(0xff)); + while(size--) + emitpcode(POC_MOVWF, popGet(AOP(result),size)); + + } + } else + while(size--) + emitpcode(POC_CLRF,popGet(AOP(result),offset++)); + } } /*-----------------------------------------------------------------*/ @@ -1231,24 +1287,24 @@ void addSign(operand *result, int offset, int sign) /*-----------------------------------------------------------------*/ void genMinusBits (iCode *ic) { - symbol *lbl = newiTempLabel(NULL); - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){ - pic14_emitcode("mov","c,%s",AOP(IC_LEFT(ic))->aopu.aop_dir); - pic14_emitcode("jnb","%s,%05d_DS_",AOP(IC_RIGHT(ic))->aopu.aop_dir,(lbl->key+100)); - pic14_emitcode("cpl","c"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - pic14_outBitC(IC_RESULT(ic)); - } - else{ - pic14_emitcode("mov","c,%s",AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode("subb","a,acc"); - pic14_emitcode("jnb","%s,%05d_DS_",AOP(IC_LEFT(ic))->aopu.aop_dir,(lbl->key+100)); - pic14_emitcode("inc","a"); - pic14_emitcode("","%05d_DS_:",(lbl->key+100)); - aopPut(AOP(IC_RESULT(ic)),"a",0); - addSign(IC_RESULT(ic), MSB16, SPEC_USIGN(getSpec(operandType(IC_RESULT(ic))))); - } + symbol *lbl = newiTempLabel(NULL); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){ + pic14_emitcode("mov","c,%s",AOP(IC_LEFT(ic))->aopu.aop_dir); + pic14_emitcode("jnb","%s,%05d_DS_",AOP(IC_RIGHT(ic))->aopu.aop_dir,(lbl->key+100)); + pic14_emitcode("cpl","c"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_outBitC(IC_RESULT(ic)); + } + else{ + pic14_emitcode("mov","c,%s",AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode("subb","a,acc"); + pic14_emitcode("jnb","%s,%05d_DS_",AOP(IC_LEFT(ic))->aopu.aop_dir,(lbl->key+100)); + pic14_emitcode("inc","a"); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + aopPut(AOP(IC_RESULT(ic)),"a",0); + addSign(IC_RESULT(ic), MSB16, SPEC_USIGN(getSpec(operandType(IC_RESULT(ic))))); + } } /*-----------------------------------------------------------------*/ @@ -1256,347 +1312,347 @@ void genMinusBits (iCode *ic) /*-----------------------------------------------------------------*/ void genMinus (iCode *ic) { - int size, offset = 0, same=0; - unsigned long lit = 0L; - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - aopOp (IC_LEFT(ic),ic,FALSE); - aopOp (IC_RIGHT(ic),ic,FALSE); - aopOp (IC_RESULT(ic),ic,TRUE); - - if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && - AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) { - operand *t = IC_RIGHT(ic); - IC_RIGHT(ic) = IC_LEFT(ic); - IC_LEFT(ic) = t; - } - - DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", - AopType(AOP_TYPE(IC_RESULT(ic))), - AopType(AOP_TYPE(IC_LEFT(ic))), - AopType(AOP_TYPE(IC_RIGHT(ic)))); - - /* special cases :- */ - /* if both left & right are in bit space */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && - AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - genPlusBits (ic); - goto release ; - } - - /* if I can do an decrement instead - of subtract then GOOD for ME */ - // if (genMinusDec (ic) == TRUE) - // goto release; - - size = pic14_getDataSize(IC_RESULT(ic)); - same = pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))); - - if(AOP(IC_RIGHT(ic))->type == AOP_LIT) { - /* Add a literal to something else */ - - lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); - lit = - (long)lit; - - genAddLit ( ic, lit); - + int size, offset = 0, same=0; + unsigned long lit = 0L; + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + aopOp (IC_LEFT(ic),ic,FALSE); + aopOp (IC_RIGHT(ic),ic,FALSE); + aopOp (IC_RESULT(ic),ic,TRUE); + + if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && + AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) { + operand *t = IC_RIGHT(ic); + IC_RIGHT(ic) = IC_LEFT(ic); + IC_LEFT(ic) = t; + } + + DEBUGpic14_emitcode ("; ","result %s, left %s, right %s", + AopType(AOP_TYPE(IC_RESULT(ic))), + AopType(AOP_TYPE(IC_LEFT(ic))), + AopType(AOP_TYPE(IC_RIGHT(ic)))); + + /* special cases :- */ + /* if both left & right are in bit space */ + if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY && + AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { + genPlusBits (ic); + goto release ; + } + + /* if I can do an decrement instead + of subtract then GOOD for ME */ + // if (genMinusDec (ic) == TRUE) + // goto release; + + size = pic14_getDataSize(IC_RESULT(ic)); + same = pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))); + + if(AOP(IC_RIGHT(ic))->type == AOP_LIT) { + /* Add a literal to something else */ + + lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); + lit = - (long)lit; + + genAddLit ( ic, lit); + #if 0 - /* add the first byte: */ - pic14_emitcode("movlw","0x%x", lit & 0xff); - pic14_emitcode("addwf","%s,f", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0)); - - - offset = 1; - size--; - - while(size-- > 0) { - - lit >>= 8; - - if(lit & 0xff) { - - if((lit & 0xff) == 0xff) { - emitpcode(POC_MOVLW, popGetLit(0xff)); - emitSKPC; - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); - } else { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitSKPNC; - emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); - } - - } else { - /* do the rlf known zero trick here */ - emitpcode(POC_MOVLW, popGetLit(1)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); - } - offset++; - } + /* add the first byte: */ + pic14_emitcode("movlw","0x%x", lit & 0xff); + pic14_emitcode("addwf","%s,f", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0)); + + + offset = 1; + size--; + + while(size-- > 0) { + + lit >>= 8; + + if(lit & 0xff) { + + if((lit & 0xff) == 0xff) { + emitpcode(POC_MOVLW, popGetLit(0xff)); + emitSKPC; + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); + } else { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitSKPNC; + emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); + } + + } else { + /* do the rlf known zero trick here */ + emitpcode(POC_MOVLW, popGetLit(1)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset)); + } + offset++; + } #endif - } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - // bit subtraction - - pic14_emitcode(";bitsub","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - pic14_emitcode(";bitsub","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - pic14_emitcode(";bitsub","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - /* here we are subtracting a bit from a char or int */ - if(size == 1) { - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_DECF , popGet(AOP(IC_RESULT(ic)),0)); - - pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORLW , popGetLit(1)); - }else if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || - (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { - - lit = (unsigned long)floatFromVal(AOP(IC_LEFT(ic))->aopu.aop_lit); - - if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { - if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) { - if(lit & 1) { - emitpcode(POC_MOVLW , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0)); - } - }else{ - emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); - if(lit & 1) - emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0)); - else - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); - } - goto release; - } else { - emitpcode(POC_MOVLW , popGetLit(lit & 0xff)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_MOVLW , popGetLit((lit-1) & 0xff)); - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); - - } - - } else { - emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0)); - } - - if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { - - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); - - } else { - emitpcode(POC_ANDLW , popGetLit(1)); - /* - emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitSKPZ; - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - */ - } - - } - - } - } else if(// (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || - (AOP(IC_LEFT(ic))->type == AOP_LIT) && - (AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC)) { - - lit = (unsigned long)floatFromVal(AOP(IC_LEFT(ic))->aopu.aop_lit); - DEBUGpic14_emitcode ("; left is lit","line %d result %s, left %s, right %s",__LINE__, - AopType(AOP_TYPE(IC_RESULT(ic))), - AopType(AOP_TYPE(IC_LEFT(ic))), - AopType(AOP_TYPE(IC_RIGHT(ic)))); - - - if( (size == 1) && ((lit & 0xff) == 0) ) { - /* res = 0 - right */ - if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(POC_COMF, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_INCF, popGet(AOP(IC_RIGHT(ic)),0)); - } else { - emitpcode(POC_COMFW, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); - } - goto release; - } - - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_SUBLW, popGetLit(lit & 0xff)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - - - offset = 1; - while(--size) { - lit >>= 8; - - if(size == 1) { - /* This is the last byte in a multibyte subtraction - * There are a couple of tricks we can do by not worrying about - * propogating the carry */ - if(lit == 0xff) { - /* 0xff - x == ~x */ - if(same) { - emitpcode(POC_COMF, popGet(AOP(IC_RESULT(ic)),offset)); - emitSKPC; - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); - } else { - emitpcode(POC_COMFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - emitSKPC; - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); - } - } else { - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPC; - emitpcode(POC_INCFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_SUBLW, popGetLit(lit & 0xff)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - } - - goto release; - } - - if(same) { - - if(lit & 0xff) { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitSKPC; - emitpcode(POC_MOVLW, popGetLit((lit & 0xff)-1)); - emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); - } else { - emitSKPNC; - emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); - - } - } else { - - if(lit & 0xff) { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - } else - emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); - - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPC; - emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); - } - } - - - } else { - - DEBUGpic14_emitcode ("; ","line %d result %s, left %s, right %s",__LINE__, - AopType(AOP_TYPE(IC_RESULT(ic))), - AopType(AOP_TYPE(IC_LEFT(ic))), - AopType(AOP_TYPE(IC_RIGHT(ic)))); - - if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_SUBLW, popGetLit(0)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } else { - - if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0)); - emitpcode(POC_SUBLW, popGetLit(0)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } else { - - DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC) - emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0)); - - if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0)); - else { - if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || - (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { - emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),0)); - } else { - emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0)); - } - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { - if ( AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { - emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); - emitSKPZ; - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); - }else - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); - } - } - } - } - - size = min( AOP_SIZE(IC_RESULT(ic)), AOP_SIZE(IC_RIGHT(ic))) - 1; - offset = 1; - - if(size){ - if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { - while(size--){ - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } else { - while(size--){ - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } - } else { - PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) - poc = POC_MOVLW; - while(size--){ - if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); - } - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitSKPC; - emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); - offset++; - } - } - } - } - - // adjustArithmeticResult(ic); - + } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { + // bit subtraction + + pic14_emitcode(";bitsub","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + pic14_emitcode(";bitsub","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + pic14_emitcode(";bitsub","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + /* here we are subtracting a bit from a char or int */ + if(size == 1) { + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_DECF , popGet(AOP(IC_RESULT(ic)),0)); + + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", + AOP(IC_RIGHT(ic))->aopu.aop_dir, + AOP(IC_RIGHT(ic))->aopu.aop_dir); + pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORLW , popGetLit(1)); + }else if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || + (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { + + lit = (unsigned long)floatFromVal(AOP(IC_LEFT(ic))->aopu.aop_lit); + + if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { + if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) { + if(lit & 1) { + emitpcode(POC_MOVLW , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0)); + } + }else{ + emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); + if(lit & 1) + emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0)); + else + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); + } + goto release; + } else { + emitpcode(POC_MOVLW , popGetLit(lit & 0xff)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_MOVLW , popGetLit((lit-1) & 0xff)); + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); + + } + + } else { + emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0)); + } + + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { + + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0)); + + } else { + emitpcode(POC_ANDLW , popGetLit(1)); + /* + emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + emitSKPZ; + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + */ + } + + } + + } + } else if(// (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || + (AOP(IC_LEFT(ic))->type == AOP_LIT) && + (AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC)) { + + lit = (unsigned long)floatFromVal(AOP(IC_LEFT(ic))->aopu.aop_lit); + DEBUGpic14_emitcode ("; left is lit","line %d result %s, left %s, right %s",__LINE__, + AopType(AOP_TYPE(IC_RESULT(ic))), + AopType(AOP_TYPE(IC_LEFT(ic))), + AopType(AOP_TYPE(IC_RIGHT(ic)))); + + + if( (size == 1) && ((lit & 0xff) == 0) ) { + /* res = 0 - right */ + if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(POC_COMF, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_INCF, popGet(AOP(IC_RIGHT(ic)),0)); + } else { + emitpcode(POC_COMFW, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0)); + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0)); + } + goto release; + } + + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_SUBLW, popGetLit(lit & 0xff)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + + + offset = 1; + while(--size) { + lit >>= 8; + + if(size == 1) { + /* This is the last byte in a multibyte subtraction + * There are a couple of tricks we can do by not worrying about + * propogating the carry */ + if(lit == 0xff) { + /* 0xff - x == ~x */ + if(same) { + emitpcode(POC_COMF, popGet(AOP(IC_RESULT(ic)),offset)); + emitSKPC; + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); + } else { + emitpcode(POC_COMFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + emitSKPC; + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),offset)); + } + } else { + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPC; + emitpcode(POC_INCFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_SUBLW, popGetLit(lit & 0xff)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + } + + goto release; + } + + if(same) { + + if(lit & 0xff) { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitSKPC; + emitpcode(POC_MOVLW, popGetLit((lit & 0xff)-1)); + emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); + } else { + emitSKPNC; + emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); + + } + } else { + + if(lit & 0xff) { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + } else + emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset)); + + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPC; + emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); + } + } + + + } else { + + DEBUGpic14_emitcode ("; ","line %d result %s, left %s, right %s",__LINE__, + AopType(AOP_TYPE(IC_RESULT(ic))), + AopType(AOP_TYPE(IC_LEFT(ic))), + AopType(AOP_TYPE(IC_RIGHT(ic)))); + + if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_SUBLW, popGetLit(0)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } else { + + if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0)); + emitpcode(POC_SUBLW, popGetLit(0)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } else { + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC) + emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0)); + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0)); + else { + if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || + (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { + emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),0)); + } else { + emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0)); + } + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { + if ( AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) { + emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0)); + emitSKPZ; + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0)); + }else + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); + } + } + } + } + + size = min( AOP_SIZE(IC_RESULT(ic)), AOP_SIZE(IC_RIGHT(ic))) - 1; + offset = 1; + + if(size){ + if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { + while(size--){ + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } else { + while(size--){ + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } + } else { + PIC_OPCODE poc = POC_MOVFW; + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || + (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + poc = POC_MOVLW; + while(size--){ + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + } + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); + emitSKPC; + emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset)); + emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset)); + offset++; + } + } + } + } + + // adjustArithmeticResult(ic); + release: - freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); - freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); + freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); + freeAsmop(IC_RESULT(ic),NULL,ic,TRUE); } /*-----------------------------------------------------------------* * genUMult8XLit_16 - unsigned multiplication of two 8-bit numbers. @@ -1604,190 +1660,190 @@ release: * *-----------------------------------------------------------------*/ void genUMult8XLit_16 (operand *left, - operand *right, - operand *result, - pCodeOpReg *result_hi) - + operand *right, + operand *result, + pCodeOpReg *result_hi) + { - - unsigned int lit; - unsigned int i,have_first_bit; - int same; - pCodeOp *temp; - - if (AOP_TYPE(right) != AOP_LIT){ - fprintf(stderr,"%s %d - right operand is not a literal\n",__FILE__,__LINE__); - exit(1); - } - - - if(!result_hi) { - result_hi = PCOR(popGet(AOP(result),1)); - } - - lit = (unsigned int)floatFromVal(AOP(right)->aopu.aop_lit); - lit &= 0xff; - pic14_emitcode(";","Unrolled 8 X 8 multiplication"); - - same = pic14_sameRegs(AOP(left), AOP(result)); - - if(same) { - switch(lit) { - case 0: - emitpcode(POC_CLRF, popGet(AOP(left),0)); - return; - case 2: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 3: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 4: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 5: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F - return; - case 6: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 7: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 7*F - return; - case 8: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 8*F - return; - case 9: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 10: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 11: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 8*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 11*F - return; - case 12: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 13: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 8*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 13*F - return; - case 14: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 8*F - emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 11*F - emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 14*F - return; - case 15: - temp = popGetTempReg(); - if(!temp) { - fprintf(stderr,"ERROR: unable to allocate register. %s:%d\n",__FUNCTION__,__LINE__); - exit(1); - } - emitpcode(POC_SWAPFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, temp); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_MOVWF, popGet(AOP(left),0)); - emitpcode(POC_SWAPFW, temp); - emitpcode(POC_SUBWF, popGet(AOP(left),0)); - popReleaseTempReg(temp); - return; - case 16: - emitpcode(POC_SWAPFW, popGet(AOP(left),0)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_MOVWF, popGet(AOP(left),0)); - return; - case 17: - emitpcode(POC_SWAPFW, popGet(AOP(left),0)); - emitpcode(POC_ANDLW, popGetLit(0xf0)); - emitpcode(POC_ADDWF, popGet(AOP(left),0)); - return; - case 32: - emitpcode(POC_SWAPF, popGet(AOP(left),0)); - emitpcode(POC_RLFW, popGet(AOP(left),0)); - emitpcode(POC_ANDLW, popGetLit(0xe0)); - emitpcode(POC_MOVWF, popGet(AOP(left),0)); - return; - case 64: - emitpcode(POC_SWAPF, popGet(AOP(left),0)); - emitpcode(POC_RLF, popGet(AOP(left),0)); - emitpcode(POC_RLFW, popGet(AOP(left),0)); - emitpcode(POC_ANDLW, popGetLit(0xc0)); - emitpcode(POC_MOVWF, popGet(AOP(left),0)); - return; - case 128: - emitpcode(POC_RRFW, popGet(AOP(left),0)); - emitpcode(POC_CLRF, popGet(AOP(left),0)); - emitpcode(POC_RRF, popGet(AOP(left),0)); - return; - - } + + unsigned int lit; + unsigned int i,have_first_bit; + int same; + pCodeOp *temp; + + if (AOP_TYPE(right) != AOP_LIT){ + fprintf(stderr,"%s %d - right operand is not a literal\n",__FILE__,__LINE__); + exit(1); + } + + + if(!result_hi) { + result_hi = PCOR(popGet(AOP(result),1)); + } + + lit = (unsigned int)floatFromVal(AOP(right)->aopu.aop_lit); + lit &= 0xff; + pic14_emitcode(";","Unrolled 8 X 8 multiplication"); + + same = pic14_sameRegs(AOP(left), AOP(result)); + + if(same) { + switch(lit) { + case 0: + emitpcode(POC_CLRF, popGet(AOP(left),0)); + return; + case 2: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 3: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 4: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 5: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F + return; + case 6: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 7: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 7*F + return; + case 8: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 8*F + return; + case 9: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 10: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 5*F + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 11: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 8*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 11*F + return; + case 12: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 13: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 8*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 13*F + return; + case 14: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 2*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 3*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 5*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 8*F + emitpcode(POC_ADDFW, popGet(AOP(left),0)); // W = 11*F + emitpcode(POC_ADDWF, popGet(AOP(left),0)); // F = 14*F + return; + case 15: + temp = popGetTempReg(); + if(!temp) { + fprintf(stderr,"ERROR: unable to allocate register. %s:%d\n",__FUNCTION__,__LINE__); + exit(1); + } + emitpcode(POC_SWAPFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, temp); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_MOVWF, popGet(AOP(left),0)); + emitpcode(POC_SWAPFW, temp); + emitpcode(POC_SUBWF, popGet(AOP(left),0)); + popReleaseTempReg(temp); + return; + case 16: + emitpcode(POC_SWAPFW, popGet(AOP(left),0)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_MOVWF, popGet(AOP(left),0)); + return; + case 17: + emitpcode(POC_SWAPFW, popGet(AOP(left),0)); + emitpcode(POC_ANDLW, popGetLit(0xf0)); + emitpcode(POC_ADDWF, popGet(AOP(left),0)); + return; + case 32: + emitpcode(POC_SWAPF, popGet(AOP(left),0)); + emitpcode(POC_RLFW, popGet(AOP(left),0)); + emitpcode(POC_ANDLW, popGetLit(0xe0)); + emitpcode(POC_MOVWF, popGet(AOP(left),0)); + return; + case 64: + emitpcode(POC_SWAPF, popGet(AOP(left),0)); + emitpcode(POC_RLF, popGet(AOP(left),0)); + emitpcode(POC_RLFW, popGet(AOP(left),0)); + emitpcode(POC_ANDLW, popGetLit(0xc0)); + emitpcode(POC_MOVWF, popGet(AOP(left),0)); + return; + case 128: + emitpcode(POC_RRFW, popGet(AOP(left),0)); + emitpcode(POC_CLRF, popGet(AOP(left),0)); + emitpcode(POC_RRF, popGet(AOP(left),0)); + return; + + } } else { - - switch(lit) { - case 0: - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_CLRF, popCopyReg(result_hi)); - return; - case 2: - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - emitpcode(POC_ADDWF, popGet(AOP(result),0)); - emitpcode(POC_CLRF, popCopyReg(result_hi)); - emitpcode(POC_RLF, popCopyReg(result_hi)); - return; - } - + + switch(lit) { + case 0: + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_CLRF, popCopyReg(result_hi)); + return; + case 2: + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + emitpcode(POC_ADDWF, popGet(AOP(result),0)); + emitpcode(POC_CLRF, popCopyReg(result_hi)); + emitpcode(POC_RLF, popCopyReg(result_hi)); + return; + } + } emitpcode(POC_MOVFW, popGet(AOP(left),0)); @@ -1796,18 +1852,18 @@ void genUMult8XLit_16 (operand *left, have_first_bit = 0; for(i=0; i<8; i++) { - - if(lit & 1) { - emitpcode(POC_ADDWF, popCopyReg(result_hi)); - have_first_bit = 1; - } - - if(have_first_bit) { - emitpcode(POC_RRF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popGet(AOP(result),0)); - } - - lit >>= 1; + + if(lit & 1) { + emitpcode(POC_ADDWF, popCopyReg(result_hi)); + have_first_bit = 1; + } + + if(have_first_bit) { + emitpcode(POC_RRF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popGet(AOP(result),0)); + } + + lit >>= 1; } } @@ -1818,94 +1874,94 @@ void genUMult8XLit_16 (operand *left, * *-----------------------------------------------------------------*/ void genUMult8X8_16 (operand *left, - operand *right, - operand *result, - pCodeOpReg *result_hi) - + operand *right, + operand *result, + pCodeOpReg *result_hi) + { - - int i; - int looped = 1; - - if(!result_hi) { - result_hi = PCOR(popGet(AOP(result),1)); - } - - if (AOP_TYPE(right) == AOP_LIT) { - genUMult8XLit_16(left,right,result,result_hi); - return; - } - - if(!looped) { - pic14_emitcode(";","Unrolled 8 X 8 multiplication"); - - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_CLRF, popCopyReg(result_hi)); - emitCLRC; - - for(i=0; i<8; i++) { - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),i,0)); - emitpcode(POC_ADDWF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popGet(AOP(result),0)); - } - - - /* - Here's another version that does the same thing and takes the - same number of instructions. The one above is slightly better - because the entry instructions have a higher probability of - being optimized out. - */ - /* - emitpcode(POC_CLRF, popCopyReg(result_hi)); - emitpcode(POC_RRFW, popGet(AOP(left),0)); - emitpcode(POC_MOVWF, popGet(AOP(result),0)); - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - - for(i=0; i<8; i++) { - emitSKPNC; - emitpcode(POC_ADDWF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popGet(AOP(result),0)); - } - */ - - } else { - symbol *tlbl = newiTempLabel(NULL); - pCodeOp *temp; - - - pic14_emitcode(";","Looped 8 X 8 multiplication"); - - emitpcode(POC_CLRF, popGet(AOP(result),0)); - emitpcode(POC_CLRF, popCopyReg(result_hi)); - - emitpcode(POC_BSF, newpCodeOpBit(aopGet(AOP(result),0,FALSE,FALSE),7,0)); - - emitpcode(POC_MOVFW, popGet(AOP(right),0)); - - temp = popGetTempReg(); - emitpcode(POC_MOVWF, popCopyReg(PCOR(temp))); - - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - - emitpLabel(tlbl->key); - - emitpcode(POC_RRF, popCopyReg(PCOR(temp))); - emitSKPNC; - emitpcode(POC_ADDWF, popCopyReg(result_hi)); - - emitpcode(POC_RRF, popCopyReg(result_hi)); - emitpcode(POC_RRF, popGet(AOP(result),0)); - - emitSKPC; - emitpcode(POC_GOTO, popGetLabel(tlbl->key)); - - popReleaseTempReg(temp); - - } + + int i; + int looped = 1; + + if(!result_hi) { + result_hi = PCOR(popGet(AOP(result),1)); + } + + if (AOP_TYPE(right) == AOP_LIT) { + genUMult8XLit_16(left,right,result,result_hi); + return; + } + + if(!looped) { + pic14_emitcode(";","Unrolled 8 X 8 multiplication"); + + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_CLRF, popCopyReg(result_hi)); + emitCLRC; + + for(i=0; i<8; i++) { + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),i,0)); + emitpcode(POC_ADDWF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popGet(AOP(result),0)); + } + + + /* + Here's another version that does the same thing and takes the + same number of instructions. The one above is slightly better + because the entry instructions have a higher probability of + being optimized out. + */ + /* + emitpcode(POC_CLRF, popCopyReg(result_hi)); + emitpcode(POC_RRFW, popGet(AOP(left),0)); + emitpcode(POC_MOVWF, popGet(AOP(result),0)); + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + + for(i=0; i<8; i++) { + emitSKPNC; + emitpcode(POC_ADDWF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popGet(AOP(result),0)); + } + */ + + } else { + symbol *tlbl = newiTempLabel(NULL); + pCodeOp *temp; + + + pic14_emitcode(";","Looped 8 X 8 multiplication"); + + emitpcode(POC_CLRF, popGet(AOP(result),0)); + emitpcode(POC_CLRF, popCopyReg(result_hi)); + + emitpcode(POC_BSF, newpCodeOpBit(aopGet(AOP(result),0,FALSE,FALSE),7,0)); + + emitpcode(POC_MOVFW, popGet(AOP(right),0)); + + temp = popGetTempReg(); + emitpcode(POC_MOVWF, popCopyReg(PCOR(temp))); + + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + + emitpLabel(tlbl->key); + + emitpcode(POC_RRF, popCopyReg(PCOR(temp))); + emitSKPNC; + emitpcode(POC_ADDWF, popCopyReg(result_hi)); + + emitpcode(POC_RRF, popCopyReg(result_hi)); + emitpcode(POC_RRF, popGet(AOP(result),0)); + + emitSKPC; + emitpcode(POC_GOTO, popGetLabel(tlbl->key)); + + popReleaseTempReg(temp); + + } } /*-----------------------------------------------------------------* @@ -1915,23 +1971,23 @@ void genUMult8X8_16 (operand *left, * post-fix the sign bit. *-----------------------------------------------------------------*/ void genSMult8X8_16 (operand *left, - operand *right, - operand *result, - pCodeOpReg *result_hi) + operand *right, + operand *result, + pCodeOpReg *result_hi) { - - if(!result_hi) { - result_hi = PCOR(popGet(AOP(result),1)); - } - - genUMult8X8_16(left,right,result,result_hi); - - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),7,0)); - emitpcode(POC_SUBWF, popCopyReg(result_hi)); - emitpcode(POC_MOVFW, popGet(AOP(left),0)); - emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0)); - emitpcode(POC_SUBWF, popGet(AOP(result),1)); - + + if(!result_hi) { + result_hi = PCOR(popGet(AOP(result),1)); + } + + genUMult8X8_16(left,right,result,result_hi); + + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),7,0)); + emitpcode(POC_SUBWF, popCopyReg(result_hi)); + emitpcode(POC_MOVFW, popGet(AOP(left),0)); + emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0)); + emitpcode(POC_SUBWF, popGet(AOP(result),1)); + } /*-----------------------------------------------------------------* @@ -1942,17 +1998,17 @@ void genSMult8X8_16 (operand *left, * *-----------------------------------------------------------------*/ void genMult8X8_8 (operand *left, - operand *right, - operand *result) + operand *right, + operand *result) { - pCodeOp *result_hi = popGetTempReg(); - - if (AOP_TYPE(right) == AOP_LIT) - genUMult8XLit_16(left,right,result,PCOR(result_hi)); - else - genUMult8X8_16(left,right,result,PCOR(result_hi)); - - popReleaseTempReg(result_hi); + pCodeOp *result_hi = popGetTempReg(); + + if (AOP_TYPE(right) == AOP_LIT) + genUMult8XLit_16(left,right,result,PCOR(result_hi)); + else + genUMult8X8_16(left,right,result,PCOR(result_hi)); + + popReleaseTempReg(result_hi); } #if 0 /*-----------------------------------------------------------------*/ @@ -1960,45 +2016,45 @@ void genMult8X8_8 (operand *left, /*-----------------------------------------------------------------*/ void genMultConst(unsigned C) { - - unsigned lit; - unsigned sr3; // Shift right 3 - unsigned mask; - - int size = 1; - - /* - Convert a string of 3 binary 1's in the lit into - 0111 = 1000 - 1; - */ - - mask = 7 << ( (size*8) - 3); - lit = C; - sr3 = 0; - - while(mask < (1<>= 1; - - } - + + unsigned lit; + unsigned sr3; // Shift right 3 + unsigned mask; + + int size = 1; + + /* + Convert a string of 3 binary 1's in the lit into + 0111 = 1000 - 1; + */ + + mask = 7 << ( (size*8) - 3); + lit = C; + sr3 = 0; + + while(mask < (1<>= 1; + + } + } #endif diff --git a/src/pic/pcode.c b/src/pic/pcode.c index 74715026..d22307a5 100644 --- a/src/pic/pcode.c +++ b/src/pic/pcode.c @@ -43,12 +43,12 @@ static void FixRegisterBanking(pBlock *pb,int cur_bank); /****************************************************************/ peepCommand peepCommands[] = { - - {NOTBITSKIP, "_NOTBITSKIP_"}, - {BITSKIP, "_BITSKIP_"}, - {INVERTBITSKIP, "_INVERTBITSKIP_"}, - - {-1, NULL} + + {NOTBITSKIP, "_NOTBITSKIP_"}, + {BITSKIP, "_BITSKIP_"}, + {INVERTBITSKIP, "_INVERTBITSKIP_"}, + + {-1, NULL} }; @@ -75,9 +75,9 @@ static pFile *the_pFile = NULL; static pBlock *pb_dead_pcodes = NULL; /* Hardcoded flags to change the behavior of the PIC port */ -static int peepOptimizing = 1; /* run the peephole optimizer if nonzero */ +static int peepOptimizing = 0; /* run the peephole optimizer if nonzero */ static int functionInlining = 1; /* inline functions if nonzero */ -int debug_verbose = 0; /* Set true to inundate .asm file */ +int debug_verbose = 1; /* Set true to inundate .asm file */ // static int GpCodeSequenceNumber = 1; int GpcFlowSeq = 1; @@ -90,6 +90,7 @@ extern void RegsUnMapLiveRanges(void); extern void BuildFlowTree(pBlock *pb); extern void pCodeRegOptimizeRegUsage(int level); extern int picIsInitialized(void); +extern const char *pCodeOpType(pCodeOp *pcop); /****************************************************************/ /* Forward declarations */ @@ -124,1124 +125,1124 @@ void pCodeRegMapLiveRanges(pBlock *pb); /****************************************************************/ pCodeInstruction pciADDWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ADDWF, - "ADDWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ADDWF, + "ADDWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z) // outCond }; pCodeInstruction pciADDFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ADDFW, - "ADDWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ADDFW, + "ADDWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciADDLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ADDLW, - "ADDLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_W | PCC_LITERAL), // inCond - (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ADDLW, + "ADDLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_W | PCC_LITERAL), // inCond + (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciANDLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ANDLW, - "ANDLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_W | PCC_LITERAL), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ANDLW, + "ANDLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_W | PCC_LITERAL), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciANDWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ANDWF, - "ANDWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ANDWF, + "ANDWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z) // outCond }; pCodeInstruction pciANDFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_ANDFW, - "ANDWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_ANDFW, + "ANDWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciBCF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_BCF, - "BCF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,1, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_BSF, - (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_BCF, + "BCF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,1, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_BSF, + (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciBSF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_BSF, - "BSF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,1, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_BCF, - (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond - (PCC_REGISTER | PCC_EXAMINE_PCOP) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_BSF, + "BSF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,1, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_BCF, + (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond + (PCC_REGISTER | PCC_EXAMINE_PCOP) // outCond }; pCodeInstruction pciBTFSC = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_BTFSC, - "BTFSC", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,1, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_BTFSS, - (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond - PCC_EXAMINE_PCOP // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_BTFSC, + "BTFSC", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,1, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_BTFSS, + (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond + PCC_EXAMINE_PCOP // outCond }; pCodeInstruction pciBTFSS = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_BTFSS, - "BTFSS", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,1, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_BTFSC, - (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond - PCC_EXAMINE_PCOP // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_BTFSS, + "BTFSS", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,1, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_BTFSC, + (PCC_REGISTER | PCC_EXAMINE_PCOP), // inCond + PCC_EXAMINE_PCOP // outCond }; pCodeInstruction pciCALL = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_CALL, - "CALL", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 1,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_CALL, + "CALL", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 1,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond }; pCodeInstruction pciCOMF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_COMF, - "COMF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_COMF, + "COMF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciCOMFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_COMFW, - "COMF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_COMFW, + "COMF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_W // outCond }; pCodeInstruction pciCLRF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_CLRF, - "CLRF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_CLRF, + "CLRF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciCLRW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_CLRW, - "CLRW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 0, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_CLRW, + "CLRW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_W // outCond }; pCodeInstruction pciCLRWDT = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_CLRWDT, - "CLRWDT", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 0, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_CLRWDT, + "CLRWDT", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond }; pCodeInstruction pciDECF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_DECF, - "DECF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_DECF, + "DECF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciDECFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_DECFW, - "DECF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_DECFW, + "DECF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_W // outCond }; pCodeInstruction pciDECFSZ = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_DECFSZ, - "DECFSZ", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_DECFSZ, + "DECFSZ", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciDECFSZW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_DECFSZW, - "DECFSZ", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_DECFSZW, + "DECFSZ", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_W // outCond }; pCodeInstruction pciGOTO = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeGOTO, - genericDestruct, - genericPrint}, - POC_GOTO, - "GOTO", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 1,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeGOTO, + genericDestruct, + genericPrint}, + POC_GOTO, + "GOTO", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 1,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond }; pCodeInstruction pciINCF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_INCF, - "INCF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_INCF, + "INCF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciINCFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_INCFW, - "INCF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_INCFW, + "INCF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_W // outCond }; pCodeInstruction pciINCFSZ = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_INCFSZ, - "INCFSZ", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_INCFSZ, + "INCFSZ", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciINCFSZW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeSKIP, - genericDestruct, - genericPrint}, - POC_INCFSZW, - "INCFSZ", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 1,1, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeSKIP, + genericDestruct, + genericPrint}, + POC_INCFSZW, + "INCFSZ", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 1,1, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_W // outCond }; pCodeInstruction pciIORWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_IORWF, - "IORWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_IORWF, + "IORWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z) // outCond }; pCodeInstruction pciIORFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_IORFW, - "IORWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_IORFW, + "IORWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciIORLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_IORLW, - "IORLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_W | PCC_LITERAL), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_IORLW, + "IORLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_W | PCC_LITERAL), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciMOVF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_MOVF, - "MOVF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - PCC_Z // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_MOVF, + "MOVF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + PCC_Z // outCond }; pCodeInstruction pciMOVFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_MOVFW, - "MOVF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_REGISTER, // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_MOVFW, + "MOVF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_REGISTER, // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciMOVWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_MOVWF, - "MOVWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_W, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_MOVWF, + "MOVWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_W, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciMOVLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - genericDestruct, - genericPrint}, - POC_MOVLW, - "MOVLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_NONE | PCC_LITERAL), // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + genericDestruct, + genericPrint}, + POC_MOVLW, + "MOVLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_NONE | PCC_LITERAL), // inCond + PCC_W // outCond }; pCodeInstruction pciNOP = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - genericDestruct, - genericPrint}, - POC_NOP, - "NOP", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 0, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + genericDestruct, + genericPrint}, + POC_NOP, + "NOP", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond }; pCodeInstruction pciRETFIE = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeRETURN, - genericDestruct, - genericPrint}, - POC_RETFIE, - "RETFIE", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 0, // num ops - 0,0, // dest, bit instruction - 1,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond (not true... affects the GIE bit too) + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeRETURN, + genericDestruct, + genericPrint}, + POC_RETFIE, + "RETFIE", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 1,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond (not true... affects the GIE bit too) }; pCodeInstruction pciRETLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeRETURN, - genericDestruct, - genericPrint}, - POC_RETLW, - "RETLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 1,0, // branch, skip - 1, // literal operand - POC_NOP, - PCC_LITERAL, // inCond - PCC_W // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeRETURN, + genericDestruct, + genericPrint}, + POC_RETLW, + "RETLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 1,0, // branch, skip + 1, // literal operand + POC_NOP, + PCC_LITERAL, // inCond + PCC_W // outCond }; pCodeInstruction pciRETURN = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // AnalyzeRETURN, - genericDestruct, - genericPrint}, - POC_RETURN, - "RETURN", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 0, // num ops - 0,0, // dest, bit instruction - 1,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_NONE // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // AnalyzeRETURN, + genericDestruct, + genericPrint}, + POC_RETURN, + "RETURN", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 1,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE // outCond }; pCodeInstruction pciRLF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_RLF, - "RLF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_C | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_RLF, + "RLF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_C | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciRLFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_RLFW, - "RLF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_C | PCC_REGISTER), // inCond - (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_RLFW, + "RLF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_C | PCC_REGISTER), // inCond + (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciRRF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_RRF, - "RRF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_C | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_RRF, + "RRF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_C | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciRRFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_RRFW, - "RRF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_C | PCC_REGISTER), // inCond - (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_RRFW, + "RRF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_C | PCC_REGISTER), // inCond + (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciSUBWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_SUBWF, - "SUBWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_SUBWF, + "SUBWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z) // outCond }; pCodeInstruction pciSUBFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_SUBFW, - "SUBWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_SUBFW, + "SUBWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciSUBLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_SUBLW, - "SUBLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_W | PCC_LITERAL), // inCond - (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_SUBLW, + "SUBLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_W | PCC_LITERAL), // inCond + (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciSWAPF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_SWAPF, - "SWAPF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_REGISTER), // inCond - (PCC_REGISTER) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_SWAPF, + "SWAPF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_REGISTER), // inCond + (PCC_REGISTER) // outCond }; pCodeInstruction pciSWAPFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_SWAPFW, - "SWAPF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_REGISTER), // inCond - (PCC_W) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_SWAPFW, + "SWAPF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_REGISTER), // inCond + (PCC_W) // outCond }; pCodeInstruction pciTRIS = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_TRIS, - "TRIS", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_TRIS, + "TRIS", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciXORWF = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_XORWF, - "XORWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 1,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_REGISTER | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_XORWF, + "XORWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 1,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_REGISTER | PCC_Z) // outCond }; pCodeInstruction pciXORFW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_XORFW, - "XORWF", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 2, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - (PCC_W | PCC_REGISTER), // inCond - (PCC_W | PCC_Z) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_XORFW, + "XORWF", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 2, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + (PCC_W | PCC_REGISTER), // inCond + (PCC_W | PCC_Z) // outCond }; pCodeInstruction pciXORLW = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_XORLW, - "XORLW", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 1, // literal operand - POC_NOP, - (PCC_W | PCC_LITERAL), // inCond - (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_XORLW, + "XORLW", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 1, // literal operand + POC_NOP, + (PCC_W | PCC_LITERAL), // inCond + (PCC_W | PCC_Z | PCC_C | PCC_DC) // outCond }; pCodeInstruction pciBANKSEL = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_BANKSEL, - "BANKSEL", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_BANKSEL, + "BANKSEL", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_REGISTER // outCond }; pCodeInstruction pciPAGESEL = { - {PC_OPCODE, NULL, NULL, 0, 0, NULL, - // genericAnalyze, - genericDestruct, - genericPrint}, - POC_PAGESEL, - "PAGESEL", - NULL, // from branch - NULL, // to branch - NULL, // label - NULL, // operand - NULL, // flow block - NULL, // C source - 1, // num ops - 0,0, // dest, bit instruction - 0,0, // branch, skip - 0, // literal operand - POC_NOP, - PCC_NONE, // inCond - PCC_REGISTER // outCond + {PC_OPCODE, NULL, NULL, 0, 0, NULL, + // genericAnalyze, + genericDestruct, + genericPrint}, + POC_PAGESEL, + "PAGESEL", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 1, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_REGISTER // outCond }; pCodeInstruction *pic14Mnemonics[MAX_PIC14MNEMONICS]; @@ -1251,15 +1252,15 @@ pCodeInstruction *pic14Mnemonics[MAX_PIC14MNEMONICS]; /* return a unique ID number to assist pCodes debuging */ /*-----------------------------------------------------------------*/ unsigned PCodeID(void) { - static unsigned int pcodeId = 1; /* unique ID number to be assigned to all pCodes */ - /* - static unsigned int stop; - if (pcodeId == 5801) - stop++; - if ((pcodeId >= 855)&&(pcodeId <= 856)) - stop++; - */ - return pcodeId++; + static unsigned int pcodeId = 1; /* unique ID number to be assigned to all pCodes */ + /* + static unsigned int stop; + if (pcodeId == 5801) + stop++; + if ((pcodeId >= 855)&&(pcodeId <= 856)) + stop++; + */ + return pcodeId++; } #ifdef HAVE_VSNPRINTF @@ -1274,27 +1275,27 @@ unsigned PCodeID(void) { /*-----------------------------------------------------------------*/ void SAFE_snprintf(char **str, size_t *size, const char *format, ...) { - va_list val; - int len; - - if(!str || !*str) - return; - - va_start(val, format); - - vsnprintf(*str, *size, format, val); - - va_end (val); - - len = strlen(*str); - if((size_t)len > *size) { - fprintf(stderr,"WARNING, it looks like %s has overflowed\n",__FUNCTION__); - fprintf(stderr,"len = %d is > str size %d\n",len,(int)*size); - } - - *str += len; - *size -= len; - + va_list val; + int len; + + if(!str || !*str) + return; + + va_start(val, format); + + vsnprintf(*str, *size, format, val); + + va_end (val); + + len = strlen(*str); + if((size_t)len > *size) { + fprintf(stderr,"WARNING, it looks like %s has overflowed\n",__FUNCTION__); + fprintf(stderr,"len = %d is > str size %d\n",len,(int)*size); + } + + *str += len; + *size -= len; + } #else // HAVE_VSNPRINTF @@ -1303,28 +1304,28 @@ void SAFE_snprintf(char **str, size_t *size, const char *format, ...) void SAFE_snprintf(char **str, size_t *size, const char *format, ...) { - va_list val; - int len; - static char buffer[1024]; /* grossly conservative, but still not inherently safe */ - - if(!str || !*str) - return; - - va_start(val, format); - - vsprintf(buffer, format, val); - va_end (val); - - len = strlen(buffer); - if(len > *size) { - fprintf(stderr,"WARNING, it looks like %s has overflowed\n",__FUNCTION__); - fprintf(stderr,"len = %d is > str size %d\n",len,*size); - } - - strcpy(*str, buffer); - *str += len; - *size -= len; - + va_list val; + int len; + static char buffer[1024]; /* grossly conservative, but still not inherently safe */ + + if(!str || !*str) + return; + + va_start(val, format); + + vsprintf(buffer, format, val); + va_end (val); + + len = strlen(buffer); + if(len > *size) { + fprintf(stderr,"WARNING, it looks like %s has overflowed\n",__FUNCTION__); + fprintf(stderr,"len = %d is > str size %d\n",len,*size); + } + + strcpy(*str, buffer); + *str += len; + *size -= len; + } #endif // HAVE_VSNPRINTF @@ -1337,50 +1338,50 @@ extern void init_pic(char *); void pCodeInitRegisters(void) { - static int initialized=0; - int shareBankAddress,stkSize; - - if(initialized) - return; - initialized = 1; - - shareBankAddress = 0x7f; /* FIXME - some PIC ICs like 16C7X which do not have a shared bank need a different approach. */ - stkSize = 8; // Set pseudo stack size to 8 - initStack(shareBankAddress, stkSize); // Putting the pseudo stack in shared memory so all modules use the same register when passing fn parameters - init_pic(port->processor); - - pc_status.r = allocProcessorRegister(IDX_STATUS,"STATUS", PO_STATUS, 0x180); - pc_pcl.r = allocProcessorRegister(IDX_PCL,"PCL", PO_PCL, 0x80); - pc_pclath.r = allocProcessorRegister(IDX_PCLATH,"PCLATH", PO_PCLATH, 0x180); - pc_fsr.r = allocProcessorRegister(IDX_FSR,"FSR", PO_FSR, 0x180); - pc_indf.r = allocProcessorRegister(IDX_INDF,"INDF", PO_INDF, 0x80); - pc_intcon.r = allocProcessorRegister(IDX_INTCON,"INTCON", PO_INTCON, 0x180); - - pc_status.rIdx = IDX_STATUS; - pc_fsr.rIdx = IDX_FSR; - pc_indf.rIdx = IDX_INDF; - pc_intcon.rIdx = IDX_INTCON; - pc_pcl.rIdx = IDX_PCL; - pc_pclath.rIdx = IDX_PCLATH; - - pc_wsave.r = allocInternalRegister(IDX_WSAVE,"WSAVE", PO_GPR_REGISTER, 0x180); /* Interrupt storage for working register - must be same address in all banks ie section SHAREBANK. */ - pc_ssave.r = allocInternalRegister(IDX_SSAVE,"SSAVE", PO_GPR_REGISTER, 0); /* Interrupt storage for status register. */ - pc_psave.r = allocInternalRegister(IDX_PSAVE,"PSAVE", PO_GPR_REGISTER, 0); /* Interrupt storage for pclath register. */ - - pc_wsave.rIdx = pc_wsave.r->rIdx; - pc_ssave.rIdx = pc_ssave.r->rIdx; - pc_psave.rIdx = pc_psave.r->rIdx; - - pc_wsave.r->isFixed = 1; /* Some PIC ICs do not have a sharebank - this register needs to be reserved across all banks. */ - pc_wsave.r->address = shareBankAddress-stkSize; - pc_ssave.r->isFixed = 1; /* This register must be in the first bank. */ - pc_ssave.r->address = shareBankAddress-stkSize-1; - pc_psave.r->isFixed = 1; /* This register must be in the first bank. */ - pc_psave.r->address = shareBankAddress-stkSize-2; - - /* probably should put this in a separate initialization routine */ - pb_dead_pcodes = newpBlock(); - + static int initialized=0; + int shareBankAddress,stkSize; + + if(initialized) + return; + initialized = 1; + + shareBankAddress = 0x7f; /* FIXME - some PIC ICs like 16C7X which do not have a shared bank need a different approach. */ + stkSize = 8; // Set pseudo stack size to 8 + initStack(shareBankAddress, stkSize); // Putting the pseudo stack in shared memory so all modules use the same register when passing fn parameters + init_pic(port->processor); + + pc_status.r = allocProcessorRegister(IDX_STATUS,"STATUS", PO_STATUS, 0x180); + pc_pcl.r = allocProcessorRegister(IDX_PCL,"PCL", PO_PCL, 0x80); + pc_pclath.r = allocProcessorRegister(IDX_PCLATH,"PCLATH", PO_PCLATH, 0x180); + pc_fsr.r = allocProcessorRegister(IDX_FSR,"FSR", PO_FSR, 0x180); + pc_indf.r = allocProcessorRegister(IDX_INDF,"INDF", PO_INDF, 0x80); + pc_intcon.r = allocProcessorRegister(IDX_INTCON,"INTCON", PO_INTCON, 0x180); + + pc_status.rIdx = IDX_STATUS; + pc_fsr.rIdx = IDX_FSR; + pc_indf.rIdx = IDX_INDF; + pc_intcon.rIdx = IDX_INTCON; + pc_pcl.rIdx = IDX_PCL; + pc_pclath.rIdx = IDX_PCLATH; + + pc_wsave.r = allocInternalRegister(IDX_WSAVE,"WSAVE", PO_GPR_REGISTER, 0x180); /* Interrupt storage for working register - must be same address in all banks ie section SHAREBANK. */ + pc_ssave.r = allocInternalRegister(IDX_SSAVE,"SSAVE", PO_GPR_REGISTER, 0); /* Interrupt storage for status register. */ + pc_psave.r = allocInternalRegister(IDX_PSAVE,"PSAVE", PO_GPR_REGISTER, 0); /* Interrupt storage for pclath register. */ + + pc_wsave.rIdx = pc_wsave.r->rIdx; + pc_ssave.rIdx = pc_ssave.r->rIdx; + pc_psave.rIdx = pc_psave.r->rIdx; + + pc_wsave.r->isFixed = 1; /* Some PIC ICs do not have a sharebank - this register needs to be reserved across all banks. */ + pc_wsave.r->address = shareBankAddress-stkSize; + pc_ssave.r->isFixed = 1; /* This register must be in the first bank. */ + pc_ssave.r->address = shareBankAddress-stkSize-1; + pc_psave.r->isFixed = 1; /* This register must be in the first bank. */ + pc_psave.r->address = shareBankAddress-stkSize-2; + + /* probably should put this in a separate initialization routine */ + pb_dead_pcodes = newpBlock(); + } /*-----------------------------------------------------------------*/ @@ -1391,124 +1392,124 @@ void pCodeInitRegisters(void) int mnem2key(char const *mnem) { - int key = 0; - - if(!mnem) - return 0; - - while(*mnem) { - - key += toupper(*mnem++) +1; - - } - - return (key & 0x1f); - + int key = 0; + + if(!mnem) + return 0; + + while(*mnem) { + + key += toupper(*mnem++) +1; + + } + + return (key & 0x1f); + } void pic14initMnemonics(void) { - int i = 0; - int key; - // char *str; - pCodeInstruction *pci; - - if(mnemonics_initialized) - return; - - //FIXME - probably should NULL out the array before making the assignments - //since we check the array contents below this initialization. - - pic14Mnemonics[POC_ADDLW] = &pciADDLW; - pic14Mnemonics[POC_ADDWF] = &pciADDWF; - pic14Mnemonics[POC_ADDFW] = &pciADDFW; - pic14Mnemonics[POC_ANDLW] = &pciANDLW; - pic14Mnemonics[POC_ANDWF] = &pciANDWF; - pic14Mnemonics[POC_ANDFW] = &pciANDFW; - pic14Mnemonics[POC_BCF] = &pciBCF; - pic14Mnemonics[POC_BSF] = &pciBSF; - pic14Mnemonics[POC_BTFSC] = &pciBTFSC; - pic14Mnemonics[POC_BTFSS] = &pciBTFSS; - pic14Mnemonics[POC_CALL] = &pciCALL; - pic14Mnemonics[POC_COMF] = &pciCOMF; - pic14Mnemonics[POC_COMFW] = &pciCOMFW; - pic14Mnemonics[POC_CLRF] = &pciCLRF; - pic14Mnemonics[POC_CLRW] = &pciCLRW; - pic14Mnemonics[POC_CLRWDT] = &pciCLRWDT; - pic14Mnemonics[POC_DECF] = &pciDECF; - pic14Mnemonics[POC_DECFW] = &pciDECFW; - pic14Mnemonics[POC_DECFSZ] = &pciDECFSZ; - pic14Mnemonics[POC_DECFSZW] = &pciDECFSZW; - pic14Mnemonics[POC_GOTO] = &pciGOTO; - pic14Mnemonics[POC_INCF] = &pciINCF; - pic14Mnemonics[POC_INCFW] = &pciINCFW; - pic14Mnemonics[POC_INCFSZ] = &pciINCFSZ; - pic14Mnemonics[POC_INCFSZW] = &pciINCFSZW; - pic14Mnemonics[POC_IORLW] = &pciIORLW; - pic14Mnemonics[POC_IORWF] = &pciIORWF; - pic14Mnemonics[POC_IORFW] = &pciIORFW; - pic14Mnemonics[POC_MOVF] = &pciMOVF; - pic14Mnemonics[POC_MOVFW] = &pciMOVFW; - pic14Mnemonics[POC_MOVLW] = &pciMOVLW; - pic14Mnemonics[POC_MOVWF] = &pciMOVWF; - pic14Mnemonics[POC_NOP] = &pciNOP; - pic14Mnemonics[POC_RETFIE] = &pciRETFIE; - pic14Mnemonics[POC_RETLW] = &pciRETLW; - pic14Mnemonics[POC_RETURN] = &pciRETURN; - pic14Mnemonics[POC_RLF] = &pciRLF; - pic14Mnemonics[POC_RLFW] = &pciRLFW; - pic14Mnemonics[POC_RRF] = &pciRRF; - pic14Mnemonics[POC_RRFW] = &pciRRFW; - pic14Mnemonics[POC_SUBLW] = &pciSUBLW; - pic14Mnemonics[POC_SUBWF] = &pciSUBWF; - pic14Mnemonics[POC_SUBFW] = &pciSUBFW; - pic14Mnemonics[POC_SWAPF] = &pciSWAPF; - pic14Mnemonics[POC_SWAPFW] = &pciSWAPFW; - pic14Mnemonics[POC_TRIS] = &pciTRIS; - pic14Mnemonics[POC_XORLW] = &pciXORLW; - pic14Mnemonics[POC_XORWF] = &pciXORWF; - pic14Mnemonics[POC_XORFW] = &pciXORFW; - pic14Mnemonics[POC_BANKSEL] = &pciBANKSEL; - pic14Mnemonics[POC_PAGESEL] = &pciPAGESEL; - - for(i=0; imnemonic), pic14Mnemonics[i]); - pci = hTabFirstItem(pic14MnemonicsHash, &key); - - while(pci) { - DFPRINTF((stderr, "element %d key %d, mnem %s\n",i++,key,pci->mnemonic)); - pci = hTabNextItem(pic14MnemonicsHash, &key); - } - - mnemonics_initialized = 1; + int i = 0; + int key; + // char *str; + pCodeInstruction *pci; + + if(mnemonics_initialized) + return; + + //FIXME - probably should NULL out the array before making the assignments + //since we check the array contents below this initialization. + + pic14Mnemonics[POC_ADDLW] = &pciADDLW; + pic14Mnemonics[POC_ADDWF] = &pciADDWF; + pic14Mnemonics[POC_ADDFW] = &pciADDFW; + pic14Mnemonics[POC_ANDLW] = &pciANDLW; + pic14Mnemonics[POC_ANDWF] = &pciANDWF; + pic14Mnemonics[POC_ANDFW] = &pciANDFW; + pic14Mnemonics[POC_BCF] = &pciBCF; + pic14Mnemonics[POC_BSF] = &pciBSF; + pic14Mnemonics[POC_BTFSC] = &pciBTFSC; + pic14Mnemonics[POC_BTFSS] = &pciBTFSS; + pic14Mnemonics[POC_CALL] = &pciCALL; + pic14Mnemonics[POC_COMF] = &pciCOMF; + pic14Mnemonics[POC_COMFW] = &pciCOMFW; + pic14Mnemonics[POC_CLRF] = &pciCLRF; + pic14Mnemonics[POC_CLRW] = &pciCLRW; + pic14Mnemonics[POC_CLRWDT] = &pciCLRWDT; + pic14Mnemonics[POC_DECF] = &pciDECF; + pic14Mnemonics[POC_DECFW] = &pciDECFW; + pic14Mnemonics[POC_DECFSZ] = &pciDECFSZ; + pic14Mnemonics[POC_DECFSZW] = &pciDECFSZW; + pic14Mnemonics[POC_GOTO] = &pciGOTO; + pic14Mnemonics[POC_INCF] = &pciINCF; + pic14Mnemonics[POC_INCFW] = &pciINCFW; + pic14Mnemonics[POC_INCFSZ] = &pciINCFSZ; + pic14Mnemonics[POC_INCFSZW] = &pciINCFSZW; + pic14Mnemonics[POC_IORLW] = &pciIORLW; + pic14Mnemonics[POC_IORWF] = &pciIORWF; + pic14Mnemonics[POC_IORFW] = &pciIORFW; + pic14Mnemonics[POC_MOVF] = &pciMOVF; + pic14Mnemonics[POC_MOVFW] = &pciMOVFW; + pic14Mnemonics[POC_MOVLW] = &pciMOVLW; + pic14Mnemonics[POC_MOVWF] = &pciMOVWF; + pic14Mnemonics[POC_NOP] = &pciNOP; + pic14Mnemonics[POC_RETFIE] = &pciRETFIE; + pic14Mnemonics[POC_RETLW] = &pciRETLW; + pic14Mnemonics[POC_RETURN] = &pciRETURN; + pic14Mnemonics[POC_RLF] = &pciRLF; + pic14Mnemonics[POC_RLFW] = &pciRLFW; + pic14Mnemonics[POC_RRF] = &pciRRF; + pic14Mnemonics[POC_RRFW] = &pciRRFW; + pic14Mnemonics[POC_SUBLW] = &pciSUBLW; + pic14Mnemonics[POC_SUBWF] = &pciSUBWF; + pic14Mnemonics[POC_SUBFW] = &pciSUBFW; + pic14Mnemonics[POC_SWAPF] = &pciSWAPF; + pic14Mnemonics[POC_SWAPFW] = &pciSWAPFW; + pic14Mnemonics[POC_TRIS] = &pciTRIS; + pic14Mnemonics[POC_XORLW] = &pciXORLW; + pic14Mnemonics[POC_XORWF] = &pciXORWF; + pic14Mnemonics[POC_XORFW] = &pciXORFW; + pic14Mnemonics[POC_BANKSEL] = &pciBANKSEL; + pic14Mnemonics[POC_PAGESEL] = &pciPAGESEL; + + for(i=0; imnemonic), pic14Mnemonics[i]); + pci = hTabFirstItem(pic14MnemonicsHash, &key); + + while(pci) { + DFPRINTF((stderr, "element %d key %d, mnem %s\n",i++,key,pci->mnemonic)); + pci = hTabNextItem(pic14MnemonicsHash, &key); + } + + mnemonics_initialized = 1; } int getpCodePeepCommand(char *cmd); int getpCode(char *mnem,unsigned dest) { - - pCodeInstruction *pci; - int key = mnem2key(mnem); - - if(!mnemonics_initialized) - pic14initMnemonics(); - - pci = hTabFirstItemWK(pic14MnemonicsHash, key); - - while(pci) { - - if(STRCASECMP(pci->mnemonic, mnem) == 0) { - if((pci->num_ops <= 1) || (pci->isModReg == dest) || (pci->isBitInst)) - return(pci->op); - } - - pci = hTabNextItemWK (pic14MnemonicsHash); - - } - - return -1; + + pCodeInstruction *pci; + int key = mnem2key(mnem); + + if(!mnemonics_initialized) + pic14initMnemonics(); + + pci = hTabFirstItemWK(pic14MnemonicsHash, key); + + while(pci) { + + if(STRCASECMP(pci->mnemonic, mnem) == 0) { + if((pci->num_ops <= 1) || (pci->isModReg == dest) || (pci->isBitInst)) + return(pci->op); + } + + pci = hTabNextItemWK (pic14MnemonicsHash); + + } + + return -1; } /*-----------------------------------------------------------------* @@ -1517,24 +1518,24 @@ int getpCode(char *mnem,unsigned dest) *-----------------------------------------------------------------*/ void pic14initpCodePeepCommands(void) { - - int key, i; - peepCommand *pcmd; - - i = 0; - do { - hTabAddItem(&pic14pCodePeepCommandsHash, - mnem2key(peepCommands[i].cmd), &peepCommands[i]); - i++; - } while (peepCommands[i].cmd); - - pcmd = hTabFirstItem(pic14pCodePeepCommandsHash, &key); - - while(pcmd) { - //fprintf(stderr, "peep command %s key %d\n",pcmd->cmd,pcmd->id); - pcmd = hTabNextItem(pic14pCodePeepCommandsHash, &key); - } - + + int key, i; + peepCommand *pcmd; + + i = 0; + do { + hTabAddItem(&pic14pCodePeepCommandsHash, + mnem2key(peepCommands[i].cmd), &peepCommands[i]); + i++; + } while (peepCommands[i].cmd); + + pcmd = hTabFirstItem(pic14pCodePeepCommandsHash, &key); + + while(pcmd) { + //fprintf(stderr, "peep command %s key %d\n",pcmd->cmd,pcmd->id); + pcmd = hTabNextItem(pic14pCodePeepCommandsHash, &key); + } + } /*----------------------------------------------------------------- @@ -1544,45 +1545,45 @@ void pic14initpCodePeepCommands(void) int getpCodePeepCommand(char *cmd) { - - peepCommand *pcmd; - int key = mnem2key(cmd); - - - pcmd = hTabFirstItemWK(pic14pCodePeepCommandsHash, key); - - while(pcmd) { - // fprintf(stderr," comparing %s to %s\n",pcmd->cmd,cmd); - if(STRCASECMP(pcmd->cmd, cmd) == 0) { - return pcmd->id; - } - - pcmd = hTabNextItemWK (pic14pCodePeepCommandsHash); - - } - - return -1; + + peepCommand *pcmd; + int key = mnem2key(cmd); + + + pcmd = hTabFirstItemWK(pic14pCodePeepCommandsHash, key); + + while(pcmd) { + // fprintf(stderr," comparing %s to %s\n",pcmd->cmd,cmd); + if(STRCASECMP(pcmd->cmd, cmd) == 0) { + return pcmd->id; + } + + pcmd = hTabNextItemWK (pic14pCodePeepCommandsHash); + + } + + return -1; } char getpBlock_dbName(pBlock *pb) { - if(!pb) - return 0; - - if(pb->cmemmap) - return pb->cmemmap->dbName; - - return pb->dbName; + if(!pb) + return 0; + + if(pb->cmemmap) + return pb->cmemmap->dbName; + + return pb->dbName; } void pBlockConvert2ISR(pBlock *pb) { - if(!pb) - return; - - if(pb->cmemmap) - pb->cmemmap = NULL; - - pb->dbName = 'I'; + if(!pb) + return; + + if(pb->cmemmap) + pb->cmemmap = NULL; + + pb->dbName = 'I'; } /*-----------------------------------------------------------------*/ @@ -1593,96 +1594,96 @@ void pBlockConvert2ISR(pBlock *pb) void movepBlock2Head(char dbName) { - pBlock *pb; - - if (!the_pFile) - return; - - pb = the_pFile->pbHead; - - while(pb) { - - if(getpBlock_dbName(pb) == dbName) { - pBlock *pbn = pb->next; - pb->next = the_pFile->pbHead; - the_pFile->pbHead->prev = pb; - the_pFile->pbHead = pb; - - if(pb->prev) - pb->prev->next = pbn; - - // If the pBlock that we just moved was the last - // one in the link of all of the pBlocks, then we - // need to point the tail to the block just before - // the one we moved. - // Note: if pb->next is NULL, then pb must have - // been the last pBlock in the chain. - - if(pbn) - pbn->prev = pb->prev; - else - the_pFile->pbTail = pb->prev; - - pb = pbn; - - } else - pb = pb->next; - - } - + pBlock *pb; + + if (!the_pFile) + return; + + pb = the_pFile->pbHead; + + while(pb) { + + if(getpBlock_dbName(pb) == dbName) { + pBlock *pbn = pb->next; + pb->next = the_pFile->pbHead; + the_pFile->pbHead->prev = pb; + the_pFile->pbHead = pb; + + if(pb->prev) + pb->prev->next = pbn; + + // If the pBlock that we just moved was the last + // one in the link of all of the pBlocks, then we + // need to point the tail to the block just before + // the one we moved. + // Note: if pb->next is NULL, then pb must have + // been the last pBlock in the chain. + + if(pbn) + pbn->prev = pb->prev; + else + the_pFile->pbTail = pb->prev; + + pb = pbn; + + } else + pb = pb->next; + + } + } void copypCode(FILE *of, char dbName) { - pBlock *pb; - - if(!of || !the_pFile) - return; - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - if(getpBlock_dbName(pb) == dbName) { - pBlockStats(of,pb); - printpBlock(of,pb); - fprintf (of, "\n"); - } - } - + pBlock *pb; + + if(!of || !the_pFile) + return; + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + if(getpBlock_dbName(pb) == dbName) { + pBlockStats(of,pb); + printpBlock(of,pb); + fprintf (of, "\n"); + } + } + } void pcode_test(void) { - - DFPRINTF((stderr,"pcode is alive!\n")); - - //initMnemonics(); - - if(the_pFile) { - - pBlock *pb; - FILE *pFile; - char buffer[100]; - - /* create the file name */ - strcpy(buffer,dstFileName); - strcat(buffer,".p"); - - if( !(pFile = fopen(buffer, "w" ))) { - werror(E_FILE_OPEN_ERR,buffer); - exit(1); - } - - fprintf(pFile,"pcode dump\n\n"); - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - fprintf(pFile,"\n\tNew pBlock\n\n"); - if(pb->cmemmap) - fprintf(pFile,"%s",pb->cmemmap->sname); - else - fprintf(pFile,"internal pblock"); - - fprintf(pFile,", dbName =%c\n",getpBlock_dbName(pb)); - printpBlock(pFile,pb); - } - } + + DFPRINTF((stderr,"pcode is alive!\n")); + + //initMnemonics(); + + if(the_pFile) { + + pBlock *pb; + FILE *pFile; + char buffer[100]; + + /* create the file name */ + strcpy(buffer,dstFileName); + strcat(buffer,".p"); + + if( !(pFile = fopen(buffer, "w" ))) { + werror(E_FILE_OPEN_ERR,buffer); + exit(1); + } + + fprintf(pFile,"pcode dump\n\n"); + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + fprintf(pFile,"\n\tNew pBlock\n\n"); + if(pb->cmemmap) + fprintf(pFile,"%s",pb->cmemmap->sname); + else + fprintf(pFile,"internal pblock"); + + fprintf(pFile,", dbName =%c\n",getpBlock_dbName(pb)); + printpBlock(pFile,pb); + } + } } /*-----------------------------------------------------------------*/ /* int RegCond(pCodeOp *pcop) - if pcop points to the STATUS reg- */ @@ -1693,27 +1694,27 @@ void pcode_test(void) static int RegCond(pCodeOp *pcop) { - - if(!pcop) - return 0; - - if (pcop->type == PO_GPR_BIT) { - char *name = pcop->name; - if (!name) - name = PCOR(pcop)->r->name; - // if (strcmp(name, pc_status.pcop.name) != 0) { <<< This breaks the peep 2 optimisation - switch(PCORB(pcop)->bit) { - case PIC_C_BIT: - return PCC_C; - case PIC_DC_BIT: - return PCC_DC; - case PIC_Z_BIT: - return PCC_Z; - } - // } - } - - return 0; + + if(!pcop) + return 0; + + if (pcop->type == PO_GPR_BIT) { + char *name = pcop->name; + if (!name) + name = PCOR(pcop)->r->name; + // if (strcmp(name, pc_status.pcop.name) != 0) { <<< This breaks the peep 2 optimisation + switch(PCORB(pcop)->bit) { + case PIC_C_BIT: + return PCC_C; + case PIC_DC_BIT: + return PCC_DC; + case PIC_Z_BIT: + return PCC_Z; + } + // } + } + + return 0; } /*-----------------------------------------------------------------*/ @@ -1739,33 +1740,33 @@ static int RegCond(pCodeOp *pcop) /*-----------------------------------------------------------------*/ pCode *newpCode (PIC_OPCODE op, pCodeOp *pcop) { - pCodeInstruction *pci ; - - if(!mnemonics_initialized) - pic14initMnemonics(); - - pci = Safe_calloc(1, sizeof(pCodeInstruction)); - - if((op>=0) && (op < MAX_PIC14MNEMONICS) && pic14Mnemonics[op]) { - memcpy(pci, pic14Mnemonics[op], sizeof(pCodeInstruction)); - pci->pc.id = PCodeID(); - pci->pcop = pcop; - - if(pci->inCond & PCC_EXAMINE_PCOP) - pci->inCond |= RegCond(pcop); - - if(pci->outCond & PCC_EXAMINE_PCOP) - pci->outCond |= RegCond(pcop); - - pci->pc.prev = pci->pc.next = NULL; - return (pCode *)pci; - } - - fprintf(stderr, "pCode mnemonic error %s,%d\n",__FUNCTION__,__LINE__); - exit(1); - - return NULL; -} + pCodeInstruction *pci ; + + if(!mnemonics_initialized) + pic14initMnemonics(); + + pci = Safe_calloc(1, sizeof(pCodeInstruction)); + + if((op>=0) && (op < MAX_PIC14MNEMONICS) && pic14Mnemonics[op]) { + memcpy(pci, pic14Mnemonics[op], sizeof(pCodeInstruction)); + pci->pc.id = PCodeID(); + pci->pcop = pcop; + + if(pci->inCond & PCC_EXAMINE_PCOP) + pci->inCond |= RegCond(pcop); + + if(pci->outCond & PCC_EXAMINE_PCOP) + pci->outCond |= RegCond(pcop); + + pci->pc.prev = pci->pc.next = NULL; + return (pCode *)pci; + } + + fprintf(stderr, "pCode mnemonic error %s,%d\n",__FUNCTION__,__LINE__); + exit(1); + + return NULL; +} /*-----------------------------------------------------------------*/ /* newpCodeWild - create a "wild" as in wild card pCode */ @@ -1786,31 +1787,31 @@ pCode *newpCode (PIC_OPCODE op, pCodeOp *pcop) pCode *newpCodeWild(int pCodeID, pCodeOp *optional_operand, pCodeOp *optional_label) { - - pCodeWild *pcw; - - pcw = Safe_calloc(1,sizeof(pCodeWild)); - - pcw->pci.pc.type = PC_WILD; - pcw->pci.pc.prev = pcw->pci.pc.next = NULL; - pcw->id = PCodeID(); - pcw->pci.from = pcw->pci.to = pcw->pci.label = NULL; - pcw->pci.pc.pb = NULL; - - // pcw->pci.pc.analyze = genericAnalyze; - pcw->pci.pc.destruct = genericDestruct; - pcw->pci.pc.print = genericPrint; - - pcw->id = pCodeID; // this is the 'n' in %n - pcw->operand = optional_operand; - pcw->label = optional_label; - - pcw->mustBeBitSkipInst = 0; - pcw->mustNotBeBitSkipInst = 0; - pcw->invertBitSkipInst = 0; - - return ( (pCode *)pcw); - + + pCodeWild *pcw; + + pcw = Safe_calloc(1,sizeof(pCodeWild)); + + pcw->pci.pc.type = PC_WILD; + pcw->pci.pc.prev = pcw->pci.pc.next = NULL; + pcw->id = PCodeID(); + pcw->pci.from = pcw->pci.to = pcw->pci.label = NULL; + pcw->pci.pc.pb = NULL; + + // pcw->pci.pc.analyze = genericAnalyze; + pcw->pci.pc.destruct = genericDestruct; + pcw->pci.pc.print = genericPrint; + + pcw->id = pCodeID; // this is the 'n' in %n + pcw->operand = optional_operand; + pcw->label = optional_label; + + pcw->mustBeBitSkipInst = 0; + pcw->mustNotBeBitSkipInst = 0; + pcw->invertBitSkipInst = 0; + + return ( (pCode *)pcw); + } /*-----------------------------------------------------------------*/ @@ -1820,28 +1821,28 @@ pCode *newpCodeWild(int pCodeID, pCodeOp *optional_operand, pCodeOp *optional_la pCode *newpCodeInlineP(char *cP) { - - pCodeComment *pcc ; - - pcc = Safe_calloc(1,sizeof(pCodeComment)); - - pcc->pc.type = PC_INLINE; - pcc->pc.prev = pcc->pc.next = NULL; - pcc->pc.id = PCodeID(); - //pcc->pc.from = pcc->pc.to = pcc->pc.label = NULL; - pcc->pc.pb = NULL; - - // pcc->pc.analyze = genericAnalyze; - pcc->pc.destruct = genericDestruct; - pcc->pc.print = genericPrint; - - if(cP) - pcc->comment = Safe_strdup(cP); - else - pcc->comment = NULL; - - return ( (pCode *)pcc); - + + pCodeComment *pcc ; + + pcc = Safe_calloc(1,sizeof(pCodeComment)); + + pcc->pc.type = PC_INLINE; + pcc->pc.prev = pcc->pc.next = NULL; + pcc->pc.id = PCodeID(); + //pcc->pc.from = pcc->pc.to = pcc->pc.label = NULL; + pcc->pc.pb = NULL; + + // pcc->pc.analyze = genericAnalyze; + pcc->pc.destruct = genericDestruct; + pcc->pc.print = genericPrint; + + if(cP) + pcc->comment = Safe_strdup(cP); + else + pcc->comment = NULL; + + return ( (pCode *)pcc); + } /*-----------------------------------------------------------------*/ @@ -1850,28 +1851,28 @@ pCode *newpCodeInlineP(char *cP) pCode *newpCodeCharP(char *cP) { - - pCodeComment *pcc ; - - pcc = Safe_calloc(1,sizeof(pCodeComment)); - - pcc->pc.type = PC_COMMENT; - pcc->pc.prev = pcc->pc.next = NULL; - pcc->pc.id = PCodeID(); - //pcc->pc.from = pcc->pc.to = pcc->pc.label = NULL; - pcc->pc.pb = NULL; - - // pcc->pc.analyze = genericAnalyze; - pcc->pc.destruct = genericDestruct; - pcc->pc.print = genericPrint; - - if(cP) - pcc->comment = Safe_strdup(cP); - else - pcc->comment = NULL; - - return ( (pCode *)pcc); - + + pCodeComment *pcc ; + + pcc = Safe_calloc(1,sizeof(pCodeComment)); + + pcc->pc.type = PC_COMMENT; + pcc->pc.prev = pcc->pc.next = NULL; + pcc->pc.id = PCodeID(); + //pcc->pc.from = pcc->pc.to = pcc->pc.label = NULL; + pcc->pc.pb = NULL; + + // pcc->pc.analyze = genericAnalyze; + pcc->pc.destruct = genericDestruct; + pcc->pc.print = genericPrint; + + if(cP) + pcc->comment = Safe_strdup(cP); + else + pcc->comment = NULL; + + return ( (pCode *)pcc); + } /*-----------------------------------------------------------------*/ @@ -1881,41 +1882,41 @@ pCode *newpCodeCharP(char *cP) pCode *newpCodeFunction(char *mod,char *f,int isPublic) { - pCodeFunction *pcf; - - pcf = Safe_calloc(1,sizeof(pCodeFunction)); - //_ALLOC(pcf,sizeof(pCodeFunction)); - - pcf->pc.type = PC_FUNCTION; - pcf->pc.prev = pcf->pc.next = NULL; - pcf->pc.id = PCodeID(); - //pcf->pc.from = pcf->pc.to = pcf->pc.label = NULL; - pcf->pc.pb = NULL; - - // pcf->pc.analyze = genericAnalyze; - pcf->pc.destruct = genericDestruct; - pcf->pc.print = pCodePrintFunction; - - pcf->ncalled = 0; - - if(mod) { - //_ALLOC_ATOMIC(pcf->modname,strlen(mod)+1); - pcf->modname = Safe_calloc(1,strlen(mod)+1); - strcpy(pcf->modname,mod); - } else - pcf->modname = NULL; - - if(f) { - //_ALLOC_ATOMIC(pcf->fname,strlen(f)+1); - pcf->fname = Safe_calloc(1,strlen(f)+1); - strcpy(pcf->fname,f); - } else - pcf->fname = NULL; - - pcf->isPublic = (unsigned)isPublic; - - return ( (pCode *)pcf); - + pCodeFunction *pcf; + + pcf = Safe_calloc(1,sizeof(pCodeFunction)); + //_ALLOC(pcf,sizeof(pCodeFunction)); + + pcf->pc.type = PC_FUNCTION; + pcf->pc.prev = pcf->pc.next = NULL; + pcf->pc.id = PCodeID(); + //pcf->pc.from = pcf->pc.to = pcf->pc.label = NULL; + pcf->pc.pb = NULL; + + // pcf->pc.analyze = genericAnalyze; + pcf->pc.destruct = genericDestruct; + pcf->pc.print = pCodePrintFunction; + + pcf->ncalled = 0; + + if(mod) { + //_ALLOC_ATOMIC(pcf->modname,strlen(mod)+1); + pcf->modname = Safe_calloc(1,strlen(mod)+1); + strcpy(pcf->modname,mod); + } else + pcf->modname = NULL; + + if(f) { + //_ALLOC_ATOMIC(pcf->fname,strlen(f)+1); + pcf->fname = Safe_calloc(1,strlen(f)+1); + strcpy(pcf->fname,f); + } else + pcf->fname = NULL; + + pcf->isPublic = (unsigned)isPublic; + + return ( (pCode *)pcf); + } /*-----------------------------------------------------------------*/ @@ -1923,70 +1924,70 @@ pCode *newpCodeFunction(char *mod,char *f,int isPublic) /*-----------------------------------------------------------------*/ void destructpCodeFlow(pCode *pc) { - if(!pc || !isPCFL(pc)) - return; - - /* - if(PCFL(pc)->from) - if(PCFL(pc)->to) - */ - unlinkpCode(pc); - - deleteSet(&PCFL(pc)->registers); - deleteSet(&PCFL(pc)->from); - deleteSet(&PCFL(pc)->to); - free(pc); - + if(!pc || !isPCFL(pc)) + return; + + /* + if(PCFL(pc)->from) + if(PCFL(pc)->to) + */ + unlinkpCode(pc); + + deleteSet(&PCFL(pc)->registers); + deleteSet(&PCFL(pc)->from); + deleteSet(&PCFL(pc)->to); + free(pc); + } pCode *newpCodeFlow(void ) { - pCodeFlow *pcflow; - - //_ALLOC(pcflow,sizeof(pCodeFlow)); - pcflow = Safe_calloc(1,sizeof(pCodeFlow)); - - pcflow->pc.type = PC_FLOW; - pcflow->pc.prev = pcflow->pc.next = NULL; - pcflow->pc.pb = NULL; - - // pcflow->pc.analyze = genericAnalyze; - pcflow->pc.destruct = destructpCodeFlow; - pcflow->pc.print = genericPrint; - - pcflow->pc.seq = GpcFlowSeq++; - - pcflow->from = pcflow->to = NULL; - - pcflow->inCond = PCC_NONE; - pcflow->outCond = PCC_NONE; - - pcflow->firstBank = 'U'; /* Undetermined */ - pcflow->lastBank = 'U'; /* Undetermined */ - - pcflow->FromConflicts = 0; - pcflow->ToConflicts = 0; - - pcflow->end = NULL; - - pcflow->registers = newSet(); - - return ( (pCode *)pcflow); - + pCodeFlow *pcflow; + + //_ALLOC(pcflow,sizeof(pCodeFlow)); + pcflow = Safe_calloc(1,sizeof(pCodeFlow)); + + pcflow->pc.type = PC_FLOW; + pcflow->pc.prev = pcflow->pc.next = NULL; + pcflow->pc.pb = NULL; + + // pcflow->pc.analyze = genericAnalyze; + pcflow->pc.destruct = destructpCodeFlow; + pcflow->pc.print = genericPrint; + + pcflow->pc.seq = GpcFlowSeq++; + + pcflow->from = pcflow->to = NULL; + + pcflow->inCond = PCC_NONE; + pcflow->outCond = PCC_NONE; + + pcflow->firstBank = 'U'; /* Undetermined */ + pcflow->lastBank = 'U'; /* Undetermined */ + + pcflow->FromConflicts = 0; + pcflow->ToConflicts = 0; + + pcflow->end = NULL; + + pcflow->registers = newSet(); + + return ( (pCode *)pcflow); + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeFlowLink *newpCodeFlowLink(pCodeFlow *pcflow) { - pCodeFlowLink *pcflowLink; - - pcflowLink = Safe_calloc(1,sizeof(pCodeFlowLink)); - - pcflowLink->pcflow = pcflow; - pcflowLink->bank_conflict = 0; - - return pcflowLink; + pCodeFlowLink *pcflowLink; + + pcflowLink = Safe_calloc(1,sizeof(pCodeFlowLink)); + + pcflowLink->pcflow = pcflow; + pcflowLink->bank_conflict = 0; + + return pcflowLink; } /*-----------------------------------------------------------------*/ @@ -1995,81 +1996,81 @@ pCodeFlowLink *newpCodeFlowLink(pCodeFlow *pcflow) pCode *newpCodeCSource(int ln, char *f, char *l) { - - pCodeCSource *pccs; - - pccs = Safe_calloc(1,sizeof(pCodeCSource)); - - pccs->pc.type = PC_CSOURCE; - pccs->pc.prev = pccs->pc.next = NULL; - pccs->pc.id = PCodeID(); - pccs->pc.pb = NULL; - - pccs->pc.destruct = genericDestruct; - pccs->pc.print = genericPrint; - - pccs->line_number = ln; - if(l) - pccs->line = Safe_strdup(l); - else - pccs->line = NULL; - - if(f) - pccs->file_name = Safe_strdup(f); - else - pccs->file_name = NULL; - - return ( (pCode *)pccs); - + + pCodeCSource *pccs; + + pccs = Safe_calloc(1,sizeof(pCodeCSource)); + + pccs->pc.type = PC_CSOURCE; + pccs->pc.prev = pccs->pc.next = NULL; + pccs->pc.id = PCodeID(); + pccs->pc.pb = NULL; + + pccs->pc.destruct = genericDestruct; + pccs->pc.print = genericPrint; + + pccs->line_number = ln; + if(l) + pccs->line = Safe_strdup(l); + else + pccs->line = NULL; + + if(f) + pccs->file_name = Safe_strdup(f); + else + pccs->file_name = NULL; + + return ( (pCode *)pccs); + } /*-----------------------------------------------------------------*/ /* pCodeLabelDestruct - free memory used by a label. */ /*-----------------------------------------------------------------*/ static void pCodeLabelDestruct(pCode *pc) { - - if(!pc) - return; - - if((pc->type == PC_LABEL) && PCL(pc)->label) - free(PCL(pc)->label); - - free(pc); - + + if(!pc) + return; + + if((pc->type == PC_LABEL) && PCL(pc)->label) + free(PCL(pc)->label); + + free(pc); + } pCode *newpCodeLabel(char *name, int key) { - - char *s = buffer; - pCodeLabel *pcl; - - pcl = Safe_calloc(1,sizeof(pCodeLabel) ); - - pcl->pc.type = PC_LABEL; - pcl->pc.prev = pcl->pc.next = NULL; - pcl->pc.id = PCodeID(); - //pcl->pc.from = pcl->pc.to = pcl->pc.label = NULL; - pcl->pc.pb = NULL; - - // pcl->pc.analyze = genericAnalyze; - pcl->pc.destruct = pCodeLabelDestruct; - pcl->pc.print = pCodePrintLabel; - - pcl->key = key; - - pcl->label = NULL; - if(key>0) { - sprintf(s,"_%05d_DS_",key); - } else - s = name; - - if(s) - pcl->label = Safe_strdup(s); - - //fprintf(stderr,"newpCodeLabel: key=%d, name=%s\n",key, ((s)?s:"")); - return ( (pCode *)pcl); - + + char *s = buffer; + pCodeLabel *pcl; + + pcl = Safe_calloc(1,sizeof(pCodeLabel) ); + + pcl->pc.type = PC_LABEL; + pcl->pc.prev = pcl->pc.next = NULL; + pcl->pc.id = PCodeID(); + //pcl->pc.from = pcl->pc.to = pcl->pc.label = NULL; + pcl->pc.pb = NULL; + + // pcl->pc.analyze = genericAnalyze; + pcl->pc.destruct = pCodeLabelDestruct; + pcl->pc.print = pCodePrintLabel; + + pcl->key = key; + + pcl->label = NULL; + if(key>0) { + sprintf(s,"_%05d_DS_",key); + } else + s = name; + + if(s) + pcl->label = Safe_strdup(s); + + //fprintf(stderr,"newpCodeLabel: key=%d, name=%s\n",key, ((s)?s:"")); + return ( (pCode *)pcl); + } @@ -2078,19 +2079,19 @@ pCode *newpCodeLabel(char *name, int key) /*-----------------------------------------------------------------*/ pBlock *newpBlock(void) { - - pBlock *PpB; - - PpB = Safe_calloc(1,sizeof(pBlock) ); - PpB->next = PpB->prev = NULL; - - PpB->function_entries = PpB->function_exits = PpB->function_calls = NULL; - PpB->tregisters = NULL; - PpB->visited = 0; - PpB->FlowTree = NULL; - - return PpB; - + + pBlock *PpB; + + PpB = Safe_calloc(1,sizeof(pBlock) ); + PpB->next = PpB->prev = NULL; + + PpB->function_entries = PpB->function_exits = PpB->function_calls = NULL; + PpB->tregisters = NULL; + PpB->visited = 0; + PpB->FlowTree = NULL; + + return PpB; + } /*-----------------------------------------------------------------*/ @@ -2104,14 +2105,14 @@ pBlock *newpBlock(void) pBlock *newpCodeChain(memmap *cm,char c, pCode *pc) { - - pBlock *pB = newpBlock(); - - pB->pcHead = pB->pcTail = pc; - pB->cmemmap = cm; - pB->dbName = c; - - return pB; + + pBlock *pB = newpBlock(); + + pB->pcHead = pB->pcTail = pc; + pB->cmemmap = cm; + pB->dbName = c; + + return pB; } /*-----------------------------------------------------------------*/ @@ -2123,163 +2124,163 @@ pBlock *newpCodeChain(memmap *cm,char c, pCode *pc) pCodeOp *newpCodeOpLabel(char *name, int key) { - char *s=NULL; - static int label_key=-1; - - pCodeOp *pcop; - - pcop = Safe_calloc(1,sizeof(pCodeOpLabel) ); - pcop->type = PO_LABEL; - - pcop->name = NULL; - - if(key>0) - sprintf(s=buffer,"_%05d_DS_",key); - else - s = name, key = label_key--; - - PCOLAB(pcop)->offset = 0; - if(s) - pcop->name = Safe_strdup(s); - - ((pCodeOpLabel *)pcop)->key = key; - - //fprintf(stderr,"newpCodeOpLabel: key=%d, name=%s\n",key,((s)?s:"")); - return pcop; + char *s=NULL; + static int label_key=-1; + + pCodeOp *pcop; + + pcop = Safe_calloc(1,sizeof(pCodeOpLabel) ); + pcop->type = PO_LABEL; + + pcop->name = NULL; + + if(key>0) + sprintf(s=buffer,"_%05d_DS_",key); + else + s = name, key = label_key--; + + PCOLAB(pcop)->offset = 0; + if(s) + pcop->name = Safe_strdup(s); + + ((pCodeOpLabel *)pcop)->key = key; + + //fprintf(stderr,"newpCodeOpLabel: key=%d, name=%s\n",key,((s)?s:"")); + return pcop; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeOp *newpCodeOpLit(int lit) { - char *s = buffer; - pCodeOp *pcop; - - - pcop = Safe_calloc(1,sizeof(pCodeOpLit) ); - pcop->type = PO_LITERAL; - - pcop->name = NULL; - if(lit>=0) { - sprintf(s,"0x%02x",lit); - if(s) - pcop->name = Safe_strdup(s); - } - - ((pCodeOpLit *)pcop)->lit = lit; - - return pcop; + char *s = buffer; + pCodeOp *pcop; + + + pcop = Safe_calloc(1,sizeof(pCodeOpLit) ); + pcop->type = PO_LITERAL; + + pcop->name = NULL; + if(lit>=0) { + sprintf(s,"0x%02x",lit); + if(s) + pcop->name = Safe_strdup(s); + } + + ((pCodeOpLit *)pcop)->lit = lit; + + return pcop; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeOp *newpCodeOpImmd(char *name, int offset, int index, int code_space, int is_func) { - pCodeOp *pcop; - - pcop = Safe_calloc(1,sizeof(pCodeOpImmd) ); - pcop->type = PO_IMMEDIATE; - if(name) { - regs *r = NULL; - pcop->name = Safe_strdup(name); - - if(!is_func) - r = dirregWithName(name); - - PCOI(pcop)->r = r; - if(r) { - //fprintf(stderr, " newpCodeOpImmd reg %s exists\n",name); - PCOI(pcop)->rIdx = r->rIdx; - } else { - //fprintf(stderr, " newpCodeOpImmd reg %s doesn't exist\n",name); - PCOI(pcop)->rIdx = -1; - } - //fprintf(stderr,"%s %s %d\n",__FUNCTION__,name,offset); - } else { - pcop->name = NULL; - } - - PCOI(pcop)->index = index; - PCOI(pcop)->offset = offset; - PCOI(pcop)->_const = code_space; - PCOI(pcop)->_function = is_func; - - return pcop; + pCodeOp *pcop; + + pcop = Safe_calloc(1,sizeof(pCodeOpImmd) ); + pcop->type = PO_IMMEDIATE; + if(name) { + regs *r = NULL; + pcop->name = Safe_strdup(name); + + if(!is_func) + r = dirregWithName(name); + + PCOI(pcop)->r = r; + if(r) { + //fprintf(stderr, " newpCodeOpImmd reg %s exists\n",name); + PCOI(pcop)->rIdx = r->rIdx; + } else { + //fprintf(stderr, " newpCodeOpImmd reg %s doesn't exist\n",name); + PCOI(pcop)->rIdx = -1; + } + //fprintf(stderr,"%s %s %d\n",__FUNCTION__,name,offset); + } else { + pcop->name = NULL; + } + + PCOI(pcop)->index = index; + PCOI(pcop)->offset = offset; + PCOI(pcop)->_const = code_space; + PCOI(pcop)->_function = is_func; + + return pcop; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeOp *newpCodeOpWild(int id, pCodeWildBlock *pcwb, pCodeOp *subtype) { - char *s = buffer; - pCodeOp *pcop; - - - if(!pcwb || !subtype) { - fprintf(stderr, "Wild opcode declaration error: %s-%d\n",__FILE__,__LINE__); - exit(1); - } - - pcop = Safe_calloc(1,sizeof(pCodeOpWild)); - pcop->type = PO_WILD; - sprintf(s,"%%%d",id); - pcop->name = Safe_strdup(s); - - PCOW(pcop)->id = id; - PCOW(pcop)->pcwb = pcwb; - PCOW(pcop)->subtype = subtype; - PCOW(pcop)->matched = NULL; - - return pcop; + char *s = buffer; + pCodeOp *pcop; + + + if(!pcwb || !subtype) { + fprintf(stderr, "Wild opcode declaration error: %s-%d\n",__FILE__,__LINE__); + exit(1); + } + + pcop = Safe_calloc(1,sizeof(pCodeOpWild)); + pcop->type = PO_WILD; + sprintf(s,"%%%d",id); + pcop->name = Safe_strdup(s); + + PCOW(pcop)->id = id; + PCOW(pcop)->pcwb = pcwb; + PCOW(pcop)->subtype = subtype; + PCOW(pcop)->matched = NULL; + + return pcop; } /*-----------------------------------------------------------------*/ /* Find a symbol with matching name */ /*-----------------------------------------------------------------*/ static symbol *symFindWithName(memmap * map, const char *name) { - symbol *sym; - - for (sym = setFirstItem(map->syms); sym; sym = setNextItem (map->syms)) { - if (sym->rname && (strcmp(sym->rname,name)==0)) - return sym; - } - return 0; + symbol *sym; + + for (sym = setFirstItem(map->syms); sym; sym = setNextItem (map->syms)) { + if (sym->rname && (strcmp(sym->rname,name)==0)) + return sym; + } + return 0; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pCodeOp *newpCodeOpBit(char *name, int ibit, int inBitSpace) { - pCodeOp *pcop; - struct regs *r = 0; - - pcop = Safe_calloc(1,sizeof(pCodeOpRegBit) ); - pcop->type = PO_GPR_BIT; - - PCORB(pcop)->bit = ibit; - PCORB(pcop)->inBitSpace = inBitSpace; - - if (name) r = regFindWithName(name); - if (!r) { - // Register has not been allocated - check for symbol information - symbol *sym; - sym = symFindWithName(bit, name); - if (!sym) sym = symFindWithName(sfrbit, name); - if (!sym) sym = symFindWithName(sfr, name); - if (sym) { - r = allocNewDirReg(sym->etype,name); - } - } - if (r) { - pcop->name = NULL; - PCOR(pcop)->r = r; - PCOR(pcop)->rIdx = r->rIdx; - } else { - pcop->name = Safe_strdup(name); - PCOR(pcop)->r = NULL; - PCOR(pcop)->rIdx = 0; - } - return pcop; + pCodeOp *pcop; + struct regs *r = 0; + + pcop = Safe_calloc(1,sizeof(pCodeOpRegBit) ); + pcop->type = PO_GPR_BIT; + + PCORB(pcop)->bit = ibit; + PCORB(pcop)->inBitSpace = inBitSpace; + + if (name) r = regFindWithName(name); + if (!r) { + // Register has not been allocated - check for symbol information + symbol *sym; + sym = symFindWithName(bit, name); + if (!sym) sym = symFindWithName(sfrbit, name); + if (!sym) sym = symFindWithName(sfr, name); + if (sym) { + r = allocNewDirReg(sym->etype,name); + } + } + if (r) { + pcop->name = NULL; + PCOR(pcop)->r = r; + PCOR(pcop)->rIdx = r->rIdx; + } else { + pcop->name = Safe_strdup(name); + PCOR(pcop)->r = NULL; + PCOR(pcop)->rIdx = 0; + } + return pcop; } /*-----------------------------------------------------------------* @@ -2292,52 +2293,52 @@ pCodeOp *newpCodeOpBit(char *name, int ibit, int inBitSpace) pCodeOp *newpCodeOpReg(int rIdx) { - pCodeOp *pcop; - - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - - pcop->name = NULL; - - if(rIdx >= 0) { - PCOR(pcop)->rIdx = rIdx; - PCOR(pcop)->r = pic14_regWithIdx(rIdx); - } else { - PCOR(pcop)->r = pic14_findFreeReg(REG_GPR); - - if(PCOR(pcop)->r) - PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; - } - - if(PCOR(pcop)->r) - pcop->type = PCOR(pcop)->r->pc_type; - - return pcop; + pCodeOp *pcop; + + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + + pcop->name = NULL; + + if(rIdx >= 0) { + PCOR(pcop)->rIdx = rIdx; + PCOR(pcop)->r = pic14_regWithIdx(rIdx); + } else { + PCOR(pcop)->r = pic14_findFreeReg(REG_GPR); + + if(PCOR(pcop)->r) + PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; + } + + if(PCOR(pcop)->r) + pcop->type = PCOR(pcop)->r->pc_type; + + return pcop; } pCodeOp *newpCodeOpRegFromStr(char *name) { - pCodeOp *pcop; - - pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); - PCOR(pcop)->r = allocRegByName(name, 1); - PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; - pcop->type = PCOR(pcop)->r->pc_type; - pcop->name = PCOR(pcop)->r->name; - - return pcop; + pCodeOp *pcop; + + pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); + PCOR(pcop)->r = allocRegByName(name, 1); + PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx; + pcop->type = PCOR(pcop)->r->pc_type; + pcop->name = PCOR(pcop)->r->name; + + return pcop; } pCodeOp *newpCodeOpStr(char *name) { - pCodeOp *pcop; - - pcop = Safe_calloc(1,sizeof(pCodeOpStr)); - pcop->type = PO_STR; - pcop->name = Safe_strdup(name); - - PCOS(pcop)->isPublic = 0; - - return pcop; + pCodeOp *pcop; + + pcop = Safe_calloc(1,sizeof(pCodeOpStr)); + pcop->type = PO_STR; + pcop->name = Safe_strdup(name); + + PCOS(pcop)->isPublic = 0; + + return pcop; } @@ -2346,100 +2347,100 @@ pCodeOp *newpCodeOpStr(char *name) pCodeOp *newpCodeOp(char *name, PIC_OPTYPE type) { - pCodeOp *pcop; - - switch(type) { - case PO_BIT: - case PO_GPR_BIT: - pcop = newpCodeOpBit(name, -1,0); - break; - - case PO_LITERAL: - pcop = newpCodeOpLit(-1); - break; - - case PO_LABEL: - pcop = newpCodeOpLabel(NULL,-1); - break; - - case PO_GPR_TEMP: - pcop = newpCodeOpReg(-1); - break; - - case PO_GPR_POINTER: - case PO_GPR_REGISTER: - if(name) - pcop = newpCodeOpRegFromStr(name); - else - pcop = newpCodeOpReg(-1); - break; - - case PO_STR: - pcop = newpCodeOpStr(name); - break; - - default: - pcop = Safe_calloc(1,sizeof(pCodeOp) ); - pcop->type = type; - if(name) - pcop->name = Safe_strdup(name); - else - pcop->name = NULL; - } - - return pcop; + pCodeOp *pcop; + + switch(type) { + case PO_BIT: + case PO_GPR_BIT: + pcop = newpCodeOpBit(name, -1,0); + break; + + case PO_LITERAL: + pcop = newpCodeOpLit(-1); + break; + + case PO_LABEL: + pcop = newpCodeOpLabel(NULL,-1); + break; + + case PO_GPR_TEMP: + pcop = newpCodeOpReg(-1); + break; + + case PO_GPR_POINTER: + case PO_GPR_REGISTER: + if(name) + pcop = newpCodeOpRegFromStr(name); + else + pcop = newpCodeOpReg(-1); + break; + + case PO_STR: + pcop = newpCodeOpStr(name); + break; + + default: + pcop = Safe_calloc(1,sizeof(pCodeOp) ); + pcop->type = type; + if(name) + pcop->name = Safe_strdup(name); + else + pcop->name = NULL; + } + + return pcop; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void pCodeConstString(char *name, char *value) { - pBlock *pb; - - // fprintf(stderr, " %s %s %s\n",__FUNCTION__,name,value); - - if(!name || !value) - return; - - pb = newpCodeChain(NULL, 'P',newpCodeCharP("; Starting pCode block")); - - addpBlock(pb); - - sprintf(buffer,"; %s = %s",name,value); - - addpCode2pBlock(pb,newpCodeCharP(buffer)); - addpCode2pBlock(pb,newpCodeLabel(name,-1)); - - do { - addpCode2pBlock(pb,newpCode(POC_RETLW,newpCodeOpLit(*value))); - }while (*value++); - - + pBlock *pb; + + // fprintf(stderr, " %s %s %s\n",__FUNCTION__,name,value); + + if(!name || !value) + return; + + pb = newpCodeChain(NULL, 'P',newpCodeCharP("; Starting pCode block")); + + addpBlock(pb); + + sprintf(buffer,"; %s = %s",name,value); + + addpCode2pBlock(pb,newpCodeCharP(buffer)); + addpCode2pBlock(pb,newpCodeLabel(name,-1)); + + do { + addpCode2pBlock(pb,newpCode(POC_RETLW,newpCodeOpLit(*value))); + }while (*value++); + + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void pCodeReadCodeTable(void) { - pBlock *pb; - - fprintf(stderr, " %s\n",__FUNCTION__); - - pb = newpCodeChain(NULL, 'P',newpCodeCharP("; Starting pCode block")); - - addpBlock(pb); - - addpCode2pBlock(pb,newpCodeCharP("; ReadCodeTable - built in function")); - addpCode2pBlock(pb,newpCodeCharP("; Inputs: temp1,temp2 = code pointer")); - addpCode2pBlock(pb,newpCodeCharP("; Outpus: W (from RETLW at temp2:temp1)")); - addpCode2pBlock(pb,newpCodeLabel("ReadCodeTable:",-1)); - - addpCode2pBlock(pb,newpCode(POC_MOVFW,newpCodeOpRegFromStr("temp2"))); - addpCode2pBlock(pb,newpCode(POC_MOVWF,newpCodeOpRegFromStr("PCLATH"))); - addpCode2pBlock(pb,newpCode(POC_MOVFW,newpCodeOpRegFromStr("temp1"))); - addpCode2pBlock(pb,newpCode(POC_MOVWF,newpCodeOpRegFromStr("PCL"))); - - + pBlock *pb; + + fprintf(stderr, " %s\n",__FUNCTION__); + + pb = newpCodeChain(NULL, 'P',newpCodeCharP("; Starting pCode block")); + + addpBlock(pb); + + addpCode2pBlock(pb,newpCodeCharP("; ReadCodeTable - built in function")); + addpCode2pBlock(pb,newpCodeCharP("; Inputs: temp1,temp2 = code pointer")); + addpCode2pBlock(pb,newpCodeCharP("; Outpus: W (from RETLW at temp2:temp1)")); + addpCode2pBlock(pb,newpCodeLabel("ReadCodeTable:",-1)); + + addpCode2pBlock(pb,newpCode(POC_MOVFW,newpCodeOpRegFromStr("temp2"))); + addpCode2pBlock(pb,newpCode(POC_MOVWF,newpCodeOpRegFromStr("PCLATH"))); + addpCode2pBlock(pb,newpCode(POC_MOVFW,newpCodeOpRegFromStr("temp1"))); + addpCode2pBlock(pb,newpCode(POC_MOVWF,newpCodeOpRegFromStr("PCL"))); + + } /*-----------------------------------------------------------------*/ @@ -2447,24 +2448,24 @@ void pCodeReadCodeTable(void) /*-----------------------------------------------------------------*/ void addpCode2pBlock(pBlock *pb, pCode *pc) { - - if(!pc) - return; - - if(!pb->pcHead) { - /* If this is the first pcode to be added to a block that - * was initialized with a NULL pcode, then go ahead and - * make this pcode the head and tail */ - pb->pcHead = pb->pcTail = pc; - } else { - // if(pb->pcTail) - pb->pcTail->next = pc; - - pc->prev = pb->pcTail; - pc->pb = pb; - - pb->pcTail = pc; - } + + if(!pc) + return; + + if(!pb->pcHead) { + /* If this is the first pcode to be added to a block that + * was initialized with a NULL pcode, then go ahead and + * make this pcode the head and tail */ + pb->pcHead = pb->pcTail = pc; + } else { + // if(pb->pcTail) + pb->pcTail->next = pc; + + pc->prev = pb->pcTail; + pc->pb = pb; + + pb->pcTail = pc; + } } /*-----------------------------------------------------------------*/ @@ -2472,21 +2473,21 @@ void addpCode2pBlock(pBlock *pb, pCode *pc) /*-----------------------------------------------------------------*/ void addpBlock(pBlock *pb) { - // fprintf(stderr," Adding pBlock: dbName =%c\n",getpBlock_dbName(pb)); - - if(!the_pFile) { - /* First time called, we'll pass through here. */ - //_ALLOC(the_pFile,sizeof(pFile)); - the_pFile = Safe_calloc(1,sizeof(pFile)); - the_pFile->pbHead = the_pFile->pbTail = pb; - the_pFile->functions = NULL; - return; - } - - the_pFile->pbTail->next = pb; - pb->prev = the_pFile->pbTail; - pb->next = NULL; - the_pFile->pbTail = pb; + // fprintf(stderr," Adding pBlock: dbName =%c\n",getpBlock_dbName(pb)); + + if(!the_pFile) { + /* First time called, we'll pass through here. */ + //_ALLOC(the_pFile,sizeof(pFile)); + the_pFile = Safe_calloc(1,sizeof(pFile)); + the_pFile->pbHead = the_pFile->pbTail = pb; + the_pFile->functions = NULL; + return; + } + + the_pFile->pbTail->next = pb; + pb->prev = the_pFile->pbTail; + pb->next = NULL; + the_pFile->pbTail = pb; } /*-----------------------------------------------------------------*/ @@ -2494,36 +2495,36 @@ void addpBlock(pBlock *pb) /*-----------------------------------------------------------------*/ void removepBlock(pBlock *pb) { - pBlock *pbs; - - if(!the_pFile) - return; - - - //fprintf(stderr," Removing pBlock: dbName =%c\n",getpBlock_dbName(pb)); - - for(pbs = the_pFile->pbHead; pbs; pbs = pbs->next) { - if(pbs == pb) { - - if(pbs == the_pFile->pbHead) - the_pFile->pbHead = pbs->next; - - if (pbs == the_pFile->pbTail) - the_pFile->pbTail = pbs->prev; - - if(pbs->next) - pbs->next->prev = pbs->prev; - - if(pbs->prev) - pbs->prev->next = pbs->next; - - return; - - } - } - - fprintf(stderr, "Warning: call to %s:%s didn't find pBlock\n",__FILE__,__FUNCTION__); - + pBlock *pbs; + + if(!the_pFile) + return; + + + //fprintf(stderr," Removing pBlock: dbName =%c\n",getpBlock_dbName(pb)); + + for(pbs = the_pFile->pbHead; pbs; pbs = pbs->next) { + if(pbs == pb) { + + if(pbs == the_pFile->pbHead) + the_pFile->pbHead = pbs->next; + + if (pbs == the_pFile->pbTail) + the_pFile->pbTail = pbs->prev; + + if(pbs->next) + pbs->next->prev = pbs->prev; + + if(pbs->prev) + pbs->prev->next = pbs->next; + + return; + + } + } + + fprintf(stderr, "Warning: call to %s:%s didn't find pBlock\n",__FILE__,__FUNCTION__); + } /*-----------------------------------------------------------------*/ @@ -2531,16 +2532,16 @@ void removepBlock(pBlock *pb) /*-----------------------------------------------------------------*/ void printpCode(FILE *of, pCode *pc) { - - if(!pc || !of) - return; - - if(pc->print) { - pc->print(of,pc); - return; - } - - fprintf(of,"warning - unable to print pCode\n"); + + if(!pc || !of) + return; + + if(pc->print) { + pc->print(of,pc); + return; + } + + fprintf(of,"warning - unable to print pCode\n"); } /*-----------------------------------------------------------------*/ @@ -2548,17 +2549,17 @@ void printpCode(FILE *of, pCode *pc) /*-----------------------------------------------------------------*/ void printpBlock(FILE *of, pBlock *pb) { - pCode *pc; - - if(!pb) - return; - - if(!of) - of = stderr; - - for(pc = pb->pcHead; pc; pc = pc->next) - printpCode(of,pc); - + pCode *pc; + + if(!pb) + return; + + if(!of) + of = stderr; + + for(pc = pb->pcHead; pc; pc = pc->next) + printpCode(of,pc); + } /*-----------------------------------------------------------------*/ @@ -2571,20 +2572,20 @@ void printpBlock(FILE *of, pBlock *pb) void unlinkpCode(pCode *pc) { - - - if(pc) { + + + if(pc) { #ifdef PCODE_DEBUG - fprintf(stderr,"Unlinking: "); - printpCode(stderr, pc); + fprintf(stderr,"Unlinking: "); + printpCode(stderr, pc); #endif - if(pc->prev) - pc->prev->next = pc->next; - if(pc->next) - pc->next->prev = pc->prev; - - pc->prev = pc->next = NULL; - } + if(pc->prev) + pc->prev->next = pc->next; + if(pc->next) + pc->next->prev = pc->prev; + + pc->prev = pc->next = NULL; + } } /*-----------------------------------------------------------------*/ @@ -2592,29 +2593,29 @@ void unlinkpCode(pCode *pc) static void genericDestruct(pCode *pc) { - - unlinkpCode(pc); - - if(isPCI(pc)) { - /* For instructions, tell the register (if there's one used) - * that it's no longer needed */ - regs *reg = getRegFromInstruction(pc); - if(reg) - deleteSetItem (&(reg->reglives.usedpCodes),pc); - } - - /* Instead of deleting the memory used by this pCode, mark - * the object as bad so that if there's a pointer to this pCode - * dangling around somewhere then (hopefully) when the type is - * checked we'll catch it. - */ - - pc->type = PC_BAD; - - addpCode2pBlock(pb_dead_pcodes, pc); - - //free(pc); - + + unlinkpCode(pc); + + if(isPCI(pc)) { + /* For instructions, tell the register (if there's one used) + * that it's no longer needed */ + regs *reg = getRegFromInstruction(pc); + if(reg) + deleteSetItem (&(reg->reglives.usedpCodes),pc); + } + + /* Instead of deleting the memory used by this pCode, mark + * the object as bad so that if there's a pointer to this pCode + * dangling around somewhere then (hopefully) when the type is + * checked we'll catch it. + */ + + pc->type = PC_BAD; + + addpCode2pBlock(pb_dead_pcodes, pc); + + //free(pc); + } @@ -2622,19 +2623,19 @@ static void genericDestruct(pCode *pc) /* Copies the pCodeInstruction flow pointer from source pCode */ /*-----------------------------------------------------------------*/ static void CopyFlow(pCodeInstruction *pcd, pCode *pcs) { - pCode *p; - pCodeFlow *pcflow = 0; - for (p=pcs; p; p=p->prev) { - if (isPCI(p)) { - pcflow = PCI(p)->pcflow; - break; - } - if (isPCF(p)) { - pcflow = (pCodeFlow*)p; - break; - } - } - PCI(pcd)->pcflow = pcflow; + pCode *p; + pCodeFlow *pcflow = 0; + for (p=pcs; p; p=p->prev) { + if (isPCI(p)) { + pcflow = PCI(p)->pcflow; + break; + } + if (isPCF(p)) { + pcflow = (pCodeFlow*)p; + break; + } + } + PCI(pcd)->pcflow = pcflow; } /*-----------------------------------------------------------------*/ @@ -2643,21 +2644,21 @@ static void CopyFlow(pCodeInstruction *pcd, pCode *pcs) { /*-----------------------------------------------------------------*/ void pCodeInsertAfter(pCode *pc1, pCode *pc2) { - - if(!pc1 || !pc2) - return; - - pc2->next = pc1->next; - if(pc1->next) - pc1->next->prev = pc2; - - pc2->pb = pc1->pb; - pc2->prev = pc1; - pc1->next = pc2; - - /* If this is an instrution type propogate the flow */ - if (isPCI(pc2)) - CopyFlow(PCI(pc2),pc1); + + if(!pc1 || !pc2) + return; + + pc2->next = pc1->next; + if(pc1->next) + pc1->next->prev = pc2; + + pc2->pb = pc1->pb; + pc2->prev = pc1; + pc1->next = pc2; + + /* If this is an instrution type propogate the flow */ + if (isPCI(pc2)) + CopyFlow(PCI(pc2),pc1); } /*------------------------------------------------------------------*/ @@ -2666,21 +2667,21 @@ void pCodeInsertAfter(pCode *pc1, pCode *pc2) /*------------------------------------------------------------------*/ 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; - - /* If this is an instrution type propogate the flow */ - if (isPCI(pc2)) - CopyFlow(PCI(pc2),pc1); + + 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; + + /* If this is an instrution type propogate the flow */ + if (isPCI(pc2)) + CopyFlow(PCI(pc2),pc1); } /*-----------------------------------------------------------------*/ @@ -2688,108 +2689,108 @@ void pCodeInsertBefore(pCode *pc1, pCode *pc2) /*-----------------------------------------------------------------*/ pCodeOp *pCodeOpCopy(pCodeOp *pcop) { - pCodeOp *pcopnew=NULL; - - if(!pcop) - return NULL; - - switch(pcop->type) { - case PO_CRY: - case PO_BIT: - //DFPRINTF((stderr,"pCodeOpCopy bit\n")); - pcopnew = Safe_calloc(1,sizeof(pCodeOpRegBit) ); - PCORB(pcopnew)->bit = PCORB(pcop)->bit; - PCORB(pcopnew)->inBitSpace = PCORB(pcop)->inBitSpace; - - break; - - case PO_WILD: - /* Here we expand the wild card into the appropriate type: */ - /* By recursively calling pCodeOpCopy */ - //DFPRINTF((stderr,"pCodeOpCopy wild\n")); - if(PCOW(pcop)->matched) - pcopnew = pCodeOpCopy(PCOW(pcop)->matched); - else { - // Probably a label - pcopnew = pCodeOpCopy(PCOW(pcop)->subtype); - pcopnew->name = Safe_strdup(PCOW(pcop)->pcwb->vars[PCOW(pcop)->id]); - //DFPRINTF((stderr,"copied a wild op named %s\n",pcopnew->name)); - } - - return pcopnew; - break; - - case PO_LABEL: - //DFPRINTF((stderr,"pCodeOpCopy label\n")); - pcopnew = Safe_calloc(1,sizeof(pCodeOpLabel) ); - PCOLAB(pcopnew)->key = PCOLAB(pcop)->key; - break; - - 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_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: - //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_PCL: - case PO_PCLATH: - - //DFPRINTF((stderr,"pCodeOpCopy register type %d\n", pcop->type)); - pcopnew = Safe_calloc(1,sizeof(pCodeOp) ); - - } - - pcopnew->type = pcop->type; - if(pcop->name) - pcopnew->name = Safe_strdup(pcop->name); - else - pcopnew->name = NULL; - - return pcopnew; + pCodeOp *pcopnew=NULL; + + if(!pcop) + return NULL; + + switch(pcop->type) { + case PO_CRY: + case PO_BIT: + //DFPRINTF((stderr,"pCodeOpCopy bit\n")); + pcopnew = Safe_calloc(1,sizeof(pCodeOpRegBit) ); + PCORB(pcopnew)->bit = PCORB(pcop)->bit; + PCORB(pcopnew)->inBitSpace = PCORB(pcop)->inBitSpace; + + break; + + case PO_WILD: + /* Here we expand the wild card into the appropriate type: */ + /* By recursively calling pCodeOpCopy */ + //DFPRINTF((stderr,"pCodeOpCopy wild\n")); + if(PCOW(pcop)->matched) + pcopnew = pCodeOpCopy(PCOW(pcop)->matched); + else { + // Probably a label + pcopnew = pCodeOpCopy(PCOW(pcop)->subtype); + pcopnew->name = Safe_strdup(PCOW(pcop)->pcwb->vars[PCOW(pcop)->id]); + //DFPRINTF((stderr,"copied a wild op named %s\n",pcopnew->name)); + } + + return pcopnew; + break; + + case PO_LABEL: + //DFPRINTF((stderr,"pCodeOpCopy label\n")); + pcopnew = Safe_calloc(1,sizeof(pCodeOpLabel) ); + PCOLAB(pcopnew)->key = PCOLAB(pcop)->key; + break; + + 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_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: + //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_PCL: + case PO_PCLATH: + + //DFPRINTF((stderr,"pCodeOpCopy register type %d\n", pcop->type)); + pcopnew = Safe_calloc(1,sizeof(pCodeOp) ); + + } + + pcopnew->type = pcop->type; + if(pcop->name) + pcopnew->name = Safe_strdup(pcop->name); + else + pcopnew->name = NULL; + + return pcopnew; } /*-----------------------------------------------------------------*/ @@ -2797,23 +2798,23 @@ pCodeOp *pCodeOpCopy(pCodeOp *pcop) /*-----------------------------------------------------------------*/ pCodeOp *popCopyReg(pCodeOpReg *pc) { - pCodeOpReg *pcor; - - pcor = Safe_calloc(1,sizeof(pCodeOpReg) ); - pcor->pcop.type = pc->pcop.type; - if(pc->pcop.name) { - if(!(pcor->pcop.name = Safe_strdup(pc->pcop.name))) - fprintf(stderr,"oops %s %d",__FILE__,__LINE__); - } else - pcor->pcop.name = NULL; - - pcor->r = pc->r; - pcor->rIdx = pc->rIdx; - pcor->r->wasUsed=1; - - //DEBUGpic14_emitcode ("; ***","%s , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx); - - return PCOP(pcor); + pCodeOpReg *pcor; + + pcor = Safe_calloc(1,sizeof(pCodeOpReg) ); + pcor->pcop.type = pc->pcop.type; + if(pc->pcop.name) { + if(!(pcor->pcop.name = Safe_strdup(pc->pcop.name))) + fprintf(stderr,"oops %s %d",__FILE__,__LINE__); + } else + pcor->pcop.name = NULL; + + pcor->r = pc->r; + pcor->rIdx = pc->rIdx; + pcor->r->wasUsed=1; + + //DEBUGpic14_emitcode ("; ***","%s , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx); + + return PCOP(pcor); } /*-----------------------------------------------------------------*/ @@ -2821,48 +2822,48 @@ pCodeOp *popCopyReg(pCodeOpReg *pc) /*-----------------------------------------------------------------*/ 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)); - - 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; - - return PCODE(new_pci); + pCodeInstruction *new_pci; + + if(invert) + new_pci = PCI(newpCode(pci->inverted_op,pci->pcop)); + else + new_pci = PCI(newpCode(pci->op,pci->pcop)); + + 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; + + return PCODE(new_pci); } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void pCodeDeleteChain(pCode *f,pCode *t) { - pCode *pc; - - while(f && f!=t) { - DFPRINTF((stderr,"delete pCode:\n")); - pc = f->next; - //f->print(stderr,f); - //f->delete(f); this dumps core... - f = pc; - } + pCode *pc; + + while(f && f!=t) { + DFPRINTF((stderr,"delete pCode:\n")); + pc = f->next; + //f->print(stderr,f); + //f->delete(f); this dumps core... + f = pc; + } } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void pBlockRegs(FILE *of, pBlock *pb) { - - regs *r; - - r = setFirstItem(pb->tregisters); - while (r) { - r = setNextItem(pb->tregisters); - } + + regs *r; + + r = setFirstItem(pb->tregisters); + while (r) { + r = setNextItem(pb->tregisters); + } } @@ -2870,226 +2871,236 @@ void pBlockRegs(FILE *of, pBlock *pb) /*-----------------------------------------------------------------*/ char *get_op(pCodeOp *pcop,char *buffer, size_t size) { - regs *r; - static char b[50]; - char *s; - int use_buffer = 1; // copy the string to the passed buffer pointer - - if(!buffer) { - buffer = b; - size = sizeof(b); - use_buffer = 0; // Don't bother copying the string to the buffer. - } - - if(pcop) { - switch(pcop->type) { - case PO_INDF: - case PO_FSR: - if(use_buffer) { - SAFE_snprintf(&buffer,&size,"%s",PCOR(pcop)->r->name); - return buffer; - } - //return PCOR(pcop)->r->name; - return pcop->name; - break; - case PO_GPR_TEMP: - if (PCOR(pcop)->r->type == REG_STK) - r = typeRegWithIdx(PCOR(pcop)->r->rIdx,REG_STK,1); - else - r = pic14_regWithIdx(PCOR(pcop)->r->rIdx); - - if(use_buffer) { - SAFE_snprintf(&buffer,&size,"%s",r->name); - return buffer; - } - - return r->name; - - - case PO_IMMEDIATE: - s = buffer; - - if(PCOI(pcop)->_const) { - - if( PCOI(pcop)->offset && PCOI(pcop)->offset<4) { - switch(PCOI(pcop)->offset) { - case 0: - SAFE_snprintf(&s,&size,"low %s",pcop->name); - break; - case 1: - SAFE_snprintf(&s,&size,"high %s",pcop->name); - break; - default: - SAFE_snprintf(&s,&size,"(((%s+%d) >> %d)&0xff)", - pcop->name, - PCOI(pcop)->index, - 8 * PCOI(pcop)->offset ); - } - } else - SAFE_snprintf(&s,&size,"LOW(%s+%d)",pcop->name,PCOI(pcop)->index); - } else { - - if( PCOI(pcop)->index) { // && PCOI(pcc->pcop)->offset<4) { - SAFE_snprintf(&s,&size,"(%s + %d)", - pcop->name, - PCOI(pcop)->index ); - } else { - switch(PCOI(pcop)->offset) { - case 0: - SAFE_snprintf(&s,&size,"%s",pcop->name); - break; - case 1: - SAFE_snprintf(&s,&size,"high %s",pcop->name); - break; - default: - SAFE_snprintf(&s,&size,"(%s >> %d)&0xff",pcop->name, 8*PCOI(pcop)->offset); - } - } - } - - return buffer; - - case PO_DIR: - s = buffer; - //size = sizeof(buffer); - if( PCOR(pcop)->instance) { - SAFE_snprintf(&s,&size,"(%s + %d)", - pcop->name, - PCOR(pcop)->instance ); - //fprintf(stderr,"PO_DIR %s\n",buffer); - } else - SAFE_snprintf(&s,&size,"%s",pcop->name); - return buffer; - - case PO_LABEL: - s = buffer; - if (pcop->name) { - if(PCOLAB(pcop)->offset == 1) - SAFE_snprintf(&s,&size,"HIGH(%s)",pcop->name); - else - SAFE_snprintf(&s,&size,"%s",pcop->name); - } - return buffer; - - default: - if (pcop->name) { - if(use_buffer) { - SAFE_snprintf(&buffer,&size,"%s",pcop->name); - return buffer; - } - return pcop->name; - } - - } + regs *r; + static char b[50]; + char *s; + int use_buffer = 1; // copy the string to the passed buffer pointer + + if(!buffer) { + buffer = b; + size = sizeof(b); + use_buffer = 0; // Don't bother copying the string to the buffer. + } + + if(pcop) { + switch(pcop->type) { + case PO_INDF: + case PO_FSR: + if(use_buffer) { + SAFE_snprintf(&buffer,&size,"%s",PCOR(pcop)->r->name); + return buffer; + } + //return PCOR(pcop)->r->name; + return pcop->name; + break; + case PO_GPR_TEMP: + if (PCOR(pcop)->r->type == REG_STK) + r = typeRegWithIdx(PCOR(pcop)->r->rIdx,REG_STK,1); + else + r = pic14_regWithIdx(PCOR(pcop)->r->rIdx); + + if(use_buffer) { + SAFE_snprintf(&buffer,&size,"%s",r->name); + return buffer; + } + + return r->name; + + + case PO_IMMEDIATE: + s = buffer; + + if(PCOI(pcop)->_const) { + + if( PCOI(pcop)->offset && PCOI(pcop)->offset<4) { + switch(PCOI(pcop)->offset) { + case 0: + SAFE_snprintf(&s,&size,"low %s",pcop->name); + break; + case 1: + SAFE_snprintf(&s,&size,"high %s",pcop->name); + break; + default: + SAFE_snprintf(&s,&size,"(((%s+%d) >> %d)&0xff)", + pcop->name, + PCOI(pcop)->index, + 8 * PCOI(pcop)->offset ); + } + } else + SAFE_snprintf(&s,&size,"LOW(%s+%d)",pcop->name,PCOI(pcop)->index); + } else { + + if( PCOI(pcop)->index) { // && PCOI(pcc->pcop)->offset<4) { + SAFE_snprintf(&s,&size,"(%s + %d)", + pcop->name, + PCOI(pcop)->index ); + } else { + switch(PCOI(pcop)->offset) { + case 0: + SAFE_snprintf(&s,&size,"%s",pcop->name); + break; + case 1: + SAFE_snprintf(&s,&size,"high %s",pcop->name); + break; + default: + SAFE_snprintf(&s,&size,"(%s >> %d)&0xff",pcop->name, 8*PCOI(pcop)->offset); + } + } + } + + return buffer; + + case PO_DIR: + s = buffer; + //size = sizeof(buffer); + if( PCOR(pcop)->instance) { + SAFE_snprintf(&s,&size,"(%s + %d)", + pcop->name, + PCOR(pcop)->instance ); + //fprintf(stderr,"PO_DIR %s\n",buffer); + } else + SAFE_snprintf(&s,&size,"%s",pcop->name); + return buffer; + + case PO_LABEL: + s = buffer; + if (pcop->name) { + if(PCOLAB(pcop)->offset == 1) + SAFE_snprintf(&s,&size,"HIGH(%s)",pcop->name); + else + SAFE_snprintf(&s,&size,"%s",pcop->name); + } + return buffer; + + case PO_GPR_BIT: + if(PCOR(pcop)->r) { + if(use_buffer) { + SAFE_snprintf(&buffer,&size,"%s",PCOR(pcop)->r->name); + return buffer; + } + return PCOR(pcop)->r->name; + } + + /* fall through to the default case */ + default: + if(pcop->name) { + if(use_buffer) { + SAFE_snprintf(&buffer,&size,"%s",pcop->name); + return buffer; } - - return "NO operand"; - + return pcop->name; + } + } + } + + printf("PIC port internal warning: (%s:%d) %s not found\n", + __FUNCTION__, + __LINE__, + pCodeOpType(pcop)); + + return "NO operand"; + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ static char *get_op_from_instruction( pCodeInstruction *pcc) { - - if(pcc ) - return get_op(pcc->pcop,NULL,0); - - /* gcc 3.2: warning: concatenation of string literals with __FUNCTION__ is deprecated - return ("ERROR Null: "__FUNCTION__); - */ - return ("ERROR Null: get_op_from_instruction"); - + + if(pcc) + return get_op(pcc->pcop,NULL,0); + + return ("ERROR Null: get_op_from_instruction"); + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ static void pCodeOpPrint(FILE *of, pCodeOp *pcop) { - - fprintf(of,"pcodeopprint- not implemented\n"); + fprintf(of,"pcodeopprint- not implemented\n"); } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ char *pCode2str(char *str, size_t size, pCode *pc) { - char *s = str; - - switch(pc->type) { - - case PC_OPCODE: - - SAFE_snprintf(&s,&size, "\t%s\t", PCI(pc)->mnemonic); - - if( (PCI(pc)->num_ops >= 1) && (PCI(pc)->pcop)) { - - if(PCI(pc)->isBitInst) { - if(PCI(pc)->pcop->type == PO_GPR_BIT) { - char *name = PCI(pc)->pcop->name; - if (!name) - name = PCOR(PCI(pc)->pcop)->r->name; - if( (((pCodeOpRegBit *)(PCI(pc)->pcop))->inBitSpace) ) - SAFE_snprintf(&s,&size,"(%s >> 3), (%s & 7)", name, name); - else - SAFE_snprintf(&s,&size,"%s,%d", name, - (((pCodeOpRegBit *)(PCI(pc)->pcop))->bit)&7); - } else if(PCI(pc)->pcop->type == PO_GPR_BIT) { - SAFE_snprintf(&s,&size,"%s,%d", get_op_from_instruction(PCI(pc)),PCORB(PCI(pc)->pcop)->bit); - }else - SAFE_snprintf(&s,&size,"%s,0 ; ?bug", get_op_from_instruction(PCI(pc))); - //PCI(pc)->pcop->t.bit ); - } else { - - if(PCI(pc)->pcop->type == PO_GPR_BIT) { - if( PCI(pc)->num_ops == 2) - SAFE_snprintf(&s,&size,"(%s >> 3),%c",get_op_from_instruction(PCI(pc)),((PCI(pc)->isModReg) ? 'F':'W')); - else - SAFE_snprintf(&s,&size,"(1 << (%s & 7))",get_op_from_instruction(PCI(pc))); - - }else { - SAFE_snprintf(&s,&size,"%s",get_op_from_instruction(PCI(pc))); - - if( PCI(pc)->num_ops == 2) - SAFE_snprintf(&s,&size,",%c", ( (PCI(pc)->isModReg) ? 'F':'W')); - } - } - - } - break; - - case PC_COMMENT: - /* assuming that comment ends with a \n */ - SAFE_snprintf(&s,&size,";%s", ((pCodeComment *)pc)->comment); - break; - - case PC_INLINE: - /* assuming that inline code ends with a \n */ - SAFE_snprintf(&s,&size,"%s", ((pCodeComment *)pc)->comment); - break; - - case PC_LABEL: - SAFE_snprintf(&s,&size,";label=%s, key=%d\n",PCL(pc)->label,PCL(pc)->key); - break; - case PC_FUNCTION: - SAFE_snprintf(&s,&size,";modname=%s,function=%s: id=%d\n",PCF(pc)->modname,PCF(pc)->fname); - break; - case PC_WILD: - SAFE_snprintf(&s,&size,";\tWild opcode: id=%d\n",PCW(pc)->id); - break; - case PC_FLOW: - SAFE_snprintf(&s,&size,";\t--FLOW change\n"); - break; - case PC_CSOURCE: - SAFE_snprintf(&s,&size,";#CSRC\t%s %d\n; %s\n", PCCS(pc)->file_name, PCCS(pc)->line_number, PCCS(pc)->line); - break; - - case PC_BAD: - SAFE_snprintf(&s,&size,";A bad pCode is being used\n"); - } - - return str; - + char *s = str; + + switch(pc->type) { + + case PC_OPCODE: + + SAFE_snprintf(&s,&size, "\t%s\t", PCI(pc)->mnemonic); + + if( (PCI(pc)->num_ops >= 1) && (PCI(pc)->pcop)) { + + if(PCI(pc)->isBitInst) { + if(PCI(pc)->pcop->type == PO_GPR_BIT) { + char *name = PCI(pc)->pcop->name; + if (!name) + name = PCOR(PCI(pc)->pcop)->r->name; + if( (((pCodeOpRegBit *)(PCI(pc)->pcop))->inBitSpace) ) + SAFE_snprintf(&s,&size,"(%s >> 3), (%s & 7)", name, name); + else + SAFE_snprintf(&s,&size,"%s,%d", name, + (((pCodeOpRegBit *)(PCI(pc)->pcop))->bit)&7); + } else if(PCI(pc)->pcop->type == PO_GPR_BIT) { + SAFE_snprintf(&s,&size,"%s,%d", get_op_from_instruction(PCI(pc)),PCORB(PCI(pc)->pcop)->bit); + }else + SAFE_snprintf(&s,&size,"%s,0 ; ?bug", get_op_from_instruction(PCI(pc))); + //PCI(pc)->pcop->t.bit ); + } else { + + if(PCI(pc)->pcop->type == PO_GPR_BIT) { + if( PCI(pc)->num_ops == 2) + SAFE_snprintf(&s,&size,"(%s >> 3),%c",get_op_from_instruction(PCI(pc)),((PCI(pc)->isModReg) ? 'F':'W')); + else + SAFE_snprintf(&s,&size,"(1 << (%s & 7))",get_op_from_instruction(PCI(pc))); + + }else { + SAFE_snprintf(&s,&size,"%s",get_op_from_instruction(PCI(pc))); + + if( PCI(pc)->num_ops == 2) + SAFE_snprintf(&s,&size,",%c", ( (PCI(pc)->isModReg) ? 'F':'W')); + } + } + + } + break; + + case PC_COMMENT: + /* assuming that comment ends with a \n */ + SAFE_snprintf(&s,&size,";%s", ((pCodeComment *)pc)->comment); + break; + + case PC_INLINE: + /* assuming that inline code ends with a \n */ + SAFE_snprintf(&s,&size,"%s", ((pCodeComment *)pc)->comment); + break; + + case PC_LABEL: + SAFE_snprintf(&s,&size,";label=%s, key=%d\n",PCL(pc)->label,PCL(pc)->key); + break; + case PC_FUNCTION: + SAFE_snprintf(&s,&size,";modname=%s,function=%s: id=%d\n",PCF(pc)->modname,PCF(pc)->fname); + break; + case PC_WILD: + SAFE_snprintf(&s,&size,";\tWild opcode: id=%d\n",PCW(pc)->id); + break; + case PC_FLOW: + SAFE_snprintf(&s,&size,";\t--FLOW change\n"); + break; + case PC_CSOURCE: + SAFE_snprintf(&s,&size,";#CSRC\t%s %d\n; %s\n", PCCS(pc)->file_name, PCCS(pc)->line_number, PCCS(pc)->line); + break; + + case PC_BAD: + SAFE_snprintf(&s,&size,";A bad pCode is being used\n"); + } + + return str; + } /*-----------------------------------------------------------------*/ @@ -3097,104 +3108,104 @@ char *pCode2str(char *str, size_t size, pCode *pc) /*-----------------------------------------------------------------*/ static void genericPrint(FILE *of, pCode *pc) { - - if(!pc || !of) - return; - - switch(pc->type) { - case PC_COMMENT: - fprintf(of,";%s\n", ((pCodeComment *)pc)->comment); - break; - - case PC_INLINE: - fprintf(of,"%s\n", ((pCodeComment *)pc)->comment); - break; - - case PC_OPCODE: - // If the opcode has a label, print that first - { - pBranch *pbl = PCI(pc)->label; - while(pbl && pbl->pc) { - if(pbl->pc->type == PC_LABEL) - pCodePrintLabel(of, pbl->pc); - pbl = pbl->next; - } - } - - if(PCI(pc)->cline) - genericPrint(of,PCODE(PCI(pc)->cline)); - - { - char str[256]; - - pCode2str(str, 256, pc); - - fprintf(of,"%s",str); - - /* Debug */ - if(debug_verbose) { - fprintf(of, "\t;id=%u,key=%03x",pc->id,pc->seq); - if(PCI(pc)->pcflow) - fprintf(of,",flow seq=%03x",PCI(pc)->pcflow->pc.seq); - } - } + + if(!pc || !of) + return; + + switch(pc->type) { + case PC_COMMENT: + fprintf(of,";%s\n", ((pCodeComment *)pc)->comment); + break; + + case PC_INLINE: + fprintf(of,"%s\n", ((pCodeComment *)pc)->comment); + break; + + case PC_OPCODE: + // If the opcode has a label, print that first + { + pBranch *pbl = PCI(pc)->label; + while(pbl && pbl->pc) { + if(pbl->pc->type == PC_LABEL) + pCodePrintLabel(of, pbl->pc); + pbl = pbl->next; + } + } + + if(PCI(pc)->cline) + genericPrint(of,PCODE(PCI(pc)->cline)); + + { + char str[256]; + + pCode2str(str, 256, pc); + + fprintf(of,"%s",str); + + /* Debug */ + if(debug_verbose) { + fprintf(of, "\t;id=%u,key=%03x",pc->id,pc->seq); + if(PCI(pc)->pcflow) + fprintf(of,",flow seq=%03x",PCI(pc)->pcflow->pc.seq); + } + } #if 0 - { - pBranch *dpb = pc->to; // debug - while(dpb) { - switch ( dpb->pc->type) { - case PC_OPCODE: - fprintf(of, "\t;%s", PCI(dpb->pc)->mnemonic); - break; - case PC_LABEL: - fprintf(of, "\t;label %d", PCL(dpb->pc)->key); - break; - case PC_FUNCTION: - fprintf(of, "\t;function %s", ( (PCF(dpb->pc)->fname) ? (PCF(dpb->pc)->fname) : "[END]")); - break; - case PC_FLOW: - fprintf(of, "\t;flow"); - break; - case PC_COMMENT: - case PC_WILD: - break; - } - dpb = dpb->next; - } - } + { + pBranch *dpb = pc->to; // debug + while(dpb) { + switch ( dpb->pc->type) { + case PC_OPCODE: + fprintf(of, "\t;%s", PCI(dpb->pc)->mnemonic); + break; + case PC_LABEL: + fprintf(of, "\t;label %d", PCL(dpb->pc)->key); + break; + case PC_FUNCTION: + fprintf(of, "\t;function %s", ( (PCF(dpb->pc)->fname) ? (PCF(dpb->pc)->fname) : "[END]")); + break; + case PC_FLOW: + fprintf(of, "\t;flow"); + break; + case PC_COMMENT: + case PC_WILD: + break; + } + dpb = dpb->next; + } + } #endif - fprintf(of,"\n"); - break; - - case PC_WILD: - fprintf(of,";\tWild opcode: id=%d\n",PCW(pc)->id); - if(PCW(pc)->pci.label) - pCodePrintLabel(of, PCW(pc)->pci.label->pc); - - if(PCW(pc)->operand) { - fprintf(of,";\toperand "); - pCodeOpPrint(of,PCW(pc)->operand ); - } - break; - - case PC_FLOW: - if(debug_verbose) { - fprintf(of,";<>Start of new flow, seq=0x%x",pc->seq); - if(PCFL(pc)->ancestor) - fprintf(of," ancestor = 0x%x", PCODE(PCFL(pc)->ancestor)->seq); - fprintf(of,"\n"); - - } - break; - - case PC_CSOURCE: - fprintf(of,";#CSRC\t%s %d\n; %s\n", PCCS(pc)->file_name, PCCS(pc)->line_number, PCCS(pc)->line); - break; - case PC_LABEL: - default: - fprintf(of,"unknown pCode type %d\n",pc->type); - } - + fprintf(of,"\n"); + break; + + case PC_WILD: + fprintf(of,";\tWild opcode: id=%d\n",PCW(pc)->id); + if(PCW(pc)->pci.label) + pCodePrintLabel(of, PCW(pc)->pci.label->pc); + + if(PCW(pc)->operand) { + fprintf(of,";\toperand "); + pCodeOpPrint(of,PCW(pc)->operand ); + } + break; + + case PC_FLOW: + if(debug_verbose) { + fprintf(of,";<>Start of new flow, seq=0x%x",pc->seq); + if(PCFL(pc)->ancestor) + fprintf(of," ancestor = 0x%x", PCODE(PCFL(pc)->ancestor)->seq); + fprintf(of,"\n"); + + } + break; + + case PC_CSOURCE: + fprintf(of,";#CSRC\t%s %d\n; %s\n", PCCS(pc)->file_name, PCCS(pc)->line_number, PCCS(pc)->line); + break; + case PC_LABEL: + default: + fprintf(of,"unknown pCode type %d\n",pc->type); + } + } /*-----------------------------------------------------------------*/ @@ -3203,32 +3214,32 @@ static void genericPrint(FILE *of, pCode *pc) static void pCodePrintFunction(FILE *of, pCode *pc) { - - if(!pc || !of) - return; - - if( ((pCodeFunction *)pc)->modname) - fprintf(of,"F_%s",((pCodeFunction *)pc)->modname); - - if(PCF(pc)->fname) { - pBranch *exits = PCF(pc)->to; - int i=0; - fprintf(of,"%s\t;Function start\n",PCF(pc)->fname); - while(exits) { - i++; - exits = exits->next; - } - //if(i) i--; - fprintf(of,"; %d exit point%c\n",i, ((i==1) ? ' ':'s')); - - }else { - if((PCF(pc)->from && - PCF(pc)->from->pc->type == PC_FUNCTION && - PCF(PCF(pc)->from->pc)->fname) ) - fprintf(of,"; exit point of %s\n",PCF(PCF(pc)->from->pc)->fname); - else - fprintf(of,"; exit point [can't find entry point]\n"); - } + + if(!pc || !of) + return; + + if( ((pCodeFunction *)pc)->modname) + fprintf(of,"F_%s",((pCodeFunction *)pc)->modname); + + if(PCF(pc)->fname) { + pBranch *exits = PCF(pc)->to; + int i=0; + fprintf(of,"%s\t;Function start\n",PCF(pc)->fname); + while(exits) { + i++; + exits = exits->next; + } + //if(i) i--; + fprintf(of,"; %d exit point%c\n",i, ((i==1) ? ' ':'s')); + + }else { + if((PCF(pc)->from && + PCF(pc)->from->pc->type == PC_FUNCTION && + PCF(PCF(pc)->from->pc)->fname) ) + fprintf(of,"; exit point of %s\n",PCF(PCF(pc)->from->pc)->fname); + else + fprintf(of,"; exit point [can't find entry point]\n"); + } } /*-----------------------------------------------------------------*/ /* pCodePrintLabel - prints label */ @@ -3236,17 +3247,17 @@ static void pCodePrintFunction(FILE *of, pCode *pc) static void pCodePrintLabel(FILE *of, pCode *pc) { - - if(!pc || !of) - return; - - if(PCL(pc)->label) - fprintf(of,"%s\n",PCL(pc)->label); - else if (PCL(pc)->key >=0) - fprintf(of,"_%05d_DS_:\n",PCL(pc)->key); - else - fprintf(of,";wild card label: id=%d\n",-PCL(pc)->key); - + + if(!pc || !of) + return; + + if(PCL(pc)->label) + fprintf(of,"%s\n",PCL(pc)->label); + else if (PCL(pc)->key >=0) + fprintf(of,"_%05d_DS_:\n",PCL(pc)->key); + else + fprintf(of,";wild card label: id=%d\n",-PCL(pc)->key); + } /*-----------------------------------------------------------------*/ /* unlinkpCodeFromBranch - Search for a label in a pBranch and */ @@ -3254,63 +3265,63 @@ static void pCodePrintLabel(FILE *of, pCode *pc) /*-----------------------------------------------------------------*/ static void unlinkpCodeFromBranch(pCode *pcl , pCode *pc) { - pBranch *b, *bprev; - - - bprev = NULL; - - if(pcl->type == PC_OPCODE) - b = PCI(pcl)->label; - else { - fprintf(stderr, "LINE %d. can't unlink from non opcode\n",__LINE__); - exit(1); - - } - - //fprintf (stderr, "%s \n",__FUNCTION__); - //pcl->print(stderr,pcl); - //pc->print(stderr,pc); - while(b) { - if(b->pc == pc) { - //fprintf (stderr, "found label\n"); - - /* Found a label */ - if(bprev) { - bprev->next = b->next; /* Not first pCode in chain */ - free(b); - } else { - pc->destruct(pc); - PCI(pcl)->label = b->next; /* First pCode in chain */ - free(b); - } - return; /* A label can't occur more than once */ - } - bprev = b; - b = b->next; - } - + pBranch *b, *bprev; + + + bprev = NULL; + + if(pcl->type == PC_OPCODE) + b = PCI(pcl)->label; + else { + fprintf(stderr, "LINE %d. can't unlink from non opcode\n",__LINE__); + exit(1); + + } + + //fprintf (stderr, "%s \n",__FUNCTION__); + //pcl->print(stderr,pcl); + //pc->print(stderr,pc); + while(b) { + if(b->pc == pc) { + //fprintf (stderr, "found label\n"); + + /* Found a label */ + if(bprev) { + bprev->next = b->next; /* Not first pCode in chain */ + free(b); + } else { + pc->destruct(pc); + PCI(pcl)->label = b->next; /* First pCode in chain */ + free(b); + } + return; /* A label can't occur more than once */ + } + bprev = b; + b = b->next; + } + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ pBranch * pBranchAppend(pBranch *h, pBranch *n) { - pBranch *b; - - if(!h) - return n; - - if(h == n) - return n; - - b = h; - while(b->next) - b = b->next; - - b->next = n; - - return h; - + pBranch *b; + + if(!h) + return n; + + if(h == n) + return n; + + b = h; + while(b->next) + b = b->next; + + b->next = n; + + return h; + } /*-----------------------------------------------------------------*/ /* pBranchLink - given two pcodes, this function will link them */ @@ -3318,26 +3329,26 @@ pBranch * pBranchAppend(pBranch *h, pBranch *n) /*-----------------------------------------------------------------*/ static void pBranchLink(pCodeFunction *f, pCodeFunction *t) { - pBranch *b; - - // Declare a new branch object for the 'from' pCode. - - //_ALLOC(b,sizeof(pBranch)); - b = Safe_calloc(1,sizeof(pBranch)); - b->pc = PCODE(t); // The link to the 'to' pCode. - b->next = NULL; - - f->to = pBranchAppend(f->to,b); - - // Now do the same for the 'to' pCode. - - //_ALLOC(b,sizeof(pBranch)); - b = Safe_calloc(1,sizeof(pBranch)); - b->pc = PCODE(f); - b->next = NULL; - - t->from = pBranchAppend(t->from,b); - + pBranch *b; + + // Declare a new branch object for the 'from' pCode. + + //_ALLOC(b,sizeof(pBranch)); + b = Safe_calloc(1,sizeof(pBranch)); + b->pc = PCODE(t); // The link to the 'to' pCode. + b->next = NULL; + + f->to = pBranchAppend(f->to,b); + + // Now do the same for the 'to' pCode. + + //_ALLOC(b,sizeof(pBranch)); + b = Safe_calloc(1,sizeof(pBranch)); + b->pc = PCODE(f); + b->next = NULL; + + t->from = pBranchAppend(t->from,b); + } #if 0 @@ -3347,15 +3358,15 @@ static void pBranchLink(pCodeFunction *f, pCodeFunction *t) /*-----------------------------------------------------------------*/ static pBranch *pBranchFind(pBranch *pb,pCode *pc) { - while(pb) { - - if(pb->pc == pc) - return pb; - - pb = pb->next; - } - - return NULL; + while(pb) { + + if(pb->pc == pc) + return pb; + + pb = pb->next; + } + + return NULL; } /*-----------------------------------------------------------------*/ @@ -3363,43 +3374,43 @@ static pBranch *pBranchFind(pBranch *pb,pCode *pc) /*-----------------------------------------------------------------*/ static void pCodeUnlink(pCode *pc) { - pBranch *pb1,*pb2; - pCode *pc1; - - if(!pc->prev || !pc->next) { - fprintf(stderr,"unlinking bad pCode in %s:%d\n",__FILE__,__LINE__); - exit(1); - } - - /* first remove the pCode from the chain */ - pc->prev->next = pc->next; - pc->next->prev = pc->prev; - - /* Now for the hard part... */ - - /* Remove the branches */ - - pb1 = pc->from; - while(pb1) { - pc1 = pb1->pc; /* Get the pCode that branches to the - * one we're unlinking */ - - /* search for the link back to this pCode (the one we're - * unlinking) */ - if(pb2 = pBranchFind(pc1->to,pc)) { - pb2->pc = pc->to->pc; // make the replacement - - /* if the pCode we're unlinking contains multiple 'to' - * branches (e.g. this a skip instruction) then we need - * to copy these extra branches to the chain. */ - if(pc->to->next) - pBranchAppend(pb2, pc->to->next); - } - - pb1 = pb1->next; - } - - + pBranch *pb1,*pb2; + pCode *pc1; + + if(!pc->prev || !pc->next) { + fprintf(stderr,"unlinking bad pCode in %s:%d\n",__FILE__,__LINE__); + exit(1); + } + + /* first remove the pCode from the chain */ + pc->prev->next = pc->next; + pc->next->prev = pc->prev; + + /* Now for the hard part... */ + + /* Remove the branches */ + + pb1 = pc->from; + while(pb1) { + pc1 = pb1->pc; /* Get the pCode that branches to the + * one we're unlinking */ + + /* search for the link back to this pCode (the one we're + * unlinking) */ + if(pb2 = pBranchFind(pc1->to,pc)) { + pb2->pc = pc->to->pc; // make the replacement + + /* if the pCode we're unlinking contains multiple 'to' + * branches (e.g. this a skip instruction) then we need + * to copy these extra branches to the chain. */ + if(pc->to->next) + pBranchAppend(pb2, pc->to->next); + } + + pb1 = pb1->next; + } + + } #endif /*-----------------------------------------------------------------*/ @@ -3407,40 +3418,40 @@ static void pCodeUnlink(pCode *pc) #if 0 static void genericAnalyze(pCode *pc) { - switch(pc->type) { - case PC_WILD: - case PC_COMMENT: - return; - case PC_LABEL: - case PC_FUNCTION: - case PC_OPCODE: - { - // Go through the pCodes that are in pCode chain and link - // them together through the pBranches. Note, the pCodes - // are linked together as a contiguous stream like the - // assembly source code lines. The linking here mimics this - // except that comments are not linked in. - // - pCode *npc = pc->next; - while(npc) { - if(npc->type == PC_OPCODE || npc->type == PC_LABEL) { - pBranchLink(pc,npc); - return; - } else - npc = npc->next; - } - /* reached the end of the pcode chain without finding - * an instruction we could link to. */ - } - break; - case PC_FLOW: - fprintf(stderr,"analyze PC_FLOW\n"); - - return; - case PC_BAD: - fprintf(stderr,";A bad pCode is being used\n"); - - } + switch(pc->type) { + case PC_WILD: + case PC_COMMENT: + return; + case PC_LABEL: + case PC_FUNCTION: + case PC_OPCODE: + { + // Go through the pCodes that are in pCode chain and link + // them together through the pBranches. Note, the pCodes + // are linked together as a contiguous stream like the + // assembly source code lines. The linking here mimics this + // except that comments are not linked in. + // + pCode *npc = pc->next; + while(npc) { + if(npc->type == PC_OPCODE || npc->type == PC_LABEL) { + pBranchLink(pc,npc); + return; + } else + npc = npc->next; + } + /* reached the end of the pcode chain without finding + * an instruction we could link to. */ + } + break; + case PC_FLOW: + fprintf(stderr,"analyze PC_FLOW\n"); + + return; + case PC_BAD: + fprintf(stderr,";A bad pCode is being used\n"); + + } } #endif @@ -3448,43 +3459,43 @@ static void genericAnalyze(pCode *pc) /*-----------------------------------------------------------------*/ int compareLabel(pCode *pc, pCodeOpLabel *pcop_label) { - pBranch *pbr; - - if(pc->type == PC_LABEL) { - if( ((pCodeLabel *)pc)->key == pcop_label->key) - return TRUE; - } - if(pc->type == PC_OPCODE) { - pbr = PCI(pc)->label; - while(pbr) { - if(pbr->pc->type == PC_LABEL) { - if( ((pCodeLabel *)(pbr->pc))->key == pcop_label->key) - return TRUE; - } - pbr = pbr->next; - } - } - - return FALSE; + pBranch *pbr; + + if(pc->type == PC_LABEL) { + if( ((pCodeLabel *)pc)->key == pcop_label->key) + return TRUE; + } + if(pc->type == PC_OPCODE) { + pbr = PCI(pc)->label; + while(pbr) { + if(pbr->pc->type == PC_LABEL) { + if( ((pCodeLabel *)(pbr->pc))->key == pcop_label->key) + return TRUE; + } + pbr = pbr->next; + } + } + + return FALSE; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ int checkLabel(pCode *pc) { - pBranch *pbr; - - if(pc && isPCI(pc)) { - pbr = PCI(pc)->label; - while(pbr) { - if(isPCL(pbr->pc) && (PCL(pbr->pc)->key >= 0)) - return TRUE; - - pbr = pbr->next; - } - } - - return FALSE; + pBranch *pbr; + + if(pc && isPCI(pc)) { + pbr = PCI(pc)->label; + while(pbr) { + if(isPCL(pbr->pc) && (PCL(pbr->pc)->key >= 0)) + return TRUE; + + pbr = pbr->next; + } + } + + return FALSE; } /*-----------------------------------------------------------------*/ @@ -3492,16 +3503,16 @@ int checkLabel(pCode *pc) /*-----------------------------------------------------------------*/ pCode * findLabelinpBlock(pBlock *pb,pCodeOpLabel *pcop_label) { - pCode *pc; - - if(!pb) - return NULL; - - for(pc = pb->pcHead; pc; pc = pc->next) - if(compareLabel(pc,pcop_label)) - return pc; - - return NULL; + pCode *pc; + + if(!pb) + return NULL; + + for(pc = pb->pcHead; pc; pc = pc->next) + if(compareLabel(pc,pcop_label)) + return pc; + + return NULL; } /*-----------------------------------------------------------------*/ @@ -3509,19 +3520,19 @@ pCode * findLabelinpBlock(pBlock *pb,pCodeOpLabel *pcop_label) /*-----------------------------------------------------------------*/ pCode * findLabel(pCodeOpLabel *pcop_label) { - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return NULL; - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - if( (pc = findLabelinpBlock(pb,pcop_label)) != NULL) - return pc; - } - - fprintf(stderr,"Couldn't find label %s", pcop_label->pcop.name); - return NULL; + pBlock *pb; + pCode *pc; + + if(!the_pFile) + return NULL; + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + if( (pc = findLabelinpBlock(pb,pcop_label)) != NULL) + return pc; + } + + fprintf(stderr,"Couldn't find label %s", pcop_label->pcop.name); + return NULL; } /*-----------------------------------------------------------------*/ @@ -3530,15 +3541,15 @@ pCode * findLabel(pCodeOpLabel *pcop_label) /*-----------------------------------------------------------------*/ pCode * findNextpCode(pCode *pc, PC_TYPE pct) { - - while(pc) { - if(pc->type == pct) - return pc; - - pc = pc->next; - } - - return NULL; + + while(pc) { + if(pc->type == pct) + return pc; + + pc = pc->next; + } + + return NULL; } /*-----------------------------------------------------------------*/ @@ -3547,15 +3558,15 @@ pCode * findNextpCode(pCode *pc, PC_TYPE pct) /*-----------------------------------------------------------------*/ pCode * findPrevpCode(pCode *pc, PC_TYPE pct) { - - while(pc) { - if(pc->type == pct) - return pc; - - pc = pc->prev; - } - - return NULL; + + while(pc) { + if(pc->type == pct) + return pc; + + pc = pc->prev; + } + + return NULL; } /*-----------------------------------------------------------------*/ /* findNextInstruction - given a pCode, find the next instruction */ @@ -3563,21 +3574,21 @@ pCode * findPrevpCode(pCode *pc, PC_TYPE pct) /*-----------------------------------------------------------------*/ pCode * findNextInstruction(pCode *pci) { - pCode *pc = pci; - - while(pc) { - if((pc->type == PC_OPCODE) || (pc->type == PC_WILD)) - return pc; - + pCode *pc = pci; + + while(pc) { + if((pc->type == PC_OPCODE) || (pc->type == PC_WILD)) + return pc; + #ifdef PCODE_DEBUG - fprintf(stderr,"findNextInstruction: "); - printpCode(stderr, pc); + fprintf(stderr,"findNextInstruction: "); + printpCode(stderr, pc); #endif - pc = pc->next; - } - - //fprintf(stderr,"Couldn't find instruction\n"); - return NULL; + pc = pc->next; + } + + //fprintf(stderr,"Couldn't find instruction\n"); + return NULL; } /*-----------------------------------------------------------------*/ @@ -3586,7 +3597,7 @@ pCode * findNextInstruction(pCode *pci) /*-----------------------------------------------------------------*/ pCode * findPrevInstruction(pCode *pci) { - return findPrevpCode(pci, PC_OPCODE); + return findPrevpCode(pci, PC_OPCODE); } /*-----------------------------------------------------------------*/ @@ -3595,16 +3606,16 @@ pCode * findPrevInstruction(pCode *pci) /*-----------------------------------------------------------------*/ pCode * findFunctionEnd(pCode *pc) { - - while(pc) { - if(pc->type == PC_FUNCTION && !(PCF(pc)->fname)) - return pc; - - pc = pc->next; - } - - fprintf(stderr,"Couldn't find function end\n"); - return NULL; + + while(pc) { + if(pc->type == PC_FUNCTION && !(PCF(pc)->fname)) + return pc; + + pc = pc->next; + } + + fprintf(stderr,"Couldn't find function end\n"); + return NULL; } #if 0 @@ -3614,33 +3625,33 @@ pCode * findFunctionEnd(pCode *pc) /*-----------------------------------------------------------------*/ static void AnalyzeLabel(pCode *pc) { - - pCodeUnlink(pc); - + + pCodeUnlink(pc); + } #endif #if 0 static void AnalyzeGOTO(pCode *pc) { - - pBranchLink(pc,findLabel( (pCodeOpLabel *) (PCI(pc)->pcop) )); - + + pBranchLink(pc,findLabel( (pCodeOpLabel *) (PCI(pc)->pcop) )); + } static void AnalyzeSKIP(pCode *pc) { - - pBranchLink(pc,findNextInstruction(pc->next)); - pBranchLink(pc,findNextInstruction(pc->next->next)); - + + pBranchLink(pc,findNextInstruction(pc->next)); + pBranchLink(pc,findNextInstruction(pc->next->next)); + } static void AnalyzeRETURN(pCode *pc) { - - // branch_link(pc,findFunctionEnd(pc->next)); - + + // branch_link(pc,findFunctionEnd(pc->next)); + } #endif @@ -3649,52 +3660,52 @@ static void AnalyzeRETURN(pCode *pc) /*-----------------------------------------------------------------*/ regs * getRegFromInstruction(pCode *pc) { - - if(!pc || - !isPCI(pc) || - !PCI(pc)->pcop || - PCI(pc)->num_ops == 0 ) - return NULL; - - switch(PCI(pc)->pcop->type) { - case PO_INDF: - case PO_FSR: - return PCOR(PCI(pc)->pcop)->r; - - // return typeRegWithIdx (PCOR(PCI(pc)->pcop)->rIdx, REG_SFR, 0); - - case PO_BIT: - case PO_GPR_TEMP: - //fprintf(stderr, "getRegFromInstruction - bit or temp\n"); - return PCOR(PCI(pc)->pcop)->r; - - case PO_IMMEDIATE: - if(PCOI(PCI(pc)->pcop)->r) - return (PCOI(PCI(pc)->pcop)->r); - - //fprintf(stderr, "getRegFromInstruction - immediate\n"); - return dirregWithName(PCI(pc)->pcop->name); - //return NULL; // PCOR(PCI(pc)->pcop)->r; - - case PO_GPR_BIT: - return PCOR(PCI(pc)->pcop)->r; - - case PO_GPR_REGISTER: - case PO_DIR: - //fprintf(stderr, "getRegFromInstruction - dir\n"); - return PCOR(PCI(pc)->pcop)->r; - case PO_LITERAL: - //fprintf(stderr, "getRegFromInstruction - literal\n"); - break; - - default: - //fprintf(stderr, "getRegFromInstruction - unknown reg type %d\n",PCI(pc)->pcop->type); - //genericPrint(stderr, pc); - break; - } - - return NULL; - + + if(!pc || + !isPCI(pc) || + !PCI(pc)->pcop || + PCI(pc)->num_ops == 0 ) + return NULL; + + switch(PCI(pc)->pcop->type) { + case PO_INDF: + case PO_FSR: + return PCOR(PCI(pc)->pcop)->r; + + // return typeRegWithIdx (PCOR(PCI(pc)->pcop)->rIdx, REG_SFR, 0); + + case PO_BIT: + case PO_GPR_TEMP: + //fprintf(stderr, "getRegFromInstruction - bit or temp\n"); + return PCOR(PCI(pc)->pcop)->r; + + case PO_IMMEDIATE: + if(PCOI(PCI(pc)->pcop)->r) + return (PCOI(PCI(pc)->pcop)->r); + + //fprintf(stderr, "getRegFromInstruction - immediate\n"); + return dirregWithName(PCI(pc)->pcop->name); + //return NULL; // PCOR(PCI(pc)->pcop)->r; + + case PO_GPR_BIT: + return PCOR(PCI(pc)->pcop)->r; + + case PO_GPR_REGISTER: + case PO_DIR: + //fprintf(stderr, "getRegFromInstruction - dir\n"); + return PCOR(PCI(pc)->pcop)->r; + case PO_LITERAL: + //fprintf(stderr, "getRegFromInstruction - literal\n"); + break; + + default: + //fprintf(stderr, "getRegFromInstruction - unknown reg type %d\n",PCI(pc)->pcop->type); + //genericPrint(stderr, pc); + break; + } + + return NULL; + } /*-----------------------------------------------------------------*/ @@ -3702,63 +3713,63 @@ regs * getRegFromInstruction(pCode *pc) void AnalyzepBlock(pBlock *pb) { - pCode *pc; - - if(!pb) - return; - - /* Find all of the registers used in this pBlock - * by looking at each instruction and examining it's - * operands - */ - for(pc = pb->pcHead; pc; pc = pc->next) { - - /* Is this an instruction with operands? */ - if(pc->type == PC_OPCODE && PCI(pc)->pcop) { - - if((PCI(pc)->pcop->type == PO_GPR_TEMP) - || ((PCI(pc)->pcop->type == PO_GPR_BIT) && PCOR(PCI(pc)->pcop)->r && (PCOR(PCI(pc)->pcop)->r->pc_type == PO_GPR_TEMP))) { - - /* Loop through all of the registers declared so far in - this block and see if we find this one there */ - - regs *r = setFirstItem(pb->tregisters); - - while(r) { - if((r->rIdx == PCOR(PCI(pc)->pcop)->r->rIdx) && (r->type == PCOR(PCI(pc)->pcop)->r->type)) { - PCOR(PCI(pc)->pcop)->r = r; - break; - } - r = setNextItem(pb->tregisters); - } - - if(!r) { - /* register wasn't found */ - //r = Safe_calloc(1, sizeof(regs)); - //memcpy(r,PCOR(PCI(pc)->pcop)->r, sizeof(regs)); - //addSet(&pb->tregisters, r); - addSet(&pb->tregisters, PCOR(PCI(pc)->pcop)->r); - //PCOR(PCI(pc)->pcop)->r = r; - //fprintf(stderr,"added register to pblock: reg %d\n",r->rIdx); - }/* else - fprintf(stderr,"found register in pblock: reg %d\n",r->rIdx); - */ - } - if(PCI(pc)->pcop->type == PO_GPR_REGISTER) { - if(PCOR(PCI(pc)->pcop)->r) { - pic14_allocWithIdx (PCOR(PCI(pc)->pcop)->r->rIdx); - DFPRINTF((stderr,"found register in pblock: reg 0x%x\n",PCOR(PCI(pc)->pcop)->r->rIdx)); - } else { - if(PCI(pc)->pcop->name) - fprintf(stderr,"ERROR: %s is a NULL register\n",PCI(pc)->pcop->name ); - else - fprintf(stderr,"ERROR: NULL register\n"); - } - } - } - - - } + pCode *pc; + + if(!pb) + return; + + /* Find all of the registers used in this pBlock + * by looking at each instruction and examining it's + * operands + */ + for(pc = pb->pcHead; pc; pc = pc->next) { + + /* Is this an instruction with operands? */ + if(pc->type == PC_OPCODE && PCI(pc)->pcop) { + + if((PCI(pc)->pcop->type == PO_GPR_TEMP) + || ((PCI(pc)->pcop->type == PO_GPR_BIT) && PCOR(PCI(pc)->pcop)->r && (PCOR(PCI(pc)->pcop)->r->pc_type == PO_GPR_TEMP))) { + + /* Loop through all of the registers declared so far in + this block and see if we find this one there */ + + regs *r = setFirstItem(pb->tregisters); + + while(r) { + if((r->rIdx == PCOR(PCI(pc)->pcop)->r->rIdx) && (r->type == PCOR(PCI(pc)->pcop)->r->type)) { + PCOR(PCI(pc)->pcop)->r = r; + break; + } + r = setNextItem(pb->tregisters); + } + + if(!r) { + /* register wasn't found */ + //r = Safe_calloc(1, sizeof(regs)); + //memcpy(r,PCOR(PCI(pc)->pcop)->r, sizeof(regs)); + //addSet(&pb->tregisters, r); + addSet(&pb->tregisters, PCOR(PCI(pc)->pcop)->r); + //PCOR(PCI(pc)->pcop)->r = r; + //fprintf(stderr,"added register to pblock: reg %d\n",r->rIdx); + }/* else + fprintf(stderr,"found register in pblock: reg %d\n",r->rIdx); + */ + } + if(PCI(pc)->pcop->type == PO_GPR_REGISTER) { + if(PCOR(PCI(pc)->pcop)->r) { + pic14_allocWithIdx (PCOR(PCI(pc)->pcop)->r->rIdx); + DFPRINTF((stderr,"found register in pblock: reg 0x%x\n",PCOR(PCI(pc)->pcop)->r->rIdx)); + } else { + if(PCI(pc)->pcop->name) + fprintf(stderr,"ERROR: %s is a NULL register\n",PCI(pc)->pcop->name ); + else + fprintf(stderr,"ERROR: NULL register\n"); + } + } + } + + + } } /*-----------------------------------------------------------------*/ @@ -3766,14 +3777,14 @@ void AnalyzepBlock(pBlock *pb) /*-----------------------------------------------------------------*/ void InsertpFlow(pCode *pc, pCode **pflow) { - if(*pflow) - PCFL(*pflow)->end = pc; - - if(!pc || !pc->next) - return; - - *pflow = newpCodeFlow(); - pCodeInsertAfter(pc, *pflow); + if(*pflow) + PCFL(*pflow)->end = pc; + + if(!pc || !pc->next) + return; + + *pflow = newpCodeFlow(); + pCodeInsertAfter(pc, *pflow); } /*-----------------------------------------------------------------*/ @@ -3786,91 +3797,91 @@ void InsertpFlow(pCode *pc, pCode **pflow) /*-----------------------------------------------------------------*/ void BuildFlow(pBlock *pb) { - pCode *pc; - pCode *last_pci=NULL; - pCode *pflow=NULL; - int seq = 0; - - if(!pb) - return; - - //fprintf (stderr,"build flow start seq %d ",GpcFlowSeq); - /* Insert a pCodeFlow object at the beginning of a pBlock */ - - InsertpFlow(pb->pcHead, &pflow); - - //pflow = newpCodeFlow(); /* Create a new Flow object */ - //pflow->next = pb->pcHead; /* Make the current head the next object */ - //pb->pcHead->prev = pflow; /* let the current head point back to the flow object */ - //pb->pcHead = pflow; /* Make the Flow object the head */ - //pflow->pb = pb; - - for( pc = findNextInstruction(pb->pcHead); - pc != NULL; - pc=findNextInstruction(pc)) { - - pc->seq = seq++; - PCI(pc)->pcflow = PCFL(pflow); - - //fprintf(stderr," build: "); - //pflow->print(stderr,pflow); - - if( PCI(pc)->isSkip) { - - /* The two instructions immediately following this one - * mark the beginning of a new flow segment */ - - while(pc && PCI(pc)->isSkip) { - - PCI(pc)->pcflow = PCFL(pflow); - pc->seq = seq-1; - seq = 1; - - InsertpFlow(pc, &pflow); - pc=findNextInstruction(pc->next); - } - - seq = 0; - - if(!pc) - break; - - PCI(pc)->pcflow = PCFL(pflow); - pc->seq = 0; - InsertpFlow(pc, &pflow); - - } else if ( PCI(pc)->isBranch && !checkLabel(findNextInstruction(pc->next))) { - - InsertpFlow(pc, &pflow); - seq = 0; - - } else if (checkLabel(pc)) { - - /* This instruction marks the beginning of a - * new flow segment */ - - pc->seq = 0; - seq = 1; - - /* If the previous pCode is not a flow object, then - * insert a new flow object. (This check prevents - * two consecutive flow objects from being insert in - * the case where a skip instruction preceeds an - * instruction containing a label.) */ - - if(last_pci && (PCI(last_pci)->pcflow == PCFL(pflow))) - InsertpFlow(findPrevInstruction(pc->prev), &pflow); - - PCI(pc)->pcflow = PCFL(pflow); - - } - last_pci = pc; - pc = pc->next; - } - - //fprintf (stderr,",end seq %d",GpcFlowSeq); - if(pflow) - PCFL(pflow)->end = pb->pcTail; + pCode *pc; + pCode *last_pci=NULL; + pCode *pflow=NULL; + int seq = 0; + + if(!pb) + return; + + //fprintf (stderr,"build flow start seq %d ",GpcFlowSeq); + /* Insert a pCodeFlow object at the beginning of a pBlock */ + + InsertpFlow(pb->pcHead, &pflow); + + //pflow = newpCodeFlow(); /* Create a new Flow object */ + //pflow->next = pb->pcHead; /* Make the current head the next object */ + //pb->pcHead->prev = pflow; /* let the current head point back to the flow object */ + //pb->pcHead = pflow; /* Make the Flow object the head */ + //pflow->pb = pb; + + for( pc = findNextInstruction(pb->pcHead); + pc != NULL; + pc=findNextInstruction(pc)) { + + pc->seq = seq++; + PCI(pc)->pcflow = PCFL(pflow); + + //fprintf(stderr," build: "); + //pflow->print(stderr,pflow); + + if( PCI(pc)->isSkip) { + + /* The two instructions immediately following this one + * mark the beginning of a new flow segment */ + + while(pc && PCI(pc)->isSkip) { + + PCI(pc)->pcflow = PCFL(pflow); + pc->seq = seq-1; + seq = 1; + + InsertpFlow(pc, &pflow); + pc=findNextInstruction(pc->next); + } + + seq = 0; + + if(!pc) + break; + + PCI(pc)->pcflow = PCFL(pflow); + pc->seq = 0; + InsertpFlow(pc, &pflow); + + } else if ( PCI(pc)->isBranch && !checkLabel(findNextInstruction(pc->next))) { + + InsertpFlow(pc, &pflow); + seq = 0; + + } else if (checkLabel(pc)) { + + /* This instruction marks the beginning of a + * new flow segment */ + + pc->seq = 0; + seq = 1; + + /* If the previous pCode is not a flow object, then + * insert a new flow object. (This check prevents + * two consecutive flow objects from being insert in + * the case where a skip instruction preceeds an + * instruction containing a label.) */ + + if(last_pci && (PCI(last_pci)->pcflow == PCFL(pflow))) + InsertpFlow(findPrevInstruction(pc->prev), &pflow); + + PCI(pc)->pcflow = PCFL(pflow); + + } + last_pci = pc; + pc = pc->next; + } + + //fprintf (stderr,",end seq %d",GpcFlowSeq); + if(pflow) + PCFL(pflow)->end = pb->pcTail; } /*-------------------------------------------------------------------*/ @@ -3882,88 +3893,88 @@ void BuildFlow(pBlock *pb) /*-----------------------------------------------------------------*/ void unBuildFlow(pBlock *pb) { - pCode *pc,*pcnext; - - if(!pb) - return; - - pc = pb->pcHead; - - while(pc) { - pcnext = pc->next; - - if(isPCI(pc)) { - - pc->seq = 0; - if(PCI(pc)->pcflow) { - //free(PCI(pc)->pcflow); - PCI(pc)->pcflow = NULL; - } - - } else if(isPCFL(pc) ) - pc->destruct(pc); - - pc = pcnext; - } - - + pCode *pc,*pcnext; + + if(!pb) + return; + + pc = pb->pcHead; + + while(pc) { + pcnext = pc->next; + + if(isPCI(pc)) { + + pc->seq = 0; + if(PCI(pc)->pcflow) { + //free(PCI(pc)->pcflow); + PCI(pc)->pcflow = NULL; + } + + } else if(isPCFL(pc) ) + pc->destruct(pc); + + pc = pcnext; + } + + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void dumpCond(int cond) { - - static char *pcc_str[] = { - //"PCC_NONE", - "PCC_REGISTER", - "PCC_C", - "PCC_Z", - "PCC_DC", - "PCC_W", - "PCC_EXAMINE_PCOP", - "PCC_REG_BANK0", - "PCC_REG_BANK1", - "PCC_REG_BANK2", - "PCC_REG_BANK3" - }; - - int ncond = sizeof(pcc_str) / sizeof(char *); - int i,j; - - fprintf(stderr, "0x%04X\n",cond); - - for(i=0,j=1; ipc.seq); - - pc = findNextpCode(PCODE(pcflow), PC_OPCODE); - - if(!pc) { - fprintf(stderr, " FlowStats - empty flow (seq=%d)\n", pcflow->pc.seq); - return; - } - - - fprintf(stderr, " FlowStats inCond: "); - dumpCond(pcflow->inCond); - fprintf(stderr, " FlowStats outCond: "); - dumpCond(pcflow->outCond); - + + pCode *pc; + + if(!isPCFL(pcflow)) + return; + + fprintf(stderr, " FlowStats - flow block (seq=%d)\n", pcflow->pc.seq); + + pc = findNextpCode(PCODE(pcflow), PC_OPCODE); + + if(!pc) { + fprintf(stderr, " FlowStats - empty flow (seq=%d)\n", pcflow->pc.seq); + return; + } + + + fprintf(stderr, " FlowStats inCond: "); + dumpCond(pcflow->inCond); + fprintf(stderr, " FlowStats outCond: "); + dumpCond(pcflow->outCond); + } /*-----------------------------------------------------------------* @@ -3986,52 +3997,52 @@ void FlowStats(pCodeFlow *pcflow) static int isBankInstruction(pCode *pc) { - regs *reg; - int bank = -1; - - if(!isPCI(pc)) - return -1; - - if( ( (reg = getRegFromInstruction(pc)) != NULL) && isSTATUS_REG(reg)) { - - // Check to see if the register banks are changing - if(PCI(pc)->isModReg) { - - pCodeOp *pcop = PCI(pc)->pcop; - switch(PCI(pc)->op) { - - case POC_BSF: - if(PCORB(pcop)->bit == PIC_RP0_BIT) { - //fprintf(stderr, " isBankInstruction - Set RP0\n"); - return SET_BANK_BIT | PIC_RP0_BIT; - } - - if(PCORB(pcop)->bit == PIC_RP1_BIT) { - //fprintf(stderr, " isBankInstruction - Set RP1\n"); - return CLR_BANK_BIT | PIC_RP0_BIT; - } - break; - - case POC_BCF: - if(PCORB(pcop)->bit == PIC_RP0_BIT) { - //fprintf(stderr, " isBankInstruction - Clr RP0\n"); - return CLR_BANK_BIT | PIC_RP1_BIT; - } - if(PCORB(pcop)->bit == PIC_RP1_BIT) { - //fprintf(stderr, " isBankInstruction - Clr RP1\n"); - return CLR_BANK_BIT | PIC_RP1_BIT; - } - break; - default: - //fprintf(stderr, " isBankInstruction - Status register is getting Modified by:\n"); - //genericPrint(stderr, pc); - ; - } - } - - } - - return bank; + regs *reg; + int bank = -1; + + if(!isPCI(pc)) + return -1; + + if( ( (reg = getRegFromInstruction(pc)) != NULL) && isSTATUS_REG(reg)) { + + // Check to see if the register banks are changing + if(PCI(pc)->isModReg) { + + pCodeOp *pcop = PCI(pc)->pcop; + switch(PCI(pc)->op) { + + case POC_BSF: + if(PCORB(pcop)->bit == PIC_RP0_BIT) { + //fprintf(stderr, " isBankInstruction - Set RP0\n"); + return SET_BANK_BIT | PIC_RP0_BIT; + } + + if(PCORB(pcop)->bit == PIC_RP1_BIT) { + //fprintf(stderr, " isBankInstruction - Set RP1\n"); + return CLR_BANK_BIT | PIC_RP0_BIT; + } + break; + + case POC_BCF: + if(PCORB(pcop)->bit == PIC_RP0_BIT) { + //fprintf(stderr, " isBankInstruction - Clr RP0\n"); + return CLR_BANK_BIT | PIC_RP1_BIT; + } + if(PCORB(pcop)->bit == PIC_RP1_BIT) { + //fprintf(stderr, " isBankInstruction - Clr RP1\n"); + return CLR_BANK_BIT | PIC_RP1_BIT; + } + break; + default: + //fprintf(stderr, " isBankInstruction - Status register is getting Modified by:\n"); + //genericPrint(stderr, pc); + ; + } + } + + } + + return bank; } */ @@ -4040,40 +4051,40 @@ static int isBankInstruction(pCode *pc) /* static void FillFlow(pCodeFlow *pcflow) { - pCode *pc; - int cur_bank; - - if(!isPCFL(pcflow)) - return; - - // fprintf(stderr, " FillFlow - flow block (seq=%d)\n", pcflow->pc.seq); - - pc = findNextpCode(PCODE(pcflow), PC_OPCODE); - - if(!pc) { - //fprintf(stderr, " FillFlow - empty flow (seq=%d)\n", pcflow->pc.seq); - return; - } - - cur_bank = -1; - - do { - isBankInstruction(pc); - pc = pc->next; - } while (pc && (pc != pcflow->end) && !isPCFL(pc)); - / * - if(!pc ) { - fprintf(stderr, " FillFlow - Bad end of flow\n"); - } else { - fprintf(stderr, " FillFlow - Ending flow with\n "); - pc->print(stderr,pc); - } - - fprintf(stderr, " FillFlow inCond: "); - dumpCond(pcflow->inCond); - fprintf(stderr, " FillFlow outCond: "); - dumpCond(pcflow->outCond); - * / + pCode *pc; + int cur_bank; + + if(!isPCFL(pcflow)) + return; + + // fprintf(stderr, " FillFlow - flow block (seq=%d)\n", pcflow->pc.seq); + + pc = findNextpCode(PCODE(pcflow), PC_OPCODE); + + if(!pc) { + //fprintf(stderr, " FillFlow - empty flow (seq=%d)\n", pcflow->pc.seq); + return; + } + + cur_bank = -1; + + do { + isBankInstruction(pc); + pc = pc->next; + } while (pc && (pc != pcflow->end) && !isPCFL(pc)); + / * + if(!pc ) { + fprintf(stderr, " FillFlow - Bad end of flow\n"); + } else { + fprintf(stderr, " FillFlow - Ending flow with\n "); + pc->print(stderr,pc); + } + + fprintf(stderr, " FillFlow inCond: "); + dumpCond(pcflow->inCond); + fprintf(stderr, " FillFlow outCond: "); + dumpCond(pcflow->outCond); + * / } */ @@ -4081,17 +4092,17 @@ static void FillFlow(pCodeFlow *pcflow) /*-----------------------------------------------------------------*/ void LinkFlow_pCode(pCodeInstruction *from, pCodeInstruction *to) { - pCodeFlowLink *fromLink, *toLink; - - if(!from || !to || !to->pcflow || !from->pcflow) - return; - - fromLink = newpCodeFlowLink(from->pcflow); - toLink = newpCodeFlowLink(to->pcflow); - - addSetIfnotP(&(from->pcflow->to), toLink); //to->pcflow); - addSetIfnotP(&(to->pcflow->from), fromLink); //from->pcflow); - + pCodeFlowLink *fromLink, *toLink; + + if(!from || !to || !to->pcflow || !from->pcflow) + return; + + fromLink = newpCodeFlowLink(from->pcflow); + toLink = newpCodeFlowLink(to->pcflow); + + addSetIfnotP(&(from->pcflow->to), toLink); //to->pcflow); + addSetIfnotP(&(to->pcflow->from), fromLink); //from->pcflow); + } /*-----------------------------------------------------------------* @@ -4105,79 +4116,79 @@ void LinkFlow_pCode(pCodeInstruction *from, pCodeInstruction *to) *-----------------------------------------------------------------*/ void LinkFlow(pBlock *pb) { - pCode *pc=NULL; - pCode *pcflow; - pCode *pct; - - //fprintf(stderr,"linkflow \n"); - - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - if(!isPCFL(pcflow)) - fprintf(stderr, "LinkFlow - pcflow is not a flow object "); - - //fprintf(stderr," link: "); - //pcflow->print(stderr,pcflow); - - //FillFlow(PCFL(pcflow)); - - pc = PCFL(pcflow)->end; - - //fprintf(stderr, "LinkFlow - flow block (seq=%d) ", pcflow->seq); - if(isPCI_SKIP(pc)) { - //fprintf(stderr, "ends with skip\n"); - //pc->print(stderr,pc); - pct=findNextInstruction(pc->next); - LinkFlow_pCode(PCI(pc),PCI(pct)); - pct=findNextInstruction(pct->next); - LinkFlow_pCode(PCI(pc),PCI(pct)); - continue; - } - - if(isPCI_BRANCH(pc)) { - pCodeOpLabel *pcol = PCOLAB(PCI(pc)->pcop); - - //fprintf(stderr, "ends with branch\n "); - //pc->print(stderr,pc); - - if(!(pcol && isPCOLAB(pcol))) { - if((PCI(pc)->op != POC_RETLW) && (PCI(pc)->op != POC_RETURN) && (PCI(pc)->op != POC_CALL) && (PCI(pc)->op != POC_RETFIE) ) { - pc->print(stderr,pc); - fprintf(stderr, "ERROR: %s, branch instruction doesn't have label\n",__FUNCTION__); - } - continue; - } - - if( (pct = findLabelinpBlock(pb,pcol)) != NULL) - LinkFlow_pCode(PCI(pc),PCI(pct)); - else - fprintf(stderr, "ERROR: %s, couldn't find label. key=%d,lab=%s\n", - __FUNCTION__,pcol->key,((PCOP(pcol)->name)?PCOP(pcol)->name:"-")); - //fprintf(stderr,"newpCodeOpLabel: key=%d, name=%s\n",key,((s)?s:"")); - - continue; - } - - if(isPCI(pc)) { - //fprintf(stderr, "ends with non-branching instruction:\n"); - //pc->print(stderr,pc); - - LinkFlow_pCode(PCI(pc),PCI(findNextInstruction(pc->next))); - - continue; - } - - if(pc) { - //fprintf(stderr, "ends with unknown\n"); - //pc->print(stderr,pc); - continue; - } - - //fprintf(stderr, "ends with nothing: ERROR\n"); - - } + pCode *pc=NULL; + pCode *pcflow; + pCode *pct; + + //fprintf(stderr,"linkflow \n"); + + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + if(!isPCFL(pcflow)) + fprintf(stderr, "LinkFlow - pcflow is not a flow object "); + + //fprintf(stderr," link: "); + //pcflow->print(stderr,pcflow); + + //FillFlow(PCFL(pcflow)); + + pc = PCFL(pcflow)->end; + + //fprintf(stderr, "LinkFlow - flow block (seq=%d) ", pcflow->seq); + if(isPCI_SKIP(pc)) { + //fprintf(stderr, "ends with skip\n"); + //pc->print(stderr,pc); + pct=findNextInstruction(pc->next); + LinkFlow_pCode(PCI(pc),PCI(pct)); + pct=findNextInstruction(pct->next); + LinkFlow_pCode(PCI(pc),PCI(pct)); + continue; + } + + if(isPCI_BRANCH(pc)) { + pCodeOpLabel *pcol = PCOLAB(PCI(pc)->pcop); + + //fprintf(stderr, "ends with branch\n "); + //pc->print(stderr,pc); + + if(!(pcol && isPCOLAB(pcol))) { + if((PCI(pc)->op != POC_RETLW) && (PCI(pc)->op != POC_RETURN) && (PCI(pc)->op != POC_CALL) && (PCI(pc)->op != POC_RETFIE) ) { + pc->print(stderr,pc); + fprintf(stderr, "ERROR: %s, branch instruction doesn't have label\n",__FUNCTION__); + } + continue; + } + + if( (pct = findLabelinpBlock(pb,pcol)) != NULL) + LinkFlow_pCode(PCI(pc),PCI(pct)); + else + fprintf(stderr, "ERROR: %s, couldn't find label. key=%d,lab=%s\n", + __FUNCTION__,pcol->key,((PCOP(pcol)->name)?PCOP(pcol)->name:"-")); + //fprintf(stderr,"newpCodeOpLabel: key=%d, name=%s\n",key,((s)?s:"")); + + continue; + } + + if(isPCI(pc)) { + //fprintf(stderr, "ends with non-branching instruction:\n"); + //pc->print(stderr,pc); + + LinkFlow_pCode(PCI(pc),PCI(findNextInstruction(pc->next))); + + continue; + } + + if(pc) { + //fprintf(stderr, "ends with unknown\n"); + //pc->print(stderr,pc); + continue; + } + + //fprintf(stderr, "ends with nothing: ERROR\n"); + + } } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ @@ -4186,17 +4197,17 @@ void LinkFlow(pBlock *pb) /*-----------------------------------------------------------------*/ int isPCinFlow(pCode *pc, pCode *pcflow) { - - if(!pc || !pcflow) - return 0; - - if(!isPCI(pc) || !PCI(pc)->pcflow || !isPCFL(pcflow) ) - return 0; - - if( PCI(pc)->pcflow->pc.seq == pcflow->seq) - return 1; - - return 0; + + if(!pc || !pcflow) + return 0; + + if(!isPCI(pc) || !PCI(pc)->pcflow || !isPCFL(pcflow) ) + return 0; + + if( PCI(pc)->pcflow->pc.seq == pcflow->seq) + return 1; + + return 0; } /*-----------------------------------------------------------------*/ @@ -4204,64 +4215,64 @@ int isPCinFlow(pCode *pc, pCode *pcflow) /* static void BanksUsedFlow2(pCode *pcflow) { - pCode *pc=NULL; - - int bank = -1; - bool RegUsed = 0; - - regs *reg; - - if(!isPCFL(pcflow)) { - fprintf(stderr, "BanksUsed - pcflow is not a flow object "); - return; - } - - pc = findNextInstruction(pcflow->next); - - PCFL(pcflow)->lastBank = -1; - - while(isPCinFlow(pc,pcflow)) { - - int bank_selected = isBankInstruction(pc); - - //if(PCI(pc)->pcflow) - //fprintf(stderr,"BanksUsedFlow2, looking at seq %d\n",PCI(pc)->pcflow->pc.seq); - - if(bank_selected > 0) { - //fprintf(stderr,"BanksUsed - mucking with bank %d\n",bank_selected); - - // This instruction is modifying banking bits before accessing registers - if(!RegUsed) - PCFL(pcflow)->firstBank = -1; - - if(PCFL(pcflow)->lastBank == -1) - PCFL(pcflow)->lastBank = 0; - - bank = (1 << (bank_selected & (PIC_RP0_BIT | PIC_RP1_BIT))); - if(bank_selected & SET_BANK_BIT) - PCFL(pcflow)->lastBank |= bank; - - - } else { - reg = getRegFromInstruction(pc); - - if(reg && !isREGinBank(reg, bank)) { - int allbanks = REGallBanks(reg); - if(bank == -1) - PCFL(pcflow)->firstBank = allbanks; - - PCFL(pcflow)->lastBank = allbanks; - - bank = allbanks; - } - RegUsed = 1; - } - - pc = findNextInstruction(pc->next); - } - - // fprintf(stderr,"BanksUsedFlow2 flow seq=%3d, first bank = 0x%03x, Last bank 0x%03x\n", - // pcflow->seq,PCFL(pcflow)->firstBank,PCFL(pcflow)->lastBank); + pCode *pc=NULL; + + int bank = -1; + bool RegUsed = 0; + + regs *reg; + + if(!isPCFL(pcflow)) { + fprintf(stderr, "BanksUsed - pcflow is not a flow object "); + return; + } + + pc = findNextInstruction(pcflow->next); + + PCFL(pcflow)->lastBank = -1; + + while(isPCinFlow(pc,pcflow)) { + + int bank_selected = isBankInstruction(pc); + + //if(PCI(pc)->pcflow) + //fprintf(stderr,"BanksUsedFlow2, looking at seq %d\n",PCI(pc)->pcflow->pc.seq); + + if(bank_selected > 0) { + //fprintf(stderr,"BanksUsed - mucking with bank %d\n",bank_selected); + + // This instruction is modifying banking bits before accessing registers + if(!RegUsed) + PCFL(pcflow)->firstBank = -1; + + if(PCFL(pcflow)->lastBank == -1) + PCFL(pcflow)->lastBank = 0; + + bank = (1 << (bank_selected & (PIC_RP0_BIT | PIC_RP1_BIT))); + if(bank_selected & SET_BANK_BIT) + PCFL(pcflow)->lastBank |= bank; + + + } else { + reg = getRegFromInstruction(pc); + + if(reg && !isREGinBank(reg, bank)) { + int allbanks = REGallBanks(reg); + if(bank == -1) + PCFL(pcflow)->firstBank = allbanks; + + PCFL(pcflow)->lastBank = allbanks; + + bank = allbanks; + } + RegUsed = 1; + } + + pc = findNextInstruction(pc->next); + } + + // fprintf(stderr,"BanksUsedFlow2 flow seq=%3d, first bank = 0x%03x, Last bank 0x%03x\n", + // pcflow->seq,PCFL(pcflow)->firstBank,PCFL(pcflow)->lastBank); } */ /*-----------------------------------------------------------------*/ @@ -4272,17 +4283,17 @@ static void BanksUsedFlow(pBlock *pb) pCode *pcflow; - //pb->pcHead->print(stderr, pb->pcHead); - - pcflow = findNextpCode(pb->pcHead, PC_FLOW); - //pcflow->print(stderr,pcflow); + //pb->pcHead->print(stderr, pb->pcHead); + + pcflow = findNextpCode(pb->pcHead, PC_FLOW); + //pcflow->print(stderr,pcflow); - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - BanksUsedFlow2(pcflow); - } + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + BanksUsedFlow2(pcflow); + } } */ @@ -4291,52 +4302,52 @@ pCode *pcflow; /*-----------------------------------------------------------------*/ static void pCodeInstructionInsertAfter(pCodeInstruction *pci, pCodeInstruction *new_pci) { - - pCodeInsertAfter(pci->pc.prev, &new_pci->pc); - - /* Move the label, if there is one */ - - if(pci->label) { - new_pci->label = pci->label; - pci->label = NULL; - } - - /* Move the C code comment, if there is one */ - - if(pci->cline) { - new_pci->cline = pci->cline; - pci->cline = NULL; - } - - /* The new instruction has the same pcflow block */ - new_pci->pcflow = pci->pcflow; - + + pCodeInsertAfter(pci->pc.prev, &new_pci->pc); + + /* Move the label, if there is one */ + + if(pci->label) { + new_pci->label = pci->label; + pci->label = NULL; + } + + /* Move the C code comment, if there is one */ + + if(pci->cline) { + new_pci->cline = pci->cline; + pci->cline = NULL; + } + + /* The new instruction has the same pcflow block */ + new_pci->pcflow = pci->pcflow; + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ static void insertBankSwitch(pCodeInstruction *pci, int Set_Clear, int RP_BankBit) { - pCode *new_pc; - - new_pc = newpCode((Set_Clear?POC_BSF:POC_BCF),popCopyGPR2Bit(PCOP(&pc_status),RP_BankBit)); - - pCodeInstructionInsertAfter(pci, PCI(new_pc)); + pCode *new_pc; + + new_pc = newpCode((Set_Clear?POC_BSF:POC_BCF),popCopyGPR2Bit(PCOP(&pc_status),RP_BankBit)); + + pCodeInstructionInsertAfter(pci, PCI(new_pc)); } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ static void insertBankSel(pCodeInstruction *pci, const char *name) { - pCode *new_pc; - - pCodeOp *pcop = popCopyReg(PCOR(pci->pcop)); - pcop->type = PO_GPR_REGISTER; // Sometimes the type is set to legacy 8051 - so override it - if (pcop->name == 0) - pcop->name = strdup(name); - new_pc = newpCode(POC_BANKSEL, pcop); - - pCodeInstructionInsertAfter(pci, PCI(new_pc)); + pCode *new_pc; + + pCodeOp *pcop = popCopyReg(PCOR(pci->pcop)); + pcop->type = PO_GPR_REGISTER; // Sometimes the type is set to legacy 8051 - so override it + if (pcop->name == 0) + pcop->name = strdup(name); + new_pc = newpCode(POC_BANKSEL, pcop); + + pCodeInstructionInsertAfter(pci, PCI(new_pc)); } /*-----------------------------------------------------------------*/ @@ -4352,62 +4363,62 @@ static void insertBankSel(pCodeInstruction *pci, const char *name) static int LastRegIdx; /* If the previous register is the same one again then no need to change bank. */ static int BankSelect(pCodeInstruction *pci, int cur_bank, regs *reg) { - int bank; - int a = reg->alias>>7; - if ((a&3) == 3) { - return cur_bank; // This register is available in all banks - } else if ((a&1)&&((cur_bank==0)||(cur_bank==1))) { - return cur_bank; // This register is available in banks 0 & 1 - } else if (a&2) { - if (reg->address&0x80) { - if ((cur_bank==1)||(cur_bank==3)) { - return cur_bank; // This register is available in banks 1 & 3 - } - } else { - if ((cur_bank==0)||(cur_bank==1)) { - return cur_bank; // This register is available in banks 0 & 2 - } - } - } - - if (LastRegIdx == reg->rIdx) // If this is the same register as last time then it is in same bank - return cur_bank; - LastRegIdx = reg->rIdx; - - if (reg->isFixed) { - bank = REG_BANK(reg); - } else if (reg->isExtern) { - bank = 'E'; // Unfixed extern registers are allocated by the linker therefore its bank is unknown - } else { - bank = 'L'; // Unfixed local registers are allocated by the linker therefore its bank is unknown - } - if ((cur_bank == 'L')&&(bank == 'L')) { // If current bank and new bank are both allocated locally by the linker, then assume it is in same bank. - return 'L'; // Local registers are presumed to be in same linker assigned bank - } else if ((bank == 'L')&&(cur_bank != 'L')) { // Reg is now local and linker to assign bank - insertBankSel(pci, reg->name); // Let linker choose the bank selection - } else if (bank == 'E') { // Reg is now extern and linker to assign bank - insertBankSel(pci, reg->name); // Let linker choose the bank selection - } else if ((cur_bank == -1)||(cur_bank == 'L')||(cur_bank == 'E')) { // Current bank unknown and new register bank is known then can set bank bits - insertBankSwitch(pci, bank&1, PIC_RP0_BIT); - insertBankSwitch(pci, bank&2, PIC_RP1_BIT); - } else { // Current bank and new register banks known - can set bank bits - switch((cur_bank^bank) & 3) { - case 0: - break; - case 1: - insertBankSwitch(pci, bank&1, PIC_RP0_BIT); - break; - case 2: - insertBankSwitch(pci, bank&2, PIC_RP1_BIT); - break; - case 3: - insertBankSwitch(pci, bank&1, PIC_RP0_BIT); - insertBankSwitch(pci, bank&2, PIC_RP1_BIT); - break; - } - } - - return bank; + int bank; + int a = reg->alias>>7; + if ((a&3) == 3) { + return cur_bank; // This register is available in all banks + } else if ((a&1)&&((cur_bank==0)||(cur_bank==1))) { + return cur_bank; // This register is available in banks 0 & 1 + } else if (a&2) { + if (reg->address&0x80) { + if ((cur_bank==1)||(cur_bank==3)) { + return cur_bank; // This register is available in banks 1 & 3 + } + } else { + if ((cur_bank==0)||(cur_bank==1)) { + return cur_bank; // This register is available in banks 0 & 2 + } + } + } + + if (LastRegIdx == reg->rIdx) // If this is the same register as last time then it is in same bank + return cur_bank; + LastRegIdx = reg->rIdx; + + if (reg->isFixed) { + bank = REG_BANK(reg); + } else if (reg->isExtern) { + bank = 'E'; // Unfixed extern registers are allocated by the linker therefore its bank is unknown + } else { + bank = 'L'; // Unfixed local registers are allocated by the linker therefore its bank is unknown + } + if ((cur_bank == 'L')&&(bank == 'L')) { // If current bank and new bank are both allocated locally by the linker, then assume it is in same bank. + return 'L'; // Local registers are presumed to be in same linker assigned bank + } else if ((bank == 'L')&&(cur_bank != 'L')) { // Reg is now local and linker to assign bank + insertBankSel(pci, reg->name); // Let linker choose the bank selection + } else if (bank == 'E') { // Reg is now extern and linker to assign bank + insertBankSel(pci, reg->name); // Let linker choose the bank selection + } else if ((cur_bank == -1)||(cur_bank == 'L')||(cur_bank == 'E')) { // Current bank unknown and new register bank is known then can set bank bits + insertBankSwitch(pci, bank&1, PIC_RP0_BIT); + insertBankSwitch(pci, bank&2, PIC_RP1_BIT); + } else { // Current bank and new register banks known - can set bank bits + switch((cur_bank^bank) & 3) { + case 0: + break; + case 1: + insertBankSwitch(pci, bank&1, PIC_RP0_BIT); + break; + case 2: + insertBankSwitch(pci, bank&2, PIC_RP1_BIT); + break; + case 3: + insertBankSwitch(pci, bank&1, PIC_RP0_BIT); + insertBankSwitch(pci, bank&2, PIC_RP1_BIT); + break; + } + } + + return bank; } /*-----------------------------------------------------------------*/ @@ -4415,124 +4426,124 @@ static int BankSelect(pCodeInstruction *pci, int cur_bank, regs *reg) /* cur_bank to match. */ /*-----------------------------------------------------------------*/ static int IsBankChange(pCode *pc, regs *reg, int *cur_bank) { - - if (isSTATUS_REG(reg)) { - - if (PCI(pc)->op == POC_BCF) { - int old_bank = *cur_bank; - if (PCORB(PCI(pc)->pcop)->bit == PIC_RP0_BIT) { - /* If current bank is unknown or linker assigned then set to 0 else just change the bit */ - if (*cur_bank & ~(0x3)) - *cur_bank = 0; - else - *cur_bank = *cur_bank&0x2; - LastRegIdx = reg->rIdx; - } else if (PCORB(PCI(pc)->pcop)->bit == PIC_RP1_BIT) { - /* If current bank is unknown or linker assigned then set to 0 else just change the bit */ - if (*cur_bank & ~(0x3)) - *cur_bank = 0; - else - *cur_bank = *cur_bank&0x1; - LastRegIdx = reg->rIdx; - } - return old_bank != *cur_bank; - } - - if (PCI(pc)->op == POC_BSF) { - int old_bank = *cur_bank; - if (PCORB(PCI(pc)->pcop)->bit == PIC_RP0_BIT) { - /* If current bank is unknown or linker assigned then set to bit else just change the bit */ - if (*cur_bank & ~(0x3)) - *cur_bank = 0x1; - else - *cur_bank = (*cur_bank&0x2) | 0x1; - LastRegIdx = reg->rIdx; - } else if (PCORB(PCI(pc)->pcop)->bit == PIC_RP1_BIT) { - /* If current bank is unknown or linker assigned then set to bit else just change the bit */ - if (*cur_bank & ~(0x3)) - *cur_bank = 0x2; - else - *cur_bank = (*cur_bank&0x1) | 0x2; - LastRegIdx = reg->rIdx; - } - return old_bank != *cur_bank; - } - - } else if (PCI(pc)->op == POC_BANKSEL) { - int old_bank = *cur_bank; - *cur_bank = (PCOR(PCI(pc)->pcop)->r->isExtern) ? 'E' : 'L'; - LastRegIdx = reg->rIdx; - return old_bank != *cur_bank; - } - - return 0; + + if (isSTATUS_REG(reg)) { + + if (PCI(pc)->op == POC_BCF) { + int old_bank = *cur_bank; + if (PCORB(PCI(pc)->pcop)->bit == PIC_RP0_BIT) { + /* If current bank is unknown or linker assigned then set to 0 else just change the bit */ + if (*cur_bank & ~(0x3)) + *cur_bank = 0; + else + *cur_bank = *cur_bank&0x2; + LastRegIdx = reg->rIdx; + } else if (PCORB(PCI(pc)->pcop)->bit == PIC_RP1_BIT) { + /* If current bank is unknown or linker assigned then set to 0 else just change the bit */ + if (*cur_bank & ~(0x3)) + *cur_bank = 0; + else + *cur_bank = *cur_bank&0x1; + LastRegIdx = reg->rIdx; + } + return old_bank != *cur_bank; + } + + if (PCI(pc)->op == POC_BSF) { + int old_bank = *cur_bank; + if (PCORB(PCI(pc)->pcop)->bit == PIC_RP0_BIT) { + /* If current bank is unknown or linker assigned then set to bit else just change the bit */ + if (*cur_bank & ~(0x3)) + *cur_bank = 0x1; + else + *cur_bank = (*cur_bank&0x2) | 0x1; + LastRegIdx = reg->rIdx; + } else if (PCORB(PCI(pc)->pcop)->bit == PIC_RP1_BIT) { + /* If current bank is unknown or linker assigned then set to bit else just change the bit */ + if (*cur_bank & ~(0x3)) + *cur_bank = 0x2; + else + *cur_bank = (*cur_bank&0x1) | 0x2; + LastRegIdx = reg->rIdx; + } + return old_bank != *cur_bank; + } + + } else if (PCI(pc)->op == POC_BANKSEL) { + int old_bank = *cur_bank; + *cur_bank = (PCOR(PCI(pc)->pcop)->r->isExtern) ? 'E' : 'L'; + LastRegIdx = reg->rIdx; + return old_bank != *cur_bank; + } + + return 0; } /*-----------------------------------------------------------------*/ /* Set bank selection if necessary */ /*-----------------------------------------------------------------*/ static int DoBankSelect(pCode *pc, int cur_bank) { - pCode *pcprev; - regs *reg; - - if(!isPCI(pc)) - return cur_bank; - - if (isCALL(pc)) { - pCode *pcf = findFunction(get_op_from_instruction(PCI(pc))); - if (pcf && isPCF(pcf)) { - pCode *pcfr; - int rbank = 'U'; // Undetermined - FixRegisterBanking(pcf->pb,cur_bank); // Ensure this block has had its banks selection done - // Check all the returns to work out what bank is selected - for (pcfr=pcf->pb->pcHead; pcfr; pcfr=pcfr->next) { - if (isPCI(pcfr)) { - if ((PCI(pcfr)->op==POC_RETURN) || (PCI(pcfr)->op==POC_RETLW)) { - if (rbank == 'U') - rbank = PCFL(pcfr)->lastBank; - else - if (rbank != PCFL(pcfr)->lastBank) - return -1; // Unknown bank - multiple returns with different banks - } - } - } - if (rbank == 'U') - return -1; // Unknown bank - return rbank; - } else if (isPCOS(PCI(pc)->pcop) && PCOS(PCI(pc)->pcop)->isPublic) { - /* Extern functions may use registers in different bank - must call banksel */ - return -1; /* Unknown bank */ - } - } - - if ((isPCI(pc)) && (PCI(pc)->op == POC_BANKSEL)) { - return -1; /* New bank unknown - linkers choice. */ - } - - reg = getRegFromInstruction(pc); - if (reg) { - - if (IsBankChange(pc,reg,&cur_bank)) - return cur_bank; - - if (!isPCI_LIT(pc)) { - - /* Examine the instruction before this one to make sure it is - * not a skip type instruction */ - pcprev = findPrevpCode(pc->prev, PC_OPCODE); - - if(!pcprev || (pcprev && !isPCI_SKIP(pcprev))) { - cur_bank = BankSelect(PCI(pc),cur_bank,reg); - } else { - cur_bank = BankSelect(PCI(pcprev),cur_bank,reg); - } - if (!PCI(pc)->pcflow) - fprintf(stderr,"PCI ID=%d missing flow pointer ???\n",pc->id); - else - PCI(pc)->pcflow->lastBank = cur_bank; /* Maintain pCodeFlow lastBank state */ - } - } - return cur_bank; + pCode *pcprev; + regs *reg; + + if(!isPCI(pc)) + return cur_bank; + + if (isCALL(pc)) { + pCode *pcf = findFunction(get_op_from_instruction(PCI(pc))); + if (pcf && isPCF(pcf)) { + pCode *pcfr; + int rbank = 'U'; // Undetermined + FixRegisterBanking(pcf->pb,cur_bank); // Ensure this block has had its banks selection done + // Check all the returns to work out what bank is selected + for (pcfr=pcf->pb->pcHead; pcfr; pcfr=pcfr->next) { + if (isPCI(pcfr)) { + if ((PCI(pcfr)->op==POC_RETURN) || (PCI(pcfr)->op==POC_RETLW)) { + if (rbank == 'U') + rbank = PCFL(pcfr)->lastBank; + else + if (rbank != PCFL(pcfr)->lastBank) + return -1; // Unknown bank - multiple returns with different banks + } + } + } + if (rbank == 'U') + return -1; // Unknown bank + return rbank; + } else if (isPCOS(PCI(pc)->pcop) && PCOS(PCI(pc)->pcop)->isPublic) { + /* Extern functions may use registers in different bank - must call banksel */ + return -1; /* Unknown bank */ + } + } + + if ((isPCI(pc)) && (PCI(pc)->op == POC_BANKSEL)) { + return -1; /* New bank unknown - linkers choice. */ + } + + reg = getRegFromInstruction(pc); + if (reg) { + + if (IsBankChange(pc,reg,&cur_bank)) + return cur_bank; + + if (!isPCI_LIT(pc)) { + + /* Examine the instruction before this one to make sure it is + * not a skip type instruction */ + pcprev = findPrevpCode(pc->prev, PC_OPCODE); + + if(!pcprev || (pcprev && !isPCI_SKIP(pcprev))) { + cur_bank = BankSelect(PCI(pc),cur_bank,reg); + } else { + cur_bank = BankSelect(PCI(pcprev),cur_bank,reg); + } + if (!PCI(pc)->pcflow) + fprintf(stderr,"PCI ID=%d missing flow pointer ???\n",pc->id); + else + PCI(pc)->pcflow->lastBank = cur_bank; /* Maintain pCodeFlow lastBank state */ + } + } + return cur_bank; } /*-----------------------------------------------------------------*/ @@ -4540,26 +4551,26 @@ static int DoBankSelect(pCode *pc, int cur_bank) { /* static void FixRegisterBankingInFlow(pCodeFlow *pcfl, int cur_bank) { - pCode *pc=NULL; - pCode *pcprev=NULL; + pCode *pc=NULL; + pCode *pcprev=NULL; - if(!pcfl) - return; + if(!pcfl) + return; - pc = findNextInstruction(pcfl->pc.next); - - while(isPCinFlow(pc,PCODE(pcfl))) { + pc = findNextInstruction(pcfl->pc.next); + + while(isPCinFlow(pc,PCODE(pcfl))) { - cur_bank = DoBankSelect(pc,cur_bank); - pcprev = pc; - pc = findNextInstruction(pc->next); - - } + cur_bank = DoBankSelect(pc,cur_bank); + pcprev = pc; + pc = findNextInstruction(pc->next); + + } - if(pcprev && cur_bank) { - // Set bank state to unknown at the end of each flow block - cur_bank = -1; - } + if(pcprev && cur_bank) { + // Set bank state to unknown at the end of each flow block + cur_bank = -1; + } } */ @@ -4570,49 +4581,49 @@ static void FixRegisterBankingInFlow(pCodeFlow *pcfl, int cur_bank) /* int compareBankFlow(pCodeFlow *pcflow, pCodeFlowLink *pcflowLink, int toORfrom) { - - if(!pcflow || !pcflowLink || !pcflowLink->pcflow) - return 0; - - if(!isPCFL(pcflow) || !isPCFL(pcflowLink->pcflow)) - return 0; - - if(pcflow->firstBank == -1) - return 0; - - - if(pcflowLink->pcflow->firstBank == -1) { - pCodeFlowLink *pctl = setFirstItem( toORfrom ? - pcflowLink->pcflow->to : - pcflowLink->pcflow->from); - return compareBankFlow(pcflow, pctl, toORfrom); - } - - if(toORfrom) { - if(pcflow->lastBank == pcflowLink->pcflow->firstBank) - return 0; - - pcflowLink->bank_conflict++; - pcflowLink->pcflow->FromConflicts++; - pcflow->ToConflicts++; - } else { - - if(pcflow->firstBank == pcflowLink->pcflow->lastBank) - return 0; - - pcflowLink->bank_conflict++; - pcflowLink->pcflow->ToConflicts++; - pcflow->FromConflicts++; - - } - / * - fprintf(stderr,"compare flow found conflict: seq %d from conflicts %d, to conflicts %d\n", - pcflowLink->pcflow->pc.seq, - pcflowLink->pcflow->FromConflicts, - pcflowLink->pcflow->ToConflicts); - * / - return 1; - + + if(!pcflow || !pcflowLink || !pcflowLink->pcflow) + return 0; + + if(!isPCFL(pcflow) || !isPCFL(pcflowLink->pcflow)) + return 0; + + if(pcflow->firstBank == -1) + return 0; + + + if(pcflowLink->pcflow->firstBank == -1) { + pCodeFlowLink *pctl = setFirstItem( toORfrom ? + pcflowLink->pcflow->to : + pcflowLink->pcflow->from); + return compareBankFlow(pcflow, pctl, toORfrom); + } + + if(toORfrom) { + if(pcflow->lastBank == pcflowLink->pcflow->firstBank) + return 0; + + pcflowLink->bank_conflict++; + pcflowLink->pcflow->FromConflicts++; + pcflow->ToConflicts++; + } else { + + if(pcflow->firstBank == pcflowLink->pcflow->lastBank) + return 0; + + pcflowLink->bank_conflict++; + pcflowLink->pcflow->ToConflicts++; + pcflow->FromConflicts++; + + } + / * + fprintf(stderr,"compare flow found conflict: seq %d from conflicts %d, to conflicts %d\n", + pcflowLink->pcflow->pc.seq, + pcflowLink->pcflow->FromConflicts, + pcflowLink->pcflow->ToConflicts); + * / + return 1; + } */ /*-----------------------------------------------------------------*/ @@ -4620,148 +4631,148 @@ int compareBankFlow(pCodeFlow *pcflow, pCodeFlowLink *pcflowLink, int toORfrom) /* void FixBankFlow(pBlock *pb) { - pCode *pc=NULL; - pCode *pcflow; - pCodeFlowLink *pcfl; - - pCode *pcflow_max_To=NULL; - pCode *pcflow_max_From=NULL; - int max_ToConflicts=0; - int max_FromConflicts=0; - - //fprintf(stderr,"Fix Bank flow \n"); - pcflow = findNextpCode(pb->pcHead, PC_FLOW); - - - / * - First loop through all of the flow objects in this pcode block - and fix the ones that have banking conflicts between the - entry and exit. - * / - - //fprintf(stderr, "FixBankFlow - Phase 1\n"); - - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - if(!isPCFL(pcflow)) { - fprintf(stderr, "FixBankFlow - pcflow is not a flow object "); - continue; - } - - if(PCFL(pcflow)->firstBank != PCFL(pcflow)->lastBank && - PCFL(pcflow)->firstBank >= 0 && - PCFL(pcflow)->lastBank >= 0 ) { - - int cur_bank = (PCFL(pcflow)->firstBank < PCFL(pcflow)->lastBank) ? - PCFL(pcflow)->firstBank : PCFL(pcflow)->lastBank; - - FixRegisterBankingInFlow(PCFL(pcflow),cur_bank); - BanksUsedFlow2(pcflow); - - } - } - - //fprintf(stderr, "FixBankFlow - Phase 2\n"); - - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - int nFlows; - int nConflicts; - - if(!isPCFL(pcflow)) { - fprintf(stderr, "FixBankFlow - pcflow is not a flow object "); - continue; - } - - PCFL(pcflow)->FromConflicts = 0; - PCFL(pcflow)->ToConflicts = 0; - - nFlows = 0; - nConflicts = 0; - - //fprintf(stderr, " FixBankFlow flow seq %d\n",pcflow->seq); - pcfl = setFirstItem(PCFL(pcflow)->from); - while (pcfl) { + pCode *pc=NULL; + pCode *pcflow; + pCodeFlowLink *pcfl; + + pCode *pcflow_max_To=NULL; + pCode *pcflow_max_From=NULL; + int max_ToConflicts=0; + int max_FromConflicts=0; + + //fprintf(stderr,"Fix Bank flow \n"); + pcflow = findNextpCode(pb->pcHead, PC_FLOW); + + + / * + First loop through all of the flow objects in this pcode block + and fix the ones that have banking conflicts between the + entry and exit. + * / + + //fprintf(stderr, "FixBankFlow - Phase 1\n"); + + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + if(!isPCFL(pcflow)) { + fprintf(stderr, "FixBankFlow - pcflow is not a flow object "); + continue; + } + + if(PCFL(pcflow)->firstBank != PCFL(pcflow)->lastBank && + PCFL(pcflow)->firstBank >= 0 && + PCFL(pcflow)->lastBank >= 0 ) { + + int cur_bank = (PCFL(pcflow)->firstBank < PCFL(pcflow)->lastBank) ? + PCFL(pcflow)->firstBank : PCFL(pcflow)->lastBank; + + FixRegisterBankingInFlow(PCFL(pcflow),cur_bank); + BanksUsedFlow2(pcflow); + + } + } + + //fprintf(stderr, "FixBankFlow - Phase 2\n"); + + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + int nFlows; + int nConflicts; + + if(!isPCFL(pcflow)) { + fprintf(stderr, "FixBankFlow - pcflow is not a flow object "); + continue; + } + + PCFL(pcflow)->FromConflicts = 0; + PCFL(pcflow)->ToConflicts = 0; + + nFlows = 0; + nConflicts = 0; + + //fprintf(stderr, " FixBankFlow flow seq %d\n",pcflow->seq); + pcfl = setFirstItem(PCFL(pcflow)->from); + while (pcfl) { + + pc = PCODE(pcfl->pcflow); + + if(!isPCFL(pc)) { + fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); + pc->print(stderr,pc); + } + + nConflicts += compareBankFlow(PCFL(pcflow), pcfl, 0); + nFlows++; + + pcfl=setNextItem(PCFL(pcflow)->from); + } + + if((nFlows >= 2) && nConflicts && (PCFL(pcflow)->firstBank>0)) { + //fprintf(stderr, " From conflicts flow seq %d, nflows %d ,nconflicts %d\n",pcflow->seq,nFlows, nConflicts); + + FixRegisterBankingInFlow(PCFL(pcflow),-1); + BanksUsedFlow2(pcflow); + + continue; / * Don't need to check the flow from here - it's already been fixed * / + + } + + nFlows = 0; + nConflicts = 0; + + pcfl = setFirstItem(PCFL(pcflow)->to); + while (pcfl) { + + pc = PCODE(pcfl->pcflow); + if(!isPCFL(pc)) { + fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); + pc->print(stderr,pc); + } + + nConflicts += compareBankFlow(PCFL(pcflow), pcfl, 1); + nFlows++; + + pcfl=setNextItem(PCFL(pcflow)->to); + } + + if((nFlows >= 2) && nConflicts &&(nConflicts != nFlows) && (PCFL(pcflow)->lastBank>0)) { + //fprintf(stderr, " To conflicts flow seq %d, nflows %d ,nconflicts %d\n",pcflow->seq,nFlows, nConflicts); + + FixRegisterBankingInFlow(PCFL(pcflow),-1); + BanksUsedFlow2(pcflow); + } + } + + / * + Loop through the flow objects again and find the ones with the + maximum conflicts + * / + + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + if(PCFL(pcflow)->ToConflicts > max_ToConflicts) + pcflow_max_To = pcflow; + + if(PCFL(pcflow)->FromConflicts > max_FromConflicts) + pcflow_max_From = pcflow; + } + / * + if(pcflow_max_To) + fprintf(stderr,"compare flow Max To conflicts: seq %d conflicts %d\n", + PCFL(pcflow_max_To)->pc.seq, + PCFL(pcflow_max_To)->ToConflicts); - pc = PCODE(pcfl->pcflow); - - if(!isPCFL(pc)) { - fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); - pc->print(stderr,pc); - } - - nConflicts += compareBankFlow(PCFL(pcflow), pcfl, 0); - nFlows++; - - pcfl=setNextItem(PCFL(pcflow)->from); - } - - if((nFlows >= 2) && nConflicts && (PCFL(pcflow)->firstBank>0)) { - //fprintf(stderr, " From conflicts flow seq %d, nflows %d ,nconflicts %d\n",pcflow->seq,nFlows, nConflicts); - - FixRegisterBankingInFlow(PCFL(pcflow),-1); - BanksUsedFlow2(pcflow); - - continue; / * Don't need to check the flow from here - it's already been fixed * / - - } - - nFlows = 0; - nConflicts = 0; - - pcfl = setFirstItem(PCFL(pcflow)->to); - while (pcfl) { - - pc = PCODE(pcfl->pcflow); - if(!isPCFL(pc)) { - fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); - pc->print(stderr,pc); - } - - nConflicts += compareBankFlow(PCFL(pcflow), pcfl, 1); - nFlows++; - - pcfl=setNextItem(PCFL(pcflow)->to); - } - - if((nFlows >= 2) && nConflicts &&(nConflicts != nFlows) && (PCFL(pcflow)->lastBank>0)) { - //fprintf(stderr, " To conflicts flow seq %d, nflows %d ,nconflicts %d\n",pcflow->seq,nFlows, nConflicts); - - FixRegisterBankingInFlow(PCFL(pcflow),-1); - BanksUsedFlow2(pcflow); - } - } - - / * - Loop through the flow objects again and find the ones with the - maximum conflicts - * / - - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - if(PCFL(pcflow)->ToConflicts > max_ToConflicts) - pcflow_max_To = pcflow; - - if(PCFL(pcflow)->FromConflicts > max_FromConflicts) - pcflow_max_From = pcflow; - } - / * - if(pcflow_max_To) - fprintf(stderr,"compare flow Max To conflicts: seq %d conflicts %d\n", - PCFL(pcflow_max_To)->pc.seq, - PCFL(pcflow_max_To)->ToConflicts); - - if(pcflow_max_From) - fprintf(stderr,"compare flow Max From conflicts: seq %d conflicts %d\n", - PCFL(pcflow_max_From)->pc.seq, - PCFL(pcflow_max_From)->FromConflicts); - * / + if(pcflow_max_From) + fprintf(stderr,"compare flow Max From conflicts: seq %d conflicts %d\n", + PCFL(pcflow_max_From)->pc.seq, + PCFL(pcflow_max_From)->FromConflicts); + * / } */ @@ -4769,97 +4780,97 @@ void FixBankFlow(pBlock *pb) /*-----------------------------------------------------------------*/ void DumpFlow(pBlock *pb) { - pCode *pc=NULL; - pCode *pcflow; - pCodeFlowLink *pcfl; - - - fprintf(stderr,"Dump flow \n"); - pb->pcHead->print(stderr, pb->pcHead); - - pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow->print(stderr,pcflow); - - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - pcflow != NULL; - pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { - - if(!isPCFL(pcflow)) { - fprintf(stderr, "DumpFlow - pcflow is not a flow object "); - continue; - } - fprintf(stderr,"dumping: "); - pcflow->print(stderr,pcflow); - FlowStats(PCFL(pcflow)); - - for(pcfl = setFirstItem(PCFL(pcflow)->to); pcfl; pcfl=setNextItem(PCFL(pcflow)->to)) { - - pc = PCODE(pcfl->pcflow); - - fprintf(stderr, " from seq %d:\n",pc->seq); - if(!isPCFL(pc)) { - fprintf(stderr,"oops dumpflow - from is not a pcflow\n"); - pc->print(stderr,pc); - } - - } - - for(pcfl = setFirstItem(PCFL(pcflow)->to); pcfl; pcfl=setNextItem(PCFL(pcflow)->to)) { - - pc = PCODE(pcfl->pcflow); - - fprintf(stderr, " to seq %d:\n",pc->seq); - if(!isPCFL(pc)) { - fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); - pc->print(stderr,pc); - } - - } - - } - + pCode *pc=NULL; + pCode *pcflow; + pCodeFlowLink *pcfl; + + + fprintf(stderr,"Dump flow \n"); + pb->pcHead->print(stderr, pb->pcHead); + + pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow->print(stderr,pcflow); + + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + pcflow != NULL; + pcflow = findNextpCode(pcflow->next, PC_FLOW) ) { + + if(!isPCFL(pcflow)) { + fprintf(stderr, "DumpFlow - pcflow is not a flow object "); + continue; + } + fprintf(stderr,"dumping: "); + pcflow->print(stderr,pcflow); + FlowStats(PCFL(pcflow)); + + for(pcfl = setFirstItem(PCFL(pcflow)->to); pcfl; pcfl=setNextItem(PCFL(pcflow)->to)) { + + pc = PCODE(pcfl->pcflow); + + fprintf(stderr, " from seq %d:\n",pc->seq); + if(!isPCFL(pc)) { + fprintf(stderr,"oops dumpflow - from is not a pcflow\n"); + pc->print(stderr,pc); + } + + } + + for(pcfl = setFirstItem(PCFL(pcflow)->to); pcfl; pcfl=setNextItem(PCFL(pcflow)->to)) { + + pc = PCODE(pcfl->pcflow); + + fprintf(stderr, " to seq %d:\n",pc->seq); + if(!isPCFL(pc)) { + fprintf(stderr,"oops dumpflow - to is not a pcflow\n"); + pc->print(stderr,pc); + } + + } + + } + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ int OptimizepBlock(pBlock *pb) { - pCode *pc, *pcprev; - int matches =0; - - if(!pb || !peepOptimizing) - return 0; - - DFPRINTF((stderr," Optimizing pBlock: %c\n",getpBlock_dbName(pb))); - /* - for(pc = pb->pcHead; pc; pc = pc->next) - matches += pCodePeepMatchRule(pc); - */ - - pc = findNextInstruction(pb->pcHead); - if(!pc) - return 0; - - pcprev = pc->prev; - do { - - - if(pCodePeepMatchRule(pc)) { - - matches++; - - if(pcprev) - pc = findNextInstruction(pcprev->next); - else - pc = findNextInstruction(pb->pcHead); - } else - pc = findNextInstruction(pc->next); - } while(pc); - - if(matches) - DFPRINTF((stderr," Optimizing pBlock: %c - matches=%d\n",getpBlock_dbName(pb),matches)); - return matches; - + pCode *pc, *pcprev; + int matches =0; + + if(!pb || !peepOptimizing) + return 0; + + DFPRINTF((stderr," Optimizing pBlock: %c\n",getpBlock_dbName(pb))); + /* + for(pc = pb->pcHead; pc; pc = pc->next) + matches += pCodePeepMatchRule(pc); + */ + + pc = findNextInstruction(pb->pcHead); + if(!pc) + return 0; + + pcprev = pc->prev; + do { + + + if(pCodePeepMatchRule(pc)) { + + matches++; + + if(pcprev) + pc = findNextInstruction(pcprev->next); + else + pc = findNextInstruction(pb->pcHead); + } else + pc = findNextInstruction(pc->next); + } while(pc); + + if(matches) + DFPRINTF((stderr," Optimizing pBlock: %c - matches=%d\n",getpBlock_dbName(pb),matches)); + return matches; + } /*-----------------------------------------------------------------*/ @@ -4867,57 +4878,57 @@ int OptimizepBlock(pBlock *pb) /*-----------------------------------------------------------------*/ pCode * findInstructionUsingLabel(pCodeLabel *pcl, pCode *pcs) { - pCode *pc; - - for(pc = pcs; pc; pc = pc->next) { - - if((pc->type == PC_OPCODE) && - (PCI(pc)->pcop) && - (PCI(pc)->pcop->type == PO_LABEL) && - (PCOLAB(PCI(pc)->pcop)->key == pcl->key)) - return pc; - } - - - return NULL; + pCode *pc; + + for(pc = pcs; pc; pc = pc->next) { + + if((pc->type == PC_OPCODE) && + (PCI(pc)->pcop) && + (PCI(pc)->pcop->type == PO_LABEL) && + (PCOLAB(PCI(pc)->pcop)->key == pcl->key)) + return pc; + } + + + return NULL; } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void exchangeLabels(pCodeLabel *pcl, pCode *pc) { - - char *s=NULL; - - if(isPCI(pc) && - (PCI(pc)->pcop) && - (PCI(pc)->pcop->type == PO_LABEL)) { - - pCodeOpLabel *pcol = PCOLAB(PCI(pc)->pcop); - - //fprintf(stderr,"changing label key from %d to %d\n",pcol->key, pcl->key); - if(pcol->pcop.name) - free(pcol->pcop.name); - - /* If the key is negative, then we (probably) have a label to - * a function and the name is already defined */ - - if(pcl->key>0) - sprintf(s=buffer,"_%05d_DS_",pcl->key); - else - s = pcl->label; - - //sprintf(buffer,"_%05d_DS_",pcl->key); - if(!s) { - fprintf(stderr, "ERROR %s:%d function label is null\n",__FUNCTION__,__LINE__); - } - pcol->pcop.name = Safe_strdup(s); - pcol->key = pcl->key; - //pc->print(stderr,pc); - - } - - + + char *s=NULL; + + if(isPCI(pc) && + (PCI(pc)->pcop) && + (PCI(pc)->pcop->type == PO_LABEL)) { + + pCodeOpLabel *pcol = PCOLAB(PCI(pc)->pcop); + + //fprintf(stderr,"changing label key from %d to %d\n",pcol->key, pcl->key); + if(pcol->pcop.name) + free(pcol->pcop.name); + + /* If the key is negative, then we (probably) have a label to + * a function and the name is already defined */ + + if(pcl->key>0) + sprintf(s=buffer,"_%05d_DS_",pcl->key); + else + s = pcl->label; + + //sprintf(buffer,"_%05d_DS_",pcl->key); + if(!s) { + fprintf(stderr, "ERROR %s:%d function label is null\n",__FUNCTION__,__LINE__); + } + pcol->pcop.name = Safe_strdup(s); + pcol->key = pcl->key; + //pc->print(stderr,pc); + + } + + } /*-----------------------------------------------------------------*/ @@ -4926,70 +4937,70 @@ void exchangeLabels(pCodeLabel *pcl, pCode *pc) /*-----------------------------------------------------------------*/ void pBlockRemoveUnusedLabels(pBlock *pb) { - pCode *pc; pCodeLabel *pcl; - - if(!pb) - return; - - for(pc = pb->pcHead; (pc=findNextInstruction(pc->next)) != NULL; ) { - - pBranch *pbr = PCI(pc)->label; - if(pbr && pbr->next) { - pCode *pcd = pb->pcHead; - - //fprintf(stderr, "multiple labels\n"); - //pc->print(stderr,pc); - - pbr = pbr->next; - while(pbr) { - - while ( (pcd = findInstructionUsingLabel(PCL(PCI(pc)->label->pc), pcd)) != NULL) { - //fprintf(stderr,"Used by:\n"); - //pcd->print(stderr,pcd); - - exchangeLabels(PCL(pbr->pc),pcd); - - pcd = pcd->next; - } - pbr = pbr->next; - } - } - } - - for(pc = pb->pcHead; pc; pc = pc->next) { - - if(isPCL(pc)) // Label pcode - pcl = PCL(pc); - else if (isPCI(pc) && PCI(pc)->label) // pcode instruction with a label - pcl = PCL(PCI(pc)->label->pc); - else continue; - - //fprintf(stderr," found A LABEL !!! key = %d, %s\n", pcl->key,pcl->label); - - /* This pCode is a label, so search the pBlock to see if anyone - * refers to it */ - - if( (pcl->key>0) && (!findInstructionUsingLabel(pcl, pb->pcHead))) { - //if( !findInstructionUsingLabel(pcl, pb->pcHead)) { - /* Couldn't find an instruction that refers to this label - * So, unlink the pCode label from it's pCode chain - * and destroy the label */ - //fprintf(stderr," removed A LABEL !!! key = %d, %s\n", pcl->key,pcl->label); - - DFPRINTF((stderr," !!! REMOVED A LABEL !!! key = %d, %s\n", pcl->key,pcl->label)); - if(pc->type == PC_LABEL) { - unlinkpCode(pc); - pCodeLabelDestruct(pc); - } else { - unlinkpCodeFromBranch(pc, PCODE(pcl)); - /*if(pc->label->next == NULL && pc->label->pc == NULL) { - free(pc->label); - }*/ - } - - } - } - + pCode *pc; pCodeLabel *pcl; + + if(!pb) + return; + + for(pc = pb->pcHead; (pc=findNextInstruction(pc->next)) != NULL; ) { + + pBranch *pbr = PCI(pc)->label; + if(pbr && pbr->next) { + pCode *pcd = pb->pcHead; + + //fprintf(stderr, "multiple labels\n"); + //pc->print(stderr,pc); + + pbr = pbr->next; + while(pbr) { + + while ( (pcd = findInstructionUsingLabel(PCL(PCI(pc)->label->pc), pcd)) != NULL) { + //fprintf(stderr,"Used by:\n"); + //pcd->print(stderr,pcd); + + exchangeLabels(PCL(pbr->pc),pcd); + + pcd = pcd->next; + } + pbr = pbr->next; + } + } + } + + for(pc = pb->pcHead; pc; pc = pc->next) { + + if(isPCL(pc)) // Label pcode + pcl = PCL(pc); + else if (isPCI(pc) && PCI(pc)->label) // pcode instruction with a label + pcl = PCL(PCI(pc)->label->pc); + else continue; + + //fprintf(stderr," found A LABEL !!! key = %d, %s\n", pcl->key,pcl->label); + + /* This pCode is a label, so search the pBlock to see if anyone + * refers to it */ + + if( (pcl->key>0) && (!findInstructionUsingLabel(pcl, pb->pcHead))) { + //if( !findInstructionUsingLabel(pcl, pb->pcHead)) { + /* Couldn't find an instruction that refers to this label + * So, unlink the pCode label from it's pCode chain + * and destroy the label */ + //fprintf(stderr," removed A LABEL !!! key = %d, %s\n", pcl->key,pcl->label); + + DFPRINTF((stderr," !!! REMOVED A LABEL !!! key = %d, %s\n", pcl->key,pcl->label)); + if(pc->type == PC_LABEL) { + unlinkpCode(pc); + pCodeLabelDestruct(pc); + } else { + unlinkpCodeFromBranch(pc, PCODE(pcl)); + /*if(pc->label->next == NULL && pc->label->pc == NULL) { + free(pc->label); + }*/ + } + + } + } + } @@ -5001,66 +5012,66 @@ void pBlockRemoveUnusedLabels(pBlock *pb) /*-----------------------------------------------------------------*/ void pBlockMergeLabels(pBlock *pb) { - pBranch *pbr; - pCode *pc, *pcnext=NULL; - - if(!pb) - return; - - /* First, Try to remove any unused labels */ - //pBlockRemoveUnusedLabels(pb); - - /* Now loop through the pBlock and merge the labels with the opcodes */ - - pc = pb->pcHead; - // for(pc = pb->pcHead; pc; pc = pc->next) { - - while(pc) { - pCode *pcn = pc->next; - - if(pc->type == PC_LABEL) { - - //fprintf(stderr," checking merging label %s\n",PCL(pc)->label); - //fprintf(stderr,"Checking label key = %d\n",PCL(pc)->key); - if((pcnext = findNextInstruction(pc) )) { - - // Unlink the pCode label from it's pCode chain - unlinkpCode(pc); - - //fprintf(stderr,"Merged label key = %d\n",PCL(pc)->key); - // And link it into the instruction's pBranch labels. (Note, since - // it's possible to have multiple labels associated with one instruction - // we must provide a means to accomodate the additional labels. Thus - // the labels are placed into the singly-linked list "label" as - // opposed to being a single member of the pCodeInstruction.) - - //_ALLOC(pbr,sizeof(pBranch)); - pbr = Safe_calloc(1,sizeof(pBranch)); - pbr->pc = pc; - pbr->next = NULL; - - PCI(pcnext)->label = pBranchAppend(PCI(pcnext)->label,pbr); - - } else { - fprintf(stderr, "WARNING: couldn't associate label %s with an instruction\n",PCL(pc)->label); - } - } else if(pc->type == PC_CSOURCE) { - - /* merge the source line symbolic info into the next instruction */ - if((pcnext = findNextInstruction(pc) )) { - - // Unlink the pCode label from it's pCode chain - unlinkpCode(pc); - PCI(pcnext)->cline = PCCS(pc); - //fprintf(stderr, "merging CSRC\n"); - //genericPrint(stderr,pcnext); - } - - } - pc = pcn; - } - pBlockRemoveUnusedLabels(pb); - + pBranch *pbr; + pCode *pc, *pcnext=NULL; + + if(!pb) + return; + + /* First, Try to remove any unused labels */ + //pBlockRemoveUnusedLabels(pb); + + /* Now loop through the pBlock and merge the labels with the opcodes */ + + pc = pb->pcHead; + // for(pc = pb->pcHead; pc; pc = pc->next) { + + while(pc) { + pCode *pcn = pc->next; + + if(pc->type == PC_LABEL) { + + //fprintf(stderr," checking merging label %s\n",PCL(pc)->label); + //fprintf(stderr,"Checking label key = %d\n",PCL(pc)->key); + if((pcnext = findNextInstruction(pc) )) { + + // Unlink the pCode label from it's pCode chain + unlinkpCode(pc); + + //fprintf(stderr,"Merged label key = %d\n",PCL(pc)->key); + // And link it into the instruction's pBranch labels. (Note, since + // it's possible to have multiple labels associated with one instruction + // we must provide a means to accomodate the additional labels. Thus + // the labels are placed into the singly-linked list "label" as + // opposed to being a single member of the pCodeInstruction.) + + //_ALLOC(pbr,sizeof(pBranch)); + pbr = Safe_calloc(1,sizeof(pBranch)); + pbr->pc = pc; + pbr->next = NULL; + + PCI(pcnext)->label = pBranchAppend(PCI(pcnext)->label,pbr); + + } else { + fprintf(stderr, "WARNING: couldn't associate label %s with an instruction\n",PCL(pc)->label); + } + } else if(pc->type == PC_CSOURCE) { + + /* merge the source line symbolic info into the next instruction */ + if((pcnext = findNextInstruction(pc) )) { + + // Unlink the pCode label from it's pCode chain + unlinkpCode(pc); + PCI(pcnext)->cline = PCCS(pc); + //fprintf(stderr, "merging CSRC\n"); + //genericPrint(stderr,pcnext); + } + + } + pc = pcn; + } + pBlockRemoveUnusedLabels(pb); + } /*-----------------------------------------------------------------*/ @@ -5068,26 +5079,26 @@ void pBlockMergeLabels(pBlock *pb) int OptimizepCode(char dbName) { #define MAX_PASSES 4 - - int matches = 0; - int passes = 0; - pBlock *pb; - - if(!the_pFile) - return 0; - - DFPRINTF((stderr," Optimizing pCode\n")); - - do { - matches = 0; - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - if('*' == dbName || getpBlock_dbName(pb) == dbName) - matches += OptimizepBlock(pb); - } - } - while(matches && ++passes < MAX_PASSES); - - return matches; + + int matches = 0; + int passes = 0; + pBlock *pb; + + if(!the_pFile) + return 0; + + DFPRINTF((stderr," Optimizing pCode\n")); + + do { + matches = 0; + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + if('*' == dbName || getpBlock_dbName(pb) == dbName) + matches += OptimizepBlock(pb); + } + } + while(matches && ++passes < MAX_PASSES); + + return matches; } /*-----------------------------------------------------------------*/ @@ -5096,16 +5107,16 @@ int OptimizepCode(char dbName) pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval) { - pCodeOp *pcop; - - pcop = newpCodeOpBit(pc->name, bitval, 0); - - if( !( (pcop->type == PO_LABEL) || - (pcop->type == PO_LITERAL) || - (pcop->type == PO_STR) )) - PCOR(pcop)->r = PCOR(pc)->r; /* This is dangerous... */ - - return pcop; + pCodeOp *pcop; + + pcop = newpCodeOpBit(pc->name, bitval, 0); + + if( !( (pcop->type == PO_LABEL) || + (pcop->type == PO_LITERAL) || + (pcop->type == PO_STR) )) + PCOR(pcop)->r = PCOR(pc)->r; /* This is dangerous... */ + + return pcop; } @@ -5113,84 +5124,84 @@ pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval) /*-----------------------------------------------------------------*/ static void FixRegisterBanking(pBlock *pb,int cur_bank) { - pCode *pc; - int firstBank = 'U'; - - if(!pb) - return; - - for (pc=pb->pcHead; pc; pc=pc->next) { - if (isPCFL(pc)) { - firstBank = PCFL(pc)->firstBank; - break; - } - } - if (firstBank != 'U') { - /* This block has already been done */ - if (firstBank != cur_bank) { - /* This block has started with a different bank - must adjust it */ - if ((firstBank != -1)&&(firstBank != 'E')) { /* The first bank start off unknown or extern then need not worry as banksel will be called */ - while (pc) { - if (isPCI(pc)) { - regs *reg = getRegFromInstruction(pc); - if (reg) { - DoBankSelect(pc,cur_bank); - } - } - pc = pc->next; - } - } - } - return; - } - - /* loop through all of the pCodes within this pblock setting the bank selection, ignoring any branching */ - LastRegIdx = -1; - cur_bank = -1; - for (pc=pb->pcHead; pc; pc=pc->next) { - if (isPCFL(pc)) { - PCFL(pc)->firstBank = cur_bank; - continue; - } - cur_bank = DoBankSelect(pc,cur_bank); - } - - /* Trace through branches and set the bank selection as required. */ - LastRegIdx = -1; - cur_bank = -1; - for (pc=pb->pcHead; pc; pc=pc->next) { - if (isPCFL(pc)) { - PCFL(pc)->firstBank = cur_bank; - continue; - } - if (isPCI(pc)) { - if (PCI(pc)->op == POC_GOTO) { - int lastRegIdx = LastRegIdx; - pCode *pcb = pc; - /* Trace through branch */ - pCode *pcl = findLabel(PCOLAB(PCI(pcb)->pcop)); - while (pcl) { - if (isPCI(pcl)) { - regs *reg = getRegFromInstruction(pcl); - if (reg) { - int bankUnknown = -1; - if (IsBankChange(pcl,reg,&bankUnknown)) /* Look for any bank change */ - break; - if (cur_bank != DoBankSelect(pcl,cur_bank)) /* Set bank selection if necessary */ - break; - } - } - pcl = pcl->next; - } - LastRegIdx = lastRegIdx; - } else { - /* Keep track out current bank */ - regs *reg = getRegFromInstruction(pc); - if (reg) - IsBankChange(pc,reg,&cur_bank); - } - } - } + pCode *pc; + int firstBank = 'U'; + + if(!pb) + return; + + for (pc=pb->pcHead; pc; pc=pc->next) { + if (isPCFL(pc)) { + firstBank = PCFL(pc)->firstBank; + break; + } + } + if (firstBank != 'U') { + /* This block has already been done */ + if (firstBank != cur_bank) { + /* This block has started with a different bank - must adjust it */ + if ((firstBank != -1)&&(firstBank != 'E')) { /* The first bank start off unknown or extern then need not worry as banksel will be called */ + while (pc) { + if (isPCI(pc)) { + regs *reg = getRegFromInstruction(pc); + if (reg) { + DoBankSelect(pc,cur_bank); + } + } + pc = pc->next; + } + } + } + return; + } + + /* loop through all of the pCodes within this pblock setting the bank selection, ignoring any branching */ + LastRegIdx = -1; + cur_bank = -1; + for (pc=pb->pcHead; pc; pc=pc->next) { + if (isPCFL(pc)) { + PCFL(pc)->firstBank = cur_bank; + continue; + } + cur_bank = DoBankSelect(pc,cur_bank); + } + + /* Trace through branches and set the bank selection as required. */ + LastRegIdx = -1; + cur_bank = -1; + for (pc=pb->pcHead; pc; pc=pc->next) { + if (isPCFL(pc)) { + PCFL(pc)->firstBank = cur_bank; + continue; + } + if (isPCI(pc)) { + if (PCI(pc)->op == POC_GOTO) { + int lastRegIdx = LastRegIdx; + pCode *pcb = pc; + /* Trace through branch */ + pCode *pcl = findLabel(PCOLAB(PCI(pcb)->pcop)); + while (pcl) { + if (isPCI(pcl)) { + regs *reg = getRegFromInstruction(pcl); + if (reg) { + int bankUnknown = -1; + if (IsBankChange(pcl,reg,&bankUnknown)) /* Look for any bank change */ + break; + if (cur_bank != DoBankSelect(pcl,cur_bank)) /* Set bank selection if necessary */ + break; + } + } + pcl = pcl->next; + } + LastRegIdx = lastRegIdx; + } else { + /* Keep track out current bank */ + regs *reg = getRegFromInstruction(pc); + if (reg) + IsBankChange(pc,reg,&cur_bank); + } + } + } } @@ -5198,13 +5209,13 @@ static void FixRegisterBanking(pBlock *pb,int cur_bank) /*-----------------------------------------------------------------*/ void pBlockDestruct(pBlock *pb) { - - if(!pb) - return; - - - free(pb); - + + if(!pb) + return; + + + free(pb); + } /*-----------------------------------------------------------------*/ @@ -5214,39 +5225,39 @@ void pBlockDestruct(pBlock *pb) /*-----------------------------------------------------------------*/ void mergepBlocks(char dbName) { - - pBlock *pb, *pbmerged = NULL,*pbn; - - pb = the_pFile->pbHead; - - //fprintf(stderr," merging blocks named %c\n",dbName); - while(pb) { - - pbn = pb->next; - //fprintf(stderr,"looking at %c\n",getpBlock_dbName(pb)); - if( getpBlock_dbName(pb) == dbName) { - - //fprintf(stderr," merged block %c\n",dbName); - - if(!pbmerged) { - pbmerged = pb; - } else { - addpCode2pBlock(pbmerged, pb->pcHead); - /* addpCode2pBlock doesn't handle the tail: */ - pbmerged->pcTail = pb->pcTail; - - pb->prev->next = pbn; - if(pbn) - pbn->prev = pb->prev; - - - pBlockDestruct(pb); - } - //printpBlock(stderr, pbmerged); - } - pb = pbn; - } - + + pBlock *pb, *pbmerged = NULL,*pbn; + + pb = the_pFile->pbHead; + + //fprintf(stderr," merging blocks named %c\n",dbName); + while(pb) { + + pbn = pb->next; + //fprintf(stderr,"looking at %c\n",getpBlock_dbName(pb)); + if( getpBlock_dbName(pb) == dbName) { + + //fprintf(stderr," merged block %c\n",dbName); + + if(!pbmerged) { + pbmerged = pb; + } else { + addpCode2pBlock(pbmerged, pb->pcHead); + /* addpCode2pBlock doesn't handle the tail: */ + pbmerged->pcTail = pb->pcTail; + + pb->prev->next = pbn; + if(pbn) + pbn->prev = pb->prev; + + + pBlockDestruct(pb); + } + //printpBlock(stderr, pbmerged); + } + pb = pbn; + } + } /*-----------------------------------------------------------------*/ @@ -5261,114 +5272,114 @@ void mergepBlocks(char dbName) void AnalyzeFlow(int level) { - static int times_called=0; - - pBlock *pb; - - if(!the_pFile) - return; - - - /* if this is not the first time this function has been called, - then clean up old flow information */ - if(times_called++) { - for(pb = the_pFile->pbHead; pb; pb = pb->next) - unBuildFlow(pb); - - RegsUnMapLiveRanges(); - - } - - GpcFlowSeq = 1; - - /* Phase 2 - Flow Analysis - Register Banking - * - * In this phase, the individual flow blocks are examined - * and register banking is fixed. - */ - - //for(pb = the_pFile->pbHead; pb; pb = pb->next) - //FixRegisterBanking(pb); - - /* Phase 2 - Flow Analysis - * - * In this phase, the pCode is partition into pCodeFlow - * blocks. The flow blocks mark the points where a continuous - * stream of instructions changes flow (e.g. because of - * a call or goto or whatever). - */ - - for(pb = the_pFile->pbHead; pb; pb = pb->next) - BuildFlow(pb); - - - /* Phase 2 - Flow Analysis - linking flow blocks - * - * In this phase, the individual flow blocks are examined - * to determine their order of excution. - */ - - for(pb = the_pFile->pbHead; pb; pb = pb->next) - LinkFlow(pb); - - /* Phase 3 - Flow Analysis - Flow Tree - * - * In this phase, the individual flow blocks are examined - * to determine their order of excution. - */ - - for(pb = the_pFile->pbHead; pb; pb = pb->next) - BuildFlowTree(pb); - - - /* Phase x - Flow Analysis - Used Banks - * - * In this phase, the individual flow blocks are examined - * to determine the Register Banks they use - */ - - // for(pb = the_pFile->pbHead; pb; pb = pb->next) - // FixBankFlow(pb); - - - for(pb = the_pFile->pbHead; pb; pb = pb->next) - pCodeRegMapLiveRanges(pb); - - RemoveUnusedRegisters(); - - // for(pb = the_pFile->pbHead; pb; pb = pb->next) - pCodeRegOptimizeRegUsage(level); - - OptimizepCode('*'); - - - /* - for(pb = the_pFile->pbHead; pb; pb = pb->next) - DumpFlow(pb); - */ - /* debug stuff */ - /* - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - pCode *pcflow; - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - (pcflow = findNextpCode(pcflow, PC_FLOW)) != NULL; - pcflow = pcflow->next) { - - FillFlow(PCFL(pcflow)); - } - } - */ - /* - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - pCode *pcflow; - for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); - (pcflow = findNextpCode(pcflow, PC_FLOW)) != NULL; - pcflow = pcflow->next) { - - FlowStats(PCFL(pcflow)); - } - } - */ + static int times_called=0; + + pBlock *pb; + + if(!the_pFile) + return; + + + /* if this is not the first time this function has been called, + then clean up old flow information */ + if(times_called++) { + for(pb = the_pFile->pbHead; pb; pb = pb->next) + unBuildFlow(pb); + + RegsUnMapLiveRanges(); + + } + + GpcFlowSeq = 1; + + /* Phase 2 - Flow Analysis - Register Banking + * + * In this phase, the individual flow blocks are examined + * and register banking is fixed. + */ + + //for(pb = the_pFile->pbHead; pb; pb = pb->next) + //FixRegisterBanking(pb); + + /* Phase 2 - Flow Analysis + * + * In this phase, the pCode is partition into pCodeFlow + * blocks. The flow blocks mark the points where a continuous + * stream of instructions changes flow (e.g. because of + * a call or goto or whatever). + */ + + for(pb = the_pFile->pbHead; pb; pb = pb->next) + BuildFlow(pb); + + + /* Phase 2 - Flow Analysis - linking flow blocks + * + * In this phase, the individual flow blocks are examined + * to determine their order of excution. + */ + + for(pb = the_pFile->pbHead; pb; pb = pb->next) + LinkFlow(pb); + + /* Phase 3 - Flow Analysis - Flow Tree + * + * In this phase, the individual flow blocks are examined + * to determine their order of excution. + */ + + for(pb = the_pFile->pbHead; pb; pb = pb->next) + BuildFlowTree(pb); + + + /* Phase x - Flow Analysis - Used Banks + * + * In this phase, the individual flow blocks are examined + * to determine the Register Banks they use + */ + + // for(pb = the_pFile->pbHead; pb; pb = pb->next) + // FixBankFlow(pb); + + + for(pb = the_pFile->pbHead; pb; pb = pb->next) + pCodeRegMapLiveRanges(pb); + + RemoveUnusedRegisters(); + + // for(pb = the_pFile->pbHead; pb; pb = pb->next) + pCodeRegOptimizeRegUsage(level); + + OptimizepCode('*'); + + + /* + for(pb = the_pFile->pbHead; pb; pb = pb->next) + DumpFlow(pb); + */ + /* debug stuff */ + /* + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + pCode *pcflow; + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + (pcflow = findNextpCode(pcflow, PC_FLOW)) != NULL; + pcflow = pcflow->next) { + + FillFlow(PCFL(pcflow)); + } + } + */ + /* + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + pCode *pcflow; + for( pcflow = findNextpCode(pb->pcHead, PC_FLOW); + (pcflow = findNextpCode(pcflow, PC_FLOW)) != NULL; + pcflow = pcflow->next) { + + FlowStats(PCFL(pcflow)); + } + } + */ } /*-----------------------------------------------------------------*/ @@ -5379,41 +5390,41 @@ void AnalyzeFlow(int level) void AnalyzeBanking(void) { - pBlock *pb; - - if(!picIsInitialized()) { - fprintf(stderr,"Temporary ERROR: at the moment you have to use\n"); - fprintf(stderr,"an include file create by inc2h.pl. See SDCC source:\n"); - fprintf(stderr,"support/scripts/inc2h.pl\n"); - fprintf(stderr,"this is a nuisance bug that will be fixed shortly\n"); - - exit(1); - } - - /* Phase x - Flow Analysis - Used Banks - * - * In this phase, the individual flow blocks are examined - * to determine the Register Banks they use - */ - - AnalyzeFlow(0); - AnalyzeFlow(1); - - // for(pb = the_pFile->pbHead; pb; pb = pb->next) - // BanksUsedFlow(pb); - for(pb = the_pFile->pbHead; pb; pb = pb->next) - FixRegisterBanking(pb,-1); // cur_bank is unknown - + pBlock *pb; + + if(!picIsInitialized()) { + fprintf(stderr,"Temporary ERROR: at the moment you have to use\n"); + fprintf(stderr,"an include file create by inc2h.pl. See SDCC source:\n"); + fprintf(stderr,"support/scripts/inc2h.pl\n"); + fprintf(stderr,"this is a nuisance bug that will be fixed shortly\n"); + + exit(1); + } + + /* Phase x - Flow Analysis - Used Banks + * + * In this phase, the individual flow blocks are examined + * to determine the Register Banks they use + */ + + AnalyzeFlow(0); + AnalyzeFlow(1); + + // for(pb = the_pFile->pbHead; pb; pb = pb->next) + // BanksUsedFlow(pb); + for(pb = the_pFile->pbHead; pb; pb = pb->next) + FixRegisterBanking(pb,-1); // cur_bank is unknown + } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ DEFSETFUNC (resetrIdx) { - if (!((regs *)item)->isFixed) - ((regs *)item)->rIdx = 0; - - return 0; + if (!((regs *)item)->isFixed) + ((regs *)item)->rIdx = 0; + + return 0; } /*-----------------------------------------------------------------*/ @@ -5422,97 +5433,97 @@ DEFSETFUNC (resetrIdx) void InitReuseReg(void) { - /* Find end of statically allocated variables for start idx */ - unsigned maxIdx = 0x20; /* Start from begining of GPR. Note may not be 0x20 on some PICs */ - regs *r; - for (r = setFirstItem(dynDirectRegs); r; r = setNextItem(dynDirectRegs)) { - if (r->type != REG_SFR) { - maxIdx += r->size; /* Increment for all statically allocated variables */ - } - } - peakIdx = maxIdx; - applyToSet(dynAllocRegs,resetrIdx); /* Reset all rIdx to zero. */ + /* Find end of statically allocated variables for start idx */ + unsigned maxIdx = 0x20; /* Start from begining of GPR. Note may not be 0x20 on some PICs */ + regs *r; + for (r = setFirstItem(dynDirectRegs); r; r = setNextItem(dynDirectRegs)) { + if (r->type != REG_SFR) { + maxIdx += r->size; /* Increment for all statically allocated variables */ + } + } + peakIdx = maxIdx; + applyToSet(dynAllocRegs,resetrIdx); /* Reset all rIdx to zero. */ } /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ static unsigned register_reassign(pBlock *pb, unsigned idx) { - pCode *pc; - - /* check recursion */ - pc = setFirstItem(pb->function_entries); - if(!pc) - return idx; - - pb->visited = 1; - - DFPRINTF((stderr," reassigning registers for function \"%s\"\n",PCF(pc)->fname)); - - if (pb->tregisters) { - regs *r; - for (r = setFirstItem(pb->tregisters); r; r = setNextItem(pb->tregisters)) { - if (r->type == REG_GPR) { - if (!r->isFixed) { - if (r->rIdx < (int)idx) { - char s[20]; - r->rIdx = idx++; - if (peakIdx < idx) peakIdx = idx; - sprintf(s,"r0x%02X", r->rIdx); - DFPRINTF((stderr," reassigning register \"%s\" to \"%s\"\n",r->name,s)); - free(r->name); - r->name = Safe_strdup(s); - } - } - } - } - } - for(pc = setFirstItem(pb->function_calls); pc; pc = setNextItem(pb->function_calls)) { - - if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { - char *dest = get_op_from_instruction(PCI(pc)); - - pCode *pcn = findFunction(dest); - if(pcn) { - register_reassign(pcn->pb,idx); - } - } - - } - - return idx; + pCode *pc; + + /* check recursion */ + pc = setFirstItem(pb->function_entries); + if(!pc) + return idx; + + pb->visited = 1; + + DFPRINTF((stderr," reassigning registers for function \"%s\"\n",PCF(pc)->fname)); + + if (pb->tregisters) { + regs *r; + for (r = setFirstItem(pb->tregisters); r; r = setNextItem(pb->tregisters)) { + if (r->type == REG_GPR) { + if (!r->isFixed) { + if (r->rIdx < (int)idx) { + char s[20]; + r->rIdx = idx++; + if (peakIdx < idx) peakIdx = idx; + sprintf(s,"r0x%02X", r->rIdx); + DFPRINTF((stderr," reassigning register \"%s\" to \"%s\"\n",r->name,s)); + free(r->name); + r->name = Safe_strdup(s); + } + } + } + } + } + for(pc = setFirstItem(pb->function_calls); pc; pc = setNextItem(pb->function_calls)) { + + if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { + char *dest = get_op_from_instruction(PCI(pc)); + + pCode *pcn = findFunction(dest); + if(pcn) { + register_reassign(pcn->pb,idx); + } + } + + } + + return idx; } /*------------------------------------------------------------------*/ /* ReuseReg were call tree permits */ /* */ -/* Re-allocate the GPR for optimum reuse for a given pblock */ -/* eg if a function m() calls function f1() and f2(), where f1 */ -/* allocates a local variable vf1 and f2 allocates a local */ -/* variable vf2. Then providing f1 and f2 do not call each other */ -/* they may share the same general purpose registers for vf1 and */ -/* vf2. */ -/* This is done by first setting the the regs rIdx to start after */ -/* all the global variables, then walking through the call tree */ -/* renaming the registers to match their new idx and incrementng */ -/* it as it goes. If a function has already been called it will */ -/* only rename the registers if it has already used up those */ -/* registers ie rIdx of the function's registers is lower than the */ -/* current rIdx. That way the register will not be reused while */ -/* still being used by an eariler function call. */ +/* Re-allocate the GPR for optimum reuse for a given pblock */ +/* eg if a function m() calls function f1() and f2(), where f1 */ +/* allocates a local variable vf1 and f2 allocates a local */ +/* variable vf2. Then providing f1 and f2 do not call each other */ +/* they may share the same general purpose registers for vf1 and */ +/* vf2. */ +/* This is done by first setting the the regs rIdx to start after */ +/* all the global variables, then walking through the call tree */ +/* renaming the registers to match their new idx and incrementng */ +/* it as it goes. If a function has already been called it will */ +/* only rename the registers if it has already used up those */ +/* registers ie rIdx of the function's registers is lower than the */ +/* current rIdx. That way the register will not be reused while */ +/* still being used by an eariler function call. */ /* */ -/* Note for this to work the fucntions need to be declared static. */ +/* Note for this to work the fucntions need to be declared static. */ /* */ /*------------------------------------------------------------------*/ void ReuseReg(void) { - pBlock *pb; - InitReuseReg(); - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - /* Non static functions can be called from other modules so their registers must reassign */ - if (pb->function_entries&&(PCF(setFirstItem(pb->function_entries))->isPublic||!pb->visited)) - register_reassign(pb,peakIdx); - } + pBlock *pb; + InitReuseReg(); + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + /* Non static functions can be called from other modules so their registers must reassign */ + if (pb->function_entries&&(PCF(setFirstItem(pb->function_entries))->isPublic||!pb->visited)) + register_reassign(pb,peakIdx); + } } /*-----------------------------------------------------------------*/ @@ -5522,74 +5533,74 @@ void ReuseReg(void) void buildCallTree(void ) { - pBranch *pbr; - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return; - - /* Now build the call tree. - First we examine all of the pCodes for functions. - Keep in mind that the function boundaries coincide - with pBlock boundaries. - - The algorithm goes something like this: - We have two nested loops. The outer loop iterates - through all of the pBlocks/functions. The inner - loop iterates through all of the pCodes for - a given pBlock. When we begin iterating through - a pBlock, the variable pc_fstart, pCode of the start - of a function, is cleared. We then search for pCodes - of type PC_FUNCTION. When one is encountered, we - initialize pc_fstart to this and at the same time - associate a new pBranch object that signifies a - branch entry. If a return is found, then this signifies - a function exit point. We'll link the pCodes of these - returns to the matching pc_fstart. - - When we're done, a doubly linked list of pBranches - will exist. The head of this list is stored in - `the_pFile', which is the meta structure for all - of the pCode. Look at the printCallTree function - on how the pBranches are linked together. - - */ - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - pCode *pc_fstart=NULL; - for(pc = pb->pcHead; pc; pc = pc->next) { - if(isPCF(pc)) { - pCodeFunction *pcf = PCF(pc); - if (pcf->fname) { - - if(STRCASECMP(pcf->fname, "_main") == 0) { - //fprintf(stderr," found main \n"); - pb->cmemmap = NULL; /* FIXME do we need to free ? */ - pb->dbName = 'M'; - } - - pbr = Safe_calloc(1,sizeof(pBranch)); - pbr->pc = pc_fstart = pc; - pbr->next = NULL; - - the_pFile->functions = pBranchAppend(the_pFile->functions,pbr); - - // Here's a better way of doing the same: - addSet(&pb->function_entries, pc); - - } else { - // Found an exit point in a function, e.g. return - // (Note, there may be more than one return per function) - if(pc_fstart) - pBranchLink(PCF(pc_fstart), pcf); - - addSet(&pb->function_exits, pc); - } - } else if(isCALL(pc)) { - addSet(&pb->function_calls,pc); - } - } - } + pBranch *pbr; + pBlock *pb; + pCode *pc; + + if(!the_pFile) + return; + + /* Now build the call tree. + First we examine all of the pCodes for functions. + Keep in mind that the function boundaries coincide + with pBlock boundaries. + + The algorithm goes something like this: + We have two nested loops. The outer loop iterates + through all of the pBlocks/functions. The inner + loop iterates through all of the pCodes for + a given pBlock. When we begin iterating through + a pBlock, the variable pc_fstart, pCode of the start + of a function, is cleared. We then search for pCodes + of type PC_FUNCTION. When one is encountered, we + initialize pc_fstart to this and at the same time + associate a new pBranch object that signifies a + branch entry. If a return is found, then this signifies + a function exit point. We'll link the pCodes of these + returns to the matching pc_fstart. + + When we're done, a doubly linked list of pBranches + will exist. The head of this list is stored in + `the_pFile', which is the meta structure for all + of the pCode. Look at the printCallTree function + on how the pBranches are linked together. + + */ + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + pCode *pc_fstart=NULL; + for(pc = pb->pcHead; pc; pc = pc->next) { + if(isPCF(pc)) { + pCodeFunction *pcf = PCF(pc); + if (pcf->fname) { + + if(STRCASECMP(pcf->fname, "_main") == 0) { + //fprintf(stderr," found main \n"); + pb->cmemmap = NULL; /* FIXME do we need to free ? */ + pb->dbName = 'M'; + } + + pbr = Safe_calloc(1,sizeof(pBranch)); + pbr->pc = pc_fstart = pc; + pbr->next = NULL; + + the_pFile->functions = pBranchAppend(the_pFile->functions,pbr); + + // Here's a better way of doing the same: + addSet(&pb->function_entries, pc); + + } else { + // Found an exit point in a function, e.g. return + // (Note, there may be more than one return per function) + if(pc_fstart) + pBranchLink(PCF(pc_fstart), pcf); + + addSet(&pb->function_exits, pc); + } + } else if(isCALL(pc)) { + addSet(&pb->function_calls,pc); + } + } + } } /*-----------------------------------------------------------------*/ @@ -5602,48 +5613,48 @@ void buildCallTree(void ) void AnalyzepCode(char dbName) { - pBlock *pb; - int i,changes; - - if(!the_pFile) - return; - - mergepBlocks('D'); - - - /* Phase 1 - Register allocation and peep hole optimization - * - * The first part of the analysis is to determine the registers - * that are used in the pCode. Once that is done, the peep rules - * are applied to the code. We continue to loop until no more - * peep rule optimizations are found (or until we exceed the - * MAX_PASSES threshold). - * - * When done, the required registers will be determined. - * - */ - i = 0; - do { - - DFPRINTF((stderr," Analyzing pCode: PASS #%d\n",i+1)); - - /* First, merge the labels with the instructions */ - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - if('*' == dbName || getpBlock_dbName(pb) == dbName) { - - DFPRINTF((stderr," analyze and merging block %c\n",dbName)); - pBlockMergeLabels(pb); - AnalyzepBlock(pb); - } else { - DFPRINTF((stderr," skipping block analysis dbName=%c blockname=%c\n",dbName,getpBlock_dbName)); - } - } - - changes = OptimizepCode(dbName); - - } while(changes && (i++ < MAX_PASSES)); - - buildCallTree(); + pBlock *pb; + int i,changes; + + if(!the_pFile) + return; + + mergepBlocks('D'); + + + /* Phase 1 - Register allocation and peep hole optimization + * + * The first part of the analysis is to determine the registers + * that are used in the pCode. Once that is done, the peep rules + * are applied to the code. We continue to loop until no more + * peep rule optimizations are found (or until we exceed the + * MAX_PASSES threshold). + * + * When done, the required registers will be determined. + * + */ + i = 0; + do { + + DFPRINTF((stderr," Analyzing pCode: PASS #%d\n",i+1)); + + /* First, merge the labels with the instructions */ + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + if('*' == dbName || getpBlock_dbName(pb) == dbName) { + + DFPRINTF((stderr," analyze and merging block %c\n",dbName)); + pBlockMergeLabels(pb); + AnalyzepBlock(pb); + } else { + DFPRINTF((stderr," skipping block analysis dbName=%c blockname=%c\n",dbName,getpBlock_dbName)); + } + } + + changes = OptimizepCode(dbName); + + } while(changes && (i++ < MAX_PASSES)); + + buildCallTree(); } /*-----------------------------------------------------------------*/ @@ -5652,11 +5663,11 @@ void AnalyzepCode(char dbName) /*-----------------------------------------------------------------*/ bool ispCodeFunction(pCode *pc) { - - if(pc && pc->type == PC_FUNCTION && PCF(pc)->fname) - return 1; - - return 0; + + if(pc && pc->type == PC_FUNCTION && PCF(pc)->fname) + return 1; + + return 0; } /*-----------------------------------------------------------------*/ @@ -5667,86 +5678,86 @@ bool ispCodeFunction(pCode *pc) /*-----------------------------------------------------------------*/ pCode *findFunction(char *fname) { - pBlock *pb; - pCode *pc; - if(!fname) - return NULL; - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - - pc = setFirstItem(pb->function_entries); - while(pc) { - - if((pc->type == PC_FUNCTION) && - (PCF(pc)->fname) && - (strcmp(fname, PCF(pc)->fname)==0)) - return pc; - - pc = setNextItem(pb->function_entries); - - } - - } - return NULL; + pBlock *pb; + pCode *pc; + if(!fname) + return NULL; + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + + pc = setFirstItem(pb->function_entries); + while(pc) { + + if((pc->type == PC_FUNCTION) && + (PCF(pc)->fname) && + (strcmp(fname, PCF(pc)->fname)==0)) + return pc; + + pc = setNextItem(pb->function_entries); + + } + + } + return NULL; } void MarkUsedRegisters(set *regset) { - - regs *r1,*r2; - - for(r1=setFirstItem(regset); r1; r1=setNextItem(regset)) { - r2 = pic14_regWithIdx(r1->rIdx); - if (r2) { - r2->isFree = 0; - r2->wasUsed = 1; - } - } + + regs *r1,*r2; + + for(r1=setFirstItem(regset); r1; r1=setNextItem(regset)) { + r2 = pic14_regWithIdx(r1->rIdx); + if (r2) { + r2->isFree = 0; + r2->wasUsed = 1; + } + } } void pBlockStats(FILE *of, pBlock *pb) { - - pCode *pc; - regs *r; - - fprintf(of,";***\n; pBlock Stats: dbName = %c\n;***\n",getpBlock_dbName(pb)); - - // for now just print the first element of each set - pc = setFirstItem(pb->function_entries); - if(pc) { - fprintf(of,";entry: "); - pc->print(of,pc); - } - pc = setFirstItem(pb->function_exits); - if(pc) { - fprintf(of,";has an exit\n"); - //pc->print(of,pc); - } - - pc = setFirstItem(pb->function_calls); - if(pc) { - fprintf(of,";functions called:\n"); - - while(pc) { - if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { - fprintf(of,"; %s\n",get_op_from_instruction(PCI(pc))); - } - pc = setNextItem(pb->function_calls); - } - } - - r = setFirstItem(pb->tregisters); - if(r) { - int n = elementsInSet(pb->tregisters); - - fprintf(of,";%d compiler assigned register%c:\n",n, ( (n!=1) ? 's' : ' ')); - - while (r) { - fprintf(of,"; %s\n",r->name); - r = setNextItem(pb->tregisters); - } - } + + pCode *pc; + regs *r; + + fprintf(of,";***\n; pBlock Stats: dbName = %c\n;***\n",getpBlock_dbName(pb)); + + // for now just print the first element of each set + pc = setFirstItem(pb->function_entries); + if(pc) { + fprintf(of,";entry: "); + pc->print(of,pc); + } + pc = setFirstItem(pb->function_exits); + if(pc) { + fprintf(of,";has an exit\n"); + //pc->print(of,pc); + } + + pc = setFirstItem(pb->function_calls); + if(pc) { + fprintf(of,";functions called:\n"); + + while(pc) { + if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { + fprintf(of,"; %s\n",get_op_from_instruction(PCI(pc))); + } + pc = setNextItem(pb->function_calls); + } + } + + r = setFirstItem(pb->tregisters); + if(r) { + int n = elementsInSet(pb->tregisters); + + fprintf(of,";%d compiler assigned register%c:\n",n, ( (n!=1) ? 's' : ' ')); + + while (r) { + fprintf(of,"; %s\n",r->name); + r = setNextItem(pb->tregisters); + } + } } /*-----------------------------------------------------------------*/ @@ -5754,18 +5765,18 @@ void pBlockStats(FILE *of, pBlock *pb) #if 0 static void sequencepCode(void) { - pBlock *pb; - pCode *pc; - - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - - pb->seq = GpCodeSequenceNumber+1; - - for( pc = pb->pcHead; pc; pc = pc->next) - pc->seq = ++GpCodeSequenceNumber; - } - + pBlock *pb; + pCode *pc; + + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + + pb->seq = GpCodeSequenceNumber+1; + + for( pc = pb->pcHead; pc; pc = pc->next) + pc->seq = ++GpCodeSequenceNumber; + } + } #endif @@ -5774,108 +5785,108 @@ static void sequencepCode(void) /* set *register_usage(pBlock *pb) { - pCode *pc,*pcn; - set *registers=NULL; - set *registersInCallPath = NULL; - - / * check recursion * / - - pc = setFirstItem(pb->function_entries); - - if(!pc) - return registers; - - pb->visited = 1; - - if(pc->type != PC_FUNCTION) - fprintf(stderr,"%s, first pc is not a function???\n",__FUNCTION__); - - pc = setFirstItem(pb->function_calls); - for( ; pc; pc = setNextItem(pb->function_calls)) { - - if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { - char *dest = get_op_from_instruction(PCI(pc)); - - pcn = findFunction(dest); - if(pcn) - registersInCallPath = register_usage(pcn->pb); - } else - fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); + pCode *pc,*pcn; + set *registers=NULL; + set *registersInCallPath = NULL; + + / * check recursion * / - } + pc = setFirstItem(pb->function_entries); + + if(!pc) + return registers; + + pb->visited = 1; + + if(pc->type != PC_FUNCTION) + fprintf(stderr,"%s, first pc is not a function???\n",__FUNCTION__); + + pc = setFirstItem(pb->function_calls); + for( ; pc; pc = setNextItem(pb->function_calls)) { + + if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { + char *dest = get_op_from_instruction(PCI(pc)); + + pcn = findFunction(dest); + if(pcn) + registersInCallPath = register_usage(pcn->pb); + } else + fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); + + } #ifdef PCODE_DEBUG - pBlockStats(stderr,pb); // debug + pBlockStats(stderr,pb); // debug #endif - // Mark the registers in this block as used. + // Mark the registers in this block as used. - MarkUsedRegisters(pb->tregisters); - if(registersInCallPath) { - / * registers were used in the functions this pBlock has called * / - / * so now, we need to see if these collide with the ones we are * / - / * using here * / + MarkUsedRegisters(pb->tregisters); + if(registersInCallPath) { + / * registers were used in the functions this pBlock has called * / + / * so now, we need to see if these collide with the ones we are * / + / * using here * / - regs *r1,*r2, *newreg; + regs *r1,*r2, *newreg; - DFPRINTF((stderr,"comparing registers\n")); + DFPRINTF((stderr,"comparing registers\n")); - r1 = setFirstItem(registersInCallPath); - while(r1) { - if (r1->type != REG_STK) { - r2 = setFirstItem(pb->tregisters); + r1 = setFirstItem(registersInCallPath); + while(r1) { + if (r1->type != REG_STK) { + r2 = setFirstItem(pb->tregisters); - while(r2 && (r2->type != REG_STK)) { + while(r2 && (r2->type != REG_STK)) { - if(r2->rIdx == r1->rIdx) { - newreg = pic14_findFreeReg(REG_GPR); + if(r2->rIdx == r1->rIdx) { + newreg = pic14_findFreeReg(REG_GPR); - if(!newreg) { - DFPRINTF((stderr,"Bummer, no more registers.\n")); - exit(1); - } + if(!newreg) { + DFPRINTF((stderr,"Bummer, no more registers.\n")); + exit(1); + } - DFPRINTF((stderr,"Cool found register collision nIdx=%d moving to %d\n", - r1->rIdx, newreg->rIdx)); - r2->rIdx = newreg->rIdx; - if(newreg->name) - r2->name = Safe_strdup(newreg->name); - else - r2->name = NULL; - newreg->isFree = 0; - newreg->wasUsed = 1; - } - r2 = setNextItem(pb->tregisters); - } - } + DFPRINTF((stderr,"Cool found register collision nIdx=%d moving to %d\n", + r1->rIdx, newreg->rIdx)); + r2->rIdx = newreg->rIdx; + if(newreg->name) + r2->name = Safe_strdup(newreg->name); + else + r2->name = NULL; + newreg->isFree = 0; + newreg->wasUsed = 1; + } + r2 = setNextItem(pb->tregisters); + } + } - r1 = setNextItem(registersInCallPath); - } + r1 = setNextItem(registersInCallPath); + } - / * Collisions have been resolved. Now free the registers in the call path * / - r1 = setFirstItem(registersInCallPath); - while(r1) { - newreg = pic14_regWithIdx(r1->rIdx); - if (newreg) newreg->isFree = 1; - r1 = setNextItem(registersInCallPath); - } + / * Collisions have been resolved. Now free the registers in the call path * / + r1 = setFirstItem(registersInCallPath); + while(r1) { + newreg = pic14_regWithIdx(r1->rIdx); + if (newreg) newreg->isFree = 1; + r1 = setNextItem(registersInCallPath); + } - }// else - // MarkUsedRegisters(pb->registers); + }// else + // MarkUsedRegisters(pb->registers); - registers = unionSets(pb->tregisters, registersInCallPath, THROW_NONE); + registers = unionSets(pb->tregisters, registersInCallPath, THROW_NONE); #ifdef PCODE_DEBUG - if(registers) - DFPRINTF((stderr,"returning regs\n")); - else - DFPRINTF((stderr,"not returning regs\n")); + if(registers) + DFPRINTF((stderr,"returning regs\n")); + else + DFPRINTF((stderr,"not returning regs\n")); - DFPRINTF((stderr,"pBlock after register optim.\n")); - pBlockStats(stderr,pb); // debug + DFPRINTF((stderr,"pBlock after register optim.\n")); + pBlockStats(stderr,pb); // debug #endif - return registers; + return registers; } */ @@ -5885,47 +5896,47 @@ set *register_usage(pBlock *pb) /*-----------------------------------------------------------------*/ void pct2(FILE *of,pBlock *pb,int indent) { - pCode *pc,*pcn; - int i; - // set *registersInCallPath = NULL; - - if(!of) - return; - - if(indent > 10) - return; //recursion ? - - pc = setFirstItem(pb->function_entries); - - if(!pc) - return; - - pb->visited = 0; - - for(i=0;itype == PC_FUNCTION) - fprintf(of,"%s\n",PCF(pc)->fname); - else - return; // ??? - - - pc = setFirstItem(pb->function_calls); - for( ; pc; pc = setNextItem(pb->function_calls)) { - - if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { - char *dest = get_op_from_instruction(PCI(pc)); - - pcn = findFunction(dest); - if(pcn) - pct2(of,pcn->pb,indent+1); - } else - fprintf(of,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); - - } - - + pCode *pc,*pcn; + int i; + // set *registersInCallPath = NULL; + + if(!of) + return; + + if(indent > 10) + return; //recursion ? + + pc = setFirstItem(pb->function_entries); + + if(!pc) + return; + + pb->visited = 0; + + for(i=0;itype == PC_FUNCTION) + fprintf(of,"%s\n",PCF(pc)->fname); + else + return; // ??? + + + pc = setFirstItem(pb->function_calls); + for( ; pc; pc = setNextItem(pb->function_calls)) { + + if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) { + char *dest = get_op_from_instruction(PCI(pc)); + + pcn = findFunction(dest); + if(pcn) + pct2(of,pcn->pb,indent+1); + } else + fprintf(of,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); + + } + + } @@ -5936,53 +5947,53 @@ void pct2(FILE *of,pBlock *pb,int indent) void printCallTree(FILE *of) { - pBranch *pbr; - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return; - - if(!of) - of = stderr; - - fprintf(of, "\npBlock statistics\n"); - for(pb = the_pFile->pbHead; pb; pb = pb->next ) - pBlockStats(of,pb); - - - - fprintf(of,"Call Tree\n"); - pbr = the_pFile->functions; - while(pbr) { - if(pbr->pc) { - pc = pbr->pc; - if(!ispCodeFunction(pc)) - fprintf(of,"bug in call tree"); - - - fprintf(of,"Function: %s\n", PCF(pc)->fname); - - while(pc->next && !ispCodeFunction(pc->next)) { - pc = pc->next; - if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) - fprintf(of,"\t%s\n",get_op_from_instruction(PCI(pc))); - } - } - - pbr = pbr->next; - } - - - fprintf(of,"\n**************\n\na better call tree\n"); - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - if(pb->visited) - pct2(of,pb,0); - } - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - fprintf(of,"block dbname: %c\n", getpBlock_dbName(pb)); - } + pBranch *pbr; + pBlock *pb; + pCode *pc; + + if(!the_pFile) + return; + + if(!of) + of = stderr; + + fprintf(of, "\npBlock statistics\n"); + for(pb = the_pFile->pbHead; pb; pb = pb->next ) + pBlockStats(of,pb); + + + + fprintf(of,"Call Tree\n"); + pbr = the_pFile->functions; + while(pbr) { + if(pbr->pc) { + pc = pbr->pc; + if(!ispCodeFunction(pc)) + fprintf(of,"bug in call tree"); + + + fprintf(of,"Function: %s\n", PCF(pc)->fname); + + while(pc->next && !ispCodeFunction(pc->next)) { + pc = pc->next; + if(pc->type == PC_OPCODE && PCI(pc)->op == POC_CALL) + fprintf(of,"\t%s\n",get_op_from_instruction(PCI(pc))); + } + } + + pbr = pbr->next; + } + + + fprintf(of,"\n**************\n\na better call tree\n"); + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + if(pb->visited) + pct2(of,pb,0); + } + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + fprintf(of,"block dbname: %c\n", getpBlock_dbName(pb)); + } } @@ -5993,108 +6004,108 @@ void printCallTree(FILE *of) void InlineFunction(pBlock *pb) { - pCode *pc; - pCode *pc_call; - - if(!pb) - return; - - pc = setFirstItem(pb->function_calls); - - for( ; pc; pc = setNextItem(pb->function_calls)) { - - if(isCALL(pc)) { - pCode *pcn = findFunction(get_op_from_instruction(PCI(pc))); - pCode *pcp = pc->prev; - pCode *pct; - pCode *pce; - - pBranch *pbr; - - if(pcn && isPCF(pcn) && (PCF(pcn)->ncalled == 1) && !PCF(pcn)->isPublic && (pcp && (isPCI_BITSKIP(pcp)||!isPCI_SKIP(pcp)))) { /* Bit skips can be inverted other skips can not */ - - InlineFunction(pcn->pb); - - /* - At this point, *pc points to a CALL mnemonic, and - *pcn points to the function that is being called. - - To in-line this call, we need to remove the CALL - and RETURN(s), and link the function pCode in with - the CALLee pCode. - - */ - - pc_call = pc; - - /* Check if previous instruction was a bit skip */ - if (isPCI_BITSKIP(pcp)) { - pCodeLabel *pcl; - /* Invert skip instruction and add a goto */ - PCI(pcp)->op = (PCI(pcp)->op == POC_BTFSS) ? POC_BTFSC : POC_BTFSS; - - if(isPCL(pc_call->next)) { // Label pcode - pcl = PCL(pc_call->next); - } else if (isPCI(pc_call->next) && PCI(pc_call->next)->label) { // pcode instruction with a label - pcl = PCL(PCI(pc_call->next)->label->pc); - } else { - pcl = PCL(newpCodeLabel(NULL, newiTempLabel(NULL)->key+100)); - PCI(pc_call->next)->label->pc = (struct pCode*)pcl; - } - pCodeInsertAfter(pcp, newpCode(POC_GOTO, newpCodeOp(pcl->label,PO_STR))); - } - - /* remove callee pBlock from the pBlock linked list */ - removepBlock(pcn->pb); - - pce = pcn; - while(pce) { - pce->pb = pb; - pce = pce->next; - } - - /* Remove the Function pCode */ - pct = findNextInstruction(pcn->next); - - /* Link the function with the callee */ - if (pcp) pcp->next = pcn->next; - pcn->next->prev = pcp; - - /* Convert the function name into a label */ - - pbr = Safe_calloc(1,sizeof(pBranch)); - pbr->pc = newpCodeLabel(PCF(pcn)->fname, -1); - pbr->next = NULL; - PCI(pct)->label = pBranchAppend(PCI(pct)->label,pbr); - PCI(pct)->label = pBranchAppend(PCI(pct)->label,PCI(pc_call)->label); - - /* turn all of the return's except the last into goto's */ - /* check case for 2 instruction pBlocks */ - pce = findNextInstruction(pcn->next); - while(pce) { - pCode *pce_next = findNextInstruction(pce->next); - - if(pce_next == NULL) { - /* found the last return */ - pCode *pc_call_next = findNextInstruction(pc_call->next); - - //fprintf(stderr,"found last return\n"); - //pce->print(stderr,pce); - pce->prev->next = pc_call->next; - pc_call->next->prev = pce->prev; - PCI(pc_call_next)->label = pBranchAppend(PCI(pc_call_next)->label, - PCI(pce)->label); - } - - pce = pce_next; - } - - } - } else - fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); - - } - + pCode *pc; + pCode *pc_call; + + if(!pb) + return; + + pc = setFirstItem(pb->function_calls); + + for( ; pc; pc = setNextItem(pb->function_calls)) { + + if(isCALL(pc)) { + pCode *pcn = findFunction(get_op_from_instruction(PCI(pc))); + pCode *pcp = pc->prev; + pCode *pct; + pCode *pce; + + pBranch *pbr; + + if(pcn && isPCF(pcn) && (PCF(pcn)->ncalled == 1) && !PCF(pcn)->isPublic && (pcp && (isPCI_BITSKIP(pcp)||!isPCI_SKIP(pcp)))) { /* Bit skips can be inverted other skips can not */ + + InlineFunction(pcn->pb); + + /* + At this point, *pc points to a CALL mnemonic, and + *pcn points to the function that is being called. + + To in-line this call, we need to remove the CALL + and RETURN(s), and link the function pCode in with + the CALLee pCode. + + */ + + pc_call = pc; + + /* Check if previous instruction was a bit skip */ + if (isPCI_BITSKIP(pcp)) { + pCodeLabel *pcl; + /* Invert skip instruction and add a goto */ + PCI(pcp)->op = (PCI(pcp)->op == POC_BTFSS) ? POC_BTFSC : POC_BTFSS; + + if(isPCL(pc_call->next)) { // Label pcode + pcl = PCL(pc_call->next); + } else if (isPCI(pc_call->next) && PCI(pc_call->next)->label) { // pcode instruction with a label + pcl = PCL(PCI(pc_call->next)->label->pc); + } else { + pcl = PCL(newpCodeLabel(NULL, newiTempLabel(NULL)->key+100)); + PCI(pc_call->next)->label->pc = (struct pCode*)pcl; + } + pCodeInsertAfter(pcp, newpCode(POC_GOTO, newpCodeOp(pcl->label,PO_STR))); + } + + /* remove callee pBlock from the pBlock linked list */ + removepBlock(pcn->pb); + + pce = pcn; + while(pce) { + pce->pb = pb; + pce = pce->next; + } + + /* Remove the Function pCode */ + pct = findNextInstruction(pcn->next); + + /* Link the function with the callee */ + if (pcp) pcp->next = pcn->next; + pcn->next->prev = pcp; + + /* Convert the function name into a label */ + + pbr = Safe_calloc(1,sizeof(pBranch)); + pbr->pc = newpCodeLabel(PCF(pcn)->fname, -1); + pbr->next = NULL; + PCI(pct)->label = pBranchAppend(PCI(pct)->label,pbr); + PCI(pct)->label = pBranchAppend(PCI(pct)->label,PCI(pc_call)->label); + + /* turn all of the return's except the last into goto's */ + /* check case for 2 instruction pBlocks */ + pce = findNextInstruction(pcn->next); + while(pce) { + pCode *pce_next = findNextInstruction(pce->next); + + if(pce_next == NULL) { + /* found the last return */ + pCode *pc_call_next = findNextInstruction(pc_call->next); + + //fprintf(stderr,"found last return\n"); + //pce->print(stderr,pce); + pce->prev->next = pc_call->next; + pc_call->next->prev = pce->prev; + PCI(pc_call_next)->label = pBranchAppend(PCI(pc_call_next)->label, + PCI(pce)->label); + } + + pce = pce_next; + } + + } + } else + fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); + + } + } /*-----------------------------------------------------------------*/ @@ -6103,46 +6114,46 @@ void InlineFunction(pBlock *pb) void InlinepCode(void) { - - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return; - - if(!functionInlining) - return; - - /* Loop through all of the function definitions and count the - * number of times each one is called */ - //fprintf(stderr,"inlining %d\n",__LINE__); - - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - - pc = setFirstItem(pb->function_calls); - - for( ; pc; pc = setNextItem(pb->function_calls)) { - - if(isCALL(pc)) { - pCode *pcn = findFunction(get_op_from_instruction(PCI(pc))); - if(pcn && isPCF(pcn)) { - PCF(pcn)->ncalled++; - } - } else - fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); - - } - } - - //fprintf(stderr,"inlining %d\n",__LINE__); - - /* Now, Loop through the function definitions again, but this - * time inline those functions that have only been called once. */ - - InlineFunction(the_pFile->pbHead); - //fprintf(stderr,"inlining %d\n",__LINE__); - - for(pb = the_pFile->pbHead; pb; pb = pb->next) - unBuildFlow(pb); - + + pBlock *pb; + pCode *pc; + + if(!the_pFile) + return; + + if(!functionInlining) + return; + + /* Loop through all of the function definitions and count the + * number of times each one is called */ + //fprintf(stderr,"inlining %d\n",__LINE__); + + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + + pc = setFirstItem(pb->function_calls); + + for( ; pc; pc = setNextItem(pb->function_calls)) { + + if(isCALL(pc)) { + pCode *pcn = findFunction(get_op_from_instruction(PCI(pc))); + if(pcn && isPCF(pcn)) { + PCF(pcn)->ncalled++; + } + } else + fprintf(stderr,"BUG? pCode isn't a POC_CALL %d\n",__LINE__); + + } + } + + //fprintf(stderr,"inlining %d\n",__LINE__); + + /* Now, Loop through the function definitions again, but this + * time inline those functions that have only been called once. */ + + InlineFunction(the_pFile->pbHead); + //fprintf(stderr,"inlining %d\n",__LINE__); + + for(pb = the_pFile->pbHead; pb; pb = pb->next) + unBuildFlow(pb); + } diff --git a/src/pic/ralloc.h b/src/pic/ralloc.h index 35c58204..234d4f2a 100644 --- a/src/pic/ralloc.h +++ b/src/pic/ralloc.h @@ -3,7 +3,7 @@ SDCCralloc.h - header file register allocation Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) - PIC port - T. Scott Dattalo scott@dattalo.com (2000) + PIC port - T. Scott Dattalo scott@dattalo.com (2000) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -33,20 +33,20 @@ enum { - R2_IDX = 0, R3_IDX, R4_IDX, - R5_IDX, R6_IDX, R7_IDX, - R0_IDX, R1_IDX, X8_IDX, - X9_IDX, X10_IDX, X11_IDX, - X12_IDX, CND_IDX + R2_IDX = 0, R3_IDX, R4_IDX, + R5_IDX, R6_IDX, R7_IDX, + R0_IDX, R1_IDX, X8_IDX, + X9_IDX, X10_IDX, X11_IDX, + X12_IDX, CND_IDX }; enum { - REG_PTR=1, - REG_GPR, - REG_CND, - REG_SFR, - REG_STK, - REG_TMP + REG_PTR=1, + REG_GPR, + REG_CND, + REG_SFR, + REG_STK, + REG_TMP }; //#define REG_PTR 0x01 //#define REG_GPR 0x02 @@ -58,28 +58,28 @@ enum { /* definition for the registers */ typedef struct regs { - short type; /* can have value - * REG_GPR, REG_PTR or REG_CND - * This like the "meta-type" */ - short pc_type; /* pcode type */ - short rIdx; /* index into register table */ - // short otype; - char *name; /* name */ - - unsigned isFree:1; /* is currently unassigned */ - unsigned wasUsed:1; /* becomes true if register has been used */ - unsigned isFixed:1; /* True if address can't change */ - unsigned isMapped:1; /* The Register's address has been mapped to physical RAM */ - unsigned isBitField:1; /* True if reg is type bit OR is holder for several bits */ - unsigned isEmitted:1; /* True if the reg has been written to a .asm file */ - unsigned isPublic:1; /* True if the reg is not static and can be modified in another module (ie a another c or asm file) */ - unsigned isExtern:1; /* True if the reg is in another module */ - unsigned address; /* reg's address if isFixed | isMapped is true */ - unsigned size; /* 0 for byte, 1 for int, 4 for long */ - unsigned alias; /* Alias mask if register appears in multiple banks */ - struct regs *reg_alias; /* If more than one register share the same address - * then they'll point to each other. (primarily for bits)*/ - pCodeRegLives reglives; /* live range mapping */ + short type; /* can have value + * REG_GPR, REG_PTR or REG_CND + * This like the "meta-type" */ + short pc_type; /* pcode type */ + short rIdx; /* index into register table */ + // short otype; + char *name; /* name */ + + unsigned isFree:1; /* is currently unassigned */ + unsigned wasUsed:1; /* becomes true if register has been used */ + unsigned isFixed:1; /* True if address can't change */ + unsigned isMapped:1; /* The Register's address has been mapped to physical RAM */ + unsigned isBitField:1; /* True if reg is type bit OR is holder for several bits */ + unsigned isEmitted:1; /* True if the reg has been written to a .asm file */ + unsigned isPublic:1; /* True if the reg is not static and can be modified in another module (ie a another c or asm file) */ + unsigned isExtern:1; /* True if the reg is in another module */ + unsigned address; /* reg's address if isFixed | isMapped is true */ + unsigned size; /* 0 for byte, 1 for int, 4 for long */ + unsigned alias; /* Alias mask if register appears in multiple banks */ + struct regs *reg_alias; /* If more than one register share the same address + * then they'll point to each other. (primarily for bits)*/ + pCodeRegLives reglives; /* live range mapping */ } regs; extern regs regspic14[]; -- 2.47.2