]> git.gag.com Git - fw/sdcc/commitdiff
* src/SDCCpeeph.c (notVolatile, notVolatileVariable): handle IFX
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 1 Sep 2003 02:21:06 +0000 (02:21 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 1 Sep 2003 02:21:06 +0000 (02:21 +0000)
and JUMPTABLE iCodes properly now (worked by accident before)
* src/mcs51/gen.c (leftRightUseAcc),
* src/ds390/gen.c (leftRightUseAcc): handle IFX and JUMPTABLE
iCode properly now. Use getSize instead of nRegs since a & b
aren't part of the nRegs tally.

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

ChangeLog
src/SDCCpeeph.c
src/ds390/gen.c
src/mcs51/gen.c

index 37286e1e20d38d9cda938bd955dd08e865975c48..ca4ef33204bc308f45d8d683280823f27fc359cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-08-31  Erik Petrich <epetrich@ivorytower.norman.ok.us>
+
+       * src/SDCCpeeph.c (notVolatile, notVolatileVariable): handle IFX
+        and JUMPTABLE iCodes properly now (worked by accident before)
+       * src/mcs51/gen.c (leftRightUseAcc),
+       * src/ds390/gen.c (leftRightUseAcc): handle IFX and JUMPTABLE
+       iCode properly now. Use getSize instead of nRegs since a & b
+       aren't part of the nRegs tally. 
+
 2003-08-31  Vangelis Rokas <vrokas@otenet.gr>
        * src/pic16/main.c: corrected offsets of interrupt vectors in _pic16_genIVT()
        * src/pic16/pcode.c: fix to disable inserting BANKSEL directive
index 921642b1db2becacc19ab061365b8430e111b085..a470b6d9bfdc61007902188f21225be5bb2e9a18 100644 (file)
@@ -704,15 +704,27 @@ notVolatileVariable(char *var, lineNode *currPl, lineNode *endPl)
     if (cl->ic && (cl->ic!=last_ic))
       {
         last_ic = cl->ic;
-        op = IC_LEFT (cl->ic);
-        if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
-          return !op->isvolatile;
-        op = IC_RIGHT (cl->ic);
-        if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
-          return !op->isvolatile;
-        op = IC_RESULT (cl->ic);
-        if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
-          return !op->isvolatile;
+        switch (cl->ic->op)
+          {
+          case IFX:
+            op = IC_COND (cl->ic);
+            if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+              return !op->isvolatile;
+          case JUMPTABLE:
+            op = IC_JTCOND (cl->ic);
+            if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+              return !op->isvolatile;
+          default:
+            op = IC_LEFT (cl->ic);
+            if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+              return !op->isvolatile;
+            op = IC_RIGHT (cl->ic);
+            if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+              return !op->isvolatile;
+            op = IC_RESULT (cl->ic);
+            if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+              return !op->isvolatile;
+          }
       }
   }
   
@@ -750,15 +762,27 @@ FBYNAME (notVolatile)
       {
         if (cl->ic)
           {
-            op = IC_LEFT (cl->ic);
-            if (IS_SYMOP (op) && op->isvolatile)
-              return FALSE;
-            op = IC_RIGHT (cl->ic);
-            if (IS_SYMOP (op) && op->isvolatile)
-              return FALSE;
-            op = IC_RESULT (cl->ic);
-            if (IS_SYMOP (op) && op->isvolatile)
-              return FALSE;
+            switch (cl->ic->op)
+              {
+              case IFX:
+                op = IC_COND (cl->ic);
+                if (IS_SYMOP (op) && op->isvolatile)
+                  return FALSE;
+              case JUMPTABLE:
+                op = IC_JTCOND (cl->ic);
+                if (IS_SYMOP (op) && op->isvolatile)
+                  return FALSE;
+              default:
+                op = IC_LEFT (cl->ic);
+                if (IS_SYMOP (op) && op->isvolatile)
+                  return FALSE;
+                op = IC_RIGHT (cl->ic);
+                if (IS_SYMOP (op) && op->isvolatile)
+                  return FALSE;
+                op = IC_RESULT (cl->ic);
+                if (IS_SYMOP (op) && op->isvolatile)
+                  return FALSE;
+              }
           }
       }
       return TRUE;
index 2b93fa27ba9557024eb877c754f332a8a01af07d..411e019f03b3c693e230c15740ede0341f316d9f 100644 (file)
@@ -444,19 +444,64 @@ pointerCode (sym_link * etype)
 static int
 leftRightUseAcc(iCode *ic)
 {
+  operand *op;
+  int size;
+  int accuseSize = 0;
   int accuse = 0;
   
-  if (ic && IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
-      && OP_SYMBOL (IC_LEFT (ic)) && OP_SYMBOL (IC_LEFT (ic))->accuse)
-    accuse = (accuse < OP_SYMBOL (IC_LEFT (ic))->nRegs)
-             ? OP_SYMBOL (IC_LEFT (ic))->nRegs : accuse;
-    
-  if (ic && IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
-      && OP_SYMBOL (IC_RIGHT (ic)) && OP_SYMBOL (IC_RIGHT (ic))->accuse)
-    accuse = (accuse < OP_SYMBOL (IC_RIGHT (ic))->nRegs)
-             ? OP_SYMBOL (IC_RIGHT (ic))->nRegs : accuse;
+  if (!ic)
+    {
+      werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
+             "null iCode pointer");
+      return 0;
+    }
 
-  return accuse;
+  if (ic->op == IFX)
+    {
+      op = IC_COND (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  else if (ic->op == JUMPTABLE)
+    {
+      op = IC_JTCOND (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  else
+    {
+      op = IC_LEFT (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+      op = IC_RIGHT (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  
+  if (accuseSize)
+    return accuseSize;
+  else
+    return accuse;
 }
 
 /*-----------------------------------------------------------------*/
index af940699bed34ffd376cadeb9c73a467aecc8d73..531a758996a62fa7114948eb2d74b9fb8984d69c 100644 (file)
@@ -289,19 +289,64 @@ pointerCode (sym_link * etype)
 static int
 leftRightUseAcc(iCode *ic)
 {
+  operand *op;
+  int size;
+  int accuseSize = 0;
   int accuse = 0;
+  
+  if (!ic)
+    {
+      werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
+             "null iCode pointer");
+      return 0;
+    }
 
-  if (ic && IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
-      && OP_SYMBOL (IC_LEFT (ic)) && OP_SYMBOL (IC_LEFT (ic))->accuse)
-    accuse = (accuse < OP_SYMBOL (IC_LEFT (ic))->nRegs)
-             ? OP_SYMBOL (IC_LEFT (ic))->nRegs : accuse;
-
-  if (ic && IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
-      && OP_SYMBOL (IC_RIGHT (ic)) && OP_SYMBOL (IC_RIGHT (ic))->accuse)
-    accuse = (accuse < OP_SYMBOL (IC_RIGHT (ic))->nRegs)
-             ? OP_SYMBOL (IC_RIGHT (ic))->nRegs : accuse;
-
-  return accuse;
+  if (ic->op == IFX)
+    {
+      op = IC_COND (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  else if (ic->op == JUMPTABLE)
+    {
+      op = IC_JTCOND (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  else
+    {
+      op = IC_LEFT (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+      op = IC_RIGHT (ic);
+      if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+        {
+          accuse = 1;
+          size = getSize (OP_SYMBOL (op)->type);
+          if (size>accuseSize)
+            accuseSize = size;
+        }
+    }
+  
+  if (accuseSize)
+    return accuseSize;
+  else
+    return accuse;
 }