Fix broken genXor in bug-460444
authorkvigor <kvigor@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 15 Nov 2001 05:26:42 +0000 (05:26 +0000)
committerkvigor <kvigor@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 15 Nov 2001 05:26:42 +0000 (05:26 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1594 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/ds390/gen.c

index b9638871d28bb3b1e190bd20935e2784d158d9a6..af8ec011652b686201e2d01252da6acfc99b961f 100644 (file)
@@ -6510,6 +6510,7 @@ genXor (iCode * ic, iCode * ifx)
          // if(!size && ifx), conditional oper: if(left ^ right)
          symbol *tlbl = newiTempLabel (NULL);
          int sizer = max (AOP_SIZE (left), AOP_SIZE (right));
+                 
          if (size)
            emitcode ("setb", "c");
          while (sizer--)
@@ -6525,9 +6526,15 @@ genXor (iCode * ic, iCode * ifx)
                    emitcode ("xrl", "a,%s",
                              aopGet (AOP (right), offset, FALSE, FALSE, FALSE));
                  } else {
-                   MOVA (aopGet (AOP (right), offset, FALSE, FALSE, TRUE));
-                   emitcode ("xrl", "a,%s",
-                             aopGet (AOP (left), offset, FALSE, FALSE, FALSE));
+                     char *rOp = aopGet (AOP (right), offset, FALSE, FALSE, TRUE);
+                     if (!strcmp(rOp, "a") || !strcmp(rOp, "acc"))
+                     {
+                         emitcode("mov", "b,a");
+                         rOp = "b";
+                     }
+                       
+                     MOVA (aopGet (AOP (left), offset, FALSE, FALSE, TRUE));
+                     emitcode ("xrl", "a,%s", rOp);                  
                  }
                }
              emitcode ("jnz", "%05d$", tlbl->key + 100);
@@ -6543,6 +6550,7 @@ genXor (iCode * ic, iCode * ifx)
            jmpTrueOrFalse (ifx, tlbl);
        }
       else
+       {
        for (; (size--); offset++)
          {
            // normal case
@@ -6556,8 +6564,7 @@ genXor (iCode * ic, iCode * ifx)
                            offset);
                    continue;
                  }
-               D (emitcode (";", "better literal XOR.");
-                 );
+               D (emitcode (";", "better literal XOR."););
                MOVA (aopGet (AOP (left), offset, FALSE, FALSE, TRUE));
                emitcode ("xrl", "a, %s", aopGet (AOP (right), offset,
                                                  FALSE, FALSE, FALSE));
@@ -6586,6 +6593,8 @@ genXor (iCode * ic, iCode * ifx)
              }
            aopPut (AOP (result), "a", offset);
          }
+       }
+       
     }
 
 release: