From: sdattalo Date: Sun, 1 Apr 2001 15:19:12 +0000 (+0000) Subject: split PIC port gen.c pcodepeep.c into smaller files. Added structure support. X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=4c3872ef27c1263faae7d9b85c1821381646ece8;p=fw%2Fsdcc split PIC port gen.c pcodepeep.c into smaller files. Added structure support. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@724 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/pic/Makefile b/src/pic/Makefile index aad06b82..a0ebe7bf 100644 --- a/src/pic/Makefile +++ b/src/pic/Makefile @@ -2,7 +2,7 @@ PRJDIR = ../.. include $(PRJDIR)/Makefile.common -OBJ = gen.o ralloc.o main.o glue.o pcode.o +OBJ = gen.o genarith.o ralloc.o main.o glue.o pcode.o pcodepeep.o LIB = port.a CFLAGS = -ggdb -Wall -O2 diff --git a/src/pic/gen.c b/src/pic/gen.c index 1d1916c2..d4342427 100644 --- a/src/pic/gen.c +++ b/src/pic/gen.c @@ -59,7 +59,9 @@ #include "pcode.h" #include "gen.h" -//char *aopLiteral (value *val, int offset); +static int labelOffset=0; +static int debug_verbose=1; + unsigned int pic14aopLiteral (value *val, int offset); /* this is the down and dirty file with all kinds of @@ -96,15 +98,6 @@ extern int pic14_ptrRegReq ; extern int pic14_nRegs; extern FILE *codeOutFile; static void saverbank (int, iCode *,bool); -#define RESULTONSTACK(x) \ - (IC_RESULT(x) && IC_RESULT(x)->aop && \ - IC_RESULT(x)->aop->type == AOP_STK ) - -#define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) emitcode(";XXX mov","a,%s %s,%d",x,__FILE__,__LINE__); -#define CLRC emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__); - -#define BIT_NUMBER(x) (x & 7) -#define BIT_REGISTER(x) (x>>3) static lineNode *lineHead = NULL; static lineNode *lineCurr = NULL; @@ -114,36 +107,8 @@ static unsigned char SLMask[] = {0xFF ,0xFE, 0xFC, 0xF8, 0xF0, static unsigned char SRMask[] = {0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00}; -#define LSB 0 -#define MSB16 1 -#define MSB24 2 -#define MSB32 3 - - -#define FUNCTION_LABEL_INC 20 -static int labelOffset=0; -static int debug_verbose=1; - static pBlock *pb; -/*-----------------------------------------------------------------*/ -/* Macros for emitting instructions */ -/*-----------------------------------------------------------------*/ - -#define emitSKPC emitpcode(POC_BTFSS,popCopyGPR2Bit(&pc_status,PIC_C_BIT)) -#define emitSKPNC emitpcode(POC_BTFSC,popCopyGPR2Bit(&pc_status,PIC_C_BIT)) -#define emitSKPZ emitpcode(POC_BTFSS,popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) -#define emitSKPNZ emitpcode(POC_BTFSC,popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) -#define emitCLRZ emitpcode(POC_BCF, popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) -#define emitCLRC emitpcode(POC_BCF, popCopyGPR2Bit(&pc_status,PIC_C_BIT)) -#define emitSETZ emitpcode(POC_BSF, popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) -#define emitSETC emitpcode(POC_BSF, popCopyGPR2Bit(&pc_status,PIC_C_BIT)) - -//#define emitSKPC emitcode("btfss","status,c") -//#define emitSKPNC emitcode("btfsc","status,c") -//#define emitSKPZ emitcode("btfss","status,z") -//#define emitSKPNZ emitcode("btfsc","status,z") - /*-----------------------------------------------------------------*/ /* my_powof2(n) - If `n' is an integaer power of 2, then the */ /* exponent of 2 is returned, otherwise -1 is */ @@ -174,16 +139,16 @@ static void emitpLabel(int key) addpCode2pBlock(pb,newpCodeLabel(key)); } -static void emitpcode(PIC_OPCODE poc, pCodeOp *pcop) +void emitpcode(PIC_OPCODE poc, pCodeOp *pcop) { addpCode2pBlock(pb,newpCode(poc,pcop)); } /*-----------------------------------------------------------------*/ -/* emitcode - writes the code into a file : for now it is simple */ +/* pic14_emitcode - writes the code into a file : for now it is simple */ /*-----------------------------------------------------------------*/ -static void emitcode (char *inst,char *fmt, ...) +void pic14_emitcode (char *inst,char *fmt, ...) { va_list ap; char lb[MAX_INLINEASM]; @@ -215,7 +180,7 @@ static void emitcode (char *inst,char *fmt, ...) va_end(ap); } -static void DEBUGemitcode (char *inst,char *fmt, ...) +void DEBUGpic14_emitcode (char *inst,char *fmt, ...) { va_list ap; char lb[MAX_INLINEASM]; @@ -293,7 +258,7 @@ static regs *getFreePtr (iCode *ic, asmop **aopp, bool result) if (!r0iu) { /* push it if not already pushed */ if (!_G.r0Pushed) { - emitcode ("push","%s", + pic14_emitcode ("push","%s", pic14_regWithIdx(R0_IDX)->dname); _G.r0Pushed++ ; } @@ -309,7 +274,7 @@ static regs *getFreePtr (iCode *ic, asmop **aopp, bool result) if (!r1iu) { /* push it if not already pushed */ if (!_G.r1Pushed) { - emitcode ("push","%s", + pic14_emitcode ("push","%s", pic14_regWithIdx(R1_IDX)->dname); _G.r1Pushed++ ; } @@ -337,7 +302,7 @@ endOfWorld : /*-----------------------------------------------------------------*/ /* newAsmop - creates a new asmOp */ /*-----------------------------------------------------------------*/ -static asmop *newAsmop (short type) +asmop *newAsmop (short type) { asmop *aop; @@ -350,13 +315,13 @@ static void genSetDPTR(int n) { if (!n) { - emitcode(";", "Select standard DPTR"); - emitcode("mov", "dps, #0x00"); + pic14_emitcode(";", "Select standard DPTR"); + pic14_emitcode("mov", "dps, #0x00"); } else { - emitcode(";", "Select alternate DPTR"); - emitcode("mov", "dps, #0x01"); + pic14_emitcode(";", "Select alternate DPTR"); + pic14_emitcode("mov", "dps, #0x01"); } } @@ -378,7 +343,7 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) asmop *aop; memmap *space= SPEC_OCLS(sym->etype); - DEBUGemitcode("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); /* if already has one */ if (sym->aop) return sym->aop; @@ -397,20 +362,20 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) if (sym->onStack) { if ( _G.accInUse ) - emitcode("push","acc"); + pic14_emitcode("push","acc"); - emitcode("mov","a,_bp"); - emitcode("add","a,#0x%02x", + pic14_emitcode("mov","a,_bp"); + pic14_emitcode("add","a,#0x%02x", ((sym->stack < 0) ? ((char)(sym->stack - _G.nRegsSaved )) : ((char)sym->stack)) & 0xff); - emitcode("mov","%s,a", + pic14_emitcode("mov","%s,a", aop->aopu.aop_ptr->name); if ( _G.accInUse ) - emitcode("pop","acc"); + pic14_emitcode("pop","acc"); } else - emitcode("mov","%s,#%s", + pic14_emitcode("mov","%s,#%s", aop->aopu.aop_ptr->name, sym->rname); aop->paged = space->paged; @@ -425,38 +390,38 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) * far data space. */ - //DEBUGemitcode(";","%d",__LINE__); + //DEBUGpic14_emitcode(";","%d",__LINE__); if ( _G.accInUse ) - emitcode("push","acc"); + pic14_emitcode("push","acc"); - emitcode("mov","a,_bp"); - emitcode("add","a,#0x%02x", + 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); - emitcode ("mov","dpx1,#0x40"); - emitcode ("mov","dph1,#0x00"); - emitcode ("mov","dpl1, a"); + pic14_emitcode ("mov","dpx1,#0x40"); + pic14_emitcode ("mov","dph1,#0x00"); + pic14_emitcode ("mov","dpl1, a"); genSetDPTR(0); if ( _G.accInUse ) - emitcode("pop","acc"); + pic14_emitcode("pop","acc"); sym->aop = aop = newAsmop(AOP_DPTR2); aop->size = getSize(sym->type); return aop; } - //DEBUGemitcode(";","%d",__LINE__); + //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); - DEBUGemitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); + DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); return aop; } /* if it is in direct space */ @@ -464,7 +429,7 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) sym->aop = aop = newAsmop (AOP_DIR); aop->aopu.aop_dir = sym->rname ; aop->size = getSize(sym->type); - DEBUGemitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); + DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size); return aop; } @@ -482,10 +447,10 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result) /* only remaining is far space */ /* in which case DPTR gets the address */ sym->aop = aop = newAsmop(AOP_DPTR); - emitcode ("mov","dptr,#%s", sym->rname); + pic14_emitcode ("mov","dptr,#%s", sym->rname); aop->size = getSize(sym->type); - DEBUGemitcode(";","%d size = %d",__LINE__,aop->size); + DEBUGpic14_emitcode(";","%d size = %d",__LINE__,aop->size); /* if it is in code space */ if (IN_CODESPACE(space)) aop->code = 1; @@ -501,7 +466,7 @@ static asmop *aopForRemat (symbol *sym) iCode *ic = sym->rematiCode; asmop *aop = newAsmop(AOP_IMMD); int val = 0; - DEBUGemitcode(";","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode(";","%s %d",__FUNCTION__,__LINE__); for (;;) { if (ic->op == '+') val += operandLitValue(IC_RIGHT(ic)); @@ -521,7 +486,7 @@ static asmop *aopForRemat (symbol *sym) else strcpy(buffer,OP_SYMBOL(IC_LEFT(ic))->rname); - //DEBUGemitcode(";","%s",buffer); + //DEBUGpic14_emitcode(";","%s",buffer); aop->aopu.aop_immd = Safe_calloc(1,strlen(buffer)+1); strcpy(aop->aopu.aop_immd,buffer); return aop; @@ -608,9 +573,9 @@ static bool operandsEqu ( operand *op1, operand *op2) } /*-----------------------------------------------------------------*/ -/* sameRegs - two asmops have the same registers */ +/* pic14_sameRegs - two asmops have the same registers */ /*-----------------------------------------------------------------*/ -static bool sameRegs (asmop *aop1, asmop *aop2 ) +bool pic14_sameRegs (asmop *aop1, asmop *aop2 ) { int i; @@ -635,7 +600,7 @@ static bool sameRegs (asmop *aop1, asmop *aop2 ) /*-----------------------------------------------------------------*/ /* aopOp - allocates an asmop for an operand : */ /*-----------------------------------------------------------------*/ -static void aopOp (operand *op, iCode *ic, bool result) +void aopOp (operand *op, iCode *ic, bool result) { asmop *aop; symbol *sym; @@ -644,10 +609,10 @@ static void aopOp (operand *op, iCode *ic, bool result) if (!op) return ; - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); /* if this a literal */ if (IS_OP_LITERAL(op)) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); op->aop = aop = newAsmop(AOP_LIT); aop->aopu.aop_lit = op->operand.valOperand; aop->size = getSize(operandType(op)); @@ -660,14 +625,14 @@ static void aopOp (operand *op, iCode *ic, bool result) /* if the underlying symbol has a aop */ if (IS_SYMOP(op) && OP_SYMBOL(op)->aop) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); op->aop = OP_SYMBOL(op)->aop; return; } /* if this is a true symbol */ if (IS_TRUE_SYMOP(op)) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); op->aop = aopForSym(ic,OP_SYMBOL(op),result); return ; } @@ -685,7 +650,7 @@ static void aopOp (operand *op, iCode *ic, bool result) /* if the type is a conditional */ if (sym->regType == REG_CND) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); aop = op->aop = sym->aop = newAsmop(AOP_CRY); aop->size = 0; return; @@ -696,13 +661,13 @@ static void aopOp (operand *op, iCode *ic, bool result) b) has a spill location */ if (sym->isspilt || sym->nRegs == 0) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); /* rematerialize it NOW */ if (sym->remat) { sym->aop = op->aop = aop = aopForRemat (sym); aop->size = getSize(sym->type); - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); return; } @@ -712,7 +677,7 @@ static void aopOp (operand *op, iCode *ic, bool result) aop->size = getSize(sym->type); for ( i = 0 ; i < 2 ; i++ ) aop->aopu.aop_str[i] = accUse[i]; - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); return; } @@ -722,12 +687,12 @@ static void aopOp (operand *op, iCode *ic, bool result) aop->size = getSize(sym->type); for ( i = 0 ; i < fReturnSizePic ; i++ ) aop->aopu.aop_str[i] = fReturn[i]; - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); return; } /* else spill location */ - DEBUGemitcode(";","%s %d %s",__FUNCTION__,__LINE__,sym->usl.spillLoc->rname); + DEBUGpic14_emitcode(";","%s %d %s",__FUNCTION__,__LINE__,sym->usl.spillLoc->rname); sym->aop = op->aop = aop = aopForSym(ic,sym->usl.spillLoc,result); aop->size = getSize(sym->type); @@ -744,7 +709,7 @@ static void aopOp (operand *op, iCode *ic, bool result) /*-----------------------------------------------------------------*/ /* freeAsmop - free up the asmop given to an operand */ /*----------------------------------------------------------------*/ -static void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) +void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) { asmop *aop ; @@ -767,7 +732,7 @@ static void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) case AOP_R0 : if (_G.r0Pushed ) { if (pop) { - emitcode ("pop","ar0"); + pic14_emitcode ("pop","ar0"); _G.r0Pushed--; } } @@ -777,7 +742,7 @@ static void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) case AOP_R1 : if (_G.r1Pushed ) { if (pop) { - emitcode ("pop","ar1"); + pic14_emitcode ("pop","ar1"); _G.r1Pushed--; } } @@ -803,28 +768,28 @@ static void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop) } if (stk) { - emitcode ("mov","a,_bp"); - emitcode ("add","a,#0x%02x",((char)stk) & 0xff); - emitcode ("mov","%s,a",aop->aopu.aop_ptr->name); + 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 { - emitcode ("mov","%s,_bp",aop->aopu.aop_ptr->name); + pic14_emitcode ("mov","%s,_bp",aop->aopu.aop_ptr->name); } while (sz--) { - emitcode("pop","acc"); - emitcode("mov","@%s,a",aop->aopu.aop_ptr->name); + pic14_emitcode("pop","acc"); + pic14_emitcode("mov","@%s,a",aop->aopu.aop_ptr->name); if (!sz) break; - emitcode("dec","%s",aop->aopu.aop_ptr->name); + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); } op->aop = aop; freeAsmop(op,NULL,ic,TRUE); if (_G.r0Pushed) { - emitcode("pop","ar0"); + pic14_emitcode("pop","ar0"); _G.r0Pushed--; } if (_G.r1Pushed) { - emitcode("pop","ar1"); + pic14_emitcode("pop","ar1"); _G.r1Pushed--; } } @@ -846,12 +811,12 @@ dealloc: /*-----------------------------------------------------------------*/ /* aopGet - for fetching value of the aop */ /*-----------------------------------------------------------------*/ -static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) +char *aopGet (asmop *aop, int offset, bool bit16, bool dname) { char *s = buffer ; char *rs; - //DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* offset is greater than size then zero */ if (offset > (aop->size - 1) && @@ -863,21 +828,21 @@ static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) case AOP_R0: case AOP_R1: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); /* if we need to increment it */ while (offset > aop->coff) { - emitcode ("inc","%s",aop->aopu.aop_ptr->name); + pic14_emitcode ("inc","%s",aop->aopu.aop_ptr->name); aop->coff++; } while (offset < aop->coff) { - emitcode("dec","%s",aop->aopu.aop_ptr->name); + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); aop->coff--; } aop->coff = offset ; if (aop->paged) { - emitcode("movx","a,@%s",aop->aopu.aop_ptr->name); + pic14_emitcode("movx","a,@%s",aop->aopu.aop_ptr->name); return (dname ? "acc" : "a"); } sprintf(s,"@%s",aop->aopu.aop_ptr->name); @@ -887,29 +852,29 @@ static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) case AOP_DPTR: case AOP_DPTR2: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); if (aop->type == AOP_DPTR2) { genSetDPTR(1); } while (offset > aop->coff) { - emitcode ("inc","dptr"); + pic14_emitcode ("inc","dptr"); aop->coff++; } while (offset < aop->coff) { - emitcode("lcall","__decdptr"); + pic14_emitcode("lcall","__decdptr"); aop->coff--; } aop->coff = offset; if (aop->code) { - emitcode("clr","a"); - emitcode("movc","a,@a+dptr"); + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a,@a+dptr"); } else { - emitcode("movx","a,@dptr"); + pic14_emitcode("movx","a,@dptr"); } if (aop->type == AOP_DPTR2) @@ -921,7 +886,7 @@ static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) case AOP_IMMD: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); if (bit16) sprintf (s,"%s",aop->aopu.aop_immd); else @@ -948,36 +913,36 @@ static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) return rs; case AOP_REG: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); if (dname) return aop->aopu.aop_reg[offset]->dname; else return aop->aopu.aop_reg[offset]->name; case AOP_CRY: - emitcode(";","%d",__LINE__); - //emitcode("clr","a"); - //emitcode("mov","c,%s",aop->aopu.aop_dir); - //emitcode("rlc","a") ; + pic14_emitcode(";","%d",__LINE__); + //pic14_emitcode("clr","a"); + //pic14_emitcode("mov","c,%s",aop->aopu.aop_dir); + //pic14_emitcode("rlc","a") ; //return (dname ? "acc" : "a"); return aop->aopu.aop_dir; case AOP_ACC: - DEBUGemitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__); + DEBUGpic14_emitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__); //if (!offset && dname) // return "acc"; //return aop->aopu.aop_str[offset]; return "AOP_accumulator_bug"; case AOP_LIT: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); 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: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); aop->coff = offset ; if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && dname) @@ -995,36 +960,39 @@ static char *aopGet (asmop *aop, int offset, bool bit16, bool dname) /*-----------------------------------------------------------------*/ /* popGetLabel - create a new pCodeOp of type PO_LABEL */ /*-----------------------------------------------------------------*/ -static pCodeOp *popGetLabel(unsigned int key) +pCodeOp *popGetLabel(unsigned int key) { return newpCodeOpLabel(key+100+labelOffset); } /*-----------------------------------------------------------------*/ -/* popCopy - copy a pcode operator */ +/* popCopyReg - copy a pcode operator */ /*-----------------------------------------------------------------*/ -static pCodeOp *popCopy(pCodeOp *pc) +pCodeOp *popCopyReg(pCodeOpReg *pc) { - pCodeOp *pcop; + pCodeOpReg *pcor; - pcop = Safe_calloc(1,sizeof(pCodeOp) ); - pcop->type = pc->type; - if(!(pcop->name = strdup(pc->name))) + pcor = Safe_calloc(1,sizeof(pCodeOpReg) ); + pcor->pcop.type = pc->pcop.type; + if(!(pcor->pcop.name = strdup(pc->pcop.name))) fprintf(stderr,"oops %s %d",__FILE__,__LINE__); + pcor->r = pc->r; + pcor->rIdx = pc->rIdx; - return pcop; + + return PCOP(pcor); } /*-----------------------------------------------------------------*/ /* popCopy - copy a pcode operator */ /*-----------------------------------------------------------------*/ -static pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval) +pCodeOp *popCopyGPR2Bit(pCodeOpReg *pc, int bitval) { pCodeOp *pcop; pcop = Safe_calloc(1,sizeof(pCodeOpBit) ); pcop->type = PO_BIT; - if(!(pcop->name = strdup(pc->name))) + if(!(pcop->name = strdup(pc->pcop.name))) fprintf(stderr,"oops %s %d",__FILE__,__LINE__); ((pCodeOpBit *)pcop)->bit = bitval; @@ -1036,7 +1004,7 @@ static pCodeOp *popCopyGPR2Bit(pCodeOp *pc, int bitval) /*-----------------------------------------------------------------*/ /* popGet - asm operator to pcode operator conversion */ /*-----------------------------------------------------------------*/ -static pCodeOp *popGetLit(unsigned int lit) +pCodeOp *popGetLit(unsigned int lit) { return newpCodeOpLit(lit); @@ -1046,7 +1014,7 @@ static pCodeOp *popGetLit(unsigned int lit) /*-----------------------------------------------------------------*/ /* popGet - asm operator to pcode operator conversion */ /*-----------------------------------------------------------------*/ -static pCodeOp *popGetWithString(char *str) +pCodeOp *popGetWithString(char *str) { pCodeOp *pcop; @@ -1060,17 +1028,33 @@ static pCodeOp *popGetWithString(char *str) return pcop; } + +pCodeOp *popRegFromString(char *str) +{ + + 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( ( (str) ? str : "BAD STRING")); + + return pcop; +} + /*-----------------------------------------------------------------*/ /* popGet - asm operator to pcode operator conversion */ /*-----------------------------------------------------------------*/ -static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) +pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) { char *s = buffer ; char *rs; pCodeOp *pcop; - //DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + //DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* offset is greater than size then zero */ @@ -1086,7 +1070,7 @@ static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) case AOP_DPTR: case AOP_DPTR2: case AOP_ACC: - DEBUGemitcode(";8051 legacy","%d",__LINE__); + DEBUGpic14_emitcode(";8051 legacy","%d",__LINE__); pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); pcop->type = PO_SFR_REGISTER; @@ -1099,7 +1083,7 @@ static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) return pcop; case AOP_IMMD: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); pcop = Safe_calloc(1,sizeof(pCodeOp) ); pcop->type = PO_IMMEDIATE; if (bit16) @@ -1131,28 +1115,22 @@ static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) case AOP_REG: { - int len; + int rIdx = aop->aopu.aop_reg[offset]->rIdx; - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); pcop = Safe_calloc(1,sizeof(pCodeOpReg) ); pcop->type = PO_GPR_REGISTER; + PCOR(pcop)->rIdx = rIdx; + PCOR(pcop)->r = pic14_regWithIdx(rIdx); + pcop->type = PCOR(pcop)->r->pc_type; + if (dname) rs = aop->aopu.aop_reg[offset]->dname; else rs = aop->aopu.aop_reg[offset]->name; - PCOR(pcop)->rIdx = aop->aopu.aop_reg[offset]->rIdx; - PCOR(pcop)->r = pic14_regWithIdx(aop->aopu.aop_reg[offset]->rIdx); - // Really nasty hack to check for temporary registers - len = strlen(rs); - if(len >=3 && rs[0]=='r' && rs[1]=='0' && rs[2]=='x') - pcop->type = PO_GPR_TEMP; - else - fprintf(stderr,"popGet - AOP_REG is not a temp: %s\n",rs); + DEBUGpic14_emitcode(";","%d %s",__LINE__,rs); - DEBUGemitcode(";","%d %s",__LINE__,rs); - pcop->name = NULL;// Safe_calloc(1,(strlen(rs)+1)); - //strcpy(pcop->name,rs); return pcop; } @@ -1161,11 +1139,11 @@ static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) return pcop; case AOP_LIT: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset)); case AOP_STR: - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); pcop = Safe_calloc(1,sizeof(pCodeOp) ); pcop->type = PO_STR; @@ -1188,12 +1166,12 @@ static pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname) /*-----------------------------------------------------------------*/ /* aopPut - puts a string for a aop */ /*-----------------------------------------------------------------*/ -static void aopPut (asmop *aop, char *s, int offset) +void aopPut (asmop *aop, char *s, int offset) { char *d = buffer ; symbol *lbl ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (aop->size && offset > ( aop->size - 1)) { werror(E_INTERNAL_ERROR,__FILE__,__LINE__, @@ -1212,13 +1190,13 @@ static void aopPut (asmop *aop, char *s, int offset) sprintf(d,"%s",aop->aopu.aop_dir); if (strcmp(d,s)) { - DEBUGemitcode(";","%d",__LINE__); + DEBUGpic14_emitcode(";","%d",__LINE__); if(strcmp(s,"W")) - emitcode("movf","%s,w",s); - emitcode("movwf","%s",d); + pic14_emitcode("movf","%s,w",s); + pic14_emitcode("movwf","%s",d); if(strcmp(s,"W")) - emitcode(";BUG! should have this:movf","%s,w %d",s,__LINE__); + pic14_emitcode(";BUG! should have this:movf","%s,w %d",s,__LINE__); emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE)); @@ -1238,19 +1216,28 @@ static void aopPut (asmop *aop, char *s, int offset) strcmp(s,"r5") == 0 || strcmp(s,"r6") == 0 || strcmp(s,"r7") == 0 ) - emitcode("mov","%s,%s ; %d", + pic14_emitcode("mov","%s,%s ; %d", aop->aopu.aop_reg[offset]->dname,s,__LINE__); else */ if(strcmp(s,"W")) - emitcode("movf","%s,w ; %d",s,__LINE__); + pic14_emitcode("movf","%s,w ; %d",s,__LINE__); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aop->aopu.aop_reg[offset]->name); - if(strcmp(s,"W")) - emitcode(";BUG! should have this:movf","%s,w %d",s,__LINE__); + if(strcmp(s,"W")) { + 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,FALSE,FALSE)); } @@ -1272,12 +1259,12 @@ static void aopPut (asmop *aop, char *s, int offset) while (offset > aop->coff) { aop->coff++; - emitcode ("inc","dptr"); + pic14_emitcode ("inc","dptr"); } while (offset < aop->coff) { aop->coff-- ; - emitcode("lcall","__decdptr"); + pic14_emitcode("lcall","__decdptr"); } aop->coff = offset; @@ -1285,7 +1272,7 @@ static void aopPut (asmop *aop, char *s, int offset) /* if not in accumulater */ MOVA(s); - emitcode ("movx","@dptr,a"); + pic14_emitcode ("movx","@dptr,a"); if (aop->type == AOP_DPTR2) { @@ -1297,22 +1284,22 @@ static void aopPut (asmop *aop, char *s, int offset) case AOP_R1: while (offset > aop->coff) { aop->coff++; - emitcode("inc","%s",aop->aopu.aop_ptr->name); + pic14_emitcode("inc","%s",aop->aopu.aop_ptr->name); } while (offset < aop->coff) { aop->coff-- ; - emitcode ("dec","%s",aop->aopu.aop_ptr->name); + pic14_emitcode ("dec","%s",aop->aopu.aop_ptr->name); } aop->coff = offset; if (aop->paged) { MOVA(s); - emitcode("movx","@%s,a",aop->aopu.aop_ptr->name); + pic14_emitcode("movx","@%s,a",aop->aopu.aop_ptr->name); } else if (*s == '@') { MOVA(s); - emitcode("mov","@%s,a ; %d",aop->aopu.aop_ptr->name,__LINE__); + pic14_emitcode("mov","@%s,a ; %d",aop->aopu.aop_ptr->name,__LINE__); } else if (strcmp(s,"r0") == 0 || strcmp(s,"r1") == 0 || @@ -1324,46 +1311,46 @@ static void aopPut (asmop *aop, char *s, int offset) strcmp(s,"r7") == 0 ) { char buffer[10]; sprintf(buffer,"a%s",s); - emitcode("mov","@%s,%s", + pic14_emitcode("mov","@%s,%s", aop->aopu.aop_ptr->name,buffer); } else - emitcode("mov","@%s,%s",aop->aopu.aop_ptr->name,s); + pic14_emitcode("mov","@%s,%s",aop->aopu.aop_ptr->name,s); break; case AOP_STK: if (strcmp(s,"a") == 0) - emitcode("push","acc"); + pic14_emitcode("push","acc"); else - emitcode("push","%s",s); + pic14_emitcode("push","%s",s); break; case AOP_CRY: /* if bit variable */ if (!aop->aopu.aop_dir) { - emitcode("clr","a"); - emitcode("rlc","a"); + pic14_emitcode("clr","a"); + pic14_emitcode("rlc","a"); } else { if (s == zero) - emitcode("clr","%s",aop->aopu.aop_dir); + pic14_emitcode("clr","%s",aop->aopu.aop_dir); else if (s == one) - emitcode("setb","%s",aop->aopu.aop_dir); + pic14_emitcode("setb","%s",aop->aopu.aop_dir); else if (!strcmp(s,"c")) - emitcode("mov","%s,c",aop->aopu.aop_dir); + pic14_emitcode("mov","%s,c",aop->aopu.aop_dir); else { lbl = newiTempLabel(NULL); if (strcmp(s,"a")) { MOVA(s); } - emitcode("clr","c"); - emitcode("jz","%05d_DS_",lbl->key+100); - emitcode("cpl","c"); - emitcode("","%05d_DS_:",lbl->key+100); - emitcode("mov","%s,c",aop->aopu.aop_dir); + 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; @@ -1371,7 +1358,7 @@ static void aopPut (asmop *aop, char *s, int offset) case AOP_STR: aop->coff = offset; if (strcmp(aop->aopu.aop_str[offset],s)) - emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s,__LINE__); + pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s,__LINE__); break; case AOP_ACC: @@ -1380,7 +1367,7 @@ static void aopPut (asmop *aop, char *s, int offset) break; if (strcmp(aop->aopu.aop_str[offset],s)) - emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s, __LINE__); + pic14_emitcode ("mov","%s,%s ; %d",aop->aopu.aop_str[offset],s, __LINE__); break; default : @@ -1398,7 +1385,7 @@ static void reAdjustPreg (asmop *aop) { int size ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aop->coff = 0; if ((size = aop->size) <= 1) return ; @@ -1407,7 +1394,7 @@ static void reAdjustPreg (asmop *aop) case AOP_R0 : case AOP_R1 : while (size--) - emitcode("dec","%s",aop->aopu.aop_ptr->name); + pic14_emitcode("dec","%s",aop->aopu.aop_ptr->name); break; case AOP_DPTR : case AOP_DPTR2: @@ -1417,7 +1404,7 @@ static void reAdjustPreg (asmop *aop) } while (size--) { - emitcode("lcall","__decdptr"); + pic14_emitcode("lcall","__decdptr"); } if (aop->type == AOP_DPTR2) @@ -1430,20 +1417,6 @@ static void reAdjustPreg (asmop *aop) } -#define AOP(op) op->aop -#define AOP_TYPE(op) AOP(op)->type -#define AOP_SIZE(op) AOP(op)->size -#define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \ - AOP_TYPE(x) == AOP_R0)) - -#define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY || \ - AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \ - AOP(x)->paged)) - -#define AOP_INPREG(x) (x && (x->type == AOP_REG && \ - (x->aopu.aop_reg[0] == pic14_regWithIdx(R0_IDX) || \ - x->aopu.aop_reg[0] == pic14_regWithIdx(R1_IDX) ))) - /*-----------------------------------------------------------------*/ /* genNotFloat - generates not for float operations */ /*-----------------------------------------------------------------*/ @@ -1453,7 +1426,7 @@ static void genNotFloat (operand *op, operand *res) char *l; symbol *tlbl ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* we will put 127 in the first byte of the result */ aopPut(AOP(res),"#127",0); @@ -1464,7 +1437,7 @@ static void genNotFloat (operand *op, operand *res) MOVA(l); while(size--) { - emitcode("orl","a,%s", + pic14_emitcode("orl","a,%s", aopGet(op->aop, offset++,FALSE,FALSE)); } @@ -1472,9 +1445,9 @@ static void genNotFloat (operand *op, operand *res) tlbl = newiTempLabel(NULL); aopPut(res->aop,one,1); - emitcode("jz","%05d_DS_",(tlbl->key+100)); + pic14_emitcode("jz","%05d_DS_",(tlbl->key+100)); aopPut(res->aop,zero,1); - emitcode("","%05d_DS_:",(tlbl->key+100)); + pic14_emitcode("","%05d_DS_:",(tlbl->key+100)); size = res->aop->size - 2; offset = 2; @@ -1492,7 +1465,7 @@ static int opIsGptr(operand *op) { sym_link *type = operandType(op); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if ((AOP_SIZE(op) == GPTRSIZE) && IS_GENPTR(type)) { return 1; @@ -1502,11 +1475,11 @@ static int opIsGptr(operand *op) #endif /*-----------------------------------------------------------------*/ -/* getDataSize - get the operand data size */ +/* pic14_getDataSize - get the operand data size */ /*-----------------------------------------------------------------*/ -static int getDataSize(operand *op) +int pic14_getDataSize(operand *op) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); return AOP_SIZE(op); @@ -1525,7 +1498,7 @@ static int getDataSize(operand *op) * should ignore the high byte (pointer type). */ size--; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); } } return size; @@ -1533,13 +1506,13 @@ static int getDataSize(operand *op) } /*-----------------------------------------------------------------*/ -/* outAcc - output Acc */ +/* pic14_outAcc - output Acc */ /*-----------------------------------------------------------------*/ -static void outAcc(operand *result) +void pic14_outAcc(operand *result) { int size, offset; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - size = getDataSize(result); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + size = pic14_getDataSize(result); if(size){ aopPut(AOP(result),"a",0); size--; @@ -1552,38 +1525,38 @@ static void outAcc(operand *result) } /*-----------------------------------------------------------------*/ -/* outBitC - output a bit C */ +/* pic14_outBitC - output a bit C */ /*-----------------------------------------------------------------*/ -static void outBitC(operand *result) +void pic14_outBitC(operand *result) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if the result is bit */ if (AOP_TYPE(result) == AOP_CRY) aopPut(AOP(result),"c",0); else { - emitcode("clr","a ; %d", __LINE__); - emitcode("rlc","a"); - outAcc(result); + pic14_emitcode("clr","a ; %d", __LINE__); + pic14_emitcode("rlc","a"); + pic14_outAcc(result); } } /*-----------------------------------------------------------------*/ -/* toBoolean - emit code for orl a,operator(sizeop) */ +/* pic14_toBoolean - emit code for orl a,operator(sizeop) */ /*-----------------------------------------------------------------*/ -static void toBoolean(operand *oper) +void pic14_toBoolean(operand *oper) { int size = AOP_SIZE(oper) - 1; int offset = 1; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if ( AOP_TYPE(oper) != AOP_ACC) { emitpcode(POC_MOVFW,popGet(AOP(oper),0,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(oper),0,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(oper),0,FALSE,FALSE)); } while (size--) { - emitcode("iorwf","%s,w",aopGet(AOP(oper),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(oper),offset,FALSE,FALSE)); emitpcode(POC_IORFW, popGet(AOP(oper),offset++,FALSE,FALSE)); } } @@ -1597,17 +1570,17 @@ static void genNot (iCode *ic) symbol *tlbl; sym_link *optype = operandType(IC_LEFT(ic)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign asmOps to operand & result */ aopOp (IC_LEFT(ic),ic,FALSE); aopOp (IC_RESULT(ic),ic,TRUE); /* if in bit space then a special case */ if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) { - emitcode("movlw","1<<%s"); - //emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); - //emitcode("cpl","c"); - //outBitC(IC_RESULT(ic)); + pic14_emitcode("movlw","1<<%s"); + //pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); + //pic14_emitcode("cpl","c"); + //pic14_outBitC(IC_RESULT(ic)); goto release; } @@ -1617,12 +1590,12 @@ static void genNot (iCode *ic) goto release; } - toBoolean(IC_LEFT(ic)); + pic14_toBoolean(IC_LEFT(ic)); tlbl = newiTempLabel(NULL); - emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); - outBitC(IC_RESULT(ic)); + 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 */ @@ -1640,7 +1613,7 @@ static void genCpl (iCode *ic) int size ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign asmOps to operand & result */ aopOp (IC_LEFT(ic),ic,FALSE); aopOp (IC_RESULT(ic),ic,TRUE); @@ -1650,9 +1623,9 @@ static void genCpl (iCode *ic) if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { - emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); - emitcode("cpl","c"); - emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); + pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); + pic14_emitcode("cpl","c"); + pic14_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); goto release; } @@ -1660,7 +1633,7 @@ static void genCpl (iCode *ic) while (size--) { char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE); MOVA(l); - emitcode("cpl","a"); + pic14_emitcode("cpl","a"); aopPut(AOP(IC_RESULT(ic)),"a",offset++); } @@ -1679,7 +1652,7 @@ static void genUminusFloat(operand *op,operand *result) int size ,offset =0 ; char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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; @@ -1687,7 +1660,7 @@ static void genUminusFloat(operand *op,operand *result) MOVA(l); - emitcode("cpl","acc.7"); + pic14_emitcode("cpl","acc.7"); aopPut(AOP(result),"a",3); while(size--) { @@ -1707,7 +1680,7 @@ static void genUminus (iCode *ic) sym_link *optype, *rtype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign asmops */ aopOp(IC_LEFT(ic),ic,FALSE); aopOp(IC_RESULT(ic),ic,TRUE); @@ -1717,9 +1690,9 @@ static void genUminus (iCode *ic) if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { - emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); - emitcode("cpl","c"); - emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); + pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); + pic14_emitcode("cpl","c"); + pic14_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); goto release; } @@ -1739,11 +1712,11 @@ static void genUminus (iCode *ic) while(size--) { char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE); if (!strcmp(l,"a")) { - emitcode("cpl","a"); - emitcode("inc","a"); + pic14_emitcode("cpl","a"); + pic14_emitcode("inc","a"); } else { - emitcode("clr","a"); - emitcode("subb","a,%s",l); + pic14_emitcode("clr","a"); + pic14_emitcode("subb","a,%s",l); } aopPut(AOP(IC_RESULT(ic)),"a",offset++); } @@ -1751,8 +1724,8 @@ static void genUminus (iCode *ic) /* if any remaining bytes in the result */ /* we just need to propagate the sign */ if ((size = (AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_LEFT(ic))))) { - emitcode("rlc","a"); - emitcode("subb","a,acc"); + pic14_emitcode("rlc","a"); + pic14_emitcode("subb","a,acc"); while (size--) aopPut(AOP(IC_RESULT(ic)),"a",offset++); } @@ -1773,7 +1746,7 @@ static void saveRegisters(iCode *lic) bitVect *rsave; sym_link *detype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* look for call */ for (ic = lic ; ic ; ic = ic->next) if (ic->op == CALL || ic->op == PCALL) @@ -1797,25 +1770,25 @@ static void saveRegisters(iCode *lic) ic->regsSaved = 1; if (options.useXstack) { if (bitVectBitValue(rsave,R0_IDX)) - emitcode("mov","b,r0"); - emitcode("mov","r0,%s",spname); + 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) - emitcode("mov","a,b"); + pic14_emitcode("mov","a,b"); else - emitcode("mov","a,%s",pic14_regWithIdx(i)->name); - emitcode("movx","@r0,a"); - emitcode("inc","r0"); + pic14_emitcode("mov","a,%s",pic14_regWithIdx(i)->name); + pic14_emitcode("movx","@r0,a"); + pic14_emitcode("inc","r0"); } } - emitcode("mov","%s,r0",spname); + pic14_emitcode("mov","%s,r0",spname); if (bitVectBitValue(rsave,R0_IDX)) - emitcode("mov","r0,b"); + pic14_emitcode("mov","r0,b"); } else for (i = 0 ; i < pic14_nRegs ; i++) { if (bitVectBitValue(rsave,i)) - emitcode("push","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); } detype = getSpec(operandType(IC_LEFT(ic))); @@ -1835,32 +1808,32 @@ static void unsaveRegisters (iCode *ic) int i; bitVect *rsave; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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) { - emitcode("mov","r0,%s",spname); + pic14_emitcode("mov","r0,%s",spname); for (i = pic14_nRegs ; i >= 0 ; i--) { if (bitVectBitValue(rsave,i)) { - emitcode("dec","r0"); - emitcode("movx","a,@r0"); + pic14_emitcode("dec","r0"); + pic14_emitcode("movx","a,@r0"); if (i == R0_IDX) - emitcode("mov","b,a"); + pic14_emitcode("mov","b,a"); else - emitcode("mov","%s,a",pic14_regWithIdx(i)->name); + pic14_emitcode("mov","%s,a",pic14_regWithIdx(i)->name); } } - emitcode("mov","%s,r0",spname); + pic14_emitcode("mov","%s,r0",spname); if (bitVectBitValue(rsave,R0_IDX)) - emitcode("mov","r0,b"); + pic14_emitcode("mov","r0,b"); } else for (i = pic14_nRegs ; i >= 0 ; i--) { if (bitVectBitValue(rsave,i)) - emitcode("pop","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname); } } @@ -1872,16 +1845,16 @@ static void unsaveRegisters (iCode *ic) static void pushSide(operand * oper, int size) { int offset = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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") ) { - emitcode("mov","a,%s",l); - emitcode("push","acc"); + pic14_emitcode("mov","a,%s",l); + pic14_emitcode("push","acc"); } else - emitcode("push","%s",l); + pic14_emitcode("push","%s",l); } } @@ -1893,7 +1866,7 @@ static void assignResultValue(operand * oper) int offset = 0; int size = AOP_SIZE(oper); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); // The last byte in the assignment is in W aopPut(AOP(oper),"W",size-1); @@ -1917,12 +1890,12 @@ static void genXpush (iCode *ic) regs *r ; int size,offset = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(IC_LEFT(ic),ic,FALSE); r = getFreePtr(ic,&aop,FALSE); - emitcode("mov","%s,_spx",r->name); + pic14_emitcode("mov","%s,_spx",r->name); size = AOP_SIZE(IC_LEFT(ic)); while(size--) { @@ -1930,13 +1903,13 @@ static void genXpush (iCode *ic) char *l = aopGet(AOP(IC_LEFT(ic)), offset++,FALSE,FALSE); MOVA(l); - emitcode("movx","@%s,a",r->name); - emitcode("inc","%s",r->name); + pic14_emitcode("movx","@%s,a",r->name); + pic14_emitcode("inc","%s",r->name); } - emitcode("mov","_spx,%s",r->name); + pic14_emitcode("mov","_spx,%s",r->name); freeAsmop(NULL,aop,ic,TRUE); freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); @@ -1951,7 +1924,7 @@ static void genIpush (iCode *ic) char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* 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) { @@ -1969,7 +1942,7 @@ static void genIpush (iCode *ic) MOVA(l); l = "acc"; } - emitcode("push","%s",l); + pic14_emitcode("push","%s",l); } return ; } @@ -1998,10 +1971,10 @@ static void genIpush (iCode *ic) if (AOP_TYPE(IC_LEFT(ic)) != AOP_REG && AOP_TYPE(IC_LEFT(ic)) != AOP_DIR && strcmp(l,"a") ) { - emitcode("mov","a,%s",l); - emitcode("push","acc"); + pic14_emitcode("mov","a,%s",l); + pic14_emitcode("push","acc"); } else - emitcode("push","%s",l); + pic14_emitcode("push","%s",l); } freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); @@ -2015,7 +1988,7 @@ static void genIpop (iCode *ic) int size,offset ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if the temp was not pushed then */ if (OP_SYMBOL(IC_LEFT(ic))->isspilt) return ; @@ -2024,7 +1997,7 @@ static void genIpop (iCode *ic) size = AOP_SIZE(IC_LEFT(ic)); offset = (size-1); while (size--) - emitcode("pop","%s",aopGet(AOP(IC_LEFT(ic)),offset--, + pic14_emitcode("pop","%s",aopGet(AOP(IC_LEFT(ic)),offset--, FALSE,TRUE)); freeAsmop(IC_LEFT(ic),NULL,ic,TRUE); @@ -2039,37 +2012,37 @@ static void unsaverbank (int bank,iCode *ic,bool popPsw) asmop *aop ; regs *r = NULL; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (popPsw) { if (options.useXstack) { aop = newAsmop(0); r = getFreePtr(ic,&aop,FALSE); - emitcode("mov","%s,_spx",r->name); - emitcode("movx","a,@%s",r->name); - emitcode("mov","psw,a"); - emitcode("dec","%s",r->name); + 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 - emitcode ("pop","psw"); + pic14_emitcode ("pop","psw"); } for (i = (pic14_nRegs - 1) ; i >= 0 ;i--) { if (options.useXstack) { - emitcode("movx","a,@%s",r->name); - //emitcode("mov","(%s+%d),a", + pic14_emitcode("movx","a,@%s",r->name); + //pic14_emitcode("mov","(%s+%d),a", // regspic14[i].base,8*bank+regspic14[i].offset); - emitcode("dec","%s",r->name); + pic14_emitcode("dec","%s",r->name); } else - emitcode("pop",""); //"(%s+%d)", + pic14_emitcode("pop",""); //"(%s+%d)", //regspic14[i].base,8*bank); //+regspic14[i].offset); } if (options.useXstack) { - emitcode("mov","_spx,%s",r->name); + pic14_emitcode("mov","_spx,%s",r->name); freeAsmop(NULL,aop,ic,TRUE); } @@ -2084,38 +2057,38 @@ static void saverbank (int bank, iCode *ic, bool pushPsw) asmop *aop ; regs *r = NULL; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (options.useXstack) { aop = newAsmop(0); r = getFreePtr(ic,&aop,FALSE); - emitcode("mov","%s,_spx",r->name); + pic14_emitcode("mov","%s,_spx",r->name); } for (i = 0 ; i < pic14_nRegs ;i++) { if (options.useXstack) { - emitcode("inc","%s",r->name); - //emitcode("mov","a,(%s+%d)", + pic14_emitcode("inc","%s",r->name); + //pic14_emitcode("mov","a,(%s+%d)", // regspic14[i].base,8*bank+regspic14[i].offset); - emitcode("movx","@%s,a",r->name); + pic14_emitcode("movx","@%s,a",r->name); } else - emitcode("push","");// "(%s+%d)", + pic14_emitcode("push","");// "(%s+%d)", //regspic14[i].base,8*bank+regspic14[i].offset); } if (pushPsw) { if (options.useXstack) { - emitcode("mov","a,psw"); - emitcode("movx","@%s,a",r->name); - emitcode("inc","%s",r->name); - emitcode("mov","_spx,%s",r->name); + 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 - emitcode("push","psw"); + pic14_emitcode("push","psw"); - emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff); + pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff); } ic->bankSaved = 1; @@ -2128,7 +2101,7 @@ static void genCall (iCode *ic) { sym_link *detype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if caller saves & we have not saved then */ if (!ic->regsSaved) @@ -2158,21 +2131,21 @@ static void genCall (iCode *ic) while (size--) { char *l = aopGet(AOP(IC_LEFT(sic)),offset, FALSE,FALSE); - DEBUGemitcode(";","%d - left type %d",__LINE__,AOP(IC_LEFT(sic))->type); + DEBUGpic14_emitcode(";","%d - left type %d",__LINE__,AOP(IC_LEFT(sic))->type); if (strcmp(l,fReturn[offset])) { if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) || ((AOP(IC_LEFT(sic))->type) == AOP_LIT) ) emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE)); - //emitcode("movlw","%s",l); + //pic14_emitcode("movlw","%s",l); else emitpcode(POC_MOVFW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE)); - //emitcode("movf","%s,w",l); + //pic14_emitcode("movf","%s,w",l); // The last one is passed in W if(size) - emitcode("movwf","%s",fReturn[offset]); + pic14_emitcode("movwf","%s",fReturn[offset]); } offset++; } @@ -2185,7 +2158,7 @@ static void genCall (iCode *ic) OP_SYMBOL(IC_LEFT(ic))->rname : OP_SYMBOL(IC_LEFT(ic))->name)); - emitcode("call","%s",(OP_SYMBOL(IC_LEFT(ic))->rname[0] ? + pic14_emitcode("call","%s",(OP_SYMBOL(IC_LEFT(ic))->rname[0] ? OP_SYMBOL(IC_LEFT(ic))->rname : OP_SYMBOL(IC_LEFT(ic))->name)); @@ -2209,12 +2182,12 @@ static void genCall (iCode *ic) if (ic->parmBytes) { int i; if (ic->parmBytes > 3) { - emitcode("mov","a,%s",spname); - emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff); - emitcode("mov","%s,a",spname); + 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++) - emitcode("dec","%s",spname); + pic14_emitcode("dec","%s",spname); } @@ -2238,7 +2211,7 @@ static void genPcall (iCode *ic) symbol *rlbl = newiTempLabel(NULL); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if caller saves & we have not saved then */ if (!ic->regsSaved) saveRegisters(ic); @@ -2254,15 +2227,15 @@ static void genPcall (iCode *ic) /* push the return address on to the stack */ - emitcode("mov","a,#%05d_DS_",(rlbl->key+100)); - emitcode("push","acc"); - emitcode("mov","a,#(%05d_DS_ >> 8)",(rlbl->key+100)); - emitcode("push","acc"); + pic14_emitcode("mov","a,#%05d_DS_",(rlbl->key+100)); + pic14_emitcode("push","acc"); + pic14_emitcode("mov","a,#(%05d_DS_ >> 8)",(rlbl->key+100)); + pic14_emitcode("push","acc"); if (options.model == MODEL_FLAT24) { - emitcode("mov","a,#(%05d_DS_ >> 16)",(rlbl->key+100)); - emitcode("push","acc"); + pic14_emitcode("mov","a,#(%05d_DS_ >> 16)",(rlbl->key+100)); + pic14_emitcode("push","acc"); } /* now push the calling address */ @@ -2285,7 +2258,7 @@ static void genPcall (iCode *ic) char *l = aopGet(AOP(IC_LEFT(sic)),offset, FALSE,FALSE); if (strcmp(l,fReturn[offset])) - emitcode("mov","%s,%s", + pic14_emitcode("mov","%s,%s", fReturn[offset], l); offset++; @@ -2295,8 +2268,8 @@ static void genPcall (iCode *ic) _G.sendSet = NULL; } - emitcode("ret",""); - emitcode("","%05d_DS_:",(rlbl->key+100)); + pic14_emitcode("ret",""); + pic14_emitcode("","%05d_DS_:",(rlbl->key+100)); /* if we need assign a result value */ @@ -2319,12 +2292,12 @@ static void genPcall (iCode *ic) if (ic->parmBytes) { int i; if (ic->parmBytes > 3) { - emitcode("mov","a,%s",spname); - emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff); - emitcode("mov","%s,a",spname); + 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++) - emitcode("dec","%s",spname); + pic14_emitcode("dec","%s",spname); } @@ -2346,7 +2319,7 @@ static void genPcall (iCode *ic) /*-----------------------------------------------------------------*/ static int resultRemat (iCode *ic) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (SKIP_IC(ic) || ic->op == IFX) return 0; @@ -2372,7 +2345,7 @@ static bool inExcludeList(char *s) { int i =0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (options.excludeRegs[i] && STRCASECMP(options.excludeRegs[i],"none") == 0) return FALSE ; @@ -2393,23 +2366,23 @@ static void genFunction (iCode *ic) symbol *sym; sym_link *fetype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); labelOffset += FUNCTION_LABEL_INC; _G.nRegsSaved = 0; /* create the function header */ - emitcode(";","-----------------------------------------"); - emitcode(";"," function %s",(sym = OP_SYMBOL(IC_LEFT(ic)))->name); - emitcode(";","-----------------------------------------"); + pic14_emitcode(";","-----------------------------------------"); + pic14_emitcode(";"," function %s",(sym = OP_SYMBOL(IC_LEFT(ic)))->name); + pic14_emitcode(";","-----------------------------------------"); - emitcode("","%s:",sym->rname); + pic14_emitcode("","%s:",sym->rname); addpCode2pBlock(pb,newpCodeFunction(NULL,sym->rname)); fetype = getSpec(operandType(IC_LEFT(ic))); /* if critical function then turn interrupts off */ if (SPEC_CRTCL(fetype)) - emitcode("clr","ea"); + pic14_emitcode("clr","ea"); /* here we need to generate the equates for the register bank if required */ @@ -2420,11 +2393,11 @@ static void genFunction (iCode *ic) rbank = SPEC_BANK(fetype); for ( i = 0 ; i < pic14_nRegs ; i++ ) { if (strcmp(regspic14[i].base,"0") == 0) - emitcode("","%s = 0x%02x", + pic14_emitcode("","%s = 0x%02x", regspic14[i].dname, 8*rbank+regspic14[i].offset); else - emitcode ("","%s = %s + 0x%02x", + pic14_emitcode ("","%s = %s + 0x%02x", regspic14[i].dname, regspic14[i].base, 8*rbank+regspic14[i].offset); @@ -2437,25 +2410,25 @@ static void genFunction (iCode *ic) if (IS_ISR(sym->etype)) { if (!inExcludeList("acc")) - emitcode ("push","acc"); + pic14_emitcode ("push","acc"); if (!inExcludeList("b")) - emitcode ("push","b"); + pic14_emitcode ("push","b"); if (!inExcludeList("dpl")) - emitcode ("push","dpl"); + pic14_emitcode ("push","dpl"); if (!inExcludeList("dph")) - emitcode ("push","dph"); + pic14_emitcode ("push","dph"); if (options.model == MODEL_FLAT24 && !inExcludeList("dpx")) { - emitcode ("push", "dpx"); + pic14_emitcode ("push", "dpx"); /* Make sure we're using standard DPTR */ - emitcode ("push", "dps"); - emitcode ("mov", "dps, #0x00"); + pic14_emitcode ("push", "dps"); + pic14_emitcode ("mov", "dps, #0x00"); if (options.stack10bit) { /* This ISR could conceivably use DPTR2. Better save it. */ - emitcode ("push", "dpl1"); - emitcode ("push", "dph1"); - emitcode ("push", "dpx1"); + pic14_emitcode ("push", "dpl1"); + pic14_emitcode ("push", "dph1"); + pic14_emitcode ("push", "dpx1"); } } /* if this isr has no bank i.e. is going to @@ -2475,7 +2448,7 @@ static void genFunction (iCode *ic) for ( i = 0 ; i < sym->regsUsed->size ; i++) { if (bitVectBitValue(sym->regsUsed,i) || (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - emitcode("push","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); } } @@ -2498,7 +2471,7 @@ static void genFunction (iCode *ic) for ( i = 0 ; i < sym->regsUsed->size ; i++) { if (bitVectBitValue(sym->regsUsed,i) || (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) { - emitcode("push","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname); _G.nRegsSaved++; } } @@ -2508,24 +2481,24 @@ static void genFunction (iCode *ic) /* set the register bank to the desired value */ if (SPEC_BANK(sym->etype) || IS_ISR(sym->etype)) { - emitcode("push","psw"); - emitcode("mov","psw,#0x%02x",(SPEC_BANK(sym->etype) << 3)&0x00ff); + pic14_emitcode("push","psw"); + pic14_emitcode("mov","psw,#0x%02x",(SPEC_BANK(sym->etype) << 3)&0x00ff); } if (IS_RENT(sym->etype) || options.stackAuto) { if (options.useXstack) { - emitcode("mov","r0,%s",spname); - emitcode("mov","a,_bp"); - emitcode("movx","@r0,a"); - emitcode("inc","%s",spname); + 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 */ - emitcode ("push","_bp"); /* save the callers stack */ + pic14_emitcode ("push","_bp"); /* save the callers stack */ } - emitcode ("mov","_bp,%s",spname); + pic14_emitcode ("mov","_bp,%s",spname); } /* adjust the stack for the function */ @@ -2537,21 +2510,21 @@ static void genFunction (iCode *ic) if (i > 3 && sym->recvSize < 4) { - emitcode ("mov","a,sp"); - emitcode ("add","a,#0x%02x",((char)sym->stack & 0xff)); - emitcode ("mov","sp,a"); + pic14_emitcode ("mov","a,sp"); + pic14_emitcode ("add","a,#0x%02x",((char)sym->stack & 0xff)); + pic14_emitcode ("mov","sp,a"); } else while(i--) - emitcode("inc","sp"); + pic14_emitcode("inc","sp"); } if (sym->xstack) { - emitcode ("mov","a,_spx"); - emitcode ("add","a,#0x%02x",((char)sym->xstack & 0xff)); - emitcode ("mov","_spx,a"); + pic14_emitcode ("mov","a,_spx"); + pic14_emitcode ("add","a,#0x%02x",((char)sym->xstack & 0xff)); + pic14_emitcode ("mov","_spx,a"); } } @@ -2563,39 +2536,39 @@ static void genEndFunction (iCode *ic) { symbol *sym = OP_SYMBOL(IC_LEFT(ic)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (IS_RENT(sym->etype) || options.stackAuto) { - emitcode ("mov","%s,_bp",spname); + 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) { - emitcode("mov","a,sp"); - emitcode("add","a,#0x%02x",((char)-sym->stack) & 0xff); - emitcode("mov","sp,a"); + pic14_emitcode("mov","a,sp"); + pic14_emitcode("add","a,#0x%02x",((char)-sym->stack) & 0xff); + pic14_emitcode("mov","sp,a"); } if ((IS_RENT(sym->etype) || options.stackAuto)) { if (options.useXstack) { - emitcode("mov","r0,%s",spname); - emitcode("movx","a,@r0"); - emitcode("mov","_bp,a"); - emitcode("dec","%s",spname); + pic14_emitcode("mov","r0,%s",spname); + pic14_emitcode("movx","a,@r0"); + pic14_emitcode("mov","_bp,a"); + pic14_emitcode("dec","%s",spname); } else { - emitcode ("pop","_bp"); + pic14_emitcode ("pop","_bp"); } } /* restore the register bank */ if (SPEC_BANK(sym->etype) || IS_ISR(sym->etype)) - emitcode ("pop","psw"); + pic14_emitcode ("pop","psw"); if (IS_ISR(sym->etype)) { @@ -2617,7 +2590,7 @@ static void genEndFunction (iCode *ic) for ( i = sym->regsUsed->size ; i >= 0 ; i--) { if (bitVectBitValue(sym->regsUsed,i) || (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - emitcode("pop","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname); } } @@ -2633,44 +2606,44 @@ static void genEndFunction (iCode *ic) { if (options.stack10bit) { - emitcode ("pop", "dpx1"); - emitcode ("pop", "dph1"); - emitcode ("pop", "dpl1"); + pic14_emitcode ("pop", "dpx1"); + pic14_emitcode ("pop", "dph1"); + pic14_emitcode ("pop", "dpl1"); } - emitcode ("pop", "dps"); - emitcode ("pop", "dpx"); + pic14_emitcode ("pop", "dps"); + pic14_emitcode ("pop", "dpx"); } if (!inExcludeList("dph")) - emitcode ("pop","dph"); + pic14_emitcode ("pop","dph"); if (!inExcludeList("dpl")) - emitcode ("pop","dpl"); + pic14_emitcode ("pop","dpl"); if (!inExcludeList("b")) - emitcode ("pop","b"); + pic14_emitcode ("pop","b"); if (!inExcludeList("acc")) - emitcode ("pop","acc"); + pic14_emitcode ("pop","acc"); if (SPEC_CRTCL(sym->etype)) - emitcode("setb","ea"); + pic14_emitcode("setb","ea"); /* if debug then send end of function */ /* if (options.debug && currFunc) { */ if (currFunc) { _G.debugLine = 1; - emitcode(";","C$%s$%d$%d$%d ==.", + pic14_emitcode(";","C$%s$%d$%d$%d ==.", FileBaseName(ic->filename),currFunc->lastLine, ic->level,ic->block); if (IS_STATIC(currFunc->etype)) - emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); + pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); else - emitcode(";","XG$%s$0$0 ==.",currFunc->name); + pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); _G.debugLine = 0; } - emitcode ("reti",""); + pic14_emitcode ("reti",""); } else { if (SPEC_CRTCL(sym->etype)) - emitcode("setb","ea"); + pic14_emitcode("setb","ea"); if (sym->calleeSave) { int i; @@ -2681,7 +2654,7 @@ static void genEndFunction (iCode *ic) for ( i = sym->regsUsed->size ; i >= 0 ; i--) { if (bitVectBitValue(sym->regsUsed,i) || (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) - emitcode("pop","%s",pic14_regWithIdx(i)->dname); + pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname); } } @@ -2690,17 +2663,17 @@ static void genEndFunction (iCode *ic) /* if debug then send end of function */ if (currFunc) { _G.debugLine = 1; - emitcode(";","C$%s$%d$%d$%d ==.", + pic14_emitcode(";","C$%s$%d$%d$%d ==.", FileBaseName(ic->filename),currFunc->lastLine, ic->level,ic->block); if (IS_STATIC(currFunc->etype)) - emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); + pic14_emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name); else - emitcode(";","XG$%s$0$0 ==.",currFunc->name); + pic14_emitcode(";","XG$%s$0$0 ==.",currFunc->name); _G.debugLine = 0; } - emitcode ("return",""); + pic14_emitcode ("return",""); emitpcode(POC_RETURN,NULL); /* Mark the end of a function */ @@ -2716,7 +2689,7 @@ static void genRet (iCode *ic) { int size,offset = 0 , pushed = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if we have no return value then just generate the "ret" */ if (!IC_LEFT(ic)) @@ -2733,7 +2706,7 @@ static void genRet (iCode *ic) /* #NOCHANGE */ l = aopGet(AOP(IC_LEFT(ic)),offset++, FALSE,TRUE); - emitcode("push","%s",l); + pic14_emitcode("push","%s",l); pushed++; } else { l = aopGet(AOP(IC_LEFT(ic)),offset, @@ -2741,11 +2714,11 @@ static void genRet (iCode *ic) if (strcmp(fReturn[offset],l)) { if( ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) || ((AOP(IC_LEFT(ic))->type) == AOP_LIT) ) - emitcode("movlw","%s",l); + pic14_emitcode("movlw","%s",l); else - emitcode("movf","%s,w",l); + pic14_emitcode("movf","%s,w",l); if(size) - emitcode("movwf","%s",fReturn[offset]); + pic14_emitcode("movwf","%s",fReturn[offset]); offset++; } } @@ -2755,9 +2728,9 @@ static void genRet (iCode *ic) while(pushed) { pushed--; if (strcmp(fReturn[pushed],"a")) - emitcode("pop",fReturn[pushed]); + pic14_emitcode("pop",fReturn[pushed]); else - emitcode("pop","acc"); + pic14_emitcode("pop","acc"); } } freeAsmop (IC_LEFT(ic),NULL,ic,TRUE); @@ -2768,7 +2741,7 @@ static void genRet (iCode *ic) if (!(ic->next && ic->next->op == LABEL && IC_LABEL(ic->next) == returnLabel)) - emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset); + pic14_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset); } @@ -2778,12 +2751,12 @@ static void genRet (iCode *ic) static void genLabel (iCode *ic) { /* special case never generate */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (IC_LABEL(ic) == entryLabel) return ; emitpLabel(IC_LABEL(ic)->key+100 + labelOffset); - emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset)); + pic14_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset)); } /*-----------------------------------------------------------------*/ @@ -2792,7 +2765,7 @@ static void genLabel (iCode *ic) //tsd static void genGoto (iCode *ic) { - emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset); + pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset); } /*-----------------------------------------------------------------*/ @@ -2806,7 +2779,7 @@ static int findLabelBackwards(iCode *ic, int key) { int count = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); while (ic->prev) { ic = ic->prev; @@ -2822,905 +2795,6 @@ static int findLabelBackwards(iCode *ic, int key) return 0; } #endif -/*-----------------------------------------------------------------*/ -/* genPlusIncr :- does addition with increment if possible */ -/*-----------------------------------------------------------------*/ -static bool genPlusIncr (iCode *ic) -{ - unsigned int icount ; - unsigned int size = getDataSize(IC_RESULT(ic)); - - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - DEBUGemitcode ("; ","result %d, left %d, right %d", - AOP_TYPE(IC_RESULT(ic)), - AOP_TYPE(IC_LEFT(ic)), - 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 ; - - DEBUGemitcode ("; ","%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 = floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit)) > 2) - return FALSE ; - - /* if increment 16 bits in register */ - if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) && - (icount == 1)) { - - int offset = MSB16; - - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - //emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - - while(--size) { - emitSKPNZ; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE)); - //emitcode(" incf","%s,f",aopGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE)); - } - - return TRUE; - } - - DEBUGemitcode ("; ","%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,FALSE,FALSE)); - 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)); - //emitcode("xorlw","1"); - else - emitpcode(POC_ANDLW,popGetLit(1)); - //emitcode("andlw","1"); - - emitSKPZ; - emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - 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 (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - while (icount--) - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - //emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - return TRUE ; - } - - DEBUGemitcode ("; ","couldn't increment result-%s left-%s", - aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE), - aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - return FALSE ; -} - -/*-----------------------------------------------------------------*/ -/* outBitAcc - output a bit in acc */ -/*-----------------------------------------------------------------*/ -static void outBitAcc(operand *result) -{ - symbol *tlbl = newiTempLabel(NULL); - /* if the result is a bit */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - if (AOP_TYPE(result) == AOP_CRY){ - aopPut(AOP(result),"a",0); - } - else { - emitcode("jz","%05d_DS_",tlbl->key+100); - emitcode("mov","a,%s",one); - emitcode("","%05d_DS_:",tlbl->key+100); - outAcc(result); - } -} - -/*-----------------------------------------------------------------*/ -/* genPlusBits - generates code for addition of two bits */ -/*-----------------------------------------------------------------*/ -static void genPlusBits (iCode *ic) -{ - - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* - 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 ) { - //emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), - // popGet(AOP(result),0,FALSE,FALSE)); - - emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitcode("movlw","(1 << (%s & 7))", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - emitcode("bcf","(%s >> 3), (%s & 7)", - AOP(IC_RESULT(ic))->aopu.aop_dir, - AOP(IC_RESULT(ic))->aopu.aop_dir); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode("xorwf","(%s >>3),f", - AOP(IC_RESULT(ic))->aopu.aop_dir); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_LEFT(ic))->aopu.aop_dir, - AOP(IC_LEFT(ic))->aopu.aop_dir); - emitcode("xorwf","(%s>>3),f", - AOP(IC_RESULT(ic))->aopu.aop_dir); - } else { - - emitpcode(POC_CLRW, NULL); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORLW, popGetLit(1)); - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORLW, popGetLit(1)); - - emitcode("clrw",""); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode("xorlw","1"); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_LEFT(ic))->aopu.aop_dir, - AOP(IC_LEFT(ic))->aopu.aop_dir); - emitcode("xorlw","1"); - } - -} - -#if 0 -/* This is the original version of this code. - * - * This is being kept around for reference, - * because I am not entirely sure I got it right... - */ -static void adjustArithmeticResult(iCode *ic) -{ - if (AOP_SIZE(IC_RESULT(ic)) == 3 && - AOP_SIZE(IC_LEFT(ic)) == 3 && - !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 && - !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 && - !sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && - !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. - * I'm pretty certain it's right, but not enough to toss the old - * code just yet... - */ -static void adjustArithmeticResult(iCode *ic) -{ - if (opIsGptr(IC_RESULT(ic)) && - opIsGptr(IC_LEFT(ic)) && - !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)) && - !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 && - !sameRegs(AOP(IC_RESULT(ic)),AOP(IC_LEFT(ic))) && - !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 - -/*-----------------------------------------------------------------*/ -/* genPlus - generates code for addition */ -/*-----------------------------------------------------------------*/ -static void genPlus (iCode *ic) -{ - int size, offset = 0; - - /* special cases :- */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - - aopOp (IC_LEFT(ic),ic,FALSE); - aopOp (IC_RIGHT(ic),ic,FALSE); - aopOp (IC_RESULT(ic),ic,TRUE); - - /* 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,FALSE,FALSE)); - if (!sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - } else { - size = getDataSize(IC_RESULT(ic)); - while (size--) { - MOVA(aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - 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 = getDataSize(IC_RESULT(ic)); - - if(AOP(IC_RIGHT(ic))->type == AOP_LIT) { - /* Add a literal to something else */ - bool know_W=0; - unsigned lit = floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); - unsigned l1=0; - - offset = 0; - DEBUGemitcode(";","adding lit to something. size %d",size); - while(size--){ - - DEBUGemitcode(";","size %d",size); - - switch (lit & 0xff) { - case 0: - break; - case 1: - if(sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) - emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - else { - know_W = 0; - emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - } - break; - case 0xff: - if(sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) - emitpcode(POC_DECF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - else { - know_W = 0; - emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - } - break; - default: - if( !know_W || ( (lit&0xff) != l1) ) { - know_W = 1; - emitpcode(POC_MOVLW,popGetLit(lit&0xff)); - } - if(sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - else { - know_W = 0; - emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - if(size) { - emitSKPNC; - emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset+1,FALSE,FALSE)); - } - } - } - - l1 = lit & 0xff; - lit >>= 8; - offset++; - } - - } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - - emitcode(";bitadd","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitcode(";bitadd","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - 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 (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_INCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - 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,FALSE,FALSE)); - emitpcode(POC_XORLW , popGetLit(1)); - - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode(" xorlw","1"); - } else { - emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - - emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - 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,FALSE,FALSE)); - emitSKPZ; - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - } - } - - } else { - int offset = 1; - - if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitCLRZ; - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitcode("clrz",""); - - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } else { - - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - - - emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } - - while(--size){ - emitSKPZ; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE)); - //emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE)); - } - - } - - } else { - - if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { - emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - - if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - else { - if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || - (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { - emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - } else { - emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - } - } - } - - offset = 1; - size--; - - while(size--){ - if (!sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - - emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - } - - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitSKPNC; - emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - - /* - emitcode("movf","%s,w", aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitSKPNC; - emitcode("incfsz","%s,w",aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitcode("addwf","%s,f", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - */ - - 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); -} - -/*-----------------------------------------------------------------*/ -/* genMinusDec :- does subtraction with decrement if possible */ -/*-----------------------------------------------------------------*/ -static bool genMinusDec (iCode *ic) -{ - unsigned int icount ; - unsigned int size = getDataSize(IC_RESULT(ic)); - - DEBUGemitcode ("; ***","%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 ; - - DEBUGemitcode ("; 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 (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,FALSE,FALSE)); - emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); - - emitcode("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - emitcode("incfsz","%s,w",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - 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,FALSE,FALSE)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB24,FALSE,FALSE)); - - emitcode("movlw","0xff"); - emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); - - emitSKPNC; - emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); - emitSKPNC; - 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,FALSE,FALSE)); - - emitcode("skpnc",""); - emitSKPNC; - 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 (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) { - - while (icount--) - emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - //emitcode ("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - return TRUE ; - } - - DEBUGemitcode ("; returning"," result=%s, left=%s", - aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE), - aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - if(size==1) { - - emitcode("decf","%s,w",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitcode("movwf","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - return TRUE; - } - - return FALSE ; -} - -/*-----------------------------------------------------------------*/ -/* addSign - complete with sign */ -/*-----------------------------------------------------------------*/ -static void addSign(operand *result, int offset, int sign) -{ - int size = (getDataSize(result) - offset); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(size > 0){ - if(sign){ - emitcode("rlc","a"); - emitcode("subb","a,acc"); - while(size--) - aopPut(AOP(result),"a",offset++); - } else - while(size--) - aopPut(AOP(result),zero,offset++); - } -} - -/*-----------------------------------------------------------------*/ -/* genMinusBits - generates code for subtraction of two bits */ -/*-----------------------------------------------------------------*/ -static void genMinusBits (iCode *ic) -{ - symbol *lbl = newiTempLabel(NULL); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){ - emitcode("mov","c,%s",AOP(IC_LEFT(ic))->aopu.aop_dir); - emitcode("jnb","%s,%05d_DS_",AOP(IC_RIGHT(ic))->aopu.aop_dir,(lbl->key+100)); - emitcode("cpl","c"); - emitcode("","%05d_DS_:",(lbl->key+100)); - outBitC(IC_RESULT(ic)); - } - else{ - emitcode("mov","c,%s",AOP(IC_RIGHT(ic))->aopu.aop_dir); - emitcode("subb","a,acc"); - emitcode("jnb","%s,%05d_DS_",AOP(IC_LEFT(ic))->aopu.aop_dir,(lbl->key+100)); - emitcode("inc","a"); - 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))))); - } -} - -/*-----------------------------------------------------------------*/ -/* genMinus - generates code for subtraction */ -/*-----------------------------------------------------------------*/ -static void genMinus (iCode *ic) -{ - int size, offset = 0; - unsigned long lit = 0L; - - DEBUGemitcode ("; ***","%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; - } - - /* 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 = getDataSize(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; - - /* add the first byte: */ - emitcode("movlw","0x%x", lit & 0xff); - 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,FALSE,FALSE)); - - - 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,FALSE,FALSE)); - } else { - emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); - emitSKPNC; - emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - } - - } else { - /* do the rlf known zero trick here */ - emitpcode(POC_MOVLW, popGetLit(1)); - emitSKPNC; - emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); - } - offset++; - } - - } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) { - // bit subtraction - - emitcode(";bitsub","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitcode(";bitsub","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - 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 (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_DECF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - emitcode("btfsc","(%s >> 3), (%s & 7)", - AOP(IC_RIGHT(ic))->aopu.aop_dir, - AOP(IC_RIGHT(ic))->aopu.aop_dir); - 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,FALSE,FALSE)); - 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 (sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) { - if(lit & 1) { - emitpcode(POC_MOVLW , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - } - }else{ - emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - if(lit & 1) - emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - else - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - goto release; - } else { - emitpcode(POC_MOVLW , popGetLit(lit & 0xff)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVLW , popGetLit((lit-1) & 0xff)); - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } - - } else { - emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - } - - if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { - - emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - - } 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(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_SUBLW, popGetLit(0)); - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { - emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - emitpcode(POC_SUBLW, popGetLit(0)); - if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC) - emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - - if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) - emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - 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,FALSE,FALSE)); - } else { - emitpcode(POC_SUBFW, popGet(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_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitSKPZ; - emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - }else - emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - } - } - } - - /* - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); - - if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(POC_SUBFW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } else { - emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - */ - offset = 1; - size--; - - while(size--){ - if (!sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - } - emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitSKPNC; - emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); - emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); - - 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); -} - /*-----------------------------------------------------------------*/ /* genMultbits :- multiplication of bits */ @@ -3729,11 +2803,11 @@ static void genMultbits (operand *left, operand *right, operand *result) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); - outBitC(result); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); + pic14_outBitC(result); } @@ -3749,7 +2823,7 @@ static void genMultOneByte (operand *left, symbol *lbl ; int size,offset; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* (if two literals, the value is computed before) */ /* if one literal, literal on the right */ if (AOP_TYPE(left) == AOP_LIT){ @@ -3760,10 +2834,10 @@ static void genMultOneByte (operand *left, size = AOP_SIZE(result); /* signed or unsigned */ - emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("mul","ab"); + pic14_emitcode("mul","ab"); /* if result size = 1, mul signed = mul unsigned */ aopPut(AOP(result),"a",0); if (size > 1){ @@ -3771,10 +2845,10 @@ static void genMultOneByte (operand *left, aopPut(AOP(result),"b",1); if (size > 2) /* for filling the MSBs */ - emitcode("clr","a"); + pic14_emitcode("clr","a"); } else{ - emitcode("mov","a,b"); + pic14_emitcode("mov","a,b"); /* adjust the MSB if left or right neg */ @@ -3783,36 +2857,36 @@ static void genMultOneByte (operand *left, /* AND literal negative */ if((int) floatFromVal (AOP(right)->aopu.aop_lit) < 0){ /* adjust MSB (c==0 after mul) */ - emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); } } else{ lbl = newiTempLabel(NULL); - emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100)); - emitcode("","%05d_DS_:",(lbl->key+100)); - emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100)); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); lbl = newiTempLabel(NULL); - emitcode("jc","%05d_DS_",(lbl->key+100)); - emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("jc","%05d_DS_",(lbl->key+100)); + pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); } lbl = newiTempLabel(NULL); - emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100)); - emitcode("","%05d_DS_:",(lbl->key+100)); - emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100)); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE)); lbl = newiTempLabel(NULL); - emitcode("jc","%05d_DS_",(lbl->key+100)); - emitcode("subb","a,%s", aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("","%05d_DS_:",(lbl->key+100)); + pic14_emitcode("jc","%05d_DS_",(lbl->key+100)); + pic14_emitcode("subb","a,%s", aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("","%05d_DS_:",(lbl->key+100)); aopPut(AOP(result),"a",1); if(size > 2){ /* get the sign */ - emitcode("rlc","a"); - emitcode("subb","a,acc"); + pic14_emitcode("rlc","a"); + pic14_emitcode("subb","a,acc"); } } size -= 2; @@ -3832,7 +2906,7 @@ static void genMult (iCode *ic) operand *right = IC_RIGHT(ic); operand *result= IC_RESULT(ic); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign the amsops */ aopOp (left,ic,FALSE); aopOp (right,ic,FALSE); @@ -3872,15 +2946,15 @@ static void genDivbits (operand *left, char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* the result must be bit */ - emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("div","ab"); - emitcode("rrc","a"); + pic14_emitcode("div","ab"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"c",0); } @@ -3896,16 +2970,16 @@ static void genDivOneByte (operand *left, symbol *lbl ; int size,offset; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); size = AOP_SIZE(result) - 1; offset = 1; /* signed or unsigned */ if (SPEC_USIGN(opetype)) { /* unsigned is easy */ - emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("div","ab"); + pic14_emitcode("div","ab"); aopPut(AOP(result),"a",0); while (size--) aopPut(AOP(result),zero,offset++); @@ -3917,51 +2991,51 @@ static void genDivOneByte (operand *left, /* save the signs of the operands */ l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,TRUE)); - emitcode("push","acc"); /* save it on the stack */ + 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); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - emitcode("cpl","a"); - emitcode("inc","a"); - emitcode("","%05d_DS_:",(lbl->key+100)); - emitcode("mov","b,a"); + 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); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - emitcode("cpl","a"); - emitcode("inc","a"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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 */ - emitcode("div","ab"); + pic14_emitcode("div","ab"); /* we are interested in the lower order only */ - emitcode("mov","b,a"); + pic14_emitcode("mov","b,a"); lbl = newiTempLabel(NULL); - emitcode("pop","acc"); + pic14_emitcode("pop","acc"); /* if there was an over flow we don't adjust the sign of the result */ - emitcode("jb","ov,%05d_DS_",(lbl->key+100)); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); CLRC; - emitcode("clr","a"); - emitcode("subb","a,b"); - emitcode("mov","b,a"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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){ - emitcode("mov","c,b.7"); - emitcode("subb","a,acc"); + pic14_emitcode("mov","c,b.7"); + pic14_emitcode("subb","a,acc"); } while (size--) aopPut(AOP(result),"a",offset++); @@ -3977,7 +3051,7 @@ static void genDiv (iCode *ic) operand *right = IC_RIGHT(ic); operand *result= IC_RESULT(ic); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign the amsops */ aopOp (left,ic,FALSE); aopOp (right,ic,FALSE); @@ -4017,14 +3091,14 @@ static void genModbits (operand *left, char *l; /* the result must be bit */ - emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("div","ab"); - emitcode("mov","a,b"); - emitcode("rrc","a"); + pic14_emitcode("div","ab"); + pic14_emitcode("mov","a,b"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"c",0); } @@ -4039,14 +3113,14 @@ static void genModOneByte (operand *left, char *l ; symbol *lbl ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* signed or unsigned */ if (SPEC_USIGN(opetype)) { /* unsigned is easy */ - emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); + pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE)); l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("div","ab"); + pic14_emitcode("div","ab"); aopPut(AOP(result),"b",0); return ; } @@ -4057,45 +3131,45 @@ static void genModOneByte (operand *left, l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("xrl","a,%s",aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("push","acc"); /* save it on the stack */ + 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); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - emitcode("cpl","a"); - emitcode("inc","a"); - emitcode("","%05d_DS_:",(lbl->key+100)); - emitcode("mov","b,a"); + 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); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); - emitcode("cpl","a"); - emitcode("inc","a"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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 */ - emitcode("div","ab"); + pic14_emitcode("div","ab"); /* we are interested in the lower order only */ lbl = newiTempLabel(NULL); - emitcode("pop","acc"); + pic14_emitcode("pop","acc"); /* if there was an over flow we don't adjust the sign of the result */ - emitcode("jb","ov,%05d_DS_",(lbl->key+100)); - emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jb","ov,%05d_DS_",(lbl->key+100)); + pic14_emitcode("jnb","acc.7,%05d_DS_",(lbl->key+100)); CLRC ; - emitcode("clr","a"); - emitcode("subb","a,b"); - emitcode("mov","b,a"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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); @@ -4111,7 +3185,7 @@ static void genMod (iCode *ic) operand *right = IC_RIGHT(ic); operand *result= IC_RESULT(ic); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* assign the amsops */ aopOp (left,ic,FALSE); aopOp (right,ic,FALSE); @@ -4147,7 +3221,7 @@ release : static void genIfxJump (iCode *ic, char *jval) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if true label then we jump if condition supplied is true */ if ( IC_TRUE(ic) ) { @@ -4161,11 +3235,11 @@ static void genIfxJump (iCode *ic, char *jval) //p->type = PO_BIT; //emitpcode(POC_BTFSC, p); emitpcode(POC_BTFSC, newpCodeOpBit(jval,0)); - //emitcode("btfsc","(%s >> 3),(%s & 7)",jval,jval); + //pic14_emitcode("btfsc","(%s >> 3),(%s & 7)",jval,jval); } emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ic)->key)); - emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + labelOffset); } else { @@ -4180,11 +3254,11 @@ static void genIfxJump (iCode *ic, char *jval) //emitpcode(POC_BTFSS, p); emitpcode(POC_BTFSS, newpCodeOpBit(jval,0)); - // emitcode("btfss","(%s >> 3),(%s & 7)",jval,jval); + // pic14_emitcode("btfss","(%s >> 3),(%s & 7)",jval,jval); } emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ic)->key)); - emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + labelOffset); } @@ -4212,13 +3286,13 @@ static void genSkip(iCode *ifx,int status_bit) break; case 'd': - emitcode("skpndc",""); + emitSKPDC; break; } emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); } else { @@ -4233,11 +3307,11 @@ static void genSkip(iCode *ifx,int status_bit) break; case 'd': - emitcode("skpdc",""); + emitSKPDC; break; } emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } @@ -4262,9 +3336,9 @@ static void genSkipc(iCode *ifx, int condition) emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); if ( IC_TRUE(ifx) ) - emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); else - emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } @@ -4287,9 +3361,9 @@ static void genSkipz(iCode *ifx, int condition) emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); if ( IC_TRUE(ifx) ) - emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); else - emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } /*-----------------------------------------------------------------*/ @@ -4301,12 +3375,12 @@ static void genCmp (operand *left,operand *right, int size, offset = 0 ; unsigned long lit = 0L,i = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if left & right are bit variables */ if (AOP_TYPE(left) == AOP_CRY && AOP_TYPE(right) == AOP_CRY ) { - emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); - emitcode("anl","c,/%s",AOP(left)->aopu.aop_dir); + 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 @@ -4317,16 +3391,16 @@ static void genCmp (operand *left,operand *right, if((size == 1) && !sign && (AOP_TYPE(right) == AOP_LIT && AOP_TYPE(left) != AOP_DIR )){ symbol *lbl = newiTempLabel(NULL); - emitcode("cjne","%s,%s,%05d_DS_", + pic14_emitcode("cjne","%s,%s,%05d_DS_", aopGet(AOP(left),offset,FALSE,FALSE), aopGet(AOP(right),offset,FALSE,FALSE), lbl->key+100); - emitcode("","%05d_DS_:",lbl->key+100); + pic14_emitcode("","%05d_DS_:",lbl->key+100); } else { if(AOP_TYPE(right) == AOP_LIT) { - DEBUGemitcode(";right lit","%d",sign); + DEBUGpic14_emitcode(";right lit","%d",sign); lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit); //default: @@ -4334,14 +3408,14 @@ static void genCmp (operand *left,operand *right, i = (lit >> (size*8)) & 0xff; if(i == 0) { emitpcode(POC_MOVFW, popGet(AOP(left),size,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(left),size,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),size,FALSE,FALSE)); genSkipz(ifx,IC_TRUE(ifx) == NULL); } else { emitpcode(POC_MOVLW, popGetLit(i)); emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE)); - emitcode("movlw","0x%x",i); - emitcode("subwf","%s,w",aopGet(AOP(left),size,FALSE,FALSE)); + pic14_emitcode("movlw","0x%x",i); + pic14_emitcode("subwf","%s,w",aopGet(AOP(left),size,FALSE,FALSE)); genSkipc(ifx,IC_TRUE(ifx) == NULL); } @@ -4351,7 +3425,7 @@ static void genCmp (operand *left,operand *right, } if(AOP_TYPE(left) == AOP_LIT) { - DEBUGemitcode(";left lit","%d",sign); + DEBUGpic14_emitcode(";left lit","%d",sign); lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit))+1; @@ -4360,19 +3434,19 @@ static void genCmp (operand *left,operand *right, i = (lit >> (size*8)) & 0xff; if(i == 0) { emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); genSkipz(ifx,IC_TRUE(ifx) != NULL); } else if( i == 1 ) { emitpcode(POC_DECFW, popGet(AOP(right),size,FALSE,FALSE)); - emitcode("decf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); + pic14_emitcode("decf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); genSkipz(ifx,IC_TRUE(ifx) != NULL); } else { emitpcode(POC_MOVLW, popGetLit(i)); emitpcode(POC_SUBFW, popGet(AOP(right),size,FALSE,FALSE)); - emitcode("movlw","0x%x",i); - emitcode("subwf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); + pic14_emitcode("movlw","0x%x",i); + pic14_emitcode("subwf","%s,w",aopGet(AOP(right),size,FALSE,FALSE)); genSkipc(ifx,IC_TRUE(ifx) != NULL); } } @@ -4382,10 +3456,10 @@ static void genCmp (operand *left,operand *right, // CLRC; - DEBUGemitcode(";sign","%d",sign); + DEBUGpic14_emitcode(";sign","%d",sign); - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));//++ + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));//++ emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE)); emitpcode(POC_SUBFW, popGet(AOP(left),offset++,FALSE,FALSE)); @@ -4399,10 +3473,10 @@ static void genCmp (operand *left,operand *right, emitpcode(POC_SUBFW, popGet(AOP(left),offset,FALSE,FALSE)); /* - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); emitSKPC; - emitcode("incfsz","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("incfsz","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); */ offset++; } @@ -4411,7 +3485,7 @@ static void genCmp (operand *left,operand *right, //release: if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) { - outBitC(result); + pic14_outBitC(result); } else { /* if the result is used in the next ifx conditional branch then generate @@ -4419,7 +3493,7 @@ static void genCmp (operand *left,operand *right, if (ifx ) genIfxJump (ifx,"c"); else - outBitC(result); + pic14_outBitC(result); /* leave the result in acc */ } @@ -4434,7 +3508,7 @@ static void genCmpGt (iCode *ic, iCode *ifx) sym_link *letype , *retype; int sign ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); left = IC_LEFT(ic); right= IC_RIGHT(ic); result = IC_RESULT(ic); @@ -4463,7 +3537,7 @@ static void genCmpLt (iCode *ic, iCode *ifx) sym_link *letype , *retype; int sign ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); left = IC_LEFT(ic); right= IC_RIGHT(ic); result = IC_RESULT(ic); @@ -4493,7 +3567,7 @@ static void gencjneshort(operand *left, operand *right, symbol *lbl) int offset = 0; unsigned long lit = 0L; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if the left side is a literal or if the right is in a pointer register and left is not */ @@ -4511,13 +3585,13 @@ static void gencjneshort(operand *left, operand *right, symbol *lbl) AOP_TYPE(left) != AOP_DIR ) { while (size--) { if(lit & 0xff) { - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("xorlw","0x%x",lit & 0xff); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("xorlw","0x%x",lit & 0xff); } else - emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); emitSKPNZ; - emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset); offset++; lit >>= 8; } @@ -4532,22 +3606,22 @@ static void gencjneshort(operand *left, operand *right, symbol *lbl) while (size--) { if((AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) && ( (lit & 0xff) != 0)) { - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("xorlw","0x%x",lit & 0xff); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("xorlw","0x%x",lit & 0xff); lit >>= 8; } else - emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); emitSKPZ; - emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset); offset++; /* MOVA(aopGet(AOP(left),offset,FALSE,FALSE)); if((AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) && ((unsigned int)((lit >> (offset*8)) & 0x0FFL) == 0)) - emitcode("jnz","%05d_DS_",lbl->key+100); + pic14_emitcode("jnz","%05d_DS_",lbl->key+100); else - emitcode("cjne","a,%s,%05d_DS_", + pic14_emitcode("cjne","a,%s,%05d_DS_", aopGet(AOP(right),offset,FALSE,TRUE), lbl->key+100); offset++; @@ -4558,9 +3632,9 @@ static void gencjneshort(operand *left, operand *right, symbol *lbl) while(size--) { char *l = aopGet(AOP(left),offset,FALSE,FALSE); if(strcmp(l,"b")) - emitcode("mov","b,%s",l); + pic14_emitcode("mov","b,%s",l); MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("cjne","a,b,%05d_DS_",lbl->key+100); + pic14_emitcode("cjne","a,b,%05d_DS_",lbl->key+100); offset++; } } @@ -4573,14 +3647,14 @@ static void gencjne(operand *left, operand *right, symbol *lbl) { symbol *tlbl = newiTempLabel(NULL); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); gencjneshort(left, right, lbl); - emitcode("mov","a,%s",one); - emitcode("sjmp","%05d_DS_",tlbl->key+100); - emitcode("","%05d_DS_:",lbl->key+100); - emitcode("clr","a"); - emitcode("","%05d_DS_:",tlbl->key+100); + 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); } @@ -4593,11 +3667,11 @@ static void genCmpEq (iCode *ic, iCode *ifx) unsigned long lit = 0L; int size,offset=0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(ifx) - DEBUGemitcode ("; ifx is non-null",""); + DEBUGpic14_emitcode ("; ifx is non-null",""); else - DEBUGemitcode ("; ifx is null",""); + DEBUGpic14_emitcode ("; ifx is null",""); aopOp((left=IC_LEFT(ic)),ic,FALSE); aopOp((right=IC_RIGHT(ic)),ic,FALSE); @@ -4623,32 +3697,32 @@ static void genCmpEq (iCode *ic, iCode *ifx) if(AOP_TYPE(right) == AOP_LIT){ unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); if(lit == 0L){ - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("cpl","c"); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); } else if(lit == 1L) { - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); } else { - emitcode("clr","c"); + pic14_emitcode("clr","c"); } /* AOP_TYPE(right) == AOP_CRY */ } else { symbol *lbl = newiTempLabel(NULL); - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); - emitcode("cpl","c"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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) ) { - emitcode("jnc","%05d_DS_",tlbl->key+100); - emitcode("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); + pic14_emitcode("jnc","%05d_DS_",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); } else { - emitcode("jc","%05d_DS_",tlbl->key+100); - emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100); + pic14_emitcode("jc","%05d_DS_",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100); } - emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); } else { /* They're not both bit variables. Is the right a literal? */ @@ -4667,40 +3741,40 @@ static void genCmpEq (iCode *ic, iCode *ifx) case 0x0000: emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE)); - //emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - //emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + //pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + //pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); genSkip(ifx,'z'); optimized++; break; case 0x0001: emitpcode(POC_DECFW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); genSkip(ifx,'z'); optimized++; break; case 0x0100: emitpcode(POC_DECFW,popGet(AOP(left),offset+1,FALSE,FALSE)); emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("decf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); genSkip(ifx,'z'); optimized++; break; case 0x00ff: emitpcode(POC_INCFW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); genSkip(ifx,'z'); optimized++; break; case 0xff00: emitpcode(POC_INCFW,popGet(AOP(left),offset+1,FALSE,FALSE)); emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("incf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); genSkip(ifx,'z'); optimized++; break; @@ -4710,9 +3784,9 @@ static void genCmpEq (iCode *ic, iCode *ifx) emitpcode(POC_XORLW,popGetLit(l)); emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("xorlw","0x%x",l); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("xorlw","0x%x",l); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); optimized++; genSkip(ifx,'z'); } else if (l == 0) { @@ -4720,9 +3794,9 @@ static void genCmpEq (iCode *ic, iCode *ifx) emitpcode(POC_XORLW,popGetLit(h)); emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); - emitcode("xorlw","0x%x",h); - emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("xorlw","0x%x",h); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); optimized++; genSkip(ifx,'z'); } else { @@ -4732,11 +3806,11 @@ static void genCmpEq (iCode *ic, iCode *ifx) emitSKPZ; emitpcode(POC_XORFW,popGet(AOP(left),offset+1,FALSE,FALSE)); /* - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("xorlw","0x%x",l); - emitcode("movlw","0x%x",h); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("xorlw","0x%x",l); + pic14_emitcode("movlw","0x%x",h); emitSKPZ; - emitcode("xorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); + pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE)); */ optimized++; genSkip(ifx,'z'); @@ -4757,50 +3831,50 @@ static void genCmpEq (iCode *ic, iCode *ifx) case 1: if ( IC_TRUE(ifx) ) { - emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_DECFW,popGet(AOP(left),offset,FALSE,FALSE)); emitSKPNZ; emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); } else { emitpcode(POC_DECFSZW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - emitcode("decfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode("decfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } break; case 0xff: if ( IC_TRUE(ifx) ) { - emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_INCFW,popGet(AOP(left),offset,FALSE,FALSE)); emitSKPNZ; emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); } else { emitpcode(POC_INCFSZW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - emitcode("incfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode("incfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } break; default: emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE)); - //emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + //pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); if(lit) emitpcode(POC_XORLW,popGetLit(lit & 0xff)); - //emitcode("xorlw","0x%x",lit & 0xff); + //pic14_emitcode("xorlw","0x%x",lit & 0xff); genSkip(ifx,'z'); } - // emitcode("goto","_%05d_DS_",tlbl->key+100+labelOffset); - //emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); + // pic14_emitcode("goto","_%05d_DS_",tlbl->key+100+labelOffset); + //pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); offset++; lit >>= 8; } @@ -4812,17 +3886,17 @@ static void genCmpEq (iCode *ic, iCode *ifx) popGet(AOP(right),offset,FALSE,FALSE)); emitpcode(POC_XORLW,popGetLit(1)); - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); if ( IC_TRUE(ifx) ) - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); else - emitcode("btfss","(%s >> 3), (%s & 7)", + pic14_emitcode("btfss","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("xorlw","1"); + pic14_emitcode("xorlw","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 @@ -4830,16 +3904,16 @@ static void genCmpEq (iCode *ic, iCode *ifx) while(--size) emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE)); - //emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + //pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); if ( IC_TRUE(ifx) ) { emitSKPNZ; emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); } else { emitSKPZ; emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } } else { @@ -4852,29 +3926,29 @@ static void genCmpEq (iCode *ic, iCode *ifx) emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); if ( IC_TRUE(ifx) ) { if(size) { emitSKPZ; emitpcode(POC_GOTO,popGetLabel(tlbl->key)); - emitcode(" goto","_%05d_DS_",tlbl->key+100+labelOffset); + pic14_emitcode(" goto","_%05d_DS_",tlbl->key+100+labelOffset); } else { emitSKPNZ; emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); } } else { emitSKPZ; emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key)); - emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic14_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); } offset++; } if(s>1 && IC_TRUE(ifx)) { emitpLabel(tlbl->key+100+labelOffset); - emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); + pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); } } } @@ -4889,24 +3963,24 @@ static void genCmpEq (iCode *ic, iCode *ifx) if(AOP_TYPE(right) == AOP_LIT){ unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); if(lit == 0L){ - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("cpl","c"); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); } else if(lit == 1L) { - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); } else { - emitcode("clr","c"); + pic14_emitcode("clr","c"); } /* AOP_TYPE(right) == AOP_CRY */ } else { symbol *lbl = newiTempLabel(NULL); - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("jb","%s,%05d_DS_",AOP(right)->aopu.aop_dir,(lbl->key+100)); - emitcode("cpl","c"); - emitcode("","%05d_DS_:",(lbl->key+100)); + 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)){ - outBitC(result); + pic14_outBitC(result); goto release ; } if (ifx) { @@ -4915,7 +3989,7 @@ static void genCmpEq (iCode *ic, iCode *ifx) } /* if the result is used in an arithmetic operation then put the result in place */ - outBitC(result); + pic14_outBitC(result); } else { gencjne(left,right,newiTempLabel(NULL)); if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) { @@ -4929,7 +4003,7 @@ static void genCmpEq (iCode *ic, iCode *ifx) /* if the result is used in an arithmetic operation then put the result in place */ if (AOP_TYPE(result) != AOP_CRY) - outAcc(result); + pic14_outAcc(result); /* leave the result in acc */ } @@ -4945,7 +4019,7 @@ release: static iCode *ifxForOp ( operand *op, iCode *ic ) { /* if true symbol then needs to be assigned */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (IS_TRUE_SYMOP(op)) return NULL ; @@ -4968,7 +4042,7 @@ static void genAndOp (iCode *ic) operand *left,*right, *result; symbol *tlbl; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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 */ @@ -4979,16 +4053,16 @@ static void genAndOp (iCode *ic) /* if both are bit variables */ if (AOP_TYPE(left) == AOP_CRY && AOP_TYPE(right) == AOP_CRY ) { - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); - outBitC(result); + 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); - toBoolean(left); - emitcode("jz","%05d_DS_",tlbl->key+100); - toBoolean(right); - emitcode("","%05d_DS_:",tlbl->key+100); - outBitAcc(result); + 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)); @@ -5013,7 +4087,7 @@ static void genOrOp (iCode *ic) /* note here that || operations that are in an if statement are taken away by backPatchLabels only those used in arthmetic operations remain */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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); @@ -5021,24 +4095,24 @@ static void genOrOp (iCode *ic) /* if both are bit variables */ if (AOP_TYPE(left) == AOP_CRY && AOP_TYPE(right) == AOP_CRY ) { - emitcode("clrc",""); - emitcode("btfss","(%s >> 3), (%s & 7)", + pic14_emitcode("clrc",""); + pic14_emitcode("btfss","(%s >> 3), (%s & 7)", AOP(left)->aopu.aop_dir, AOP(left)->aopu.aop_dir); - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("setc",""); + pic14_emitcode("setc",""); } else { tlbl = newiTempLabel(NULL); - toBoolean(left); + pic14_toBoolean(left); emitSKPZ; - emitcode("goto","%05d_DS_",tlbl->key+100+labelOffset); - toBoolean(right); - emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + pic14_emitcode("goto","%05d_DS_",tlbl->key+100+labelOffset); + pic14_toBoolean(right); + pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); - outBitAcc(result); + pic14_outBitAcc(result); } freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); @@ -5060,7 +4134,7 @@ static int isLiteralBit(unsigned long lit) 0x10000000L,0x20000000L,0x40000000L,0x80000000L}; int idx; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); for(idx = 0; idx < 32; idx++) if(lit == pw[idx]) return idx+1; @@ -5072,9 +4146,9 @@ static int isLiteralBit(unsigned long lit) /*-----------------------------------------------------------------*/ static void continueIfTrue (iCode *ic) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(IC_TRUE(ic)) - emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); ic->generated = 1; } @@ -5083,9 +4157,9 @@ static void continueIfTrue (iCode *ic) /*-----------------------------------------------------------------*/ static void jumpIfTrue (iCode *ic) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(!IC_TRUE(ic)) - emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); ic->generated = 1; } @@ -5095,17 +4169,17 @@ static void jumpIfTrue (iCode *ic) static void jmpTrueOrFalse (iCode *ic, symbol *tlbl) { // ugly but optimized by peephole - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(IC_TRUE(ic)){ symbol *nlbl = newiTempLabel(NULL); - emitcode("sjmp","%05d_DS_",nlbl->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); - emitcode("ljmp","%05d_DS_",IC_TRUE(ic)->key+100); - emitcode("","%05d_DS_:",nlbl->key+100); + 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{ - emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ic)->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); } ic->generated = 1; } @@ -5121,16 +4195,16 @@ static void genAnd (iCode *ic, iCode *ifx) int bytelit = 0; char buffer[10]; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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); #ifdef DEBUG_TYPE - emitcode("","; Type res[%d] = l[%d]&r[%d]", + pic14_emitcode("","; Type res[%d] = l[%d]&r[%d]", AOP_TYPE(result), AOP_TYPE(left), AOP_TYPE(right)); - emitcode("","; Size res[%d] = l[%d]&r[%d]", + pic14_emitcode("","; Size res[%d] = l[%d]&r[%d]", AOP_SIZE(result), AOP_SIZE(left), AOP_SIZE(right)); #endif @@ -5144,7 +4218,7 @@ static void genAnd (iCode *ic, iCode *ifx) } /* if result = right then exchange them */ - if(sameRegs(AOP(result),AOP(right))){ + if(pic14_sameRegs(AOP(result),AOP(right))){ operand *tmp = right ; right = left; left = tmp; @@ -5168,39 +4242,39 @@ static void genAnd (iCode *ic, iCode *ifx) // c = bit & literal; if(AOP_TYPE(right) == AOP_LIT){ if(lit & 1) { - if(size && sameRegs(AOP(result),AOP(left))) + if(size && pic14_sameRegs(AOP(result),AOP(left))) // no change goto release; - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); } else { // bit(result) = 0; if(size && (AOP_TYPE(result) == AOP_CRY)){ - emitcode("clr","%s",AOP(result)->aopu.aop_dir); + pic14_emitcode("clr","%s",AOP(result)->aopu.aop_dir); goto release; } if((AOP_TYPE(result) == AOP_CRY) && ifx){ jumpIfTrue(ifx); goto release; } - emitcode("clr","c"); + pic14_emitcode("clr","c"); } } else { if (AOP_TYPE(right) == AOP_CRY){ // c = bit & bit; - emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); - emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); + 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 - emitcode("rrc","a"); - emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("rrc","a"); + pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir); } } // bit = c // val = c if(size) - outBitC(result); + pic14_outBitC(result); // if(bit & ...) else if((AOP_TYPE(result) == AOP_CRY) && ifx) genIfxJump(ifx, "c"); @@ -5219,7 +4293,7 @@ static void genAnd (iCode *ic, iCode *ifx) MOVA(aopGet(AOP(left),posbit>>3,FALSE,FALSE)); // bit = left & 2^n if(size) - emitcode("mov","c,acc.%d",posbit&0x07); + pic14_emitcode("mov","c,acc.%d",posbit&0x07); // if(left & 2^n) else{ if(ifx){ @@ -5232,26 +4306,26 @@ static void genAnd (iCode *ic, iCode *ifx) symbol *tlbl = newiTempLabel(NULL); int sizel = AOP_SIZE(left); if(size) - emitcode("setb","c"); + 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) - emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100); + pic14_emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100); else{ if(bytelit != 0x0FFL) - emitcode("anl","a,%s", + pic14_emitcode("anl","a,%s", aopGet(AOP(right),offset,FALSE,TRUE)); - emitcode("jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); } } offset++; } // bit = left & literal if(size){ - emitcode("clr","c"); - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("clr","c"); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); } // if(left & literal) else{ @@ -5260,21 +4334,21 @@ static void genAnd (iCode *ic, iCode *ifx) goto release ; } } - outBitC(result); + pic14_outBitC(result); goto release ; } /* if left is same as result */ - if(sameRegs(AOP(result),AOP(left))){ + if(pic14_sameRegs(AOP(result),AOP(left))){ for(;size--; offset++,lit>>=8) { if(AOP_TYPE(right) == AOP_LIT){ switch(lit & 0xff) { case 0x00: /* and'ing with 0 has clears the result */ - emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); break; case 0xff: - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); break; default: @@ -5282,19 +4356,19 @@ static void genAnd (iCode *ic, iCode *ifx) int p = my_powof2( (~lit) & 0xff ); if(p>=0) { /* only one bit is set in the literal, so use a bcf instruction */ - emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); + pic14_emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); } else { - emitcode("movlw","0x%x", (lit & 0xff)); - emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p); + pic14_emitcode("movlw","0x%x", (lit & 0xff)); + pic14_emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p); } } } } else { if (AOP_TYPE(left) == AOP_ACC) - emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); else { - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); } } @@ -5309,18 +4383,18 @@ static void genAnd (iCode *ic, iCode *ifx) symbol *tlbl = newiTempLabel(NULL); int sizer = min(AOP_SIZE(left),AOP_SIZE(right)); if(size) - emitcode("setb","c"); + pic14_emitcode("setb","c"); while(sizer--){ MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("anl","a,%s", + pic14_emitcode("anl","a,%s", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); offset++; } if(size){ CLRC; - emitcode("","%05d_DS_:",tlbl->key+100); - outBitC(result); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); } else if(ifx) jmpTrueOrFalse(ifx, tlbl); } else { @@ -5331,20 +4405,20 @@ static void genAnd (iCode *ic, iCode *ifx) int t = (lit >> (offset*8)) & 0x0FFL; switch(t) { case 0x00: - emitcode("clrf","%s", + pic14_emitcode("clrf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); break; case 0xff: - emitcode("movf","%s,w", + pic14_emitcode("movf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); break; default: - emitcode("movlw","0x%x",t); - emitcode("andwf","%s,w", + pic14_emitcode("movlw","0x%x",t); + pic14_emitcode("andwf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); } @@ -5352,13 +4426,13 @@ static void genAnd (iCode *ic, iCode *ifx) } if (AOP_TYPE(left) == AOP_ACC) - emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); else { - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("andwf","%s,w", + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("andwf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); } - emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); } } } @@ -5378,7 +4452,7 @@ static void genOr (iCode *ic, iCode *ifx) int size, offset=0; unsigned long lit = 0L; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp((left = IC_LEFT(ic)),ic,FALSE); aopOp((right= IC_RIGHT(ic)),ic,FALSE); @@ -5394,7 +4468,7 @@ static void genOr (iCode *ic, iCode *ifx) } /* if result = right then exchange them */ - if(sameRegs(AOP(result),AOP(right))){ + if(pic14_sameRegs(AOP(result),AOP(right))){ operand *tmp = right ; right = left; left = tmp; @@ -5423,7 +4497,7 @@ static void genOr (iCode *ic, iCode *ifx) if(AOP_TYPE(result) == AOP_CRY){ if(size) emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE)); - //emitcode("bsf","(%s >> 3), (%s & 7)", + //pic14_emitcode("bsf","(%s >> 3), (%s & 7)", // AOP(result)->aopu.aop_dir, // AOP(result)->aopu.aop_dir); else if(ifx) @@ -5432,25 +4506,25 @@ static void genOr (iCode *ic, iCode *ifx) } } else { // lit == 0 => result = left - if(size && sameRegs(AOP(result),AOP(left))) + if(size && pic14_sameRegs(AOP(result),AOP(left))) goto release; - emitcode(";XXX mov","c,%s %s,%d",AOP(left)->aopu.aop_dir,__FILE__,__LINE__); + pic14_emitcode(";XXX mov","c,%s %s,%d",AOP(left)->aopu.aop_dir,__FILE__,__LINE__); } } else { if (AOP_TYPE(right) == AOP_CRY){ - if(sameRegs(AOP(result),AOP(left))){ + if(pic14_sameRegs(AOP(result),AOP(left))){ // c = bit | bit; emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE)); emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE)); emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE)); - emitcode("bcf","(%s >> 3), (%s & 7)", + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("bsf","(%s >> 3), (%s & 7)", + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); } else { @@ -5460,16 +4534,16 @@ static void genOr (iCode *ic, iCode *ifx) emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE)); emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE)); - emitcode("bcf","(%s >> 3), (%s & 7)", + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); - emitcode("btfss","(%s >> 3), (%s & 7)", + pic14_emitcode("btfss","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(left)->aopu.aop_dir, AOP(left)->aopu.aop_dir); - emitcode("bsf","(%s >> 3), (%s & 7)", + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); } @@ -5477,26 +4551,26 @@ static void genOr (iCode *ic, iCode *ifx) else{ // c = bit | val; symbol *tlbl = newiTempLabel(NULL); - emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); if(!((AOP_TYPE(result) == AOP_CRY) && ifx)) - emitcode(";XXX setb","c"); - emitcode(";XXX jb","%s,%05d_DS_", + pic14_emitcode(";XXX setb","c"); + pic14_emitcode(";XXX jb","%s,%05d_DS_", AOP(left)->aopu.aop_dir,tlbl->key+100); - toBoolean(right); - emitcode(";XXX jnz","%05d_DS_",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; - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); } } } // bit = c // val = c if(size) - outBitC(result); + pic14_outBitC(result); // if(bit | ...) else if((AOP_TYPE(result) == AOP_CRY) && ifx) genIfxJump(ifx, "c"); @@ -5509,35 +4583,35 @@ static void genOr (iCode *ic, iCode *ifx) (AOP_TYPE(result) == AOP_CRY) && (AOP_TYPE(left) != AOP_CRY)){ if(lit){ - emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); // result = 1 if(size) - emitcode(";XXX setb","%s",AOP(result)->aopu.aop_dir); + pic14_emitcode(";XXX setb","%s",AOP(result)->aopu.aop_dir); else continueIfTrue(ifx); goto release; } else { - emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); // lit = 0, result = boolean(left) if(size) - emitcode(";XXX setb","c"); - toBoolean(right); + pic14_emitcode(";XXX setb","c"); + pic14_toBoolean(right); if(size){ symbol *tlbl = newiTempLabel(NULL); - emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); CLRC; - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); } else { genIfxJump (ifx,"a"); goto release; } } - outBitC(result); + pic14_outBitC(result); goto release ; } /* if left is same as result */ - if(sameRegs(AOP(result),AOP(left))){ + if(pic14_sameRegs(AOP(result),AOP(left))){ for(;size--; offset++,lit>>=8) { if(AOP_TYPE(right) == AOP_LIT){ if((lit & 0xff) == 0) @@ -5548,26 +4622,26 @@ static void genOr (iCode *ic, iCode *ifx) if(p>=0) { /* only one bit is set in the literal, so use a bsf instruction */ emitpcode(POC_BSF, popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("bsf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); + pic14_emitcode("bsf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p); } else { emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movlw","0x%x", (lit & 0xff)); - emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p); + pic14_emitcode("movlw","0x%x", (lit & 0xff)); + pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p); } } } else { if (AOP_TYPE(left) == AOP_ACC) { emitpcode(POC_IORFW, popGet(AOP(right),offset,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); } else { emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE)); emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE)); } } @@ -5580,21 +4654,21 @@ static void genOr (iCode *ic, iCode *ifx) // if(!size && ifx), conditional oper: if(left | right) symbol *tlbl = newiTempLabel(NULL); int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); - emitcode(";XXX "," %s,%d",__FILE__,__LINE__); + pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__); if(size) - emitcode(";XXX setb","c"); + pic14_emitcode(";XXX setb","c"); while(sizer--){ MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode(";XXX orl","a,%s", + pic14_emitcode(";XXX orl","a,%s", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode(";XXX jnz","%05d_DS_",tlbl->key+100); offset++; } if(size){ CLRC; - emitcode("","%05d_DS_:",tlbl->key+100); - outBitC(result); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); } else if(ifx) jmpTrueOrFalse(ifx, tlbl); } else for(;(size--);offset++){ @@ -5607,9 +4681,9 @@ static void genOr (iCode *ic, iCode *ifx) emitpcode(POC_MOVFW, popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); - emitcode("movf","%s,w", + pic14_emitcode("movf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); break; default: @@ -5617,10 +4691,10 @@ static void genOr (iCode *ic, iCode *ifx) emitpcode(POC_IORFW, popGet(AOP(left),offset,FALSE,FALSE)); emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); - emitcode("movlw","0x%x",t); - emitcode("iorwf","%s,w", + pic14_emitcode("movlw","0x%x",t); + pic14_emitcode("iorwf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); } @@ -5631,17 +4705,17 @@ static void genOr (iCode *ic, iCode *ifx) // and better if result is SFR if (AOP_TYPE(left) == AOP_ACC) { emitpcode(POC_IORWF, popGet(AOP(right),offset,FALSE,FALSE)); - emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); } else { emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE)); emitpcode(POC_IORFW, popGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("iorwf","%s,w", + 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,FALSE,FALSE)); - emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); } } @@ -5660,7 +4734,7 @@ static void genXor (iCode *ic, iCode *ifx) int size, offset=0; unsigned long lit = 0L; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp((left = IC_LEFT(ic)),ic,FALSE); aopOp((right= IC_RIGHT(ic)),ic,FALSE); @@ -5676,7 +4750,7 @@ static void genXor (iCode *ic, iCode *ifx) } /* if result = right then exchange them */ - if(sameRegs(AOP(result),AOP(right))){ + if(pic14_sameRegs(AOP(result),AOP(right))){ operand *tmp = right ; right = left; left = tmp; @@ -5703,27 +4777,27 @@ static void genXor (iCode *ic, iCode *ifx) // lit>>1 != 0 => result = 1 if(AOP_TYPE(result) == AOP_CRY){ if(size) - emitcode("setb","%s",AOP(result)->aopu.aop_dir); + pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir); else if(ifx) continueIfTrue(ifx); goto release; } - emitcode("setb","c"); + pic14_emitcode("setb","c"); } else{ // lit == (0 or 1) if(lit == 0){ // lit == 0, result = left - if(size && sameRegs(AOP(result),AOP(left))) + if(size && pic14_sameRegs(AOP(result),AOP(left))) goto release; - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); } else{ // lit == 1, result = not(left) - if(size && sameRegs(AOP(result),AOP(left))){ - emitcode("cpl","%s",AOP(result)->aopu.aop_dir); + if(size && pic14_sameRegs(AOP(result),AOP(left))){ + pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir); goto release; } else { - emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); - emitcode("cpl","c"); + pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); + pic14_emitcode("cpl","c"); } } } @@ -5733,39 +4807,39 @@ static void genXor (iCode *ic, iCode *ifx) symbol *tlbl = newiTempLabel(NULL); if (AOP_TYPE(right) == AOP_CRY){ // c = bit ^ bit; - emitcode("mov","c,%s",AOP(right)->aopu.aop_dir); + 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 - emitcode("setb","c"); + pic14_emitcode("setb","c"); while(sizer){ MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE)); if(sizer == 1) // test the msb of the lsb - emitcode("anl","a,#0xfe"); - emitcode("jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode("anl","a,#0xfe"); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); sizer--; } // val = (0,1) - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); } - emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100)); - emitcode("cpl","c"); - emitcode("","%05d_DS_:",(tlbl->key+100)); + 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) - outBitC(result); + pic14_outBitC(result); // if(bit | ...) else if((AOP_TYPE(result) == AOP_CRY) && ifx) genIfxJump(ifx, "c"); goto release ; } - if(sameRegs(AOP(result),AOP(left))){ + if(pic14_sameRegs(AOP(result),AOP(left))){ /* if left is same as result */ for(;size--; offset++) { if(AOP_TYPE(right) == AOP_LIT){ @@ -5774,22 +4848,22 @@ static void genXor (iCode *ic, iCode *ifx) else if (IS_AOP_PREG(left)) { MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); + pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); aopPut(AOP(result),"a",offset); } else - emitcode("xrl","%s,%s", + pic14_emitcode("xrl","%s,%s", aopGet(AOP(left),offset,FALSE,TRUE), aopGet(AOP(right),offset,FALSE,FALSE)); } else { if (AOP_TYPE(left) == AOP_ACC) - emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE)); else { MOVA(aopGet(AOP(right),offset,FALSE,FALSE)); if (IS_AOP_PREG(left)) { - emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); + pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE)); aopPut(AOP(result),"a",offset); } else - emitcode("xrl","%s,a", + pic14_emitcode("xrl","%s,a", aopGet(AOP(left),offset,FALSE,TRUE)); } } @@ -5803,23 +4877,23 @@ static void genXor (iCode *ic, iCode *ifx) symbol *tlbl = newiTempLabel(NULL); int sizer = max(AOP_SIZE(left),AOP_SIZE(right)); if(size) - emitcode("setb","c"); + 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)); - emitcode("xrl","a,%s", + pic14_emitcode("xrl","a,%s", aopGet(AOP(left),offset,FALSE,FALSE)); } - emitcode("jnz","%05d_DS_",tlbl->key+100); + pic14_emitcode("jnz","%05d_DS_",tlbl->key+100); offset++; } if(size){ CLRC; - emitcode("","%05d_DS_:",tlbl->key+100); - outBitC(result); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_outBitC(result); } else if(ifx) jmpTrueOrFalse(ifx, tlbl); } else for(;(size--);offset++){ @@ -5829,22 +4903,22 @@ static void genXor (iCode *ic, iCode *ifx) int t = (lit >> (offset*8)) & 0x0FFL; switch(t) { case 0x00: - emitcode("movf","%s,w", + pic14_emitcode("movf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); break; case 0xff: - emitcode("comf","%s,w", + pic14_emitcode("comf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); break; default: - emitcode("movlw","0x%x",t); - emitcode("xorwf","%s,w", + pic14_emitcode("movlw","0x%x",t); + pic14_emitcode("xorwf","%s,w", aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("movwf","%s", + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); } @@ -5854,13 +4928,13 @@ static void genXor (iCode *ic, iCode *ifx) // faster than result <- left, anl result,right // and better if result is SFR if (AOP_TYPE(left) == AOP_ACC) - emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); else { - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE)); + 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) - emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); } } @@ -5879,7 +4953,7 @@ static void genInline (iCode *ic) char *bp = buffer; char *bp1= buffer; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); _G.inLine += (!options.asmpeep); strcpy(buffer,IC_INLINE(ic)); @@ -5888,22 +4962,22 @@ static void genInline (iCode *ic) while (*bp) { if (*bp == '\n') { *bp++ = '\0'; - emitcode(bp1,""); + pic14_emitcode(bp1,""); bp1 = bp; } else { if (*bp == ':') { bp++; *bp = '\0'; bp++; - emitcode(bp1,""); + pic14_emitcode(bp1,""); bp1 = bp; } else bp++; } } if (bp1 != bp) - emitcode(bp1,""); - /* emitcode("",buffer); */ + pic14_emitcode(bp1,""); + /* pic14_emitcode("",buffer); */ _G.inLine -= (!options.asmpeep); } @@ -5929,7 +5003,7 @@ static void genRRC (iCode *ic) while (size--) { l = aopGet(AOP(left),offset,FALSE,FALSE); MOVA(l); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); if (AOP_SIZE(result) > 1) aopPut(AOP(result),"a",offset--); } @@ -5939,7 +5013,7 @@ static void genRRC (iCode *ic) l = aopGet(AOP(result),AOP_SIZE(result)-1,FALSE,FALSE); MOVA(l); } - emitcode("mov","acc.7,c"); + pic14_emitcode("mov","acc.7,c"); aopPut(AOP(result),"a",AOP_SIZE(result)-1); freeAsmop(left,NULL,ic,TRUE); freeAsmop(result,NULL,ic,TRUE); @@ -5954,7 +5028,7 @@ static void genRLC (iCode *ic) int size, offset = 0; char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* rotate right with carry */ left = IC_LEFT(ic); result=IC_RESULT(ic); @@ -5967,13 +5041,13 @@ static void genRLC (iCode *ic) if (size--) { l = aopGet(AOP(left),offset,FALSE,FALSE); MOVA(l); - emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); if (AOP_SIZE(result) > 1) aopPut(AOP(result),"a",offset++); while (size--) { l = aopGet(AOP(left),offset,FALSE,FALSE); MOVA(l); - emitcode("rlc","a"); + pic14_emitcode("rlc","a"); if (AOP_SIZE(result) > 1) aopPut(AOP(result),"a",offset++); } @@ -5984,7 +5058,7 @@ static void genRLC (iCode *ic) l = aopGet(AOP(result),0,FALSE,FALSE); MOVA(l); } - emitcode("mov","acc.0,c"); + pic14_emitcode("mov","acc.0,c"); aopPut(AOP(result),"a",0); freeAsmop(left,NULL,ic,TRUE); freeAsmop(result,NULL,ic,TRUE); @@ -6001,17 +5075,17 @@ static void genGetHbit (iCode *ic) aopOp (left,ic,FALSE); aopOp (result,ic,FALSE); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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){ - emitcode("rlc","a"); - outBitC(result); + pic14_emitcode("rlc","a"); + pic14_outBitC(result); } else{ - emitcode("rl","a"); - emitcode("anl","a,#0x01"); - outAcc(result); + pic14_emitcode("rl","a"); + pic14_emitcode("anl","a,#0x01"); + pic14_outAcc(result); } @@ -6024,35 +5098,35 @@ static void genGetHbit (iCode *ic) /*-----------------------------------------------------------------*/ static void AccRol (int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); shCount &= 0x0007; // shCount : 0..7 switch(shCount){ case 0 : break; case 1 : - emitcode("rl","a"); + pic14_emitcode("rl","a"); break; case 2 : - emitcode("rl","a"); - emitcode("rl","a"); + pic14_emitcode("rl","a"); + pic14_emitcode("rl","a"); break; case 3 : - emitcode("swap","a"); - emitcode("rr","a"); + pic14_emitcode("swap","a"); + pic14_emitcode("rr","a"); break; case 4 : - emitcode("swap","a"); + pic14_emitcode("swap","a"); break; case 5 : - emitcode("swap","a"); - emitcode("rl","a"); + pic14_emitcode("swap","a"); + pic14_emitcode("rl","a"); break; case 6 : - emitcode("rr","a"); - emitcode("rr","a"); + pic14_emitcode("rr","a"); + pic14_emitcode("rr","a"); break; case 7 : - emitcode("rr","a"); + pic14_emitcode("rr","a"); break; } } @@ -6062,19 +5136,19 @@ static void AccRol (int shCount) /*-----------------------------------------------------------------*/ static void AccLsh (int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(shCount != 0){ if(shCount == 1) - emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); else if(shCount == 2) { - emitcode("add","a,acc"); - emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); } else { /* rotate left accumulator */ AccRol(shCount); /* and kill the lower order bits */ - emitcode("anl","a,#0x%02x", SLMask[shCount]); + pic14_emitcode("anl","a,#0x%02x", SLMask[shCount]); } } } @@ -6084,16 +5158,16 @@ static void AccLsh (int shCount) /*-----------------------------------------------------------------*/ static void AccRsh (int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(shCount != 0){ if(shCount == 1){ CLRC; - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); } else { /* rotate right accumulator */ AccRol(8 - shCount); /* and kill the higher order bits */ - emitcode("anl","a,#0x%02x", SRMask[shCount]); + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); } } } @@ -6104,26 +5178,26 @@ static void AccRsh (int shCount) static void AccSRsh (int shCount) { symbol *tlbl ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(shCount != 0){ if(shCount == 1){ - emitcode("mov","c,acc.7"); - emitcode("rrc","a"); + pic14_emitcode("mov","c,acc.7"); + pic14_emitcode("rrc","a"); } else if(shCount == 2){ - emitcode("mov","c,acc.7"); - emitcode("rrc","a"); - emitcode("mov","c,acc.7"); - emitcode("rrc","a"); + 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 */ - emitcode("anl","a,#0x%02x", SRMask[shCount]); - emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); - emitcode("orl","a,#0x%02x", + 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]); - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); } } } @@ -6135,7 +5209,7 @@ static void shiftR1Left2Result (operand *left, int offl, operand *result, int offr, int shCount, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); /* shift right accumulator */ if(sign) @@ -6152,7 +5226,7 @@ static void shiftL1Left2Result (operand *left, int offl, operand *result, int offr, int shCount) { char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); l = aopGet(AOP(left),offl,FALSE,FALSE); MOVA(l); /* shift left accumulator */ @@ -6167,20 +5241,20 @@ static void movLeft2Result (operand *left, int offl, operand *result, int offr, int sign) { char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(!sameRegs(AOP(left),AOP(result)) || (offl != offr)){ + 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))) { - emitcode("mov","a,%s",l); + pic14_emitcode("mov","a,%s",l); aopPut(AOP(result),"a",offr); } else { if(!sign) aopPut(AOP(result),l,offr); else{ /* MSB sign in acc.7 ! */ - if(getDataSize(left) == offl+1){ - emitcode("mov","a,%s",l); + if(pic14_getDataSize(left) == offl+1){ + pic14_emitcode("mov","a,%s",l); aopPut(AOP(result),"a",offr); } } @@ -6193,11 +5267,11 @@ static void movLeft2Result (operand *left, int offl, /*-----------------------------------------------------------------*/ static void AccAXRrl1 (char *x) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitcode("rrc","a"); - emitcode("xch","a,%s", x); - emitcode("rrc","a"); - emitcode("xch","a,%s", x); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + pic14_emitcode("rrc","a"); + pic14_emitcode("xch","a,%s", x); + pic14_emitcode("rrc","a"); + pic14_emitcode("xch","a,%s", x); } /*-----------------------------------------------------------------*/ @@ -6205,11 +5279,11 @@ static void AccAXRrl1 (char *x) /*-----------------------------------------------------------------*/ static void AccAXLrl1 (char *x) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitcode("xch","a,%s",x); - emitcode("rlc","a"); - emitcode("xch","a,%s",x); - emitcode("rlc","a"); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + pic14_emitcode("xch","a,%s",x); + pic14_emitcode("rlc","a"); + pic14_emitcode("xch","a,%s",x); + pic14_emitcode("rlc","a"); } /*-----------------------------------------------------------------*/ @@ -6217,11 +5291,11 @@ static void AccAXLrl1 (char *x) /*-----------------------------------------------------------------*/ static void AccAXLsh1 (char *x) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - emitcode("xch","a,%s",x); - emitcode("add","a,acc"); - emitcode("xch","a,%s",x); - emitcode("rlc","a"); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + pic14_emitcode("xch","a,%s",x); + pic14_emitcode("add","a,acc"); + pic14_emitcode("xch","a,%s",x); + pic14_emitcode("rlc","a"); } /*-----------------------------------------------------------------*/ @@ -6229,7 +5303,7 @@ static void AccAXLsh1 (char *x) /*-----------------------------------------------------------------*/ static void AccAXLsh (char *x, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); switch(shCount){ case 0 : break; @@ -6244,31 +5318,31 @@ static void AccAXLsh (char *x, int shCount) case 4 : case 5 : // AAAAABBB:CCCCCDDD AccRol(shCount); // BBBAAAAA:CCCCCDDD - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", SLMask[shCount]); // BBB00000:CCCCCDDD - emitcode("xch","a,%s",x); // CCCCCDDD:BBB00000 + pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBB00000 AccRol(shCount); // DDDCCCCC:BBB00000 - emitcode("xch","a,%s",x); // BBB00000:DDDCCCCC - emitcode("xrl","a,%s",x); // (BBB^DDD)CCCCC:DDDCCCCC - emitcode("xch","a,%s",x); // DDDCCCCC:(BBB^DDD)CCCCC - emitcode("anl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // BBB00000:DDDCCCCC + pic14_emitcode("xrl","a,%s",x); // (BBB^DDD)CCCCC:DDDCCCCC + pic14_emitcode("xch","a,%s",x); // DDDCCCCC:(BBB^DDD)CCCCC + pic14_emitcode("anl","a,#0x%02x", SLMask[shCount]); // DDD00000:(BBB^DDD)CCCCC - emitcode("xch","a,%s",x); // (BBB^DDD)CCCCC:DDD00000 - emitcode("xrl","a,%s",x); // BBBCCCCC:DDD00000 + pic14_emitcode("xch","a,%s",x); // (BBB^DDD)CCCCC:DDD00000 + pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:DDD00000 break; case 6 : // AAAAAABB:CCCCCCDD - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000000BB:CCCCCCDD - emitcode("mov","c,acc.0"); // c = B - emitcode("xch","a,%s",x); // CCCCCCDD:000000BB + pic14_emitcode("mov","c,acc.0"); // c = B + pic14_emitcode("xch","a,%s",x); // CCCCCCDD:000000BB AccAXRrl1(x); // BCCCCCCD:D000000B AccAXRrl1(x); // BBCCCCCC:DD000000 break; case 7 : // a:x <<= 7 - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 0000000B:CCCCCCCD - emitcode("mov","c,acc.0"); // c = B - emitcode("xch","a,%s",x); // CCCCCCCD:0000000B + pic14_emitcode("mov","c,acc.0"); // c = B + pic14_emitcode("xch","a,%s",x); // CCCCCCCD:0000000B AccAXRrl1(x); // BCCCCCCC:D0000000 break; default : @@ -6281,7 +5355,7 @@ static void AccAXLsh (char *x, int shCount) /*-----------------------------------------------------------------*/ static void AccAXRsh (char *x, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); switch(shCount){ case 0 : break; @@ -6299,31 +5373,31 @@ static void AccAXRsh (char *x, int shCount) case 4 : case 5 : // AAAAABBB:CCCCCDDD = a:x AccRol(8 - shCount); // BBBAAAAA:DDDCCCCC - emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA + pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA AccRol(8 - shCount); // DDDCCCCC:BBBAAAAA - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000CCCCC:BBBAAAAA - emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA - emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA) - emitcode("anl","a,#0x%02x", + pic14_emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA + pic14_emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA) + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000AAAAA:BBB(CCCCC^AAAAA) - emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA - emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA - emitcode("xch","a,%s",x); // 000AAAAA:BBBCCCCC + pic14_emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA + pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA + pic14_emitcode("xch","a,%s",x); // 000AAAAA:BBBCCCCC break; case 6 : // AABBBBBB:CCDDDDDD - emitcode("mov","c,acc.7"); + pic14_emitcode("mov","c,acc.7"); AccAXLrl1(x); // ABBBBBBC:CDDDDDDA AccAXLrl1(x); // BBBBBBCC:DDDDDDAA - emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC - emitcode("anl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000000AA:BBBBBBCC break; case 7 : // ABBBBBBB:CDDDDDDD - emitcode("mov","c,acc.7"); // c = A + pic14_emitcode("mov","c,acc.7"); // c = A AccAXLrl1(x); // BBBBBBBC:DDDDDDDA - emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC - emitcode("anl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 0000000A:BBBBBBBC break; default : @@ -6337,18 +5411,18 @@ static void AccAXRsh (char *x, int shCount) static void AccAXRshS (char *x, int shCount) { symbol *tlbl ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); switch(shCount){ case 0 : break; case 1 : - emitcode("mov","c,acc.7"); + pic14_emitcode("mov","c,acc.7"); AccAXRrl1(x); // s->a:x break; case 2 : - emitcode("mov","c,acc.7"); + pic14_emitcode("mov","c,acc.7"); AccAXRrl1(x); // s->a:x - emitcode("mov","c,acc.7"); + pic14_emitcode("mov","c,acc.7"); AccAXRrl1(x); // s->a:x break; case 3 : @@ -6356,46 +5430,46 @@ static void AccAXRshS (char *x, int shCount) case 5 : // AAAAABBB:CCCCCDDD = a:x tlbl = newiTempLabel(NULL); AccRol(8 - shCount); // BBBAAAAA:CCCCCDDD - emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA + pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA AccRol(8 - shCount); // DDDCCCCC:BBBAAAAA - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000CCCCC:BBBAAAAA - emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA - emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA) - emitcode("anl","a,#0x%02x", + pic14_emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA + pic14_emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA) + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000AAAAA:BBB(CCCCC^AAAAA) - emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA - emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA - emitcode("xch","a,%s",x); // 000SAAAA:BBBCCCCC - emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); - emitcode("orl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA + pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA + pic14_emitcode("xch","a,%s",x); // 000SAAAA:BBBCCCCC + pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); + pic14_emitcode("orl","a,#0x%02x", (unsigned char)~SRMask[shCount]); // 111AAAAA:BBBCCCCC - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); break; // SSSSAAAA:BBBCCCCC case 6 : // AABBBBBB:CCDDDDDD tlbl = newiTempLabel(NULL); - emitcode("mov","c,acc.7"); + pic14_emitcode("mov","c,acc.7"); AccAXLrl1(x); // ABBBBBBC:CDDDDDDA AccAXLrl1(x); // BBBBBBCC:DDDDDDAA - emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC - emitcode("anl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 000000AA:BBBBBBCC - emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); - emitcode("orl","a,#0x%02x", + pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); + pic14_emitcode("orl","a,#0x%02x", (unsigned char)~SRMask[shCount]); // 111111AA:BBBBBBCC - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); break; case 7 : // ABBBBBBB:CDDDDDDD tlbl = newiTempLabel(NULL); - emitcode("mov","c,acc.7"); // c = A + pic14_emitcode("mov","c,acc.7"); // c = A AccAXLrl1(x); // BBBBBBBC:DDDDDDDA - emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC - emitcode("anl","a,#0x%02x", + pic14_emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC + pic14_emitcode("anl","a,#0x%02x", SRMask[shCount]); // 0000000A:BBBBBBBC - emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); - emitcode("orl","a,#0x%02x", + pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); + pic14_emitcode("orl","a,#0x%02x", (unsigned char)~SRMask[shCount]); // 1111111A:BBBBBBBC - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); break; default : break; @@ -6408,12 +5482,12 @@ static void AccAXRshS (char *x, int shCount) static void shiftL2Left2Result (operand *left, int offl, operand *result, int offr, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(sameRegs(AOP(result), AOP(left)) && + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(pic14_sameRegs(AOP(result), AOP(left)) && ((offl + MSB16) == offr)){ /* don't crash result[offr] */ MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); - emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); + pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); } else { movLeft2Result(left,offl, result, offr, 0); MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); @@ -6431,12 +5505,12 @@ static void shiftR2Left2Result (operand *left, int offl, operand *result, int offr, int shCount, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - if(sameRegs(AOP(result), AOP(left)) && + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(pic14_sameRegs(AOP(result), AOP(left)) && ((offl + MSB16) == offr)){ /* don't crash result[offr] */ MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); - emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); + pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); } else { movLeft2Result(left,offl, result, offr, 0); MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE)); @@ -6446,7 +5520,7 @@ static void shiftR2Left2Result (operand *left, int offl, AccAXRshS( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); else AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount); - if(getDataSize(result) > 1) + if(pic14_getDataSize(result) > 1) aopPut(AOP(result),"a",offr+MSB16); } @@ -6456,12 +5530,12 @@ static void shiftR2Left2Result (operand *left, int offl, static void shiftLLeftOrResult (operand *left, int offl, operand *result, int offr, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); /* shift left accumulator */ AccLsh(shCount); /* or with result */ - emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); + pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); /* back to result */ aopPut(AOP(result),"a",offr); } @@ -6472,12 +5546,12 @@ static void shiftLLeftOrResult (operand *left, int offl, static void shiftRLeftOrResult (operand *left, int offl, operand *result, int offr, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); MOVA(aopGet(AOP(left),offl,FALSE,FALSE)); /* shift right accumulator */ AccRsh(shCount); /* or with result */ - emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); + pic14_emitcode("orl","a,%s", aopGet(AOP(result),offr,FALSE,FALSE)); /* back to result */ aopPut(AOP(result),"a",offr); } @@ -6487,7 +5561,7 @@ static void shiftRLeftOrResult (operand *left, int offl, /*-----------------------------------------------------------------*/ static void genlshOne (operand *result, operand *left, int shCount) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); shiftL1Left2Result(left, LSB, result, LSB, shCount); } @@ -6498,8 +5572,8 @@ static void genlshTwo (operand *result,operand *left, int shCount) { int size; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - size = getDataSize(result); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + size = pic14_getDataSize(result); /* if shCount >= 8 */ if (shCount >= 8) { @@ -6532,53 +5606,53 @@ static void shiftLLong (operand *left, operand *result, int offr ) char *l; int size = AOP_SIZE(result); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(size >= LSB+offr){ l = aopGet(AOP(left),LSB,FALSE,FALSE); MOVA(l); - emitcode("add","a,acc"); - if (sameRegs(AOP(left),AOP(result)) && + pic14_emitcode("add","a,acc"); + if (pic14_sameRegs(AOP(left),AOP(result)) && size >= MSB16+offr && offr != LSB ) - emitcode("xch","a,%s", + pic14_emitcode("xch","a,%s", aopGet(AOP(left),LSB+offr,FALSE,FALSE)); else aopPut(AOP(result),"a",LSB+offr); } if(size >= MSB16+offr){ - if (!(sameRegs(AOP(result),AOP(left)) && size >= MSB16+offr && offr != LSB) ) { + if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB16+offr && offr != LSB) ) { l = aopGet(AOP(left),MSB16,FALSE,FALSE); MOVA(l); } - emitcode("rlc","a"); - if (sameRegs(AOP(left),AOP(result)) && + pic14_emitcode("rlc","a"); + if (pic14_sameRegs(AOP(left),AOP(result)) && size >= MSB24+offr && offr != LSB) - emitcode("xch","a,%s", + pic14_emitcode("xch","a,%s", aopGet(AOP(left),MSB16+offr,FALSE,FALSE)); else aopPut(AOP(result),"a",MSB16+offr); } if(size >= MSB24+offr){ - if (!(sameRegs(AOP(left),AOP(left)) && size >= MSB24+offr && offr != LSB)) { + if (!(pic14_sameRegs(AOP(left),AOP(left)) && size >= MSB24+offr && offr != LSB)) { l = aopGet(AOP(left),MSB24,FALSE,FALSE); MOVA(l); } - emitcode("rlc","a"); - if (sameRegs(AOP(left),AOP(result)) && + pic14_emitcode("rlc","a"); + if (pic14_sameRegs(AOP(left),AOP(result)) && size >= MSB32+offr && offr != LSB ) - emitcode("xch","a,%s", + pic14_emitcode("xch","a,%s", aopGet(AOP(left),MSB24+offr,FALSE,FALSE)); else aopPut(AOP(result),"a",MSB24+offr); } if(size > MSB32+offr){ - if (!(sameRegs(AOP(result),AOP(left)) && size >= MSB32+offr && offr != LSB)) { + if (!(pic14_sameRegs(AOP(result),AOP(left)) && size >= MSB32+offr && offr != LSB)) { l = aopGet(AOP(left),MSB32,FALSE,FALSE); MOVA(l); } - emitcode("rlc","a"); + pic14_emitcode("rlc","a"); aopPut(AOP(result),"a",MSB32+offr); } if(offr != LSB) @@ -6592,7 +5666,7 @@ static void genlshFour (operand *result, operand *left, int shCount) { int size; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); size = AOP_SIZE(result); /* if shifting more that 3 bytes */ @@ -6679,7 +5753,7 @@ static void genLeftShiftLiteral (operand *left, int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); int size; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); freeAsmop(right,NULL,ic,TRUE); aopOp(left,ic,FALSE); @@ -6688,7 +5762,7 @@ static void genLeftShiftLiteral (operand *left, size = getSize(operandType(result)); #if VIEW_SIZE - emitcode("; shift left ","result %d, left %d",size, + pic14_emitcode("; shift left ","result %d, left %d",size, AOP_SIZE(left)); #endif @@ -6732,7 +5806,7 @@ static void genLeftShift (iCode *ic) char *l; symbol *tlbl , *tlbl1; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); right = IC_RIGHT(ic); left = IC_LEFT(ic); @@ -6753,15 +5827,15 @@ static void genLeftShift (iCode *ic) more that 32 bits make no sense anyway, ( the largest size of an object can be only 32 bits ) */ - emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("inc","b"); + 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 (!sameRegs(AOP(left),AOP(result)) && + if (!pic14_sameRegs(AOP(left),AOP(result)) && AOP_SIZE(result) > 1) { size = AOP_SIZE(result); @@ -6770,7 +5844,7 @@ static void genLeftShift (iCode *ic) l = aopGet(AOP(left),offset,FALSE,TRUE); if (*l == '@' && (IS_AOP_PREG(result))) { - emitcode("mov","a,%s",l); + pic14_emitcode("mov","a,%s",l); aopPut(AOP(result),"a",offset); } else aopPut(AOP(result),l,offset); @@ -6789,33 +5863,33 @@ static void genLeftShift (iCode *ic) l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); - emitcode("add","a,acc"); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("add","a,acc"); + 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)); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); l = aopGet(AOP(result),offset,FALSE,FALSE); MOVA(l); - emitcode("add","a,acc"); + pic14_emitcode("add","a,acc"); aopPut(AOP(result),"a",offset++); while (--size) { l = aopGet(AOP(result),offset,FALSE,FALSE); MOVA(l); - emitcode("rlc","a"); + pic14_emitcode("rlc","a"); aopPut(AOP(result),"a",offset++); } reAdjustPreg(AOP(result)); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); release: freeAsmop(left,NULL,ic,TRUE); freeAsmop(result,NULL,ic,TRUE); @@ -6827,7 +5901,7 @@ release: static void genrshOne (operand *result, operand *left, int shCount, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); shiftR1Left2Result(left, LSB, result, LSB, shCount, sign); } @@ -6837,7 +5911,7 @@ static void genrshOne (operand *result, operand *left, static void genrshTwo (operand *result,operand *left, int shCount, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if shCount >= 8 */ if (shCount >= 8) { shCount -= 8 ; @@ -6861,29 +5935,29 @@ static void genrshTwo (operand *result,operand *left, static void shiftRLong (operand *left, int offl, operand *result, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if(!sign) - emitcode("clr","c"); + pic14_emitcode("clr","c"); MOVA(aopGet(AOP(left),MSB32,FALSE,FALSE)); if(sign) - emitcode("mov","c,acc.7"); - emitcode("rrc","a"); + 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)); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"a",MSB24-offl); MOVA(aopGet(AOP(left),MSB16,FALSE,FALSE)); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"a",MSB16-offl); if(offl == LSB){ MOVA(aopGet(AOP(left),LSB,FALSE,FALSE)); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"a",LSB); } } @@ -6894,7 +5968,7 @@ static void shiftRLong (operand *left, int offl, static void genrshFour (operand *result, operand *left, int shCount, int sign) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if shifting more that 3 bytes */ if(shCount >= 24 ) { shCount -= 24; @@ -6958,23 +6032,23 @@ static void genRightShiftLiteral (operand *left, int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit); int size; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); freeAsmop(right,NULL,ic,TRUE); aopOp(left,ic,FALSE); aopOp(result,ic,FALSE); #if VIEW_SIZE - emitcode("; shift right ","result %d, left %d",AOP_SIZE(result), + pic14_emitcode("; shift right ","result %d, left %d",AOP_SIZE(result), AOP_SIZE(left)); #endif - size = getDataSize(left); + size = pic14_getDataSize(left); /* test the LEFT size !!! */ /* I suppose that the left size >= result size */ if(shCount == 0){ - size = getDataSize(result); + size = pic14_getDataSize(result); while(size--) movLeft2Result(left, size, result, size, 0); } @@ -7018,7 +6092,7 @@ static void genSignedRightShift (iCode *ic) /* we do it the hard way put the shift count in b and loop thru preserving the sign */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); right = IC_RIGHT(ic); left = IC_LEFT(ic); @@ -7037,15 +6111,15 @@ static void genSignedRightShift (iCode *ic) more that 32 bits make no sense anyway, ( the largest size of an object can be only 32 bits ) */ - emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("inc","b"); + 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 (!sameRegs(AOP(left),AOP(result)) && + if (!pic14_sameRegs(AOP(left),AOP(result)) && AOP_SIZE(result) > 1) { size = AOP_SIZE(result); @@ -7054,7 +6128,7 @@ static void genSignedRightShift (iCode *ic) l = aopGet(AOP(left),offset,FALSE,TRUE); if (*l == '@' && IS_AOP_PREG(result)) { - emitcode("mov","a,%s",l); + pic14_emitcode("mov","a,%s",l); aopPut(AOP(result),"a",offset); } else aopPut(AOP(result),l,offset); @@ -7068,36 +6142,36 @@ static void genSignedRightShift (iCode *ic) size = AOP_SIZE(result); offset = size - 1; - emitcode("mov","a,%s",aopGet(AOP(left),offset,FALSE,FALSE)); - emitcode("rlc","a"); - emitcode("mov","ov,c"); + 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); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); - emitcode("mov","c,ov"); - emitcode("rrc","a"); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + 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)); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); - emitcode("mov","c,ov"); + 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); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"a",offset--); } reAdjustPreg(AOP(result)); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); release: freeAsmop(left,NULL,ic,TRUE); @@ -7118,7 +6192,7 @@ static void genRightShift (iCode *ic) /* if signed then we do it the hard way preserve the sign bit moving it inwards */ retype = getSpec(operandType(IC_RESULT(ic))); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (!SPEC_USIGN(retype)) { genSignedRightShift (ic); @@ -7151,15 +6225,15 @@ static void genRightShift (iCode *ic) more that 32 bits make no sense anyway, ( the largest size of an object can be only 32 bits ) */ - emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE)); - emitcode("inc","b"); + 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 (!sameRegs(AOP(left),AOP(result)) && + if (!pic14_sameRegs(AOP(left),AOP(result)) && AOP_SIZE(result) > 1) { size = AOP_SIZE(result); @@ -7168,7 +6242,7 @@ static void genRightShift (iCode *ic) l = aopGet(AOP(left),offset,FALSE,TRUE); if (*l == '@' && IS_AOP_PREG(result)) { - emitcode("mov","a,%s",l); + pic14_emitcode("mov","a,%s",l); aopPut(AOP(result),"a",offset); } else aopPut(AOP(result),l,offset); @@ -7185,30 +6259,30 @@ static void genRightShift (iCode *ic) if (size == 1) { l = aopGet(AOP(left),0,FALSE,FALSE); MOVA(l); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); + pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); + pic14_emitcode("","%05d_DS_:",tlbl->key+100); CLRC; - emitcode("rrc","a"); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + 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)); - emitcode("sjmp","%05d_DS_",tlbl1->key+100); - emitcode("","%05d_DS_:",tlbl->key+100); + 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); - emitcode("rrc","a"); + pic14_emitcode("rrc","a"); aopPut(AOP(result),"a",offset--); } reAdjustPreg(AOP(result)); - emitcode("","%05d_DS_:",tlbl1->key+100); - emitcode("djnz","b,%05d_DS_",tlbl->key+100); + pic14_emitcode("","%05d_DS_:",tlbl1->key+100); + pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100); release: freeAsmop(left,NULL,ic,TRUE); @@ -7225,7 +6299,7 @@ static void genUnpackBits (operand *result, char *rname, int ptype) sym_link *etype; int offset = 0 ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); etype = getSpec(operandType(result)); /* read the first byte */ @@ -7233,24 +6307,24 @@ static void genUnpackBits (operand *result, char *rname, int ptype) case POINTER: case IPOINTER: - emitcode("mov","a,@%s",rname); + pic14_emitcode("mov","a,@%s",rname); break; case PPOINTER: - emitcode("movx","a,@%s",rname); + pic14_emitcode("movx","a,@%s",rname); break; case FPOINTER: - emitcode("movx","a,@dptr"); + pic14_emitcode("movx","a,@dptr"); break; case CPOINTER: - emitcode("clr","a"); - emitcode("movc","a","@a+dptr"); + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a","@a+dptr"); break; case GPOINTER: - emitcode("lcall","__gptrget"); + pic14_emitcode("lcall","__gptrget"); break; } @@ -7263,7 +6337,7 @@ static void genUnpackBits (operand *result, char *rname, int ptype) /* shift right acc */ AccRsh(shCnt); - emitcode("anl","a,#0x%02x", + pic14_emitcode("anl","a,#0x%02x", ((unsigned char) -1)>>(8 - SPEC_BLEN(etype))); aopPut(AOP(result),"a",offset); return ; @@ -7278,29 +6352,29 @@ static void genUnpackBits (operand *result, char *rname, int ptype) switch (ptype) { case POINTER: case IPOINTER: - emitcode("inc","%s",rname); - emitcode("mov","a,@%s",rname); + pic14_emitcode("inc","%s",rname); + pic14_emitcode("mov","a,@%s",rname); break; case PPOINTER: - emitcode("inc","%s",rname); - emitcode("movx","a,@%s",rname); + pic14_emitcode("inc","%s",rname); + pic14_emitcode("movx","a,@%s",rname); break; case FPOINTER: - emitcode("inc","dptr"); - emitcode("movx","a,@dptr"); + pic14_emitcode("inc","dptr"); + pic14_emitcode("movx","a,@dptr"); break; case CPOINTER: - emitcode("clr","a"); - emitcode("inc","dptr"); - emitcode("movc","a","@a+dptr"); + pic14_emitcode("clr","a"); + pic14_emitcode("inc","dptr"); + pic14_emitcode("movc","a","@a+dptr"); break; case GPOINTER: - emitcode("inc","dptr"); - emitcode("lcall","__gptrget"); + pic14_emitcode("inc","dptr"); + pic14_emitcode("lcall","__gptrget"); break; } @@ -7314,7 +6388,7 @@ static void genUnpackBits (operand *result, char *rname, int ptype) } if (rlen) { - emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(-rlen)); + pic14_emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(-rlen)); aopPut(AOP(result),"a",offset); } @@ -7329,31 +6403,34 @@ static void genDataPointerGet (operand *left, operand *result, iCode *ic) { - char *l; - char buffer[256]; - int size , offset = 0; - aopOp(result,ic,TRUE); + int size , offset = 0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - /* get the string representation of the name */ - l = aopGet(AOP(left),0,FALSE,TRUE); - size = AOP_SIZE(result); - // tsd, was l+1 - the underline `_' prefix was being stripped - while (size--) { - if (offset) - sprintf(buffer,"(%s + %d)",l,offset); - else - sprintf(buffer,"%s",l); - aopPut(AOP(result),buffer,offset++); - } + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - freeAsmop(left,NULL,ic,TRUE); - freeAsmop(result,NULL,ic,TRUE); + + /* 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); + + emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,TRUE)); + + size = AOP_SIZE(result); + + while (size--) { + emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,TRUE)); + offset++; + } + + freeAsmop(left,NULL,ic,TRUE); + freeAsmop(result,NULL,ic,TRUE); } /*-----------------------------------------------------------------*/ -/* genNearPointerGet - emitcode for near pointer fetch */ +/* genNearPointerGet - pic14_emitcode for near pointer fetch */ /*-----------------------------------------------------------------*/ static void genNearPointerGet (operand *left, operand *result, @@ -7366,7 +6443,7 @@ static void genNearPointerGet (operand *left, sym_link *ltype = operandType(left); char buffer[80]; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); rtype = operandType(result); retype= getSpec(rtype); @@ -7384,13 +6461,16 @@ static void genNearPointerGet (operand *left, 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); - emitcode("mov","%s,%s", + pic14_emitcode("mov","%s,%s", preg->name, aopGet(AOP(left),0,FALSE,TRUE)); rname = preg->name ; @@ -7408,10 +6488,11 @@ static void genNearPointerGet (operand *left, int size = AOP_SIZE(result); int offset = 0 ; + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); while (size--) { if (IS_AOP_PREG(result) || AOP_TYPE(result) == AOP_STK ) { - emitcode("mov","a,@%s",rname); + pic14_emitcode("mov","a,@%s",rname); aopPut(AOP(result),"a",offset); } else { sprintf(buffer,"@%s",rname); @@ -7419,13 +6500,14 @@ static void genNearPointerGet (operand *left, } offset++ ; if (size) - emitcode("inc","%s",rname); + 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 @@ -7433,13 +6515,14 @@ static void genNearPointerGet (operand *left, 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--) - emitcode("dec","%s",rname); + pic14_emitcode("dec","%s",rname); } } @@ -7449,7 +6532,7 @@ static void genNearPointerGet (operand *left, } /*-----------------------------------------------------------------*/ -/* genPagedPointerGet - emitcode for paged pointer fetch */ +/* genPagedPointerGet - pic14_emitcode for paged pointer fetch */ /*-----------------------------------------------------------------*/ static void genPagedPointerGet (operand *left, operand *result, @@ -7460,7 +6543,7 @@ static void genPagedPointerGet (operand *left, char *rname ; sym_link *rtype, *retype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); rtype = operandType(result); retype= getSpec(rtype); @@ -7473,7 +6556,7 @@ static void genPagedPointerGet (operand *left, /* otherwise get a free pointer register */ aop = newAsmop(0); preg = getFreePtr(ic,&aop,FALSE); - emitcode("mov","%s,%s", + pic14_emitcode("mov","%s,%s", preg->name, aopGet(AOP(left),0,FALSE,TRUE)); rname = preg->name ; @@ -7493,13 +6576,13 @@ static void genPagedPointerGet (operand *left, while (size--) { - emitcode("movx","a,@%s",rname); + pic14_emitcode("movx","a,@%s",rname); aopPut(AOP(result),"a",offset); offset++ ; if (size) - emitcode("inc","%s",rname); + pic14_emitcode("inc","%s",rname); } } @@ -7519,7 +6602,7 @@ static void genPagedPointerGet (operand *left, ic->depth )) { int size = AOP_SIZE(result) - 1; while (size--) - emitcode("dec","%s",rname); + pic14_emitcode("dec","%s",rname); } } @@ -7538,7 +6621,7 @@ static void genFarPointerGet (operand *left, int size, offset ; sym_link *retype = getSpec(operandType(result)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(left,ic,FALSE); @@ -7547,13 +6630,13 @@ static void genFarPointerGet (operand *left, if (AOP_TYPE(left) != AOP_STR) { /* if this is remateriazable */ if (AOP_TYPE(left) == AOP_IMMD) - emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); + pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); else { /* we need to get it byte by byte */ - emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); + 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) { - emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); } } } @@ -7569,10 +6652,10 @@ static void genFarPointerGet (operand *left, offset = 0 ; while (size--) { - emitcode("movx","a,@dptr"); + pic14_emitcode("movx","a,@dptr"); aopPut(AOP(result),"a",offset++); if (size) - emitcode("inc","dptr"); + pic14_emitcode("inc","dptr"); } } @@ -7580,15 +6663,15 @@ static void genFarPointerGet (operand *left, } /*-----------------------------------------------------------------*/ -/* emitcodePointerGet - gget value from code space */ +/* pic14_emitcodePointerGet - gget value from code space */ /*-----------------------------------------------------------------*/ -static void emitcodePointerGet (operand *left, +static void pic14_emitcodePointerGet (operand *left, operand *result, iCode *ic) { int size, offset ; sym_link *retype = getSpec(operandType(result)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(left,ic,FALSE); @@ -7597,13 +6680,13 @@ static void emitcodePointerGet (operand *left, if (AOP_TYPE(left) != AOP_STR) { /* if this is remateriazable */ if (AOP_TYPE(left) == AOP_IMMD) - emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); + pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); else { /* we need to get it byte by byte */ - emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); + 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) { - emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); } } } @@ -7619,11 +6702,11 @@ static void emitcodePointerGet (operand *left, offset = 0 ; while (size--) { - emitcode("clr","a"); - emitcode("movc","a,@a+dptr"); + pic14_emitcode("clr","a"); + pic14_emitcode("movc","a,@a+dptr"); aopPut(AOP(result),"a",offset++); if (size) - emitcode("inc","dptr"); + pic14_emitcode("inc","dptr"); } } @@ -7639,7 +6722,7 @@ static void genGenPointerGet (operand *left, int size, offset ; sym_link *retype = getSpec(operandType(result)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(left,ic,FALSE); /* if the operand is already in dptr @@ -7647,26 +6730,26 @@ static void genGenPointerGet (operand *left, if (AOP_TYPE(left) != AOP_STR) { /* if this is remateriazable */ if (AOP_TYPE(left) == AOP_IMMD) { - emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE)); - emitcode("mov","b,#%d",pointerCode(retype)); + 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,FALSE,FALSE)); - emitpcode(POC_MOVWF,popCopy(&pc_fsr)); - emitcode("movf","%s,w",aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("movwf","FSR"); + emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); + //emitpcode(POC_MOVFW,popGet(AOP(left),0,FALSE,FALSE)); + //emitpcode(POC_MOVWF,popCopyReg(&pc_fsr)); + pic14_emitcode("movf","%s,w",aopGet(AOP(left),0,FALSE,FALSE)); + pic14_emitcode("movwf","FSR"); /* - emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE)); - emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE)); + 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) { - emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); - emitcode("mov","b,%s",aopGet(AOP(left),3,FALSE,FALSE)); + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE)); + pic14_emitcode("mov","b,%s",aopGet(AOP(left),3,FALSE,FALSE)); } else { - emitcode("mov","b,%s",aopGet(AOP(left),2,FALSE,FALSE)); + pic14_emitcode("mov","b,%s",aopGet(AOP(left),2,FALSE,FALSE)); } */ } @@ -7683,16 +6766,17 @@ static void genGenPointerGet (operand *left, offset = 0 ; while (size--) { - emitpcode(POC_MOVFW,popCopy(&pc_fsr)); + emitpcode(POC_MOVFW,popCopyReg(&pc_indf)); + emitpcode(POC_MOVWF,popGet(AOP(result),offset++,FALSE,FALSE)); if(size) - emitpcode(POC_INCF,popCopy(&pc_fsr)); + emitpcode(POC_INCF,popCopyReg(&pc_fsr)); /* - emitcode("movf","indf,w"); - emitcode("movwf","%s", + pic14_emitcode("movf","indf,w"); + pic14_emitcode("movwf","%s", aopGet(AOP(result),offset++,FALSE,FALSE)); if (size) - emitcode("incf","fsr,f"); + pic14_emitcode("incf","fsr,f"); */ } } @@ -7709,7 +6793,7 @@ static void genPointerGet (iCode *ic) sym_link *type, *etype; int p_type; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); left = IC_LEFT(ic); result = IC_RESULT(ic) ; @@ -7759,7 +6843,7 @@ static void genPointerGet (iCode *ic) break; case CPOINTER: - emitcodePointerGet (left,result,ic); + pic14_emitcodePointerGet (left,result,ic); break; case GPOINTER: @@ -7782,7 +6866,7 @@ static void genPackBits (sym_link *etype , int blen, bstr ; char *l ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); blen = SPEC_BLEN(etype); bstr = SPEC_BSTR(etype); @@ -7802,43 +6886,43 @@ static void genPackBits (sym_link *etype , switch (p_type) { case POINTER: - emitcode ("mov","b,a"); - emitcode("mov","a,@%s",rname); + pic14_emitcode ("mov","b,a"); + pic14_emitcode("mov","a,@%s",rname); break; case FPOINTER: - emitcode ("mov","b,a"); - emitcode("movx","a,@dptr"); + pic14_emitcode ("mov","b,a"); + pic14_emitcode("movx","a,@dptr"); break; case GPOINTER: - emitcode ("push","b"); - emitcode ("push","acc"); - emitcode ("lcall","__gptrget"); - emitcode ("pop","b"); + pic14_emitcode ("push","b"); + pic14_emitcode ("push","acc"); + pic14_emitcode ("lcall","__gptrget"); + pic14_emitcode ("pop","b"); break; } - emitcode ("anl","a,#0x%02x",(unsigned char) + pic14_emitcode ("anl","a,#0x%02x",(unsigned char) ((unsigned char)(0xFF << (blen+bstr)) | (unsigned char)(0xFF >> (8-bstr)) ) ); - emitcode ("orl","a,b"); + pic14_emitcode ("orl","a,b"); if (p_type == GPOINTER) - emitcode("pop","b"); + pic14_emitcode("pop","b"); } } switch (p_type) { case POINTER: - emitcode("mov","@%s,a",rname); + pic14_emitcode("mov","@%s,a",rname); break; case FPOINTER: - emitcode("movx","@dptr,a"); + pic14_emitcode("movx","@dptr,a"); break; case GPOINTER: - DEBUGemitcode(";lcall","__gptrput"); + DEBUGpic14_emitcode(";lcall","__gptrput"); break; } @@ -7846,7 +6930,7 @@ static void genPackBits (sym_link *etype , if ( SPEC_BLEN(etype) <= 8 ) return ; - emitcode("inc","%s",rname); + pic14_emitcode("inc","%s",rname); rLen = SPEC_BLEN(etype) ; /* now generate for lengths greater than one byte */ @@ -7862,22 +6946,22 @@ static void genPackBits (sym_link *etype , case POINTER: if (*l == '@') { MOVA(l); - emitcode("mov","@%s,a",rname); + pic14_emitcode("mov","@%s,a",rname); } else - emitcode("mov","@%s,%s",rname,l); + pic14_emitcode("mov","@%s,%s",rname,l); break; case FPOINTER: MOVA(l); - emitcode("movx","@dptr,a"); + pic14_emitcode("movx","@dptr,a"); break; case GPOINTER: MOVA(l); - DEBUGemitcode(";lcall","__gptrput"); + DEBUGpic14_emitcode(";lcall","__gptrput"); break; } - emitcode ("inc","%s",rname); + pic14_emitcode ("inc","%s",rname); } MOVA(l); @@ -7887,42 +6971,42 @@ static void genPackBits (sym_link *etype , /* save the byte & read byte */ switch (p_type) { case POINTER: - emitcode ("mov","b,a"); - emitcode("mov","a,@%s",rname); + pic14_emitcode ("mov","b,a"); + pic14_emitcode("mov","a,@%s",rname); break; case FPOINTER: - emitcode ("mov","b,a"); - emitcode("movx","a,@dptr"); + pic14_emitcode ("mov","b,a"); + pic14_emitcode("movx","a,@dptr"); break; case GPOINTER: - emitcode ("push","b"); - emitcode ("push","acc"); - emitcode ("lcall","__gptrget"); - emitcode ("pop","b"); + pic14_emitcode ("push","b"); + pic14_emitcode ("push","acc"); + pic14_emitcode ("lcall","__gptrget"); + pic14_emitcode ("pop","b"); break; } - emitcode ("anl","a,#0x%02x",((unsigned char)-1 << -rLen) ); - emitcode ("orl","a,b"); + pic14_emitcode ("anl","a,#0x%02x",((unsigned char)-1 << -rLen) ); + pic14_emitcode ("orl","a,b"); } if (p_type == GPOINTER) - emitcode("pop","b"); + pic14_emitcode("pop","b"); switch (p_type) { case POINTER: - emitcode("mov","@%s,a",rname); + pic14_emitcode("mov","@%s,a",rname); break; case FPOINTER: - emitcode("movx","@dptr,a"); + pic14_emitcode("movx","@dptr,a"); break; case GPOINTER: - DEBUGemitcode(";lcall","__gptrput"); + DEBUGpic14_emitcode(";lcall","__gptrput"); break; } } @@ -7936,7 +7020,7 @@ static void genDataPointerSet(operand *right, int size, offset = 0 ; char *l, buffer[256]; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(right,ic,FALSE); l = aopGet(AOP(result),0,FALSE,TRUE); @@ -7951,14 +7035,24 @@ static void genDataPointerSet(operand *right, if (AOP_TYPE(right) == AOP_LIT) { unsigned int lit = floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); lit = lit >> (8*offset); - if(lit) { - emitcode("movlw","%s",lit); - emitcode("movwf","%s",buffer); - } else - emitcode("clrf","%s",buffer); + if(lit&0xff) { + pic14_emitcode("movlw","%d",lit); + pic14_emitcode("movwf","%s",buffer); + + emitpcode(POC_MOVLW, popGetLit(lit&0xff)); + emitpcode(POC_MOVWF, popRegFromString(buffer)); + + } else { + pic14_emitcode("clrf","%s",buffer); + emitpcode(POC_CLRF, popRegFromString(buffer)); + } }else { - emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); - emitcode("movwf","%s",buffer); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",buffer); + + emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE)); + emitpcode(POC_MOVWF, popRegFromString(buffer)); + } offset++; @@ -7969,7 +7063,7 @@ static void genDataPointerSet(operand *right, } /*-----------------------------------------------------------------*/ -/* genNearPointerSet - emitcode for near pointer put */ +/* genNearPointerSet - pic14_emitcode for near pointer put */ /*-----------------------------------------------------------------*/ static void genNearPointerSet (operand *right, operand *result, @@ -7981,7 +7075,7 @@ static void genNearPointerSet (operand *right, sym_link *ptype = operandType(result); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); retype= getSpec(operandType(right)); aopOp(result,ic,FALSE); @@ -7995,7 +7089,7 @@ static void genNearPointerSet (operand *right, return; } - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if the value is already in a pointer register then don't need anything more */ @@ -8003,18 +7097,18 @@ static void genNearPointerSet (operand *right, /* otherwise get a free pointer register */ //aop = newAsmop(0); //preg = getFreePtr(ic,&aop,FALSE); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); - //emitcode("mov","%s,%s", + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + //pic14_emitcode("mov","%s,%s", // preg->name, // aopGet(AOP(result),0,FALSE,TRUE)); //rname = preg->name ; - emitcode("movwf","fsr"); + pic14_emitcode("movwf","fsr"); }// else // rname = aopGet(AOP(result),0,FALSE,FALSE); freeAsmop(result,NULL,ic,TRUE); aopOp (right,ic,FALSE); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if bitfield then unpack the bits */ if (IS_BITVAR(retype)) { @@ -8028,36 +7122,36 @@ static void genNearPointerSet (operand *right, int size = AOP_SIZE(right); int offset = 0 ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); while (size--) { l = aopGet(AOP(right),offset,FALSE,TRUE); if (*l == '@' ) { //MOVA(l); - //emitcode("mov","@%s,a",rname); - emitcode("movf","indf,w ;1"); + //pic14_emitcode("mov","@%s,a",rname); + pic14_emitcode("movf","indf,w ;1"); } else { if (AOP_TYPE(right) == AOP_LIT) { unsigned int lit = floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit); if(lit) { - emitcode("movlw","%s",l); - emitcode("movwf","indf ;2"); + pic14_emitcode("movlw","%s",l); + pic14_emitcode("movwf","indf ;2"); } else - emitcode("clrf","indf"); + pic14_emitcode("clrf","indf"); }else { - emitcode("movf","%s,w",l); - emitcode("movwf","indf ;2"); + pic14_emitcode("movf","%s,w",l); + pic14_emitcode("movwf","indf ;2"); } - //emitcode("mov","@%s,%s",rname,l); + //pic14_emitcode("mov","@%s,%s",rname,l); } if (size) - emitcode("incf","fsr,f ;3"); - //emitcode("inc","%s",rname); + pic14_emitcode("incf","fsr,f ;3"); + //pic14_emitcode("inc","%s",rname); offset++; } } - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* now some housekeeping stuff */ if (aop) { /* we had to allocate for this iCode */ @@ -8068,19 +7162,19 @@ static void genNearPointerSet (operand *right, if size > 0 && this could be used again we have to point it back to where it belongs */ - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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--) - emitcode("decf","fsr,f"); - //emitcode("dec","%s",rname); + pic14_emitcode("decf","fsr,f"); + //pic14_emitcode("dec","%s",rname); } } - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* done */ freeAsmop(right,NULL,ic,TRUE); @@ -8088,7 +7182,7 @@ static void genNearPointerSet (operand *right, } /*-----------------------------------------------------------------*/ -/* genPagedPointerSet - emitcode for Paged pointer put */ +/* genPagedPointerSet - pic14_emitcode for Paged pointer put */ /*-----------------------------------------------------------------*/ static void genPagedPointerSet (operand *right, operand *result, @@ -8099,7 +7193,7 @@ static void genPagedPointerSet (operand *right, char *rname , *l; sym_link *retype; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); retype= getSpec(operandType(right)); @@ -8111,7 +7205,7 @@ static void genPagedPointerSet (operand *right, /* otherwise get a free pointer register */ aop = newAsmop(0); preg = getFreePtr(ic,&aop,FALSE); - emitcode("mov","%s,%s", + pic14_emitcode("mov","%s,%s", preg->name, aopGet(AOP(result),0,FALSE,TRUE)); rname = preg->name ; @@ -8133,10 +7227,10 @@ static void genPagedPointerSet (operand *right, l = aopGet(AOP(right),offset,FALSE,TRUE); MOVA(l); - emitcode("movx","@%s,a",rname); + pic14_emitcode("movx","@%s,a",rname); if (size) - emitcode("inc","%s",rname); + pic14_emitcode("inc","%s",rname); offset++; } @@ -8158,7 +7252,7 @@ static void genPagedPointerSet (operand *right, ic->depth )) { int size = AOP_SIZE(right) - 1; while (size--) - emitcode("dec","%s",rname); + pic14_emitcode("dec","%s",rname); } } @@ -8177,7 +7271,7 @@ static void genFarPointerSet (operand *right, int size, offset ; sym_link *retype = getSpec(operandType(right)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(result,ic,FALSE); /* if the operand is already in dptr @@ -8185,13 +7279,13 @@ static void genFarPointerSet (operand *right, if (AOP_TYPE(result) != AOP_STR) { /* if this is remateriazable */ if (AOP_TYPE(result) == AOP_IMMD) - emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); + pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); else { /* we need to get it byte by byte */ - emitcode("mov","dpl,%s",aopGet(AOP(result),0,FALSE,FALSE)); - emitcode("mov","dph,%s",aopGet(AOP(result),1,FALSE,FALSE)); + 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) { - emitcode("mov", "dpx,%s",aopGet(AOP(result),2,FALSE,FALSE)); + pic14_emitcode("mov", "dpx,%s",aopGet(AOP(result),2,FALSE,FALSE)); } } } @@ -8209,9 +7303,9 @@ static void genFarPointerSet (operand *right, while (size--) { char *l = aopGet(AOP(right),offset++,FALSE,FALSE); MOVA(l); - emitcode("movx","@dptr,a"); + pic14_emitcode("movx","@dptr,a"); if (size) - emitcode("inc","dptr"); + pic14_emitcode("inc","dptr"); } } @@ -8227,7 +7321,7 @@ static void genGenPointerSet (operand *right, int size, offset ; sym_link *retype = getSpec(operandType(right)); - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(result,ic,FALSE); @@ -8236,20 +7330,20 @@ static void genGenPointerSet (operand *right, if (AOP_TYPE(result) != AOP_STR) { /* if this is remateriazable */ if (AOP_TYPE(result) == AOP_IMMD) { - emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE)); - emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE)); + 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); if(strcmp("FSR",l)) emitpcode(POC_MOVLW ,popGet(AOP(result),0,FALSE,FALSE)); - emitpcode(POC_MOVWF,popCopy(&pc_indf)); + emitpcode(POC_MOVWF,popCopyReg(&pc_indf)); if(strcmp("FSR",l)) - emitcode("movlw","%s",aopGet(AOP(result),0,FALSE,FALSE)); + pic14_emitcode("movlw","%s",aopGet(AOP(result),0,FALSE,FALSE)); - emitcode("movwf","INDF"); + pic14_emitcode("movwf","INDF"); } } /* so dptr know contains the address */ @@ -8266,13 +7360,13 @@ static void genGenPointerSet (operand *right, while (--size) { //char *l = aopGet(AOP(right),offset++,FALSE,FALSE); if(size) - emitcode("incf","fsr,f"); - emitcode("movf","%s,w",aopGet(AOP(right),offset++,FALSE,FALSE)); - emitcode("movwf","indf"); + pic14_emitcode("incf","fsr,f"); + pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset++,FALSE,FALSE)); + pic14_emitcode("movwf","indf"); //MOVA(l); - //DEBUGemitcode(";lcall","__gptrput"); + //DEBUGpic14_emitcode(";lcall","__gptrput"); //if (size) - // emitcode("inc","dptr"); + // pic14_emitcode("inc","dptr"); } } @@ -8288,7 +7382,7 @@ static void genPointerSet (iCode *ic) sym_link *type, *etype; int p_type; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); right = IC_RIGHT(ic); result = IC_RESULT(ic) ; @@ -8353,12 +7447,12 @@ static void genIfx (iCode *ic, iCode *popIc) operand *cond = IC_COND(ic); int isbit =0; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(cond,ic,FALSE); /* get the value into acc */ if (AOP_TYPE(cond) != AOP_CRY) - toBoolean(cond); + pic14_toBoolean(cond); else isbit = 1; /* the result is now in the accumulator */ @@ -8372,14 +7466,14 @@ static void genIfx (iCode *ic, iCode *popIc) if (isbit && IS_ITEMP(cond) && SPIL_LOC(cond)) { genIfxJump(ic,SPIL_LOC(cond)->rname); - DEBUGemitcode ("; isbit SPIL_LOC","%s",SPIL_LOC(cond)->rname); + DEBUGpic14_emitcode ("; isbit SPIL_LOC","%s",SPIL_LOC(cond)->rname); } else { /* if (isbit && !IS_ITEMP(cond)) - DEBUGemitcode ("; isbit OP_SYM","%s",OP_SYMBOL(cond)->rname); + DEBUGpic14_emitcode ("; isbit OP_SYM","%s",OP_SYMBOL(cond)->rname); else - DEBUGemitcode ("; isbit","a"); + DEBUGpic14_emitcode ("; isbit","a"); */ if (isbit && !IS_ITEMP(cond)) @@ -8398,7 +7492,7 @@ static void genAddrOf (iCode *ic) symbol *sym = OP_SYMBOL(IC_LEFT(ic)); int size, offset ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); aopOp(IC_RESULT(ic),ic,FALSE); @@ -8409,8 +7503,8 @@ static void genAddrOf (iCode *ic) /* if it has an offset then we need to compute it */ if (sym->stack) { - emitcode("mov","a,_bp"); - emitcode("add","a,#0x%02x",((char) sym->stack & 0xff)); + pic14_emitcode("mov","a,_bp"); + pic14_emitcode("add","a,#0x%02x",((char) sym->stack & 0xff)); aopPut(AOP(IC_RESULT(ic)),"a",0); } else { /* we can just move _bp */ @@ -8476,7 +7570,7 @@ static void genFarFarAssign (operand *result, operand *right, iCode *ic) while (size--) { l = aopGet(AOP(right),offset++,FALSE,FALSE); MOVA(l); - emitcode ("push","acc"); + pic14_emitcode ("push","acc"); } freeAsmop(right,NULL,ic,FALSE); @@ -8484,7 +7578,7 @@ static void genFarFarAssign (operand *result, operand *right, iCode *ic) aopOp(result,ic,FALSE); size = AOP_SIZE(result); while (size--) { - emitcode ("pop","acc"); + pic14_emitcode ("pop","acc"); aopPut(AOP(result),"a",--offset); } freeAsmop(result,NULL,ic,FALSE); @@ -8504,7 +7598,7 @@ static void genAssign (iCode *ic) result = IC_RESULT(ic); right = IC_RIGHT(ic) ; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); /* if they are the same */ if (operandsEqu (IC_RESULT(ic),IC_RIGHT(ic))) @@ -8514,7 +7608,7 @@ static void genAssign (iCode *ic) aopOp(result,ic,TRUE); /* if they are the same registers */ - if (sameRegs(AOP(right),AOP(result))) + if (pic14_sameRegs(AOP(right),AOP(result))) goto release; /* if the result is a bit */ @@ -8528,11 +7622,11 @@ static void genAssign (iCode *ic) popGet(AOP(result),0,FALSE,FALSE)); if (((int) operandLitValue(right))) - emitcode("bsf","(%s >> 3),(%s & 7)", + pic14_emitcode("bsf","(%s >> 3),(%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); else - emitcode("bcf","(%s >> 3),(%s & 7)", + pic14_emitcode("bcf","(%s >> 3),(%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); goto release; @@ -8544,13 +7638,13 @@ static void genAssign (iCode *ic) emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE)); emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE)); - emitcode("bcf","(%s >> 3),(%s & 7)", + pic14_emitcode("bcf","(%s >> 3),(%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); - emitcode("btfsc","(%s >> 3),(%s & 7)", + pic14_emitcode("btfsc","(%s >> 3),(%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("bsf","(%s >> 3),(%s & 7)", + pic14_emitcode("bsf","(%s >> 3),(%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); goto release ; @@ -8558,7 +7652,7 @@ static void genAssign (iCode *ic) /* we need to or */ emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE)); - toBoolean(right); + pic14_toBoolean(right); emitSKPZ; emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE)); //aopPut(AOP(result),"a",0); @@ -8578,13 +7672,13 @@ static void genAssign (iCode *ic) while (size--) { if((unsigned int)((lit >> (size*8)) & 0x0FFL)== 0) { - //emitcode("clrf","%s", aopGet(AOP(result),size,FALSE,FALSE)); + //pic14_emitcode("clrf","%s", aopGet(AOP(result),size,FALSE,FALSE)); emitpcode(POC_CLRF,popGet(AOP(result),size,FALSE,FALSE)); }else { emitpcode(POC_MOVLW,popGet(AOP(right),size,FALSE,FALSE)); emitpcode(POC_MOVWF,popGet(AOP(result),size,FALSE,FALSE)); - //emitcode("movlw","%s", aopGet(AOP(right),size,FALSE,FALSE)); - //emitcode("movwf","%s", aopGet(AOP(result),size,FALSE,FALSE)); + //pic14_emitcode("movlw","%s", aopGet(AOP(right),size,FALSE,FALSE)); + //pic14_emitcode("movwf","%s", aopGet(AOP(result),size,FALSE,FALSE)); } } } else { @@ -8604,7 +7698,7 @@ static void genAssign (iCode *ic) emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); } - //emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); + //pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE)); offset++; } } @@ -8622,25 +7716,25 @@ static void genJumpTab (iCode *ic) symbol *jtab; char *l; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + 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 */ - emitcode("add","a,acc"); - emitcode("add","a,%s",aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE)); + pic14_emitcode("add","a,acc"); + pic14_emitcode("add","a,%s",aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE)); freeAsmop(IC_JTCOND(ic),NULL,ic,TRUE); jtab = newiTempLabel(NULL); - emitcode("mov","dptr,#%05d_DS_",jtab->key+100); - emitcode("jmp","@a+dptr"); - emitcode("","%05d_DS_:",jtab->key+100); + pic14_emitcode("mov","dptr,#%05d_DS_",jtab->key+100); + pic14_emitcode("jmp","@a+dptr"); + pic14_emitcode("","%05d_DS_:",jtab->key+100); /* now generate the jump labels */ for (jtab = setFirstItem(IC_JTLABELS(ic)) ; jtab; jtab = setNextItem(IC_JTLABELS(ic))) - emitcode("ljmp","%05d_DS_",jtab->key+100); + pic14_emitcode("ljmp","%05d_DS_",jtab->key+100); } @@ -8668,7 +7762,7 @@ static int genMixedOperation (iCode *ic) iCode *nextic; operand *nextright=NULL,*nextleft=NULL,*nextresult=NULL; - emitcode("; ***","%s %d",__FUNCTION__,__LINE__); + pic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); nextic = ic->next; if(!nextic) @@ -8684,21 +7778,21 @@ static int genMixedOperation (iCode *ic) aopOp(nextleft, nextic, FALSE); aopOp(nextresult, nextic, FALSE); - if (sameRegs(AOP(IC_RESULT(ic)), AOP(IC_RIGHT(nextic)))) { + if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_RIGHT(nextic)))) { operand *t = right; right = nextright; nextright = t; - emitcode(";remove right +",""); + pic14_emitcode(";remove right +",""); - } else if (sameRegs(AOP(IC_RESULT(ic)), AOP(IC_LEFT(nextic)))) { + } else if (pic14_sameRegs(AOP(IC_RESULT(ic)), AOP(IC_LEFT(nextic)))) { /* operand *t = right; right = nextleft; nextleft = t; */ - emitcode(";remove left +",""); + pic14_emitcode(";remove left +",""); } else return 0; @@ -8708,19 +7802,19 @@ static int genMixedOperation (iCode *ic) switch(nextic->op) { case '+': - emitcode(";optimize a +",""); + pic14_emitcode(";optimize a +",""); /* if unsigned or not an integral type */ if (AOP_TYPE(IC_LEFT(nextic)) == AOP_CRY) { - emitcode(";add a bit to something",""); + pic14_emitcode(";add a bit to something",""); } else { - emitcode("movf","%s,w",AOP(nextright)->aopu.aop_dir); + pic14_emitcode("movf","%s,w",AOP(nextright)->aopu.aop_dir); - if (!sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ) { - emitcode("addwf","%s,w",AOP(nextleft)->aopu.aop_dir); - emitcode("movwf","%s",aopGet(AOP(IC_RESULT(nextic)),0,FALSE,FALSE)); + 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 - emitcode("addwf","%s,f",AOP(nextleft)->aopu.aop_dir); + pic14_emitcode("addwf","%s,f",AOP(nextleft)->aopu.aop_dir); offset = 0; while(--big) { @@ -8728,32 +7822,32 @@ static int genMixedOperation (iCode *ic) offset++; if(--small) { - if (!sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ - emitcode("movf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + 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) ); } - emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); emitSKPNC; - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(IC_RIGHT(nextic))->aopu.aop_dir, AOP(IC_RIGHT(nextic))->aopu.aop_dir); - emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - emitcode("movwf","%s", aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE)); + 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 { - emitcode("rlf","known_zero,w"); + pic14_emitcode("rlf","known_zero,w"); /* if right is signed btfsc right,7 addlw ff */ - if (!sameRegs(AOP(IC_LEFT(nextic)), AOP(IC_RESULT(nextic))) ){ - emitcode("addwf","%s,w",aopGet(AOP(IC_LEFT(nextic)),offset,FALSE,FALSE)); - emitcode("movwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + 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 { - emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); + pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(nextic)),offset,FALSE,FALSE) ); } } } @@ -8785,7 +7879,7 @@ static void genCast (iCode *ic) operand *right = IC_RIGHT(ic); int size, offset ; - DEBUGemitcode("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__); /* if they are equivalent then do nothing */ if (operandsEqu(IC_RESULT(ic),IC_RIGHT(ic))) return ; @@ -8803,11 +7897,11 @@ static void genCast (iCode *ic) popGet(AOP(result),0,FALSE,FALSE)); if (((int) operandLitValue(right))) - emitcode("bsf","(%s >> 3), (%s & 7)", + pic14_emitcode("bsf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); else - emitcode("bcf","(%s >> 3), (%s & 7)", + pic14_emitcode("bcf","(%s >> 3), (%s & 7)", AOP(result)->aopu.aop_dir, AOP(result)->aopu.aop_dir); @@ -8820,8 +7914,8 @@ static void genCast (iCode *ic) emitCLRC; emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE)); - emitcode("clrc",""); - emitcode("btfsc","(%s >> 3), (%s & 7)", + 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); @@ -8829,7 +7923,7 @@ static void genCast (iCode *ic) } /* we need to or */ - toBoolean(right); + pic14_toBoolean(right); aopPut(AOP(result),"a",0); goto release ; } @@ -8838,7 +7932,7 @@ static void genCast (iCode *ic) if (AOP_SIZE(result) <= AOP_SIZE(right)) { /* if they are in the same place */ - if (sameRegs(AOP(right),AOP(result))) + if (pic14_sameRegs(AOP(right),AOP(result))) goto release; /* if they in different places then copy */ @@ -8942,13 +8036,13 @@ static void genCast (iCode *ic) emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE)); emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE)); - emitcode("clrf","%s ; %d", aopGet(AOP(result),0,FALSE,FALSE),__LINE__); - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("clrf","%s ; %d", aopGet(AOP(result),0,FALSE,FALSE),__LINE__); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("incf","%s,f", aopGet(AOP(result),0,FALSE,FALSE),__LINE__); + pic14_emitcode("incf","%s,f", aopGet(AOP(result),0,FALSE,FALSE),__LINE__); while (size--) { - emitcode("clrf","%s;%d", aopGet(AOP(result),offset,FALSE,FALSE),__LINE__); + pic14_emitcode("clrf","%s;%d", aopGet(AOP(result),offset,FALSE,FALSE),__LINE__); emitpcode(POC_CLRF, popGet(AOP(result),offset++,FALSE,FALSE)); } goto release; @@ -8967,7 +8061,7 @@ static void genCast (iCode *ic) size = AOP_SIZE(right); offset = 0 ; while (size--) { - emitcode(";","%d",__LINE__); + pic14_emitcode(";","%d",__LINE__); aopPut(AOP(result), aopGet(AOP(right),offset,FALSE,FALSE), offset); @@ -8979,8 +8073,9 @@ static void genCast (iCode *ic) /* if unsigned or not an integral type */ if (SPEC_USIGN(ctype) || !IS_SPEC(ctype)) { while (size--) { - emitpcode(POC_CLRF, popGet(AOP(result),offset++,FALSE,FALSE)); - emitcode("clrf","%s ;%d",aopGet(AOP(result),offset++,FALSE,FALSE),__LINE__); + emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("clrf","%s ;%d",aopGet(AOP(result),offset,FALSE,FALSE),__LINE__); + offset++; } } else { /* we need to extend the sign :{ */ @@ -8991,14 +8086,15 @@ static void genCast (iCode *ic) emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE)); emitpcode(POC_MOVLW, popGetLit(0xff)); - emitcode("clrw",""); - emitcode("btfsc","(%s >> 3), (%s & 7)", + pic14_emitcode("clrw",""); + pic14_emitcode("btfsc","(%s >> 3), (%s & 7)", AOP(right)->aopu.aop_dir, AOP(right)->aopu.aop_dir); - emitcode("movlw","0xff"); + pic14_emitcode("movlw","0xff"); while (size--) { - emitpcode(POC_MOVWF, popGet(AOP(result),offset++,FALSE,FALSE)); - emitcode("movwf","%s",aopGet(AOP(result),offset++,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE)); + offset++; // aopPut(AOP(result),"a",offset++); } @@ -9018,7 +8114,7 @@ release: static int genDjnz (iCode *ic, iCode *ifx) { symbol *lbl, *lbl1; - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (!ifx) return 0; @@ -9049,24 +8145,24 @@ static int genDjnz (iCode *ic, iCode *ifx) aopOp(IC_RESULT(ic),ic,FALSE); if (IS_AOP_PREG(IC_RESULT(ic))) { - emitcode("dec","%s", + pic14_emitcode("dec","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitcode("mov","a,%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitcode("jnz","%05d_DS_",lbl->key+100); + 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,FALSE,FALSE)); emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key)); - emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + labelOffset); + pic14_emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + pic14_emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + labelOffset); } -/* emitcode ("sjmp","%05d_DS_",lbl1->key+100); */ -/* emitcode ("","%05d_DS_:",lbl->key+100); */ -/* emitcode ("ljmp","%05d_DS_",IC_TRUE(ifx)->key+100); */ -/* emitcode ("","%05d_DS_:",lbl1->key+100); */ +/* 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); @@ -9079,7 +8175,7 @@ static int genDjnz (iCode *ic, iCode *ifx) /*-----------------------------------------------------------------*/ static void genReceive (iCode *ic) { - DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); if (isOperandInFarSpace(IC_RESULT(ic)) && ( OP_SYMBOL(IC_RESULT(ic))->isspilt || @@ -9088,7 +8184,7 @@ static void genReceive (iCode *ic) int size = getSize(operandType(IC_RESULT(ic))); int offset = fReturnSizePic - size; while (size--) { - emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ? + pic14_emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ? fReturn[fReturnSizePic - offset - 1] : "acc")); offset++; } @@ -9096,7 +8192,7 @@ static void genReceive (iCode *ic) size = AOP_SIZE(IC_RESULT(ic)); offset = 0; while (size--) { - emitcode ("pop","acc"); + pic14_emitcode ("pop","acc"); aopPut (AOP(IC_RESULT(ic)),"a",offset++); } @@ -9138,10 +8234,10 @@ void genpic14Code (iCode *lic) cdbSymbol(currFunc,cdbFile,FALSE,TRUE); _G.debugLine = 1; if (IS_STATIC(currFunc->etype)) { - emitcode("",";F%s$%s$0$0 %d",moduleName,currFunc->name,__LINE__); + pic14_emitcode("",";F%s$%s$0$0 %d",moduleName,currFunc->name,__LINE__); //addpCode2pBlock(pb,newpCodeLabel(moduleName,currFunc->name)); } else { - emitcode("",";G$%s$0$0 %d",currFunc->name,__LINE__); + pic14_emitcode("",";G$%s$0$0 %d",currFunc->name,__LINE__); //addpCode2pBlock(pb,newpCodeLabel(NULL,currFunc->name)); } _G.debugLine = 0; @@ -9150,16 +8246,16 @@ void genpic14Code (iCode *lic) for (ic = lic ; ic ; ic = ic->next ) { - DEBUGemitcode(";ic",""); + DEBUGpic14_emitcode(";ic",""); if ( cln != ic->lineno ) { if ( options.debug ) { _G.debugLine = 1; - emitcode("",";C$%s$%d$%d$%d ==.", + pic14_emitcode("",";C$%s$%d$%d$%d ==.", FileBaseName(ic->filename),ic->lineno, ic->level,ic->block); _G.debugLine = 0; } - emitcode(";","%s %d",FileBaseName(ic->filename),ic->lineno); + pic14_emitcode(";","%s %d",FileBaseName(ic->filename),ic->lineno); cln = ic->lineno ; } /* if the result is marked as diff --git a/src/pic/gen.h b/src/pic/gen.h index 686a818b..3bb90fbe 100644 --- a/src/pic/gen.h +++ b/src/pic/gen.h @@ -81,4 +81,92 @@ void genpic14Code (iCode *); extern unsigned fReturnSizePic; //extern char **fReturn; + +#define AOP(op) op->aop +#define AOP_TYPE(op) AOP(op)->type +#define AOP_SIZE(op) AOP(op)->size +#define IS_AOP_PREG(x) (AOP(x) && (AOP_TYPE(x) == AOP_R1 || \ + AOP_TYPE(x) == AOP_R0)) + +#define AOP_NEEDSACC(x) (AOP(x) && (AOP_TYPE(x) == AOP_CRY || \ + AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_DPTR2 || \ + AOP(x)->paged)) + +#define AOP_INPREG(x) (x && (x->type == AOP_REG && \ + (x->aopu.aop_reg[0] == pic14_regWithIdx(R0_IDX) || \ + x->aopu.aop_reg[0] == pic14_regWithIdx(R1_IDX) ))) + +#define RESULTONSTACK(x) \ + (IC_RESULT(x) && IC_RESULT(x)->aop && \ + IC_RESULT(x)->aop->type == AOP_STK ) + +#define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) pic14_emitcode(";XXX mov","a,%s %s,%d",x,__FILE__,__LINE__); +#define CLRC pic14_emitcode(";XXX clr","c %s,%d",__FILE__,__LINE__); + +#define BIT_NUMBER(x) (x & 7) +#define BIT_REGISTER(x) (x>>3) + + +#define LSB 0 +#define MSB16 1 +#define MSB24 2 +#define MSB32 3 + + +#define FUNCTION_LABEL_INC 20 + +/*-----------------------------------------------------------------*/ +/* Macros for emitting skip instructions */ +/*-----------------------------------------------------------------*/ + +#define emitSKPC emitpcode(POC_BTFSS,popCopyGPR2Bit(&pc_status,PIC_C_BIT)) +#define emitSKPNC emitpcode(POC_BTFSC,popCopyGPR2Bit(&pc_status,PIC_C_BIT)) +#define emitSKPZ emitpcode(POC_BTFSS,popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) +#define emitSKPNZ emitpcode(POC_BTFSC,popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) +#define emitSKPDC emitpcode(POC_BTFSS,popCopyGPR2Bit(&pc_status,PIC_DC_BIT)) +#define emitSKPNDC emitpcode(POC_BTFSC,popCopyGPR2Bit(&pc_status,PIC_DC_BIT)) +#define emitCLRZ emitpcode(POC_BCF, popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) +#define emitCLRC emitpcode(POC_BCF, popCopyGPR2Bit(&pc_status,PIC_C_BIT)) +#define emitCLRDC emitpcode(POC_BCF, popCopyGPR2Bit(&pc_status,PIC_DC_BIT)) +#define emitSETZ emitpcode(POC_BSF, popCopyGPR2Bit(&pc_status,PIC_Z_BIT)) +#define emitSETC emitpcode(POC_BSF, popCopyGPR2Bit(&pc_status,PIC_C_BIT)) +#define emitSETDC emitpcode(POC_BSF, popCopyGPR2Bit(&pc_status,PIC_DC_BIT)) + +int pic14_getDataSize(operand *op); +void emitpcode(PIC_OPCODE poc, pCodeOp *pcop); +void pic14_emitcode (char *inst,char *fmt, ...); +void DEBUGpic14_emitcode (char *inst,char *fmt, ...); +asmop *newAsmop (short type); +bool pic14_sameRegs (asmop *aop1, asmop *aop2 ); +char *aopGet (asmop *aop, int offset, bool bit16, bool dname); + + +bool genPlusIncr (iCode *ic); +void pic14_outBitAcc(operand *result); +void genPlusBits (iCode *ic); +void genPlus (iCode *ic); +bool genMinusDec (iCode *ic); +void addSign(operand *result, int offset, int sign); +void genMinusBits (iCode *ic); +void genMinus (iCode *ic); + + +pCodeOp *popGetLabel(unsigned int key); +pCodeOp *popCopyReg(pCodeOpReg *pc); +pCodeOp *popCopyGPR2Bit(pCodeOpReg *pc, int bitval); +pCodeOp *popGetLit(unsigned int lit); +pCodeOp *popGetWithString(char *str); +pCodeOp *popRegFromString(char *str); +pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname); + + +void aopPut (asmop *aop, char *s, int offset); +void pic14_outAcc(operand *result); +void aopOp (operand *op, iCode *ic, bool result); +void pic14_outBitC(operand *result); +void pic14_toBoolean(operand *oper); +void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop); + + + #endif diff --git a/src/pic/genarith.c b/src/pic/genarith.c new file mode 100644 index 00000000..8aadcda2 --- /dev/null +++ b/src/pic/genarith.c @@ -0,0 +1,977 @@ +/*------------------------------------------------------------------------- + genarith.c - source file for code generation - arithmetic + + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) + and - Jean-Louis VERN.jlvern@writeme.com (1999) + Bug Fixes - Wojciech Stryjewski wstryj1@tiger.lsu.edu (1999 v2.1.9a) + PIC port - 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 + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! + + Notes: + 000123 mlh Moved aopLiteral to SDCCglue.c to help the split + Made everything static +-------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include "SDCCglobl.h" +#include "newalloc.h" + +#if defined(_MSC_VER) +#define __FUNCTION__ __FILE__ +#endif + +#ifdef HAVE_SYS_ISA_DEFS_H +#include +#else +#ifdef HAVE_ENDIAN_H +#include +#else +#if !defined(__BORLANDC__) && !defined(_MSC_VER) +#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN" +#warning "If you running sdcc on an INTEL 80x86 Platform you are okay" +#endif +#endif +#endif + +#include "common.h" +#include "SDCCpeeph.h" +#include "ralloc.h" +#include "pcode.h" +#include "gen.h" + + + + + + + + + + + + + + + + +/*-----------------------------------------------------------------*/ +/* genPlusIncr :- does addition with increment if possible */ +/*-----------------------------------------------------------------*/ +bool genPlusIncr (iCode *ic) +{ + unsigned int icount ; + unsigned int size = pic14_getDataSize(IC_RESULT(ic)); + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + DEBUGpic14_emitcode ("; ","result %d, left %d, right %d", + AOP_TYPE(IC_RESULT(ic)), + AOP_TYPE(IC_LEFT(ic)), + 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 = 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,FALSE,FALSE)); + //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++,FALSE,FALSE)); + //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,FALSE,FALSE)); + 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,FALSE,FALSE)); + 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,FALSE,FALSE)); + //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + return TRUE ; + } + + DEBUGpic14_emitcode ("; ","couldn't increment result-%s left-%s", + aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE), + aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + return FALSE ; +} + +/*-----------------------------------------------------------------*/ +/* pic14_outBitAcc - output a bit in acc */ +/*-----------------------------------------------------------------*/ +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); + } +} + +/*-----------------------------------------------------------------*/ +/* genPlusBits - generates code for addition of two bits */ +/*-----------------------------------------------------------------*/ +void genPlusBits (iCode *ic) +{ + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + /* + 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 ) { + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { + //emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF), + // popGet(AOP(result),0,FALSE,FALSE)); + + emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + 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); + } else { + + emitpcode(POC_CLRW, NULL); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_XORLW, popGetLit(1)); + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + 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"); + } + +} + +#if 0 +/* This is the original version of this code. + * + * This is being kept around for reference, + * because I am not entirely sure I got it right... + */ +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); + } +} +//#else +/* This is the pure and virtuous version of this code. + * I'm pretty certain it's right, but not enough to toss the old + * code just yet... + */ +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); + } +} +#endif + +/*-----------------------------------------------------------------*/ +/* genPlus - generates code for addition */ +/*-----------------------------------------------------------------*/ +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); + + /* 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,FALSE,FALSE)); + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + } 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 = floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit); + unsigned l1=0; + + offset = 0; + DEBUGpic14_emitcode(";","adding lit to something. size %d",size); + while(size--){ + + DEBUGpic14_emitcode(";","size %d",size); + + switch (lit & 0xff) { + case 0: + break; + case 1: + if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) + emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + else { + know_W = 0; + emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + } + break; + case 0xff: + if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) + emitpcode(POC_DECF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + else { + know_W = 0; + emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + } + break; + default: + if( !know_W || ( (lit&0xff) != l1) ) { + know_W = 1; + emitpcode(POC_MOVLW,popGetLit(lit&0xff)); + } + if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + else { + know_W = 0; + emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + if(size) { + emitSKPNC; + emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset+1,FALSE,FALSE)); + } + } + } + + l1 = lit & 0xff; + lit >>= 8; + offset++; + } + + } 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,FALSE,FALSE)); + emitpcode(POC_INCF , popGet(AOP(IC_RESULT(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,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,FALSE,FALSE)); + 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,FALSE,FALSE)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + + 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,FALSE,FALSE)); + emitSKPZ; + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + } + } + + } else { + int offset = 1; + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitCLRZ; + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + 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,FALSE,FALSE)); + emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + + + 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++,FALSE,FALSE)); + //pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE)); + } + + } + + } else { + + if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) { + emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + else { + if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || + (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) { + emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + } else { + emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + } + } + } + + offset = 1; + size--; + + while(size--){ + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + } + + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + emitSKPNC; + emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + + /* + pic14_emitcode("movf","%s,w", aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + emitSKPNC; + pic14_emitcode("incfsz","%s,w",aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + pic14_emitcode("addwf","%s,f", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + */ + + 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); +} + +/*-----------------------------------------------------------------*/ +/* genMinusDec :- does subtraction with decrement if possible */ +/*-----------------------------------------------------------------*/ +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,FALSE,FALSE)); + emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE)); + emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); + + 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,FALSE,FALSE)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_RESULT(ic)),MSB24,FALSE,FALSE)); + + 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,FALSE,FALSE)); + + 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,FALSE,FALSE)); + + //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,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + return TRUE; + } + + return FALSE ; +} + +/*-----------------------------------------------------------------*/ +/* addSign - complete with sign */ +/*-----------------------------------------------------------------*/ +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){ + pic14_emitcode("rlc","a"); + pic14_emitcode("subb","a,acc"); + while(size--) + aopPut(AOP(result),"a",offset++); + } else + while(size--) + aopPut(AOP(result),"#0",offset++); + } +} + +/*-----------------------------------------------------------------*/ +/* genMinusBits - generates code for subtraction of two bits */ +/*-----------------------------------------------------------------*/ +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))))); + } +} + +/*-----------------------------------------------------------------*/ +/* genMinus - generates code for subtraction */ +/*-----------------------------------------------------------------*/ +void genMinus (iCode *ic) +{ + int size, offset = 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; + } + + /* 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)); + + 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; + + /* 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,FALSE,FALSE)); + + + 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,FALSE,FALSE)); + } else { + emitpcode(POC_MOVLW, popGetLit(lit & 0xff)); + emitSKPNC; + emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff)); + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + } + + } else { + /* do the rlf known zero trick here */ + emitpcode(POC_MOVLW, popGetLit(1)); + emitSKPNC; + emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE)); + } + offset++; + } + + } 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,FALSE,FALSE)); + emitpcode(POC_DECF , popGet(AOP(IC_RESULT(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,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,FALSE,FALSE)); + 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,FALSE,FALSE)); + emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + } + }else{ + emitpcode(POC_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + if(lit & 1) + emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + else + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + goto release; + } else { + emitpcode(POC_MOVLW , popGetLit(lit & 0xff)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVLW , popGetLit((lit-1) & 0xff)); + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + } + + } else { + emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + } + + if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) { + + emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + + } 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(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,FALSE,FALSE)); + emitpcode(POC_SUBLW, popGetLit(0)); + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) { + emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + emitpcode(POC_SUBLW, popGetLit(0)); + if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + + DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); + if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC) + emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) + emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + 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,FALSE,FALSE)); + } else { + emitpcode(POC_SUBFW, popGet(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_BCF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + emitSKPZ; + emitpcode(POC_BSF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + }else + emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + } + } + } + + /* + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE)); + + if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(POC_SUBFW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } else { + emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + */ + offset = 1; + size--; + + while(size--){ + if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { + emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); + } + emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + emitSKPNC; + emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE)); + emitpcode(POC_SUBWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE)); + + 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); +} + + diff --git a/src/pic/main.c b/src/pic/main.c index 7a6f7687..f355cd44 100644 --- a/src/pic/main.c +++ b/src/pic/main.c @@ -7,7 +7,8 @@ #include "common.h" #include "main.h" #include "ralloc.h" -#include "gen.h" +//#include "gen.h" + static char _defaultRules[] = { @@ -42,6 +43,7 @@ static char *_pic14_keywords[] = NULL }; +void pCodeInitRegisters(void); void pic14_assignRegisters (eBBlock ** ebbs, int count); @@ -51,6 +53,7 @@ static void _pic14_init (void) { asm_addTree (&asm_asxxxx_mapping); + pCodeInitRegisters(); } static void diff --git a/src/pic/pcode.c b/src/pic/pcode.c index 545909eb..94e6fe03 100644 --- a/src/pic/pcode.c +++ b/src/pic/pcode.c @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- - pcode.h - post code generation + pcode.c - post code generation Written By - Scott Dattalo scott@dattalo.com This program is free software; you can redistribute it and/or modify it @@ -22,14 +22,14 @@ #include "common.h" // Include everything in the SDCC src directory #include "newalloc.h" -#include "ralloc.h" -#include "pcode.h" +#include "pcode.h" +#include "ralloc.h" // Eventually this will go into device dependent files: -pCodeOp pc_status = {PO_STATUS, "STATUS"}; -pCodeOp pc_indf = {PO_INDF, "INDF"}; -pCodeOp pc_fsr = {PO_FSR, "FSR"}; +pCodeOpReg pc_status = {{PO_STATUS, "STATUS"}, -1, NULL,NULL}; +pCodeOpReg pc_indf = {{PO_INDF, "INDF"}, -1, NULL,NULL}; +pCodeOpReg pc_fsr = {{PO_FSR, "FSR"}, -1, NULL,NULL}; //static char *PIC_mnemonics[] = { static char *scpADDLW = "ADDLW"; @@ -65,27 +65,9 @@ static char *scpXORWF = "XORWF"; static pFile *the_pFile = NULL; -static int peepOptimizing = 0; +static int peepOptimizing = 1; static int GpCodeSequenceNumber = 1; -/****************************************************************/ -/****************************************************************/ -typedef struct _DLL { - struct _DLL *prev; - struct _DLL *next; - // void *data; -} _DLL; - - -typedef struct pCodePeepSnippets -{ - _DLL dll; - pCodePeep *peep; -} pCodePeepSnippets; - - -static pCodePeepSnippets *peepSnippets=NULL; - /****************************************************************/ /* Forward declarations */ /****************************************************************/ @@ -124,6 +106,14 @@ char *Safe_strdup(char *str) } +void pCodeInitRegisters(void) +{ + + pc_fsr.rIdx = 4; + pc_fsr.r = pic14_regWithIdx(4); + +} + char getpBlock_dbName(pBlock *pb) { if(!pb) @@ -225,6 +215,26 @@ void pcode_test(void) } } } +static int RegCond(pCodeOp *pcop) +{ + + if(!pcop) + return 0; + + if(pcop->type == PO_BIT && !strcmp(pcop->name, pc_status.pcop.name)) { + switch(PCOB(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; +} /*-----------------------------------------------------------------*/ /* newpCode - create and return a newly initialized pCode */ @@ -319,20 +329,24 @@ pCode *newpCode (PIC_OPCODE op, pCodeOp *pcop) case POC_BCF: pci->bit_inst = 1; pci->mnemonic = scpBCF; + pci->outCond = RegCond(pcop); break; case POC_BSF: pci->bit_inst = 1; pci->mnemonic = scpBSF; + pci->outCond = RegCond(pcop); break; case POC_BTFSC: pci->bit_inst = 1; pci->mnemonic = scpBTFSC; pci->pc.analyze = AnalyzeSKIP; + pci->inCond = RegCond(pcop); break; case POC_BTFSS: pci->bit_inst = 1; pci->mnemonic = scpBTFSS; pci->pc.analyze = AnalyzeSKIP; + pci->inCond = RegCond(pcop); break; case POC_CALL: pci->num_ops = 1; @@ -746,15 +760,6 @@ void addpBlock(pBlock *pb) the_pFile->pbTail = pb; } -void printpCodeString(FILE *of, pCode *pc, int max) -{ - int i=0; - - while(pc && (i++print(of,pc); - pc = pc->next; - } -} /*-----------------------------------------------------------------*/ /* printpCode - write the contents of a pCode to a file */ /*-----------------------------------------------------------------*/ @@ -830,25 +835,27 @@ void pBlockRegs(FILE *of, pBlock *pb) static char *get_op( pCodeInstruction *pcc) { + regs *r; + if(pcc && pcc->pcop) { + switch(pcc->pcop->type) { - if(pcc->pcop->type == PO_GPR_TEMP) { - regs *r; - r = pic14_regWithIdx(PCOR(pcc->pcop)->r->rIdx); - //pcc->pcop->name = Safe_strdup(r->name); - //sprintf(buffer, "R0X%x",PCOR(pcc->pcop)->rIdx); - //pcc->pcop->name = Safe_strdup(PCOR(pcc->pcop)->r->name); - fprintf(stderr,"getop: getting %s\nfrom:\n",r->name); //pcc->pcop->name); - pBlockRegs(stderr,pcc->pc.pb); - return r->name; - } + case PO_FSR: + case PO_GPR_TEMP: + r = pic14_regWithIdx(PCOR(pcc->pcop)->r->rIdx); + fprintf(stderr,"getop: getting %s\nfrom:\n",r->name); //pcc->pcop->name); + pBlockRegs(stderr,pcc->pc.pb); + return r->name; - if (pcc->pcop->name) - return pcc->pcop->name; + default: + if (pcc->pcop->name) + return pcc->pcop->name; + } } + return "NO operand"; } @@ -1012,43 +1019,6 @@ static void pCodePrintLabel(FILE *of, pCode *pc) fprintf(of,";wild card label\n"); } - -/*-----------------------------------------------------------------*/ -/* _DLL * DLL_append */ -/* */ -/* Append a _DLL object to the end of a _DLL (doubly linked list) */ -/* If The list to which we want to append is non-existant then one */ -/* is created. Other wise, the end of the list is sought out and */ -/* a new DLL object is appended to it. In either case, the void */ -/* *data is added to the newly created DLL object. */ -/*-----------------------------------------------------------------*/ - -static void * DLL_append(_DLL *list, _DLL *next) -{ - _DLL *b; - - - /* If there's no list, then create one: */ - if(!list) { - next->next = next->prev = NULL; - return next; - } - - - /* Search for the end of the list. */ - b = list; - while(b->next) - b = b->next; - - /* Now append the new DLL object */ - b->next = next; - b->next->prev = b; - b = b->next; - b->next = NULL; - - return list; - -} /*-----------------------------------------------------------------*/ static pBranch * pBranchAppend(pBranch *h, pBranch *n) @@ -1907,577 +1877,3 @@ void printCallTree(FILE *of) fprintf(of,"block dbname: %c\n", getpBlock_dbName(pb)); } } -/*----------------------------------------------------------------- - - pCode peephole optimization - - - The pCode "peep hole" optimization is not too unlike the peep hole - optimization in SDCCpeeph.c. The major difference is that here we - use pCode's whereas there we use ASCII strings. The advantage with - pCode's is that we can ascertain flow information in the instructions - being optimized. - - - - elaborate... - - -----------------------------------------------------------------*/ - -#if 0 -/*-----------------------------------------------------------------*/ -/* pCodePeep */ -/*-----------------------------------------------------------------*/ -int pCodePeepCompare(pCode *pc, pCodePeep *pcp) -{ - pCode *pcfrom,*pcto; - - pcfrom = pc; - for( pcto=pcp->target; pcto; pcto=pcto->next) { - - pcfrom = findNextInstruction(pcfrom); - - if( pcfrom && - (PCI(pcfrom)->op == PCI(pcto)->op || - PCI(pcto)->op == POC_WILD)) - continue; - return 0; - } - return 0; -} - -/*-----------------------------------------------------------------*/ -/* pCodePeep */ -/*-----------------------------------------------------------------*/ -void pCodePeepSearch(pCodePeep *snippet) -{ - pBlock *pb; - pCode *pc; - - if(!the_pFile) - return; - - /* compare the chain to the pCode that we've - got so far. If a match is found, then replace - the pCode chain. - */ - for(pb = the_pFile->pbHead; pb; pb = pb->next) { - for(pc = pb->pcHead; pc; pc = pc->next) { - pCodePeepCompare(pc,snippet); - } - } - -} -#endif - -#if 0 -pBlock *pBlockAppend(pBlock *pb1, pBlock *pb2) -{ - pBlock *pb; - - if(!pb1->tail) - return pb2; - - pb = pb1->tail; - - pb2->head = pb1; - pb2->tail = NULL; - pb1->tail = pb2; - -} - -#endif - -void pCodePeepInit(void) -{ - pBlock *pb; - // pCode *pc; - pCodePeep *pcp; - pCodePeepSnippets *pcps; - - /* Declare a peep code snippet */ - /* do I really need a separate struct just to DLL the snippets? */ - /* e.g. I could put the DLL into the pCodePeep structure */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - - pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - addpCode2pBlock( pb, newpCode(POC_MOVFW, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - - pcp->target = pb; - - pcp->replace = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 1; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 0; - pcp->wildpCodes = NULL; - - pcp->postFalseCond = PCC_Z; - pcp->postTrueCond = PCC_NONE; - - fprintf(stderr,"Peep rule\nTarget:\n"); - printpCodeString(stderr,pcp->target->pcHead, 10); - fprintf(stderr,"Replaced with:\n"); - printpCodeString(stderr,pcp->replace->pcHead, 10); - - /* Now for another peep example */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - { - pCodeOp *pcl; - pCodeOp *pcw; - pCodeOp *pcwb; - - pcwb = newpCodeOpWild(0,pcp,newpCodeOpBit(NULL,-1)); - pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSC,pcwb)); - - pcl = newpCodeOpLabel(-1); - pcw = newpCodeOpWild(1, pcp, pcl); - addpCode2pBlock( pb, newpCode(POC_GOTO, pcw)); - addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); - addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); - - - pcp->target = pb; - - pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSS, pcwb)); - addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); - addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); - - pcp->replace = pb; - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 2; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 2; - pcp->wildpCodes = Safe_calloc(pcp->nwildpCodes, sizeof(pCode *)); - - pcp->postFalseCond = PCC_NONE; - pcp->postTrueCond = PCC_NONE; - } - - - - - - - - - - - //------------- - - /* Now for another peep example */ - pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); - pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); - peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); - - { - pCodeOp *pcw; - - pcw = newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER)); - - pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, pcw)); - addpCode2pBlock( pb, newpCode(POC_MOVWF, pcw)); - - pcp->target = pb; - - pb = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, pcw)); - - pcp->replace = pb; - - /* Allocate space to store pointers to the wildcard variables */ - pcp->nvars = 1; - pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); - pcp->nwildpCodes = 0; - pcp->wildpCodes = NULL; - - pcp->postFalseCond = PCC_NONE; - pcp->postTrueCond = PCC_NONE; - } - - - - -} - -/*-----------------------------------------------------------------*/ -/* pCodeSearchCondition - Search a pCode chain for a 'condition' */ -/* */ -/* return conditions */ -/* 1 - The Condition was found for a pCode's input */ -/* 0 - No matching condition was found for the whole chain */ -/* -1 - The Condition was found for a pCode's output */ -/* */ -/*-----------------------------------------------------------------*/ -int pCodeSearchCondition(pCode *pc, unsigned int cond) -{ - - while(pc) { - - /* If we reach a function end (presumably an end since we most - probably began the search in the middle of a function), then - the condition was not found. */ - if(pc->type == PC_FUNCTION) - return 0; - - if(pc->type == PC_OPCODE) { - if(PCI(pc)->inCond & cond) - return 1; - if(PCI(pc)->outCond & cond) - return -1; - } - - pc = pc->next; - } - - return 0; -} -/*-----------------------------------------------------------------*/ -/* pCodePeepMatchLine - Compare source and destination pCodes to */ -/* see they're the same. */ -/*-----------------------------------------------------------------*/ -int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) -{ - int index; // index into wild card arrays - - if(pcs->type == pcd->type) { - - if(pcs->type == PC_OPCODE) { - - /* If the opcodes don't match then the line doesn't match */ - if(PCI(pcs)->op != PCI(pcd)->op) - return 0; - - fprintf(stderr,"%s comparing\n",__FUNCTION__); - pcs->print(stderr,pcs); - pcd->print(stderr,pcd); - - /* Compare the operands */ - if(PCI(pcd)->pcop) { - if (PCI(pcd)->pcop->type == PO_WILD) { - index = PCOW(PCI(pcd)->pcop)->id; - - fprintf(stderr,"destination is wild\n"); -#ifdef DEBUG_PCODEPEEP - if (index > peepBlock->nvars) { - fprintf(stderr,"%s - variables exceeded\n",__FUNCTION__); - exit(1); - } -#endif - PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop; - { - char *n; - - if(PCI(pcs)->pcop->type == PO_GPR_TEMP) - n = PCOR(PCI(pcs)->pcop)->r->name; - else - n = PCI(pcs)->pcop->name; - - if(peepBlock->vars[index]) - return (strcmp(peepBlock->vars[index],n) == 0); - else { - peepBlock->vars[index] = n; //PCI(pcs)->pcop->name; - return 1; - } - } - } - } else - /* The pcd has no operand. Lines match if pcs has no operand either*/ - return (PCI(pcs)->pcop == NULL); - } - } - - - if((pcd->type == PC_WILD) && (pcs->type == PC_OPCODE)) { - - int labindex; - - index = PCW(pcd)->id; - - fprintf(stderr,"%s comparing wild cards\n",__FUNCTION__); - pcs->print(stderr,pcs); - pcd->print(stderr,pcd); - - peepBlock->wildpCodes[PCW(pcd)->id] = pcs; - - /* Check for a label associated with this wild pCode */ - // If the wild card has a label, make sure the source code does too. - if(PCW(pcd)->label) { - if(!pcs->label) - return 0; - - labindex = PCOW(PCW(pcd)->label)->id; - if(peepBlock->vars[labindex] == NULL) { - // First time to encounter this label - peepBlock->vars[labindex] = PCL(pcs->label->pc)->label; - fprintf(stderr,"first time for a label\n"); - } else { - if(strcmp(peepBlock->vars[labindex],PCL(pcs->label->pc)->label) != 0) { - fprintf(stderr,"labels don't match\n"); - return 0; - } - fprintf(stderr,"matched a label\n"); - } - - } - - if(PCW(pcd)->operand) { - PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop; - if(peepBlock->vars[index]) { - int i = (strcmp(peepBlock->vars[index],PCI(pcs)->pcop->name) == 0); - if(i) - fprintf(stderr," (matched)\n"); - else { - fprintf(stderr," (no match: wild card operand mismatch\n"); - fprintf(stderr," peepblock= %s, pcodeop= %s\n", - peepBlock->vars[index], - PCI(pcs)->pcop->name); - } - return i; - } else { - peepBlock->vars[index] = PCI(pcs)->pcop->name; - return 1; - } - } - - pcs = findNextInstruction(pcs->next); - if(pcs) { - fprintf(stderr," (next to match)\n"); - pcs->print(stderr,pcs); - } - - return 1; /* wild card matches */ - } - - return 0; -} - -/*-----------------------------------------------------------------*/ -/*-----------------------------------------------------------------*/ -void pCodePeepClrVars(pCodePeep *pcp) -{ - - int i; - - for(i=0;invars; i++) - pcp->vars[i] = NULL; - -} - -/*-----------------------------------------------------------------*/ -/*-----------------------------------------------------------------*/ -void pCodeInsertAfter(pCode *pc1, pCode *pc2) -{ - - if(!pc1 || !pc2) - return; - - pc2->next = pc1->next; - if(pc1->next) - pc1->next->prev = pc2; - - pc2->prev = pc1; - pc1->next = pc2; - -} - -/*-----------------------------------------------------------------*/ -/* pCodeOpCopy - copy a pcode operator */ -/*-----------------------------------------------------------------*/ -static pCodeOp *pCodeOpCopy(pCodeOp *pcop) -{ - pCodeOp *pcopnew=NULL; - - if(!pcop) - return NULL; - - switch(pcop->type) { - case PO_CRY: - case PO_BIT: - pcopnew = Safe_calloc(1,sizeof(pCodeOpBit) ); - PCOB(pcopnew)->bit = PCOB(pcop)->bit; - PCOB(pcopnew)->inBitSpace = PCOB(pcop)->inBitSpace; - - break; - - case PO_WILD: - /* Here we expand the wild card into the appropriate type: */ - /* By recursively calling pCodeOpCopy */ - if(PCOW(pcop)->matched) - pcopnew = pCodeOpCopy(PCOW(pcop)->matched); - else { - // Probably a label - pcopnew = pCodeOpCopy(PCOW(pcop)->subtype); - pcopnew->name = Safe_strdup(PCOW(pcop)->pcp->vars[PCOW(pcop)->id]); - fprintf(stderr,"copied a wild op named %s\n",pcopnew->name); - } - - return pcopnew; - break; - - case PO_LABEL: - pcopnew = Safe_calloc(1,sizeof(pCodeOpLabel) ); - PCOLAB(pcopnew)->key = PCOLAB(pcop)->key; - break; - - case PO_LITERAL: - case PO_IMMEDIATE: - pcopnew = Safe_calloc(1,sizeof(pCodeOpLit) ); - PCOL(pcopnew)->lit = PCOL(pcop)->lit; - break; - - case PO_GPR_REGISTER: - case PO_GPR_TEMP: - case PO_SFR_REGISTER: - case PO_DIR: - case PO_STR: - case PO_NONE: - case PO_W: - case PO_STATUS: - case PO_FSR: - case PO_INDF: - - pcopnew = Safe_calloc(1,sizeof(pCodeOp) ); - - } - - pcopnew->type = pcop->type; - pcopnew->name = Safe_strdup(pcop->name); - - return pcopnew; -} - -#if 0 -/*-----------------------------------------------------------------*/ -/* pCodeCopy - copy a pcode */ -/*-----------------------------------------------------------------*/ -static pCode *pCodeCopy(pCode *pc) -{ - - pCode *pcnew; - - pcnew = newpCode(pc->type,pc->pcop); -} -#endif -/*-----------------------------------------------------------------*/ -/*-----------------------------------------------------------------*/ -void pCodeDeleteChain(pCode *f,pCode *t) -{ - pCode *pc; - - while(f && f!=t) { - fprintf(stderr,"delete pCode:\n"); - pc = f->next; - f->print(stderr,f); - //f->delete(f); - f = pc; - } - -} -/*-----------------------------------------------------------------*/ -/*-----------------------------------------------------------------*/ -int pCodePeepMatchRule(pCode *pc) -{ - pCodePeep *peepBlock; - pCode *pct, *pcin; - _DLL *peeprules; - int matched; - - peeprules = (_DLL *)peepSnippets; - - while(peeprules) { - peepBlock = ((pCodePeepSnippets*)peeprules)->peep; - pCodePeepClrVars(peepBlock); - - pcin = pc; - pct = peepBlock->target->pcHead; - matched = 0; - while(pct && pcin) { - - if(! (matched = pCodePeepMatchLine(peepBlock, pcin,pct))) - break; - - pcin = findNextInstruction(pcin->next); - pct = pct->next; - //debug: - fprintf(stderr," matched\n"); - if(!pcin) - fprintf(stderr," end of code\n"); - if(!pct) - fprintf(stderr," end of rule\n"); - } - - if(matched && pcin) { - - /* So far we matched the rule up to the point of the conditions . - * In other words, all of the opcodes match. Now we need to see - * if the post conditions are satisfied. - * First we check the 'postFalseCond'. This means that we check - * to see if any of the subsequent pCode's in the pCode chain - * following the point just past where we have matched depend on - * the `postFalseCond' as input then we abort the match - */ - fprintf(stderr," matched rule so far, now checking conditions\n"); - if (peepBlock->postFalseCond && - (pCodeSearchCondition(pcin,peepBlock->postFalseCond) > 0) ) - matched = 0; - } - - if(matched && pcin) { - - pCode *pcprev; - pCode *pcr; - - - /* We matched a rule! Now we have to go through and remove the - inefficient code with the optimized version */ - - fprintf(stderr, "Found a pcode peep match:\nRule:\n"); - printpCodeString(stderr,peepBlock->target->pcHead,10); - fprintf(stderr,"first thing matched\n"); - pc->print(stderr,pc); - fprintf(stderr,"last thing matched\n"); - pcin->print(stderr,pcin); - - /* Unlink the original code */ - pcprev = pc->prev; - pcprev->next = pcin; - pcin->prev = pc->prev; - pCodeDeleteChain(pc,pcin); - - /* Generate the replacement code */ - pc = pcprev; - pcr = peepBlock->replace->pcHead; // This is the replacement code - while (pcr) { - pCodeOp *pcop=NULL; - /* If the replace pcode is an instruction with an operand, */ - /* then duplicate the operand (and expand wild cards in the process). */ - if(pcr->type == PC_OPCODE) { - if(PCI(pcr)->pcop) - pcop = pCodeOpCopy(PCI(pcr)->pcop); - - pCodeInsertAfter(pc, newpCode(PCI(pcr)->op,pcop)); - } else if (pcr->type == PC_WILD) { - pCodeInsertAfter(pc,peepBlock->wildpCodes[PCW(pcr)->id]); - } - - - pc = pc->next; - pc->print(stderr,pc); - pcr = pcr->next; - } - - return 1; - } - - peeprules = peeprules->next; - } - - return 0; -} diff --git a/src/pic/pcode.h b/src/pic/pcode.h index eaf70478..cdd4a1a6 100644 --- a/src/pic/pcode.h +++ b/src/pic/pcode.h @@ -19,7 +19,8 @@ -------------------------------------------------------------------------*/ -#include "ralloc.h" +//#include "ralloc.h" +struct regs; /* Post code generation @@ -290,7 +291,7 @@ typedef struct pCodeOpReg { pCodeOp pcop; // Can be either GPR or SFR int rIdx; // Index into the register table - regs *r; + struct regs *r; struct pBlock *pb; } pCodeOpReg; @@ -580,9 +581,9 @@ extern void pcode_test(void); * pCode objects. *-----------------------------------------------------------------*/ -extern pCodeOp pc_status; -extern pCodeOp pc_indf; -extern pCodeOp pc_fsr; +extern pCodeOpReg pc_status; +extern pCodeOpReg pc_indf; +extern pCodeOpReg pc_fsr; //////////////////// DELETE THIS /////////////////// diff --git a/src/pic/pcodepeep.c b/src/pic/pcodepeep.c new file mode 100644 index 00000000..8b3e0575 --- /dev/null +++ b/src/pic/pcodepeep.c @@ -0,0 +1,687 @@ +/*------------------------------------------------------------------------- + + pcodepeep.c - post code generation + Written By - Scott Dattalo scott@dattalo.com + + 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 + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-------------------------------------------------------------------------*/ + +#include + +#include "common.h" // Include everything in the SDCC src directory +#include "newalloc.h" + + +#include "pcode.h" +#include "ralloc.h" + + +pCodeOp *newpCodeOpWild(int id, pCodePeep *pcp, pCodeOp *subtype); +pCode *newpCodeWild(int pCodeID, pCodeOp *optional_operand, pCodeOp *optional_label); +pCode * findNextInstruction(pCode *pc); +char *Safe_strdup(char *str); + + +/****************************************************************/ +/* + * rootRules - defined in SDCCpeep.c + * This is a pointer to the (parsed) peephole rules that are + * defined in peep.def. + */ + +extern peepRule *rootRules; + + +/****************************************************************/ +/****************************************************************/ +typedef struct _DLL { + struct _DLL *prev; + struct _DLL *next; + // void *data; +} _DLL; + + +typedef struct pCodePeepSnippets +{ + _DLL dll; + pCodePeep *peep; +} pCodePeepSnippets; + + +static pCodePeepSnippets *peepSnippets=NULL; + + +void printpCodeString(FILE *of, pCode *pc, int max) +{ + int i=0; + + while(pc && (i++print(of,pc); + pc = pc->next; + } +} + +/*-----------------------------------------------------------------*/ +/* _DLL * DLL_append */ +/* */ +/* Append a _DLL object to the end of a _DLL (doubly linked list) */ +/* If The list to which we want to append is non-existant then one */ +/* is created. Other wise, the end of the list is sought out and */ +/* a new DLL object is appended to it. In either case, the void */ +/* *data is added to the newly created DLL object. */ +/*-----------------------------------------------------------------*/ + +static void * DLL_append(_DLL *list, _DLL *next) +{ + _DLL *b; + + + /* If there's no list, then create one: */ + if(!list) { + next->next = next->prev = NULL; + return next; + } + + + /* Search for the end of the list. */ + b = list; + while(b->next) + b = b->next; + + /* Now append the new DLL object */ + b->next = next; + b->next->prev = b; + b = b->next; + b->next = NULL; + + return list; + +} + + +/*----------------------------------------------------------------- + + pCode peephole optimization + + + The pCode "peep hole" optimization is not too unlike the peep hole + optimization in SDCCpeeph.c. The major difference is that here we + use pCode's whereas there we use ASCII strings. The advantage with + pCode's is that we can ascertain flow information in the instructions + being optimized. + + + - elaborate... + + -----------------------------------------------------------------*/ + +#if 0 +/*-----------------------------------------------------------------*/ +/* pCodePeep */ +/*-----------------------------------------------------------------*/ +int pCodePeepCompare(pCode *pc, pCodePeep *pcp) +{ + pCode *pcfrom,*pcto; + + pcfrom = pc; + for( pcto=pcp->target; pcto; pcto=pcto->next) { + + pcfrom = findNextInstruction(pcfrom); + + if( pcfrom && + (PCI(pcfrom)->op == PCI(pcto)->op || + PCI(pcto)->op == POC_WILD)) + continue; + return 0; + } + return 0; +} + +/*-----------------------------------------------------------------*/ +/* pCodePeep */ +/*-----------------------------------------------------------------*/ +void pCodePeepSearch(pCodePeep *snippet) +{ + pBlock *pb; + pCode *pc; + + if(!the_pFile) + return; + + /* compare the chain to the pCode that we've + got so far. If a match is found, then replace + the pCode chain. + */ + for(pb = the_pFile->pbHead; pb; pb = pb->next) { + for(pc = pb->pcHead; pc; pc = pc->next) { + pCodePeepCompare(pc,snippet); + } + } + +} +#endif + +#if 0 +pBlock *pBlockAppend(pBlock *pb1, pBlock *pb2) +{ + pBlock *pb; + + if(!pb1->tail) + return pb2; + + pb = pb1->tail; + + pb2->head = pb1; + pb2->tail = NULL; + pb1->tail = pb2; + +} + +#endif + +void pCodePeepInit(void) +{ + pBlock *pb; + // pCode *pc; + pCodePeep *pcp; + pCodePeepSnippets *pcps; + + /* Declare a peep code snippet */ + /* do I really need a separate struct just to DLL the snippets? */ + /* e.g. I could put the DLL into the pCodePeep structure */ + pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); + pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); + peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); + + + pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); + addpCode2pBlock( pb, newpCode(POC_MOVFW, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); + + pcp->target = pb; + + pcp->replace = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER))) ); + + /* Allocate space to store pointers to the wildcard variables */ + pcp->nvars = 1; + pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); + pcp->nwildpCodes = 0; + pcp->wildpCodes = NULL; + + pcp->postFalseCond = PCC_Z; + pcp->postTrueCond = PCC_NONE; + + fprintf(stderr,"Peep rule\nTarget:\n"); + printpCodeString(stderr,pcp->target->pcHead, 10); + fprintf(stderr,"Replaced with:\n"); + printpCodeString(stderr,pcp->replace->pcHead, 10); + + /* Now for another peep example */ + pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); + pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); + peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); + + { + pCodeOp *pcl; + pCodeOp *pcw; + pCodeOp *pcwb; + + pcwb = newpCodeOpWild(0,pcp,newpCodeOpBit(NULL,-1)); + pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSC,pcwb)); + + pcl = newpCodeOpLabel(-1); + pcw = newpCodeOpWild(1, pcp, pcl); + addpCode2pBlock( pb, newpCode(POC_GOTO, pcw)); + addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); + addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); + + + pcp->target = pb; + + pb = newpCodeChain(NULL, 'W',newpCode(POC_BTFSS, pcwb)); + addpCode2pBlock( pb, newpCodeWild(0,NULL,NULL)); + addpCode2pBlock( pb, newpCodeWild(1,NULL,pcw)); + + pcp->replace = pb; + + /* Allocate space to store pointers to the wildcard variables */ + pcp->nvars = 2; + pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); + pcp->nwildpCodes = 2; + pcp->wildpCodes = Safe_calloc(pcp->nwildpCodes, sizeof(pCode *)); + + pcp->postFalseCond = PCC_NONE; + pcp->postTrueCond = PCC_NONE; + } + + + + + + + + + + + //------------- + + /* Now for another peep example */ + pcps = Safe_calloc(1,sizeof(pCodePeepSnippets)); + pcp = pcps->peep = Safe_calloc(1,sizeof(pCodePeep)); + peepSnippets = DLL_append((_DLL*)peepSnippets,(_DLL*)pcps); + + { + pCodeOp *pcw; + + pcw = newpCodeOpWild(0,pcp,newpCodeOp(NULL,PO_GPR_REGISTER)); + + pb = newpCodeChain(NULL, 'W', newpCode(POC_MOVWF, pcw)); + addpCode2pBlock( pb, newpCode(POC_MOVWF, pcw)); + + pcp->target = pb; + + pb = newpCodeChain(NULL, 'W',newpCode(POC_MOVWF, pcw)); + + pcp->replace = pb; + + /* Allocate space to store pointers to the wildcard variables */ + pcp->nvars = 1; + pcp->vars = Safe_calloc(pcp->nvars, sizeof(char *)); + pcp->nwildpCodes = 0; + pcp->wildpCodes = NULL; + + pcp->postFalseCond = PCC_NONE; + pcp->postTrueCond = PCC_NONE; + } + + + + +} + +/*-----------------------------------------------------------------*/ +/* pCodeSearchCondition - Search a pCode chain for a 'condition' */ +/* */ +/* return conditions */ +/* 1 - The Condition was found for a pCode's input */ +/* 0 - No matching condition was found for the whole chain */ +/* -1 - The Condition was found for a pCode's output */ +/* */ +/*-----------------------------------------------------------------*/ +int pCodeSearchCondition(pCode *pc, unsigned int cond) +{ + + while(pc) { + + /* If we reach a function end (presumably an end since we most + probably began the search in the middle of a function), then + the condition was not found. */ + if(pc->type == PC_FUNCTION) + return 0; + + if(pc->type == PC_OPCODE) { + if(PCI(pc)->inCond & cond) + return 1; + if(PCI(pc)->outCond & cond) + return -1; + } + + pc = pc->next; + } + + return 0; +} +/*-----------------------------------------------------------------*/ +/* pCodePeepMatchLine - Compare source and destination pCodes to */ +/* see they're the same. */ +/*-----------------------------------------------------------------*/ +int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) +{ + int index; // index into wild card arrays + + if(pcs->type == pcd->type) { + + if(pcs->type == PC_OPCODE) { + + /* If the opcodes don't match then the line doesn't match */ + if(PCI(pcs)->op != PCI(pcd)->op) + return 0; + + fprintf(stderr,"%s comparing\n",__FUNCTION__); + pcs->print(stderr,pcs); + pcd->print(stderr,pcd); + + /* Compare the operands */ + if(PCI(pcd)->pcop) { + if (PCI(pcd)->pcop->type == PO_WILD) { + index = PCOW(PCI(pcd)->pcop)->id; + + fprintf(stderr,"destination is wild\n"); +#ifdef DEBUG_PCODEPEEP + if (index > peepBlock->nvars) { + fprintf(stderr,"%s - variables exceeded\n",__FUNCTION__); + exit(1); + } +#endif + PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop; + { + char *n; + + if(PCI(pcs)->pcop->type == PO_GPR_TEMP) + n = PCOR(PCI(pcs)->pcop)->r->name; + else + n = PCI(pcs)->pcop->name; + + if(peepBlock->vars[index]) + return (strcmp(peepBlock->vars[index],n) == 0); + else { + peepBlock->vars[index] = n; //PCI(pcs)->pcop->name; + return 1; + } + } + } + } else + /* The pcd has no operand. Lines match if pcs has no operand either*/ + return (PCI(pcs)->pcop == NULL); + } + } + + + if((pcd->type == PC_WILD) && (pcs->type == PC_OPCODE)) { + + int labindex; + + index = PCW(pcd)->id; + + fprintf(stderr,"%s comparing wild cards\n",__FUNCTION__); + pcs->print(stderr,pcs); + pcd->print(stderr,pcd); + + peepBlock->wildpCodes[PCW(pcd)->id] = pcs; + + /* Check for a label associated with this wild pCode */ + // If the wild card has a label, make sure the source code does too. + if(PCW(pcd)->label) { + if(!pcs->label) + return 0; + + labindex = PCOW(PCW(pcd)->label)->id; + if(peepBlock->vars[labindex] == NULL) { + // First time to encounter this label + peepBlock->vars[labindex] = PCL(pcs->label->pc)->label; + fprintf(stderr,"first time for a label\n"); + } else { + if(strcmp(peepBlock->vars[labindex],PCL(pcs->label->pc)->label) != 0) { + fprintf(stderr,"labels don't match\n"); + return 0; + } + fprintf(stderr,"matched a label\n"); + } + + } + + if(PCW(pcd)->operand) { + PCOW(PCI(pcd)->pcop)->matched = PCI(pcs)->pcop; + if(peepBlock->vars[index]) { + int i = (strcmp(peepBlock->vars[index],PCI(pcs)->pcop->name) == 0); + if(i) + fprintf(stderr," (matched)\n"); + else { + fprintf(stderr," (no match: wild card operand mismatch\n"); + fprintf(stderr," peepblock= %s, pcodeop= %s\n", + peepBlock->vars[index], + PCI(pcs)->pcop->name); + } + return i; + } else { + peepBlock->vars[index] = PCI(pcs)->pcop->name; + return 1; + } + } + + pcs = findNextInstruction(pcs->next); + if(pcs) { + fprintf(stderr," (next to match)\n"); + pcs->print(stderr,pcs); + } + + return 1; /* wild card matches */ + } + + return 0; +} + +/*-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------*/ +void pCodePeepClrVars(pCodePeep *pcp) +{ + + int i; + + for(i=0;invars; i++) + pcp->vars[i] = NULL; + +} + +/*-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------*/ +void pCodeInsertAfter(pCode *pc1, pCode *pc2) +{ + + if(!pc1 || !pc2) + return; + + pc2->next = pc1->next; + if(pc1->next) + pc1->next->prev = pc2; + + pc2->prev = pc1; + pc1->next = pc2; + +} + +/*-----------------------------------------------------------------*/ +/* pCodeOpCopy - copy a pcode operator */ +/*-----------------------------------------------------------------*/ +static pCodeOp *pCodeOpCopy(pCodeOp *pcop) +{ + pCodeOp *pcopnew=NULL; + + if(!pcop) + return NULL; + + switch(pcop->type) { + case PO_CRY: + case PO_BIT: + pcopnew = Safe_calloc(1,sizeof(pCodeOpBit) ); + PCOB(pcopnew)->bit = PCOB(pcop)->bit; + PCOB(pcopnew)->inBitSpace = PCOB(pcop)->inBitSpace; + + break; + + case PO_WILD: + /* Here we expand the wild card into the appropriate type: */ + /* By recursively calling pCodeOpCopy */ + if(PCOW(pcop)->matched) + pcopnew = pCodeOpCopy(PCOW(pcop)->matched); + else { + // Probably a label + pcopnew = pCodeOpCopy(PCOW(pcop)->subtype); + pcopnew->name = Safe_strdup(PCOW(pcop)->pcp->vars[PCOW(pcop)->id]); + fprintf(stderr,"copied a wild op named %s\n",pcopnew->name); + } + + return pcopnew; + break; + + case PO_LABEL: + pcopnew = Safe_calloc(1,sizeof(pCodeOpLabel) ); + PCOLAB(pcopnew)->key = PCOLAB(pcop)->key; + break; + + case PO_LITERAL: + case PO_IMMEDIATE: + pcopnew = Safe_calloc(1,sizeof(pCodeOpLit) ); + PCOL(pcopnew)->lit = PCOL(pcop)->lit; + break; + + case PO_GPR_REGISTER: + case PO_GPR_TEMP: + case PO_SFR_REGISTER: + case PO_DIR: + case PO_STR: + case PO_NONE: + case PO_W: + case PO_STATUS: + case PO_FSR: + case PO_INDF: + + pcopnew = Safe_calloc(1,sizeof(pCodeOp) ); + + } + + pcopnew->type = pcop->type; + pcopnew->name = Safe_strdup(pcop->name); + + return pcopnew; +} + +#if 0 +/*-----------------------------------------------------------------*/ +/* pCodeCopy - copy a pcode */ +/*-----------------------------------------------------------------*/ +static pCode *pCodeCopy(pCode *pc) +{ + + pCode *pcnew; + + pcnew = newpCode(pc->type,pc->pcop); +} +#endif +/*-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------*/ +void pCodeDeleteChain(pCode *f,pCode *t) +{ + pCode *pc; + + while(f && f!=t) { + fprintf(stderr,"delete pCode:\n"); + pc = f->next; + f->print(stderr,f); + //f->delete(f); + f = pc; + } + +} +/*-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------*/ +int pCodePeepMatchRule(pCode *pc) +{ + pCodePeep *peepBlock; + pCode *pct, *pcin; + _DLL *peeprules; + int matched; + + peeprules = (_DLL *)peepSnippets; + + while(peeprules) { + peepBlock = ((pCodePeepSnippets*)peeprules)->peep; + pCodePeepClrVars(peepBlock); + + pcin = pc; + pct = peepBlock->target->pcHead; + matched = 0; + while(pct && pcin) { + + if(! (matched = pCodePeepMatchLine(peepBlock, pcin,pct))) + break; + + pcin = findNextInstruction(pcin->next); + pct = pct->next; + //debug: + fprintf(stderr," matched\n"); + if(!pcin) + fprintf(stderr," end of code\n"); + if(!pct) + fprintf(stderr," end of rule\n"); + } + + if(matched && pcin) { + + /* So far we matched the rule up to the point of the conditions . + * In other words, all of the opcodes match. Now we need to see + * if the post conditions are satisfied. + * First we check the 'postFalseCond'. This means that we check + * to see if any of the subsequent pCode's in the pCode chain + * following the point just past where we have matched depend on + * the `postFalseCond' as input then we abort the match + */ + fprintf(stderr," matched rule so far, now checking conditions\n"); + if (peepBlock->postFalseCond && + (pCodeSearchCondition(pcin,peepBlock->postFalseCond) > 0) ) + matched = 0; + } + + if(matched && pcin) { + + pCode *pcprev; + pCode *pcr; + + + /* We matched a rule! Now we have to go through and remove the + inefficient code with the optimized version */ + + fprintf(stderr, "Found a pcode peep match:\nRule:\n"); + printpCodeString(stderr,peepBlock->target->pcHead,10); + fprintf(stderr,"first thing matched\n"); + pc->print(stderr,pc); + fprintf(stderr,"last thing matched\n"); + pcin->print(stderr,pcin); + + /* Unlink the original code */ + pcprev = pc->prev; + pcprev->next = pcin; + pcin->prev = pc->prev; + pCodeDeleteChain(pc,pcin); + + /* Generate the replacement code */ + pc = pcprev; + pcr = peepBlock->replace->pcHead; // This is the replacement code + while (pcr) { + pCodeOp *pcop=NULL; + /* If the replace pcode is an instruction with an operand, */ + /* then duplicate the operand (and expand wild cards in the process). */ + if(pcr->type == PC_OPCODE) { + if(PCI(pcr)->pcop) + pcop = pCodeOpCopy(PCI(pcr)->pcop); + + pCodeInsertAfter(pc, newpCode(PCI(pcr)->op,pcop)); + } else if (pcr->type == PC_WILD) { + pCodeInsertAfter(pc,peepBlock->wildpCodes[PCW(pcr)->id]); + } + + + pc = pc->next; + pc->print(stderr,pc); + pcr = pcr->next; + } + + return 1; + } + + peeprules = peeprules->next; + } + + return 0; +} diff --git a/src/pic/ralloc.c b/src/pic/ralloc.c index 9907b9b2..e3b92273 100644 --- a/src/pic/ralloc.c +++ b/src/pic/ralloc.c @@ -26,6 +26,7 @@ #include "common.h" #include "ralloc.h" +#include "pcode.h" #include "gen.h" #if defined(_MSC_VER) @@ -64,27 +65,27 @@ int pic14_ptrRegReq; /* one byte pointer register required */ regs regspic14[] = { - {REG_GPR, 0x0C, "r0x0C", "r0x0C", 0x0C, 1, 0}, - {REG_GPR, 0x0D, "r0x0D", "r0x0C", 0x0D, 1, 0}, - {REG_GPR, 0x0E, "r0x0E", "r0x0C", 0x0E, 1, 0}, - {REG_GPR, 0x0F, "r0x0F", "r0x0C", 0x0F, 1, 0}, - {REG_GPR, 0x10, "r0x10", "r0x10", 0x10, 1, 0}, - {REG_GPR, 0x11, "r0x11", "r0x11", 0x11, 1, 0}, - {REG_GPR, 0x12, "r0x12", "r0x12", 0x12, 1, 0}, - {REG_GPR, 0x13, "r0x13", "r0x13", 0x13, 1, 0}, - {REG_GPR, 0x14, "r0x14", "r0x14", 0x14, 1, 0}, - {REG_GPR, 0x15, "r0x15", "r0x15", 0x15, 1, 0}, - {REG_GPR, 0x16, "r0x16", "r0x16", 0x16, 1, 0}, - {REG_GPR, 0x17, "r0x17", "r0x17", 0x17, 1, 0}, - {REG_GPR, 0x18, "r0x18", "r0x18", 0x18, 1, 0}, - {REG_GPR, 0x19, "r0x19", "r0x19", 0x19, 1, 0}, - {REG_GPR, 0x1A, "r0x1A", "r0x1A", 0x1A, 1, 0}, - {REG_GPR, 0x1B, "r0x1B", "r0x1B", 0x1B, 1, 0}, - {REG_GPR, 0x1C, "r0x1C", "r0x1C", 0x1C, 1, 0}, - {REG_GPR, 0x1D, "r0x1D", "r0x1D", 0x1D, 1, 0}, - {REG_GPR, 0x1E, "r0x1E", "r0x1E", 0x1E, 1, 0}, - {REG_GPR, 0x1F, "r0x1F", "r0x1F", 0x1F, 1, 0}, - {REG_PTR, 4, "FSR", "FSR", 4, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x0C, "r0x0C", "r0x0C", 0x0C, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x0D, "r0x0D", "r0x0C", 0x0D, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x0E, "r0x0E", "r0x0C", 0x0E, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x0F, "r0x0F", "r0x0C", 0x0F, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x10, "r0x10", "r0x10", 0x10, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x11, "r0x11", "r0x11", 0x11, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x12, "r0x12", "r0x12", 0x12, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x13, "r0x13", "r0x13", 0x13, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x14, "r0x14", "r0x14", 0x14, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x15, "r0x15", "r0x15", 0x15, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x16, "r0x16", "r0x16", 0x16, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x17, "r0x17", "r0x17", 0x17, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x18, "r0x18", "r0x18", 0x18, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x19, "r0x19", "r0x19", 0x19, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1A, "r0x1A", "r0x1A", 0x1A, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1B, "r0x1B", "r0x1B", 0x1B, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1C, "r0x1C", "r0x1C", 0x1C, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1D, "r0x1D", "r0x1D", 0x1D, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1E, "r0x1E", "r0x1E", 0x1E, 1, 0}, + {REG_GPR, PO_GPR_TEMP, 0x1F, "r0x1F", "r0x1F", 0x1F, 1, 0}, + {REG_PTR, PO_FSR, 4, "FSR", "FSR", 4, 1, 0}, }; @@ -105,7 +106,7 @@ debugLog (char *fmt,...) //char *bufferP=buffer; va_list ap; - if (!debug) + if (!debug || !srcFileName) return; @@ -1814,7 +1815,7 @@ rematStr (symbol * sym) } /* we reached the end */ - sprintf (s, "%s\n", OP_SYMBOL (IC_LEFT (ic))->rname); + sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname); break; } diff --git a/src/pic/ralloc.h b/src/pic/ralloc.h index d0d38f5d..37e37dbc 100644 --- a/src/pic/ralloc.h +++ b/src/pic/ralloc.h @@ -28,6 +28,8 @@ #ifndef SDCCRALLOC_H #define SDCCRALLOC_H 1 + + enum { R2_IDX = 0, R3_IDX, R4_IDX, @@ -41,11 +43,15 @@ enum #define REG_PTR 0x01 #define REG_GPR 0x02 #define REG_CND 0x04 +#define REG_SFR 0x08 + /* definition for the registers */ typedef struct regs { short type; /* can have value - REG_GPR, REG_PTR or REG_CND */ + * 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 */ diff --git a/src/regression/Makefile b/src/regression/Makefile index d1ce27ad..eb1b16c1 100644 --- a/src/regression/Makefile +++ b/src/regression/Makefile @@ -60,7 +60,9 @@ SRC = b.c \ call1.c \ compare.c \ compare2.c \ + compare3.c \ for.c \ + struct1.c \ sub.c \ while.c diff --git a/src/regression/add.c b/src/regression/add.c index 15ac6c17..5998655b 100644 --- a/src/regression/add.c +++ b/src/regression/add.c @@ -133,7 +133,7 @@ void add_bits(void) #if SUPPORT_BIT_ARITHMETIC bit2 = bit1+bit3; - if(bit2) + if(!bit2) failures++; bit3 = bit4+bit5+bit6+bit7+bit0; diff --git a/src/regression/struct1.c b/src/regression/struct1.c index e7a607e8..e8a5b031 100644 --- a/src/regression/struct1.c +++ b/src/regression/struct1.c @@ -39,10 +39,11 @@ unsigned char *acharP = 0; struct chars { unsigned char c0, c1; + unsigned int i0, i1; }; -struct chars char_struct; +struct chars struct1; void done () @@ -56,12 +57,12 @@ void struct_test (void) { - if (char_struct.c0 || char_struct.c1) + if (struct1.c0 || struct1.c1) failures++; - char_struct.c0++; + struct1.c0++; - if (char_struct.c0 != 1) + if (struct1.c0 != 1) failures++; } @@ -79,16 +80,28 @@ ptr_to_struct (struct chars *p) failures++; } +void add_chars(void) +{ + + achar0 = struct1.c0 + struct1.c1; + + if(achar0 != 1) + failures++; +} void main (void) { - char_struct.c0 = 0; - char_struct.c1 = 0; + struct1.c0 = 0; + struct1.c1 = 0; struct_test (); - ptr_to_struct (&char_struct); + ptr_to_struct (&struct1); + + struct1.c0 = 0; + struct1.c1 = 1; + add_chars(); success = failures; done (); diff --git a/src/regression/sub.c b/src/regression/sub.c index fd3a6f11..1dd0ee35 100644 --- a/src/regression/sub.c +++ b/src/regression/sub.c @@ -153,9 +153,9 @@ void sub_bits(void) } #endif -/* add_bit2uchar(void) - assumes bit0 = 1, achar0 = 7 */ +/* sub_bit2uchar(void) - assumes bit0 = 1, achar0 = 7 */ -void add_bit2uchar(void) +void sub_bit2uchar(void) { achar0 -= bit0; @@ -168,14 +168,14 @@ void add_bit2uchar(void) } -void add_bit2uint(void) +void sub_bit2uint(void) { if(aint0 != bit11) failures++; - aint0 += bit0; - if(aint0!=1) + aint0 -= bit0; + if(aint0!=0xffff) failures++; } @@ -198,8 +198,8 @@ void main(void) achar0 = 7; bit0 = 1; - add_bit2uchar(); - //add_bit2uint(); + sub_bit2uchar(); + sub_bit2uint(); #endif