From f45f37cf44ba85d2e40aae93e41f4b993e8b77e0 Mon Sep 17 00:00:00 2001 From: sdattalo Date: Mon, 28 Apr 2003 14:34:27 +0000 Subject: [PATCH] Added a new peep rule to handle carry logic (optimizes src/regression/nestfor.c). PIC peep hole optimizer now handles non-wildcard asmops. Removed extraneous debug printfs git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2571 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 6 ++++++ src/pic/device.c | 10 +++++----- src/pic/glue.c | 4 ++-- src/pic/pcodepeep.c | 23 ++++++++++++++++++----- src/pic/pcoderegs.c | 6 +++--- src/pic/peeph.def | 38 ++++++++++++++++++++++++++++++++++++++ src/pic/ralloc.c | 19 +++++++------------ 7 files changed, 79 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 88bb0cf4..428a8614 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-04-28 Scott Dattalo + + * src/pic/pCodepeep.c non-wildcard asmops are now handled + * src/pic/peeph.def Added two rules to optimize carry manipulation + * src/pic/* removed debug printfs + 2003-04-28 Bernhard Held * debugger/mcs51/cmd.c: added header newalloc.h diff --git a/src/pic/device.c b/src/pic/device.c index 68b020e5..e41b1b02 100644 --- a/src/pic/device.c +++ b/src/pic/device.c @@ -212,7 +212,7 @@ void dump_sfr(FILE *of) static int udata_flag=0; //dump_map(); /* display the register map */ - fprintf(stdout,";dump_sfr \n"); + //fprintf(stdout,";dump_sfr \n"); if (pic->maxRAMaddress < 0) { fprintf(stderr, "missing \"#pragma maxram\" setting\n"); return; @@ -452,7 +452,7 @@ void mapRegister(regs *reg) do { - fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size); + //fprintf(stdout,"mapping %s to address 0x%02x, reg size = %d\n",reg->name, (reg->address+alias+i),reg->size); finalMapping[reg->address + alias + i].reg = reg; finalMapping[reg->address + alias + i].instance = i; @@ -466,7 +466,7 @@ void mapRegister(regs *reg) } while (alias>=0); } - fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size); + //fprintf(stderr,"%s - %s addr = 0x%03x, size %d\n",__FUNCTION__,reg->name, reg->address,reg->size); reg->isMapped = 1; @@ -478,7 +478,7 @@ int assignRegister(regs *reg, int start_address) { int i; - fprintf(stderr,"%s - %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address); + //fprintf(stderr,"%s - %s start_address = 0x%03x\n",__FUNCTION__,reg->name, start_address); if(reg->isFixed) { if (validAddress(reg->address,reg->size)) { @@ -543,7 +543,7 @@ void assignRelocatableRegisters(set *regset, int used) for (reg = setFirstItem(regset) ; reg ; reg = setNextItem(regset)) { - fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed); + //fprintf(stdout,"assigning %s isFixed=%d, wasUsed=%d\n",reg->name,reg->isFixed,reg->wasUsed); if((!reg->isFixed) && ( used || reg->wasUsed)) address = assignRegister(reg,address); diff --git a/src/pic/glue.c b/src/pic/glue.c index 6f54ed1d..8a94ee42 100644 --- a/src/pic/glue.c +++ b/src/pic/glue.c @@ -113,7 +113,7 @@ pic14emitRegularMap (memmap * map, bool addPublics, bool arFlag) for (sym = setFirstItem (map->syms); sym; sym = setNextItem (map->syms)) { - printf("%s\n",sym->name); + //printf("%s\n",sym->name); /* if extern then add it into the extern list */ if (IS_EXTERN (sym->etype)) { @@ -280,7 +280,7 @@ printIvalChar (sym_link * type, initList * ilist, pBlock *pb, char *s) if(!pb) return 0; - fprintf(stderr, "%s\n",__FUNCTION__); + //fprintf(stderr, "%s\n",__FUNCTION__); if (!s) { diff --git a/src/pic/pcodepeep.c b/src/pic/pcodepeep.c index e3c98d80..4330c03f 100644 --- a/src/pic/pcodepeep.c +++ b/src/pic/pcodepeep.c @@ -1690,13 +1690,13 @@ int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) if(!peepBlock->target.wildpCodeOps[index]) { peepBlock->target.wildpCodeOps[index] = PCI(pcs)->pcop; - //if(PCI(pcs)->pcop->type == PO_GPR_TEMP) + //fprintf(stderr, "first time for wild opcode #%d\n",index); + return 1; } else { /* pcs->print(stderr,pcs); pcd->print(stderr,pcd); - fprintf(stderr, "comparing operands of these instructions, result %d\n", pCodeOpCompare(PCI(pcs)->pcop, peepBlock->target.wildpCodeOps[index]) ); @@ -1730,11 +1730,25 @@ int pCodePeepMatchLine(pCodePeep *peepBlock, pCode *pcs, pCode *pcd) } } else if (PCI(pcd)->pcop->type == PO_LITERAL) { + /* + pcs->print(stderr,pcs); + pcd->print(stderr,pcd); + + fprintf(stderr, "comparing literal operands of these instructions, result %d\n", + pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop)); + */ return pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop); + } else { + /* FIXME - need an else to check the case when the destination + * isn't a wild card */ + /* + fprintf(stderr, "Destination is not wild: operand compare =%d\n", + pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop)); + */ + return pCodeOpCompare(PCI(pcs)->pcop, PCI(pcd)->pcop); + } - /* FIXME - need an else to check the case when the destination - * isn't a wild card */ } else /* The pcd has no operand. Lines match if pcs has no operand either*/ return (PCI(pcs)->pcop == NULL); @@ -2081,7 +2095,6 @@ int pCodePeepMatchRule(pCode *pc) if(!pcin && pct) { DFPRINTF((stderr," partial match... no more code\n")); - fprintf(stderr," partial match... no more code\n"); matched = 0; } if(!pct) { diff --git a/src/pic/pcoderegs.c b/src/pic/pcoderegs.c index 955baae5..b3e35cb3 100644 --- a/src/pic/pcoderegs.c +++ b/src/pic/pcoderegs.c @@ -282,7 +282,7 @@ static void Remove1pcode(pCode *pc, regs *reg, int debug_code) SAFE_snprintf(ppbuff,&size, ";%d", debug_code); pCode2str(*ppbuff, size, pc); pCodeInsertBefore(pc, newpCodeCharP(buff1)); - fprintf(stderr,"removing instruction:\n%s\n",buff1); + //fprintf(stderr,"removing instruction:\n%s\n",buff1); } pc->destruct(pc); @@ -344,7 +344,7 @@ void RemoveRegsFromSet(set *regset) pc->print(stderr,pc); fprintf(stderr,"reg %s, type =%d\n",r->name, r->type); } - fprintf(stderr," removing reg %s because it is used only once\n",reg->name); + //fprintf(stderr," removing reg %s because it is used only once\n",reg->name); Remove1pcode(pc, reg, 1); /* unlinkpCode(pc); @@ -389,7 +389,7 @@ static void Remove2pcodes(pCode *pcflow, pCode *pc1, pCode *pc2, regs *reg, int if(!reg) return; - fprintf(stderr,"%s\n",__FUNCTION__); + //fprintf(stderr,"%s\n",__FUNCTION__); if(pc1) Remove1pcode(pc1, reg, debug_code++); diff --git a/src/pic/peeph.def b/src/pic/peeph.def index 08d541b7..8e6df14f 100644 --- a/src/pic/peeph.def +++ b/src/pic/peeph.def @@ -291,3 +291,41 @@ replace restart { ; peep 12 - Removed redundant move comf %1,f } + +replace restart { + clrf %1 + rlf %1,f + movlw 0x01 + xorwf %1,f + movf %1,w + btfss STATUS,2 + goto %2 + +} by { + ; peep 13 - Optimized carry sequence + clrf %1 + incf %1,F + btfss status,C + goto %2 + clrf %1 + +} + +replace restart { + clrf %1 + rlf %1,f + movlw 0x01 + xorwf %1,f + movf %1,w + btfsc STATUS,2 + goto %2 + +} by { + ; peep 13a - Optimized carry sequence + clrf %1 + incf %1,F + btfsc status,C + goto %2 + clrf %1 + +} diff --git a/src/pic/ralloc.c b/src/pic/ralloc.c index 5332a8f4..1614e6c9 100644 --- a/src/pic/ralloc.c +++ b/src/pic/ralloc.c @@ -454,7 +454,7 @@ static regs* newReg(short type, short pc_type, int rIdx, char *name, int size, i *buffer = 's'; dReg->name = Safe_strdup(buffer); } - fprintf(stderr,"newReg: %s, rIdx = 0x%02x\n",dReg->name,rIdx); + //fprintf(stderr,"newReg: %s, rIdx = 0x%02x\n",dReg->name,rIdx); dReg->isFree = 0; dReg->wasUsed = 1; if(type == REG_SFR) @@ -967,10 +967,10 @@ void packBits(set *bregs) breg = regset->item; breg->isBitField = 1; - fprintf(stderr,"bit reg: %s\n",breg->name); + //fprintf(stderr,"bit reg: %s\n",breg->name); if(breg->isFixed) { - fprintf(stderr,"packing bit at fixed address = 0x%03x\n",breg->address); + //fprintf(stderr,"packing bit at fixed address = 0x%03x\n",breg->address); bitfield = typeRegWithIdx (breg->address >> 3, -1 , 1); breg->rIdx = breg->address & 7; @@ -978,7 +978,7 @@ void packBits(set *bregs) if(!bitfield) { sprintf (buffer, "fbitfield%02x", breg->address); - fprintf(stderr,"new bit field\n"); + //fprintf(stderr,"new bit field\n"); bitfield = newReg(REG_SFR, PO_GPR_BIT,breg->address,buffer,1,0); bitfield->isBitField = 1; bitfield->isFixed = 1; @@ -998,7 +998,7 @@ void packBits(set *bregs) byte_no++; bit_no=0; sprintf (buffer, "bitfield%d", byte_no); - fprintf(stderr,"new relocatable bit field\n"); + //fprintf(stderr,"new relocatable bit field\n"); relocbitfield = newReg(REG_GPR, PO_GPR_BIT,rDirectIdx++,buffer,1,0); relocbitfield->isBitField = 1; //addSet(&dynDirectRegs,relocbitfield); @@ -1036,7 +1036,7 @@ void bitEQUs(FILE *of, set *bregs) breg->rIdx & 0x0007); else { - fprintf(stderr, "bit field is not assigned to a register\n"); + //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, @@ -1075,18 +1075,13 @@ void writeUsedRegs(FILE *of) packBits(dynDirectBitRegs); assignFixedRegisters(dynAllocRegs); - printf("assignFixedRegisters(dynAllocRegs);\n"); assignFixedRegisters(dynStackRegs); - printf("assignFixedRegisters(dynStackRegs);\n"); assignFixedRegisters(dynDirectRegs); - printf("assignFixedRegisters(dynDirectRegs);\n"); assignRelocatableRegisters(dynInternalRegs,0); - printf("assignRelocatableRegisters(dynInternalRegs,0);\n"); assignRelocatableRegisters(dynAllocRegs,0); - printf("assignRelocatableRegisters(dynAllocRegs,0);\n"); assignRelocatableRegisters(dynStackRegs,0); - printf("assignRelocatableRegisters(dynStackRegs,0);\n"); + /* assignRelocatableRegisters(dynDirectRegs,0); printf("assignRelocatableRegisters(dynDirectRegs,0);\n"); -- 2.30.2