Fixed some warnings when building in MSVC
[fw/sdcc] / src / mcs51 / gen.c
index 718a1ccab42519c177afb3b8b1505847e7052c0d..6825ec2eda447731b3ecc62beeaa6e979f385901 100644 (file)
 #include "SDCCglobl.h"
 #include "newalloc.h"
 
-#ifdef HAVE_SYS_ISA_DEFS_H
-#include <sys/isa_defs.h>
-#else
-#ifdef HAVE_MACHINE_ENDIAN_H
-#include <machine/endian.h>
-#else
-#ifdef HAVE_ENDIAN_H
-#include <endian.h>
-#else
-#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__)
-#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN"
-#warning "If you running sdcc on an INTEL 80x86 Platform you are okay"
-#endif
-#endif
-#endif
-#endif
-
 #include "common.h"
 #include "SDCCpeeph.h"
 #include "ralloc.h"
@@ -79,7 +62,7 @@ char **fReturn = fReturn8051;
 static char *accUse[] =
 {"a", "b"};
 
-static short rbank = -1;
+static unsigned short rbank = -1;
 
 static struct
   {
@@ -105,7 +88,7 @@ static void saveRBank (int, iCode *, bool);
                          (IC_RESULT(x) && IC_RESULT(x)->aop && \
                          IC_RESULT(x)->aop->type == AOP_STK )
 
-#define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) emitcode("mov","a,%s",x);
+#define MOVA(x) mova(x)  /* use function to avoid multiple eval */
 #define CLRC    emitcode("clr","c")
 #define SETC    emitcode("setb","c")
 
@@ -128,7 +111,7 @@ static unsigned char SRMask[] =
 /* emitcode - writes the code into a file : for now it is simple    */
 /*-----------------------------------------------------------------*/
 static void
-emitcode (char *inst, char *fmt,...)
+emitcode (char *inst, const char *fmt,...)
 {
   va_list ap;
   char lb[INITIAL_INLINEASM];
@@ -159,6 +142,19 @@ emitcode (char *inst, char *fmt,...)
   va_end (ap);
 }
 
+/*-----------------------------------------------------------------*/
+/* mova - moves specified value into accumulator                   */
+/*-----------------------------------------------------------------*/
+static void
+mova (const char *x)
+{
+  /* do some early peephole optimization */
+  if (!strcmp(x, "a") || !strcmp(x, "acc"))
+    return;
+
+  emitcode("mov","a,%s", x);
+}
+
 /*-----------------------------------------------------------------*/
 /* getFreePtr - returns r0 or r1 whichever is free or can be pushed */
 /*-----------------------------------------------------------------*/
@@ -234,17 +230,26 @@ getFreePtr (iCode * ic, asmop ** aopp, bool result)
       (*aopp)->type = AOP_R1;
       return mcs51_regWithIdx (R1_IDX);
     }
-
 endOfWorld:
-  /* I said end of world but not quite end of world yet */
-  /* if this is a result then we can push it on the stack */
-  if (result)
-    {
-      (*aopp)->type = AOP_STK;
-      return NULL;
+  /* I said end of world, but not quite end of world yet */
+  if (result) {
+    /* we can push it on the stack */
+    (*aopp)->type = AOP_STK;
+    return NULL;
+  } else {
+    /* in the case that result AND left AND right needs a pointer reg
+       we can safely use the result's */
+    if (bitVectBitValue (mcs51_rUmaskForOp(IC_RESULT(ic)), R0_IDX)) {
+      (*aopp)->type = AOP_R0;
+      return mcs51_regWithIdx (R0_IDX);
+    }
+    if (bitVectBitValue (mcs51_rUmaskForOp(IC_RESULT(ic)), R1_IDX)) {
+      (*aopp)->type = AOP_R1;
+      return mcs51_regWithIdx (R1_IDX);
     }
+  }
 
-  /* other wise this is true end of the world */
+  /* now this is REALLY the end of the world */
   werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
          "getFreePtr should never reach here");
   exit (1);
@@ -755,6 +760,51 @@ dealloc:
     }
 }
 
+/*-----------------------------------------------------------------*/
+/* aopGetUsesAcc - indicates ahead of time whether aopGet() will   */
+/*                 clobber the accumulator                         */
+/*-----------------------------------------------------------------*/
+static bool
+aopGetUsesAcc (asmop *aop, int offset)
+{
+  if (offset > (aop->size - 1))
+    return FALSE;
+
+  switch (aop->type)
+    {
+
+    case AOP_R0:
+    case AOP_R1:
+      if (aop->paged)
+       return TRUE;
+      return FALSE;
+    case AOP_DPTR:
+      return TRUE;
+    case AOP_IMMD:
+      return FALSE;
+    case AOP_DIR:
+      return FALSE;
+    case AOP_REG:
+      wassert(strcmp(aop->aopu.aop_reg[offset]->name, "a"));
+      return FALSE;
+    case AOP_CRY:
+      return TRUE;
+    case AOP_ACC:
+      return TRUE;
+    case AOP_LIT:
+      return FALSE;
+    case AOP_STR:
+      if (strcmp (aop->aopu.aop_str[offset], "a") == 0)
+       return TRUE;
+      return FALSE;
+    default:
+      /* Error case --- will have been caught already */
+      wassert(0);
+      return FALSE;
+    }
+}
+
+
 /*-----------------------------------------------------------------*/
 /* aopGet - for fetching value of the aop                          */
 /*-----------------------------------------------------------------*/
@@ -801,6 +851,12 @@ aopGet (asmop * aop, int offset, bool bit16, bool dname)
       return rs;
 
     case AOP_DPTR:
+      if (aop->code && aop->coff==0 && offset>=1) {
+       emitcode ("mov", "a,#0x%02x", offset);
+       emitcode ("movc", "a,@a+dptr");
+       return (dname ? "acc" : "a");
+      }
+
       while (offset > aop->coff)
        {
          emitcode ("inc", "dptr");
@@ -891,7 +947,7 @@ aopGet (asmop * aop, int offset, bool bit16, bool dname)
 /* aopPut - puts a string for a aop                                */
 /*-----------------------------------------------------------------*/
 static void
-aopPut (asmop * aop, char *s, int offset)
+aopPut (asmop * aop, const char *s, int offset, bool bvolatile)
 {
   char *d = buffer;
 
@@ -913,7 +969,8 @@ aopPut (asmop * aop, char *s, int offset)
       else
        sprintf (d, "%s", aop->aopu.aop_dir);
 
-      if (strcmp (d, s))
+      if (strcmp (d, s) ||
+          bvolatile)
        emitcode ("mov", "%s,%s", d, s);
 
       break;
@@ -943,7 +1000,7 @@ aopPut (asmop * aop, char *s, int offset)
       if (aop->code)
        {
          werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
-                 "aopPut writting to code space");
+                 "aopPut writing to code space");
          exit (1);
        }
 
@@ -1056,16 +1113,19 @@ aopPut (asmop * aop, char *s, int offset)
 
     case AOP_STR:
       aop->coff = offset;
-      if (strcmp (aop->aopu.aop_str[offset], s))
+      if (strcmp (aop->aopu.aop_str[offset], s) ||
+          bvolatile)
        emitcode ("mov", "%s,%s", aop->aopu.aop_str[offset], s);
       break;
 
     case AOP_ACC:
       aop->coff = offset;
-      if (!offset && (strcmp (s, "acc") == 0))
+      if (!offset && (strcmp (s, "acc") == 0) &&
+          !bvolatile)
        break;
 
-      if (strcmp (aop->aopu.aop_str[offset], s))
+      if (strcmp (aop->aopu.aop_str[offset], s) &&
+          !bvolatile)
        emitcode ("mov", "%s,%s", aop->aopu.aop_str[offset], s);
       break;
 
@@ -1155,11 +1215,11 @@ genNotFloat (operand * op, operand * res)
   char *l;
   symbol *tlbl;
 
-  D(emitcode (";", "genNotFloat"));
+  D(emitcode (";     genNotFloat",""));
 
   /* we will put 127 in the first byte of
      the result */
-  aopPut (AOP (res), "#127", 0);
+  aopPut (AOP (res), "#127", 0, isOperandVolatile (op, FALSE));
   size = AOP_SIZE (op) - 1;
   offset = 1;
 
@@ -1174,16 +1234,16 @@ genNotFloat (operand * op, operand * res)
     }
 
   tlbl = newiTempLabel (NULL);
-  aopPut (res->aop, one, 1);
+  aopPut (res->aop, one, 1, isOperandVolatile (op, FALSE));
   emitcode ("jz", "%05d$", (tlbl->key + 100));
-  aopPut (res->aop, zero, 1);
+  aopPut (res->aop, zero, 1, isOperandVolatile (op, FALSE));
   emitcode ("", "%05d$:", (tlbl->key + 100));
 
   size = res->aop->size - 2;
   offset = 2;
   /* put zeros in the rest */
   while (size--)
-    aopPut (res->aop, zero, offset++);
+    aopPut (res->aop, zero, offset++, isOperandVolatile (op, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -1234,13 +1294,13 @@ outAcc (operand * result)
   size = getDataSize (result);
   if (size)
     {
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       size--;
       offset = 1;
       /* unsigned or positive */
       while (size--)
        {
-         aopPut (AOP (result), zero, offset++);
+         aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE));
        }
     }
 }
@@ -1253,7 +1313,7 @@ outBitC (operand * result)
 {
   /* if the result is bit */
   if (AOP_TYPE (result) == AOP_CRY)
-    aopPut (AOP (result), "c", 0);
+    aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE));
   else
     {
       emitcode ("clr", "a");
@@ -1285,7 +1345,7 @@ genNot (iCode * ic)
   symbol *tlbl;
   sym_link *optype = operandType (IC_LEFT (ic));
 
-  D(emitcode (";", "genNot"));
+  D(emitcode (";     genNot",""));
 
   /* assign asmOps to operand & result */
   aopOp (IC_LEFT (ic), ic, FALSE);
@@ -1331,7 +1391,7 @@ genCpl (iCode * ic)
   int size;
   symbol *tlbl;
 
-  D(emitcode (";", "genCpl"));
+  D(emitcode (";     genCpl",""));
 
   /* assign asmOps to operand & result */
   aopOp (IC_LEFT (ic), ic, FALSE);
@@ -1359,7 +1419,7 @@ genCpl (iCode * ic)
       char *l = aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE);
       MOVA (l);
       emitcode ("cpl", "a");
-      aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+      aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
 
@@ -1378,25 +1438,27 @@ genUminusFloat (operand * op, operand * result)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genUminusFloat"));
-
-  /* for this we just need to flip the
-     first it then copy the rest in place */
-  size = AOP_SIZE (op) - 1;
-  l = aopGet (AOP (op), 3, FALSE, FALSE);
+  D(emitcode (";     genUminusFloat",""));
 
-  MOVA (l);
+  /* for this we just copy and then flip the bit */
 
-  emitcode ("cpl", "acc.7");
-  aopPut (AOP (result), "a", 3);
+  size = AOP_SIZE (op) - 1;
 
   while (size--)
     {
       aopPut (AOP (result),
              aopGet (AOP (op), offset, FALSE, FALSE),
-             offset);
+             offset,
+             isOperandVolatile (result, FALSE));
       offset++;
     }
+
+  l = aopGet (AOP (op), offset, FALSE, FALSE);
+
+  MOVA (l);
+
+  emitcode ("cpl", "acc.7");
+  aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -1409,7 +1471,7 @@ genUminus (iCode * ic)
   sym_link *optype, *rtype;
 
 
-  D(emitcode (";", "genUminus"));
+  D(emitcode (";     genUminus",""));
 
   /* assign asmops */
   aopOp (IC_LEFT (ic), ic, FALSE);
@@ -1458,7 +1520,7 @@ genUminus (iCode * ic)
          emitcode ("clr", "a");
          emitcode ("subb", "a,%s", l);
        }
-      aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+      aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
   /* if any remaining bytes in the result */
@@ -1468,7 +1530,7 @@ genUminus (iCode * ic)
       emitcode ("rlc", "a");
       emitcode ("subb", "a,acc");
       while (size--)
-       aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+       aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
 release:
@@ -1500,10 +1562,13 @@ saveRegisters (iCode * lic)
 
   /* if the registers have been saved already or don't need to be then
      do nothing */
-  if (ic->regsSaved || IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type) ||
-      IFFUNC_ISNAKED(OP_SYM_TYPE(IC_LEFT (ic))))
+  if (ic->regsSaved)
     return;
-
+  if (IS_SYMOP(IC_LEFT(ic)) &&
+      (IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type) ||
+       IFFUNC_ISNAKED(OP_SYM_TYPE(IC_LEFT (ic)))))
+    return;
+  
   /* safe the registers in use at this time but skip the
      ones for the result */
   rsave = bitVectCplAnd (bitVectCopy (ic->rMask), 
@@ -1615,7 +1680,7 @@ assignResultValue (operand * oper)
   int size = AOP_SIZE (oper);
   while (size--)
     {
-      aopPut (AOP (oper), fReturn[offset], offset);
+      aopPut (AOP (oper), fReturn[offset], offset, isOperandVolatile (oper, FALSE));
       offset++;
     }
 }
@@ -1631,7 +1696,7 @@ genXpush (iCode * ic)
   regs *r;
   int size, offset = 0;
 
-  D(emitcode (";", "genXpush"));
+  D(emitcode (";     genXpush",""));
 
   aopOp (IC_LEFT (ic), ic, FALSE);
   r = getFreePtr (ic, &aop, FALSE);
@@ -1667,7 +1732,7 @@ genIpush (iCode * ic)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genIpush"));
+  D(emitcode (";     genIpush",""));
 
   /* if this is not a parm push : ie. it is spill push
      and spill push is always done on the local stack */
@@ -1739,7 +1804,7 @@ genIpop (iCode * ic)
 {
   int size, offset;
 
-  D(emitcode (";", "genIpop"));
+  D(emitcode (";     genIpop",""));
 
   /* if the temp was not pushed then */
   if (OP_SYMBOL (IC_LEFT (ic))->isspilt)
@@ -1931,7 +1996,7 @@ genCall (iCode * ic)
 //  bool restoreBank = FALSE;
   bool swapBanks = FALSE;
 
-  D(emitcode(";", "genCall"));
+  D(emitcode(";     genCall",""));
 
   dtype = operandType (IC_LEFT (ic));
   /* if send set is not empty the assign */
@@ -2031,7 +2096,7 @@ genPcall (iCode * ic)
 //  bool restoreBank=FALSE;
   bool swapBanks = FALSE;
 
-  D(emitcode(";", "genPCall"));
+  D(emitcode(";     genPCall",""));
 
   /* if caller saves & we have not saved then */
   if (!ic->regsSaved)
@@ -2159,22 +2224,22 @@ resultRemat (iCode * ic)
 /*-----------------------------------------------------------------*/
 /* inExcludeList - return 1 if the string is in exclude Reg list   */
 /*-----------------------------------------------------------------*/
+static int
+regsCmp(void *p1, void *p2)
+{
+  return (STRCASECMP((char *)p1, (char *)(p2)) == 0);
+}
+
 static bool
 inExcludeList (char *s)
 {
-  int i = 0;
+  const char *p = setFirstItem(options.excludeRegsSet);
 
-  if (options.excludeRegs[i] &&
-      STRCASECMP (options.excludeRegs[i], "none") == 0)
+  if (p == NULL || STRCASECMP(p, "none") == 0)
     return FALSE;
 
-  for (i = 0; options.excludeRegs[i]; i++)
-    {
-      if (options.excludeRegs[i] &&
-         STRCASECMP (s, options.excludeRegs[i]) == 0)
-       return TRUE;
-    }
-  return FALSE;
+
+  return isinSetWith(options.excludeRegsSet, s, regsCmp);
 }
 
 /*-----------------------------------------------------------------*/
@@ -2369,7 +2434,7 @@ genFunction (iCode * ic)
                     }
                }
            }
-           // jwk: this needs a closer look
+           // TODO: this needs a closer look
            SPEC_ISR_SAVED_BANKS(currFunc->etype) = banksToSave;
        }
     }
@@ -2463,12 +2528,12 @@ genFunction (iCode * ic)
            }
          else
            {
-             /* not callee-saves, we can clobber ar0 */
-             emitcode ("mov", "ar0,a");
+             /* not callee-saves, we can clobber r0 */
+             emitcode ("mov", "r0,a");
              emitcode ("mov", "a,sp");
              emitcode ("add", "a,#0x%02x", ((char) sym->stack & 0xff));
              emitcode ("mov", "sp,a");
-             emitcode ("mov", "a,ar0");
+             emitcode ("mov", "a,r0");
            }
        }
       else
@@ -2594,7 +2659,6 @@ genEndFunction (iCode * ic)
             * Restore any register banks saved by genFunction
             * in reverse order.
             */
-         // jwk: this needs a closer look
            unsigned savedBanks = SPEC_ISR_SAVED_BANKS(currFunc->etype);
            int ix;
          
@@ -2693,7 +2757,7 @@ genRet (iCode * ic)
 {
   int size, offset = 0, pushed = 0;
 
-  D(emitcode (";", "genRet"));
+  D(emitcode (";     genRet",""));
 
   /* if we have no return value then
      just generate the "ret" */
@@ -2822,10 +2886,10 @@ genPlusIncr (iCode * ic)
   if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4)
     return FALSE;
 
-  D(emitcode (";", "genPlusIncr"));
+  D(emitcode (";     genPlusIncr",""));
 
-  /* if increment 16 bits in register */
-  if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG &&
+  /* if increment >=16 bits in register or direct space */
+  if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) &&
       sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && 
       (size > 1) &&
       (icount == 1))
@@ -2918,7 +2982,7 @@ genPlusIncr (iCode * ic)
        {
          MOVA (aopGet (AOP (IC_LEFT (ic)), 0, FALSE, FALSE));
          emitcode ("add", "a,#0x%02x", ((char) icount) & 0xff);
-         aopPut (AOP (IC_RESULT (ic)), "a", 0);
+         aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE));
        }
       else
        {
@@ -2943,7 +3007,7 @@ outBitAcc (operand * result)
   /* if the result is a bit */
   if (AOP_TYPE (result) == AOP_CRY)
     {
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
     }
   else
     {
@@ -2960,7 +3024,7 @@ outBitAcc (operand * result)
 static void
 genPlusBits (iCode * ic)
 {
-  D(emitcode (";", "genPlusBits"));
+  D(emitcode (";     genPlusBits",""));
 
   if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
     {
@@ -2996,14 +3060,16 @@ adjustArithmeticResult (iCode * ic)
       !sameRegs (AOP (IC_RESULT (ic)), AOP (IC_LEFT (ic))))
     aopPut (AOP (IC_RESULT (ic)),
            aopGet (AOP (IC_LEFT (ic)), 2, FALSE, FALSE),
-           2);
+           2,
+           isOperandVolatile (IC_RESULT (ic), FALSE));
 
   if (AOP_SIZE (IC_RESULT (ic)) == 3 &&
       AOP_SIZE (IC_RIGHT (ic)) == 3 &&
       !sameRegs (AOP (IC_RESULT (ic)), AOP (IC_RIGHT (ic))))
     aopPut (AOP (IC_RESULT (ic)),
            aopGet (AOP (IC_RIGHT (ic)), 2, FALSE, FALSE),
-           2);
+           2,
+           isOperandVolatile (IC_RESULT (ic), FALSE));
 
   if (AOP_SIZE (IC_RESULT (ic)) == 3 &&
       AOP_SIZE (IC_LEFT (ic)) < 3 &&
@@ -3013,7 +3079,7 @@ adjustArithmeticResult (iCode * ic)
     {
       char buffer[5];
       sprintf (buffer, "#%d", pointerCode (getSpec (operandType (IC_LEFT (ic)))));
-      aopPut (AOP (IC_RESULT (ic)), buffer, 2);
+      aopPut (AOP (IC_RESULT (ic)), buffer, 2, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 }
 #else
@@ -3030,7 +3096,8 @@ adjustArithmeticResult (iCode * ic)
     {
       aopPut (AOP (IC_RESULT (ic)),
              aopGet (AOP (IC_LEFT (ic)), GPTRSIZE - 1, FALSE, FALSE),
-             GPTRSIZE - 1);
+             GPTRSIZE - 1,
+             isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
   if (opIsGptr (IC_RESULT (ic)) &&
@@ -3039,7 +3106,8 @@ adjustArithmeticResult (iCode * ic)
     {
       aopPut (AOP (IC_RESULT (ic)),
              aopGet (AOP (IC_RIGHT (ic)), GPTRSIZE - 1, FALSE, FALSE),
-             GPTRSIZE - 1);
+             GPTRSIZE - 1,
+             isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
   if (opIsGptr (IC_RESULT (ic)) &&
@@ -3050,7 +3118,7 @@ adjustArithmeticResult (iCode * ic)
     {
       char buffer[5];
       sprintf (buffer, "#%d", pointerCode (getSpec (operandType (IC_LEFT (ic)))));
-      aopPut (AOP (IC_RESULT (ic)), buffer, GPTRSIZE - 1);
+      aopPut (AOP (IC_RESULT (ic)), buffer, GPTRSIZE - 1, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 }
 #endif
@@ -3062,10 +3130,12 @@ static void
 genPlus (iCode * ic)
 {
   int size, offset = 0;
+  char *add;
+  asmop *leftOp, *rightOp;
 
   /* special cases :- */
 
-  D(emitcode (";", "genPlus"));
+  D(emitcode (";     genPlus",""));
 
   aopOp (IC_LEFT (ic), ic, FALSE);
   aopOp (IC_RIGHT (ic), ic, FALSE);
@@ -3111,7 +3181,7 @@ genPlus (iCode * ic)
            {
              MOVA (aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE));
              emitcode ("addc", "a,#00");
-             aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+             aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
            }
        }
       goto release;
@@ -3124,29 +3194,32 @@ genPlus (iCode * ic)
 
   size = getDataSize (IC_RESULT (ic));
 
+  leftOp = AOP(IC_LEFT(ic));
+  rightOp = AOP(IC_RIGHT(ic));
+  add = "add";
+
   while (size--)
     {
-      if (AOP_TYPE (IC_LEFT (ic)) == AOP_ACC)
+      if (aopGetUsesAcc (leftOp, offset) && aopGetUsesAcc (rightOp, offset))
        {
-         MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE));
-         if (offset == 0)
-           emitcode ("add", "a,%s",
-                     aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE));
-         else
-           emitcode ("addc", "a,%s",
-                     aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE));
+         emitcode("mov", "b,a");
+         MOVA (aopGet (leftOp,  offset, FALSE, TRUE));
+         emitcode("xch", "a,b");
+         MOVA (aopGet (rightOp, offset, FALSE, TRUE));
+         emitcode (add, "a,b");
+       }
+      else if (aopGetUsesAcc (leftOp, offset))
+       {
+         MOVA (aopGet (leftOp, offset, FALSE, TRUE));
+         emitcode (add, "a,%s", aopGet (rightOp, offset, FALSE, TRUE));
        }
       else
        {
-         MOVA (aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE));
-         if (offset == 0)
-           emitcode ("add", "a,%s",
-                     aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE));
-         else
-           emitcode ("addc", "a,%s",
-                     aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE));
+         MOVA (aopGet (rightOp, offset, FALSE, TRUE));
+         emitcode (add, "a,%s", aopGet (leftOp, offset, FALSE, TRUE));
        }
-      aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+      aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
+      add = "addc";  /* further adds must propagate carry */
     }
 
   adjustArithmeticResult (ic);
@@ -3177,10 +3250,10 @@ genMinusDec (iCode * ic)
   if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4)
     return FALSE;
 
-  D(emitcode (";", "genMinusDec"));
+  D(emitcode (";     genMinusDec",""));
 
-  /* if decrement 16 bits in register */
-  if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG &&
+  /* if decrement >=16 bits in register or direct space */
+  if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR) &&
       sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) &&
       (size > 1) &&
       (icount == 1))
@@ -3292,11 +3365,11 @@ addSign (operand * result, int offset, int sign)
          emitcode ("rlc", "a");
          emitcode ("subb", "a,acc");
          while (size--)
-           aopPut (AOP (result), "a", offset++);
+           aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
        }
       else
        while (size--)
-         aopPut (AOP (result), zero, offset++);
+         aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE));
     }
 }
 
@@ -3308,7 +3381,7 @@ genMinusBits (iCode * ic)
 {
   symbol *lbl = newiTempLabel (NULL);
 
-  D(emitcode (";", "genMinusBits"));
+  D(emitcode (";     genMinusBits",""));
 
   if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
     {
@@ -3325,7 +3398,7 @@ genMinusBits (iCode * ic)
       emitcode ("jnb", "%s,%05d$", AOP (IC_LEFT (ic))->aopu.aop_dir, (lbl->key + 100));
       emitcode ("inc", "a");
       emitcode ("", "%05d$:", (lbl->key + 100));
-      aopPut (AOP (IC_RESULT (ic)), "a", 0);
+      aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE));
       addSign (IC_RESULT (ic), MSB16, SPEC_USIGN (getSpec (operandType (IC_RESULT (ic)))));
     }
 }
@@ -3337,9 +3410,8 @@ static void
 genMinus (iCode * ic)
 {
   int size, offset = 0;
-  unsigned long lit = 0L;
 
-  D(emitcode (";", "genMinus"));
+  D(emitcode (";     genMinus",""));
 
   aopOp (IC_LEFT (ic), ic, FALSE);
   aopOp (IC_RIGHT (ic), ic, FALSE);
@@ -3361,41 +3433,62 @@ genMinus (iCode * ic)
 
   size = getDataSize (IC_RESULT (ic));
 
-  if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT)
-    {
-      CLRC;
-    }
-  else
+  /* if literal, add a,#-lit, else normal subb */
+  if (AOP_TYPE (IC_RIGHT (ic)) == AOP_LIT)
     {
+      unsigned long lit = 0L;
+
       lit = (unsigned long) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit);
       lit = -(long) lit;
-    }
 
-  /* if literal, add a,#-lit, else normal subb */
-  while (size--)
-    {
-      MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE));
-      if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT)
-       emitcode ("subb", "a,%s",
-                 aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE));
-      else
+      while (size--)
        {
+         MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE));
          /* first add without previous c */
          if (!offset) {
-           if (!size && lit==-1) {
+           if (!size && lit== (unsigned long) -1) {
              emitcode ("dec", "a");
            } else {
-             emitcode ("add", "a,#0x%02x", 
+             emitcode ("add", "a,#0x%02x",
                        (unsigned int) (lit & 0x0FFL));
            }
          } else {
            emitcode ("addc", "a,#0x%02x",
                      (unsigned int) ((lit >> (offset * 8)) & 0x0FFL));
          }
+         aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
        }
-      aopPut (AOP (IC_RESULT (ic)), "a", offset++);
     }
+  else
+    {
+      asmop *leftOp, *rightOp;
+
+      leftOp = AOP(IC_LEFT(ic));
+      rightOp = AOP(IC_RIGHT(ic));
 
+      while (size--)
+       {
+         if (aopGetUsesAcc(rightOp, offset)) {
+           wassertl(!aopGetUsesAcc(leftOp, offset), "accumulator clash");
+           MOVA (aopGet(rightOp, offset, FALSE, TRUE));
+           if (offset == 0) {
+             emitcode( "setb", "c");
+           }
+           emitcode("subb", "a,%s", aopGet(leftOp, offset, FALSE, TRUE));
+           emitcode("cpl", "a");
+         } else {
+           MOVA (aopGet (leftOp, offset, FALSE, FALSE));
+           if (offset == 0)
+             CLRC;
+           emitcode ("subb", "a,%s",
+                     aopGet(rightOp, offset, FALSE, TRUE));
+         }
+
+         aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
+       }
+    }
+  
+  
   adjustArithmeticResult (ic);
 
 release:
@@ -3413,7 +3506,7 @@ genMultbits (operand * left,
             operand * right,
             operand * result)
 {
-  D(emitcode (";", "genMultbits"));
+  D(emitcode (";     genMultbits",""));
 
   emitcode ("mov", "c,%s", AOP (left)->aopu.aop_dir);
   emitcode ("anl", "c,%s", AOP (right)->aopu.aop_dir);
@@ -3433,11 +3526,11 @@ genMultOneByte (operand * left,
   symbol *lbl;
   int size=AOP_SIZE(result);
 
-  D(emitcode (";", "genMultOneByte"));
+  D(emitcode (";     genMultOneByte",""));
 
   if (size<1 || size>2) {
     // this should never happen
-      fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n", 
+      fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n",
               AOP_SIZE(result), __FILE__, lineno);
       exit (1);
   }
@@ -3458,12 +3551,13 @@ genMultOneByte (operand * left,
          SPEC_USIGN(operandType(right)))) {
     // just an unsigned 8*8=8/16 multiply
     //emitcode (";","unsigned");
+    // TODO: check for accumulator clash between left & right aops?
     emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE));
     MOVA (aopGet (AOP (left), 0, FALSE, FALSE));
     emitcode ("mul", "ab");
-    aopPut (AOP (result), "a", 0);
+    aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
     if (size==2) {
-      aopPut (AOP (result), "b", 1);
+      aopPut (AOP (result), "b", 1, isOperandVolatile (result, FALSE));
     }
     return;
   }
@@ -3485,7 +3579,7 @@ genMultOneByte (operand * left,
 
   /* if literal */
   if (AOP_TYPE(right)==AOP_LIT) {
-    signed char val=floatFromVal (AOP (right)->aopu.aop_lit);
+    signed char val=(signed char)floatFromVal (AOP (right)->aopu.aop_lit);
     /* AND literal negative */
     if (val < 0) {
       emitcode ("cpl", "F0"); // complement sign flag
@@ -3521,9 +3615,9 @@ genMultOneByte (operand * left,
   }
 
   emitcode ("", "%05d$:", lbl->key+100);
-  aopPut (AOP (result), "a", 0);
+  aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
   if (size==2) {
-    aopPut (AOP (result), "b", 1);
+    aopPut (AOP (result), "b", 1, isOperandVolatile (result, FALSE));
   }
 }
 
@@ -3537,7 +3631,7 @@ genMult (iCode * ic)
   operand *right = IC_RIGHT (ic);
   operand *result = IC_RESULT (ic);
 
-  D(emitcode (";", "genMult"));
+  D(emitcode (";     genMult",""));
 
   /* assign the amsops */
   aopOp (left, ic, FALSE);
@@ -3587,7 +3681,7 @@ genDivbits (operand * left,
 
   char *l;
 
-  D(emitcode (";", "genDivbits"));
+  D(emitcode (";     genDivbits",""));
 
   /* the result must be bit */
   emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE));
@@ -3597,7 +3691,7 @@ genDivbits (operand * left,
 
   emitcode ("div", "ab");
   emitcode ("rrc", "a");
-  aopPut (AOP (result), "c", 0);
+  aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -3613,7 +3707,7 @@ genDivOneByte (operand * left,
   symbol *lbl;
   int size, offset;
 
-  D(emitcode (";", "genDivOneByte"));
+  D(emitcode (";     genDivOneByte",""));
 
   size = AOP_SIZE (result) - 1;
   offset = 1;
@@ -3625,9 +3719,9 @@ genDivOneByte (operand * left,
       l = aopGet (AOP (left), 0, FALSE, FALSE);
       MOVA (l);
       emitcode ("div", "ab");
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       while (size--)
-       aopPut (AOP (result), zero, offset++);
+       aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE));
       return;
     }
 
@@ -3677,14 +3771,14 @@ genDivOneByte (operand * left,
   emitcode ("", "%05d$:", (lbl->key + 100));
 
   /* now we are done */
-  aopPut (AOP (result), "b", 0);
+  aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE));
   if (size > 0)
     {
       emitcode ("mov", "c,b.7");
       emitcode ("subb", "a,acc");
     }
   while (size--)
-    aopPut (AOP (result), "a", offset++);
+    aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
 
 }
 
@@ -3698,7 +3792,7 @@ genDiv (iCode * ic)
   operand *right = IC_RIGHT (ic);
   operand *result = IC_RESULT (ic);
 
-  D(emitcode (";", "genDiv"));
+  D(emitcode (";     genDiv",""));
 
   /* assign the amsops */
   aopOp (left, ic, FALSE);
@@ -3741,7 +3835,7 @@ genModbits (operand * left,
 
   char *l;
 
-  D(emitcode (";", "genModbits"));
+  D(emitcode (";     genModbits",""));
 
   /* the result must be bit */
   emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE));
@@ -3752,7 +3846,7 @@ genModbits (operand * left,
   emitcode ("div", "ab");
   emitcode ("mov", "a,b");
   emitcode ("rrc", "a");
-  aopPut (AOP (result), "c", 0);
+  aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -3767,7 +3861,7 @@ genModOneByte (operand * left,
   char *l;
   symbol *lbl;
 
-  D(emitcode (";", "genModOneByte"));
+  D(emitcode (";     genModOneByte",""));
 
   /* signed or unsigned */
   if (SPEC_USIGN (opetype))
@@ -3777,7 +3871,7 @@ genModOneByte (operand * left,
       l = aopGet (AOP (left), 0, FALSE, FALSE);
       MOVA (l);
       emitcode ("div", "ab");
-      aopPut (AOP (result), "b", 0);
+      aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE));
       return;
     }
 
@@ -3828,7 +3922,7 @@ genModOneByte (operand * left,
   emitcode ("", "%05d$:", (lbl->key + 100));
 
   /* now we are done */
-  aopPut (AOP (result), "b", 0);
+  aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE));
 
 }
 
@@ -3842,7 +3936,7 @@ genMod (iCode * ic)
   operand *right = IC_RIGHT (ic);
   operand *result = IC_RESULT (ic);
 
-  D(emitcode (";", "genMod"));
+  D(emitcode (";     genMod",""));
 
   /* assign the amsops */
   aopOp (left, ic, FALSE);
@@ -3885,7 +3979,7 @@ genIfxJump (iCode * ic, char *jval)
   symbol *tlbl = newiTempLabel (NULL);
   char *inst;
 
-  D(emitcode (";", "genIfxJump"));
+  D(emitcode (";     genIfxJump",""));
 
   /* if true label then we jump if condition
      supplied is true */
@@ -3922,15 +4016,16 @@ genCmp (operand * left, operand * right,
 {
   int size, offset = 0;
   unsigned long lit = 0L;
+  bool rightInB;
 
-  D(emitcode (";", "genCmp"));
+  D(emitcode (";     genCmp",""));
 
   /* if left & right are bit variables */
   if (AOP_TYPE (left) == AOP_CRY &&
       AOP_TYPE (right) == AOP_CRY)
     {
       emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
-      emitcode ("anl", "c,/%s", AOP (left)->aopu.aop_dir);
+      emitcode ("anl", "c,%s", AOP (left)->aopu.aop_dir);
     }
   else
     {
@@ -3979,6 +4074,9 @@ genCmp (operand * left, operand * right,
          CLRC;
          while (size--)
            {
+             rightInB = aopGetUsesAcc(AOP (right), offset);
+             if (rightInB)
+               emitcode ("mov", "b,%s", aopGet (AOP (right), offset, FALSE, FALSE));
              MOVA (aopGet (AOP (left), offset, FALSE, FALSE));
              if (sign && size == 0)
                {
@@ -3992,13 +4090,20 @@ genCmp (operand * left, operand * right,
                    }
                  else
                    {
-                     emitcode ("mov", "b,%s", aopGet (AOP (right), offset++, FALSE, FALSE));
+                     if (!rightInB)
+                       emitcode ("mov", "b,%s", aopGet (AOP (right), offset, FALSE, FALSE));
                      emitcode ("xrl", "b,#0x80");
                      emitcode ("subb", "a,b");
                    }
                }
              else
-               emitcode ("subb", "a,%s", aopGet (AOP (right), offset++, FALSE, FALSE));
+               {
+                 if (rightInB)
+                   emitcode ("subb", "a,b");
+                 else
+                   emitcode ("subb", "a,%s", aopGet (AOP (right), offset, FALSE, FALSE));
+               }
+             offset++;
            }
        }
     }
@@ -4033,7 +4138,7 @@ genCmpGt (iCode * ic, iCode * ifx)
   sym_link *letype, *retype;
   int sign;
 
-  D(emitcode (";", "genCmpGt"));
+  D(emitcode (";     genCmpGt",""));
 
   left = IC_LEFT (ic);
   right = IC_RIGHT (ic);
@@ -4062,7 +4167,7 @@ genCmpLt (iCode * ic, iCode * ifx)
   sym_link *letype, *retype;
   int sign;
 
-  D(emitcode (";", "genCmpLt"));
+  D(emitcode (";     genCmpLt",""));
 
   left = IC_LEFT (ic);
   right = IC_RIGHT (ic);
@@ -4107,7 +4212,8 @@ gencjneshort (operand * left, operand * right, symbol * lbl)
 
   /* if the right side is a literal then anything goes */
   if (AOP_TYPE (right) == AOP_LIT &&
-      AOP_TYPE (left) != AOP_DIR)
+      AOP_TYPE (left) != AOP_DIR  &&
+      AOP_TYPE (left) != AOP_IMMD)
     {
       while (size--)
        {
@@ -4123,6 +4229,7 @@ gencjneshort (operand * left, operand * right, symbol * lbl)
      if the left is a pointer register & right is not */
   else if (AOP_TYPE (right) == AOP_REG ||
           AOP_TYPE (right) == AOP_DIR ||
+          AOP_TYPE (right) == AOP_LIT ||
           (AOP_TYPE (left) == AOP_DIR && AOP_TYPE (right) == AOP_LIT) ||
           (IS_AOP_PREG (left) && !IS_AOP_PREG (right)))
     {
@@ -4179,7 +4286,7 @@ genCmpEq (iCode * ic, iCode * ifx)
 {
   operand *left, *right, *result;
 
-  D(emitcode (";", "genCmpEq"));
+  D(emitcode (";     genCmpEq",""));
 
   aopOp ((left = IC_LEFT (ic)), ic, FALSE);
   aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
@@ -4317,7 +4424,7 @@ genCmpEq (iCode * ic, iCode * ifx)
       gencjne (left, right, newiTempLabel (NULL));
       if (AOP_TYPE (result) == AOP_CRY && AOP_SIZE (result))
        {
-         aopPut (AOP (result), "a", 0);
+         aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
          goto release;
        }
       if (ifx)
@@ -4406,7 +4513,7 @@ genAndOp (iCode * ic)
   operand *left, *right, *result;
   symbol *tlbl;
 
-  D(emitcode (";", "genAndOp"));
+  D(emitcode (";     genAndOp",""));
 
   /* note here that && operations that are in an
      if statement are taken away by backPatchLabels
@@ -4448,7 +4555,7 @@ genOrOp (iCode * ic)
   operand *left, *right, *result;
   symbol *tlbl;
 
-  D(emitcode (";", "genOrOp"));
+  D(emitcode (";     genOrOp",""));
 
   /* note here that || operations that are in an
      if statement are taken away by backPatchLabels
@@ -4559,7 +4666,7 @@ genAnd (iCode * ic, iCode * ifx)
   int bytelit = 0;
   char buffer[10];
 
-  D(emitcode (";", "genAnd"));
+  D(emitcode (";     genAnd",""));
 
   aopOp ((left = IC_LEFT (ic)), ic, FALSE);
   aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
@@ -4739,12 +4846,14 @@ genAnd (iCode * ic, iCode * ifx)
              if ((bytelit = (int) ((lit >> (offset * 8)) & 0x0FFL)) == 0x0FF)
                continue;
              else if (bytelit == 0)
-               aopPut (AOP (result), zero, offset);
+               {
+                 aopPut (AOP (result), zero, offset, isOperandVolatile (result, FALSE));
+               }
              else if (IS_AOP_PREG (result))
                {
                  MOVA (aopGet (AOP (right), offset, FALSE, FALSE));
                  emitcode ("anl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                 aopPut (AOP (result), "a", offset);
+                 aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
                }
              else
                emitcode ("anl", "%s,%s",
@@ -4761,7 +4870,7 @@ genAnd (iCode * ic, iCode * ifx)
                  if (IS_AOP_PREG (result))
                    {
                      emitcode ("anl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                     aopPut (AOP (result), "a", offset);
+                     aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
 
                    }
                  else
@@ -4823,12 +4932,16 @@ genAnd (iCode * ic, iCode * ifx)
                    {
                      aopPut (AOP (result),
                              aopGet (AOP (left), offset, FALSE, FALSE),
-                             offset);
+                             offset,
+                             isOperandVolatile (result, FALSE));
                      continue;
                    }
                  else if (bytelit == 0)
                    {
-                     aopPut (AOP (result), zero, offset);
+                     /* dummy read of volatile operand */
+                     if (isOperandVolatile (left, FALSE))
+                       MOVA (aopGet (AOP (left), offset, FALSE, FALSE));
+                     aopPut (AOP (result), zero, offset, isOperandVolatile (result, FALSE));
                      continue;
                    }
                }
@@ -4842,7 +4955,7 @@ genAnd (iCode * ic, iCode * ifx)
                  emitcode ("anl", "a,%s",
                            aopGet (AOP (left), offset, FALSE, FALSE));
                }
-             aopPut (AOP (result), "a", offset);
+             aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
            }
        }
     }
@@ -4863,7 +4976,7 @@ genOr (iCode * ic, iCode * ifx)
   int size, offset = 0;
   unsigned long lit = 0L;
 
-  D(emitcode (";", "genOr"));
+  D(emitcode (";     genOr",""));
 
   aopOp ((left = IC_LEFT (ic)), ic, FALSE);
   aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
@@ -5022,12 +5135,18 @@ genOr (iCode * ic, iCode * ifx)
          if (AOP_TYPE (right) == AOP_LIT)
            {
              if (((lit >> (offset * 8)) & 0x0FFL) == 0x00L)
-               continue;
+               {
+                 /* dummy read of volatile operand */
+                 if (isOperandVolatile (left, FALSE))
+                   MOVA (aopGet (AOP (left), offset, FALSE, FALSE));
+                 else
+                   continue;
+               }
              else if (IS_AOP_PREG (left))
                {
                  MOVA (aopGet (AOP (right), offset, FALSE, FALSE));
                  emitcode ("orl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                 aopPut (AOP (result), "a", offset);
+                 aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
                }
              else
                emitcode ("orl", "%s,%s",
@@ -5044,7 +5163,7 @@ genOr (iCode * ic, iCode * ifx)
                  if (IS_AOP_PREG (left))
                    {
                      emitcode ("orl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                     aopPut (AOP (result), "a", offset);
+                     aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
                    }
                  else
                    emitcode ("orl", "%s,a",
@@ -5098,7 +5217,8 @@ genOr (iCode * ic, iCode * ifx)
                  {
                    aopPut (AOP (result),
                            aopGet (AOP (left), offset, FALSE, FALSE),
-                           offset);
+                           offset,
+                           isOperandVolatile (result, FALSE));
                    continue;
                  }
              }
@@ -5112,7 +5232,7 @@ genOr (iCode * ic, iCode * ifx)
                emitcode ("orl", "a,%s",
                          aopGet (AOP (left), offset, FALSE, FALSE));
              }
-           aopPut (AOP (result), "a", offset);
+           aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
          }
     }
 
@@ -5132,7 +5252,7 @@ genXor (iCode * ic, iCode * ifx)
   int size, offset = 0;
   unsigned long lit = 0L;
 
-  D(emitcode (";", "genXor"));
+  D(emitcode (";     genXor",""));
 
   aopOp ((left = IC_LEFT (ic)), ic, FALSE);
   aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
@@ -5279,7 +5399,7 @@ genXor (iCode * ic, iCode * ifx)
                {
                  MOVA (aopGet (AOP (right), offset, FALSE, FALSE));
                  emitcode ("xrl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                 aopPut (AOP (result), "a", offset);
+                 aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
                }
              else
                emitcode ("xrl", "%s,%s",
@@ -5296,7 +5416,7 @@ genXor (iCode * ic, iCode * ifx)
                  if (IS_AOP_PREG (left))
                    {
                      emitcode ("xrl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE));
-                     aopPut (AOP (result), "a", offset);
+                     aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
                    }
                  else
                    emitcode ("xrl", "%s,a",
@@ -5358,7 +5478,8 @@ genXor (iCode * ic, iCode * ifx)
                  {
                    aopPut (AOP (result),
                            aopGet (AOP (left), offset, FALSE, FALSE),
-                           offset);
+                           offset,
+                           isOperandVolatile (result, FALSE));
                    continue;
                  }
              }
@@ -5372,7 +5493,7 @@ genXor (iCode * ic, iCode * ifx)
                emitcode ("xrl", "a,%s",
                          aopGet (AOP (left), offset, FALSE, TRUE));
              }
-           aopPut (AOP (result), "a", offset);
+           aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
          }
     }
 
@@ -5390,7 +5511,7 @@ genInline (iCode * ic)
 {
   char *buffer, *bp, *bp1;
 
-  D(emitcode (";", "genInline"));
+  D(emitcode (";     genInline",""));
 
   _G.inLine += (!options.asmpeep);
 
@@ -5436,7 +5557,7 @@ genRRC (iCode * ic)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genRRC"));
+  D(emitcode (";     genRRC",""));
 
   /* rotate right with carry */
   left = IC_LEFT (ic);
@@ -5460,7 +5581,7 @@ genRRC (iCode * ic)
       MOVA (l);
       emitcode ("rrc", "a");
       if (AOP_SIZE (result) > 1)
-       aopPut (AOP (result), "a", offset--);
+       aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE));
     }
   /* now we need to put the carry into the
      highest order byte of the result */
@@ -5471,7 +5592,7 @@ genRRC (iCode * ic)
     }
   emitcode ("mov", "acc.7,c");
  release:
-  aopPut (AOP (result), "a", AOP_SIZE (result) - 1);
+  aopPut (AOP (result), "a", AOP_SIZE (result) - 1, isOperandVolatile (result, FALSE));
   freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
 }
@@ -5486,7 +5607,7 @@ genRLC (iCode * ic)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genRLC"));
+  D(emitcode (";     genRLC",""));
 
   /* rotate right with carry */
   left = IC_LEFT (ic);
@@ -5507,14 +5628,14 @@ genRLC (iCode * ic)
       }
       emitcode ("add", "a,acc");
       if (AOP_SIZE (result) > 1)
