* src/mcs51/gen.c (genMinus): fixed bug 1270906: reverse subtraction, carry must...
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 26 Oct 2005 06:48:27 +0000 (06:48 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 26 Oct 2005 06:48:27 +0000 (06:48 +0000)
* src/mcs51/peeph.def: addded rule 262 to remove double cpl c, which could be emitted by genMinus

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

ChangeLog
src/mcs51/gen.c
src/mcs51/peeph.def

index 2c55b61731dfcf59a34077ecb480cd754c88833e..608a80f4398e03f2831f3d8941817534dc187041 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-10-26 Bernhard Held <bernhard AT bernhardheld.de>
+
+       * src/mcs51/gen.c (genMinus): fixed bug 1270906: reverse subtraction,
+       carry must be complemented too
+       * src/mcs51/peeph.def: addded rule 262 to remove double cpl c, which
+       could be emitted by genMinus
+
 2005-10-25 Bernhard Held <bernhard AT bernhardheld.de>
 
        * src/SDCCast.c (addCast): added promotion for bit variables
index 76eb50f89e0bfd33e718049e34f495666c499046..0757d80dcbd284ecb38568a82fb079b03d7eaf10 100644 (file)
@@ -4581,13 +4581,17 @@ genMinus (iCode * ic)
               emitcode ("subb", "a,b");
               popB (pushedB);
             } else {
+              /* reverse subtraction with 2's complement */
+              if (offset == 0)
+                emitcode( "setb", "c");
+               else
+                emitcode( "cpl", "c");
               wassertl(!aopGetUsesAcc(leftOp, offset), "accumulator clash");
               MOVA (aopGet(rightOp, offset, FALSE, TRUE));
-              if (offset == 0) {
-                emitcode( "setb", "c");
-              }
               emitcode("subb", "a,%s", aopGet(leftOp, offset, FALSE, TRUE));
               emitcode("cpl", "a");
+              if (size) /* skip if last byte */
+                emitcode( "cpl", "c");
             }
           } else {
             MOVA (aopGet (leftOp, offset, FALSE, FALSE));
index d93dd22d6e290ef67028678bc70b154a24d76259..779300776f08b72477e860e221eff26109f4e7e0 100644 (file)
@@ -4468,6 +4468,13 @@ replace {
        mov     %1,a
 }
 
+replace {
+       cpl     c
+       cpl     c
+} by {
+       ;       Peephole 262    removed redundant cpl c
+}
+
 // should be one of the last peepholes
 replace{
 %1: