fixed bug #635354
[fw/sdcc] / src / mcs51 / gen.c
index 933951931351312aafa1f12be73272c5d91c84d3..529be381c2aeb3542a8c2f7e2680e27ca8104c27 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"
@@ -247,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);
@@ -778,13 +770,14 @@ aopGetUsesAcc (asmop *aop, int offset)
   if (offset > (aop->size - 1))
     return FALSE;
 
-  switch (aop->type) 
+  switch (aop->type)
     {
 
     case AOP_R0:
     case AOP_R1:
       if (aop->paged)
        return TRUE;
+      return FALSE;
     case AOP_DPTR:
       return TRUE;
     case AOP_IMMD:
@@ -858,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");
@@ -1212,7 +1211,7 @@ 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 */
@@ -1342,7 +1341,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);
@@ -1388,7 +1387,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);
@@ -1435,17 +1434,11 @@ genUminusFloat (operand * op, operand * result)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genUminusFloat"));
+  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);
+  /* for this we just copy and then flip the bit */
 
-  MOVA (l);
-
-  emitcode ("cpl", "acc.7");
-  aopPut (AOP (result), "a", 3);
+  size = AOP_SIZE (op) - 1;
 
   while (size--)
     {
@@ -1454,6 +1447,13 @@ genUminusFloat (operand * op, operand * result)
              offset);
       offset++;
     }
+
+  l = aopGet (AOP (op), offset, FALSE, FALSE);
+
+  MOVA (l);
+
+  emitcode ("cpl", "acc.7");
+  aopPut (AOP (result), "a", offset);
 }
 
 /*-----------------------------------------------------------------*/
@@ -1466,7 +1466,7 @@ genUminus (iCode * ic)
   sym_link *optype, *rtype;
 
 
-  D(emitcode (";", "genUminus"));
+  D(emitcode (";     genUminus",""));
 
   /* assign asmops */
   aopOp (IC_LEFT (ic), ic, FALSE);
@@ -1557,10 +1557,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), 
@@ -1688,7 +1691,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);
@@ -1724,7 +1727,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 */
@@ -1796,7 +1799,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)
@@ -1988,7 +1991,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 */
@@ -2088,7 +2091,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)
@@ -2426,7 +2429,7 @@ genFunction (iCode * ic)
                     }
                }
            }
-           // jwk: this needs a closer look
+           // TODO: this needs a closer look
            SPEC_ISR_SAVED_BANKS(currFunc->etype) = banksToSave;
        }
     }
@@ -2520,12 +2523,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
@@ -2651,7 +2654,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;
          
