fixed bug #486483
[fw/sdcc] / src / pic / gen.c
index 912840c41aaf20da8414c9e93615977b659af77a..c8a8fc64f686c5d0aad6f521e8a0ab6cf3c4f5f0 100644 (file)
 #include "pcode.h"
 #include "gen.h"
 
-/*
-  if(IC_RESULT(ic) && AOP(IC_RESULT(ic)))
-    DEBUGpic14_emitcode ("; ","result %s",
-                        AopType(AOP_TYPE(IC_RESULT(ic))));
-
-  if(IC_LEFT(ic) && AOP(IC_LEFT(ic)))
-    DEBUGpic14_emitcode ("; ","left %s",
-                      AopType(AOP_TYPE(IC_LEFT(ic))));
-
-  if(IC_RIGHT(ic) && AOP(IC_RIGHT(ic)))
-    DEBUGpic14_emitcode ("; ","right %s",
-                      AopType(AOP_TYPE(IC_RIGHT(ic))));
-*/
-
 
 static int labelOffset=0;
 static int debug_verbose=1;
@@ -87,6 +73,7 @@ static int GpsuedoStkPtr=0;
 
 unsigned int pic14aopLiteral (value *val, int offset);
 const char *AopType(short type);
+static iCode *ifxForOp ( operand *op, iCode *ic );
 
 #define BYTEofLONG(l,b) ( (l>> (b<<3)) & 0xff)
 
@@ -168,6 +155,21 @@ static int my_powof2 (unsigned long num)
   return -1;
 }
 
+void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result)
+{
+
+  DEBUGpic14_emitcode ("; ","line = %d result %s=%s, left %s=%s, right %s=%s, size = %d",
+                      line_no,
+                      ((result) ? AopType(AOP_TYPE(result)) : "-"),
+                      ((result) ? aopGet(AOP(result),0,TRUE,FALSE) : "-"),
+                      ((left)   ? AopType(AOP_TYPE(left)) : "-"),
+                      ((left)   ? aopGet(AOP(left),0,TRUE,FALSE) : "-"),
+                      ((right)  ? AopType(AOP_TYPE(right)) : "-"),
+                      ((right)  ? aopGet(AOP(right),0,FALSE,FALSE) : "-"),
+                      ((result) ? AOP_SIZE(result) : 0));
+
+}
+
 void DEBUGpic14_emitcode (char *inst,char *fmt, ...)
 {
     va_list ap;
@@ -499,7 +501,7 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result)
         sym->aop = aop = newAsmop (AOP_CRY);
         aop->aopu.aop_dir = sym->rname ;
         aop->size = getSize(sym->type);
-       DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size);
+       //DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size);
         return aop;
     }
     /* if it is in direct space */
@@ -698,13 +700,12 @@ void aopOp (operand *op, iCode *ic, bool result)
     if (!op)
         return ;
 
-    DEBUGpic14_emitcode(";","%d",__LINE__);
+    //    DEBUGpic14_emitcode(";","%d",__LINE__);
     /* if this a literal */
     if (IS_OP_LITERAL(op)) {
         op->aop = aop = newAsmop(AOP_LIT);
         aop->aopu.aop_lit = op->operand.valOperand;
         aop->size = getSize(operandType(op));
-      DEBUGpic14_emitcode(";","%d, lit = %d",__LINE__,aop->aopu.aop_lit);
         return;
     }
 
@@ -721,9 +722,9 @@ void aopOp (operand *op, iCode *ic, bool result)
 
     /* if this is a true symbol */
     if (IS_TRUE_SYMOP(op)) {    
-      DEBUGpic14_emitcode(";","%d - true symop",__LINE__);
-        op->aop = aopForSym(ic,OP_SYMBOL(op),result);
-        return ;
+      //DEBUGpic14_emitcode(";","%d - true symop",__LINE__);
+      op->aop = aopForSym(ic,OP_SYMBOL(op),result);
+      return ;
     }
 
     /* this is a temporary : this has
@@ -739,7 +740,6 @@ void aopOp (operand *op, iCode *ic, bool result)
 
     /* if the type is a conditional */
     if (sym->regType == REG_CND) {
-      DEBUGpic14_emitcode(";","%d",__LINE__);
         aop = op->aop = sym->aop = newAsmop(AOP_CRY);
         aop->size = 0;
         return;
@@ -756,7 +756,6 @@ void aopOp (operand *op, iCode *ic, bool result)
             sym->aop = op->aop = aop =
                                       aopForRemat (sym);
             aop->size = getSize(sym->type);
-           DEBUGpic14_emitcode(";","%d",__LINE__);
             return;
         }
 
@@ -781,6 +780,10 @@ void aopOp (operand *op, iCode *ic, bool result)
         }
 
         /* else spill location  */
+       if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+           /* force a new aop if sizes differ */
+           sym->usl.spillLoc->aop = NULL;
+       }
        DEBUGpic14_emitcode(";","%s %d %s",__FUNCTION__,__LINE__,sym->usl.spillLoc->rname);
         sym->aop = op->aop = aop = 
                                   aopForSym(ic,sym->usl.spillLoc,result);
@@ -817,6 +820,7 @@ void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop)
 
     /* depending on the asmop type only three cases need work AOP_RO
        , AOP_R1 && AOP_STK */
+#if 0
     switch (aop->type) {
         case AOP_R0 :
             if (_G.r0Pushed ) {
@@ -883,6 +887,7 @@ void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop)
             }       
         }
     }
+#endif
 
 dealloc:
     /* all other cases just dealloc */
@@ -1002,29 +1007,20 @@ char *aopGet (asmop *aop, int offset, bool bit16, bool dname)
        return rs;
        
     case AOP_REG:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
        if (dname) 
            return aop->aopu.aop_reg[offset]->dname;
        else
            return aop->aopu.aop_reg[offset]->name;
        
     case AOP_CRY:
-      pic14_emitcode(";","%d",__LINE__);
-      //pic14_emitcode("clr","a");
-      //pic14_emitcode("mov","c,%s",aop->aopu.aop_dir);
-      //pic14_emitcode("rlc","a") ;
-      //return (dname ? "acc" : "a");
+      //pic14_emitcode(";","%d",__LINE__);
       return aop->aopu.aop_dir;
        
     case AOP_ACC:
         DEBUGpic14_emitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__);
-       //if (!offset && dname)
-       //    return "acc";
-       //return aop->aopu.aop_str[offset];
        return "AOP_accumulator_bug";
 
     case AOP_LIT:
-        DEBUGpic14_emitcode(";","%d",__LINE__);
        sprintf(s,"0x%02x", pic14aopLiteral (aop->aopu.aop_lit,offset));
        rs = Safe_calloc(1,strlen(s)+1);
        strcpy(rs,s);   
@@ -1074,6 +1070,7 @@ pCodeOp *popCopyReg(pCodeOpReg *pc)
   pcor->r = pc->r;
   pcor->rIdx = pc->rIdx;
 
+  //DEBUGpic14_emitcode ("; ***","%s  , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx);
 
   return PCOP(pcor);
 }
@@ -1161,7 +1158,7 @@ pCodeOp *popRegFromIdx(int rIdx)
 /*-----------------------------------------------------------------*/
 /* popGet - asm operator to pcode operator conversion              */
 /*-----------------------------------------------------------------*/
-pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
+pCodeOp *popGet (asmop *aop, int offset) //, bool bit16, bool dname)
 {
     char *s = buffer ;
     char *rs;
@@ -1200,16 +1197,16 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
       DEBUGpic14_emitcode(";","%d",__LINE__);
        pcop = Safe_calloc(1,sizeof(pCodeOp) );
        pcop->type = PO_IMMEDIATE;
-       if (bit16) 
-           sprintf (s,"%s",aop->aopu.aop_immd);
+       //if (bit16) 
+       //    sprintf (s,"%s",aop->aopu.aop_immd);
+       //else
+       if (offset) 
+         sprintf(s,"(%s >> %d)",
+                 aop->aopu.aop_immd,
+                 offset*8);
        else
-           if (offset) 
-               sprintf(s,"(%s >> %d)",
-                       aop->aopu.aop_immd,
-                       offset*8);
-           else
-               sprintf(s,"%s",
-                       aop->aopu.aop_immd);
+         sprintf(s,"%s",
+                 aop->aopu.aop_immd);
        pcop->name = Safe_calloc(1,strlen(s)+1);
        strcpy(pcop->name,s);   
        return pcop;
@@ -1231,23 +1228,12 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
       {
        int rIdx = aop->aopu.aop_reg[offset]->rIdx;
 
-       DEBUGpic14_emitcode(";","%d, rIdx=0x%x",__LINE__,rIdx);
-       if(bit16)
-         pcop = Safe_calloc(1,sizeof(pCodeOpRegBit) );
-       else
-         pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
-       //pcop->type = PO_GPR_REGISTER;
+       pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
        PCOR(pcop)->rIdx = rIdx;
        PCOR(pcop)->r = pic14_regWithIdx(rIdx);
        pcop->type = PCOR(pcop)->r->pc_type;
-
-       if (dname)
-         rs = aop->aopu.aop_reg[offset]->dname;
-       else 
-         rs = aop->aopu.aop_reg[offset]->name;
-
-       DEBUGpic14_emitcode(";","%d  %s",__LINE__,rs);
-
+       rs = aop->aopu.aop_reg[offset]->name;
+       //DEBUGpic14_emitcode(";","%d regiser idx = %d name =%s",__LINE__,rIdx,rs);
        return pcop;
       }
 
@@ -1256,7 +1242,6 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
       return pcop;
        
     case AOP_LIT:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
       return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset));
 
     case AOP_STR:
@@ -1266,13 +1251,13 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
       pcop->type = PO_STR;
 
       //aop->coff = offset ;
-       if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && dname)
-         sprintf(s,"%s","acc");
-       else
-         sprintf(s,"%s",aop->aopu.aop_str[offset]);
-       pcop->name = Safe_calloc(1,strlen(s)+1);
-       strcpy(pcop->name,s);   
-       return pcop;
+      //if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && dname)
+      //  sprintf(s,"%s","acc");
+      //else
+      sprintf(s,"%s",aop->aopu.aop_str[offset]);
+      pcop->name = Safe_calloc(1,strlen(s)+1);
+      strcpy(pcop->name,s);   
+      return pcop;
        
     }
 
@@ -1314,7 +1299,7 @@ void aopPut (asmop *aop, char *s, int offset)
 
          if(strcmp(s,"W"))
            pic14_emitcode(";BUG! should have this:movf","%s,w   %d",s,__LINE__);
-         emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
+         emitpcode(POC_MOVWF,popGet(aop,offset));
 
 
        }
@@ -1355,7 +1340,7 @@ void aopPut (asmop *aop, char *s, int offset)
            pcop->name = Safe_strdup(s);
            emitpcode(POC_MOVFW,pcop);
          }
-         emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
+         emitpcode(POC_MOVWF,popGet(aop,offset));
 
        }
        break;
@@ -1627,21 +1612,21 @@ int pic14_getDataSize(operand *op)
 /*-----------------------------------------------------------------*/
 void pic14_outAcc(operand *result)
 {
+  int size,offset;
+  DEBUGpic14_emitcode ("; ***","%s  %d - ",__FUNCTION__,__LINE__);
+  DEBUGpic14_AopType(__LINE__,NULL,NULL,result);
 
-    DEBUGpic14_emitcode ("; ***","%s  %d - Warning no code will be generated here",__FUNCTION__,__LINE__);
 
-#if 0
-    size = pic14_getDataSize(result);
-    if(size){
-        aopPut(AOP(result),"a",0);
-        size--;
-        offset = 1;
-        /* unsigned or positive */
-        while(size--){
-            aopPut(AOP(result),zero,offset++);
-        }
-    }
-#endif
+  size = pic14_getDataSize(result);
+  if(size){
+    emitpcode(POC_MOVWF,popGet(AOP(result),0));
+    size--;
+    offset = 1;
+    /* unsigned or positive */
+    while(size--)
+      emitpcode(POC_CLRF,popGet(AOP(result),offset++));
+  }
+
 }
 
 /*-----------------------------------------------------------------*/
@@ -1672,12 +1657,10 @@ void pic14_toBoolean(operand *oper)
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
     if ( AOP_TYPE(oper) != AOP_ACC) {
-      emitpcode(POC_MOVFW,popGet(AOP(oper),0,FALSE,FALSE));
-      pic14_emitcode("movf","%s,w",aopGet(AOP(oper),0,FALSE,FALSE));
+      emitpcode(POC_MOVFW,popGet(AOP(oper),0));
     }
     while (size--) {
-      pic14_emitcode("iorwf","%s,w",aopGet(AOP(oper),offset,FALSE,FALSE));
-      emitpcode(POC_IORFW, popGet(AOP(oper),offset++,FALSE,FALSE));
+      emitpcode(POC_IORFW, popGet(AOP(oper),offset++));
     }
 }
 
@@ -1687,40 +1670,49 @@ void pic14_toBoolean(operand *oper)
 /*-----------------------------------------------------------------*/
 static void genNot (iCode *ic)
 {
-    symbol *tlbl;
-    sym_link *optype = operandType(IC_LEFT(ic));
-
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* assign asmOps to operand & result */
-    aopOp (IC_LEFT(ic),ic,FALSE);
-    aopOp (IC_RESULT(ic),ic,TRUE);
+  symbol *tlbl;
+  sym_link *optype = operandType(IC_LEFT(ic));
+  int size;
 
-    /* if in bit space then a special case */
-    if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) {
-      pic14_emitcode("movlw","1<<%s");
-      //pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); 
-      //pic14_emitcode("cpl","c"); 
-      //pic14_outBitC(IC_RESULT(ic));
-      goto release;
-    }
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* assign asmOps to operand & result */
+  aopOp (IC_LEFT(ic),ic,FALSE);
+  aopOp (IC_RESULT(ic),ic,TRUE);
+
+  DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic));
+  /* if in bit space then a special case */
+  if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) {
+    pic14_emitcode("movlw","1<<%s");
+    //pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); 
+    //pic14_emitcode("cpl","c"); 
+    //pic14_outBitC(IC_RESULT(ic));
+    goto release;
+  }
 
-    /* if type float then do float */
-    if (IS_FLOAT(optype)) {
-        genNotFloat(IC_LEFT(ic),IC_RESULT(ic));
-        goto release;
-    }
+  /* if type float then do float */
+  if (IS_FLOAT(optype)) {
+    genNotFloat(IC_LEFT(ic),IC_RESULT(ic));
+    goto release;
+  }
 
-    pic14_toBoolean(IC_LEFT(ic));
+  size = AOP_SIZE(IC_RESULT(ic));
+  if(size == 1) {
+    emitpcode(POC_COMFW,popGet(AOP(IC_LEFT(ic)),0));
+    emitpcode(POC_ANDLW,popGetLit(1));
+    emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
+    goto release;
+  }
+  pic14_toBoolean(IC_LEFT(ic));
 
-    tlbl = newiTempLabel(NULL);
-    pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100);
-    pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-    pic14_outBitC(IC_RESULT(ic));
+  tlbl = newiTempLabel(NULL);
+  pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100);
+  pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+  pic14_outBitC(IC_RESULT(ic));
 
-release:    
-    /* release the aops */
-    freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
-    freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+ release:    
+  /* release the aops */
+  freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
+  freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
 }
 
 
@@ -1796,64 +1788,58 @@ static void genUminusFloat(operand *op,operand *result)
 /*-----------------------------------------------------------------*/
 static void genUminus (iCode *ic)
 {
-    int offset ,size ;
-    sym_link *optype, *rtype;
+  int size, i;
+  sym_link *optype, *rtype;
 
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* assign asmops */
-    aopOp(IC_LEFT(ic),ic,FALSE);
-    aopOp(IC_RESULT(ic),ic,TRUE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* assign asmops */
+  aopOp(IC_LEFT(ic),ic,FALSE);
+  aopOp(IC_RESULT(ic),ic,TRUE);
 
-    /* if both in bit space then special
-    case */
-    if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY &&
-        AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { 
+  /* if both in bit space then special
+     case */
+  if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY &&
+      AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { 
 
-        pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); 
-        pic14_emitcode("cpl","c"); 
-        pic14_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); 
-        goto release; 
-    } 
+    emitpcode(POC_BCF,   popGet(AOP(IC_RESULT(ic)),0));
+    emitpcode(POC_BTFSS, popGet(AOP(IC_LEFT(ic)),0));
+    emitpcode(POC_BSF,   popGet(AOP(IC_RESULT(ic)),0));
 
-    optype = operandType(IC_LEFT(ic));
-    rtype = operandType(IC_RESULT(ic));
+    goto release; 
+  } 
 
-    /* if float then do float stuff */
-    if (IS_FLOAT(optype)) {
-        genUminusFloat(IC_LEFT(ic),IC_RESULT(ic));
-        goto release;
-    }
+  optype = operandType(IC_LEFT(ic));
+  rtype = operandType(IC_RESULT(ic));
 