-       aopPut (AOP (result), "a", offset++);
+       aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
       while (size--)
        {
          l = aopGet (AOP (left), offset, FALSE, FALSE);
          MOVA (l);
          emitcode ("rlc", "a");
          if (AOP_SIZE (result) > 1)
-           aopPut (AOP (result), "a", offset++);
+           aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
        }
     }
   /* now we need to put the carry into the
@@ -5526,7 +5647,7 @@ genRLC (iCode * ic)
     }
   emitcode ("mov", "acc.0,c");
  release:
-  aopPut (AOP (result), "a", 0);
+  aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
   freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
 }
@@ -5539,7 +5660,7 @@ genGetHbit (iCode * ic)
 {
   operand *left, *result;
 
-  D(emitcode (";", "genGetHbit"));
+  D(emitcode (";     genGetHbit",""));
 
   left = IC_LEFT (ic);
   result = IC_RESULT (ic);
@@ -5703,7 +5824,7 @@ shiftR1Left2Result (operand * left, int offl,
     AccSRsh (shCount);
   else
     AccRsh (shCount);
-  aopPut (AOP (result), "a", offr);
+  aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -5718,7 +5839,7 @@ shiftL1Left2Result (operand * left, int offl,
   MOVA (l);
   /* shift left accumulator */
   AccLsh (shCount);
-  aopPut (AOP (result), "a", offr);
+  aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -5736,19 +5857,19 @@ movLeft2Result (operand * left, int offl,
       if (*l == '@' && (IS_AOP_PREG (result)))
        {
          emitcode ("mov", "a,%s", l);
-         aopPut (AOP (result), "a", offr);
+         aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
        }
       else
        {
          if (!sign)
-           aopPut (AOP (result), l, offr);
+           aopPut (AOP (result), l, offr, isOperandVolatile (result, FALSE));
          else
            {
              /* MSB sign in acc.7 ! */
              if (getDataSize (left) == offl + 1)
                {
                  emitcode ("mov", "a,%s", l);
-                 aopPut (AOP (result), "a", offr);
+                 aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
                }
            }
        }
@@ -5928,6 +6049,7 @@ AccAXRsh (char *x, int shCount)
       emitcode ("mov", "c,acc.7");
       AccAXLrl1 (x);           // ABBBBBBC:CDDDDDDA
 
+      emitcode ("mov", "c,acc.7");
       AccAXLrl1 (x);           // BBBBBBCC:DDDDDDAA
 
       emitcode ("xch", "a,%s", x);     // DDDDDDAA:BBBBBBCC
@@ -6017,6 +6139,7 @@ AccAXRshS (char *x, int shCount)
       emitcode ("mov", "c,acc.7");
       AccAXLrl1 (x);           // ABBBBBBC:CDDDDDDA
 
+      emitcode ("mov", "c,acc.7");
       AccAXLrl1 (x);           // BBBBBBCC:DDDDDDAA
 
       emitcode ("xch", "a,%s", x);     // DDDDDDAA:BBBBBBCC
@@ -6074,7 +6197,7 @@ shiftL2Left2Result (operand * left, int offl,
     }
   /* ax << shCount (x = lsb(result)) */
   AccAXLsh (aopGet (AOP (result), offr, FALSE, FALSE), shCount);
-  aopPut (AOP (result), "a", offr + MSB16);
+  aopPut (AOP (result), "a", offr + MSB16, isOperandVolatile (result, FALSE));
 }
 
 
@@ -6104,7 +6227,7 @@ shiftR2Left2Result (operand * left, int offl,
   else
     AccAXRsh (aopGet (AOP (result), offr, FALSE, FALSE), shCount);
   if (getDataSize (result) > 1)
-    aopPut (AOP (result), "a", offr + MSB16);
+    aopPut (AOP (result), "a", offr + MSB16, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -6120,7 +6243,7 @@ shiftLLeftOrResult (operand * left, int offl,
   /* or with result */
   emitcode ("orl", "a,%s", aopGet (AOP (result), offr, FALSE, FALSE));
   /* back to result */
-  aopPut (AOP (result), "a", offr);
+  aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -6136,7 +6259,7 @@ shiftRLeftOrResult (operand * left, int offl,
   /* or with result */
   emitcode ("orl", "a,%s", aopGet (AOP (result), offr, FALSE, FALSE));
   /* back to result */
-  aopPut (AOP (result), "a", offr);
+  aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -6145,7 +6268,7 @@ shiftRLeftOrResult (operand * left, int offl,
 static void
 genlshOne (operand * result, operand * left, int shCount)
 {
-  D(emitcode (";", "genlshOne"));
+  D(emitcode (";     genlshOne",""));
 
   shiftL1Left2Result (left, LSB, result, LSB, shCount);
 }
@@ -6158,7 +6281,7 @@ genlshTwo (operand * result, operand * left, int shCount)
 {
   int size;
 
-  D(emitcode (";", "genlshTwo"));
+  D(emitcode (";     genlshTwo",""));
 
   size = getDataSize (result);
 
@@ -6174,7 +6297,7 @@ genlshTwo (operand * result, operand * left, int shCount)
          else
            movLeft2Result (left, LSB, result, MSB16, 0);
        }
-      aopPut (AOP (result), zero, LSB);
+      aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
     }
 
   /*  1 <= shCount <= 7 */
@@ -6207,7 +6330,7 @@ shiftLLong (operand * left, operand * result, int offr)
        emitcode ("xch", "a,%s",
                  aopGet (AOP (left), LSB + offr, FALSE, FALSE));
       else
-       aopPut (AOP (result), "a", LSB + offr);
+       aopPut (AOP (result), "a", LSB + offr, isOperandVolatile (result, FALSE));
     }
 
   if (size >= MSB16 + offr)
@@ -6223,7 +6346,7 @@ shiftLLong (operand * left, operand * result, int offr)
        emitcode ("xch", "a,%s",
                  aopGet (AOP (left), MSB16 + offr, FALSE, FALSE));
       else
-       aopPut (AOP (result), "a", MSB16 + offr);
+       aopPut (AOP (result), "a", MSB16 + offr, isOperandVolatile (result, FALSE));
     }
 
   if (size >= MSB24 + offr)
@@ -6239,7 +6362,7 @@ shiftLLong (operand * left, operand * result, int offr)
        emitcode ("xch", "a,%s",
                  aopGet (AOP (left), MSB24 + offr, FALSE, FALSE));
       else
-       aopPut (AOP (result), "a", MSB24 + offr);
+       aopPut (AOP (result), "a", MSB24 + offr, isOperandVolatile (result, FALSE));
     }
 
   if (size > MSB32 + offr)
@@ -6250,10 +6373,10 @@ shiftLLong (operand * left, operand * result, int offr)
          MOVA (l);
        }
       emitcode ("rlc", "a");
-      aopPut (AOP (result), "a", MSB32 + offr);
+      aopPut (AOP (result), "a", MSB32 + offr, isOperandVolatile (result, FALSE));
     }
   if (offr != LSB)
-    aopPut (AOP (result), zero, LSB);
+    aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
 }
 
 /*-----------------------------------------------------------------*/
@@ -6264,7 +6387,7 @@ genlshFour (operand * result, operand * left, int shCount)
 {
   int size;
 
-  D(emitcode (";", "genlshFour"));
+  D(emitcode (";     genlshFour",""));
 
   size = AOP_SIZE (result);
 
@@ -6278,9 +6401,9 @@ genlshFour (operand * result, operand * left, int shCount)
        shiftL1Left2Result (left, LSB, result, MSB32, shCount);
       else
        movLeft2Result (left, LSB, result, MSB32, 0);
-      aopPut (AOP (result), zero, LSB);
-      aopPut (AOP (result), zero, MSB16);
-      aopPut (AOP (result), zero, MSB24);
+      aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
+      aopPut (AOP (result), zero, MSB16, isOperandVolatile (result, FALSE));
+      aopPut (AOP (result), zero, MSB24, isOperandVolatile (result, FALSE));
       return;
     }
 
@@ -6297,8 +6420,8 @@ genlshFour (operand * result, operand * left, int shCount)
          movLeft2Result (left, MSB16, result, MSB32, 0);
          movLeft2Result (left, LSB, result, MSB24, 0);
        }
-      aopPut (AOP (result), zero, MSB16);
-      aopPut (AOP (result), zero, LSB);
+      aopPut (AOP (result), zero, MSB16, isOperandVolatile (result, FALSE));
+      aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
       return;
     }
 
@@ -6321,7 +6444,7 @@ genlshFour (operand * result, operand * left, int shCount)
              movLeft2Result (left, MSB24, result, MSB32, 0);
              movLeft2Result (left, MSB16, result, MSB24, 0);
              movLeft2Result (left, LSB, result, MSB16, 0);
-             aopPut (AOP (result), zero, LSB);
+             aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
            }
          else if (shCount == 1)
            shiftLLong (left, result, MSB16);
@@ -6330,7 +6453,7 @@ genlshFour (operand * result, operand * left, int shCount)
              shiftL2Left2Result (left, MSB16, result, MSB24, shCount);
              shiftL1Left2Result (left, LSB, result, MSB16, shCount);
              shiftRLeftOrResult (left, LSB, result, MSB24, 8 - shCount);
-             aopPut (AOP (result), zero, LSB);
+             aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE));
            }
        }
     }
@@ -6363,7 +6486,7 @@ genLeftShiftLiteral (operand * left,
   int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit);
   int size;
 
-  D(emitcode (";", "genLeftShiftLiteral"));
+  D(emitcode (";     genLeftShiftLiteral",""));
 
   freeAsmop (right, NULL, ic, TRUE);
 
@@ -6388,7 +6511,7 @@ genLeftShiftLiteral (operand * left,
 
   else if (shCount >= (size * 8))
     while (size--)
-      aopPut (AOP (result), zero, size);
+      aopPut (AOP (result), zero, size, isOperandVolatile (result, FALSE));
   else
     {
       switch (size)
@@ -6405,7 +6528,8 @@ genLeftShiftLiteral (operand * left,
          genlshFour (result, left, shCount);
          break;
        default:
-         fprintf(stderr, "*** ack! mystery literal shift!\n");
+         werror (E_INTERNAL_ERROR, __FILE__, __LINE__, 
+                 "*** ack! mystery literal shift!\n");
          break;
        }
     }
@@ -6424,7 +6548,7 @@ genLeftShift (iCode * ic)
   char *l;
   symbol *tlbl, *tlbl1;
 
-  D(emitcode (";", "genLeftShift"));
+  D(emitcode (";     genLeftShift",""));
 
   right = IC_RIGHT (ic);
   left = IC_LEFT (ic);
@@ -6467,10 +6591,10 @@ genLeftShift (iCode * ic)
            {
 
              emitcode ("mov", "a,%s", l);
-             aopPut (AOP (result), "a", offset);
+             aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
            }
          else
-           aopPut (AOP (result), l, offset);
+           aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE));
          offset++;
        }
     }
@@ -6492,7 +6616,7 @@ genLeftShift (iCode * ic)
       emitcode ("add", "a,acc");
       emitcode ("", "%05d$:", tlbl1->key + 100);
       emitcode ("djnz", "b,%05d$", tlbl->key + 100);
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       goto release;
     }
 
@@ -6503,13 +6627,13 @@ genLeftShift (iCode * ic)
   l = aopGet (AOP (result), offset, FALSE, FALSE);
   MOVA (l);
   emitcode ("add", "a,acc");
-  aopPut (AOP (result), "a", offset++);
+  aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
   while (--size)
     {
       l = aopGet (AOP (result), offset, FALSE, FALSE);
       MOVA (l);
       emitcode ("rlc", "a");
-      aopPut (AOP (result), "a", offset++);
+      aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
     }
   reAdjustPreg (AOP (result));
 