@@ -2750,7 +2752,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" */
@@ -2879,10 +2881,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))
@@ -3017,7 +3019,7 @@ outBitAcc (operand * result)
 static void
 genPlusBits (iCode * ic)
 {
-  D(emitcode (";", "genPlusBits"));
+  D(emitcode (";     genPlusBits",""));
 
   if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
     {
@@ -3124,7 +3126,7 @@ genPlus (iCode * ic)
 
   /* special cases :- */
 
-  D(emitcode (";", "genPlus"));
+  D(emitcode (";     genPlus",""));
 
   aopOp (IC_LEFT (ic), ic, FALSE);
   aopOp (IC_RIGHT (ic), ic, FALSE);
@@ -3191,7 +3193,7 @@ genPlus (iCode * ic)
     {
       if (aopGetUsesAcc (leftOp, offset) && aopGetUsesAcc (rightOp, offset))
        {
-         emitcode("mov", "b,acc");
+         emitcode("mov", "b,a");
          MOVA (aopGet (leftOp,  offset, FALSE, TRUE));
          emitcode("xch", "a,b");
          MOVA (aopGet (rightOp, offset, FALSE, TRUE));
@@ -3239,10 +3241,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))
@@ -3370,7 +3372,7 @@ genMinusBits (iCode * ic)
 {
   symbol *lbl = newiTempLabel (NULL);
 
-  D(emitcode (";", "genMinusBits"));
+  D(emitcode (";     genMinusBits",""));
 
   if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
     {
@@ -3400,7 +3402,7 @@ genMinus (iCode * ic)
 {
   int size, offset = 0;
 
-  D(emitcode (";", "genMinus"));
+  D(emitcode (";     genMinus",""));
 
   aopOp (IC_LEFT (ic), ic, FALSE);
   aopOp (IC_RIGHT (ic), ic, FALSE);
@@ -3460,9 +3462,7 @@ genMinus (iCode * ic)
          if (aopGetUsesAcc(rightOp, offset)) {
            wassertl(!aopGetUsesAcc(leftOp, offset), "accumulator clash");
            MOVA (aopGet(rightOp, offset, FALSE, TRUE));
-           if (offset > 0) {
-             emitcode( "cpl", "c");
-           } else {
+           if (offset == 0) {
              emitcode( "setb", "c");
            }
            emitcode("subb", "a,%s", aopGet(leftOp, offset, FALSE, TRUE));
@@ -3497,7 +3497,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);
@@ -3517,7 +3517,7 @@ 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
@@ -3622,7 +3622,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);
@@ -3672,7 +3672,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));
@@ -3698,7 +3698,7 @@ genDivOneByte (operand * left,
   symbol *lbl;
   int size, offset;
 
-  D(emitcode (";", "genDivOneByte"));
+  D(emitcode (";     genDivOneByte",""));
 
   size = AOP_SIZE (result) - 1;
   offset = 1;
@@ -3783,7 +3783,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);
@@ -3826,7 +3826,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));
@@ -3852,7 +3852,7 @@ genModOneByte (operand * left,
   char *l;
   symbol *lbl;
 
-  D(emitcode (";", "genModOneByte"));
+  D(emitcode (";     genModOneByte",""));
 
   /* signed or unsigned */
   if (SPEC_USIGN (opetype))
@@ -3927,7 +3927,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);
@@ -3970,7 +3970,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 */
@@ -4008,14 +4008,14 @@ genCmp (operand * left, operand * right,
   int size, offset = 0;
   unsigned long lit = 0L;
 
-  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
     {
@@ -4118,7 +4118,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);
@@ -4147,7 +4147,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);
@@ -4264,7 +4264,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);
@@ -4491,7 +4491,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
@@ -4533,7 +4533,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
@@ -4644,7 +4644,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);
@@ -4948,7 +4948,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);
@@ -5217,7 +5217,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);
@@ -5475,7 +5475,7 @@ genInline (iCode * ic)
 {
   char *buffer, *bp, *bp1;
 
-  D(emitcode (";", "genInline"));
+  D(emitcode (";     genInline",""));
 
   _G.inLine += (!options.asmpeep);
 
@@ -5521,7 +5521,7 @@ genRRC (iCode * ic)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genRRC"));
+  D(emitcode (";     genRRC",""));
 
   /* rotate right with carry */
   left = IC_LEFT (ic);
@@ -5571,7 +5571,7 @@ genRLC (iCode * ic)
   int size, offset = 0;
   char *l;
 
-  D(emitcode (";", "genRLC"));
+  D(emitcode (";     genRLC",""));
 
   /* rotate right with carry */
   left = IC_LEFT (ic);
@@ -5624,7 +5624,7 @@ genGetHbit (iCode * ic)
 {
   operand *left, *result;
 
-  D(emitcode (";", "genGetHbit"));
+  D(emitcode (";     genGetHbit",""));
 
   left = IC_LEFT (ic);
   result = IC_RESULT (ic);
@@ -6013,6 +6013,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
@@ -6102,6 +6103,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
@@ -6230,7 +6232,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);
 }
@@ -6243,7 +6245,7 @@ genlshTwo (operand * result, operand * left, int shCount)
 {
   int size;
 
-  D(emitcode (";", "genlshTwo"));
+  D(emitcode (";     genlshTwo",""));
 
   size = getDataSize (result);
 
@@ -6349,7 +6351,7 @@ genlshFour (operand * result, operand * left, int shCount)
 {
   int size;
 
-  D(emitcode (";", "genlshFour"));
+  D(emitcode (";     genlshFour",""));
 
   size = AOP_SIZE (result);
 
@@ -6448,7 +6450,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);
 
@@ -6510,7 +6512,7 @@ genLeftShift (iCode * ic)
   char *l;
   symbol *tlbl, *tlbl1;
 
-  D(emitcode (";", "genLeftShift"));
+  D(emitcode (";     genLeftShift",""));
 
   right = IC_RIGHT (ic);
   left = IC_LEFT (ic);
@@ -6613,7 +6615,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);
 }
@@ -6625,7 +6627,7 @@ static void
 genrshTwo (operand * result, operand * left,
           int shCount, int sign)
 {
-  D(emitcode (";", "genrshTwo"));
+  D(emitcode (";     genrshTwo",""));
 
   /* if shCount >= 8 */
   if (shCount >= 8)
@@ -6666,7 +6668,12 @@ 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);
+        MOVA (aopGet (AOP (left), MSB32, FALSE, FALSE));
+      }
     } else {
       aopPut (AOP(result), zero, MSB32);
     }
