* src/pic16/{gen.c,genarith.c}: replaced sign-extension
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 31 May 2005 08:51:23 +0000 (08:51 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 31 May 2005 08:51:23 +0000 (08:51 +0000)
  "CLRF, BTFSC <signbit>, DECF/COMF" with side-effect-free
  "CLRF, BTFSC <signbit>, SETF"; fixes "long>>9"

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3776 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/pic16/gen.c
src/pic16/genarith.c

index 5b59a009124e56f57b67a86a323c3a43008b049c..9a152d62caedee8c3bb7cba910c5d356959fe9bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-05-31 Raphael Neider <rneider AT web.de>
+
+       * src/pic16/{gen.c,genarith.c}: replaced sign-extension
+         "CLRF, BTFSC <signbit>, DECF/COMF" with side-effect-free
+         "CLRF, BTFSC <signbit>, SETF"; fixes "long>>9"
+
 2005-05-27 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * device/lib/_strncpy.c: fixed the fix
index 5e31af4160ee37d8ea2f98306843a522e3ce91ee..ba47ce60c4404207aab747de0fcdba1691e3d1b9 100644 (file)
@@ -8695,7 +8695,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl,
     } 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, PO_GPR_REGISTER));
-      pic16_emitpcode(POC_DECF,  pic16_popGet(AOP(result),offr));
+      pic16_emitpcode(POC_SETF,  pic16_popGet(AOP(result),offr));
       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));
     }
@@ -8710,7 +8710,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl,
     } 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, PO_GPR_REGISTER));
-      pic16_emitpcode(POC_DECF,  pic16_popGet(AOP(result),offr));
+      pic16_emitpcode(POC_SETF,  pic16_popGet(AOP(result),offr));
     }
 
   default:
@@ -9888,7 +9888,7 @@ static void genrshTwo (operand *result,operand *left,
 
     if(sign) {
       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));
+      pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),MSB16));
     }
   }
 
@@ -10059,7 +10059,7 @@ static void genRightShiftLiteral (operand *left,
       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, PO_GPR_REGISTER));