-    /* otherwise subtract from zero */
-    size = AOP_SIZE(IC_LEFT(ic));
-    offset = 0 ;
-    CLRC ;
-    while(size--) {
-        char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE);
-        if (!strcmp(l,"a")) {
-            pic14_emitcode("cpl","a");
-            pic14_emitcode("inc","a");
-        } else {
-            pic14_emitcode("clr","a");
-            pic14_emitcode("subb","a,%s",l);
-        }       
-        aopPut(AOP(IC_RESULT(ic)),"a",offset++);
+  /* if float then do float stuff */
+  if (IS_FLOAT(optype)) {
+    genUminusFloat(IC_LEFT(ic),IC_RESULT(ic));
+    goto release;
+  }
+
+  /* otherwise subtract from zero by taking the 2's complement */
+  size = AOP_SIZE(IC_LEFT(ic));
+
+  for(i=0; i<size; i++) {
+    if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
+      emitpcode(POC_COMF,  popGet(AOP(IC_LEFT(ic)),i));
+    else {
+      emitpcode(POC_COMFW, popGet(AOP(IC_LEFT(ic)),i));
+      emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),i));
     }
+  }
 
-    /* if any remaining bytes in the result */
-    /* we just need to propagate the sign   */
-    if ((size = (AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_LEFT(ic))))) {
-        pic14_emitcode("rlc","a");
-        pic14_emitcode("subb","a,acc");
-        while (size--) 
-            aopPut(AOP(IC_RESULT(ic)),"a",offset++);
-    }       
+  emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),0));
+  for(i=1; i<size; i++) {
+    emitSKPNZ;
+    emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),i));
+  }
 
-release:
-    /* release the aops */
-    freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
-    freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);    
+ release:
+  /* release the aops */
+  freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
+  freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);    
 }
 
 /*-----------------------------------------------------------------*/
@@ -1912,7 +1898,7 @@ static void saveRegisters(iCode *lic)
        }
 
     dtype = operandType(IC_LEFT(ic));
-    if (dtype        && 
+    if (currFunc && dtype && 
         (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
        IFFUNC_ISISR(currFunc->type) &&
         !ic->bankSaved) 
@@ -1985,76 +1971,37 @@ static void pushSide(operand * oper, int size)
 /*-----------------------------------------------------------------*/
 static void assignResultValue(operand * oper)
 {
-  int offset = 0;
   int size = AOP_SIZE(oper);
 
   DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
   if(!GpsuedoStkPtr) {
     /* The last byte in the assignment is in W */
-    //aopPut(AOP(oper),"W",size-1);
-    emitpcode(POC_MOVWF, popGet(AOP(oper),0,FALSE,FALSE));
-    GpsuedoStkPtr++;
-    if(size == 1)
-      return;
     size--;
-    offset++;
+    emitpcode(POC_MOVWF, popGet(AOP(oper),size));
+    GpsuedoStkPtr++;
   }
 
   while (size--) {
     emitpcode(POC_MOVFW,popRegFromIdx(GpsuedoStkPtr-1 + Gstack_base_addr));
-    emitpcode(POC_MOVWF, popGet(AOP(oper),offset,FALSE,FALSE));
-    offset++;
     GpsuedoStkPtr++;
-
+    emitpcode(POC_MOVWF, popGet(AOP(oper),size));
   }
 }
 
 
-/*-----------------------------------------------------------------*/
-/* genXpush - pushes onto the external stack                       */
-/*-----------------------------------------------------------------*/
-static void genXpush (iCode *ic)
-{
-    asmop *aop = newAsmop(0);
-    regs *r ;
-    int size,offset = 0;
-
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    aopOp(IC_LEFT(ic),ic,FALSE);
-    r = getFreePtr(ic,&aop,FALSE);
-
-    
-    pic14_emitcode("mov","%s,_spx",r->name);
-
-    size = AOP_SIZE(IC_LEFT(ic));
-    while(size--) {
-
-       char *l = aopGet(AOP(IC_LEFT(ic)),
-                        offset++,FALSE,FALSE); 
-       MOVA(l);            
-       pic14_emitcode("movx","@%s,a",r->name); 
-       pic14_emitcode("inc","%s",r->name);
-
-    }
-
-       
-    pic14_emitcode("mov","_spx,%s",r->name);
-
-    freeAsmop(NULL,aop,ic,TRUE);
-    freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
-}
-
 /*-----------------------------------------------------------------*/
 /* genIpush - genrate code for pushing this gets a little complex  */
 /*-----------------------------------------------------------------*/
 static void genIpush (iCode *ic)
 {
+
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
     int size, offset = 0 ;
     char *l;
 
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     /* if this is not a parm push : ie. it is spill push 
     and spill push is always done on the local stack */
     if (!ic->parmPush) {
@@ -2082,13 +2029,6 @@ static void genIpush (iCode *ic)
     registers that need to be saved */   
     saveRegisters(ic);
 
-    /* if use external stack then call the external
-    stack pushing routine */
-    if (options.useXstack) {
-        genXpush(ic);
-        return ;
-    }
-
     /* then do the push */
     aopOp(IC_LEFT(ic),ic,FALSE);
 
@@ -2108,6 +2048,7 @@ static void genIpush (iCode *ic)
     }       
 
     freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -2115,10 +2056,11 @@ static void genIpush (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genIpop (iCode *ic)
 {
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
     int size,offset ;
 
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     /* if the temp was not pushed then */
     if (OP_SYMBOL(IC_LEFT(ic))->isspilt)
         return ;
@@ -2131,6 +2073,7 @@ static void genIpop (iCode *ic)
                                    FALSE,TRUE));
 
     freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -2138,6 +2081,8 @@ static void genIpop (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void unsaverbank (int bank,iCode *ic,bool popPsw)
 {
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
     int i;
     asmop *aop ;
     regs *r = NULL;
@@ -2175,7 +2120,8 @@ static void unsaverbank (int bank,iCode *ic,bool popPsw)
        pic14_emitcode("mov","_spx,%s",r->name);
        freeAsmop(NULL,aop,ic,TRUE);
 
-    } 
+    }
+#endif 
 }
 
 /*-----------------------------------------------------------------*/
@@ -2183,6 +2129,8 @@ static void unsaverbank (int bank,iCode *ic,bool popPsw)
 /*-----------------------------------------------------------------*/
 static void saverbank (int bank, iCode *ic, bool pushPsw)
 {
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
     int i;
     asmop *aop ;
     regs *r = NULL;
@@ -2221,7 +2169,7 @@ static void saverbank (int bank, iCode *ic, bool pushPsw)
        pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff);
     }
     ic->bankSaved = 1;
-
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -2241,7 +2189,7 @@ static void genCall (iCode *ic)
      the same register bank then we need to save the
      destination registers on the stack */
   dtype = operandType(IC_LEFT(ic));
-  if (dtype        && 
+  if (currFunc && dtype && 
       (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
       IFFUNC_ISISR(currFunc->type) &&
       !ic->bankSaved) 
@@ -2256,9 +2204,20 @@ static void genCall (iCode *ic)
      * in registers. (The pCode optimizer will get
      * rid of most of these :).
      */
-    int psuedoStkPtr=0
+    int psuedoStkPtr=-1
     int firstTimeThruLoop = 1;
 
+    _G.sendSet = reverseSet(_G.sendSet);
+
+    /* First figure how many parameters are getting passed */
+    for (sic = setFirstItem(_G.sendSet) ; sic ; 
+        sic = setNextItem(_G.sendSet)) {
+
+      aopOp(IC_LEFT(sic),sic,FALSE);
+      psuedoStkPtr += AOP_SIZE(IC_LEFT(sic));
+      freeAsmop (IC_LEFT(sic),NULL,sic,FALSE);
+    }
+
     for (sic = setFirstItem(_G.sendSet) ; sic ; 
         sic = setNextItem(_G.sendSet)) {
       int size, offset = 0;
@@ -2268,43 +2227,28 @@ static void genCall (iCode *ic)
 
 
       while (size--) {
-       char *l = aopGet(AOP(IC_LEFT(sic)),offset,
-                        FALSE,FALSE);
        DEBUGpic14_emitcode ("; ","%d left %s",__LINE__,
                             AopType(AOP_TYPE(IC_LEFT(sic))));
 
        if(!firstTimeThruLoop) {
-         /* If is not the first time we've been through the loop
+         /* If this is not the first time we've been through the loop
           * then we need to save the parameter in a temporary
           * register. The last byte of the last parameter is
           * passed in W. */
-         pic14_emitcode("movwf","%s",fReturn[offset]);
-         emitpcode(POC_MOVWF,popRegFromIdx(psuedoStkPtr + Gstack_base_addr));
-         psuedoStkPtr++;
-         DEBUGpic14_emitcode ("; ","%d save param in %d",__LINE__,
-                              psuedoStkPtr+Gstack_base_addr);
+         emitpcode(POC_MOVWF,popRegFromIdx(--psuedoStkPtr + Gstack_base_addr));
+
        }
        firstTimeThruLoop=0;
 
-       if (strcmp(l,fReturn[offset])) {
+       //if (strcmp(l,fReturn[offset])) {
 
-         if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) ||
-              ((AOP(IC_LEFT(sic))->type) == AOP_LIT) )
-           emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE));
-         //pic14_emitcode("movlw","%s",l);
-         else
-           emitpcode(POC_MOVFW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE));
-         //pic14_emitcode("movf","%s,w",l);
+       if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) ||
+            ((AOP(IC_LEFT(sic))->type) == AOP_LIT) )
+         emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(sic)),offset));
+       else
+         emitpcode(POC_MOVFW,popGet(AOP(IC_LEFT(sic)),offset));
 
-         /* The last one is passed in W but all others are passed on 
-            the psuedo stack */
-         /*
-         if(size) {
-           pic14_emitcode("movwf","%s",fReturn[offset]);
-           emitpcode(POC_MOVWF,popRegFromIdx(offset + Gstack_base_addr));
-         }
-         */
-       }
+       //}
        offset++;
       }
       freeAsmop (IC_LEFT(sic),NULL,sic,TRUE);
@@ -2378,7 +2322,7 @@ static void genPcall (iCode *ic)
     the same register bank then we need to save the
     destination registers on the stack */
     dtype = operandType(IC_LEFT(ic));
-    if (dtype        && 
+    if (currFunc && dtype && 
        IFFUNC_ISISR(currFunc->type) &&
         (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
         saverbank(FUNC_REGBANK(dtype),ic,TRUE);
@@ -2460,7 +2404,7 @@ static void genPcall (iCode *ic)
     }
 
     /* if register bank was saved then unsave them */
-    if (dtype        && 
+    if (currFunc && dtype && 
         (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
         unsaverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
@@ -2500,6 +2444,8 @@ static int resultRemat (iCode *ic)
 /*-----------------------------------------------------------------*/
 static bool inExcludeList(char *s)
 {
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
     int i =0;
     
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
@@ -2512,6 +2458,7 @@ static bool inExcludeList(char *s)
         STRCASECMP(s,options.excludeRegs[i]) == 0)
            return TRUE;
     }
+#endif
     return FALSE ;
 }
 
@@ -2873,11 +2820,9 @@ static void genRet (iCode *ic)
       if (strcmp(fReturn[offset],l)) {
        if( ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) ||
            ((AOP(IC_LEFT(ic))->type) == AOP_LIT) ) {
-         emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         pic14_emitcode("movlw","%s",l);
+         emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset));
        }else {
-         emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         pic14_emitcode("movf","%s,w",l);
+         emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset));
        }
        if(size) {
          emitpcode(POC_MOVWF,popRegFromIdx(offset + Gstack_base_addr));
@@ -2935,33 +2880,6 @@ static void genGoto (iCode *ic)
   pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset);
 }
 
-/*-----------------------------------------------------------------*/
-/* findLabelBackwards: walks back through the iCode chain looking  */
-/* for the given label. Returns number of iCode instructions      */
-/* between that label and given ic.                               */
-/* Returns zero if label not found.                               */
-/*-----------------------------------------------------------------*/
-#if 0
-static int findLabelBackwards(iCode *ic, int key)
-{
-    int count = 0;
-    
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    while (ic->prev)
-    {
-        ic = ic->prev;
-        count++;
-        
-        if (ic->op == LABEL && IC_LABEL(ic)->key == key)
-        {
-            /* printf("findLabelBackwards = %d\n", count); */
-            return count;
-        }
-    }
-    
-    return 0;
-}
-#endif
 
 /*-----------------------------------------------------------------*/
 /* genMultbits :- multiplication of bits                           */
@@ -2970,11 +2888,15 @@ static void genMultbits (operand *left,
                          operand *right, 
                          operand *result)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  if(!pic14_sameRegs(AOP(result),AOP(right)))
+    emitpcode(POC_BSF,  popGet(AOP(result),0));
+
+  emitpcode(POC_BTFSC,popGet(AOP(right),0));
+  emitpcode(POC_BTFSS,popGet(AOP(left),0));
+  emitpcode(POC_BCF,  popGet(AOP(result),0));
 
-    pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
-    pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir);
-    pic14_outBitC(result);
 }
 
 
@@ -2991,6 +2913,8 @@ static void genMultOneByte (operand *left,
     int size,offset;
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+
     /* (if two literals, the value is computed before) */
     /* if one literal, literal on the right */
     if (AOP_TYPE(left) == AOP_LIT){
@@ -3079,6 +3003,8 @@ static void genMult (iCode *ic)
     aopOp (right,ic,FALSE);
     aopOp (result,ic,TRUE);
 
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+
     /* special cases first */
     /* both are bits */
     if (AOP_TYPE(left) == AOP_CRY &&
@@ -3497,6 +3423,23 @@ static void genSkipc(resolvedIfx *rifx)
   rifx->generated = 1;
 }
 
+/*-----------------------------------------------------------------*/
+/* genSkipz2                                                       */
+/*-----------------------------------------------------------------*/
+static void genSkipz2(resolvedIfx *rifx)
+{
+  if(!rifx)
+    return;
+
+  if(rifx->condition)
+    emitSKPZ;
+  else
+    emitSKPNZ;
+
+  emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+  rifx->generated = 1;
+}
+
 /*-----------------------------------------------------------------*/
 /* genSkipz                                                        */
 /*-----------------------------------------------------------------*/
@@ -3521,6 +3464,53 @@ static void genSkipz(iCode *ifx, int condition)
     pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset);
 
 }
+/*-----------------------------------------------------------------*/
+/* genSkipCond                                                     */
+/*-----------------------------------------------------------------*/
+static void genSkipCond(resolvedIfx *rifx,operand *op, int offset, int bit)
+{
+  if(!rifx)
+    return;
+
+  if(rifx->condition)
+    emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0));
+  else
+    emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0));
+
+
+  emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+  rifx->generated = 1;
+}
+
+#if 0
+/*-----------------------------------------------------------------*/
+/* genChkZeroes :- greater or less than comparison                 */
+/*     For each byte in a literal that is zero, inclusive or the   */
+/*     the corresponding byte in the operand with W                */
+/*     returns true if any of the bytes are zero                   */
+/*-----------------------------------------------------------------*/
+static int genChkZeroes(operand *op, int lit,  int size)
+{
+
+  int i;
+  int flag =1;
+
+  while(size--) {
+    i = (lit >> (size*8)) & 0xff;
+
+    if(i==0) {
+      if(flag) 
+       emitpcode(POC_MOVFW, popGet(AOP(op),size));
+      else
+       emitpcode(POC_IORFW, popGet(AOP(op),size));
+      flag = 0;
+    }
+  }
+
+  return (flag==0);
+}
+#endif
+
 /*-----------------------------------------------------------------*/
 /* genCmp :- greater or less than comparison                       */
 /*-----------------------------------------------------------------*/
@@ -3529,16 +3519,20 @@ static void genCmp (operand *left,operand *right,
 {
   int size, offset = 0 ;
   unsigned long lit = 0L,i = 0;
-  resolvedIfx rIfx;
-
+  resolvedIfx rFalseIfx;
+  //  resolvedIfx rTrueIfx;
+  symbol *truelbl;
   DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
   if(ifx) {
   DEBUGpic14_emitcode ("; ***","true ifx is %s",((IC_TRUE(ifx) == NULL) ? "false" : "true"));
   DEBUGpic14_emitcode ("; ***","false ifx is %s",((IC_FALSE(ifx) == NULL) ? "false" : "true"));
   }
 
-  resolveIfx(&rIfx,ifx);
 
+  resolveIfx(&rFalseIfx,ifx);
+  truelbl  = newiTempLabel(NULL);
+
+  //if(IC_TRUE(ifx) == NULL)
   /* if left & right are bit variables */
   if (AOP_TYPE(left) == AOP_CRY &&
       AOP_TYPE(right) == AOP_CRY ) {
@@ -3561,43 +3555,252 @@ static void genCmp (operand *left,operand *right,
       pic14_emitcode("","%05d_DS_:",lbl->key+100);
     } else {
 
+      symbol *lbl  = newiTempLabel(NULL);
+
       if(AOP_TYPE(right) == AOP_LIT) {
-       symbol *lbl = newiTempLabel(NULL);
 
        lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
 
-       DEBUGpic14_emitcode(";right lit","lit = %d,sign=%d",lit,sign);
+       DEBUGpic14_emitcode(";right lit","lit = 0x%x,sign=%d",lit,sign);
 
-       size--;
-       i = (lit >> (size*8)) & 0xff;
-       if(sign) {
-         if(i & 0x80) {
-           emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
-         } else {
-           emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
-         }
-         emitpcode(POC_GOTO,popGetLabel(lbl->key));
-       }
+       /* special cases */
 
-       emitpcode(POC_MOVLW, popGetLit(i));
-       emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE));
-       while(size--) {
-         i = (lit >> (size*8)) & 0xff;
-         emitpcode(POC_MOVLW, popGetLit(i));
-         emitSKPNC;
-         emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE));
-       }
+       if(lit == 0) {
+
+         if(sign != 0) 
+           genSkipCond(&rFalseIfx,left,size-1,7);
+         else 
+           /* no need to compare to 0...*/
+           /* NOTE: this is a de-generate compare that most certainly 
+            *       creates some dead code. */
+           emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key));
+
+         if(ifx) ifx->generated = 1;
+         return;
+
+       }
+       size--;
+
+       if(size == 0) {
+         //i = (lit >> (size*8)) & 0xff;
+         DEBUGpic14_emitcode(";right lit","line = %d",__LINE__);
+       
+         emitpcode(POC_MOVFW, popGet(AOP(left),size));
+
+         i = ((0-lit) & 0xff);
+         if(sign) {
+           if( i == 0x81) { 
+             /* lit is 0x7f, all signed chars are less than
+              * this except for 0x7f itself */
+             emitpcode(POC_XORLW, popGetLit(0x7f));
+             genSkipz2(&rFalseIfx);
+           } else {
+             emitpcode(POC_ADDLW, popGetLit(0x80));
+             emitpcode(POC_ADDLW, popGetLit(i^0x80));
+             genSkipc(&rFalseIfx);
+           }
+
+         } else {
+           emitpcode(POC_ADDLW, popGetLit(i));
+           genSkipc(&rFalseIfx);
+
+         }
+
+         if(ifx) ifx->generated = 1;
+         return;
+       }
+
+       /* chars are out of the way. now do ints and longs */
+
+
+       DEBUGpic14_emitcode(";right lit","line = %d",__LINE__);
+       
+       /* special cases */
+
+       if(sign) {
+
+         if(lit == 0) {
+           genSkipCond(&rFalseIfx,left,size,7);
+           if(ifx) ifx->generated = 1;
+           return;
+         }
+
+         if(lit <0x100) {
+           DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+
+           //rFalseIfx.condition ^= 1;
+           //genSkipCond(&rFalseIfx,left,size,7);
+           //rFalseIfx.condition ^= 1;
+
+           emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+           if(rFalseIfx.condition)
+             emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+           else
+             emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+           emitpcode(POC_MOVLW, popGetLit(0x100-lit));
+           emitpcode(POC_ADDFW, popGet(AOP(left),0));
+           emitpcode(POC_MOVFW, popGet(AOP(left),1));
+
+           while(size > 1)
+             emitpcode(POC_IORFW, popGet(AOP(left),size--));
+
+           if(rFalseIfx.condition) {
+             emitSKPZ;
+             emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+           } else {
+             emitSKPNZ;
+           }
+
+           genSkipc(&rFalseIfx);
+           emitpLabel(truelbl->key);
+           if(ifx) ifx->generated = 1;
+           return;
+
+         }
+
+         if(size == 1) {
+
+           if( (lit & 0xff) == 0) {
+             /* lower byte is zero */
+             DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+             i = ((lit >> 8) & 0xff) ^0x80;
+             emitpcode(POC_MOVFW, popGet(AOP(left),size));
+             emitpcode(POC_ADDLW, popGetLit( 0x80));
+             emitpcode(POC_ADDLW, popGetLit(0x100-i));
+             genSkipc(&rFalseIfx);
+
+
+             if(ifx) ifx->generated = 1;
+             return;
+
+           }
+         } else {
+           /* Special cases for signed longs */
+           if( (lit & 0xffffff) == 0) {
+             /* lower byte is zero */
+             DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+             i = ((lit >> 8*3) & 0xff) ^0x80;
+             emitpcode(POC_MOVFW, popGet(AOP(left),size));
+             emitpcode(POC_ADDLW, popGetLit( 0x80));
+             emitpcode(POC_ADDLW, popGetLit(0x100-i));
+             genSkipc(&rFalseIfx);
+
+
+             if(ifx) ifx->generated = 1;
+             return;
+
+           }
+
+         }
+
+
+         if(lit & (0x80 << (size*8))) {
+           /* lit is negative */
+           DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+
+           //genSkipCond(&rFalseIfx,left,size,7);
+
+           emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+
+           if(rFalseIfx.condition)
+             emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+           else
+             emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+
+
+         } else {
+           /* lit is positive */
+           DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+           emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+           if(rFalseIfx.condition)
+             emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+           else
+             emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+           //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+           //emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+           //rFalseIfx.condition ^= 1;
+           //genSkipCond(&rFalseIfx,left,size,7);
+           //rFalseIfx.condition ^= 1;
+         }
+
+         /*
+           This works, but is only good for ints.
+           It also requires a "known zero" register.
+           emitpcode(POC_MOVLW, popGetLit(mlit & 0xff));
+           emitpcode(POC_ADDFW, popGet(AOP(left),0));
+           emitpcode(POC_RLFW,  popCopyReg(&pc_kzero));
+           emitpcode(POC_ADDLW, popGetLit( ((mlit>>8) & 0xff)));
+           emitpcode(POC_ADDFW, popGet(AOP(left),1));
+           genSkipc(&rFalseIfx);
+
+           emitpLabel(truelbl->key);
+           if(ifx) ifx->generated = 1;
+           return;
+         **/
+         
+         /* There are no more special cases, so perform a general compare */
+  
+         emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff));
+         emitpcode(POC_SUBFW, popGet(AOP(left),size));
+
+         while(size--) {
+
+           emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff));
+           emitSKPNZ;
+           emitpcode(POC_SUBFW, popGet(AOP(left),size));
+         }
+         //rFalseIfx.condition ^= 1;
+         genSkipc(&rFalseIfx);
+
+         emitpLabel(truelbl->key);
+
+         if(ifx) ifx->generated = 1;
+         return;
 
-       if(ifx) {
-         DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-         //genSkipc(ifx,0,1); //IC_TRUE(ifx) == NULL);
-         genSkipc(&rIfx);
-         //if(sign)
-           emitpLabel(lbl->key);
 
-         ifx->generated = 1;
        }
+
+
+       /* sign is out of the way. So now do an unsigned compare */
+       DEBUGpic14_emitcode(";right lit","line = %d unsigned compare to 0x%x",__LINE__,lit);
+
+
+       //genChkZeroes(left)
+
+       /* General case - compare to an unsigned literal on the right.*/
+
+       i = (lit >> (size*8)) & 0xff;
+       emitpcode(POC_MOVLW, popGetLit(i));
+       emitpcode(POC_SUBFW, popGet(AOP(left),size));
+       while(size--) {
+         i = (lit >> (size*8)) & 0xff;
+
+         if(i) {
+           emitpcode(POC_MOVLW, popGetLit(i));
+           emitSKPNZ;
+           emitpcode(POC_SUBFW, popGet(AOP(left),size));
+         } else {
+           /* this byte of the lit is zero, 
+            *if it's not the last then OR in the variable */
+           if(size)
+             emitpcode(POC_IORFW, popGet(AOP(left),size));
+         }
+       }
+
+
+       emitpLabel(lbl->key);
+       //if(emitFinalCheck)
+         genSkipc(&rFalseIfx);
+       if(sign)
+         emitpLabel(truelbl->key);
+
+       if(ifx) ifx->generated = 1;
        return;
+
+
       }
 
       if(AOP_TYPE(left) == AOP_LIT) {
@@ -3605,92 +3808,255 @@ static void genCmp (operand *left,operand *right,
 
        lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit));
 
+
        DEBUGpic14_emitcode(";left lit","lit = %d,sign=%d",lit,sign);
 
+       /* Special cases */
+       if((lit == 0) && (sign == 0)){
+
+         size--;
+         emitpcode(POC_MOVFW, popGet(AOP(right),size));
+         while(size) 
+           emitpcode(POC_IORFW, popGet(AOP(right),--size));
+
+         //rFalseIfx.condition ^= 1;
+         genSkipz2(&rFalseIfx);
+         if(ifx) ifx->generated = 1;
+         return;
+       }
+
        if(size==1) {
+         /* Special cases */
+         lit &= 0xff;
+         if(((lit == 0xff) && !sign) || ((lit==0x7f) && sign)) {
+           /* degenerate compare can never be true */
+           if(rFalseIfx.condition == 0)
+             emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key));
+
+           if(ifx) ifx->generated = 1;
+           return;
+         }
+
          if(sign) {
-           if(lit & 0x80) {
-             emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0));
+           if((lit+1)&0xff) {
+             emitpcode(POC_MOVFW, popGet(AOP(right),0));
+             emitpcode(POC_ADDLW, popGetLit(0x80));
+             emitpcode(POC_ADDLW, popGetLit(((-(lit+1)) & 0xff) ^ 0x80));
+             rFalseIfx.condition ^= 1;
+             genSkipc(&rFalseIfx);
            } else {
-             emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0));
+             rFalseIfx.condition ^= 1;
+             genSkipCond(&rFalseIfx,right,0,7);
            }
-           if(ifx) {
-             if(IC_TRUE(ifx) != NULL)
-               emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
-             else
-               emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
+           
+         } else {
+           if(lit & 0xff) {
+             emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff));
+             emitpcode(POC_SUBFW, popGet(AOP(right),0));
+             DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+             rFalseIfx.condition ^= 1;
+             genSkipc(&rFalseIfx);
+           } else { 
+             emitpcode(POC_MOVFW, popGet(AOP(right),0));
+             genSkipz2(&rFalseIfx);
            }
          }
-         emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff));
-         emitpcode(POC_SUBFW, popGet(AOP(right),0,FALSE,FALSE));
-         DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-         rIfx.condition ^= 1;
-         genSkipc(&rIfx);//      if(ifx) genSkipc(ifx,1,1);//IC_TRUE(ifx)!=NULL);
+
+         if(ifx) ifx->generated = 1;
+         return;
+
        } else {
-         size--;
-         //lit++;
-         i = (lit >> (size*8)) & 0xff;
+
+         /* Size is greater than 1 */
+
+
 
          if(sign) {
-           if(i & 0x80) {
+           int lp1 = lit+1;
+
+           size--;
+
+           if(lp1 == 0) {
+             /* this means lit = 0xffffffff, or -1 */
+
+
+             DEBUGpic14_emitcode(";left lit = -1","line = %d ",__LINE__);
+             rFalseIfx.condition ^= 1;
+             genSkipCond(&rFalseIfx,right,size,7);
+             if(ifx) ifx->generated = 1;
+             return;
+           }
+
+           if(lit == 0) {
+             int s = size;
+
+             if(rFalseIfx.condition) {
+               emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+               emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+             }
+
+             emitpcode(POC_MOVFW, popGet(AOP(right),size));
+             while(size--)
+               emitpcode(POC_IORFW, popGet(AOP(right),size));
+
+
+             emitSKPZ;
+             if(rFalseIfx.condition) {
+               emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+               emitpLabel(truelbl->key);
+             }else {
+               rFalseIfx.condition ^= 1;
+               genSkipCond(&rFalseIfx,right,s,7);
+             }
+
+             if(ifx) ifx->generated = 1;
+             return;
+           }
+
+
+           if(lit & (0x80 << (size*8))) {
+             /* Lit is less than zero */
+             DEBUGpic14_emitcode(";left lit","line = %d  0x%x is less than 0",__LINE__,lit);
+             //rFalseIfx.condition ^= 1;
+             //genSkipCond(&rFalseIfx,left,size,7);
+             //rFalseIfx.condition ^= 1;
              emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+             //emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+             if(rFalseIfx.condition)
+               emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+             else
+               emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+
            } else {
+             /* Lit is greater than or equal to zero */
+             DEBUGpic14_emitcode(";left lit","line = %d  0x%x is greater than 0",__LINE__,lit);
+             //rFalseIfx.condition ^= 1;
+             //genSkipCond(&rFalseIfx,right,size,7);
+             //rFalseIfx.condition ^= 1;
+
+             //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+             //emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+
              emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
-           }
-           if(ifx) {
-             if(IC_TRUE(ifx) != NULL)
-               emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
+             if(rFalseIfx.condition)
+               emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
              else
-               emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
+               emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+
            }
-         }
+           emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff));
+           emitpcode(POC_SUBFW, popGet(AOP(right),size));
 
-         emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE));
-         emitpcode(POC_SUBLW, popGetLit((i)&0xff));
-         while(size--) {
-           i = (lit >> (size*8)) & 0xff;
-           emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE));
-           emitSKPNC;
-           emitpcode(POC_SUBLW, popGetLit((i)&0xff));
-         }
-  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-         genSkipc(&rIfx);//      if(ifx) genSkipc(ifx,0,1);  //IC_TRUE(ifx) == NULL);
+           while(size--) {
 
-       }
-/*
+             emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff));
+             emitSKPNZ;
+             emitpcode(POC_SUBFW, popGet(AOP(right),size));
+           }
+           rFalseIfx.condition ^= 1;
+           //rFalseIfx.condition = 1;
+           genSkipc(&rFalseIfx);
+
+           emitpLabel(truelbl->key);
+
+           if(ifx) ifx->generated = 1;
+           return;
+
+         } else {
+           /* Unsigned compare for sizes greater than 1 */
+
+           while(size--) {
+             i = (lit >> (size*8)) & 0xff;
+
+
+             if(size) {
+               DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+               emitpcode(POC_MOVLW, popGetLit(i&0xff));
+               emitpcode(POC_SUBFW, popGet(AOP(right),size));
+               emitSKPZ;
+               emitpcode(POC_GOTO,  popGetLabel(lbl->key));
+             } else {
+               DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+               emitpcode(POC_MOVLW, popGetLit((i+1)&0xff));
+               emitpcode(POC_SUBFW, popGet(AOP(right),size));
+
+             }
+           }
+
+           DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+           emitpLabel(lbl->key);
+
+           rFalseIfx.condition ^= 1;
+           genSkipc(&rFalseIfx);
+
+         }
        if(sign)
-         emitpLabel(lbl->key);
-*/
+         emitpLabel(truelbl->key);
        if(ifx) ifx->generated = 1;
        return;
+       }
       }
+      /* Compare two variables */
 
-
-      // CLRC;
       DEBUGpic14_emitcode(";sign","%d",sign);
 
-      pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-      pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));//++
+      size--;
+      if(sign) {
+       /* Sigh. thus sucks... */
+       if(size) {
+         emitpcode(POC_MOVFW, popGet(AOP(left),size));
+         emitpcode(POC_MOVWF, popRegFromIdx(Gstack_base_addr));
+         emitpcode(POC_MOVLW, popGetLit(0x80));
+         emitpcode(POC_XORWF, popRegFromIdx(Gstack_base_addr));
+         emitpcode(POC_XORFW, popGet(AOP(right),size));
+         emitpcode(POC_SUBFW, popRegFromIdx(Gstack_base_addr));
+       } else {
+         /* Signed char comparison */
+         /* Special thanks to Nikolai Golovchenko for this snippet */
+         emitpcode(POC_MOVFW, popGet(AOP(right),0));
+         emitpcode(POC_SUBFW, popGet(AOP(left),0));
+         emitpcode(POC_RRFW,  popGet(AOP(left),0)); /* could be any register */
+         emitpcode(POC_XORFW, popGet(AOP(left),0));
+         emitpcode(POC_XORFW, popGet(AOP(right),0));
+         emitpcode(POC_ADDLW, popGetLit(0x80));
+
+         DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+         genSkipc(&rFalseIfx);
+         
+         if(ifx) ifx->generated = 1;
+         return;
+       }
+
+      } else {
 
-      emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
-      emitpcode(POC_SUBFW, popGet(AOP(left),offset++,FALSE,FALSE));
+       emitpcode(POC_MOVFW, popGet(AOP(right),size));
+       emitpcode(POC_SUBFW, popGet(AOP(left),size));
+      }
 
-      size--;
-      while (size--) {
 
-       emitpcode(POC_MOVFW,   popGet(AOP(right),offset,FALSE,FALSE));
-       emitSKPC;
-       emitpcode(POC_INCFSZW, popGet(AOP(right),offset,FALSE,FALSE));
-       emitpcode(POC_SUBFW,   popGet(AOP(left),offset,FALSE,FALSE));
+      /* The rest of the bytes of a multi-byte compare */
+      while (size) {
+
+       emitSKPZ;
+       emitpcode(POC_GOTO,  popGetLabel(lbl->key));
+       size--;
+
+       emitpcode(POC_MOVFW, popGet(AOP(right),size));
+       emitpcode(POC_SUBFW, popGet(AOP(left),size));
+
 
-/*
-       pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-       emitSKPC;
-       pic14_emitcode("incfsz","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-       pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-*/
-       offset++;
       }
+
+      emitpLabel(lbl->key);
+
+      DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      genSkipc(&rFalseIfx);
+      if(ifx) ifx->generated = 1;
+      return;
+
     }
   }
 
@@ -3784,16 +4150,16 @@ static void genc16bit2lit(operand *op, int lit, int offset)
 
   switch( BYTEofLONG(lit,i)) { 
   case 0:
-    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
     break;
   case 1:
-    emitpcode(POC_DECFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
     break;
   case 0xff:
-    emitpcode(POC_INCFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_INCFW,popGet(AOP(op),offset+i));
     break;
   default:
-    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
     emitpcode(POC_XORLW,popGetLit(BYTEofLONG(lit,i)));
   }
 
@@ -3801,20 +4167,20 @@ static void genc16bit2lit(operand *op, int lit, int offset)
 
   switch( BYTEofLONG(lit,i)) { 
   case 0:
-    emitpcode(POC_IORFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_IORFW,popGet(AOP(op),offset+i));
     break;
   case 1:
     emitSKPNZ;
-    emitpcode(POC_DECFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
     break;
   case 0xff:
     emitSKPNZ;
-    emitpcode(POC_INCFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_INCFW,popGet(AOP(op),offset+i));
     break;
   default:
     emitpcode(POC_MOVLW,popGetLit(BYTEofLONG(lit,i)));
     emitSKPNZ;
-    emitpcode(POC_XORFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+    emitpcode(POC_XORFW,popGet(AOP(op),offset+i));
 
   }
 
@@ -3823,7 +4189,7 @@ static void genc16bit2lit(operand *op, int lit, int offset)
 /*-----------------------------------------------------------------*/
 /* gencjneshort - compare and jump if not equal                    */
 /*-----------------------------------------------------------------*/
-static void gencjne(operand *left, operand *right, iCode *ifx)
+static void gencjne(operand *left, operand *right, operand *result, iCode *ifx)
 {
   int size = max(AOP_SIZE(left),AOP_SIZE(right));
   int offset = 0;
@@ -3832,12 +4198,7 @@ static void gencjne(operand *left, operand *right, iCode *ifx)
 
   unsigned long lit = 0L;
   DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-  DEBUGpic14_emitcode ("; ","left %s=%s, right %s=%s, size = %d",
-                      AopType(AOP_TYPE(left)),
-                      aopGet(AOP(left),0,TRUE,FALSE),
-                      AopType(AOP_TYPE(right)),
-                      aopGet(AOP(right),0,FALSE,FALSE),
-                      size);
+  DEBUGpic14_AopType(__LINE__,left,right,NULL);
 
   resolveIfx(&rIfx,ifx);
   lbl =  newiTempLabel(NULL);
@@ -3862,23 +4223,18 @@ static void gencjne(operand *left, operand *right, iCode *ifx)
     case 2:
       genc16bit2lit(left, lit, 0);
       emitSKPNZ;
-      pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
       emitpcode(POC_GOTO,popGetLabel(lbl->key));
       break;
     default:
       while (size--) {
        if(lit & 0xff) {
-         emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(left),offset));
          emitpcode(POC_XORLW,popGetLit(lit & 0xff));
-         pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-         pic14_emitcode("xorlw","0x%x",lit & 0xff);
        } else {
-         emitpcode(POC_MOVF,popGet(AOP(left),offset,FALSE,FALSE));
-         pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+         emitpcode(POC_MOVF,popGet(AOP(left),offset));
        }
 
        emitSKPNZ;
-       pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
        emitpcode(POC_GOTO,popGetLabel(lbl->key));
        offset++;
        lit >>= 8;
@@ -3897,7 +4253,6 @@ static void gencjne(operand *left, operand *right, iCode *ifx)
     case 2:
       genc16bit2lit(left, lit, 0);
       emitSKPNZ;
-      pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
       emitpcode(POC_GOTO,popGetLabel(lbl->key));
       break;
     default:
@@ -3906,42 +4261,51 @@ static void gencjne(operand *left, operand *right, iCode *ifx)
        if((AOP_TYPE(left) == AOP_DIR) && 
           ((AOP_TYPE(right) == AOP_REG) || (AOP_TYPE(right) == AOP_DIR))) {
 
-         emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-         emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+         emitpcode(POC_XORFW,popGet(AOP(right),offset));
 
        } else if((AOP_TYPE(left) == AOP_DIR) && (AOP_TYPE(right) == AOP_LIT)){
            
          switch (lit & 0xff) {
          case 0:
-           emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,popGet(AOP(left),offset));
            break;
          case 1:
-           emitpcode(POC_DECFSZ,popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_DECFSZ,popGet(AOP(left),offset));
            emitpcode(POC_GOTO,popGetLabel(lbl->key));
            emit_skip=0;
            break;
          case 0xff:
-           emitpcode(POC_INCFSZ,popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_INCFSZ,popGet(AOP(left),offset));
            emitpcode(POC_GOTO,popGetLabel(lbl->key));
            emit_skip=0;
            break;
          default:
-           emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,popGet(AOP(left),offset));
            emitpcode(POC_XORLW,popGetLit(lit & 0xff));
          }
          lit >>= 8;
 
        } else {
-         emitpcode(POC_MOVF,popGet(AOP(left),offset,FALSE,FALSE));
-         pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+         emitpcode(POC_MOVF,popGet(AOP(left),offset));
        }
        if(emit_skip) {
-         pic14_emitcode(";***","%s  %d",__FUNCTION__,__LINE__);
-         if(rIfx.condition)
-           emitSKPNZ;
-         else
-           emitSKPZ;
-         emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+         if(AOP_TYPE(result) == AOP_CRY) {
+           pic14_emitcode(";***","%s  %d",__FUNCTION__,__LINE__);
+           if(rIfx.condition)
+             emitSKPNZ;
+           else
+             emitSKPZ;
+           emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+         } else {
+           /* fix me. probably need to check result size too */
+           emitpcode(POC_CLRF,popGet(AOP(result),0));
+           if(rIfx.condition)
+             emitSKPNZ;
+           else
+             emitSKPZ;
+           emitpcode(POC_INCF,popGet(AOP(result),0));
+         }
          if(ifx)
            ifx->generated=1;
        }
@@ -3954,8 +4318,8 @@ static void gencjne(operand *left, operand *right, iCode *ifx)
            AOP_TYPE(left) != AOP_DIR){
 
     while(size--) {
-      emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-      emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
+      emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+      emitpcode(POC_XORFW,popGet(AOP(right),offset));
       pic14_emitcode(";***","%s  %d",__FUNCTION__,__LINE__);
       if(rIfx.condition)
        emitSKPNZ;
@@ -4025,40 +4389,28 @@ static void genCmpEq (iCode *ic, iCode *ifx)
     aopOp((right=IC_RIGHT(ic)),ic,FALSE);
     aopOp((result=IC_RESULT(ic)),ic,TRUE);
 
-/*
-    DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
-                        AopType(AOP_TYPE(IC_RESULT(ic))),
-                        AopType(AOP_TYPE(IC_LEFT(ic))),
-                        AopType(AOP_TYPE(IC_RIGHT(ic))));
-*/
     size = max(AOP_SIZE(left),AOP_SIZE(right));
-    DEBUGpic14_emitcode ("; ","result %s=%s, left %s=%s, right %s=%s, size = %d",
-                        AopType(AOP_TYPE(result)),
-                        aopGet(AOP(result),0,TRUE,FALSE),
-                        AopType(AOP_TYPE(left)),
-                        aopGet(AOP(left),0,TRUE,FALSE),
-                        AopType(AOP_TYPE(right)),
-                        aopGet(AOP(right),0,FALSE,FALSE),
-                        size);
 
+    DEBUGpic14_AopType(__LINE__,left,right,result);
 
     /* if literal, literal on the right or 
     if the right is in a pointer register and left 
     is not */
     if ((AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) || 
         (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) {
-        operand *t = IC_RIGHT(ic);
-        IC_RIGHT(ic) = IC_LEFT(ic);
-        IC_LEFT(ic) = t;
+      operand *tmp = right ;
+      right = left;
+      left = tmp;
     }
 
+
     if(ifx && !AOP_SIZE(result)){
         symbol *tlbl;
         /* if they are both bit variables */
         if (AOP_TYPE(left) == AOP_CRY &&
             ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) {
             if(AOP_TYPE(right) == AOP_LIT){
-                unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
+                unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
                 if(lit == 0L){
                     pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
                     pic14_emitcode("cpl","c");
@@ -4092,33 +4444,32 @@ static void genCmpEq (iCode *ic, iCode *ifx)
          if(AOP_TYPE(right) == AOP_LIT) {
            lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
            
-
            switch(size) {
 
            case 1:
              switch(lit & 0xff) {
              case 1:
                if ( IC_TRUE(ifx) ) {
-                 emitpcode(POC_DECFW,popGet(AOP(left),offset,FALSE,FALSE));
+                 emitpcode(POC_DECFW,popGet(AOP(left),offset));
                  emitSKPNZ;
                  emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
                } else {
-                 emitpcode(POC_DECFSZW,popGet(AOP(left),offset,FALSE,FALSE));
+                 emitpcode(POC_DECFSZW,popGet(AOP(left),offset));
                  emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
                }
                break;
              case 0xff:
                if ( IC_TRUE(ifx) ) {
-                 emitpcode(POC_INCFW,popGet(AOP(left),offset,FALSE,FALSE));
+                 emitpcode(POC_INCFW,popGet(AOP(left),offset));
                  emitSKPNZ;
                  emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
                } else {
-                 emitpcode(POC_INCFSZW,popGet(AOP(left),offset,FALSE,FALSE));
+                 emitpcode(POC_INCFSZW,popGet(AOP(left),offset));
                  emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
                }
                break;
              default:
-               emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+               emitpcode(POC_MOVFW,popGet(AOP(left),offset));
                if(lit)
                  emitpcode(POC_XORLW,popGetLit(lit & 0xff));
                genSkip(ifx,'z');
@@ -4137,10 +4488,10 @@ static void genCmpEq (iCode *ic, iCode *ifx)
            default:
              /* size is 4 */
              if(lit==0) {
-               emitpcode(POC_MOVFW,popGet(AOP(left),0,FALSE,FALSE));
-               emitpcode(POC_IORFW,popGet(AOP(left),1,FALSE,FALSE));
-               emitpcode(POC_IORFW,popGet(AOP(left),2,FALSE,FALSE));
-               emitpcode(POC_IORFW,popGet(AOP(left),3,FALSE,FALSE));
+               emitpcode(POC_MOVFW,popGet(AOP(left),0));
+               emitpcode(POC_IORFW,popGet(AOP(left),1));
+               emitpcode(POC_IORFW,popGet(AOP(left),2));
+               emitpcode(POC_IORFW,popGet(AOP(left),3));
 
              } else {
 
@@ -4153,8 +4504,8 @@ static void genCmpEq (iCode *ic, iCode *ifx)
                  //genSkip(ifx,'z');
                  genc16bit2lit(left,lit,2);
                } else {
-                 emitpcode(POC_IORFW,popGet(AOP(left),2,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),3,FALSE,FALSE));
+                 emitpcode(POC_IORFW,popGet(AOP(left),2));
+                 emitpcode(POC_IORFW,popGet(AOP(left),3));
 
                }
                
@@ -4169,30 +4520,17 @@ static void genCmpEq (iCode *ic, iCode *ifx)
 
          } else if(AOP_TYPE(right) == AOP_CRY ) {
            /* we know the left is not a bit, but that the right is */
-           emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,popGet(AOP(left),offset));
            emitpcode( ( (IC_TRUE(ifx)) ? POC_BTFSC : POC_BTFSS),
-                     popGet(AOP(right),offset,FALSE,FALSE));
+                     popGet(AOP(right),offset));
            emitpcode(POC_XORLW,popGetLit(1));
 
-           pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-           if ( IC_TRUE(ifx) )
-             pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                      AOP(right)->aopu.aop_dir,
-                      AOP(right)->aopu.aop_dir);
-           else
-             pic14_emitcode("btfss","(%s >> 3), (%s & 7)",
-                      AOP(right)->aopu.aop_dir,
-                      AOP(right)->aopu.aop_dir);
-
-           pic14_emitcode("xorlw","1");
-
            /* if the two are equal, then W will be 0 and the Z bit is set
             * we could test Z now, or go ahead and check the high order bytes if
             * the variable we're comparing is larger than a byte. */
 
            while(--size)
-             emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE));
-           //pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
+             emitpcode(POC_IORFW,popGet(AOP(left),offset));
 
            if ( IC_TRUE(ifx) ) {
              emitSKPNZ;
@@ -4211,11 +4549,8 @@ static void genCmpEq (iCode *ic, iCode *ifx)
            tlbl = newiTempLabel(NULL);
 
            while(size--) {
-             emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-             emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
-
-             pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-             pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+             emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+             emitpcode(POC_XORFW,popGet(AOP(right),offset));
 
              if ( IC_TRUE(ifx) ) {
                if(size) {
@@ -4249,7 +4584,7 @@ static void genCmpEq (iCode *ic, iCode *ifx)
     if (AOP_TYPE(left) == AOP_CRY &&
         ((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) {
         if(AOP_TYPE(right) == AOP_LIT){
-            unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
+            unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
             if(lit == 0L){
                 pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
                 pic14_emitcode("cpl","c");
@@ -4280,7 +4615,7 @@ static void genCmpEq (iCode *ic, iCode *ifx)
         pic14_outBitC(result);
     } else {
       
-      gencjne(left,right,ifx);
+      gencjne(left,right,result,ifx);
 /*
       if(ifx) 
        gencjne(left,right,newiTempLabel(NULL));
@@ -4304,8 +4639,10 @@ static void genCmpEq (iCode *ic, iCode *ifx)
 */
       /* if the result is used in an arithmetic operation
         then put the result in place */
+/*
       if (AOP_TYPE(result) != AOP_CRY) 
        pic14_outAcc(result);
+*/
       /* leave the result in acc */
     }
 
@@ -4416,6 +4753,8 @@ static void genOrOp (iCode *ic)
     aopOp((right=IC_RIGHT(ic)),ic,FALSE);
     aopOp((result=IC_RESULT(ic)),ic,FALSE);
 
+    DEBUGpic14_AopType(__LINE__,left,right,result);
+
     /* if both are bit variables */
     if (AOP_TYPE(left) == AOP_CRY &&
         AOP_TYPE(right) == AOP_CRY ) {
@@ -4554,14 +4893,8 @@ static void genAnd (iCode *ic, iCode *ifx)
 
   size = AOP_SIZE(result);
 
-  DEBUGpic14_emitcode ("; ","result %s=%s, left %s=%s, right %s=%s, size = %d",
-                      AopType(AOP_TYPE(result)),
-                      aopGet(AOP(result),0,TRUE,FALSE),
-                      AopType(AOP_TYPE(left)),
-                      aopGet(AOP(left),0,TRUE,FALSE),
-                      AopType(AOP_TYPE(right)),
-                      aopGet(AOP(right),0,FALSE,FALSE),
-                      size);
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+
   // if(bit & yy)
   // result = bit & yy;
   if (AOP_TYPE(left) == AOP_CRY){
@@ -4685,7 +5018,7 @@ static void genAnd (iCode *ic, iCode *ifx)
        case 0x00:
          /*  and'ing with 0 has clears the result */
          pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
-         emitpcode(POC_CLRF,popGet(AOP(result),offset,FALSE,FALSE));
+         emitpcode(POC_CLRF,popGet(AOP(result),offset));
          break;
        case 0xff:
          /* and'ing with 0xff is a nop when the result and left are the same */
@@ -4697,7 +5030,6 @@ static void genAnd (iCode *ic, iCode *ifx)
            if(p>=0) {
              /* only one bit is set in the literal, so use a bcf instruction */
              pic14_emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p);
-             //emitpcode(POC_BCF,popGet(AOP(left),offset,FALSE,TRUE));
              emitpcode(POC_BCF,newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0));
 
            } else {
@@ -4706,16 +5038,16 @@ static void genAnd (iCode *ic, iCode *ifx)
              if(know_W != (lit&0xff))
                emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
              know_W = lit &0xff;
-             emitpcode(POC_ANDWF,popGet(AOP(left),offset,FALSE,TRUE));
+             emitpcode(POC_ANDWF,popGet(AOP(left),offset));
            }
          }    
        }
       } else {
        if (AOP_TYPE(left) == AOP_ACC) {
-         emitpcode(POC_ANDFW,popGet(AOP(right),offset,FALSE,FALSE));
+         emitpcode(POC_ANDFW,popGet(AOP(right),offset));
        } else {                    
-         emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
-         emitpcode(POC_ANDWF,popGet(AOP(left),offset,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+         emitpcode(POC_ANDWF,popGet(AOP(left),offset));
 
        }
       }
@@ -4754,15 +5086,15 @@ static void genAnd (iCode *ic, iCode *ifx)
          case 0x00:
            pic14_emitcode("clrf","%s",
                           aopGet(AOP(result),offset,FALSE,FALSE));
-           emitpcode(POC_CLRF,popGet(AOP(result),offset,FALSE,FALSE));
+           emitpcode(POC_CLRF,popGet(AOP(result),offset));
            break;
          case 0xff:
            pic14_emitcode("movf","%s,w",
                           aopGet(AOP(left),offset,FALSE,FALSE));
            pic14_emitcode("movwf","%s",
                           aopGet(AOP(result),offset,FALSE,FALSE));
-           emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-           emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+           emitpcode(POC_MOVWF,popGet(AOP(result),offset));
            break;
          default:
            pic14_emitcode("movlw","0x%x",t);
@@ -4772,24 +5104,24 @@ static void genAnd (iCode *ic, iCode *ifx)
                           aopGet(AOP(result),offset,FALSE,FALSE));
              
            emitpcode(POC_MOVLW, popGetLit(t));
-           emitpcode(POC_ANDFW,popGet(AOP(left),offset,FALSE,FALSE));
-           emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+           emitpcode(POC_ANDFW,popGet(AOP(left),offset));
+           emitpcode(POC_MOVWF,popGet(AOP(result),offset));
          }
          continue;
        }
 
        if (AOP_TYPE(left) == AOP_ACC) {
          pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-         emitpcode(POC_ANDFW,popGet(AOP(right),offset,FALSE,FALSE));
+         emitpcode(POC_ANDFW,popGet(AOP(right),offset));
        } else {
          pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
          pic14_emitcode("andwf","%s,w",
                         aopGet(AOP(left),offset,FALSE,FALSE));
-         emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
-         emitpcode(POC_ANDFW,popGet(AOP(left),offset,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+         emitpcode(POC_ANDFW,popGet(AOP(left),offset));
        }
        pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+       emitpcode(POC_MOVWF,popGet(AOP(result),offset));
       }
     }
   }
@@ -4815,6 +5147,7 @@ static void genOr (iCode *ic, iCode *ifx)
     aopOp((right= IC_RIGHT(ic)),ic,FALSE);
     aopOp((result=IC_RESULT(ic)),ic,TRUE);
 
+    DEBUGpic14_AopType(__LINE__,left,right,result);
 
     /* if left is a literal & right is not then exchange them */
     if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
@@ -4839,10 +5172,7 @@ static void genOr (iCode *ic, iCode *ifx)
         left = tmp;
     }
 
-    DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
-                        AopType(AOP_TYPE(result)),
-                        AopType(AOP_TYPE(left)),
-                        AopType(AOP_TYPE(right)));
+    DEBUGpic14_AopType(__LINE__,left,right,result);
 
     if(AOP_TYPE(right) == AOP_LIT)
         lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
@@ -4858,7 +5188,7 @@ static void genOr (iCode *ic, iCode *ifx)
                 // lit != 0 => result = 1
                 if(AOP_TYPE(result) == AOP_CRY){
                  if(size)
-                   emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+                   emitpcode(POC_BSF, popGet(AOP(result),0));
                  //pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
                  //     AOP(result)->aopu.aop_dir,
                  //     AOP(result)->aopu.aop_dir);
@@ -4876,9 +5206,9 @@ static void genOr (iCode *ic, iCode *ifx)
             if (AOP_TYPE(right) == AOP_CRY){
              if(pic14_sameRegs(AOP(result),AOP(left))){
                 // c = bit | bit;
-               emitpcode(POC_BCF,   popGet(AOP(result),0,FALSE,FALSE));
-               emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE));
-               emitpcode(POC_BSF,   popGet(AOP(result),0,FALSE,FALSE));
+               emitpcode(POC_BCF,   popGet(AOP(result),0));
+               emitpcode(POC_BTFSC, popGet(AOP(right),0));
+               emitpcode(POC_BSF,   popGet(AOP(result),0));
 
                pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
                         AOP(result)->aopu.aop_dir,
@@ -4892,16 +5222,16 @@ static void genOr (iCode *ic, iCode *ifx)
              } else {
                if( AOP_TYPE(result) == AOP_ACC) {
                  emitpcode(POC_MOVLW, popGetLit(0));
-                 emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
-                 emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
+                 emitpcode(POC_BTFSS, popGet(AOP(right),0));
+                 emitpcode(POC_BTFSC, popGet(AOP(left),0));
                  emitpcode(POC_MOVLW, popGetLit(1));
 
                } else {
 
-                 emitpcode(POC_BCF,   popGet(AOP(result),0,FALSE,FALSE));
-                 emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
-                 emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
-                 emitpcode(POC_BSF,   popGet(AOP(result),0,FALSE,FALSE));
+                 emitpcode(POC_BCF,   popGet(AOP(result),0));
+                 emitpcode(POC_BTFSS, popGet(AOP(right),0));
+                 emitpcode(POC_BTFSC, popGet(AOP(left),0));
+                 emitpcode(POC_BSF,   popGet(AOP(result),0));
 
                  pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
                                 AOP(result)->aopu.aop_dir,
@@ -4923,12 +5253,12 @@ static void genOr (iCode *ic, iCode *ifx)
                 pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__);
 
 
-               emitpcode(POC_BCF,   popGet(AOP(result),0,FALSE,FALSE));
+               emitpcode(POC_BCF,   popGet(AOP(result),0));
                if( AOP_TYPE(right) == AOP_ACC) {
                  emitpcode(POC_IORLW, popGetLit(0));
                  emitSKPNZ;
-                 emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
-                 emitpcode(POC_BSF,   popGet(AOP(result),0,FALSE,FALSE));
+                 emitpcode(POC_BTFSC, popGet(AOP(left),0));
+                 emitpcode(POC_BSF,   popGet(AOP(result),0));
                }
 
 
@@ -5009,17 +5339,17 @@ static void genOr (iCode *ic, iCode *ifx)
              if(know_W != (lit & 0xff))
                emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
              know_W = lit & 0xff;
-             emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE));
+             emitpcode(POC_IORWF, popGet(AOP(left),offset));
            }
                    
          }
        } else {
          if (AOP_TYPE(left) == AOP_ACC) {
-           emitpcode(POC_IORFW,  popGet(AOP(right),offset,FALSE,FALSE));
+           emitpcode(POC_IORFW,  popGet(AOP(right),offset));
            pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
          } else {                  
-           emitpcode(POC_MOVFW,  popGet(AOP(right),offset,FALSE,FALSE));
-           emitpcode(POC_IORWF,  popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,  popGet(AOP(right),offset));
+           emitpcode(POC_IORWF,  popGet(AOP(left),offset));
 
            pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
            pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
@@ -5060,8 +5390,8 @@ static void genOr (iCode *ic, iCode *ifx)
            int t = (lit >> (offset*8)) & 0x0FFL;
            switch(t) { 
            case 0x00:
-             emitpcode(POC_MOVFW,  popGet(AOP(left),offset,FALSE,FALSE));
-             emitpcode(POC_MOVWF,  popGet(AOP(result),offset,FALSE,FALSE));
+             emitpcode(POC_MOVFW,  popGet(AOP(left),offset));
+             emitpcode(POC_MOVWF,  popGet(AOP(result),offset));
 
              pic14_emitcode("movf","%s,w",
                       aopGet(AOP(left),offset,FALSE,FALSE));
@@ -5070,8 +5400,8 @@ static void genOr (iCode *ic, iCode *ifx)
              break;
            default:
              emitpcode(POC_MOVLW,  popGetLit(t));
-             emitpcode(POC_IORFW,  popGet(AOP(left),offset,FALSE,FALSE));
-             emitpcode(POC_MOVWF,  popGet(AOP(result),offset,FALSE,FALSE));
+             emitpcode(POC_IORFW,  popGet(AOP(left),offset));
+             emitpcode(POC_MOVWF,  popGet(AOP(result),offset));
 
              pic14_emitcode("movlw","0x%x",t);
              pic14_emitcode("iorwf","%s,w",
@@ -5086,17 +5416,17 @@ static void genOr (iCode *ic, iCode *ifx)
          // faster than result <- left, anl result,right
          // and better if result is SFR
          if (AOP_TYPE(left) == AOP_ACC) {
-           emitpcode(POC_IORWF,  popGet(AOP(right),offset,FALSE,FALSE));
+           emitpcode(POC_IORWF,  popGet(AOP(right),offset));
            pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
          } else {
-           emitpcode(POC_MOVFW,  popGet(AOP(right),offset,FALSE,FALSE));
-           emitpcode(POC_IORFW,  popGet(AOP(left),offset,FALSE,FALSE));
+           emitpcode(POC_MOVFW,  popGet(AOP(right),offset));
+           emitpcode(POC_IORFW,  popGet(AOP(left),offset));
 
            pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
            pic14_emitcode("iorwf","%s,w",
                     aopGet(AOP(left),offset,FALSE,FALSE));
          }
-         emitpcode(POC_MOVWF,  popGet(AOP(result),offset,FALSE,FALSE));
+         emitpcode(POC_MOVWF,  popGet(AOP(result),offset));
          pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
        }
     }
@@ -5112,234 +5442,237 @@ release :
 /*-----------------------------------------------------------------*/
 static void genXor (iCode *ic, iCode *ifx)
 {
-    operand *left, *right, *result;
-    int size, offset=0;
-    unsigned long lit = 0L;
+  operand *left, *right, *result;
+  int size, offset=0;
+  unsigned long lit = 0L;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    aopOp((left = IC_LEFT(ic)),ic,FALSE);
-    aopOp((right= IC_RIGHT(ic)),ic,FALSE);
-    aopOp((result=IC_RESULT(ic)),ic,TRUE);
+  aopOp((left = IC_LEFT(ic)),ic,FALSE);
+  aopOp((right= IC_RIGHT(ic)),ic,FALSE);
+  aopOp((result=IC_RESULT(ic)),ic,TRUE);
 
-    /* if left is a literal & right is not ||
-       if left needs acc & right does not */
-    if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
-       (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) {
-        operand *tmp = right ;
-        right = left;
-        left = tmp;
-    }
+  /* if left is a literal & right is not ||
+     if left needs acc & right does not */
+  if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
+      (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) {
+    operand *tmp = right ;
+    right = left;
+    left = tmp;
+  }
 
-    /* if result = right then exchange them */
-    if(pic14_sameRegs(AOP(result),AOP(right))){
-        operand *tmp = right ;
-        right = left;
-        left = tmp;
-    }
+  /* if result = right then exchange them */
+  if(pic14_sameRegs(AOP(result),AOP(right))){
+    operand *tmp = right ;
+    right = left;
+    left = tmp;
+  }
 
-    /* if right is bit then exchange them */
-    if (AOP_TYPE(right) == AOP_CRY &&
-        AOP_TYPE(left) != AOP_CRY){
-        operand *tmp = right ;
-        right = left;
-        left = tmp;
-    }
-    if(AOP_TYPE(right) == AOP_LIT)
-        lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
+  /* if right is bit then exchange them */
+  if (AOP_TYPE(right) == AOP_CRY &&
+      AOP_TYPE(left) != AOP_CRY){
+    operand *tmp = right ;
+    right = left;
+    left = tmp;
+  }
+  if(AOP_TYPE(right) == AOP_LIT)
+    lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
 
-    size = AOP_SIZE(result);
+  size = AOP_SIZE(result);
 
-    // if(bit ^ yy)
-    // xx = bit ^ yy;
-    if (AOP_TYPE(left) == AOP_CRY){
-        if(AOP_TYPE(right) == AOP_LIT){
-            // c = bit & literal;
-            if(lit>>1){
-                // lit>>1  != 0 => result = 1
-                if(AOP_TYPE(result) == AOP_CRY){
-                    if(size)
-                        pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);
-                    else if(ifx)
-                        continueIfTrue(ifx);
-                    goto release;
-                }
-                pic14_emitcode("setb","c");
-            } else{
-                // lit == (0 or 1)
-                if(lit == 0){
-                    // lit == 0, result = left
-                    if(size && pic14_sameRegs(AOP(result),AOP(left)))
-                        goto release;
-                    pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
-                } else{
-                    // lit == 1, result = not(left)
-                    if(size && pic14_sameRegs(AOP(result),AOP(left))){
-                        pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir);
-                        goto release;
-                    } else {
-                        pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
-                        pic14_emitcode("cpl","c");
-                    }
-                }
-            }
+  // if(bit ^ yy)
+  // xx = bit ^ yy;
+  if (AOP_TYPE(left) == AOP_CRY){
+    if(AOP_TYPE(right) == AOP_LIT){
+      // c = bit & literal;
+      if(lit>>1){
+       // lit>>1  != 0 => result = 1
+       if(AOP_TYPE(result) == AOP_CRY){
+         if(size)
+           pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);
+         else if(ifx)
+           continueIfTrue(ifx);
+         goto release;
+       }
+       pic14_emitcode("setb","c");
+      } else{
+       // lit == (0 or 1)
+       if(lit == 0){
+         // lit == 0, result = left
+         if(size && pic14_sameRegs(AOP(result),AOP(left)))
+           goto release;
+         pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
+       } else{
+         // lit == 1, result = not(left)
+         if(size && pic14_sameRegs(AOP(result),AOP(left))){
+           pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir);
+           goto release;
+         } else {
+           pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
+           pic14_emitcode("cpl","c");
+         }
+       }
+      }
 
-        } else {
-            // right != literal
-            symbol *tlbl = newiTempLabel(NULL);
-            if (AOP_TYPE(right) == AOP_CRY){
-                // c = bit ^ bit;
-                pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
-            }
-            else{
-                int sizer = AOP_SIZE(right);
-                // c = bit ^ val
-                // if val>>1 != 0, result = 1
-                pic14_emitcode("setb","c");
-                while(sizer){
-                    MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE));
-                    if(sizer == 1)
-                        // test the msb of the lsb
-                        pic14_emitcode("anl","a,#0xfe");
-                    pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
-                   sizer--;
-                }
-                // val = (0,1)
-                pic14_emitcode("rrc","a");
-            }
-            pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100));
-            pic14_emitcode("cpl","c");
-            pic14_emitcode("","%05d_DS_:",(tlbl->key+100));
-        }
-        // bit = c
-        // val = c
-        if(size)
-            pic14_outBitC(result);
-        // if(bit | ...)
-        else if((AOP_TYPE(result) == AOP_CRY) && ifx)
-            genIfxJump(ifx, "c");           
-        goto release ;
+    } else {
+      // right != literal
+      symbol *tlbl = newiTempLabel(NULL);
+      if (AOP_TYPE(right) == AOP_CRY){
+       // c = bit ^ bit;
+       pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
+      }
+      else{
+       int sizer = AOP_SIZE(right);
+       // c = bit ^ val
+       // if val>>1 != 0, result = 1
+       pic14_emitcode("setb","c");
+       while(sizer){
+         MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE));
+         if(sizer == 1)
+           // test the msb of the lsb
+           pic14_emitcode("anl","a,#0xfe");
+         pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
+         sizer--;
+       }
+       // val = (0,1)
+       pic14_emitcode("rrc","a");
+      }
+      pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100));
+      pic14_emitcode("cpl","c");
+      pic14_emitcode("","%05d_DS_:",(tlbl->key+100));
     }
+    // bit = c
+    // val = c
+    if(size)
+      pic14_outBitC(result);
+    // if(bit | ...)
+    else if((AOP_TYPE(result) == AOP_CRY) && ifx)
+      genIfxJump(ifx, "c");           
+    goto release ;
+  }
 
-    if(pic14_sameRegs(AOP(result),AOP(left))){
-        /* if left is same as result */
-        for(;size--; offset++) {
-            if(AOP_TYPE(right) == AOP_LIT){
-             int t  = (lit >> (offset*8)) & 0x0FFL;
-                if(t == 0x00L)
-                    continue;
-                else
-                   if (IS_AOP_PREG(left)) {
-                       MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
-                       pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
-                       aopPut(AOP(result),"a",offset);
-                   } else {
-                     emitpcode(POC_MOVLW, popGetLit(t));
-                     emitpcode(POC_XORWF,popGet(AOP(left),offset,FALSE,FALSE));
-                     pic14_emitcode("xrl","%s,%s",
-                                    aopGet(AOP(left),offset,FALSE,TRUE),
-                                    aopGet(AOP(right),offset,FALSE,FALSE));
-                   }
-            } else {
-               if (AOP_TYPE(left) == AOP_ACC)
-                   pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE));
-               else {
-                   MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
-                   if (IS_AOP_PREG(left)) {
-                       pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
-                       aopPut(AOP(result),"a",offset);
-                   } else
-                       pic14_emitcode("xrl","%s,a",
-                                aopGet(AOP(left),offset,FALSE,TRUE));
-               }
-            }
-        }
-    } else {
-        // left & result in different registers
-        if(AOP_TYPE(result) == AOP_CRY){
-            // result = bit
-            // if(size), result in bit
-            // if(!size && ifx), conditional oper: if(left ^ right)
-            symbol *tlbl = newiTempLabel(NULL);
-            int sizer = max(AOP_SIZE(left),AOP_SIZE(right));
-            if(size)
-                pic14_emitcode("setb","c");
-            while(sizer--){
-                if((AOP_TYPE(right) == AOP_LIT) &&
-                   (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){
-                    MOVA(aopGet(AOP(left),offset,FALSE,FALSE));
-                } else {
-                    MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
-                    pic14_emitcode("xrl","a,%s",
-                             aopGet(AOP(left),offset,FALSE,FALSE));
-                }
-                pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
-                offset++;
-            }
-            if(size){
-                CLRC;
-                pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-                pic14_outBitC(result);
-            } else if(ifx)
-                jmpTrueOrFalse(ifx, tlbl);
-        } else for(;(size--);offset++){
-            // normal case
-            // result = left & right
-            if(AOP_TYPE(right) == AOP_LIT){
-             int t = (lit >> (offset*8)) & 0x0FFL;
-             switch(t) { 
-             case 0x00:
-               emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-               emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
-               pic14_emitcode("movf","%s,w",
+  if(pic14_sameRegs(AOP(result),AOP(left))){
+    /* if left is same as result */
+    for(;size--; offset++) {
+      if(AOP_TYPE(right) == AOP_LIT){
+       int t  = (lit >> (offset*8)) & 0x0FFL;
+       if(t == 0x00L)
+         continue;
+       else
+         if (IS_AOP_PREG(left)) {
+           MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+           pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
+           aopPut(AOP(result),"a",offset);
+         } else {
+           emitpcode(POC_MOVLW, popGetLit(t));
+           emitpcode(POC_XORWF,popGet(AOP(left),offset));
+           pic14_emitcode("xrl","%s,%s",
+                          aopGet(AOP(left),offset,FALSE,TRUE),
+                          aopGet(AOP(right),offset,FALSE,FALSE));
+         }
+      } else {
+       if (AOP_TYPE(left) == AOP_ACC)
+         pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE));
+       else {
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+         emitpcode(POC_XORWF,popGet(AOP(left),offset));
+/*
+         if (IS_AOP_PREG(left)) {
+           pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
+           aopPut(AOP(result),"a",offset);
+         } else
+           pic14_emitcode("xrl","%s,a",
+                          aopGet(AOP(left),offset,FALSE,TRUE));
+*/
+       }
+      }
+    }
+  } else {
+    // left & result in different registers
+    if(AOP_TYPE(result) == AOP_CRY){
+      // result = bit
+      // if(size), result in bit
+      // if(!size && ifx), conditional oper: if(left ^ right)
+      symbol *tlbl = newiTempLabel(NULL);
+      int sizer = max(AOP_SIZE(left),AOP_SIZE(right));
+      if(size)
+       pic14_emitcode("setb","c");
+      while(sizer--){
+       if((AOP_TYPE(right) == AOP_LIT) &&
+          (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){
+         MOVA(aopGet(AOP(left),offset,FALSE,FALSE));
+       } else {
+         MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+         pic14_emitcode("xrl","a,%s",
                         aopGet(AOP(left),offset,FALSE,FALSE));
-               pic14_emitcode("movwf","%s",
+       }
+       pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
+       offset++;
+      }
+      if(size){
+       CLRC;
+       pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+       pic14_outBitC(result);
+      } else if(ifx)
+       jmpTrueOrFalse(ifx, tlbl);
+    } else for(;(size--);offset++){
+      // normal case
+      // result = left & right
+      if(AOP_TYPE(right) == AOP_LIT){
+       int t = (lit >> (offset*8)) & 0x0FFL;
+       switch(t) { 
+       case 0x00:
+         emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+         emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+         pic14_emitcode("movf","%s,w",
+                        aopGet(AOP(left),offset,FALSE,FALSE));
+         pic14_emitcode("movwf","%s",
                         aopGet(AOP(result),offset,FALSE,FALSE));
-               break;
-             case 0xff:
-               emitpcode(POC_COMFW,popGet(AOP(left),offset,FALSE,FALSE));
-               emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
-               pic14_emitcode("comf","%s,w",
+         break;
+       case 0xff:
+         emitpcode(POC_COMFW,popGet(AOP(left),offset));
+         emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+         pic14_emitcode("comf","%s,w",
                         aopGet(AOP(left),offset,FALSE,FALSE));
-               pic14_emitcode("movwf","%s",
+         pic14_emitcode("movwf","%s",
                         aopGet(AOP(result),offset,FALSE,FALSE));
-               break;
-             default:
-               emitpcode(POC_MOVLW, popGetLit(t));
-               emitpcode(POC_XORFW,popGet(AOP(left),offset,FALSE,FALSE));
-               emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
-               pic14_emitcode("movlw","0x%x",t);
-               pic14_emitcode("xorwf","%s,w",
+         break;
+       default:
+         emitpcode(POC_MOVLW, popGetLit(t));
+         emitpcode(POC_XORFW,popGet(AOP(left),offset));
+         emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+         pic14_emitcode("movlw","0x%x",t);
+         pic14_emitcode("xorwf","%s,w",
                         aopGet(AOP(left),offset,FALSE,FALSE));
-               pic14_emitcode("movwf","%s",
+         pic14_emitcode("movwf","%s",
                         aopGet(AOP(result),offset,FALSE,FALSE));
 
-             }
-             continue;
-            }
+       }
+       continue;
+      }
 
-            // faster than result <- left, anl result,right
-            // and better if result is SFR
-           if (AOP_TYPE(left) == AOP_ACC) {
-               emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
-               pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-           } else {
-               emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
-               emitpcode(POC_XORFW,popGet(AOP(left),offset,FALSE,FALSE));
-               pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-               pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-           }
-           if ( AOP_TYPE(result) != AOP_ACC){
-               emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
-             pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
-           }
-        }
+      // faster than result <- left, anl result,right
+      // and better if result is SFR
+      if (AOP_TYPE(left) == AOP_ACC) {
+       emitpcode(POC_XORFW,popGet(AOP(right),offset));
+       pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+      } else {
+       emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+       emitpcode(POC_XORFW,popGet(AOP(left),offset));
+       pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+       pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
+      }
+      if ( AOP_TYPE(result) != AOP_ACC){
+       emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+       pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
+      }
     }
+  }
 
-release :
+  release :
     freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(result,NULL,ic,TRUE);     
+  freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+  freeAsmop(result,NULL,ic,TRUE);     
 }
 
 /*-----------------------------------------------------------------*/
@@ -5384,37 +5717,40 @@ static void genInline (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genRRC (iCode *ic)
 {
-    operand *left , *result ;
-    int size, offset = 0;
-    char *l;    
+  operand *left , *result ;
+  int size, offset = 0, same;
 
-    /* rotate right with carry */
-    left = IC_LEFT(ic);
-    result=IC_RESULT(ic);
-    aopOp (left,ic,FALSE);
-    aopOp (result,ic,FALSE);
+  /* rotate right with carry */
+  left = IC_LEFT(ic);
+  result=IC_RESULT(ic);
+  aopOp (left,ic,FALSE);
+  aopOp (result,ic,FALSE);
 
-    /* move it to the result */
-    size = AOP_SIZE(result);    
-    offset = size - 1 ;
-    CLRC;
-    while (size--) {
-        l = aopGet(AOP(left),offset,FALSE,FALSE);
-        MOVA(l);
-        pic14_emitcode("rrc","a");
-        if (AOP_SIZE(result) > 1)
-            aopPut(AOP(result),"a",offset--);
-    }
-    /* now we need to put the carry into the
-    highest order byte of the result */
-    if (AOP_SIZE(result) > 1) {
-        l = aopGet(AOP(result),AOP_SIZE(result)-1,FALSE,FALSE);
-        MOVA(l);
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+  same = pic14_sameRegs(AOP(result),AOP(left));
+
+  size = AOP_SIZE(result);    
+
+  /* get the lsb and put it into the carry */
+  emitpcode(POC_RRFW, popGet(AOP(left),size-1));
+
+  offset = 0 ;
+
+  while(size--) {
+
+    if(same) {
+      emitpcode(POC_RRF, popGet(AOP(left),offset));
+    } else {
+      emitpcode(POC_RRFW, popGet(AOP(left),offset));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offset));
     }
-    pic14_emitcode("mov","acc.7,c");
-    aopPut(AOP(result),"a",AOP_SIZE(result)-1);
-    freeAsmop(left,NULL,ic,TRUE);
-    freeAsmop(result,NULL,ic,TRUE);
+
+    offset++;
+  }
+
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5422,44 +5758,44 @@ static void genRRC (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genRLC (iCode *ic)
 {    
-    operand *left , *result ;
-    int size, offset = 0;
-    char *l;    
+  operand *left , *result ;
+  int size, offset = 0;
+  int same;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* rotate right with carry */
-    left = IC_LEFT(ic);
-    result=IC_RESULT(ic);
-    aopOp (left,ic,FALSE);
-    aopOp (result,ic,FALSE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* rotate right with carry */
+  left = IC_LEFT(ic);
+  result=IC_RESULT(ic);
+  aopOp (left,ic,FALSE);
+  aopOp (result,ic,FALSE);
 
-    /* move it to the result */
-    size = AOP_SIZE(result);    
-    offset = 0 ;
-    if (size--) {
-        l = aopGet(AOP(left),offset,FALSE,FALSE);
-        MOVA(l);
-        pic14_emitcode("add","a,acc");
-        if (AOP_SIZE(result) > 1)
-            aopPut(AOP(result),"a",offset++);
-        while (size--) {
-            l = aopGet(AOP(left),offset,FALSE,FALSE);
-            MOVA(l);
-            pic14_emitcode("rlc","a");
-            if (AOP_SIZE(result) > 1)
-                aopPut(AOP(result),"a",offset++);
-        }
-    }
-    /* now we need to put the carry into the
-    highest order byte of the result */
-    if (AOP_SIZE(result) > 1) {
-        l = aopGet(AOP(result),0,FALSE,FALSE);
-        MOVA(l);
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+  same = pic14_sameRegs(AOP(result),AOP(left));
+
+  /* move it to the result */
+  size = AOP_SIZE(result);    
+
+  /* get the msb and put it into the carry */
+  emitpcode(POC_RLFW, popGet(AOP(left),size-1));
+
+  offset = 0 ;
+
+  while(size--) {
+
+    if(same) {
+      emitpcode(POC_RLF, popGet(AOP(left),offset));
+    } else {
+      emitpcode(POC_RLFW, popGet(AOP(left),offset));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offset));
     }
-    pic14_emitcode("mov","acc.0,c");
-    aopPut(AOP(result),"a",0);
-    freeAsmop(left,NULL,ic,TRUE);
-    freeAsmop(result,NULL,ic,TRUE);
+
+    offset++;
+  }
+
+
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5616,12 +5952,12 @@ static void shiftR1Left2ResultSigned (operand *left, int offl,
 
   switch(shCount) {
   case 1:
-    emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
     if(same) 
-      emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
     else {
-      emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
 
     break;
@@ -5656,66 +5992,66 @@ static void shiftR1Left2Result (operand *left, int offl,
   case 1:
     emitCLRC;
     if(same) 
-      emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
     else {
-      emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
     break;
   case 2:
     emitCLRC;
     if(same) {
-      emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
     } else {
-      emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
     emitCLRC;
-    emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_RRF, popGet(AOP(result),offr));
 
     break;
   case 3:
     if(same) 
-      emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
     else {
-      emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
 
-    emitpcode(POC_RLFW,  popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLFW,  popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_RLFW,  popGet(AOP(result),offr));
+    emitpcode(POC_RLFW,  popGet(AOP(result),offr));
     emitpcode(POC_ANDLW, popGetLit(0x1f));
-    emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     break;
       
   case 4:
-    emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0x0f));
-    emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     break;
 
   case 5:
-    emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0x0f));
-    emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     emitCLRC;
-    emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_RRF, popGet(AOP(result),offr));
 
     break;
   case 6:
 
-    emitpcode(POC_RLFW,  popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_RLFW,  popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0x80));
-    emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLF,   popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLF,   popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    emitpcode(POC_RLF,   popGet(AOP(result),offr));
+    emitpcode(POC_RLF,   popGet(AOP(result),offr));
     break;
 
   case 7:
 
-    emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
-    emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    emitpcode(POC_CLRF, popGet(AOP(result),offr));
+    emitpcode(POC_RLF,  popGet(AOP(result),offr));
 
     break;
 
@@ -5759,49 +6095,49 @@ static void shiftL1Left2Result (operand *left, int offl,
   switch(shCount) {
   case 1:
     /* Shift left 1 bit position */
-    emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_MOVFW, popGet(AOP(left),offl));
     if(same) {
-      emitpcode(POC_ADDWF, popGet(AOP(left),offl,FALSE,FALSE));
+      emitpcode(POC_ADDWF, popGet(AOP(left),offl));
     } else {
-      emitpcode(POC_ADDFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_ADDFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
     break;
   case 2:
-    emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
     emitpcode(POC_ANDLW,popGetLit(0x7e));
-    emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
     break;
   case 3:
-    emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
     emitpcode(POC_ANDLW,popGetLit(0x3e));
-    emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+    emitpcode(POC_RLF,  popGet(AOP(result),offr));
     break;
   case 4:
-    emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0xf0));
-    emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
     break;
   case 5:
-    emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0xf0));
-    emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
     break;
   case 6:
-    emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+    emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
     emitpcode(POC_ANDLW, popGetLit(0x30));
-    emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+    emitpcode(POC_RLF,  popGet(AOP(result),offr));
     break;
   case 7:
-    emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-    emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
-    emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
+    emitpcode(POC_RRFW, popGet(AOP(left),offl));
+    emitpcode(POC_CLRF, popGet(AOP(result),offr));
+    emitpcode(POC_RRF,  popGet(AOP(result),offr));
     break;
 
   default:
@@ -5826,8 +6162,8 @@ static void movLeft2Result (operand *left, int offl,
             aopPut(AOP(result),"a",offr);
         } else {
          if(!sign) {
-           emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
-           emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+           emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+           emitpcode(POC_MOVWF, popGet(AOP(result),offr));
 
            //aopPut(AOP(result),l,offr);
          }else{
@@ -5841,222 +6177,6 @@ static void movLeft2Result (operand *left, int offl,
     }
 }
 
-/*-----------------------------------------------------------------*/
-/* AccAXRrl1 - right rotate c->a:x->c by 1                         */
-/*-----------------------------------------------------------------*/
-static void AccAXRrl1 (char *x)
-{
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    pic14_emitcode("rrc","a");
-    pic14_emitcode("xch","a,%s", x);
-    pic14_emitcode("rrc","a");
-    pic14_emitcode("xch","a,%s", x);
-}
-
-/*-----------------------------------------------------------------*/
-/* AccAXLrl1 - left rotate c<-a:x<-c by 1                          */
-/*-----------------------------------------------------------------*/
-static void AccAXLrl1 (char *x)
-{
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    pic14_emitcode("xch","a,%s",x);
-    pic14_emitcode("rlc","a");
-    pic14_emitcode("xch","a,%s",x);
-    pic14_emitcode("rlc","a");
-}
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXLsh1 - left shift a:x<-0 by 1                              */
-/*-----------------------------------------------------------------*/
-static void AccAXLsh1 (char *x)
-{
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    pic14_emitcode("xch","a,%s",x);
-    pic14_emitcode("add","a,acc");
-    pic14_emitcode("xch","a,%s",x);
-    pic14_emitcode("rlc","a");
-}
-#endif
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXLsh - left shift a:x by known count (0..7)                 */
-/*-----------------------------------------------------------------*/
-static void AccAXLsh (char *x, int shCount)
-{
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    switch(shCount){
-        case 0 :
-            break;
-        case 1 :
-            AccAXLsh1(x);
-            break;
-        case 2 :
-            AccAXLsh1(x);
-            AccAXLsh1(x);
-            break;
-        case 3 :
-        case 4 :
-        case 5 :                        // AAAAABBB:CCCCCDDD
-            AccRol(shCount);            // BBBAAAAA:CCCCCDDD
-            pic14_emitcode("anl","a,#0x%02x",
-                     SLMask[shCount]);  // BBB00000:CCCCCDDD
-            pic14_emitcode("xch","a,%s",x);   // CCCCCDDD:BBB00000
-            AccRol(shCount);            // DDDCCCCC:BBB00000
-            pic14_emitcode("xch","a,%s",x);   // BBB00000:DDDCCCCC
-            pic14_emitcode("xrl","a,%s",x);   // (BBB^DDD)CCCCC:DDDCCCCC
-            pic14_emitcode("xch","a,%s",x);   // DDDCCCCC:(BBB^DDD)CCCCC
-            pic14_emitcode("anl","a,#0x%02x",
-                     SLMask[shCount]);  // DDD00000:(BBB^DDD)CCCCC
-            pic14_emitcode("xch","a,%s",x);   // (BBB^DDD)CCCCC:DDD00000
-            pic14_emitcode("xrl","a,%s",x);   // BBBCCCCC:DDD00000            
-            break;
-        case 6 :                        // AAAAAABB:CCCCCCDD
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000000BB:CCCCCCDD
-            pic14_emitcode("mov","c,acc.0");  // c = B
-            pic14_emitcode("xch","a,%s",x);   // CCCCCCDD:000000BB
-            AccAXRrl1(x);               // BCCCCCCD:D000000B
-            AccAXRrl1(x);               // BBCCCCCC:DD000000
-            break;
-        case 7 :                        // a:x <<= 7
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 0000000B:CCCCCCCD
-            pic14_emitcode("mov","c,acc.0");  // c = B
-            pic14_emitcode("xch","a,%s",x);   // CCCCCCCD:0000000B
-            AccAXRrl1(x);               // BCCCCCCC:D0000000
-            break;
-        default :
-            break;
-    }
-}
-#endif
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXRsh - right shift a:x known count (0..7)                   */
-/*-----------------------------------------------------------------*/
-static void AccAXRsh (char *x, int shCount)
-{   
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    switch(shCount){
-        case 0 :
-            break;
-        case 1 :
-            CLRC;
-            AccAXRrl1(x);               // 0->a:x
-            break;
-        case 2 :
-            CLRC;
-            AccAXRrl1(x);               // 0->a:x
-            CLRC;
-            AccAXRrl1(x);               // 0->a:x
-            break;
-        case 3 :
-        case 4 :
-        case 5 :                        // AAAAABBB:CCCCCDDD = a:x
-            AccRol(8 - shCount);        // BBBAAAAA:DDDCCCCC
-            pic14_emitcode("xch","a,%s",x);   // CCCCCDDD:BBBAAAAA
-            AccRol(8 - shCount);        // DDDCCCCC:BBBAAAAA
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000CCCCC:BBBAAAAA
-            pic14_emitcode("xrl","a,%s",x);   // BBB(CCCCC^AAAAA):BBBAAAAA
-            pic14_emitcode("xch","a,%s",x);   // BBBAAAAA:BBB(CCCCC^AAAAA)
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000AAAAA:BBB(CCCCC^AAAAA)
-            pic14_emitcode("xch","a,%s",x);   // BBB(CCCCC^AAAAA):000AAAAA
-            pic14_emitcode("xrl","a,%s",x);   // BBBCCCCC:000AAAAA
-            pic14_emitcode("xch","a,%s",x);   // 000AAAAA:BBBCCCCC
-            break;
-        case 6 :                        // AABBBBBB:CCDDDDDD
-            pic14_emitcode("mov","c,acc.7");
-            AccAXLrl1(x);               // ABBBBBBC:CDDDDDDA
-            AccAXLrl1(x);               // BBBBBBCC:DDDDDDAA
-            pic14_emitcode("xch","a,%s",x);   // DDDDDDAA:BBBBBBCC
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000000AA:BBBBBBCC
-            break;
-        case 7 :                        // ABBBBBBB:CDDDDDDD
-            pic14_emitcode("mov","c,acc.7");  // c = A
-            AccAXLrl1(x);               // BBBBBBBC:DDDDDDDA
-            pic14_emitcode("xch","a,%s",x);   // DDDDDDDA:BBBBBBCC
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 0000000A:BBBBBBBC
-            break;
-        default :
-            break;
-    }
-}
-#endif
-/*-----------------------------------------------------------------*/
-/* AccAXRshS - right shift signed a:x known count (0..7)           */
-/*-----------------------------------------------------------------*/
-static void AccAXRshS (char *x, int shCount)
-{   
-    symbol *tlbl ;
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    switch(shCount){
-        case 0 :
-            break;
-        case 1 :
-            pic14_emitcode("mov","c,acc.7");
-            AccAXRrl1(x);               // s->a:x
-            break;
-        case 2 :
-            pic14_emitcode("mov","c,acc.7");
-            AccAXRrl1(x);               // s->a:x
-            pic14_emitcode("mov","c,acc.7");
-            AccAXRrl1(x);               // s->a:x
-            break;
-        case 3 :
-        case 4 :
-        case 5 :                        // AAAAABBB:CCCCCDDD = a:x
-            tlbl = newiTempLabel(NULL);
-            AccRol(8 - shCount);        // BBBAAAAA:CCCCCDDD
-            pic14_emitcode("xch","a,%s",x);   // CCCCCDDD:BBBAAAAA
-            AccRol(8 - shCount);        // DDDCCCCC:BBBAAAAA
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000CCCCC:BBBAAAAA
-            pic14_emitcode("xrl","a,%s",x);   // BBB(CCCCC^AAAAA):BBBAAAAA
-            pic14_emitcode("xch","a,%s",x);   // BBBAAAAA:BBB(CCCCC^AAAAA)
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000AAAAA:BBB(CCCCC^AAAAA)
-            pic14_emitcode("xch","a,%s",x);   // BBB(CCCCC^AAAAA):000AAAAA
-            pic14_emitcode("xrl","a,%s",x);   // BBBCCCCC:000AAAAA
-            pic14_emitcode("xch","a,%s",x);   // 000SAAAA:BBBCCCCC
-            pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); 
-            pic14_emitcode("orl","a,#0x%02x",
-                     (unsigned char)~SRMask[shCount]);  // 111AAAAA:BBBCCCCC
-            pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-            break;                      // SSSSAAAA:BBBCCCCC
-        case 6 :                        // AABBBBBB:CCDDDDDD
-            tlbl = newiTempLabel(NULL);
-            pic14_emitcode("mov","c,acc.7");
-            AccAXLrl1(x);               // ABBBBBBC:CDDDDDDA
-            AccAXLrl1(x);               // BBBBBBCC:DDDDDDAA
-            pic14_emitcode("xch","a,%s",x);   // DDDDDDAA:BBBBBBCC
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 000000AA:BBBBBBCC
-            pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); 
-            pic14_emitcode("orl","a,#0x%02x",
-                     (unsigned char)~SRMask[shCount]);  // 111111AA:BBBBBBCC
-            pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-            break;
-        case 7 :                        // ABBBBBBB:CDDDDDDD
-            tlbl = newiTempLabel(NULL);
-            pic14_emitcode("mov","c,acc.7");  // c = A
-            AccAXLrl1(x);               // BBBBBBBC:DDDDDDDA
-            pic14_emitcode("xch","a,%s",x);   // DDDDDDDA:BBBBBBCC
-            pic14_emitcode("anl","a,#0x%02x",
-                     SRMask[shCount]);  // 0000000A:BBBBBBBC
-            pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100); 
-            pic14_emitcode("orl","a,#0x%02x",
-                     (unsigned char)~SRMask[shCount]);  // 1111111A:BBBBBBBC
-            pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-            break;
-        default :
-            break;
-    }
-}
-
 /*-----------------------------------------------------------------*/
 /* shiftL2Left2Result - shift left two bytes from left to result   */
 /*-----------------------------------------------------------------*/
@@ -6075,49 +6195,49 @@ static void shiftL2Left2Result (operand *left, int offl,
     case 2:
     case 3:
 
-      emitpcode(POC_MOVFW,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_MOVFW,popGet(AOP(result),offr));
+      emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
 
       while(--shCount) {
        emitCLRC;
-       emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+       emitpcode(POC_RLF, popGet(AOP(result),offr));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
       }
 
       break;
     case 4:
     case 5:
       emitpcode(POC_MOVLW, popGetLit(0x0f));
-      emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_ANDFW, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_XORWF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
+      emitpcode(POC_ANDFW, popGet(AOP(result),offr));
+      emitpcode(POC_XORWF, popGet(AOP(result),offr));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
       if(shCount >=5) {
-       emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+       emitpcode(POC_RLF, popGet(AOP(result),offr));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
       }
       break;
     case 6:
-      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr));
+      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
       emitpcode(POC_ANDLW,popGetLit(0xc0));
-      emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_XORWF,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr));
+      emitpcode(POC_XORWF,popGet(AOP(result),offr));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
       break;
     case 7:
-      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRFW, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRFW, popGet(AOP(result),offr));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_CLRF, popGet(AOP(result),offr));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr));
     }
 
   } else {
@@ -6129,57 +6249,57 @@ static void shiftL2Left2Result (operand *left, int offl,
     case 3:
       /* note, use a mov/add for the shift since the mov has a
         chance of getting optimized out */
-      emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RLFW,  popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+      emitpcode(POC_RLFW,  popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
 
       while(--shCount) {
        emitCLRC;
-       emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+       emitpcode(POC_RLF, popGet(AOP(result),offr));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
       }
       break;
 
     case 4:
     case 5:
-      emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16,FALSE,FALSE));
+      emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16));
       emitpcode(POC_ANDLW, popGetLit(0xF0));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
       emitpcode(POC_ANDLW, popGetLit(0xF0));
-      emitpcode(POC_XORWF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_XORWF, popGet(AOP(result),offr));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
 
 
       if(shCount == 5) {
-       emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+       emitpcode(POC_RLF, popGet(AOP(result),offr));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
       }
       break;
     case 6:
-      emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRFW, popGet(AOP(result),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF,  popGet(AOP(result),offr,FALSE,FALSE));
-
-      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRFW, popGet(AOP(result),offl));
+      emitpcode(POC_MOVWF,  popGet(AOP(result),offr));
+
+      emitpcode(POC_RRF,  popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr));
+      emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
       emitpcode(POC_ANDLW,popGetLit(0xc0));
-      emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_XORWF,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr));
+      emitpcode(POC_XORWF,popGet(AOP(result),offr));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
       break;
     case 7:
-      emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-      emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_RRF,  popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_CLRF, popGet(AOP(result),offr));
+      emitpcode(POC_RRF,  popGet(AOP(result),offr));
     }
   }
 
@@ -6206,103 +6326,104 @@ static void shiftR2Left2Result (operand *left, int offl,
     MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE));
   }
   /* a:x >> shCount (x = lsb(result))*/
+/*
   if(sign)
     AccAXRshS( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
   else {
-    //AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
-    
-    switch(shCount) {
-    case 0:
-      break;
-    case 1:
-    case 2:
-    case 3:
-      emitCLRC;
-      if(same) {
-       emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RRF,popGet(AOP(result),offr,FALSE,FALSE));
-      } else {
+    AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
+*/
+  switch(shCount) {
+  case 0:
+    break;
+  case 1:
+  case 2:
+  case 3:
+    emitCLRC;
+    if(same) {
+      emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,popGet(AOP(result),offr));
+    } else {
 
-       emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-      }
+      emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    }
 
