src/mcs51/gen.c (genCpl): fixed bug http://sf.net/mailarchive/message.php?msg_id...
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 12 Oct 2003 18:49:27 +0000 (18:49 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 12 Oct 2003 18:49:27 +0000 (18:49 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2935 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/mcs51/gen.c

index 4a835827fc58ce828b2220347f8ca3ea43106937..0222cd6960a5b285b45ed159d9700b46e8424c93 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-10-12 Bernhard Held <bernhard@bernhardheld.de>
+
+       * src/mcs51/gen.c (genCpl): fixed bug
+       http://sf.net/mailarchive/message.php?msg_id=6263915
+
 2003-10-10 Bernhard Held <bernhard@bernhardheld.de>
 
        * src/SDCCast.c (decorateType): added extended constant folding
index fc821211b07c879bef1d98b844f5c674d375ce2f..c453a7925c9c415c7cc5cdf19313200c48531347 100644 (file)
@@ -1439,17 +1439,32 @@ genCpl (iCode * ic)
   aopOp (IC_RESULT (ic), ic, TRUE);
 
   /* special case if in bit space */
-  if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) {
-    if (AOP_TYPE (IC_LEFT (ic)) == AOP_CRY) {
-      emitcode ("mov", "c,%s", IC_LEFT (ic)->aop->aopu.aop_dir);
-      emitcode ("cpl", "c");
-      emitcode ("mov", "%s,c", IC_RESULT (ic)->aop->aopu.aop_dir);
-      goto release;
-    }
+  if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
+    {
+      if (AOP_TYPE (IC_LEFT (ic)) == AOP_CRY)
+       {
+         emitcode ("mov", "c,%s", IC_LEFT (ic)->aop->aopu.aop_dir);
+         emitcode ("cpl", "c");
+         emitcode ("mov", "%s,c", IC_RESULT (ic)->aop->aopu.aop_dir);
+         goto release;
+       }
+
     tlbl=newiTempLabel(NULL);
-    emitcode ("cjne", "%s,#0x01,%05d$", 
-             aopGet(AOP(IC_LEFT(ic)), 0, FALSE,FALSE), tlbl->key+100);
-    emitcode ("", "%05d$:", tlbl->key+100);
+    if (AOP_TYPE (IC_LEFT (ic)) == AOP_ACC ||
+       AOP_TYPE (IC_LEFT (ic)) == AOP_REG ||
+       IS_AOP_PREG (IC_LEFT (ic)))
+      {
+       emitcode ("cjne", "%s,#0x01,%05d$",
+                 aopGet (AOP (IC_LEFT (ic)), 0, FALSE, FALSE),
+                 tlbl->key + 100);
+      }
+    else
+      {
+        char *l = aopGet (AOP (IC_LEFT (ic)), 0, FALSE, FALSE);
+        MOVA (l);
+        emitcode ("cjne", "a,#0x01,%05d$", tlbl->key + 100);
+      }
+    emitcode ("", "%05d$:", tlbl->key + 100);
     outBitC (IC_RESULT(ic));
     goto release;
   }