@@ -6527,7 +6651,7 @@ static void
 genrshOne (operand * result, operand * left,
           int shCount, int sign)
 {
-  D(emitcode (";", "genrshOne"));
+  D(emitcode (";     genrshOne",""));
 
   shiftR1Left2Result (left, LSB, result, LSB, shCount, sign);
 }
@@ -6539,7 +6663,7 @@ static void
 genrshTwo (operand * result, operand * left,
           int shCount, int sign)
 {
-  D(emitcode (";", "genrshTwo"));
+  D(emitcode (";     genrshTwo",""));
 
   /* if shCount >= 8 */
   if (shCount >= 8)
@@ -6580,9 +6704,14 @@ shiftRLong (operand * left, int offl,
     if (sign) {
       emitcode ("rlc", "a");
       emitcode ("subb", "a,acc");
-      emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE));
+      if (isSameRegs)
+        emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE));
+      else {
+        aopPut (AOP (result), "a", MSB32, isOperandVolatile (result, FALSE));
+        MOVA (aopGet (AOP (left), MSB32, FALSE, FALSE));
+      }
     } else {
-      aopPut (AOP(result), zero, MSB32);
+      aopPut (AOP(result), zero, MSB32, isOperandVolatile (result, FALSE));
     }
   }
 
@@ -6597,7 +6726,7 @@ shiftRLong (operand * left, int offl,
   if (isSameRegs && offl==MSB16) {
     emitcode ("xch", "a,%s",aopGet (AOP (left), MSB24, FALSE, FALSE));
   } else {
-    aopPut (AOP (result), "a", MSB32);
+    aopPut (AOP (result), "a", MSB32-offl, isOperandVolatile (result, FALSE));
     MOVA (aopGet (AOP (left), MSB24, FALSE, FALSE));
   }
 
@@ -6605,17 +6734,17 @@ shiftRLong (operand * left, int offl,
   if (isSameRegs && offl==1) {
     emitcode ("xch", "a,%s",aopGet (AOP (left), MSB16, FALSE, FALSE));
   } else {
-    aopPut (AOP (result), "a", MSB24);
+    aopPut (AOP (result), "a", MSB24-offl, isOperandVolatile (result, FALSE));
     MOVA (aopGet (AOP (left), MSB16, FALSE, FALSE));
   }
   emitcode ("rrc", "a");
-  aopPut (AOP (result), "a", MSB16 - offl);
+  aopPut (AOP (result), "a", MSB16 - offl, isOperandVolatile (result, FALSE));
 
   if (offl == LSB)
     {
       MOVA (aopGet (AOP (left), LSB, FALSE, FALSE));
       emitcode ("rrc", "a");
-      aopPut (AOP (result), "a", LSB);
+      aopPut (AOP (result), "a", LSB, isOperandVolatile (result, FALSE));
     }
 }
 
@@ -6626,7 +6755,7 @@ static void
 genrshFour (operand * result, operand * left,
            int shCount, int sign)
 {
-  D(emitcode (";", "genrshFour"));
+  D(emitcode (";     genrshFour",""));
 
   /* if shifting more that 3 bytes */
   if (shCount >= 24)
@@ -6701,7 +6830,7 @@ genRightShiftLiteral (operand * left,
   int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit);
   int size;
 
-  D(emitcode (";", "genRightShiftLiteral"));
+  D(emitcode (";     genRightShiftLiteral",""));
 
   freeAsmop (right, NULL, ic, TRUE);
 
@@ -6726,9 +6855,10 @@ genRightShiftLiteral (operand * left,
 
   else if (shCount >= (size * 8))
     {
-      if (sign)
+      if (sign) {
        /* get sign in acc.7 */
        MOVA (aopGet (AOP (left), size - 1, FALSE, FALSE));
+      }
       addSign (result, LSB, sign);
     }
   else
@@ -6749,10 +6879,9 @@ genRightShiftLiteral (operand * left,
        default:
          break;
        }
-
-      freeAsmop (left, NULL, ic, TRUE);
-      freeAsmop (result, NULL, ic, TRUE);
     }
+  freeAsmop (left, NULL, ic, TRUE);
+  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6766,7 +6895,7 @@ genSignedRightShift (iCode * ic)
   char *l;
   symbol *tlbl, *tlbl1;
 
-  D(emitcode (";", "genSignedRightShift"));
+  D(emitcode (";     genSignedRightShift",""));
 
   /* we do it the hard way put the shift count in b
      and loop thru preserving the sign */
@@ -6810,10 +6939,10 @@ genSignedRightShift (iCode * ic)
            {
 
              emitcode ("mov", "a,%s", l);
-             aopPut (AOP (result), "a", offset);
+             aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
            }
          else
-           aopPut (AOP (result), l, offset);
+           aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE));
          offset++;
        }
     }
@@ -6838,7 +6967,7 @@ genSignedRightShift (iCode * ic)
       emitcode ("rrc", "a");
       emitcode ("", "%05d$:", tlbl1->key + 100);
       emitcode ("djnz", "b,%05d$", tlbl->key + 100);
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       goto release;
     }
 
@@ -6851,7 +6980,7 @@ genSignedRightShift (iCode * ic)
       l = aopGet (AOP (result), offset, FALSE, FALSE);
       MOVA (l);
       emitcode ("rrc", "a");
-      aopPut (AOP (result), "a", offset--);
+      aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE));
     }
   reAdjustPreg (AOP (result));
   emitcode ("", "%05d$:", tlbl1->key + 100);
@@ -6874,7 +7003,7 @@ genRightShift (iCode * ic)
   char *l;
   symbol *tlbl, *tlbl1;
 
-  D(emitcode (";", "genRightShift"));
+  D(emitcode (";     genRightShift",""));
 
   /* if signed then we do it the hard way preserve the
      sign bit moving it inwards */
@@ -6934,10 +7063,10 @@ genRightShift (iCode * ic)
            {
 
              emitcode ("mov", "a,%s", l);
-             aopPut (AOP (result), "a", offset);
+             aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
            }
          else
-           aopPut (AOP (result), l, offset);
+           aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE));
          offset++;
        }
     }
@@ -6958,7 +7087,7 @@ genRightShift (iCode * ic)
       emitcode ("rrc", "a");
       emitcode ("", "%05d$:", tlbl1->key + 100);
       emitcode ("djnz", "b,%05d$", tlbl->key + 100);
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       goto release;
     }
 
@@ -6971,7 +7100,7 @@ genRightShift (iCode * ic)
       l = aopGet (AOP (result), offset, FALSE, FALSE);
       MOVA (l);
       emitcode ("rrc", "a");
-      aopPut (AOP (result), "a", offset--);
+      aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE));
     }
   reAdjustPreg (AOP (result));
 
@@ -6995,7 +7124,7 @@ genUnpackBits (operand * result, char *rname, int ptype)
   int offset = 0;
   int rsize;
 
-  D(emitcode (";", "genUnpackBits"));
+  D(emitcode (";     genUnpackBits",""));
 
   etype = getSpec (operandType (result));
   rsize = getSize (operandType (result));
@@ -7040,12 +7169,12 @@ genUnpackBits (operand * result, char *rname, int ptype)
 
       emitcode ("anl", "a,#0x%02x",
                ((unsigned char) -1) >> (8 - SPEC_BLEN (etype)));
-      aopPut (AOP (result), "a", offset++);
+      aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
       goto finish;
     }
 
   /* bit field did not fit in a byte  */
-  aopPut (AOP (result), "a", offset++);
+  aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
 
   while (1)
     {
@@ -7085,7 +7214,7 @@ genUnpackBits (operand * result, char *rname, int ptype)
       if (rlen < 8)
        break;
 
-      aopPut (AOP (result), "a", offset++);
+      aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
 
     }
 
@@ -7093,7 +7222,7 @@ genUnpackBits (operand * result, char *rname, int ptype)
     {
       //  emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(rlen));
       AccLsh (8 - rlen);
-      aopPut (AOP (result), "a", offset++);
+      aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
     }
 
 finish:
@@ -7101,7 +7230,7 @@ finish:
     {
       rsize -= offset;
       while (rsize--)
-       aopPut (AOP (result), zero, offset++);
+       aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE));
     }
   return;
 }
@@ -7119,7 +7248,7 @@ genDataPointerGet (operand * left,
   char buffer[256];
   int size, offset = 0;
 
-  D(emitcode (";", "genDataPointerGet"));
+  D(emitcode (";     genDataPointerGet",""));
 
   aopOp (result, ic, TRUE);
 
@@ -7132,7 +7261,7 @@ genDataPointerGet (operand * left,
        sprintf (buffer, "(%s + %d)", l + 1, offset);
       else
        sprintf (buffer, "%s", l + 1);
-      aopPut (AOP (result), buffer, offset++);
+      aopPut (AOP (result), buffer, offset++, isOperandVolatile (result, FALSE));
     }
 
   freeAsmop (left, NULL, ic, TRUE);
@@ -7155,7 +7284,7 @@ genNearPointerGet (operand * left,
   sym_link *ltype = operandType (left);
   char buffer[80];
 
-  D(emitcode (";", "genNearPointerGet"));
+  D(emitcode (";     genNearPointerGet",""));
 
   rtype = operandType (result);
   retype = getSpec (rtype);
@@ -7207,12 +7336,12 @@ genNearPointerGet (operand * left,
            {
 
              emitcode ("mov", "a,@%s", rname);
-             aopPut (AOP (result), "a", offset);
+             aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
            }
          else
            {
              sprintf (buffer, "@%s", rname);
-             aopPut (AOP (result), buffer, offset);
+             aopPut (AOP (result), buffer, offset, isOperandVolatile (result, FALSE));
            }
          offset++;
          if (size || pi)
@@ -7224,7 +7353,7 @@ genNearPointerGet (operand * left,
   if (aop)       /* we had to allocate for this iCode */
     {
       if (pi) { /* post increment present */
-       aopPut(AOP ( left ),rname,0);
+       aopPut(AOP ( left ),rname,0, isOperandVolatile (left, FALSE));
       }
       freeAsmop (NULL, aop, ic, TRUE);
     }
@@ -7267,7 +7396,7 @@ genPagedPointerGet (operand * left,
   char *rname;
   sym_link *rtype, *retype;
 
-  D(emitcode (";", "genPagedPointerGet"));
+  D(emitcode (";     genPagedPointerGet",""));
 
   rtype = operandType (result);
   retype = getSpec (rtype);
@@ -7304,7 +7433,7 @@ genPagedPointerGet (operand * left,
        {
 
          emitcode ("movx", "a,@%s", rname);
-         aopPut (AOP (result), "a", offset);
+         aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE));
 
          offset++;
 
@@ -7316,7 +7445,7 @@ genPagedPointerGet (operand * left,
   /* now some housekeeping stuff */
   if (aop) /* we had to allocate for this iCode */
     {
-      if (pi) aopPut ( AOP (left), rname, 0);
+      if (pi) aopPut ( AOP (left), rname, 0, isOperandVolatile (left, FALSE));
       freeAsmop (NULL, aop, ic, TRUE);
     }
   else
@@ -7355,7 +7484,7 @@ genFarPointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genFarPointerGet"));
+  D(emitcode (";     genFarPointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7386,15 +7515,15 @@ genFarPointerGet (operand * left,
       while (size--)
        {
          emitcode ("movx", "a,@dptr");
-         aopPut (AOP (result), "a", offset++);
+         aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
          if (size || pi)
            emitcode ("inc", "dptr");
        }
     }
   
   if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) {
-    aopPut ( AOP (left), "dpl", 0);
-    aopPut ( AOP (left), "dph", 1);
+    aopPut ( AOP (left), "dpl", 0, isOperandVolatile (left, FALSE));
+    aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE));
     pi->generated = 1;
   }
   freeAsmop (left, NULL, ic, TRUE);
@@ -7411,7 +7540,7 @@ genCodePointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genCodePointerGet"));
+  D(emitcode (";     genCodePointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7441,17 +7570,25 @@ genCodePointerGet (operand * left,
 
       while (size--)
        {
-         emitcode ("clr", "a");
-         emitcode ("movc", "a,@a+dptr");
-         aopPut (AOP (result), "a", offset++);
-         if (size || pi)
-           emitcode ("inc", "dptr");
+         if (pi)
+           {
+             emitcode ("clr", "a");
+             emitcode ("movc", "a,@a+dptr");
+             aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
+             emitcode ("inc", "dptr");
+           }
+         else
+           { 
+             emitcode ("mov", "a,#0x%02x", offset);
+             emitcode ("movc", "a,@a+dptr");
+             aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
+           }
        }
     }
 
   if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) {
-    aopPut ( AOP (left), "dpl", 0);
-    aopPut ( AOP (left), "dph", 1);
+    aopPut ( AOP (left), "dpl", 0, isOperandVolatile (left, FALSE));
+    aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE));
     pi->generated = 1;
   }
   freeAsmop (left, NULL, ic, TRUE);
@@ -7468,7 +7605,7 @@ genGenPointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genGenPointerGet"));
+  D(emitcode (";     genGenPointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7506,16 +7643,15 @@ genGenPointerGet (operand * left,
       while (size--)
        {
          emitcode ("lcall", "__gptrget");
-         aopPut (AOP (result), "a", offset++);
+         aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
          if (size || pi)
            emitcode ("inc", "dptr");
        }
     }
 
   if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) {
-    aopPut ( AOP (left), "dpl", 0);
-    aopPut ( AOP (left), "dph", 1);
-    aopPut ( AOP (left), "b", 2);
+    aopPut ( AOP (left), "dpl", 0, isOperandVolatile (left, FALSE));
+    aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE));
     pi->generated = 1;
   }
   freeAsmop (left, NULL, ic, TRUE);
