From 02e5ffe7558a69ea0293fda3e1cf9747ac0ff29e Mon Sep 17 00:00:00 2001 From: vrokas Date: Wed, 30 Jun 2004 15:20:58 +0000 Subject: [PATCH] * device/lib/Makefile.in: fixed bug in target objects-pic16, * device/lib/pic16/Makefile: prefixed with dash (-) command under target 'clean', * doc/sdccman.lyx: changed version to 2.4.2 and added some port specific command line arguments. Also added sample lkr script for placing a variable at a specific memory bank. * src/pic16/device.c (pic16_dump_gsection): NEW, to dump variables at a specific memory bank, * (pic16_dump_isection): fixed bug which caused string literals to be omitted when dumping idata section, * (pic16_groupRegistersInSection): added code to handle registers in specific memory banks, * src/pic16/gen.c: labelOffset is prefixed with pic16_ and made public, all references are renamed too, * (pic16_aopGet): removed switch cases for AOP_R0,AOP_R1,AOP_DPTR, AOP_DPTR2, * (pic16_storeForReturn): added case to handle when dest is WREG, * src/pic16/genarith.c (pic16_pCodeOpSubType): NEW, * src/pic16/glue.c (pic16emitRegularMap): when adding a register in pic16_rel_udata, check to see if that register is marked as being a member of a specific memory bank, * (pic16_printIvalCharPtr): added code to add string literals either to code or the idata sections, * src/pic16/main.c (_process_pragma): added \n to WHITE constant, also accept the 'udata' pragma, * src/pic16/main.h: new structure types sectName and sectSym * src/pic16/pcode.c: added new pCodeInstruction entry for BANKSEL * (newpCodeOpBit): added PIC_OPTYPE subt in function prototype, * (pic16_findPrevInstruction): fixed, it returned nothing, * (insertBankSwitch): fixed to emit banksel/skip and skip/banksel instruction combinations, * (pic16_FixRegisterBanking): heavily reorganised, * (pic16_AnalyzeBanking): if generating banksel directives is disabled, then don't call FixRegisterBanking at all, * src/pic16/ralloc.c (bitEQUs, aliasEQUs, allDefsOutOfRange): completely removed, * (pic16_writeUsedRegisters): added call to pic16_dump_gsection git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3371 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 40 ++++++ device/lib/Makefile.in | 2 +- device/lib/pic16/Makefile | 2 +- doc/sdccman.lyx | 164 ++++++++++++++++++++- src/pic16/NOTES | 4 +- src/pic16/device.c | 75 +++++++++- src/pic16/gen.c | 208 +++++++++++---------------- src/pic16/genarith.c | 89 ++++++++++-- src/pic16/glue.c | 90 ++++++++---- src/pic16/main.c | 52 ++++++- src/pic16/main.h | 14 ++ src/pic16/pcode.c | 291 +++++++++++++++++++++++--------------- src/pic16/pcode.h | 23 +-- src/pic16/pcodepeep.c | 8 +- src/pic16/ralloc.c | 115 +++------------ 15 files changed, 766 insertions(+), 411 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9782b44e..37aba6a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,43 @@ +2004-06-30 Vangelis Rokas + + * device/lib/Makefile.in: fixed bug in target objects-pic16, + * device/lib/pic16/Makefile: prefixed with dash (-) command under + target 'clean', + * doc/sdccman.lyx: changed version to 2.4.2 and added some port + specific command line arguments. Also added sample lkr script + for placing a variable at a specific memory bank. + * src/pic16/device.c (pic16_dump_gsection): NEW, to dump variables + at a specific memory bank, + * (pic16_dump_isection): fixed bug which caused string literals to + be omitted when dumping idata section, + * (pic16_groupRegistersInSection): added code to handle registers + in specific memory banks, + * src/pic16/gen.c: labelOffset is prefixed with pic16_ and made + public, all references are renamed too, + * (pic16_aopGet): removed switch cases for AOP_R0,AOP_R1,AOP_DPTR, + AOP_DPTR2, + * (pic16_storeForReturn): added case to handle when dest is WREG, + * src/pic16/genarith.c (pic16_pCodeOpSubType): NEW, + * src/pic16/glue.c (pic16emitRegularMap): when adding a register in + pic16_rel_udata, check to see if that register is marked as being + a member of a specific memory bank, + * (pic16_printIvalCharPtr): added code to add string literals either + to code or the idata sections, + * src/pic16/main.c (_process_pragma): added \n to WHITE constant, + also accept the 'udata' pragma, + * src/pic16/main.h: new structure types sectName and sectSym + * src/pic16/pcode.c: added new pCodeInstruction entry for BANKSEL + * (newpCodeOpBit): added PIC_OPTYPE subt in function prototype, + * (pic16_findPrevInstruction): fixed, it returned nothing, + * (insertBankSwitch): fixed to emit banksel/skip and skip/banksel + instruction combinations, + * (pic16_FixRegisterBanking): heavily reorganised, + * (pic16_AnalyzeBanking): if generating banksel directives is + disabled, then don't call FixRegisterBanking at all, + * src/pic16/ralloc.c (bitEQUs, aliasEQUs, allDefsOutOfRange): + completely removed, + * (pic16_writeUsedRegisters): added call to pic16_dump_gsection + 2004-06-29 Bernhard Held * src/SDCCglue.c (printChar): fixed bug #973350, patch provided by diff --git a/device/lib/Makefile.in b/device/lib/Makefile.in index 0ff899cd..50feb387 100644 --- a/device/lib/Makefile.in +++ b/device/lib/Makefile.in @@ -208,7 +208,7 @@ model-pic16: fi objects-pic16: build-dir port-specific-objects-pic16 clean_intermediate-pic16 - cd $(PORTDIR)/bin; ls *$(OEXT) > $(PORT).lib + cd $(PORTDIR); ls *$(OEXT) > $(PORT).lib build-dir: $(PORTDIR) diff --git a/device/lib/pic16/Makefile b/device/lib/pic16/Makefile index 78715a89..ee9e3f52 100644 --- a/device/lib/pic16/Makefile +++ b/device/lib/pic16/Makefile @@ -29,7 +29,7 @@ build-all-libraries: clean: all-clean - $(RM) -f bin/* + -$(RM) -f bin/* diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx index 42623a8b..38912811 100644 --- a/doc/sdccman.lyx +++ b/doc/sdccman.lyx @@ -82,7 +82,7 @@ SDCC Compiler User Guide \size normal -SDCC 2.4.1 +SDCC 2.4.2 \size footnotesize \newline @@ -15104,6 +15104,49 @@ status Collapsed -preplace-udata-with=[kword] Replaces the default udata keyword for allocating unitialized data variables with [kword]. Valid keywords are: "udata_acs", "udata_shr", "udata_ovr". +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-ivt-loc positions the Interrupt Vector Table at location . + Useful for bootloaders. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-asm= sets the full path and name of an external assembler to call. +\layout List +\labelwidthstring 00.00.0000 + +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-link= sets the full path and name of an external linker to call. \layout Subsubsection Debugging Options @@ -15394,9 +15437,6 @@ It is important to initialize the stack, otherwise strange things can happen. \newline The stack pragma should be used only once in a project. Multiple pragmas may result in indeterminate behaviour of the program. -\newline -If you omit setting the pragma the port emits a warning message before linking. - If not initializing the stack is desired ignore the message. \layout LyX-Code Example: @@ -15408,8 +15448,112 @@ Example: \layout LyX-Code #pragma stack 0x5ff +\layout List +\labelwidthstring 00.00.0000 + +udata pragma udata instructs the compiler to emit code so that linker will + place a variable at a specific memory bank +\layout LyX-Code + +Example: +\layout LyX-Code + +\layout LyX-Code + +/* places variable foo at bank2 */ +\layout LyX-Code + +#pragma udata bank2 foo +\layout LyX-Code + +char foo; +\layout Standard + +In order for this pragma to work there are some changes that must be made + in the .lkr script used in link stage. + In the following example a sample .lkr file is shown: +\layout LyX-Code + \layout LyX-Code +// Sample linker script for the PIC18F452 processor +\layout LyX-Code + +LIBPATH . +\layout LyX-Code + +CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED +\layout LyX-Code + +CODEPAGE NAME=page START=0x2A END=0x7FFF +\layout LyX-Code + +CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED +\layout LyX-Code + +CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED +\layout LyX-Code + +CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED +\layout LyX-Code + +CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED +\layout LyX-Code + +ACCESSBANK NAME=accessram START=0x0 END=0x7F +\layout LyX-Code + +\layout LyX-Code + +DATABANK NAME=gpr0 START=0x80 END=0xFF +\layout LyX-Code + +DATABANK NAME=gpr1 START=0x100 END=0x1FF +\layout LyX-Code + +DATABANK NAME=gpr2 START=0x200 END=0x2FF +\layout LyX-Code + +DATABANK NAME=gpr3 START=0x300 END=0x3FF +\layout LyX-Code + +DATABANK NAME=gpr4 START=0x400 END=0x4FF +\layout LyX-Code + +DATABANK NAME=gpr5 START=0x500 END=0x5FF +\layout LyX-Code + +ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED +\layout LyX-Code + +\layout LyX-Code + +SECTION NAME=CONFIG ROM=config +\layout LyX-Code + +\layout LyX-Code + +SECTION NAME=bank0 RAM=gpr0 +\layout LyX-Code + +SECTION NAME=bank1 RAM=gpr1 +\layout LyX-Code + +SECTION NAME=bank2 RAM=gpr2 +\layout LyX-Code + +SECTION NAME=bank3 RAM=gpr3 +\layout LyX-Code + +SECTION NAME=bank4 RAM=gpr4 +\layout LyX-Code + +SECTION NAME=bank5 RAM=gpr5 +\layout Standard + +The linker will recognise the section name set in the pragma statement and + will position the variable at the memory bank set with the RAM field at + the SECTION line in the linker script file. \layout Subsection Header Files @@ -15900,7 +16044,17 @@ PROD (PRODL and PRODH) FSR0 (FSR0L and FSR0H) \layout Standard -These registers are restored upon return from the interrupt routine +These registers are restored upon return from the interrupt routine. + +\layout Standard + +When entering a high priority interrupt WREG, STATUS and BSR are not explicit + saved by software. + The hardware shadow registers for WREG, STATUS and BSR are used in these + cases. +\layout Standard + + \begin_inset Foot collapsed false diff --git a/src/pic16/NOTES b/src/pic16/NOTES index 0f8574fb..4d38a12d 100644 --- a/src/pic16/NOTES +++ b/src/pic16/NOTES @@ -68,9 +68,7 @@ programs is: --pcode-verbose enable verbose pcode generator messages - port options - --pgen-banksel enable banksel directives for the assembler - This will be turned on by default later, but left as - is for now + --pno-banksel disable banksel directives for the assembler --pomit-config-words does not emit configuration instruction in the translation This is useful when copmiling multiple sources, when you do not want multiple diff --git a/src/pic16/device.c b/src/pic16/device.c index 54e1f814..38e1ab6b 100644 --- a/src/pic16/device.c +++ b/src/pic16/device.c @@ -35,6 +35,7 @@ #include "newalloc.h" +#include "main.h" #include "pcode.h" #include "ralloc.h" #include "device.h" @@ -382,7 +383,7 @@ static PIC16_device Pics16[] = { { 0xff, 0, 0xff } /* a */ , { 0xe0, 0, 0xff } /* b */ , { 0xff, 0, 0xff } /* c */ , { 0x40, 0, 0xff } /* d */ } } - }, + } }; @@ -527,9 +528,28 @@ void pic16_dump_usection(FILE *of, set *section, int fix) free(rlist); } +void pic16_dump_gsection(FILE *of, set *sections) +{ + regs *r; + sectName *sname; + + for(sname = setFirstItem(sections); sname; sname = setNextItem(sections)) { + fprintf(of, "\n\n%s\tudata\n", sname->name); + + for(r=setFirstItem(sname->regsSet); r; r=setNextItem(sname->regsSet)) { +#if 0 + fprintf(stderr, "%s:%d emitting variable %s for section %s (%p)\n", __FILE__, __LINE__, + r->name, sname->name, sname); +#endif + fprintf(of, "%s\tres\t%d\n", r->name, r->size); + } + } +} + /* forward declaration */ void pic16_printIval(symbol * sym, sym_link * type, initList * ilist, char ptype, void *p); +extern void pic16_pCodeConstString(char *name, char *value); void pic16_dump_isection(FILE *of, set *section, int fix) { @@ -558,9 +578,22 @@ void pic16_dump_isection(FILE *of, set *section, int fix) if(!fix) { fprintf(of, "\n\n\tidata\n"); for(s = setFirstItem(section); s; s = setNextItem(section)) { - fprintf(of, "%s", s->rname); - pic16_printIval(s, s->type, s->ival, 'f', (void *)of); - pic16_flushDB('f', (void *)of); + + if(s->ival) { + fprintf(of, "%s", s->rname); + pic16_printIval(s, s->type, s->ival, 'f', (void *)of); + pic16_flushDB('f', (void *)of); + } else { + if (IS_ARRAY (s->type) && IS_CHAR (s->type->next) + && SPEC_CVAL (s->etype).v_char) { + +// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, s->rname); + pic16_pCodeConstString(s->rname , SPEC_CVAL (s->etype).v_char); + } else { + assert(0); + } + } + } } else { int j=0; @@ -580,9 +613,21 @@ void pic16_dump_isection(FILE *of, set *section, int fix) fprintf(of, "\nistat_%s_%02d\tidata\t0X%04X\n", moduleName, abs_isection_no++, init_addr); } - fprintf(of, "%s", s->rname); - pic16_printIval(s, s->type, s->ival, 'f', (void *)of); - pic16_flushDB('f', (void *)of); + if(s->ival) { + fprintf(of, "%s", s->rname); + pic16_printIval(s, s->type, s->ival, 'f', (void *)of); + pic16_flushDB('f', (void *)of); + } else { + if (IS_ARRAY (s->type) && IS_CHAR (s->type->next) + && SPEC_CVAL (s->etype).v_char) { + +// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, s->rname); + pic16_pCodeConstString(s->rname , SPEC_CVAL (s->etype).v_char); + } else { + assert(0); + } + } + sprev = s; } @@ -823,6 +868,8 @@ int checkAddSym(set **set, symbol *sym) void pic16_groupRegistersInSection(set *regset) { regs *reg; + sectSym *ssym; + int docontinue=0; for(reg=setFirstItem(regset); reg; reg = setNextItem(regset)) { @@ -842,6 +889,20 @@ void pic16_groupRegistersInSection(set *regset) (reg->regop?(OP_SYMBOL(reg->regop)->ival?1:0):-1), (reg->regop?(OP_SYMBOL(reg->regop)->level):-1) ); #endif + + docontinue=0; + for(ssym=setFirstItem(sectSyms);ssym;ssym=setNextItem(sectSyms)) { + if(!strcmp(ssym->name, reg->name)) { +// fprintf(stderr, "%s:%d section found %s (%p) with var %s\n", +// __FILE__, __LINE__, ssym->section->name, ssym->section, ssym->name); + addSet(&ssym->section->regsSet, reg); + docontinue=1; + } + } + + if(docontinue)continue; + +// fprintf(stderr, "%s:%d reg: %s\n", __FILE__, __LINE__, reg->name); if(reg->alias == 0x80) { checkAddReg(&pic16_equ_data, reg); diff --git a/src/pic16/gen.c b/src/pic16/gen.c index fd6d3295..4e60d1eb 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -60,7 +60,7 @@ extern pCode *pic16_newpCodeAsmDir(char *asdir, char *argfmt, ...); static void mov2w (asmop *aop, int offset); static int aopIdx (asmop *aop, int offset); -static int labelOffset=0; +int pic16_labelOffset=0; extern int pic16_debug_verbose; static int optimized_for_speed = 0; /* @@ -270,12 +270,12 @@ void DEBUGpic16_emitcode (char *inst,char *fmt, ...) void pic16_emitpLabel(int key) { - pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(NULL,key+100+labelOffset)); + pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(NULL,key+100+pic16_labelOffset)); } void pic16_emitpLabelFORCE(int key) { - pic16_addpCode2pBlock(pb,pic16_newpCodeLabelFORCE(NULL,key+100+labelOffset)); + pic16_addpCode2pBlock(pb,pic16_newpCodeLabelFORCE(NULL,key+100+pic16_labelOffset)); } void pic16_emitpcode(PIC_OPCODE poc, pCodeOp *pcop) @@ -503,7 +503,7 @@ static void resolveIfx(resolvedIfx *resIfx, iCode *ifx) #endif } - DEBUGpic16_emitcode("; ***","%s lbl->key=%d, (lab offset=%d)",__FUNCTION__,resIfx->lbl->key,labelOffset); + DEBUGpic16_emitcode("; ***","%s lbl->key=%d, (lab offset=%d)",__FUNCTION__,resIfx->lbl->key,pic16_labelOffset); } #if 0 @@ -540,7 +540,7 @@ static asmop *aopForSym (iCode *ic, operand *op, bool result) /* if symbol was initially placed onStack then we must re-place it * to direct memory, since pic16 does not have a specific stack */ if(sym->onStack) { - sym->onStack = 0; +// sym->onStack = 0; SPEC_OCLS( sym->etype ) = data; space = data; } @@ -1172,65 +1172,6 @@ char *pic16_aopGet (asmop *aop, int offset, bool bit16, bool dname) /* depending on type */ switch (aop->type) { - case AOP_R0: - case AOP_R1: - DEBUGpic16_emitcode(";","%d",__LINE__); - /* if we need to increment it */ - while (offset > aop->coff) { - pic16_emitcode ("inc","%s",aop->aopu.aop_ptr->name); - aop->coff++; - } - - while (offset < aop->coff) { - pic16_emitcode("dec","%s",aop->aopu.aop_ptr->name); - aop->coff--; - } - - aop->coff = offset ; - if (aop->paged) { - pic16_emitcode("movx","a,@%s",aop->aopu.aop_ptr->name); - return (dname ? "acc" : "a"); - } - sprintf(s,"@%s",aop->aopu.aop_ptr->name); - rs = Safe_calloc(1,strlen(s)+1); - strcpy(rs,s); - return rs; - - case AOP_DPTR: - case AOP_DPTR2: - DEBUGpic16_emitcode(";","%d",__LINE__); - if (aop->type == AOP_DPTR2) - { - genSetDPTR(1); - } - - while (offset > aop->coff) { - pic16_emitcode ("inc","dptr"); - aop->coff++; - } - - while (offset < aop->coff) { - pic16_emitcode("lcall","__decdptr"); - aop->coff--; - } - - aop->coff = offset; - if (aop->code) { - pic16_emitcode("clr","a"); - pic16_emitcode("movc","a,@a+dptr"); - } - else { - pic16_emitcode("movx","a,@dptr"); - } - - if (aop->type == AOP_DPTR2) - { - genSetDPTR(0); - } - - return (dname ? "acc" : "a"); - - case AOP_IMMD: if (bit16) sprintf (s,"%s",aop->aopu.aop_immd); @@ -1360,12 +1301,12 @@ void pic16_popReleaseTempReg(pCodeOp *pcop) pCodeOp *pic16_popGetLabel(unsigned int key) { - DEBUGpic16_emitcode ("; ***","%s key=%d, label offset %d",__FUNCTION__,key, labelOffset); + DEBUGpic16_emitcode ("; ***","%s key=%d, label offset %d",__FUNCTION__,key, pic16_labelOffset); if(key>max_key) max_key = key; - return pic16_newpCodeOpLabel(NULL,key+100+labelOffset); + return pic16_newpCodeOpLabel(NULL,key+100+pic16_labelOffset); } /*-----------------------------------------------------------------*/ @@ -1637,7 +1578,7 @@ pCodeOp *pic16_popGet (asmop *aop, int offset) //, bool bit16, bool dname) case AOP_CRY: DEBUGpic16_emitcode(";","%d\tAOP_CRY", __LINE__); - pcop = pic16_newpCodeOpBit(aop->aopu.aop_dir,-1,1); + pcop = pic16_newpCodeOpBit(aop->aopu.aop_dir,-1,1, PO_GPR_REGISTER); PCOR(pcop)->r = pic16_dirregWithName(aop->aopu.aop_dir); //if(PCOR(pcop)->r == NULL) //fprintf(stderr,"%d - couldn't find %s in allocated registers\n",__LINE__,aop->aopu.aop_dir); @@ -2508,7 +2449,7 @@ static void assignResultValue(operand * oper, int rescall) } else { /* >32-bits, result on stack, and FSR0 points to beginning. * Fix stack when done */ - + /* FIXME FIXME */ while (size--) { // DEBUGpic16_emitcode("; ", "POC_MOVLW %d", GpsuedoStkPtr); // DEBUGpic16_emitcode("; ", "POC_MOVFW PLUSW2"); @@ -3222,9 +3163,9 @@ static void genFunction (iCode *ic) symbol *sym; sym_link *ftype; - DEBUGpic16_emitcode ("; ***","%s %d curr label offset=%dprevious max_key=%d ",__FUNCTION__,__LINE__,labelOffset,max_key); + DEBUGpic16_emitcode ("; ***","%s %d curr label offset=%dprevious max_key=%d ",__FUNCTION__,__LINE__,pic16_labelOffset,max_key); - labelOffset += (max_key+4); + pic16_labelOffset += (max_key+4); max_key=0; GpsuedoStkPtr=0; _G.nRegsSaved = 0; @@ -3289,7 +3230,6 @@ static void genFunction (iCode *ic) case 2: abSym->address = 0x000018; break; } - /* relocate interrupt vectors if needed */ abSym->address += pic16_options.ivt_loc; @@ -3586,7 +3526,7 @@ static void genEndFunction (iCode *ic) } } - pic16_emitpcomment("%s: _G.nRegsSaved upon exit from function: %d\n", __FUNCTION__, _G.nRegsSaved); +// pic16_emitpcomment("%s: _G.nRegsSaved upon exit from function: %d\n", __FUNCTION__, _G.nRegsSaved); /* if debug then send end of function */ if (currFunc) { debugFile->writeEndFunction (currFunc, ic, 1); @@ -3626,6 +3566,11 @@ void pic16_storeForReturn(operand *op, int offset, pCodeOp *dest) if(dest->type != PO_WREG) pic16_emitpcode(POC_MOVWF, dest); } else { + if(dest->type == PO_WREG && (offset == 0)) { + pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(op), offset)); + return; + } + pic16_emitpcode(POC_MOVFF, pic16_popGet2p( pic16_popGet(AOP(op), offset), dest)); } @@ -3750,7 +3695,7 @@ jumpret: && IC_LABEL(ic->next) == returnLabel)) { pic16_emitpcode(POC_GOTO,pic16_popGetLabel(returnLabel->key)); - pic16_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset); + pic16_emitcode("goto","_%05d_DS_",returnLabel->key+100 + pic16_labelOffset); } } @@ -3767,7 +3712,7 @@ static void genLabel (iCode *ic) return ; pic16_emitpLabel(IC_LABEL(ic)->key); - pic16_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset)); + pic16_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + pic16_labelOffset)); } /*-----------------------------------------------------------------*/ @@ -3777,7 +3722,7 @@ static void genLabel (iCode *ic) static void genGoto (iCode *ic) { pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_LABEL(ic)->key)); - pic16_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset); + pic16_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+pic16_labelOffset); } @@ -4344,11 +4289,11 @@ static void genIfxJump (iCode *ic, char *jval) emitSKPC; else { DEBUGpic16_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(jval,-1,1)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(jval,-1,1, PO_GPR_REGISTER)); } pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_TRUE(ic)->key)); - pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + labelOffset); + pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ic)->key+100 + pic16_labelOffset); } else { @@ -4359,11 +4304,11 @@ static void genIfxJump (iCode *ic, char *jval) emitSKPNC; else { DEBUGpic16_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval); - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(jval,-1,1)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(jval,-1,1, PO_GPR_REGISTER)); } pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_FALSE(ic)->key)); - pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + labelOffset); + pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ic)->key+100 + pic16_labelOffset); } @@ -4401,7 +4346,7 @@ static void genSkip(iCode *ifx,int status_bit) } pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_TRUE(ifx)->key)); - // pic16_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + // pic16_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+pic16_labelOffset); } else { @@ -4420,7 +4365,7 @@ static void genSkip(iCode *ifx,int status_bit) break; } pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_FALSE(ifx)->key)); - // pic16_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + // pic16_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+pic16_labelOffset); } @@ -4485,9 +4430,9 @@ static void genSkipz(iCode *ifx, int condition) pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_FALSE(ifx)->key)); if ( IC_TRUE(ifx) ) - pic16_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic16_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+pic16_labelOffset); else - pic16_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic16_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+pic16_labelOffset); } #endif @@ -4501,9 +4446,9 @@ static void genSkipCond(resolvedIfx *rifx,operand *op, int offset, int bit) return; if(rifx->condition) - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(op),offset,FALSE,FALSE),bit,0, PO_GPR_REGISTER)); else - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(op),offset,FALSE,FALSE),bit,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(op),offset,FALSE,FALSE),bit,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_GOTO,pic16_popGetLabel(rifx->lbl->key)); @@ -4599,7 +4544,7 @@ static void genCmp (operand *left,operand *right, #if 0 fprintf(stderr, "%s:%s:%d truelbl: %d\tlbl: %d\n", - __FILE__, __FUNCTION__, __LINE__, truelbl->key+100+labelOffset, lbl->key+100+labelOffset); + __FILE__, __FUNCTION__, __LINE__, truelbl->key+100+pic16_labelOffset, lbl->key+100+pic16_labelOffset); #endif #ifndef _swapp @@ -4681,7 +4626,7 @@ static void genCmp (operand *left,operand *right, //genSkipCond(&rFalseIfx,left,size,7); //rFalseIfx.condition ^= 1; - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); if(rFalseIfx.condition) pic16_emitpcode(POC_GOTO, pic16_popGetLabel(rFalseIfx.lbl->key)); else @@ -4751,7 +4696,7 @@ static void genCmp (operand *left,operand *right, //genSkipCond(&rFalseIfx,left,size,7); - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); if(rFalseIfx.condition) pic16_emitpcode(POC_GOTO, pic16_popGetLabel(truelbl->key)); @@ -4762,7 +4707,7 @@ static void genCmp (operand *left,operand *right, } else { /* lit is positive */ DEBUGpic16_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); if(rFalseIfx.condition) pic16_emitpcode(POC_GOTO, pic16_popGetLabel(rFalseIfx.lbl->key)); else @@ -4961,7 +4906,7 @@ static void genCmp (operand *left,operand *right, int s = size; if(rFalseIfx.condition) { - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_GOTO, pic16_popGetLabel(truelbl->key)); } @@ -5004,7 +4949,7 @@ static void genCmp (operand *left,operand *right, //rFalseIfx.condition ^= 1; //genSkipCond(&rFalseIfx,left,size,7); //rFalseIfx.condition ^= 1; - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); //pic16_emitpcode(POC_GOTO, pic16_popGetLabel(truelbl->key)); if(rFalseIfx.condition) @@ -5023,7 +4968,7 @@ static void genCmp (operand *left,operand *right, //pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0)); //pic16_emitpcode(POC_GOTO, pic16_popGetLabel(rFalseIfx.lbl->key)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size,FALSE,FALSE),7,0, PO_GPR_REGISTER)); if(rFalseIfx.condition) pic16_emitpcode(POC_GOTO, pic16_popGetLabel(truelbl->key)); else @@ -5798,7 +5743,7 @@ static void genCmpEq (iCode *ic, iCode *ifx) pic16_emitcode("jc","%05d_DS_",tlbl->key+100); pic16_emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100); } - pic16_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + pic16_emitcode("","%05d_DS_:",tlbl->key+100+pic16_labelOffset); { /* left and right are both bit variables, result is carry */ @@ -5915,11 +5860,11 @@ static void genCmpEq (iCode *ic, iCode *ifx) if ( IC_TRUE(ifx) ) { emitSKPNZ; pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_TRUE(ifx)->key)); - // pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + // pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+pic16_labelOffset); } else { emitSKPZ; pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_FALSE(ifx)->key)); - // pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + // pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+pic16_labelOffset); } } else { @@ -5939,7 +5884,7 @@ static void genCmpEq (iCode *ic, iCode *ifx) DEBUGpic16_emitcode (";","\tIC_TRUE emitSKPZ"); pic16_emitpcode(POC_GOTO,pic16_popGetLabel(tlbl->key)); - pic16_emitcode(" goto","_%05d_DS_",tlbl->key+100+labelOffset); + pic16_emitcode(" goto","_%05d_DS_",tlbl->key+100+pic16_labelOffset); } else { emitSKPNZ; @@ -5947,7 +5892,7 @@ static void genCmpEq (iCode *ic, iCode *ifx) pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_TRUE(ifx)->key)); - pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset); + pic16_emitcode(" goto","_%05d_DS_",IC_TRUE(ifx)->key+100+pic16_labelOffset); } } else { emitSKPZ; @@ -5955,13 +5900,13 @@ static void genCmpEq (iCode *ic, iCode *ifx) DEBUGpic16_emitcode (";","\tnot IC_TRUE emitSKPZ"); pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_FALSE(ifx)->key)); - pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset); + pic16_emitcode(" goto","_%05d_DS_",IC_FALSE(ifx)->key+100+pic16_labelOffset); } offset++; } if(s>1 && IC_TRUE(ifx)) { pic16_emitpLabel(tlbl->key); - pic16_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset); + pic16_emitcode("","_%05d_DS_:",tlbl->key+100+pic16_labelOffset); } } } @@ -6202,9 +6147,9 @@ static void genOrOp (iCode *ic) tlbl = newiTempLabel(NULL); pic16_toBoolean(left); emitSKPZ; - pic16_emitcode("goto","%05d_DS_",tlbl->key+100+labelOffset); + pic16_emitcode("goto","%05d_DS_",tlbl->key+100+pic16_labelOffset); pic16_toBoolean(right); - pic16_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset); + pic16_emitcode("","%05d_DS_:",tlbl->key+100+pic16_labelOffset); pic16_outBitAcc(result); } @@ -6408,7 +6353,7 @@ static void genAnd (iCode *ic, iCode *ifx) } pic16_emitpcode(((rIfx.condition) ? POC_BTFSC : POC_BTFSS), - pic16_newpCodeOpBit(pic16_aopGet(AOP(left),ofs,FALSE,FALSE),bp,0)); + pic16_newpCodeOpBit(pic16_aopGet(AOP(left),ofs,FALSE,FALSE),bp,0, PO_GPR_REGISTER)); } /* @@ -6478,7 +6423,7 @@ static void genAnd (iCode *ic, iCode *ifx) if(p>=0) { /* only one bit is set in the literal, so use a bcf instruction */ // pic16_emitcode("bcf","%s,%d",pic16_aopGet(AOP(left),offset,FALSE,TRUE),p); - pic16_emitpcode(POC_BCF,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offset,FALSE,FALSE),p,0)); + pic16_emitpcode(POC_BCF,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offset,FALSE,FALSE),p,0, PO_GPR_REGISTER)); } else { pic16_emitcode("movlw","0x%x", (lit & 0xff)); @@ -6782,7 +6727,7 @@ static void genOr (iCode *ic, iCode *ifx) if(p>=0) { /* only one bit is set in the literal, so use a bsf instruction */ pic16_emitpcode(POC_BSF, - pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offset,FALSE,FALSE),p,0)); + pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offset,FALSE,FALSE),p,0, PO_GPR_REGISTER)); } else { if(know_W != (lit & 0xff)) pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit & 0xff)); @@ -7502,7 +7447,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, pic16_emitpcode(POC_RLCFW, pic16_popGet(AOP(result),offr)); pic16_emitpcode(POC_ANDLW, pic16_popGetLit(0x1f)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),3,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),3,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW, pic16_popGetLit(0xe0)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offr)); @@ -7511,7 +7456,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, case 4: pic16_emitpcode(POC_SWAPFW, pic16_popGet(AOP(left),offl)); pic16_emitpcode(POC_ANDLW, pic16_popGetLit(0x0f)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW, pic16_popGetLit(0xf0)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offr)); break; @@ -7524,7 +7469,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, } pic16_emitpcode(POC_RRCFW, pic16_popGet(AOP(result),offr)); pic16_emitpcode(POC_ANDLW, pic16_popGetLit(0x07)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),3,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),3,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW, pic16_popGetLit(0xf8)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offr)); break; @@ -7532,29 +7477,29 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, case 6: if(same) { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0x00)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xfe)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),6,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),6,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW, pic16_popGetLit(0x01)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offr)); } else { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offr)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offr)); - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),6,0)); - pic16_emitpcode(POC_BCF, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),0,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),6,0, PO_GPR_REGISTER)); + pic16_emitpcode(POC_BCF, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),0,0, PO_GPR_REGISTER)); } break; case 7: if(same) { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0x00)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),LSB,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offr)); } else { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offr)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offr)); } @@ -7973,7 +7918,7 @@ static void shiftR2Left2Result (operand *left, int offl, if(sign) { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xf0 + (shCount-4)*8 )); pic16_emitpcode(POC_BTFSC, - pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),7-shCount,0)); + pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),7-shCount,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result),offr+MSB16)); } @@ -7991,7 +7936,7 @@ static void shiftR2Left2Result (operand *left, int offl, pic16_emitpcode(POC_ANDLW,pic16_popGetLit(0x03)); if(sign) { pic16_emitpcode(POC_BTFSC, - pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),1,0)); + pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),1,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW,pic16_popGetLit(0xfc)); } pic16_emitpcode(POC_XORFW,pic16_popGet(AOP(result),offr+MSB16)); @@ -8009,7 +7954,7 @@ static void shiftR2Left2Result (operand *left, int offl, pic16_emitpcode(POC_ANDLW,pic16_popGetLit(0x03)); if(sign) { pic16_emitpcode(POC_BTFSC, - pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),0,0)); + pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr+MSB16,FALSE,FALSE),0,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_IORLW,pic16_popGetLit(0xfc)); } pic16_emitpcode(POC_MOVWF,pic16_popGet(AOP(result),offr+MSB16)); @@ -8400,15 +8345,15 @@ static void genLeftShift (iCode *ic) if(optimized_for_speed) { pic16_emitpcode(POC_SWAPFW, pic16_popGet(AOP(left),0)); pic16_emitpcode(POC_ANDLW, pic16_popGetLit(0xf0)); - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),2,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),2,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(left),0)); pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),0)); - pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),0,0)); + pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),0,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result),0)); pic16_emitpcode(POC_RLCFW, pic16_popGet(AOP(result),0)); pic16_emitpcode(POC_ANDLW, pic16_popGetLit(0xfe)); pic16_emitpcode(POC_ADDFW, pic16_popGet(AOP(result),0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),1,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),1,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result),0)); } else { @@ -8534,7 +8479,7 @@ static void genrshTwo (operand *result,operand *left, pic16_emitpcode(POC_CLRF,pic16_popGet(AOP(result),MSB16)); if(sign) { - pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),LSB,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),LSB,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),MSB16)); } } @@ -8703,14 +8648,14 @@ static void genRightShiftLiteral (operand *left, if(res_size == 1) { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),LSB)); if(sign) { - pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),LSB)); } } else { if(sign) { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); while(res_size--) pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),res_size)); @@ -10995,7 +10940,7 @@ static void genCast (iCode *ic) /* we need to or */ if (AOP_TYPE(right) == AOP_REG) { pic16_emitpcode(POC_BCF, pic16_popGet(AOP(result),0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),0,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),0,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_BSF, pic16_popGet(AOP(result),0)); } pic16_toBoolean(right); @@ -11221,15 +11166,15 @@ static void genCast (iCode *ic) if(size == 1) { /* Save one instruction of casting char to int */ pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); } else { pic16_emitpcode(POC_CLRF,pic16_popCopyReg(&pic16_pc_wreg)); if(offset) - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); else - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); @@ -11292,7 +11237,7 @@ static int genDjnz (iCode *ic, iCode *ifx) pic16_emitpcode(POC_GOTO,pic16_popGetLabel(IC_TRUE(ifx)->key)); pic16_emitcode("decfsz","%s,f",pic16_aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE)); - pic16_emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + labelOffset); + pic16_emitcode ("goto","_%05d_DS_",IC_TRUE(ifx)->key+100 + pic16_labelOffset); } /* pic16_emitcode ("sjmp","%05d_DS_",lbl1->key+100); */ @@ -11313,6 +11258,12 @@ static void genReceive (iCode *ic) { DEBUGpic16_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__); +#if 0 + fprintf(stderr, "%s:%d %s for symbol %s\tonStack: %d\n", __FILE__, __LINE__, __FUNCTION__, + OP_SYMBOL( IC_RESULT(ic) )->rname, OP_SYMBOL( IC_RESULT(ic) )->onStack); +#endif +// pic16_DumpOp(__FUNCTION__, IC_RESULT(ic)); + if (isOperandInFarSpace(IC_RESULT(ic)) && ( OP_SYMBOL(IC_RESULT(ic))->isspilt || IS_TRUE_SYMOP(IC_RESULT(ic))) ) { @@ -11320,6 +11271,7 @@ static void genReceive (iCode *ic) int size = getSize(operandType(IC_RESULT(ic))); int offset = pic16_fReturnSizePic - size; + assert( 0 ); while (size--) { pic16_emitcode ("push","%s", (strcmp(fReturn[pic16_fReturnSizePic - offset - 1],"a") ? fReturn[pic16_fReturnSizePic - offset - 1] : "acc")); diff --git a/src/pic16/genarith.c b/src/pic16/genarith.c index ae71c24a..83212de5 100644 --- a/src/pic16/genarith.c +++ b/src/pic16/genarith.c @@ -103,7 +103,7 @@ const char *pic16_AopType(short type) return "BAD TYPE"; } -const char *pic16_pCodeOpType( pCodeOp *pcop) +const char *pic16_pCodeOpType(pCodeOp *pcop) { if(pcop) { @@ -168,6 +168,71 @@ const char *pic16_pCodeOpType( pCodeOp *pcop) return "BAD PO_TYPE"; } +const char *pic16_pCodeOpSubType(pCodeOp *pcop) +{ + + if(pcop && (pcop->type == PO_GPR_BIT)) { + + switch(PCORB(pcop)->subtype) { + + case PO_NONE: + return "PO_NONE"; + case PO_W: + return "PO_W"; + case PO_WREG: + return "PO_WREG"; + case PO_STATUS: + return "PO_STATUS"; + case PO_BSR: + return "PO_BSR"; + case PO_FSR0: + return "PO_FSR0"; + case PO_INDF0: + return "PO_INDF0"; + case PO_INTCON: + return "PO_INTCON"; + case PO_GPR_REGISTER: + return "PO_GPR_REGISTER"; + case PO_GPR_BIT: + return "PO_GPR_BIT"; + case PO_GPR_TEMP: + return "PO_GPR_TEMP"; + case PO_SFR_REGISTER: + return "PO_SFR_REGISTER"; + case PO_PCL: + return "PO_PCL"; + case PO_PCLATH: + return "PO_PCLATH"; + case PO_PCLATU: + return "PO_PCLATU"; + case PO_PRODL: + return "PO_PRODL"; + case PO_PRODH: + return "PO_PRODH"; + case PO_LITERAL: + return "PO_LITERAL"; + case PO_REL_ADDR: + return "PO_REL_ADDR"; + case PO_IMMEDIATE: + return "PO_IMMEDIATE"; + case PO_DIR: + return "PO_DIR"; + case PO_CRY: + return "PO_CRY"; + case PO_BIT: + return "PO_BIT"; + case PO_STR: + return "PO_STR"; + case PO_LABEL: + return "PO_LABEL"; + case PO_WILD: + return "PO_WILD"; + } + } + + return "BAD PO_TYPE"; +} + /*-----------------------------------------------------------------*/ /* pic16_genPlusIncr :- does addition with increment if possible */ /*-----------------------------------------------------------------*/ @@ -1025,7 +1090,7 @@ void pic16_genPlus (iCode *ic) // right is signed, oh dear ... for(i=size; i< AOP_SIZE(result); i++) { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),i)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),size-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),size-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_COMF, pic16_popGet(AOP(result),i)); pic16_emitpcode(POC_MOVLW, pic16_popGet(AOP(left),i)); pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),i)); @@ -1076,7 +1141,7 @@ void pic16_genPlus (iCode *ic) for(i=size; i< AOP_SIZE(result); i++) { if(size < AOP_SIZE(left)) { pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_COMFW, pic16_popCopyReg(&pic16_pc_wreg)); if (pic16_sameRegs(AOP(left), AOP(result))) { @@ -1116,15 +1181,15 @@ void pic16_genPlus (iCode *ic) /* Now this is really horrid. Gotta check the sign of the addends and propogate * to the result */ - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_LEFT(ic)),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_LEFT(ic)),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(IC_RESULT(ic)),offset)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RIGHT(ic)),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RIGHT(ic)),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(IC_RESULT(ic)),offset)); /* if chars or ints or being signed extended to longs: */ if(size) { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); } } @@ -1268,12 +1333,12 @@ void pic16_addSign(operand *result, int offset, int sign) if(size == 1) { pic16_emitpcode(POC_CLRF,pic16_popGet(AOP(result),offset)); - pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); } else { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); while(size--) pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset+size)); @@ -1345,8 +1410,8 @@ void pic16_genMinus (iCode *ic) /* if I can do an decrement instead of subtract then GOOD for ME */ - // if (pic16_genMinusDec (ic) == TRUE) - // goto release; +// if (pic16_genMinusDec (ic) == TRUE) +// goto release; size = pic16_getDataSize(IC_RESULT(ic)); same = pic16_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))); @@ -2006,10 +2071,10 @@ void pic16_genSMult8X8_8 (operand *left, #if 0 - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),0,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),0,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_SUBWF, pic16_popCopyReg(result_hi)); pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(left),0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),7,0)); + pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),7,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_SUBWF, pic16_popGet(AOP(result),1)); #endif } diff --git a/src/pic16/glue.c b/src/pic16/glue.c index 0792e8ca..b0c21d45 100644 --- a/src/pic16/glue.c +++ b/src/pic16/glue.c @@ -132,7 +132,8 @@ pic16emitRegularMap (memmap * map, bool addPublics, bool arFlag) for (sym = setFirstItem (map->syms); sym; sym = setNextItem (map->syms)) { #if 0 - fprintf(stderr, "\t%s: sym: %s\tused: %d\textern: %d\tstatic: %d\taggregate: %d\n", + fprintf(stderr, "%s\t%s: sym: %s\tused: %d\textern: %d\tstatic: %d\taggregate: %d\n", + __FUNCTION__, map->sname, sym->name, sym->used, IS_EXTERN(sym->etype), IS_STATIC(sym->etype), IS_AGGREGATE(sym->type)); printTypeChain( sym->type, stderr ); @@ -188,7 +189,18 @@ pic16emitRegularMap (memmap * map, bool addPublics, bool arFlag) #endif reg = pic16_allocDirReg( operandFromSymbol( sym )); - checkAddReg(&pic16_rel_udata, reg); +// addSet(&pic16_dynAllocRegs, reg); + + { + sectSym *ssym; + int found=0; + + for(ssym=setFirstItem(sectSyms); ssym; ssym=setNextItem(sectSyms)) { + if(!strcmp(ssym->name, reg->name))found=1; + } + + if(!found)checkAddReg(&pic16_rel_udata, reg); + } } /* if extern then do nothing or is a function @@ -277,10 +289,26 @@ pic16emitRegularMap (memmap * map, bool addPublics, bool arFlag) } else { reg = pic16_allocDirReg( operandFromSymbol( sym ) ); } - if(checkAddReg(&pic16_rel_udata, reg)) { - addSetHead(&publics, sym); + + { + sectSym *ssym; + int found=0; + + for(ssym=setFirstItem(sectSyms); ssym; ssym=setNextItem(sectSyms)) { + if(!strcmp(ssym->name, reg->name))found=1; + } + + if(!found) + if(checkAddReg(&pic16_rel_udata, reg)) { + addSetHead(&publics, sym); + } + } + + + } else + addSetHead(&publics, sym); } @@ -842,6 +870,7 @@ int pic16_printIvalCharPtr (symbol * sym, sym_link * type, value * val, char pty { fprintf (stderr, "*** internal error: unknown size in " "printIvalCharPtr.\n"); + assert(0); } } else @@ -860,7 +889,6 @@ int pic16_printIvalCharPtr (symbol * sym, sym_link * type, value * val, char pty pic16_emitDB(pic16aopLiteral(val, 0), ptype, p); pic16_emitDB(pic16aopLiteral(val, 1), ptype, p); pic16_emitDB(pic16aopLiteral(val, 2), ptype, p); - break; default: @@ -868,8 +896,9 @@ int pic16_printIvalCharPtr (symbol * sym, sym_link * type, value * val, char pty } } - if (val->sym && val->sym->isstrlit && !isinSet(statsg->syms, val->sym)) { - addSet (&statsg->syms, val->sym); + if (val->sym && val->sym->isstrlit) { // && !isinSet(statsg->syms, val->sym)) { + if(ptype == 'p' && !isinSet(statsg->syms, val->sym))addSet (&statsg->syms, val->sym); + else if(ptype == 'f' /*&& !isinSet(rel_idataSymSet, val->sym)*/)addSet(&rel_idataSymSet, val->sym); } return 1; @@ -928,7 +957,6 @@ void pic16_printIvalPtr (symbol * sym, sym_link * type, initList * ilist, char p value *val; int size; - #if 0 fprintf(stderr, "%s:%d initialising pointer: %s size: %d\n", __FILE__, __LINE__, sym->rname, getSize(sym->type)); @@ -975,6 +1003,8 @@ void pic16_printIvalPtr (symbol * sym, sym_link * type, initList * ilist, char p pic16_emitDB(pic16aopLiteral(val, 0), ptype, p); pic16_emitDB(pic16aopLiteral(val, 1), ptype, p); pic16_emitDB(pic16aopLiteral(val, 2), ptype, p); + default: + assert(0); } return; } @@ -995,7 +1025,8 @@ void pic16_printIvalPtr (symbol * sym, sym_link * type, initList * ilist, char p pic16_printGPointerType (val->name, sym->name, (IS_PTR(type)?DCL_TYPE(type):PTR_TYPE(SPEC_OCLS(sym->etype))), (IS_PTR (val->type) ? DCL_TYPE (val->type) : PTR_TYPE (SPEC_OCLS (val->etype))), ptype, p); - } + } else + assert(0); return; } @@ -1011,8 +1042,12 @@ void pic16_printIval (symbol * sym, sym_link * type, initList * ilist, char ptyp if (!p) return; -// fprintf(stderr, "%s:%d generating init for %s\n", __FILE__, __LINE__, sym->name); - +#if 0 + fprintf(stderr, "%s:%d generating init for %s\n", __FILE__, __LINE__, sym->name); + fprintf(stderr, "%s: IS_STRUCT: %d IS_ARRAY: %d IS_PTR: %d IS_SPEC: %d\n", sym->name, + IS_STRUCT(type), IS_ARRAY(type), IS_PTR(type), IS_SPEC(type)); +#endif + /* if structure then */ if (IS_STRUCT (type)) { @@ -1094,8 +1129,6 @@ pic16emitStaticSeg (memmap * map) { symbol *sym; - fprintf (map->oFile, ";\t.area\t%s\n", map->sname); - //fprintf(stderr, "%s\n",__FUNCTION__); pic16_initDB(); @@ -1106,8 +1139,8 @@ pic16emitStaticSeg (memmap * map) { #if 0 - fprintf(stderr, "\t%s: sym: %s\tused: %d\tSPEC_ABSA: %d\tSPEC_AGGREGATE: %d\tCODE: %d\n\ -CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", + fprintf(stderr, "%s\t%s: sym: %s\tused: %d\tSPEC_ABSA: %d\tSPEC_AGGREGATE: %d\tCODE: %d\n\ +CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", __FUNCTION__, map->sname, sym->name, sym->used, SPEC_ABSA(sym->etype), IS_AGGREGATE(sym->type), IS_CODE(sym->etype), IN_CODESPACE( SPEC_OCLS(sym->etype)), IS_CONSTANT(sym->etype), IS_PTR_CONST(sym->etype), SPEC_CONST(sym->etype)); @@ -1172,6 +1205,7 @@ CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", pic16_addpCode2pBlock(pb,pcf); pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(sym->rname,-1)); +// fprintf(stderr, "%s:%d [1] generating init for label: %s\n", __FILE__, __LINE__, sym->rname); pic16_printIval(sym, sym->type, sym->ival, 'p', (void *)pb); pic16_flushDB('p', (void *)pb); @@ -1188,11 +1222,13 @@ CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", /* special case for character strings */ if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) && - SPEC_CVAL (sym->etype).v_char) + SPEC_CVAL (sym->etype).v_char) { + +// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, sym->rname); + pic16_pCodeConstString(sym->rname , SPEC_CVAL (sym->etype).v_char); - else { + } else { assert(0); - fprintf (code->oFile, "\t.ds\t0x%04x\n", (unsigned int) getSize (sym->type) & 0xffff); } } @@ -1211,8 +1247,10 @@ CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", pb = pic16_newpCodeChain(NULL, 'P',pic16_newpCodeCharP("; Starting pCode block for Ival")); pic16_addpBlock(pb); - pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(sym->rname,-1)); +// fprintf(stderr, "%s:%d [2] generating init for label: %s\n", __FILE__, __LINE__, sym->rname); + + pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(sym->rname,-1)); pic16_printIval(sym, sym->type, sym->ival, 'p', (void *)pb); pic16_flushDB('p', (void *)pb); noAlloc--; @@ -1220,14 +1258,17 @@ CODESPACE: %d\tCONST: %d\tPTRCONST: %d\tSPEC_CONST: %d\n", /* symbol doesn't have absolute address and no initial value */ /* allocate space */ +// fprintf(stderr, "%s:%d [3] generating init for label: %s\n", __FILE__, __LINE__, sym->rname); fprintf (code->oFile, "%s:\n", sym->rname); /* special case for character strings */ if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) && - SPEC_CVAL (sym->etype).v_char) + SPEC_CVAL (sym->etype).v_char) { + +// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, sym->rname); + pic16_pCodeConstString(sym->rname , SPEC_CVAL (sym->etype).v_char); - else { + } else { assert(0); - fprintf (code->oFile, "\t.ds\t0x%04x\n", (unsigned int) getSize (sym->type) & 0xffff); } } } @@ -1285,7 +1326,6 @@ pic16createInterruptVect (FILE * vFile) if((!pic16_options.omit_ivt) || (pic16_options.omit_ivt && pic16_options.leave_reset)) { fprintf (vFile, ";\t.area\t%s\n", CODE_NAME); fprintf(vFile, ".intvecs\tcode\t0x%06x\n", pic16_options.ivt_loc); - fprintf (vFile, "__interrupt_vect:\n"); /* this is an overkill since WE are the port, * and we know if we have a genIVT function! */ @@ -1491,9 +1531,9 @@ pic16glue () if(initsfpnt) { pic16_addpCode2pBlock(pb, pic16_newpCode(POC_LFSR, - pic16_popGetLit2(1, pic16_newpCodeOpRegFromStr("stack")))); + pic16_popGetLit2(1, pic16_newpCodeOpRegFromStr("_stack")))); pic16_addpCode2pBlock(pb, pic16_newpCode(POC_LFSR, - pic16_popGetLit2(2, pic16_newpCodeOpRegFromStr("stack")))); + pic16_popGetLit2(2, pic16_newpCodeOpRegFromStr("_stack")))); } /* put in the call to main */ diff --git a/src/pic16/main.c b/src/pic16/main.c index 2cd6e6db..36b8ef06 100644 --- a/src/pic16/main.c +++ b/src/pic16/main.c @@ -137,13 +137,18 @@ int initsfpnt=0; /* set to 1 if source provides a pragma for stack * so glue() later emits code to initialize stack/frame pointers */ set *absSymSet; +set *sectNames=NULL; /* list of section listed in pragma directives */ +set *sectSyms=NULL; /* list of symbols set in a specific section */ + + static int _process_pragma(const char *sz) { - static const char *WHITE = " \t"; + static const char *WHITE = " \t\n"; char *ptr = strtok((char *)sz, WHITE); + /* #pragma maxram [maxram] */ if (startsWith (ptr, "maxram")) { char *maxRAM = strtok((char *)NULL, WHITE); @@ -157,6 +162,7 @@ _process_pragma(const char *sz) } } + /* #pragma stack [stack-position] */ if(startsWith(ptr, "stack")) { char *stackPosS = strtok((char *)NULL, WHITE); value *stackPosVal; @@ -179,6 +185,7 @@ _process_pragma(const char *sz) return 0; } + /* #pragma code [symbol] [location] */ if(startsWith(ptr, "code")) { char *symname = strtok((char *)NULL, WHITE); char *location = strtok((char *)NULL, WHITE); @@ -195,8 +202,49 @@ _process_pragma(const char *sz) __FILE__, __LINE__, symname, absS->address); return 0; - } + } + /* #pragma udata [section-name] [symbol] */ + if(startsWith(ptr, "udata")) { + char *sectname = strtok((char *)NULL, WHITE); + char *symname = strtok((char *)NULL, WHITE); + sectSym *ssym; + sectName *snam; + int found=0; + + while(symname) { + + ssym = Safe_calloc(1, sizeof(sectSyms)); + ssym->name = Safe_calloc(1, strlen(symname)+2); + sprintf(ssym->name, "_%s", symname); + ssym->reg = NULL; + + addSet(§Syms, ssym); + + found = 0; + for(snam=setFirstItem(sectNames);snam;snam=setNextItem(sectNames)) { + if(!strcmp(sectname, snam->name)){ found=1; break; } + } + + if(!found) { + snam = Safe_calloc(1, sizeof(sectNames)); + snam->name = Safe_strdup( sectname ); + snam->regsSet = NULL; + + addSet(§Names, snam); + } + + ssym->section = snam; + +// fprintf(stderr, "%s:%d placing symbol %s at section %s (%p)\n", __FILE__, __LINE__, +// ssym->name, snam->name, snam); + + symname = strtok((char *)NULL, WHITE); + } + + return 0; + } + return 1; } diff --git a/src/pic16/main.h b/src/pic16/main.h index 9cc78d05..6bda4099 100644 --- a/src/pic16/main.h +++ b/src/pic16/main.h @@ -1,6 +1,8 @@ #ifndef MAIN_INCLUDE #define MAIN_INCLUDE +#include "ralloc.h" + bool x_parseOptions (char **argv, int *pargc); void x_setDefaultOptions (void); void x_finaliseOptions (void); @@ -15,8 +17,20 @@ typedef struct absSym { unsigned int address; } absSym; +typedef struct sectName { + char *name; + set *regsSet; +} sectName; + +typedef struct sectSym { + sectName *section; + char *name; + regs *reg; +} sectSym; extern set *absSymSet; +extern set *sectNames; +extern set *sectSyms; #endif diff --git a/src/pic16/pcode.c b/src/pic16/pcode.c index 8db953bb..619e67b1 100644 --- a/src/pic16/pcode.c +++ b/src/pic16/pcode.c @@ -2690,6 +2690,33 @@ pCodeInstruction pic16_pciXORLW = { }; +pCodeInstruction pic16_pciBANKSEL = { + {PC_OPCODE, NULL, NULL, 0, NULL, + genericDestruct, + genericPrint}, + POC_BANKSEL, + "BANKSEL", + NULL, // from branch + NULL, // to branch + NULL, // label + NULL, // operand + NULL, // flow block + NULL, // C source + 0, // num ops + 0,0, // dest, bit instruction + 0,0, // branch, skip + 0, // literal operand + 0, // RAM access bit + 0, // fast call/return mode select bit + 0, // second memory operand + 0, // second literal operand + POC_NOP, + PCC_NONE, // inCond + PCC_NONE, // outCond + PCI_MAGIC +}; + + #define MAX_PIC16MNEMONICS 100 pCodeInstruction *pic16Mnemonics[MAX_PIC16MNEMONICS]; @@ -2999,7 +3026,7 @@ void pic16initMnemonics(void) pic16Mnemonics[POC_RETURN] = &pic16_pciRETURN; pic16Mnemonics[POC_RLCF] = &pic16_pciRLCF; pic16Mnemonics[POC_RLCFW] = &pic16_pciRLCFW; - pic16Mnemonics[POC_RLNCF] = &pic16_pciRLNCF; // was [POC_RLCF] !!! + pic16Mnemonics[POC_RLNCF] = &pic16_pciRLNCF; pic16Mnemonics[POC_RLNCFW] = &pic16_pciRLNCFW; pic16Mnemonics[POC_RRCF] = &pic16_pciRRCF; pic16Mnemonics[POC_RRCFW] = &pic16_pciRRCFW; @@ -3015,18 +3042,19 @@ void pic16initMnemonics(void) pic16Mnemonics[POC_SUBFWB_D1] = &pic16_pciSUBFWB_D1; pic16Mnemonics[POC_SWAPF] = &pic16_pciSWAPF; pic16Mnemonics[POC_SWAPFW] = &pic16_pciSWAPFW; - pic16Mnemonics[POC_TBLRD] = &pic16_pciTBLRD; // patch 15 - pic16Mnemonics[POC_TBLRD_POSTINC] = &pic16_pciTBLRD_POSTINC; // - pic16Mnemonics[POC_TBLRD_POSTDEC] = &pic16_pciTBLRD_POSTDEC; // - pic16Mnemonics[POC_TBLRD_PREINC] = &pic16_pciTBLRD_PREINC; // - pic16Mnemonics[POC_TBLWT] = &pic16_pciTBLWT; // - pic16Mnemonics[POC_TBLWT_POSTINC] = &pic16_pciTBLWT_POSTINC; // - pic16Mnemonics[POC_TBLWT_POSTDEC] = &pic16_pciTBLWT_POSTDEC; // - pic16Mnemonics[POC_TBLWT_PREINC] = &pic16_pciTBLWT_PREINC; // patch 15 + pic16Mnemonics[POC_TBLRD] = &pic16_pciTBLRD; + pic16Mnemonics[POC_TBLRD_POSTINC] = &pic16_pciTBLRD_POSTINC; + pic16Mnemonics[POC_TBLRD_POSTDEC] = &pic16_pciTBLRD_POSTDEC; + pic16Mnemonics[POC_TBLRD_PREINC] = &pic16_pciTBLRD_PREINC; + pic16Mnemonics[POC_TBLWT] = &pic16_pciTBLWT; + pic16Mnemonics[POC_TBLWT_POSTINC] = &pic16_pciTBLWT_POSTINC; + pic16Mnemonics[POC_TBLWT_POSTDEC] = &pic16_pciTBLWT_POSTDEC; + pic16Mnemonics[POC_TBLWT_PREINC] = &pic16_pciTBLWT_PREINC; pic16Mnemonics[POC_TSTFSZ] = &pic16_pciTSTFSZ; pic16Mnemonics[POC_XORLW] = &pic16_pciXORLW; pic16Mnemonics[POC_XORWF] = &pic16_pciXORWF; pic16Mnemonics[POC_XORFW] = &pic16_pciXORFW; + pic16Mnemonics[POC_BANKSEL] = &pic16_pciBANKSEL; for(i=0; itype = PO_GPR_BIT; if(s) @@ -3938,6 +3967,7 @@ pCodeOp *pic16_newpCodeOpBit(char *s, int bit, int inBitSpace) PCORB(pcop)->bit = bit; PCORB(pcop)->inBitSpace = inBitSpace; + PCORB(pcop)->subtype = subt; /* pCodeOpBit is derived from pCodeOpReg. We need to init this too */ PCOR(pcop)->r = NULL; @@ -3945,6 +3975,7 @@ pCodeOp *pic16_newpCodeOpBit(char *s, int bit, int inBitSpace) return pcop; } + /*-----------------------------------------------------------------* * pCodeOp *pic16_newpCodeOpReg(int rIdx) - allocate a new register * @@ -4010,7 +4041,7 @@ pCodeOp *pic16_newpCodeOp(char *name, PIC_OPTYPE type) switch(type) { case PO_BIT: case PO_GPR_BIT: - pcop = pic16_newpCodeOpBit(name, -1,0); + pcop = pic16_newpCodeOpBit(name, -1,0, type); break; case PO_LITERAL: @@ -4104,6 +4135,8 @@ void pic16_emitDB(char c, char ptype, void *p) l = strlen(DBd.buffer); sprintf(DBd.buffer+l,"%s0x%02x", (DBd.count>0?", ":""), c & 0xff); +// fprintf(stderr, "%s:%d DBbuffer: '%s'\n", __FILE__, __LINE__, DBd.buffer); + DBd.count++; if (DBd.count>= DB_ITEMS_PER_LINE) pic16_flushDB(ptype, p); @@ -4123,6 +4156,8 @@ void pic16_emitDS(char *s, char ptype, void *p) l = strlen(DBd.buffer); sprintf(DBd.buffer+l,"%s%s", (DBd.count>0?", ":""), s); +// fprintf(stderr, "%s:%d DBbuffer: '%s'\n", __FILE__, __LINE__, DBd.buffer); + DBd.count++; //=strlen(s); if (DBd.count>=16) pic16_flushDB(ptype, p); @@ -4987,9 +5022,9 @@ static pBranch *pBranchFind(pBranch *pb,pCode *pc) } /*-----------------------------------------------------------------*/ -/* pCodeUnlink - Unlink the given pCode from its pCode chain. */ +/* pic16_pCodeUnlink - Unlink the given pCode from its pCode chain. */ /*-----------------------------------------------------------------*/ -static void pCodeUnlink(pCode *pc) +void pic16_pCodeUnlink(pCode *pc) { pBranch *pb1,*pb2; pCode *pc1; @@ -5007,21 +5042,21 @@ static void pCodeUnlink(pCode *pc) /* Remove the branches */ - pb1 = pc->from; + pb1 = PCI(pc)->from; while(pb1) { - pc1 = pb1->pc; /* Get the pCode that branches to the + PCI(pc1) = pb1->pc; /* Get the pCode that branches to the * one we're unlinking */ /* search for the link back to this pCode (the one we're * unlinking) */ - if(pb2 = pBranchFind(pc1->to,pc)) { - pb2->pc = pc->to->pc; // make the replacement + if((pb2 = pBranchFind(PCI(pc1)->to,pc))) { + pb2->pc = PCI(pc)->to->pc; // make the replacement /* if the pCode we're unlinking contains multiple 'to' * branches (e.g. this a skip instruction) then we need * to copy these extra branches to the chain. */ - if(pc->to->next) - pic16_pBranchAppend(pb2, pc->to->next); + if(PCI(pc)->to->next) + pic16_pBranchAppend(pb2, PCI(pc)->to->next); } pb1 = pb1->next; @@ -5217,7 +5252,7 @@ pCode * pic16_findNextInstruction(pCode *pci) } /*-----------------------------------------------------------------*/ -/* pic16_findNextInstruction - given a pCode, find the next instruction */ +/* pic16_findPrevInstruction - given a pCode, find the next instruction */ /* in the linked list */ /*-----------------------------------------------------------------*/ pCode * pic16_findPrevInstruction(pCode *pci) @@ -5225,6 +5260,8 @@ pCode * pic16_findPrevInstruction(pCode *pci) pCode *pc = pci; while(pc) { + pc = pc->prev; + if((pc->type == PC_OPCODE) || (pc->type == PC_WILD) || (pc->type == PC_ASMDIR) @@ -5236,7 +5273,6 @@ pCode * pic16_findPrevInstruction(pCode *pci) fprintf(stderr,"pic16_findPrevInstruction: "); printpCode(stderr, pc); #endif - pc = pc->next; } //fprintf(stderr,"Couldn't find instruction\n"); @@ -5272,7 +5308,7 @@ static pCode * findFunctionEnd(pCode *pc) static void AnalyzeLabel(pCode *pc) { - pCodeUnlink(pc); + pic16_pCodeUnlink(pc); } #endif @@ -5327,8 +5363,6 @@ regs * pic16_getRegFromInstruction(pCode *pc) case PO_FSR0: return PCOR(PCI(pc)->pcop)->r; - // return typeRegWithIdx (PCOR(PCI(pc)->pcop)->rIdx, REG_SFR, 0); - case PO_BIT: case PO_GPR_TEMP: // fprintf(stderr, "pic16_getRegFromInstruction - bit or temp\n"); @@ -5338,16 +5372,13 @@ regs * pic16_getRegFromInstruction(pCode *pc) if(PCOI(PCI(pc)->pcop)->r) return (PCOI(PCI(pc)->pcop)->r); - //fprintf(stderr, "pic16_getRegFromInstruction - immediate\n"); - return pic16_dirregWithName(PCI(pc)->pcop->name); - //return NULL; // PCOR(PCI(pc)->pcop)->r; - case PO_GPR_BIT: return PCOR(PCI(pc)->pcop)->r; case PO_DIR: // fprintf(stderr, "pic16_getRegFromInstruction - dir\n"); return PCOR(PCI(pc)->pcop)->r; + case PO_LITERAL: //fprintf(stderr, "pic16_getRegFromInstruction - literal\n"); break; @@ -5356,7 +5387,7 @@ regs * pic16_getRegFromInstruction(pCode *pc) // fprintf(stderr, "pic16_getRegFromInstruction - unknown reg type %d\n",PCI(pc)->pcop->type); // genericPrint(stderr, pc); // assert( 0 ); - break; + break; } return NULL; @@ -5924,8 +5955,11 @@ int pic16_isPCinFlow(pCode *pc, pCode *pcflow) /* */ /* position == 0: insert before */ /* position == 1: insert after pc */ -/* position == 2: 0 previous was a skip instruction */ +/* position == 2: like 0 but previous was a skip instruction */ /*-----------------------------------------------------------------*/ +pCodeOp *pic16_popGetLabel(unsigned int key); +extern int pic16_labelOffset; + static void insertBankSwitch(int position, pCode *pc) { pCode *new_pc; @@ -5937,13 +5971,15 @@ static void insertBankSwitch(int position, pCode *pc) /* emit BANKSEL [symbol] */ reg = pic16_getRegFromInstruction(pc); - if(!reg)return; + if(!reg) { + if(!(PCI(pc)->pcop && PCI(pc)->pcop->type == PO_GPR_BIT))return; + } new_pc = pic16_newpCodeAsmDir("BANKSEL", "%s", pic16_get_op_from_instruction(PCI(pc))); // position = 0; // position is always before (sanity check!) #if 0 - fprintf(stderr, "%s:%d: inserting bank switch\tbank = %d\n", __FUNCTION__, __LINE__, bsr); + fprintf(stderr, "%s:%d: inserting bank switch\n", __FUNCTION__, __LINE__); pc->print(stderr, pc); #endif @@ -5951,27 +5987,65 @@ static void insertBankSwitch(int position, pCode *pc) case 1: { /* insert the bank switch after this pc instruction */ pCode *pcnext = pic16_findNextInstruction(pc); - pic16_pCodeInsertAfter(pc, new_pc); - if(pcnext)pc = pcnext; + + pic16_pCodeInsertAfter(pc, new_pc); + if(pcnext)pc = pcnext; }; break; case 0: /* insert the bank switch BEFORE this pc instruction */ pic16_pCodeInsertAfter(pc->prev, new_pc); break; + + case 2: { + /* just like 0, but previous was a skip instruction, + * so some care should be taken */ + symbol *tlbl; + pCode *pcnext, *pcprev, *npci;; + PIC_OPCODE ipci; + + pic16_labelOffset += 10000; + tlbl = newiTempLabel(NULL); + + /* invert skip instruction */ + pcprev = pic16_findPrevInstruction(pc); + ipci = PCI(pcprev)->inverted_op; + npci = pic16_newpCode(ipci, PCI(pcprev)->pcop); + +#if 1 + PCI(npci)->from = PCI(pcprev)->from; + PCI(npci)->to = PCI(pcprev)->to; + PCI(npci)->label = PCI(pcprev)->label; + PCI(npci)->pcflow = PCI(pcprev)->pcflow; + PCI(npci)->cline = PCI(pcprev)->cline; +#endif + +// memmove(PCI(pcprev), PCI(npci), sizeof(pCode) + sizeof(PIC_OPCODE) + sizeof(char const * const)); + +#if 1 + pic16_pCodeInsertAfter(pcprev->prev, npci); + /* unlink the pCode */ + pcprev->prev->next = pcprev->next; + pcprev->next->prev = pcprev->prev; +#endif + + pcnext = pic16_newpCode(POC_GOTO, pic16_popGetLabel(tlbl->key)); + pic16_pCodeInsertAfter(pc->prev, pcnext); + pic16_pCodeInsertAfter(pc->prev, new_pc); + + pcnext = pic16_newpCodeLabel(NULL,tlbl->key+100+pic16_labelOffset); + pic16_pCodeInsertAfter(pc, pcnext); + }; break; } /* Move the label, if there is one */ - if(PCI(pc)->label) { // fprintf(stderr, "%s:%d: moving label due to bank switch directive src= 0x%p dst= 0x%p\n", // __FILE__, __LINE__, pc, new_pc); PCAD(new_pc)->pci.label = PCI(pc)->label; PCI(pc)->label = NULL; } - -// fprintf(stderr, "BankSwitch has been inserted\n"); } @@ -6357,6 +6431,12 @@ static int OptimizepCode(char dbName) return matches; } + + +const char *pic16_pCodeOpType(pCodeOp *pcop); +const char *pic16_pCodeOpSubType(pCodeOp *pcop); + + /*-----------------------------------------------------------------*/ /* pic16_popCopyGPR2Bit - copy a pcode operator */ /*-----------------------------------------------------------------*/ @@ -6365,7 +6445,8 @@ pCodeOp *pic16_popCopyGPR2Bit(pCodeOp *pc, int bitval) { pCodeOp *pcop; - pcop = pic16_newpCodeOpBit(pc->name, bitval, 0); +// fprintf(stderr, "%s:%d pc type: %s\n", __FILE__, __LINE__, pic16_pCodeOpType(pc)); + pcop = pic16_newpCodeOpBit(pc->name, bitval, 0, pc->type); if( !( (pcop->type == PO_LABEL) || (pcop->type == PO_LITERAL) || @@ -6395,104 +6476,83 @@ static void pic16_FixRegisterBanking(pBlock *pb) pCode *pc=NULL; pCode *pcprev=NULL; regs *reg, *prevreg; - + int flag=0; + if(!pb) return; pc = pic16_findNextpCode(pb->pcHead, PC_OPCODE); - if(!pc) - return; + if(!pc)return; /* loop through all of the flow blocks with in one pblock */ // fprintf(stderr,"%s:%d: Register banking\n", __FUNCTION__, __LINE__); - prevreg = NULL; - do { - /* at this point, pc should point to a PC_FLOW object */ - /* for each flow block, determine the register banking - requirements */ + prevreg = NULL; + do { + /* at this point, pc should point to a PC_FLOW object */ + /* for each flow block, determine the register banking + * requirements */ + + if(!isPCI(pc))goto loop; - if(isPCI(pc) && !PCI(pc)->is2MemOp) { + if(PCI(pc)->is2MemOp)goto loop; + reg = pic16_getRegFromInstruction(pc); #if 0 + pc->print(stderr, pc); fprintf(stderr, "reg = %p\n", reg); + if(reg) { fprintf(stderr, "%s:%d: %s %d\n",__FUNCTION__, __LINE__, reg->name, reg->rIdx); - fprintf(stderr, "addr = 0x%03x, bank = %d, bit=%d\tmapped = %d sfr=%d fix=%d\n", - reg->address,REG_BANK(reg),reg->isBitField, reg->isMapped, - pic16_finalMapping[ reg->address ].isSFR, reg->isFixed); + fprintf(stderr, "addr = 0x%03x, bit=%d\tfix=%d\n", + reg->address,reg->isBitField, reg->isFixed); } #endif /* we can be 99% that within a pBlock, between two consequtive * refernces to the same register, the extra banksel is needless */ + + + /* now make some tests to make sure that instruction needs bank switch */ - if((reg && !isACCESS_BANK(reg) && (isBankInstruction(pc) == -1)) - && (!isPCI_LIT(pc)) - && (PCI(pc)->op != POC_CALL) - - && ( ((pic16_options.opt_banksel>0) - && (!prevreg || (prevreg && !pic16_areRegsSame(reg, prevreg)))) - || (!pic16_options.opt_banksel) - ) - ) - { - /* Examine the instruction before this one to make sure it is - * not a skip type instruction */ - pcprev = findPrevpCode(pc->prev, PC_OPCODE); - - /* FIXME: if previous is SKIP pCode, we should move the BANKSEL - * before SKIP, but we have to check if the SKIP uses BANKSEL, etc... */ - if(!pcprev || (pcprev && !isPCI_SKIP(pcprev))) { - prevreg = reg; - if(!pic16_options.no_banksel) - insertBankSwitch(0, pc); - } else { -// if(pcprev && isPCI_SKIP(pcprev))assert(0); - } + /* if not no register exists, and if not a bit opcode goto loop */ + if(!reg) { + if(!(PCI(pc)->pcop && PCI(pc)->pcop->type == PO_GPR_BIT))goto loop; } - - pcprev = pc; - - } - - pc = pc->next; - }while (pc); - -#if 0 - if(pcprev && cur_bank) { - - int pos = 1; /* Assume that the bank switch instruction(s) - * are inserted after this instruction */ - - if((PCI(pcprev)->op == POC_RETLW) || - (PCI(pcprev)->op == POC_RETURN) || - (PCI(pcprev)->op == POC_RETFIE)) { - - /* oops, a RETURN - we need to switch banks *before* the RETURN */ - - pos = 0; - - } - - /* Brute force - make sure that we point to bank 0 at the - * end of each flow block */ - -// insertBankSwitch(pos, pcprev, 0); -/* - new_pc = pic16_newpCode(POC_MOVLB, pic16_newpCodeOpLit(0)); - pic16_pCodeInsertAfter(pcprev, new_pc); -*/ - cur_bank = 0; - //fprintf(stderr, "Brute force switch\n"); - } -#endif - + + if(isPCI_SKIP(pc)) { +// fprintf(stderr, "instruction is SKIP instruction\n"); + } + if((reg && isACCESS_BANK(reg)) || !isBankInstruction(pc))goto loop; + + if(isPCI_LIT(pc))goto loop; + + if(PCI(pc)->op == POC_CALL)goto loop; + + /* Examine the instruction before this one to make sure it is + * not a skip type instruction */ + pcprev = findPrevpCode(pc->prev, PC_OPCODE); + + /* FIXME: if previous is SKIP pCode, we should move the BANKSEL + * before SKIP, but we have to check if the SKIP uses BANKSEL, etc... */ + flag = 0; + if(pcprev && isPCI_SKIP(pcprev))flag=2; //goto loop; + + prevreg = reg; + insertBankSwitch(flag, pc); + pcprev = pc; + +// fprintf(stderr, "BANK SWITCH inserted\n"); + +loop: + pc = pc->next; + } while (pc); } + static void pBlockDestruct(pBlock *pb) { @@ -6721,9 +6781,12 @@ void pic16_AnalyzeBanking(void) if(!the_pFile)return; - for(pb = the_pFile->pbHead; pb; pb = pb->next) { -// fprintf(stderr, "%s:%d: Fix register banking in pb= 0x%p\n", __FILE__, __LINE__, pb); - pic16_FixRegisterBanking(pb); + + if(!pic16_options.no_banksel) { + for(pb = the_pFile->pbHead; pb; pb = pb->next) { +// fprintf(stderr, "%s:%d: Fix register banking in pb= 0x%p\n", __FILE__, __LINE__, pb); + pic16_FixRegisterBanking(pb); + } } } diff --git a/src/pic16/pcode.h b/src/pic16/pcode.h index f6ca309a..ded8c887 100644 --- a/src/pic16/pcode.h +++ b/src/pic16/pcode.h @@ -267,19 +267,20 @@ typedef enum POC_SUBFWB_D1, POC_SWAPF, POC_SWAPFW, -// POC_TRIS , // To be removed - POC_TBLRD, // patch 15 - POC_TBLRD_POSTINC, // - POC_TBLRD_POSTDEC, // - POC_TBLRD_PREINC, // - POC_TBLWT, // - POC_TBLWT_POSTINC, // - POC_TBLWT_POSTDEC, // - POC_TBLWT_PREINC, // patch 15 + POC_TBLRD, + POC_TBLRD_POSTINC, + POC_TBLRD_POSTDEC, + POC_TBLRD_PREINC, + POC_TBLWT, + POC_TBLWT_POSTINC, + POC_TBLWT_POSTDEC, + POC_TBLWT_PREINC, POC_TSTFSZ, POC_XORLW, POC_XORWF, - POC_XORFW + POC_XORFW, + + POC_BANKSEL } PIC_OPCODE; @@ -925,7 +926,7 @@ pCodeOp *pic16_newpCodeOpLabel(char *name, int key); pCodeOp *pic16_newpCodeOpImmd(char *name, int offset, int index, int code_space); pCodeOp *pic16_newpCodeOpLit(int lit); pCodeOp *pic16_newpCodeOpLit2(int lit, pCodeOp *arg2); -pCodeOp *pic16_newpCodeOpBit(char *name, int bit,int inBitSpace); +pCodeOp *pic16_newpCodeOpBit(char *name, int bit,int inBitSpace, PIC_OPTYPE subt); pCodeOp *pic16_newpCodeOpRegFromStr(char *name); pCodeOp *pic16_newpCodeOp(char *name, PIC_OPTYPE p); pCodeOp *pic16_pCodeOpCopy(pCodeOp *pcop); diff --git a/src/pic16/pcodepeep.c b/src/pic16/pcodepeep.c index b905e022..e60068b8 100644 --- a/src/pic16/pcodepeep.c +++ b/src/pic16/pcodepeep.c @@ -513,7 +513,7 @@ static void * cvt_altpat_mnem1a(void *pp,pCodeWildBlock *pcwb) } if(pic16Mnemonics[opcode]->isBitInst) - pcosubtype = pic16_newpCodeOpBit(NULL,-1,0); + pcosubtype = pic16_newpCodeOpBit(NULL,-1,0, PO_GPR_REGISTER); else pcosubtype = pic16_newpCodeOp(NULL,PO_GPR_REGISTER); @@ -810,7 +810,7 @@ static void * cvt_altpat_mnem3(void *pp,pCodeWildBlock *pcwb) //pcosubtype = cvt_extract_status(p[1].pct[0].tok.s, p[3].pct[0].tok.s); //if(pcosubtype == NULL) { - pcosubtype = pic16_newpCodeOpBit(p[1].pct[0].tok.s,p[3].pct[0].tok.n,0); + pcosubtype = pic16_newpCodeOpBit(p[1].pct[0].tok.s,p[3].pct[0].tok.n,0, PO_GPR_REGISTER); //} } else pcosubtype = pic16_newpCodeOp(p[1].pct[0].tok.s,PO_GPR_REGISTER); @@ -1965,7 +1965,7 @@ static int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) /* now check whether the second operand matches */ if(PCOW2(PCI(pcd)->pcop) && (PCOR2(PCI(pcd)->pcop)->pcop2->type == PO_WILD)) { - fprintf(stderr, "%s:%d %s second operand is wild\n", __FILE__, __LINE__, __FUNCTION__); +// fprintf(stderr, "%s:%d %s second operand is wild\n", __FILE__, __LINE__, __FUNCTION__); index = PCOW2(PCI(pcd)->pcop)->id; //DFPRINTF((stderr,"destination is wild\n")); @@ -2225,7 +2225,7 @@ pCodeOp *pic16_pCodeOpCopy(pCodeOp *pcop) case PO_GPR_BIT: - pcopnew = pic16_newpCodeOpBit(pcop->name, PCORB(pcop)->bit,PCORB(pcop)->inBitSpace); + pcopnew = pic16_newpCodeOpBit(pcop->name, PCORB(pcop)->bit,PCORB(pcop)->inBitSpace, PO_GPR_REGISTER); PCOR(pcopnew)->r = PCOR(pcop)->r; PCOR(pcopnew)->rIdx = PCOR(pcop)->rIdx; DFPRINTF((stderr," pCodeOpCopy Bit -register index\n")); diff --git a/src/pic16/ralloc.c b/src/pic16/ralloc.c index eda8b769..5e94acc5 100644 --- a/src/pic16/ralloc.c +++ b/src/pic16/ralloc.c @@ -77,6 +77,8 @@ set *pic16_dynInternalRegs=NULL; static hTab *dynDirectRegNames= NULL; //static hTab *regHash = NULL; /* a hash table containing ALL registers */ +extern set *sectNames; + set *pic16_rel_udata=NULL; /* relocatable uninitialized registers */ set *pic16_fix_udata=NULL; /* absolute uninitialized registers */ set *pic16_equ_data=NULL; /* registers used by equates */ @@ -574,14 +576,14 @@ pic16_allocDirReg (operand *op ) name = OP_SYMBOL (op)->rname[0] ? OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name; - if(!SPEC_OCLS( OP_SYM_ETYPE(op))) { // patch 13 - if(pic16_debug_verbose) // - { // - fprintf(stderr, "%s:%d symbol %s(r:%s) is not assigned to a memmap\n", __FILE__, __LINE__, // - OP_SYMBOL(op)->name, OP_SYMBOL(op)->rname); // - } // - return NULL; // - } // patch 13 + if(!SPEC_OCLS( OP_SYM_ETYPE(op))) { + if(pic16_debug_verbose) + { + fprintf(stderr, "%s:%d symbol %s(r:%s) is not assigned to a memmap\n", __FILE__, __LINE__, + OP_SYMBOL(op)->name, OP_SYMBOL(op)->rname); + } + return NULL; + } debugLog ("%s:%d symbol name %s\n", __FUNCTION__, __LINE__, name); // fprintf(stderr, "%s symbol name %s\n", __FUNCTION__,name); @@ -663,8 +665,8 @@ pic16_allocDirReg (operand *op ) // if(SPEC_SCLS(OP_SYM_ETYPE(op)))regtype = REG_SFR; if(OP_SYMBOL(op)->onStack) { -// fprintf(stderr, "%s:%d onStack %s\n", __FILE__, __LINE__, OP_SYMBOL(op)->name); - OP_SYMBOL(op)->onStack = 0; + fprintf(stderr, "%s:%d onStack %s\n", __FILE__, __LINE__, OP_SYMBOL(op)->name); +// OP_SYMBOL(op)->onStack = 0; SPEC_OCLS(OP_SYM_ETYPE(op)) = data; regtype = REG_GPR; } @@ -979,6 +981,8 @@ extern void pic16_dump_isection(FILE *of, set *section, int fix); extern void pic16_dump_int_registers(FILE *of, set *section); extern void pic16_dump_idata(FILE *of, set *idataSymSet); +extern void pic16_dump_gsection(FILE *of, set *sections); + static void packBits(set *bregs) { set *regset; @@ -1041,66 +1045,6 @@ static void packBits(set *bregs) } - - -#if 0 -static void bitEQUs(FILE *of, set *bregs) -{ - regs *breg,*bytereg; - int bit_no=0; - - //fprintf(stderr," %s\n",__FUNCTION__); - for (breg = setFirstItem(bregs) ; breg ; - breg = setNextItem(bregs)) { - - //fprintf(stderr,"bit reg: %s\n",breg->name); - - bytereg = breg->reg_alias; - if(bytereg) - fprintf (of, "%s\tEQU\t( (%s<<3)+%d)\n", - breg->name, - bytereg->name, - breg->rIdx & 0x0007); - - else { - fprintf(stderr, "bit field is not assigned to a register\n"); - fprintf (of, "%s\tEQU\t( (bitfield%d<<3)+%d)\n", - breg->name, - bit_no>>3, - bit_no & 0x0007); - - bit_no++; - } - } - -} - -static void aliasEQUs(FILE *of, set *fregs, int use_rIdx) -{ - regs *reg; - - - for (reg = setFirstItem(fregs) ; reg ; - reg = setNextItem(fregs)) { - - if(!reg->isEmitted && reg->wasUsed) { - if(use_rIdx) { - if (reg->type != REG_SFR) { - fprintf (of, "%s\tEQU\t0x%03x\n", - reg->name, - reg->rIdx); - } - } - else - fprintf (of, "%s\tEQU\t0x%03x\n", - reg->name, - reg->address); - } - } - -} -#endif - void pic16_writeUsedRegs(FILE *of) { packBits(pic16_dynDirectBitRegs); @@ -1126,40 +1070,15 @@ void pic16_writeUsedRegs(FILE *of) /* dump internal registers */ pic16_dump_int_registers(of, pic16_int_regs); + /* dump generic section variables */ + pic16_dump_gsection(of, sectNames); + /* dump other variables */ pic16_dump_usection(of, pic16_rel_udata, 0); pic16_dump_usection(of, pic16_fix_udata, 1); } -#if 0 -/*-----------------------------------------------------------------*/ -/* allDefsOutOfRange - all definitions are out of a range */ -/*-----------------------------------------------------------------*/ -static bool -allDefsOutOfRange (bitVect * defs, int fseq, int toseq) -{ - int i; - - debugLog ("%s\n", __FUNCTION__); - if (!defs) - return TRUE; - - for (i = 0; i < defs->size; i++) - { - iCode *ic; - - if (bitVectBitValue (defs, i) && - (ic = hTabItemWithKey (iCodehTab, i)) && - (ic->seq >= fseq && ic->seq <= toseq)) - - return FALSE; - - } - - return TRUE; -} -#endif /*-----------------------------------------------------------------*/ /* computeSpillable - given a point find the spillable live ranges */ -- 2.30.2