fixed bug #507904
[fw/sdcc] / src / mcs51 / gen.c
index 63106da72587e28be1544659cc329384a2a34b7a..383d148e4b180d9d806902c8f6fdaee6edc3efdb 100644 (file)
@@ -1328,7 +1328,7 @@ genCpl (iCode * ic)
 {
   int offset = 0;
   int size;
-
+  symbol *tlbl;
 
   D(emitcode (";", "genCpl"));
 
@@ -1336,17 +1336,21 @@ genCpl (iCode * ic)
   aopOp (IC_LEFT (ic), ic, FALSE);
   aopOp (IC_RESULT (ic), ic, TRUE);
 
-  /* if both are in bit space then
-     a special case */
-  if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY &&
-      AOP_TYPE (IC_LEFT (ic)) == AOP_CRY)
-    {
-
+  /* 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;
     }
+    tlbl=newiTempLabel(NULL);
+    emitcode ("cjne", "%s,#0x01,%05d$", 
+             aopGet(AOP(IC_LEFT(ic)), 0, FALSE,FALSE), tlbl->key+100);
+    emitcode ("", "%05d$:", tlbl->key+100);
+    outBitC (IC_RESULT(ic));
+    goto release;
+  }
 
   size = AOP_SIZE (IC_RESULT (ic));
   while (size--)
@@ -2776,9 +2780,15 @@ findLabelBackwards (iCode * ic, int key)
       ic = ic->prev;
       count++;
 
+      /* If we have any pushes or pops, we cannot predict the distance.
+        I don't like this at all, this should be dealt with in the 
+        back-end */
+      if (ic->op == IPUSH || ic->op == IPOP) {
+       return 0;
+      }
+
       if (ic->op == LABEL && IC_LABEL (ic)->key == key)
        {
-         /* printf("findLabelBackwards = %d\n", count); */
          return count;
        }
     }
@@ -2837,15 +2847,15 @@ genPlusIncr (iCode * ic)
       emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE));
       if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
          IS_AOP_PREG (IC_RESULT (ic)))
-       emitcode ("cjne", "%s,#0x00,%05d$"
-                 ,aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE)
-                 ,tlbl->key + 100);
+       emitcode ("cjne", "%s,#0x00,%05d$",
+                 aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE),
+                 tlbl->key + 100);
       else
        {
          emitcode ("clr", "a");
-         emitcode ("cjne", "a,%s,%05d$"
-                   ,aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE)
-                   ,tlbl->key + 100);
+         emitcode ("cjne", "a,%s,%05d$",
+                   aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE),
+                   tlbl->key + 100);
        }
 
       emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE));
@@ -2853,13 +2863,13 @@ genPlusIncr (iCode * ic)
        {
          if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
              IS_AOP_PREG (IC_RESULT (ic)))
-           emitcode ("cjne", "%s,#0x00,%05d$"
-                     ,aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE)
-                     ,tlbl->key + 100);
+           emitcode ("cjne", "%s,#0x00,%05d$",
+                     aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE),
+                     tlbl->key + 100);
          else
-           emitcode ("cjne", "a,%s,%05d$"
-                     ,aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE)
-                     ,tlbl->key + 100);
+           emitcode ("cjne", "a,%s,%05d$",
+                     aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE),
+                     tlbl->key + 100);
 
          emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE));
        }
@@ -2867,14 +2877,14 @@ genPlusIncr (iCode * ic)
        {
          if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
              IS_AOP_PREG (IC_RESULT (ic)))
-           emitcode ("cjne", "%s,#0x00,%05d$"
-                     ,aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE)
-                     ,tlbl->key + 100);
+           emitcode ("cjne", "%s,#0x00,%05d$",
+                     aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE),
+                     tlbl->key + 100);
          else
            {
-             emitcode ("cjne", "a,%s,%05d$"
-                       ,aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE)
-                       ,tlbl->key + 100);
+             emitcode ("cjne", "a,%s,%05d$",
+                       aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE),
+                       tlbl->key + 100);
            }
          emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB32, FALSE, FALSE));
        }
@@ -4357,7 +4367,9 @@ hasInc (operand *op, iCode *ic,int osize)
   if (!IS_SYMOP(op)) return NULL;
 
   if (IS_BITVAR(retype)||!IS_PTR(type)) return NULL;
+  if (IS_AGGREGATE(type->next)) return NULL;
   if (osize != (isize = getSize(type->next))) return NULL;
+
   while (lic) {
     /* if operand of the form op = op + <sizeof *op> */
     if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) &&
@@ -8467,7 +8479,6 @@ genCast (iCode * ic)
   aopOp (result, ic, FALSE);
 
   /* if the result is a bit */
-  // if (AOP_TYPE (result) == AOP_CRY /* works only for true symbols */
   if (IS_BITVAR(OP_SYMBOL(result)->type))
     {
       /* if the right size is a literal then
@@ -8797,7 +8808,7 @@ gen51Code (iCode * lic)
   for (ic = lic; ic; ic = ic->next)
     {
 
-      if (cln != ic->lineno)
+      if (ic->lineno && cln != ic->lineno)
        {
          if (options.debug)
            {
@@ -8807,7 +8818,8 @@ gen51Code (iCode * lic)
                        ic->level, ic->block);
              _G.debugLine = 0;
            }
-         emitcode (";", "%s %d", ic->filename, ic->lineno);
+         emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, 
+                   printCLine(ic->filename, ic->lineno));
          cln = ic->lineno;
        }
       /* if the result is marked as