* as/link/asxxxx_config.h.in:
[fw/sdcc] / src / z80 / peep.c
index 6512b7d2a21bc6f1fd2517c4b8094383f8f7e537..43781745ab9c2a55527be2efac4e5fd14297963a 100644 (file)
@@ -29,7 +29,7 @@
 #include "SDCCpeeph.h"
 #include "gen.h"
 
-#define NOTUSEDERROR {fprintf (stderr, "SDCC internal error in notUsed() in %s, line %d\n", __FILE__, __LINE__);}
+#define NOTUSEDERROR() do {werror(E_INTERNAL_ERROR, __FILE__, __LINE__, "error in notUsed()");} while(0)
 
 /*#define D(_s) { printf _s; fflush(stdout); }*/
 #define D(_s)
@@ -89,7 +89,7 @@ isReturned(const char *what)
       // Find size of return value.
       specifier *spec;
       if(sym->type->select.d.dcl_type != FUNCTION)
-        NOTUSEDERROR
+        NOTUSEDERROR();
       spec = &(sym->etype->select.s);
       if(spec->noun == V_VOID)
          size = 0;
@@ -109,7 +109,7 @@ isReturned(const char *what)
     }
   else
     {
-      NOTUSEDERROR
+      NOTUSEDERROR();
       size = 4;
     }
 
@@ -169,7 +169,7 @@ findLabel (const lineNode *pl)
   /* sanity check */
   if (p == pl->line)
     {
-      NOTUSEDERROR
+      NOTUSEDERROR();
       return NULL;
     }
 
@@ -229,8 +229,11 @@ z80MightRead(const lineNode *pl, const char *what)
     strncmp(pl->line, "sub\t", 4) == 0 ||
     strncmp(pl->line, "xor\t", 4) == 0)
     {
-      if( strstr(pl->line + 3, what) == 0 && strcmp("a", what))
-        return FALSE;
+      if( strstr(pl->line + 3, what) != 0)
+        return TRUE;
+      if( strstr(pl->line + 3, "hl") == 0 && strcmp("a", what) == 0)
+        return TRUE;
+      return FALSE;
     }
 
   if(strncmp(pl->line, "pop\t", 4) == 0)
@@ -245,6 +248,7 @@ z80MightRead(const lineNode *pl, const char *what)
     strncmp(pl->line, "rl\t", 3) == 0 ||
     strncmp(pl->line, "rr\t", 3) == 0 ||  
     strncmp(pl->line, "sla\t", 4) == 0 ||
+    strncmp(pl->line, "sra\t", 4) == 0 ||
     strncmp(pl->line, "srl\t", 4) == 0)
     {
        return (strstr(pl->line + 3, what) != 0);
@@ -254,6 +258,9 @@ z80MightRead(const lineNode *pl, const char *what)
     (bool)(strncmp(pl->line, "jr\t", 3)) == 0)
     return FALSE;
 
+  if(strncmp(pl->line, "djnz\t", 5) == 0)
+    return(strchr(what, 'b') != 0);
+
   if(strncmp(pl->line, "rla", 3) == 0 ||
     strncmp(pl->line, "rlca", 4) == 0)
     return(strcmp(what, "a") == 0);
@@ -273,8 +280,9 @@ z80UncondJump(const lineNode *pl)
 static bool
 z80CondJump(const lineNode *pl)
 {
-  if((strncmp(pl->line, "jp\t", 3) == 0 ||
-    strncmp(pl->line, "jr\t", 3) == 0) && strchr(pl->line, ',') != 0)
+  if(((strncmp(pl->line, "jp\t", 3) == 0 ||
+    strncmp(pl->line, "jr\t", 3) == 0) && strchr(pl->line, ',') != 0) ||
+    strncmp(pl->line, "djnz\t", 5) == 0)
     return TRUE;
   return FALSE;
 }