-      while(--shCount) {
-       emitCLRC;
-       emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RRF,popGet(AOP(result),offr,FALSE,FALSE));
-      }
-      break;
-    case 4:
-    case 5:
-      if(same) {
+    while(--shCount) {
+      emitCLRC;
+      emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,popGet(AOP(result),offr));
+    }
+    break;
+  case 4:
+  case 5:
+    if(same) {
 
-       emitpcode(POC_MOVLW, popGetLit(0xf0));
-       emitpcode(POC_ANDWF, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
+      emitpcode(POC_MOVLW, popGetLit(0xf0));
+      emitpcode(POC_ANDWF, popGet(AOP(result),offr));
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
 
-       emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
-      } else {
-       emitpcode(POC_SWAPF, popGet(AOP(left),offl,FALSE,FALSE));
-       emitpcode(POC_ANDLW, popGetLit(0x0f));
-       emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
-
-       emitpcode(POC_SWAPF, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-       emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_ANDLW, popGetLit(0xf0));
-       emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
-      }
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+    } else {
+      emitpcode(POC_SWAPF, popGet(AOP(left),offl));
+      emitpcode(POC_ANDLW, popGetLit(0x0f));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
 
-      if(shCount >=5) {
-       emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
-      }
+      emitpcode(POC_SWAPF, popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_ANDLW, popGetLit(0xf0));
+      emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+    }
 
-      break;
+    if(shCount >=5) {
+      emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
+    }
 
-    case 6:
-      if(same) {
-
-       emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-
-       emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_ANDLW,popGetLit(0x03));
-       emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-      } else {
-       emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RLFW, popGet(AOP(result),offl+MSB16,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-       emitpcode(POC_RLF,  popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
-       emitpcode(POC_ANDLW,popGetLit(0x03));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-      }
+    break;
 
-      break;
-    case 7:
-      emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
-      emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
-      emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
-      emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+  case 6:
+    if(same) {
+
+      emitpcode(POC_RLF,  popGet(AOP(result),offr));
+      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
+
+      emitpcode(POC_RLF,  popGet(AOP(result),offr));
+      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RLFW, popGet(AOP(result),offr));
+      emitpcode(POC_ANDLW,popGetLit(0x03));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    } else {
+      emitpcode(POC_RLFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RLFW, popGet(AOP(result),offl+MSB16));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RLF,  popGet(AOP(result),offr));
+      emitpcode(POC_RLFW, popGet(AOP(result),offr));
+      emitpcode(POC_ANDLW,popGetLit(0x03));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr));
     }
+
+    break;
+  case 7:
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16));
+    emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
   }
 }
 
+
 /*-----------------------------------------------------------------*/
 /* shiftLLeftOrResult - shift left one byte from left, or to result*/
 /*-----------------------------------------------------------------*/
@@ -6364,7 +6485,7 @@ static void genlshTwo (operand *result,operand *left, int shCount)
             else 
                 movLeft2Result(left, LSB, result, MSB16, 0);
         }
-       emitpcode(POC_CLRF,popGet(AOP(result),LSB,FALSE,FALSE));
+       emitpcode(POC_CLRF,popGet(AOP(result),LSB));
     }
 
     /*  1 <= shCount <= 7 */
@@ -6634,30 +6755,30 @@ static void genLeftShift (iCode *ic)
     /* if it is only one byte then */
     if (size == 1) {
       if(optimized_for_speed) {
-       emitpcode(POC_SWAPFW, popGet(AOP(left),0,FALSE,FALSE));
+       emitpcode(POC_SWAPFW, popGet(AOP(left),0));
        emitpcode(POC_ANDLW,  popGetLit(0xf0));
        emitpcode(POC_BTFSS,  newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),2,0));
-       emitpcode(POC_MOVFW,  popGet(AOP(left),0,FALSE,FALSE));
-       emitpcode(POC_MOVWF,  popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_MOVFW,  popGet(AOP(left),0));
+       emitpcode(POC_MOVWF,  popGet(AOP(result),0));
        emitpcode(POC_BTFSS,  newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0));
-       emitpcode(POC_ADDWF,  popGet(AOP(result),0,FALSE,FALSE));
-       emitpcode(POC_RLFW,   popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(result),0));
+       emitpcode(POC_RLFW,   popGet(AOP(result),0));
        emitpcode(POC_ANDLW,  popGetLit(0xfe));
-       emitpcode(POC_ADDFW,  popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_ADDFW,  popGet(AOP(result),0));
        emitpcode(POC_BTFSC,  newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),1,0));