@@ -7532,7 +7668,7 @@ genPointerGet (iCode * ic, iCode *pi)
   sym_link *type, *etype;
   int p_type;
 
-  D(emitcode (";", "genPointerGet"));
+  D(emitcode (";     genPointerGet",""));
 
   left = IC_LEFT (ic);
   result = IC_RESULT (ic);
@@ -7554,7 +7690,7 @@ genPointerGet (iCode * ic, iCode *pi)
   if (p_type == GPOINTER && OP_SYMBOL(left)->remat &&
       IS_CAST_ICODE(OP_SYMBOL(left)->rematiCode)) {
          left = IC_RIGHT(OP_SYMBOL(left)->rematiCode);
-         type =   type = operandType (left);
+         type = operandType (left);
          p_type = DCL_TYPE (type);
   }
   /* now that we have the pointer type we assign
@@ -7600,7 +7736,7 @@ genPackBits (sym_link * etype,
   int blen, bstr;
   char *l;
 
-  D(emitcode (";", "genPackBits"));
+  D(emitcode (";     genPackBits",""));
 
   blen = SPEC_BLEN (etype);
   bstr = SPEC_BSTR (etype);
@@ -7767,7 +7903,7 @@ genDataPointerSet (operand * right,
   int size, offset = 0;
   char *l, buffer[256];
 
-  D(emitcode (";", "genDataPointerSet"));
+  D(emitcode (";     genDataPointerSet",""));
 
   aopOp (right, ic, FALSE);
 
@@ -7802,7 +7938,7 @@ genNearPointerSet (operand * right,
   sym_link *retype, *letype;
   sym_link *ptype = operandType (result);
 
-  D(emitcode (";", "genNearPointerSet"));
+  D(emitcode (";     genNearPointerSet",""));
 
   retype = getSpec (operandType (right));
   letype = getSpec (ptype);
@@ -7887,7 +8023,8 @@ genNearPointerSet (operand * right,
   /* now some housekeeping stuff */
   if (aop) /* we had to allocate for this iCode */
     {
-      if (pi) aopPut (AOP (result),rname,0);
+      if (pi)
+        aopPut (AOP (result), rname, 0, isOperandVolatile (result, FALSE));
       freeAsmop (NULL, aop, ic, TRUE);
     }
   else
@@ -7929,7 +8066,7 @@ genPagedPointerSet (operand * right,
   char *rname, *l;
   sym_link *retype, *letype;
 
-  D(emitcode (";", "genPagedPointerSet"));
+  D(emitcode (";     genPagedPointerSet",""));
 
   retype = getSpec (operandType (right));
   letype = getSpec (operandType (result));
@@ -7979,7 +8116,8 @@ genPagedPointerSet (operand * right,
   /* now some housekeeping stuff */
   if (aop) /* we had to allocate for this iCode */
     {
-      if (pi) aopPut (AOP (result),rname,0);
+      if (pi)
+        aopPut (AOP (result), rname, 0, isOperandVolatile (result, FALSE));
       freeAsmop (NULL, aop, ic, TRUE);
     }
   else
@@ -8019,7 +8157,7 @@ genFarPointerSet (operand * right,
   sym_link *retype = getSpec (operandType (right));
   sym_link *letype = getSpec (operandType (result));
 
-  D(emitcode (";", "genFarPointerSet"));
+  D(emitcode (";     genFarPointerSet",""));
 
   aopOp (result, ic, FALSE);
 
@@ -8057,8 +8195,8 @@ genFarPointerSet (operand * right,
        }
     }
   if (pi && AOP_TYPE (result) != AOP_STR && AOP_TYPE (result) != AOP_IMMD) {
-    aopPut (AOP(result),"dpl",0);
-    aopPut (AOP(result),"dph",1);
+    aopPut (AOP(result), "dpl", 0, isOperandVolatile (result, FALSE));
+    aopPut (AOP(result), "dph", 1, isOperandVolatile (result, FALSE));
     pi->generated=1;
   }
   freeAsmop (result, NULL, ic, TRUE);
@@ -8076,7 +8214,7 @@ genGenPointerSet (operand * right,
   sym_link *retype = getSpec (operandType (right));
   sym_link *letype = getSpec (operandType (result));
 
-  D(emitcode (";", "genGenPointerSet"));
+  D(emitcode (";     genGenPointerSet",""));
 
   aopOp (result, ic, FALSE);
 
@@ -8122,9 +8260,8 @@ genGenPointerSet (operand * right,
     }
 
   if (pi && AOP_TYPE (result) != AOP_STR && AOP_TYPE (result) != AOP_IMMD) {
-    aopPut (AOP(result),"dpl",0);
-    aopPut (AOP(result),"dph",1);
-    aopPut (AOP(result),"b",2);
+    aopPut (AOP(result), "dpl", 0, isOperandVolatile (result, FALSE));
+    aopPut (AOP(result), "dph", 1, isOperandVolatile (result, FALSE));
     pi->generated=1;
   }
   freeAsmop (result, NULL, ic, TRUE);
@@ -8141,7 +8278,7 @@ genPointerSet (iCode * ic, iCode *pi)
   sym_link *type, *etype;
   int p_type;
 
-  D(emitcode (";", "genPointerSet"));
+  D(emitcode (";     genPointerSet",""));
 
   right = IC_RIGHT (ic);
   result = IC_RESULT (ic);
@@ -8165,7 +8302,7 @@ genPointerSet (iCode * ic, iCode *pi)
   if (p_type == GPOINTER && OP_SYMBOL(result)->remat &&
       IS_CAST_ICODE(OP_SYMBOL(result)->rematiCode)) {
          result = IC_RIGHT(OP_SYMBOL(result)->rematiCode);
-         type =   type = operandType (result);
+         type = operandType (result);
          p_type = DCL_TYPE (type);
   }
   /* now that we have the pointer type we assign
@@ -8189,6 +8326,10 @@ genPointerSet (iCode * ic, iCode *pi)
     case GPOINTER:
       genGenPointerSet (right, result, ic, pi);
       break;
+
+    default:
+      werror (E_INTERNAL_ERROR, __FILE__, __LINE__, 
+             "genPointerSet: illegal pointer type");
     }
 
 }
@@ -8202,7 +8343,7 @@ genIfx (iCode * ic, iCode * popIc)
   operand *cond = IC_COND (ic);
   int isbit = 0;
 
-  D(emitcode (";", "genIfx"));
+  D(emitcode (";     genIfx",""));
 
   aopOp (cond, ic, FALSE);
 
@@ -8239,7 +8380,7 @@ genAddrOf (iCode * ic)
   symbol *sym = OP_SYMBOL (IC_LEFT (ic));
   int size, offset;
 
-  D(emitcode (";", "genAddrOf"));
+  D(emitcode (";     genAddrOf",""));
 
   aopOp (IC_RESULT (ic), ic, FALSE);
 
@@ -8256,12 +8397,12 @@ genAddrOf (iCode * ic)
          emitcode ("add", "a,#0x%02x", ((sym->stack < 0) ?
                                         ((char) (sym->stack - _G.nRegsSaved)) :
                                         ((char) sym->stack)) & 0xff);
-         aopPut (AOP (IC_RESULT (ic)), "a", 0);
+         aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE));
        }
       else
        {
          /* we can just move _bp */
-         aopPut (AOP (IC_RESULT (ic)), "_bp", 0);
+         aopPut (AOP (IC_RESULT (ic)), "_bp", 0, isOperandVolatile (IC_RESULT (ic), FALSE));
        }
       /* fill the result with zero */
       size = AOP_SIZE (IC_RESULT (ic)) - 1;
@@ -8269,7 +8410,7 @@ genAddrOf (iCode * ic)
       offset = 1;
       while (size--)
        {
-         aopPut (AOP (IC_RESULT (ic)), zero, offset++);
+         aopPut (AOP (IC_RESULT (ic)), zero, offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
        }
 
       goto release;
@@ -8288,7 +8429,7 @@ genAddrOf (iCode * ic)
                 offset * 8);
       else
        sprintf (s, "#%s", sym->rname);
-      aopPut (AOP (IC_RESULT (ic)), s, offset++);
+      aopPut (AOP (IC_RESULT (ic)), s, offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
     }
 
 release:
@@ -8306,7 +8447,7 @@ genFarFarAssign (operand * result, operand * right, iCode * ic)
   int offset = 0;
   char *l;
 
-  D(emitcode (";", "genFarFarAssign"));
+  D(emitcode (";     genFarFarAssign",""));
 
   /* first push the right side on to the stack */
   while (size--)
@@ -8323,7 +8464,7 @@ genFarFarAssign (operand * result, operand * right, iCode * ic)
   while (size--)
     {
       emitcode ("pop", "acc");
-      aopPut (AOP (result), "a", --offset);
+      aopPut (AOP (result), "a", --offset, isOperandVolatile (result, FALSE));
     }
   freeAsmop (result, NULL, ic, FALSE);
 
@@ -8339,13 +8480,15 @@ genAssign (iCode * ic)
   int size, offset;
   unsigned long lit = 0L;
 
-  D(emitcode(";","genAssign"));
+  D(emitcode(";     genAssign",""));
 
   result = IC_RESULT (ic);
   right = IC_RIGHT (ic);
 
   /* if they are the same */
-  if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic)))
+  if (operandsEqu (result, right) &&
+      !isOperandVolatile (result, FALSE) &&
+      !isOperandVolatile (right, FALSE))
     return;
 
   aopOp (right, ic, FALSE);
@@ -8363,7 +8506,9 @@ genAssign (iCode * ic)
   aopOp (result, ic, TRUE);
 
   /* if they are the same registers */
-  if (sameRegs (AOP (right), AOP (result)))
+  if (sameRegs (AOP (right), AOP (result)) &&
+      !isOperandVolatile (result, FALSE) &&
+      !isOperandVolatile (right, FALSE))
     goto release;
 
   /* if the result is a bit */
