Added a new peep rule to handle carry logic (optimizes src/regression/nestfor.c).
authorsdattalo <sdattalo@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 28 Apr 2003 14:34:27 +0000 (14:34 +0000)
committersdattalo <sdattalo@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 28 Apr 2003 14:34:27 +0000 (14:34 +0000)
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
src/pic/device.c
src/pic/glue.c
src/pic/pcodepeep.c
src/pic/pcoderegs.c
src/pic/peeph.def
src/pic/ralloc.c

index 88bb0cf401195626ae194cbae1022000db72e473..428a86145d7715705a257b1924951dd67681b41d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-04-28  Scott Dattalo  <scott@DATTALO.COM>
+
+       * 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 <bernhard@bernhardheld.de>
 
        * debugger/mcs51/cmd.c: added header newalloc.h
index 68b020e5708c31953e5f9f7206144806cba61252..e41b1b02d9d06073fa2af50142e0a52d8a9555d8 100644 (file)
@@ -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);
index 6f54ed1d7100a477e3d5de757cb0c0deaf4d081f..8a94ee426107469edc78b57ece1c6b69d2df00fd 100644 (file)
@@ -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)
     {
 
index e3c98d805f2e06e0e404cf82fb8fbe97ef41092d..4330c03f13ec40899b0a320eed1a23c3d04433b6 100644 (file)
@@ -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) {
index 955baae58aed70f68e4823f496eebf9677d907b9..b3e35cb322a5ea4cabe03dbb8c864cdc703f28bd 100644 (file)
@@ -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++);
 
index 08d541b738ac1dffc476207d6663b8bf725acc79..8e6df14f6100431cd5e0c267ad197babd481eff0 100644 (file)
@@ -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
+       
+}
index 5332a8f455e8e7cc0f109f27b13548e992c01ca1..1614e6c94ce9dd24439f4640e7a99b464dfab0ec 100644 (file)
@@ -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");