-       emitpcode(POC_ADDWF,  popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(result),0));
       } else {
 
        tlbl = newiTempLabel(NULL);
        if (!pic14_sameRegs(AOP(left),AOP(result))) {
-         emitpcode(POC_MOVFW,  popGet(AOP(left),0,FALSE,FALSE));
-         emitpcode(POC_MOVWF,  popGet(AOP(result),0,FALSE,FALSE));
+         emitpcode(POC_MOVFW,  popGet(AOP(left),0));
+         emitpcode(POC_MOVWF,  popGet(AOP(result),0));
        }
 
-       emitpcode(POC_COMFW,  popGet(AOP(right),0,FALSE,FALSE));
-       emitpcode(POC_RRF,    popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_COMFW,  popGet(AOP(right),0));
+       emitpcode(POC_RRF,    popGet(AOP(result),0));
        emitpLabel(tlbl->key);
-       emitpcode(POC_RLF,    popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_RLF,    popGet(AOP(result),0));
        emitpcode(POC_ADDLW,  popGetLit(1));
        emitSKPC;
        emitpcode(POC_GOTO,popGetLabel(tlbl->key));
@@ -6722,7 +6843,7 @@ static void genrshTwo (operand *result,operand *left,
        if(sign)
          addSign(result, MSB16, sign);
        else
-         emitpcode(POC_CLRF,popGet(AOP(result),MSB16,FALSE,FALSE));
+         emitpcode(POC_CLRF,popGet(AOP(result),MSB16));
 
     }
 
@@ -7072,14 +7193,14 @@ static void genRightShift (iCode *ic)
 */
        tlbl = newiTempLabel(NULL);
        if (!pic14_sameRegs(AOP(left),AOP(result))) {
-         emitpcode(POC_MOVFW,  popGet(AOP(left),0,FALSE,FALSE));
-         emitpcode(POC_MOVWF,  popGet(AOP(result),0,FALSE,FALSE));
+         emitpcode(POC_MOVFW,  popGet(AOP(left),0));
+         emitpcode(POC_MOVWF,  popGet(AOP(result),0));
        }
 
-       emitpcode(POC_COMFW,  popGet(AOP(right),0,FALSE,FALSE));
-       emitpcode(POC_RLF,    popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_COMFW,  popGet(AOP(right),0));
+       emitpcode(POC_RLF,    popGet(AOP(result),0));
        emitpLabel(tlbl->key);
-       emitpcode(POC_RRF,    popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_RRF,    popGet(AOP(result),0));
        emitpcode(POC_ADDLW,  popGetLit(1));
        emitSKPC;
        emitpcode(POC_GOTO,popGetLabel(tlbl->key));
@@ -7235,12 +7356,12 @@ static void genDataPointerGet (operand *left,
 
   aopOp(result,ic,TRUE);
 
-  emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,TRUE));
+  emitpcode(POC_MOVFW, popGet(AOP(left),0));
 
   size = AOP_SIZE(result);
 
   while (size--) {
-    emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,TRUE));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offset));
     offset++;
   }
 
@@ -7546,9 +7667,7 @@ static void genGenPointerGet (operand *left,
   aopOp(result,ic,FALSE);
 
 
-  DEBUGpic14_emitcode ("; ","result %s, left %s",
-                        AopType(AOP_TYPE(result)),
-                        AopType(AOP_TYPE(left)));
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
 
   /* if the operand is already in dptr 
      then we do nothing else we move the value to dptr */
@@ -7560,12 +7679,15 @@ static void genGenPointerGet (operand *left,
     }
     else { /* we need to get it byte by byte */
 
+      emitpcode(POC_MOVFW,popGet(AOP(left),0));
+      emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
+
       size = AOP_SIZE(result);
       offset = 0 ;
 
       while(size--) {
        emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
-       emitpcode(POC_MOVWF,popGet(AOP(result),offset++,FALSE,FALSE));
+       emitpcode(POC_MOVWF,popGet(AOP(result),offset++));
        if(size)
          emitpcode(POC_INCF,popCopyReg(&pc_fsr));
       }
@@ -7850,7 +7972,7 @@ static void genDataPointerSet(operand *right,
          pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
          pic14_emitcode("movwf","%s",buffer);
 
-         emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
+         emitpcode(POC_MOVFW, popGet(AOP(right),offset));
          emitpcode(POC_MOVWF, popRegFromString(buffer));
 
        }
@@ -8127,12 +8249,7 @@ static void genGenPointerSet (operand *right,
   aopOp(right,ic,FALSE);
   size = AOP_SIZE(right);
 
-  DEBUGpic14_emitcode ("; ","result %s=%s, right %s=%s, size = %d",
-                      AopType(AOP_TYPE(result)),
-                      aopGet(AOP(result),0,TRUE,FALSE),
-                      AopType(AOP_TYPE(right)),
-                      aopGet(AOP(right),0,FALSE,FALSE),
-                      size);
+  DEBUGpic14_AopType(__LINE__,NULL,right,result);
 
   /* if the operand is already in dptr 
      then we do nothing else we move the value to dptr */
@@ -8150,16 +8267,18 @@ static void genGenPointerSet (operand *right,
       /* hack hack! see if this the FSR. If so don't load W */
       if(AOP_TYPE(right) != AOP_ACC) {
 
-       if(size==2)
-         emitpcode(POC_DECF,popCopyReg(&pc_fsr));
+       emitpcode(POC_MOVFW,popGet(AOP(result),0));
+       emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
 
-       if(size==4) {
-         emitpcode(POC_MOVLW,popGetLit(0xfd));
-         emitpcode(POC_ADDWF,popCopyReg(&pc_fsr));
-       }
+       //if(size==2)
+       //emitpcode(POC_DECF,popCopyReg(&pc_fsr));
+       //if(size==4) {
+       //  emitpcode(POC_MOVLW,popGetLit(0xfd));
+       //  emitpcode(POC_ADDWF,popCopyReg(&pc_fsr));
+       //}
 
        while(size--) {
-         emitpcode(POC_MOVFW,popGet(AOP(right),offset++,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset++));
          emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
          
          if(size)
@@ -8333,19 +8452,10 @@ static void genAddrOf (iCode *ic)
   aopOp((right=IC_RIGHT(ic)),ic,FALSE);
   aopOp((result=IC_RESULT(ic)),ic,TRUE);
 
-  if(result)
-    DEBUGpic14_emitcode ("; ","result %s",
-                        AopType(AOP_TYPE(IC_RESULT(ic))));
+  DEBUGpic14_AopType(__LINE__,left,right,result);
 
-  if(left)
-    DEBUGpic14_emitcode ("; ","left %s",
-                        AopType(AOP_TYPE(IC_LEFT(ic))));
-  if(right)
-    DEBUGpic14_emitcode ("; ","right %s",
-                        AopType(AOP_TYPE(IC_RIGHT(ic))));
-  
-  emitpcode(POC_MOVLW, popGet(AOP(left),0,FALSE,FALSE));
-  emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+  emitpcode(POC_MOVLW, popGet(AOP(left),0));
+  emitpcode(POC_MOVWF, popGet(AOP(result),0));
 
 #if 0
   /* object not on stack then we need the name */
@@ -8421,10 +8531,7 @@ static void genAssign (iCode *ic)
   aopOp(right,ic,FALSE);
   aopOp(result,ic,TRUE);
 
-  DEBUGpic14_emitcode ("; ","result %s, right %s, size = %d",
-                      AopType(AOP_TYPE(IC_RESULT(ic))),
-                      AopType(AOP_TYPE(IC_RIGHT(ic))),
-                      AOP_SIZE(result));
+  DEBUGpic14_AopType(__LINE__,NULL,right,result);
 
   /* if they are the same registers */
   if (pic14_sameRegs(AOP(right),AOP(result)))
@@ -8438,7 +8545,7 @@ static void genAssign (iCode *ic)
     if (AOP_TYPE(right) == AOP_LIT) {
          
       emitpcode(  ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
-                 popGet(AOP(result),0,FALSE,FALSE));
+                 popGet(AOP(result),0));
 
       if (((int) operandLitValue(right))) 
        pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
@@ -8453,9 +8560,9 @@ static void genAssign (iCode *ic)
 
     /* the right is also a bit variable */
     if (AOP_TYPE(right) == AOP_CRY) {
-      emitpcode(POC_BCF,    popGet(AOP(result),0,FALSE,FALSE));
-      emitpcode(POC_BTFSC,  popGet(AOP(right),0,FALSE,FALSE));
-      emitpcode(POC_BSF,    popGet(AOP(result),0,FALSE,FALSE));
+      emitpcode(POC_BCF,    popGet(AOP(result),0));
+      emitpcode(POC_BTFSC,  popGet(AOP(right),0));
+      emitpcode(POC_BSF,    popGet(AOP(result),0));
 
       pic14_emitcode("bcf","(%s >> 3),(%s & 7)",
                     AOP(result)->aopu.aop_dir,
@@ -8470,10 +8577,10 @@ static void genAssign (iCode *ic)
     }
 
     /* we need to or */
-    emitpcode(POC_BCF,    popGet(AOP(result),0,FALSE,FALSE));
+    emitpcode(POC_BCF,    popGet(AOP(result),0));
     pic14_toBoolean(right);
     emitSKPZ;
-    emitpcode(POC_BSF,    popGet(AOP(result),0,FALSE,FALSE));
+    emitpcode(POC_BSF,    popGet(AOP(result),0));
     //aopPut(AOP(result),"a",0);
     goto release ;
   }
@@ -8486,9 +8593,11 @@ static void genAssign (iCode *ic)
     lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
 
   if( AOP_TYPE(right) == AOP_DIR  && (AOP_TYPE(result) == AOP_REG) && size==1)  {
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     if(aopIdx(AOP(result),0) == 4) {
-      emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offset));
       goto release;
     } else
       DEBUGpic14_emitcode ("; WARNING","%s  %d ignoring register storage",__FUNCTION__,__LINE__);
@@ -8496,26 +8605,28 @@ static void genAssign (iCode *ic)
 
   know_W=-1;
   while (size--) {
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     if(AOP_TYPE(right) == AOP_LIT) {
       if(lit&0xff) {
        if(know_W != (lit&0xff))
          emitpcode(POC_MOVLW,popGetLit(lit&0xff));
        know_W = lit&0xff;
-       emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+       emitpcode(POC_MOVWF, popGet(AOP(result),offset));
       } else
-       emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
+       emitpcode(POC_CLRF, popGet(AOP(result),offset));
 
       lit >>= 8;
 
     } else if (AOP_TYPE(right) == AOP_CRY) {
-      emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
+      emitpcode(POC_CLRF, popGet(AOP(result),offset));
       if(offset == 0) {
-       emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
-       emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE));
+       emitpcode(POC_BTFSS, popGet(AOP(right),0));
+       emitpcode(POC_INCF, popGet(AOP(result),0));
       }
     } else {
-      emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
-      emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offset));
     }
            
     offset++;
@@ -8551,7 +8662,7 @@ static void genJumpTab (iCode *ic)
     pic14_emitcode("","%05d_DS_:",jtab->key+100);
 
     emitpcode(POC_MOVLW, popGetLabel(jtab->key));
-    emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE));
+    emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0));
     emitSKPNC;
     emitpcode(POC_INCF, popCopyReg(&pc_pclath));
     emitpcode(POC_MOVWF, popCopyReg(&pc_pcl));
@@ -8707,6 +8818,7 @@ static void genCast (iCode *ic)
 {
     operand *result = IC_RESULT(ic);
     sym_link *ctype = operandType(IC_LEFT(ic));
+    sym_link *rtype = operandType(IC_RIGHT(ic));
     operand *right = IC_RIGHT(ic);
     int size, offset ;
 
@@ -8718,6 +8830,8 @@ static void genCast (iCode *ic)
     aopOp(right,ic,FALSE) ;
     aopOp(result,ic,FALSE);
 
+    DEBUGpic14_AopType(__LINE__,NULL,right,result);
+
     /* if the result is a bit */
     if (AOP_TYPE(result) == AOP_CRY) {
         /* if the right size is a literal then
@@ -8725,7 +8839,7 @@ static void genCast (iCode *ic)
         if (AOP_TYPE(right) == AOP_LIT) {
 
          emitpcode(  ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
-                     popGet(AOP(result),0,FALSE,FALSE));
+                     popGet(AOP(result),0));
 
             if (((int) operandLitValue(right))) 
              pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
@@ -8743,7 +8857,7 @@ static void genCast (iCode *ic)
         if (AOP_TYPE(right) == AOP_CRY) {
 
          emitCLRC;
-         emitpcode(POC_BTFSC,  popGet(AOP(right),0,FALSE,FALSE));
+         emitpcode(POC_BTFSC,  popGet(AOP(right),0));
 
          pic14_emitcode("clrc","");
          pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
@@ -8754,11 +8868,30 @@ static void genCast (iCode *ic)
         }
 
         /* we need to or */
-        pic14_toBoolean(right);
-        aopPut(AOP(result),"a",0);
+       if (AOP_TYPE(right) == AOP_REG) {
+         emitpcode(POC_BCF,    popGet(AOP(result),0));
+         emitpcode(POC_BTFSC,  newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0));
+         emitpcode(POC_BSF,    popGet(AOP(result),0));
+       }
+       pic14_toBoolean(right);
+       aopPut(AOP(result),"a",0);
         goto release ;
     }
 
+    if ((AOP_TYPE(right) == AOP_CRY) && (AOP_TYPE(result) == AOP_REG)) {
+      int offset = 1;
+      size = AOP_SIZE(result);
+
+      emitpcode(POC_CLRF,   popGet(AOP(result),0));
+      emitpcode(POC_BTFSC,  popGet(AOP(right),0));
+      emitpcode(POC_INCF,   popGet(AOP(result),0));
+
+      while (size--)
+       emitpcode(POC_CLRF,   popGet(AOP(result),offset++));
+
+      goto release;
+    }
+
     /* if they are the same size : or less */
     if (AOP_SIZE(result) <= AOP_SIZE(right)) {
 
@@ -8859,25 +8992,6 @@ static void genCast (iCode *ic)
     }
     
 
-    if (AOP_TYPE(right) == AOP_CRY) {
-      int offset = 1;
-      size = AOP_SIZE(right);
-
-      emitpcode(POC_CLRF,   popGet(AOP(result),0,FALSE,FALSE));
-      emitpcode(POC_BTFSC,  popGet(AOP(right),0,FALSE,FALSE));
-      emitpcode(POC_INCF,   popGet(AOP(result),0,FALSE,FALSE));
-
-      pic14_emitcode("clrf","%s ; %d", aopGet(AOP(result),0,FALSE,FALSE),__LINE__);
-      pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-              AOP(right)->aopu.aop_dir,
-              AOP(right)->aopu.aop_dir);
-      pic14_emitcode("incf","%s,f", aopGet(AOP(result),0,FALSE,FALSE),__LINE__);
-      while (size--) {
-       pic14_emitcode("clrf","%s;%d", aopGet(AOP(result),offset,FALSE,FALSE),__LINE__);
-       emitpcode(POC_CLRF,   popGet(AOP(result),offset++,FALSE,FALSE));
-      }
-      goto release;
-    }
 
     /* so we now know that the size of destination is greater
     than the size of the source.
@@ -8892,52 +9006,40 @@ static void genCast (iCode *ic)
     size = AOP_SIZE(right);
     offset = 0 ;
     while (size--) {
-      pic14_emitcode(";","%d",__LINE__);
-      /* aopPut(AOP(result),
-            aopGet(AOP(right),offset,FALSE,FALSE),
-            offset); */
-      emitpcode(POC_MOVFW,   popGet(AOP(right),offset,FALSE,FALSE));
-      emitpcode(POC_MOVWF,   popGet(AOP(result),offset,FALSE,FALSE));
+      emitpcode(POC_MOVFW,   popGet(AOP(right),offset));
+      emitpcode(POC_MOVWF,   popGet(AOP(result),offset));
       offset++;
     }
 
     /* now depending on the sign of the destination */
     size = AOP_SIZE(result) - AOP_SIZE(right);
     /* if unsigned or not an integral type */
-    if (SPEC_USIGN(ctype) || !IS_SPEC(ctype)) {
-      while (size--) {
-         emitpcode(POC_CLRF,   popGet(AOP(result),offset,FALSE,FALSE));
-         pic14_emitcode("clrf","%s  ;%d",aopGet(AOP(result),offset,FALSE,FALSE),__LINE__);
-         offset++;
-      }
+    if (SPEC_USIGN(rtype) || !IS_SPEC(rtype)) {
+      while (size--)
+       emitpcode(POC_CLRF,   popGet(AOP(result),offset++));
     } else {
       /* we need to extend the sign :{ */
 
-      emitpcodeNULLop(POC_CLRW);
-
-      if(offset)
-       emitpcode(POC_BTFSC,   newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
-      else
-       emitpcode(POC_BTFSC,   newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0));
-
-      emitpcode(POC_MOVLW,   popGetLit(0xff));
+      if(size == 1) {
+       /* Save one instruction of casting char to int */
+       emitpcode(POC_CLRF,   popGet(AOP(result),offset));
+       emitpcode(POC_BTFSC,  newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
+       emitpcode(POC_DECF,   popGet(AOP(result),offset));
+      } else {
+       emitpcodeNULLop(POC_CLRW);
 
-        pic14_emitcode("clrw","");
-       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                AOP(right)->aopu.aop_dir,
-                AOP(right)->aopu.aop_dir);
-        pic14_emitcode("movlw","0xff");
-        while (size--) {
-         emitpcode(POC_MOVWF,   popGet(AOP(result),offset,FALSE,FALSE));
-         pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
-         offset++;
-         // aopPut(AOP(result),"a",offset++);
-       }
+       if(offset)
+         emitpcode(POC_BTFSC,   newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
+       else
+         emitpcode(POC_BTFSC,   newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0));
+       
+       emitpcode(POC_MOVLW,   popGetLit(0xff));
 
+        while (size--)
+         emitpcode(POC_MOVWF,   popGet(AOP(result),offset++));
+      }
     }
 
-    /* we are done hurray !!!! */
-
 release:
     freeAsmop(right,NULL,ic,TRUE);
     freeAsmop(result,NULL,ic,TRUE);
@@ -8988,7 +9090,7 @@ static int genDjnz (iCode *ic, iCode *ifx)
     } else {   
 
 
-      emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0));
       emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
 
       pic14_emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));