@@ -8375,9 +8520,9 @@ genAssign (iCode * ic)
       if (AOP_TYPE (right) == AOP_LIT)
        {
          if (((int) operandLitValue (right)))
-           aopPut (AOP (result), one, 0);
+           aopPut (AOP (result), one, 0, isOperandVolatile (result, FALSE));
          else
-           aopPut (AOP (result), zero, 0);
+           aopPut (AOP (result), zero, 0, isOperandVolatile (result, FALSE));
          goto release;
        }
 
@@ -8385,13 +8530,13 @@ genAssign (iCode * ic)
       if (AOP_TYPE (right) == AOP_CRY)
        {
          emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
-         aopPut (AOP (result), "c", 0);
+         aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE));
          goto release;
        }
 
       /* we need to or */
       toBoolean (right);
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       goto release;
     }
 
@@ -8411,11 +8556,12 @@ genAssign (iCode * ic)
       while (size--)
        {
          if ((unsigned int) ((lit >> (size * 8)) & 0x0FFL) == 0)
-           aopPut (AOP (result), "a", size);
+           aopPut (AOP (result), "a", size, isOperandVolatile (result, FALSE));
          else
            aopPut (AOP (result),
                    aopGet (AOP (right), size, FALSE, FALSE),
-                   size);
+                   size,
+                   isOperandVolatile (result, FALSE));
        }
     }
   else
@@ -8424,7 +8570,8 @@ genAssign (iCode * ic)
        {
          aopPut (AOP (result),
                  aopGet (AOP (right), offset, FALSE, FALSE),
-                 offset);
+                 offset,
+                 isOperandVolatile (result, FALSE));
          offset++;
        }
     }
@@ -8443,7 +8590,7 @@ genJumpTab (iCode * ic)
   symbol *jtab;
   char *l;
 
-  D(emitcode (";", "genJumpTab"));
+  D(emitcode (";     genJumpTab",""));
 
   aopOp (IC_JTCOND (ic), ic, FALSE);
   /* get the condition into accumulator */
@@ -8477,7 +8624,7 @@ genCast (iCode * ic)
   operand *right = IC_RIGHT (ic);
   int size, offset;
 
-  D(emitcode(";", "genCast"));
+  D(emitcode(";     genCast",""));
 
   /* if they are equivalent then do nothing */
   if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic)))
@@ -8494,9 +8641,9 @@ genCast (iCode * ic)
       if (AOP_TYPE (right) == AOP_LIT)
        {
          if (((int) operandLitValue (right)))
-           aopPut (AOP (result), one, 0);
+           aopPut (AOP (result), one, 0, isOperandVolatile (result, FALSE));
          else
-           aopPut (AOP (result), zero, 0);
+           aopPut (AOP (result), zero, 0, isOperandVolatile (result, FALSE));
 
          goto release;
        }
@@ -8505,13 +8652,13 @@ genCast (iCode * ic)
       if (AOP_TYPE (right) == AOP_CRY)
        {
          emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
-         aopPut (AOP (result), "c", 0);
+         aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE));
          goto release;
        }
 
       /* we need to or */
       toBoolean (right);
-      aopPut (AOP (result), "a", 0);
+      aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE));
       goto release;
     }
 
@@ -8530,7 +8677,8 @@ genCast (iCode * ic)
        {
          aopPut (AOP (result),
                  aopGet (AOP (right), offset, FALSE, FALSE),
-                 offset);
+                 offset,
+                 isOperandVolatile (result, FALSE));
          offset++;
        }
       goto release;
@@ -8548,8 +8696,6 @@ genCast (iCode * ic)
       /* pointer to generic pointer */
       if (IS_GENPTR (ctype))
        {
-         char *l = zero;
-
          if (IS_PTR (type))
            p_type = DCL_TYPE (type);
          else
@@ -8570,36 +8716,24 @@ genCast (iCode * ic)
            {
              aopPut (AOP (result),
                      aopGet (AOP (right), offset, FALSE, FALSE),
-                     offset);
+                     offset,
+                     isOperandVolatile (result, FALSE));
              offset++;
            }
          /* the last byte depending on type */
-         switch (p_type)
            {
-           case IPOINTER:
-           case POINTER:
-             l = zero;
-             break;
-           case FPOINTER:
-             l = one;
-             break;
-           case CPOINTER:
-             l = "#0x02";
-             break;
-           case GPOINTER:
-             l = "0x03";
-             break;
-           case PPOINTER: // what the fck is this?
-             l = "#0x03";
-             break;
-
-           default:
-             /* this should never happen */
-             werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
-                     "got unknown pointer type");
-             exit (1);
-           }
-         aopPut (AOP (result), l, GPTRSIZE - 1);
+               int gpVal = pointerTypeToGPByte(p_type, NULL, NULL);
+               char gpValStr[10];
+           
+               if (gpVal == -1)
+               {
+                   // pointerTypeToGPByte will have bitched.
+                   exit(1);
+               }
+           
+               sprintf(gpValStr, "#0x%d", gpVal);
+               aopPut (AOP (result), gpValStr, GPTRSIZE - 1, isOperandVolatile (result, FALSE));
+           }       
          goto release;
        }
 
@@ -8610,7 +8744,8 @@ genCast (iCode * ic)
        {
          aopPut (AOP (result),
                  aopGet (AOP (right), offset, FALSE, FALSE),
-                 offset);
+                 offset,
+                 isOperandVolatile (result, FALSE));
          offset++;
        }
       goto release;
@@ -8625,17 +8760,18 @@ genCast (iCode * ic)
     {
       aopPut (AOP (result),
              aopGet (AOP (right), offset, FALSE, FALSE),
-             offset);
+             offset,
+             isOperandVolatile (result, FALSE));
       offset++;
     }
 
   /* now depending on the sign of the source && destination */
   size = AOP_SIZE (result) - AOP_SIZE (right);
   /* if unsigned or not an integral type */
-  if (SPEC_USIGN (rtype) || !IS_SPEC (rtype) || AOP_TYPE(right)==AOP_CRY)
+  if (!IS_SPEC (rtype) || SPEC_USIGN (rtype) || AOP_TYPE(right)==AOP_CRY)
     {
       while (size--)
-       aopPut (AOP (result), zero, offset++);
+       aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE));
     }
   else
     {
@@ -8646,7 +8782,7 @@ genCast (iCode * ic)
       emitcode ("rlc", "a");
       emitcode ("subb", "a,acc");
       while (size--)
-       aopPut (AOP (result), "a", offset++);
+       aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE));
     }
 
   /* we are done hurray !!!! */
@@ -8667,7 +8803,7 @@ genDjnz (iCode * ic, iCode * ifx)
   if (!ifx)
     return 0;
 
-  D(emitcode (";", "genDjnz"));
+  D(emitcode (";     genDjnz",""));
 
   /* if the if condition has a false label
      then we cannot save */
@@ -8714,7 +8850,7 @@ genDjnz (iCode * ic, iCode * ifx)
            return 0;
       }
       emitcode ("dec", "%s", rByte);
-      aopPut(AOP(IC_RESULT(ic)), rByte, 0);
+      aopPut(AOP(IC_RESULT(ic)), rByte, 0, isOperandVolatile (IC_RESULT (ic), FALSE));
       emitcode ("jnz", "%05d$", lbl->key + 100);
   }
   else if (IS_AOP_PREG (IC_RESULT (ic)))
@@ -8747,13 +8883,13 @@ genReceive (iCode * ic)
 {
     int size = getSize (operandType (IC_RESULT (ic)));
     int offset = 0;
-  D(emitcode (";", "genReceive"));
+  D(emitcode (";     genReceive",""));
 
   if (ic->argreg == 1) { /* first parameter */
       if (isOperandInFarSpace (IC_RESULT (ic)) &&
          (OP_SYMBOL (IC_RESULT (ic))->isspilt ||
           IS_TRUE_SYMOP (IC_RESULT (ic)))) {
-         
+
          offset = fReturnSizeMCS51 - size;
          while (size--) {
              emitcode ("push", "%s", (strcmp (fReturn[fReturnSizeMCS51 - offset - 1], "a") ?
@@ -8765,9 +8901,9 @@ genReceive (iCode * ic)
          offset = 0;
          while (size--) {
              emitcode ("pop", "acc");
-             aopPut (AOP (IC_RESULT (ic)), "a", offset++);
+             aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
          }
-         
+
       } else {
          _G.accInUse++;
          aopOp (IC_RESULT (ic), ic, FALSE);
@@ -8779,12 +8915,48 @@ genReceive (iCode * ic)
       aopOp (IC_RESULT (ic), ic, FALSE);
       rb1off = ic->argreg;
       while (size--) {
-         aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++);
+         aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++, isOperandVolatile (IC_RESULT (ic), FALSE));
       }
   }
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
 }
 
+/*-----------------------------------------------------------------*/
+/* genDummyRead - generate code for dummy read of volatiles        */
+/*-----------------------------------------------------------------*/
+static void
+genDummyRead (iCode * ic)
+{
+  operand *right;
+  int size, offset;
+
+  D(emitcode(";     genDummyRead",""));
+
+  right = IC_RIGHT (ic);
+
+  aopOp (right, ic, FALSE);
+
+  /* if the result is a bit */
+  if (AOP_TYPE (right) == AOP_CRY)
+    {
+      emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
+      goto release;
+    }
+
+  /* bit variables done */
+  /* general case */
+  size = AOP_SIZE (right);
+  offset = 0;
+  while (size--)
+    {
+      emitcode ("mov", "a,%s", aopGet (AOP (right), offset, FALSE, FALSE));
+      offset++;
+    }
+
+release:
+  freeAsmop (right, NULL, ic, TRUE);
+}
+
 /*-----------------------------------------------------------------*/
 /* gen51Code - generate code for 8051 based controllers            */
 /*-----------------------------------------------------------------*/
@@ -8797,12 +8969,12 @@ gen51Code (iCode * lic)
   lineHead = lineCurr = NULL;
 
   /* print the allocation information */
-  if (allocInfo)
+  if (allocInfo && currFunc)
     printAllocInfo (currFunc, codeOutFile);
   /* if debug information required */
   if (options.debug && currFunc)
     {
-      cdbSymbol (currFunc, cdbFile, FALSE, TRUE);
+      debugFile->writeFunction(currFunc);
       _G.debugLine = 1;
       if (IS_STATIC (currFunc->etype))
        emitcode ("", "F%s$%s$0$0 ==.", moduleName, currFunc->name);
@@ -8830,10 +9002,23 @@ gen51Code (iCode * lic)
                        ic->level, ic->block);
              _G.debugLine = 0;
            }
-         emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, 
-                   printCLine(ic->filename, ic->lineno));
+         if (!options.noCcodeInAsm) {
+           emitcode ("", ";%s:%d: %s", ic->filename, ic->lineno, 
+                     printCLine(ic->filename, ic->lineno));
+         }
          cln = ic->lineno;
        }
+      if (options.iCodeInAsm) {
+       char regsInUse[80];
+       int i;
+
+       for (i=0; i<8; i++) {
+         sprintf (&regsInUse[i],
+                  "%c", ic->riu & (1<<i) ? i+'0' : '-'); 
+       }
+       regsInUse[i]=0;
+       emitcode("", "; [%s] ic:%d: %s", regsInUse, ic->seq, printILine(ic));
+      }
       /* if the result is marked as
          spilt and rematerializable or code for
          this has already been generated then
@@ -9025,6 +9210,10 @@ gen51Code (iCode * lic)
          addSet (&_G.sendSet, ic);
          break;
 
+       case DUMMY_READ_VOLATILE:
+         genDummyRead (ic);
+         break;
+
        default:
          ic = ic;
        }