-       pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),LSB));
+       pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),LSB));
       }
     } else {
 
@@ -13119,7 +13119,7 @@ static void genCast (iCode *ic)
        /* 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, PO_GPR_REGISTER));
-       pic16_emitpcode(POC_DECF,   pic16_popGet(AOP(result),offset));
+       pic16_emitpcode(POC_SETF,   pic16_popGet(AOP(result),offset));
       } else {
         pic16_emitpcode(POC_CLRF,pic16_popCopyReg(&pic16_pc_wreg));
 
index 1a556baf0f959f395cf5f08769f9caeb05cee9dc..fe7788522b861e40d097deacf5af8aee7d2a68da 100644 (file)
@@ -1059,7 +1059,7 @@ void pic16_genPlus (iCode *ic)
                                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(right),size-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-                                       pic16_emitpcode(POC_COMF, pic16_popGet(AOP(result),i));
+                                       pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),i));
                                        pic16_emitpcode(POC_MOVLW, pic16_popGet(AOP(left),i));
                                        pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),i));
                                }
@@ -1103,7 +1103,7 @@ void pic16_genPlus (iCode *ic)
                            if (!SPEC_USIGN(getSpec(operandType(right)))) {
                              // right operand is signed
                              pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),AOP_SIZE(right)-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-                             pic16_emitpcode(POC_COMF, pic16_popCopyReg (&pic16_pc_wreg));
+                             pic16_emitpcode(POC_SETF, pic16_popCopyReg (&pic16_pc_wreg));
                            }
                          }
 
@@ -1121,104 +1121,19 @@ void pic16_genPlus (iCode *ic)
                            if (!SPEC_USIGN(getSpec(operandType(left)))) {
                              // left operand is signed
                              pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),AOP_SIZE(left)-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-                             pic16_emitpcode(POC_COMF, pic16_popGet (AOP(result), i));
+                             pic16_emitpcode(POC_SETF, pic16_popGet (AOP(result), i));
                            }
                            pic16_emitpcode (POC_ADDWFC, pic16_popGet (AOP(result), i));
                          }
                        } // for i
                        goto release;
-                       
-#if 0
-                       // add leftover bytes
-                       if (SPEC_USIGN(getSpec(operandType(right)))) {
-                               // right is unsigned
-                               for(i=size; i< AOP_SIZE(result); i++) {
-                                       if (pic16_sameRegs(AOP(left), AOP(result)))
-                                       {
-                                               pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg));
-                                               pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(left),i));
-                                       } else { // not same
-                                               pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg));
-                                               pic16_emitpcode(POC_ADDFWC, pic16_popGet(AOP(left),i));
-                                               pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),i));
-                                       }
-                               }
-                       } else {
-                               // right is signed
-                               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, PO_GPR_REGISTER));
-                                               pic16_emitpcode(POC_COMFW, pic16_popCopyReg(&pic16_pc_wreg));
-                                               if (pic16_sameRegs(AOP(left), AOP(result)))
-                                               {
-                                                       pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(left),i));
-                                               } else { // not same
-                                                       pic16_emitpcode(POC_ADDFWC, pic16_popGet(AOP(left),i));
-                                                       pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),i));
-                                               }
-                                       } else {
-                                               pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg));
-                                               pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result), i));
-                                       }
-                               }
-                       }
-                       goto release;
-#endif
                }
 
        }
 
        assert( 0 );
-       // TODO:        anything from here to before "release:" is probably obsolete and should be removed
-       //              when the regression tests are stable
-
-       if (AOP_SIZE(result) > AOP_SIZE(right)) {
-               int sign =  !(SPEC_USIGN(getSpec(operandType(left))) |
-                               SPEC_USIGN(getSpec(operandType(right))) );
-
-
-               /* Need to extend result to higher bytes */
-               size = AOP_SIZE(result) - AOP_SIZE(right) - 1;
-
-               /* First grab the carry from the lower bytes */
-               pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset));
-               pic16_emitpcode(POC_RLCF,  pic16_popGet(AOP(result),offset));
-
-
-               if(sign) {
-                       /* 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(left),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-                       pic16_emitpcode(POC_DECF,  pic16_popGet(AOP(result),offset));
-                       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));
-
-                       /* 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(result),offset,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-                               pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff));
-                       }
-               }
-
-               offset++;
-               while(size--) {
-      
-                       if(sign)
-                               pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset));
-                       else
-                               pic16_emitpcode(POC_CLRF,  pic16_popGet(AOP(result),offset));
-
-                       offset++;
-               }
-       }
-
-
-       //adjustArithmeticResult(ic);
-
-       release:
+       
+release:
        pic16_freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
        pic16_freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
        pic16_freeAsmop(result,NULL,ic,TRUE);
@@ -1339,7 +1254,7 @@ 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, PO_GPR_REGISTER));
-       pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset));
+       pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offset));
       } else {
 
        pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0));
@@ -1644,7 +1559,7 @@ void pic16_genMinus (iCode *ic)
        if (!SPEC_USIGN(operandType(IC_RIGHT(ic)))) {
          // signed -- sign extend the right operand
          pic16_emitpcode (POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RIGHT(ic)),AOP_SIZE(IC_RIGHT(ic))-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-         pic16_emitpcode (POC_COMF, pic16_popCopyReg (&pic16_pc_wreg));
+         pic16_emitpcode (POC_SETF, pic16_popCopyReg (&pic16_pc_wreg));
        }
       }
       if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) {
@@ -1659,7 +1574,7 @@ void pic16_genMinus (iCode *ic)
          if (!SPEC_USIGN(operandType(IC_LEFT(ic)))) {
            // signed -- sign extend the left operand
            pic16_emitpcode (POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_LEFT(ic)),AOP_SIZE(IC_LEFT(ic))-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
-           pic16_emitpcode (POC_COMF, pic16_popGet(AOP(IC_RESULT(ic)), offset)); // keep CARRY/#BORROW bit intact!
+           pic16_emitpcode (POC_SETF, pic16_popGet(AOP(IC_RESULT(ic)), offset)); // keep CARRY/#BORROW bit intact!
          }
          pic16_emitpcode(POC_SUBWFB_D1, pic16_popGet(AOP(IC_RESULT(ic)),offset));
        }