@@ -6683,7 +6690,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);
     MOVA (aopGet (AOP (left), MSB24, FALSE, FALSE));
   }
 
@@ -6691,7 +6698,7 @@ 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);
     MOVA (aopGet (AOP (left), MSB16, FALSE, FALSE));
   }
   emitcode ("rrc", "a");
@@ -6712,7 +6719,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)
@@ -6787,7 +6794,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);
 
@@ -6812,9 +6819,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
@@ -6835,10 +6843,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);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6852,7 +6859,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 */
@@ -6960,7 +6967,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 */
@@ -7081,7 +7088,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));
@@ -7205,7 +7212,7 @@ genDataPointerGet (operand * left,
   char buffer[256];
   int size, offset = 0;
 
-  D(emitcode (";", "genDataPointerGet"));
+  D(emitcode (";     genDataPointerGet",""));
 
   aopOp (result, ic, TRUE);
 
@@ -7241,7 +7248,7 @@ genNearPointerGet (operand * left,
   sym_link *ltype = operandType (left);
   char buffer[80];
 
-  D(emitcode (";", "genNearPointerGet"));
+  D(emitcode (";     genNearPointerGet",""));
 
   rtype = operandType (result);
   retype = getSpec (rtype);
@@ -7353,7 +7360,7 @@ genPagedPointerGet (operand * left,
   char *rname;
   sym_link *rtype, *retype;
 
-  D(emitcode (";", "genPagedPointerGet"));
+  D(emitcode (";     genPagedPointerGet",""));
 
   rtype = operandType (result);
   retype = getSpec (rtype);
@@ -7441,7 +7448,7 @@ genFarPointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genFarPointerGet"));
+  D(emitcode (";     genFarPointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7497,7 +7504,7 @@ genCodePointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genCodePointerGet"));
+  D(emitcode (";     genCodePointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7527,11 +7534,19 @@ 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++);
+             emitcode ("inc", "dptr");
+           }
+         else
+           { 
+             emitcode ("mov", "a,#0x%02x", offset);
+             emitcode ("movc", "a,@a+dptr");
+             aopPut (AOP (result), "a", offset++);
+           }
        }
     }
 
@@ -7554,7 +7569,7 @@ genGenPointerGet (operand * left,
   int size, offset;
   sym_link *retype = getSpec (operandType (result));
 
-  D(emitcode (";", "genGenPointerGet"));
+  D(emitcode (";     genGenPointerGet",""));
 
   aopOp (left, ic, FALSE);
 
@@ -7618,7 +7633,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);
@@ -7686,7 +7701,7 @@ genPackBits (sym_link * etype,
   int blen, bstr;
   char *l;
 
-  D(emitcode (";", "genPackBits"));
+  D(emitcode (";     genPackBits",""));
 
   blen = SPEC_BLEN (etype);
   bstr = SPEC_BSTR (etype);
@@ -7853,7 +7868,7 @@ genDataPointerSet (operand * right,
   int size, offset = 0;
   char *l, buffer[256];
 
-  D(emitcode (";", "genDataPointerSet"));
+  D(emitcode (";     genDataPointerSet",""));
 
   aopOp (right, ic, FALSE);
 
@@ -7888,7 +7903,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);
@@ -8015,7 +8030,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));
@@ -8105,7 +8120,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);
 
@@ -8162,7 +8177,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);
 
@@ -8227,7 +8242,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);
@@ -8292,7 +8307,7 @@ genIfx (iCode * ic, iCode * popIc)
   operand *cond = IC_COND (ic);
   int isbit = 0;
 
-  D(emitcode (";", "genIfx"));
+  D(emitcode (";     genIfx",""));
 
   aopOp (cond, ic, FALSE);
 
@@ -8329,7 +8344,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);
 
@@ -8396,7 +8411,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--)
@@ -8429,14 +8444,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)) {
     return;
+  }
 
   aopOp (right, ic, FALSE);
 
@@ -8533,7 +8549,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 */
@@ -8567,7 +8583,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)))
@@ -8742,7 +8758,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 */
@@ -8822,7 +8838,7 @@ 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)) &&
@@ -8872,12 +8888,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);
@@ -8905,10 +8921,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