* doc/cdbfile.html: removed, replaced by cdbfileformat.lyx
[fw/sdcc] / src / pic / gen.c
index 42b0b3756937ea079081612d3e75c9726d30055e..ba4a10fc546dbaed67ef800a171c48da71902850 100644 (file)
 #include "SDCCglobl.h"
 #include "newalloc.h"
 
-#ifdef HAVE_SYS_ISA_DEFS_H
-#include <sys/isa_defs.h>
-#else
-#ifdef HAVE_MACHINE_ENDIAN_H
-#include <machine/endian.h>
-#else
-#ifdef HAVE_ENDIAN_H
-#include <endian.h>
-#else
-#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__)
-#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN"
-#warning "If you running sdcc on an INTEL 80x86 Platform you are okay"
-#endif
-#endif
-#endif
-#endif
-
 #include "common.h"
 #include "SDCCpeeph.h"
 #include "ralloc.h"
 #include "pcode.h"
 #include "gen.h"
 
+
+extern void genUMult8X8_16 (operand *, operand *,operand *,pCodeOpReg *);
+extern void genSMult8X8_16 (operand *, operand *,operand *,pCodeOpReg *);
+void genMult8X8_8 (operand *, operand *,operand *);
+pCode *AssembleLine(char *line);
+extern void printpBlock(FILE *of, pBlock *pb);
+
 static int labelOffset=0;
-static int debug_verbose=1;
+extern int debug_verbose;
+static int optimized_for_speed = 0;
+
+/* max_key keeps track of the largest label number used in 
+   a function. This is then used to adjust the label offset
+   for the next function.
+*/
+static int max_key=0;
+static int GpsuedoStkPtr=0;
 
+pCodeOp *popGetImmd(char *name, unsigned int offset, int index);
 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)
 
 /* this is the down and dirty file with all kinds of 
    kludgy & hacky stuff. This is what it is all about
@@ -73,7 +76,7 @@ static char *zero = "#0x00";
 static char *one  = "#0x01";
 static char *spname = "sp";
 
-char *fReturnpic14[] = {"FSR","dph","b","a" };
+char *fReturnpic14[] = {"temp1","temp2","temp3","temp4" };
 //char *fReturn390[] = {"dpl","dph","dpx", "b","a" };
 unsigned fReturnSizePic = 4; /* shared with ralloc.c */
 static char **fReturn = fReturnpic14;
@@ -92,7 +95,15 @@ static struct {
     set *sendSet;
 } _G;
 
-char *Safe_strdup(char *str);  // in pcode.c
+/* Resolved ifx structure. This structure stores information
+   about an iCode ifx that makes it easier to generate code.
+*/
+typedef struct resolvedIfx {
+  symbol *lbl;     /* pointer to a label */
+  int condition;   /* true or false ifx */
+  int generated;   /* set true when the code associated with the ifx
+                   * is generated */
+} resolvedIfx;
 
 extern int pic14_ptrRegReq ;
 extern int pic14_nRegs;
@@ -134,26 +145,44 @@ static int my_powof2 (unsigned long num)
   return -1;
 }
 
-static void emitpLabel(int key)
+void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result)
 {
-  addpCode2pBlock(pb,newpCodeLabel(key));
+
+  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 emitpcode(PIC_OPCODE poc, pCodeOp *pcop)
+void DEBUGpic14_AopTypeSign(int line_no, operand *left, operand *right, operand *result)
 {
 
-  addpCode2pBlock(pb,newpCode(poc,pcop));
+  DEBUGpic14_emitcode ("; ","line = %d, signs: result %s=%c, left %s=%c, right %s=%c",
+                      line_no,
+                      ((result) ? AopType(AOP_TYPE(result)) : "-"),
+                      ((result) ? (SPEC_USIGN(operandType(result)) ? 'u' : 's') : '-'),
+                      ((left)   ? AopType(AOP_TYPE(left)) : "-"),
+                      ((left)   ? (SPEC_USIGN(operandType(left))   ? 'u' : 's') : '-'),
+                      ((right)  ? AopType(AOP_TYPE(right)) : "-"),
+                      ((right)  ? (SPEC_USIGN(operandType(right))  ? 'u' : 's') : '-'));
 
 }
-/*-----------------------------------------------------------------*/
-/* pic14_emitcode - writes the code into a file : for now it is simple    */
-/*-----------------------------------------------------------------*/
-void pic14_emitcode (char *inst,char *fmt, ...)
+
+void DEBUGpic14_emitcode (char *inst,char *fmt, ...)
 {
     va_list ap;
     char lb[INITIAL_INLINEASM];  
     char *lbp = lb;
 
+    if(!debug_verbose)
+      return;
+
     va_start(ap,fmt);   
 
     if (inst && *inst) {
@@ -174,21 +203,42 @@ void pic14_emitcode (char *inst,char *fmt, ...)
     lineCurr->isInline = _G.inLine;
     lineCurr->isDebug  = _G.debugLine;
 
-    if(debug_verbose)
-      addpCode2pBlock(pb,newpCodeCharP(lb));
+    addpCode2pBlock(pb,newpCodeCharP(lb));
 
     va_end(ap);
 }
 
-void DEBUGpic14_emitcode (char *inst,char *fmt, ...)
+
+void emitpLabel(int key)
+{
+  addpCode2pBlock(pb,newpCodeLabel(NULL,key+100+labelOffset));
+}
+
+void emitpcode(PIC_OPCODE poc, pCodeOp *pcop)
+{
+
+  if(pcop)
+    addpCode2pBlock(pb,newpCode(poc,pcop));
+  else
+    DEBUGpic14_emitcode(";","%s  ignoring NULL pcop",__FUNCTION__);
+}
+
+void emitpcodeNULLop(PIC_OPCODE poc)
+{
+
+  addpCode2pBlock(pb,newpCode(poc,NULL));
+
+}
+
+/*-----------------------------------------------------------------*/
+/* pic14_emitcode - writes the code into a file : for now it is simple    */
+/*-----------------------------------------------------------------*/
+void pic14_emitcode (char *inst,char *fmt, ...)
 {
     va_list ap;
     char lb[INITIAL_INLINEASM];  
     char *lbp = lb;
 
-    if(!debug_verbose)
-      return;
-
     va_start(ap,fmt);   
 
     if (inst && *inst) {
@@ -209,7 +259,8 @@ void DEBUGpic14_emitcode (char *inst,char *fmt, ...)
     lineCurr->isInline = _G.inLine;
     lineCurr->isDebug  = _G.debugLine;
 
-    addpCode2pBlock(pb,newpCodeCharP(lb));
+    if(debug_verbose)
+      addpCode2pBlock(pb,newpCodeCharP(lb));
 
     va_end(ap);
 }
@@ -258,8 +309,8 @@ static regs *getFreePtr (iCode *ic, asmop **aopp, bool result)
     if (!r0iu) {
         /* push it if not already pushed */
         if (!_G.r0Pushed) {
-            pic14_emitcode ("push","%s",
-                      pic14_regWithIdx(R0_IDX)->dname);
+         //pic14_emitcode ("push","%s",
+         //          pic14_regWithIdx(R0_IDX)->dname);
             _G.r0Pushed++ ;
         }
         
@@ -274,8 +325,8 @@ static regs *getFreePtr (iCode *ic, asmop **aopp, bool result)
     if (!r1iu) {
         /* push it if not already pushed */
         if (!_G.r1Pushed) {
-            pic14_emitcode ("push","%s",
-                      pic14_regWithIdx(R1_IDX)->dname);
+         //pic14_emitcode ("push","%s",
+         //          pic14_regWithIdx(R1_IDX)->dname);
             _G.r1Pushed++ ;
         }
         
@@ -324,6 +375,44 @@ static void genSetDPTR(int n)
     }
 }
 
+/*-----------------------------------------------------------------*/
+/* resolveIfx - converts an iCode ifx into a form more useful for  */
+/*              generating code                                    */
+/*-----------------------------------------------------------------*/
+static void resolveIfx(resolvedIfx *resIfx, iCode *ifx)
+{
+  if(!resIfx) 
+    return;
+
+  //  DEBUGpic14_emitcode("; ***","%s %d",__FUNCTION__,__LINE__);
+
+  resIfx->condition = 1;    /* assume that the ifx is true */
+  resIfx->generated = 0;    /* indicate that the ifx has not been used */
+
+  if(!ifx) {
+    resIfx->lbl = newiTempLabel(NULL);  /* oops, there is no ifx. so create a label */
+/*
+    DEBUGpic14_emitcode("; ***","%s %d null ifx creating new label key =%d",
+                       __FUNCTION__,__LINE__,resIfx->lbl->key);
+*/
+  } else {
+    if(IC_TRUE(ifx)) {
+      resIfx->lbl = IC_TRUE(ifx);
+    } else {
+      resIfx->lbl = IC_FALSE(ifx);
+      resIfx->condition = 0;
+    }
+/*
+    if(IC_TRUE(ifx)) 
+      DEBUGpic14_emitcode("; ***","ifx true is non-null");
+    if(IC_FALSE(ifx)) 
+      DEBUGpic14_emitcode("; ***","ifx false is non-null");
+*/
+  }
+
+  //  DEBUGpic14_emitcode("; ***","%s lbl->key=%d, (lab offset=%d)",__FUNCTION__,resIfx->lbl->key,labelOffset);
+
+}
 /*-----------------------------------------------------------------*/
 /* pointerCode - returns the code for a pointer type               */
 /*-----------------------------------------------------------------*/
@@ -420,7 +509,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 */
@@ -439,17 +528,34 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result)
        aop->aopu.aop_immd = Safe_calloc(1,strlen(sym->rname)+1);
         strcpy(aop->aopu.aop_immd,sym->rname);
         aop->size = FPTRSIZE; 
+       DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname);
         return aop;
     }
 
 
     /* only remaining is far space */
     /* in which case DPTR gets the address */
+    sym->aop = aop = newAsmop(AOP_PCODE);
+
+    aop->aopu.pcop = popGetImmd(sym->rname,0,0);
+    PCOI(aop->aopu.pcop)->_const = IN_CODESPACE(space);
+    PCOI(aop->aopu.pcop)->index = 0;
+
+    DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d",
+                       __LINE__,sym->rname, 0, PCOI(aop->aopu.pcop)->_const);
+
+    allocDirReg (IC_LEFT(ic));
+
+    aop->size = FPTRSIZE; 
+/*
+    DEBUGpic14_emitcode(";","%d size = %d, name =%s",__LINE__,aop->size,sym->rname);
     sym->aop = aop = newAsmop(AOP_DPTR);
     pic14_emitcode ("mov","dptr,#%s", sym->rname);
     aop->size = getSize(sym->type);
 
     DEBUGpic14_emitcode(";","%d size = %d",__LINE__,aop->size);
+*/
+
     /* if it is in code space */
     if (IN_CODESPACE(space))
         aop->code = 1;
@@ -460,37 +566,58 @@ static asmop *aopForSym (iCode *ic,symbol *sym,bool result)
 /*-----------------------------------------------------------------*/
 /* aopForRemat - rematerialzes an object                           */
 /*-----------------------------------------------------------------*/
-static asmop *aopForRemat (symbol *sym)
-{
-    iCode *ic = sym->rematiCode;
-    asmop *aop = newAsmop(AOP_IMMD);
-    int val = 0;
-    DEBUGpic14_emitcode(";","%s %d",__FUNCTION__,__LINE__);
-    for (;;) {
-       if (ic->op == '+')
-           val += (int) operandLitValue(IC_RIGHT(ic));
-       else if (ic->op == '-')
-           val -= (int) operandLitValue(IC_RIGHT(ic));
-       else
-           break;
+static asmop *aopForRemat (operand *op) // x symbol *sym)
+{
+  symbol *sym = OP_SYMBOL(op);
+  iCode *ic = NULL;
+  asmop *aop = newAsmop(AOP_PCODE);
+  int val = 0;
+  int offset = 0;
+
+  ic = sym->rematiCode;
+
+  DEBUGpic14_emitcode(";","%s %d",__FUNCTION__,__LINE__);
+  if(IS_OP_POINTER(op)) {
+    DEBUGpic14_emitcode(";","%s %d IS_OP_POINTER",__FUNCTION__,__LINE__);
+  }
+  for (;;) {
+    if (ic->op == '+') {
+      val += (int) operandLitValue(IC_RIGHT(ic));
+    } else if (ic->op == '-') {
+      val -= (int) operandLitValue(IC_RIGHT(ic));
+    } else
+      break;
        
-       ic = OP_SYMBOL(IC_LEFT(ic))->rematiCode;
-    }
+    ic = OP_SYMBOL(IC_LEFT(ic))->rematiCode;
+  }
 
-    if (val)
-       sprintf(buffer,"(%s %c 0x%04x)",
-               OP_SYMBOL(IC_LEFT(ic))->rname, 
-               val >= 0 ? '+' : '-',
-               abs(val) & 0xffff);
-    else
-       strcpy(buffer,OP_SYMBOL(IC_LEFT(ic))->rname);
+  offset = OP_SYMBOL(IC_LEFT(ic))->offset;
+  aop->aopu.pcop = popGetImmd(OP_SYMBOL(IC_LEFT(ic))->rname,0,val);
+  PCOI(aop->aopu.pcop)->_const = IS_PTR_CONST(operandType(op));
+  PCOI(aop->aopu.pcop)->index = val;
 
-    //DEBUGpic14_emitcode(";","%s",buffer);
-    aop->aopu.aop_immd = Safe_calloc(1,strlen(buffer)+1);
-    strcpy(aop->aopu.aop_immd,buffer);    
-    return aop;        
+  DEBUGpic14_emitcode(";","%d: rname %s, val %d, const = %d",
+                     __LINE__,OP_SYMBOL(IC_LEFT(ic))->rname,
+                     val, IS_PTR_CONST(operandType(op)));
+
+  //    DEBUGpic14_emitcode(";","aop type  %s",AopType(AOP_TYPE(IC_LEFT(ic))));
+
+  allocDirReg (IC_LEFT(ic));
+
+  return aop;        
 }
 
+int aopIdx (asmop *aop, int offset)
+{
+  if(!aop)
+    return -1;
+
+  if(aop->type !=  AOP_REG)
+    return -2;
+       
+  return aop->aopu.aop_reg[offset]->rIdx;
+
+}
 /*-----------------------------------------------------------------*/
 /* regsInCommon - two operands have some registers in common       */
 /*-----------------------------------------------------------------*/
@@ -608,16 +735,21 @@ 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)) {
-      DEBUGpic14_emitcode(";","%d",__LINE__);
         op->aop = aop = newAsmop(AOP_LIT);
         aop->aopu.aop_lit = op->operand.valOperand;
         aop->size = getSize(operandType(op));
         return;
     }
 
+    {
+      sym_link *type = operandType(op);
+      if(IS_PTR_CONST(type))
+       DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__);
+    }
+
     /* if already has a asmop then continue */
     if (op->aop)
         return ;
@@ -631,9 +763,9 @@ void aopOp (operand *op, iCode *ic, bool result)
 
     /* if this is a true symbol */
     if (IS_TRUE_SYMOP(op)) {    
-      DEBUGpic14_emitcode(";","%d",__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
@@ -649,7 +781,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;
@@ -663,10 +794,11 @@ void aopOp (operand *op, iCode *ic, bool result)
       DEBUGpic14_emitcode(";","%d",__LINE__);
         /* rematerialize it NOW */
         if (sym->remat) {
+
             sym->aop = op->aop = aop =
-                                      aopForRemat (sym);
+                                      aopForRemat (op);
             aop->size = getSize(sym->type);
-           DEBUGpic14_emitcode(";","%d",__LINE__);
+           //DEBUGpic14_emitcode(";"," %d: size %d, %s\n",__LINE__,aop->size,aop->aopu.aop_immd);
             return;
         }
 
@@ -676,29 +808,57 @@ void aopOp (operand *op, iCode *ic, bool result)
             aop->size = getSize(sym->type);
             for ( i = 0 ; i < 2 ; i++ )
                 aop->aopu.aop_str[i] = accUse[i];
-           DEBUGpic14_emitcode(";","%d",__LINE__);
+           DEBUGpic14_emitcode(";","%d size=%d",__LINE__,aop->size);
             return;  
        }
 
         if (sym->ruonly ) {
-            unsigned i;
-            aop = op->aop = sym->aop = newAsmop(AOP_STR);
-            aop->size = getSize(sym->type);
-            for ( i = 0 ; i < fReturnSizePic ; i++ )
-             aop->aopu.aop_str[i] = fReturn[i];
-           DEBUGpic14_emitcode(";","%d",__LINE__);
-            return;
+         /*
+         sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
+         aop->aopu.pcop = popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset);
+         //allocDirReg (IC_LEFT(ic));
+         aop->size = getSize(sym->type);
+         */
+
+         unsigned i;
+
+         aop = op->aop = sym->aop = newAsmop(AOP_STR);
+         aop->size = getSize(sym->type);
+         for ( i = 0 ; i < fReturnSizePic ; i++ )
+           aop->aopu.aop_str[i] = fReturn[i];
+
+         DEBUGpic14_emitcode(";","%d",__LINE__);
+         return;
         }
 
         /* else spill location  */
-       DEBUGpic14_emitcode(";","%s %d %s",__FUNCTION__,__LINE__,sym->usl.spillLoc->rname);
-        sym->aop = op->aop = aop = 
-                                  aopForSym(ic,sym->usl.spillLoc,result);
+       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 sym->rname = %s, offset %d",
+                           __FUNCTION__,__LINE__,
+                           sym->usl.spillLoc->rname,
+                           sym->rname, sym->usl.spillLoc->offset);
+
+       sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
+       //aop->aopu.pcop = popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset);
+       aop->aopu.pcop = popRegFromString(sym->usl.spillLoc->rname, 
+                                         getSize(sym->type), 
+                                         sym->usl.spillLoc->offset);
         aop->size = getSize(sym->type);
+
         return;
     }
 
+    {
+      sym_link *type = operandType(op);
+      if(IS_PTR_CONST(type)) 
+       DEBUGpic14_emitcode(";","%d aop type is const pointer",__LINE__);
+    }
+
     /* must be in a register */
+    DEBUGpic14_emitcode(";","%d register type nRegs=%d",__LINE__,sym->nRegs);
     sym->aop = op->aop = aop = newAsmop(AOP_REG);
     aop->size = sym->nRegs;
     for ( i = 0 ; i < sym->nRegs ;i++)
@@ -727,6 +887,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 ) {
@@ -793,6 +954,7 @@ void freeAsmop (operand *op, asmop *aaop, iCode *ic, bool pop)
             }       
         }
     }
+#endif
 
 dealloc:
     /* all other cases just dealloc */
@@ -885,7 +1047,6 @@ char *aopGet (asmop *aop, int offset, bool bit16, bool dname)
        
        
     case AOP_IMMD:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
        if (bit16) 
            sprintf (s,"%s",aop->aopu.aop_immd);
        else
@@ -896,59 +1057,68 @@ char *aopGet (asmop *aop, int offset, bool bit16, bool dname)
            else
                sprintf(s,"%s",
                        aop->aopu.aop_immd);
+       DEBUGpic14_emitcode(";","%d immd %s",__LINE__,s);
        rs = Safe_calloc(1,strlen(s)+1);
        strcpy(rs,s);   
        return rs;
        
     case AOP_DIR:
-       if (offset)
-           sprintf(s,"(%s + %d)",
-                   aop->aopu.aop_dir,
-                   offset);
-       else
+      if (offset) {
+       sprintf(s,"(%s + %d)",
+               aop->aopu.aop_dir,
+               offset);
+       DEBUGpic14_emitcode(";","oops AOP_DIR did this %s\n",s);
+      } else
            sprintf(s,"%s",aop->aopu.aop_dir);
        rs = Safe_calloc(1,strlen(s)+1);
        strcpy(rs,s);   
        return rs;
        
     case AOP_REG:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
-       if (dname) 
-           return aop->aopu.aop_reg[offset]->dname;
-       else
+      //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);   
        return rs;
        
     case AOP_STR:
-        DEBUGpic14_emitcode(";","%d",__LINE__);
        aop->coff = offset ;
        if (strcmp(aop->aopu.aop_str[offset],"a") == 0 &&
            dname)
            return "acc";
+        DEBUGpic14_emitcode(";","%d - %s",__LINE__, aop->aopu.aop_str[offset]);
        
        return aop->aopu.aop_str[offset];
        
+    case AOP_PCODE:
+      {
+       pCodeOp *pcop = aop->aopu.pcop;
+       DEBUGpic14_emitcode(";","%d: aopGet AOP_PCODE type %s",__LINE__,pCodeOpType(pcop));
+       if(pcop->name) {
+         DEBUGpic14_emitcode(";","%s offset %d",pcop->name,PCOI(pcop)->offset);
+         //sprintf(s,"(%s+0x%02x)", pcop->name,PCOI(aop->aopu.pcop)->offset);
+         sprintf(s,"%s", pcop->name);
+       } else
+         sprintf(s,"0x%02x", PCOI(aop->aopu.pcop)->offset);
+
+      }
+      rs = Safe_calloc(1,strlen(s)+1);
+      strcpy(rs,s);   
+      return rs;
+
     }
 
     werror(E_INTERNAL_ERROR,__FILE__,__LINE__,
@@ -956,12 +1126,46 @@ char *aopGet (asmop *aop, int offset, bool bit16, bool dname)
     exit(0);
 }
 
+
+/*-----------------------------------------------------------------*/
+/* popGetTempReg - create a new temporary pCodeOp                  */
+/*-----------------------------------------------------------------*/
+pCodeOp *popGetTempReg(void)
+{
+
+  pCodeOp *pcop;
+
+  pcop = newpCodeOp(NULL, PO_GPR_TEMP);
+  if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r) {
+    PCOR(pcop)->r->wasUsed=1;
+    PCOR(pcop)->r->isFree=0;
+  }
+
+  return pcop;
+}
+
+/*-----------------------------------------------------------------*/
+/* popGetTempReg - create a new temporary pCodeOp                  */
+/*-----------------------------------------------------------------*/
+void popReleaseTempReg(pCodeOp *pcop)
+{
+
+  if(pcop && pcop->type == PO_GPR_TEMP && PCOR(pcop)->r)
+    PCOR(pcop)->r->isFree = 1;
+
+}
 /*-----------------------------------------------------------------*/
 /* popGetLabel - create a new pCodeOp of type PO_LABEL             */
 /*-----------------------------------------------------------------*/
 pCodeOp *popGetLabel(unsigned int key)
 {
-  return newpCodeOpLabel(key+100+labelOffset);
+
+  DEBUGpic14_emitcode ("; ***","%s  key=%d, label offset %d",__FUNCTION__,key, labelOffset);
+
+  if(key>max_key)
+    max_key = key;
+
+  return newpCodeOpLabel(NULL,key+100+labelOffset);
 }
 
 /*-----------------------------------------------------------------*/
@@ -973,40 +1177,37 @@ pCodeOp *popCopyReg(pCodeOpReg *pc)
 
   pcor = Safe_calloc(1,sizeof(pCodeOpReg) );
   pcor->pcop.type = pc->pcop.type;
-  if(!(pcor->pcop.name = strdup(pc->pcop.name)))
-    fprintf(stderr,"oops %s %d",__FILE__,__LINE__);
+  if(pc->pcop.name) {
+    if(!(pcor->pcop.name = Safe_strdup(pc->pcop.name)))
+      fprintf(stderr,"oops %s %d",__FILE__,__LINE__);
+  } else
+    pcor->pcop.name = NULL;
+
   pcor->r = pc->r;
   pcor->rIdx = pc->rIdx;
+  pcor->r->wasUsed=1;
 
+  //DEBUGpic14_emitcode ("; ***","%s  , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx);
 
   return PCOP(pcor);
 }
-
 /*-----------------------------------------------------------------*/
-/* popCopy - copy a pcode operator                                 */
+/* popGet - asm operator to pcode operator conversion              */
 /*-----------------------------------------------------------------*/
-pCodeOp *popCopyGPR2Bit(pCodeOpReg *pc, int bitval)
+pCodeOp *popGetLit(unsigned int lit)
 {
-  pCodeOp *pcop;
-
-  pcop = Safe_calloc(1,sizeof(pCodeOpBit) );
-  pcop->type = PO_BIT;
-  if(!(pcop->name = strdup(pc->pcop.name)))
-    fprintf(stderr,"oops %s %d",__FILE__,__LINE__);
-  ((pCodeOpBit *)pcop)->bit = bitval;
 
-  ((pCodeOpBit *)pcop)->inBitSpace = 0; //(pc->type == PO_BIT) ? 1 : 0;
-
-  return pcop;
+  return newpCodeOpLit(lit);
 }
 
+
 /*-----------------------------------------------------------------*/
-/* popGet - asm operator to pcode operator conversion              */
+/* popGetImmd - asm operator to pcode immediate conversion         */
 /*-----------------------------------------------------------------*/
-pCodeOp *popGetLit(unsigned int lit)
+pCodeOp *popGetImmd(char *name, unsigned int offset, int index)
 {
 
-  return newpCodeOpLit(lit);
+  return newpCodeOpImmd(name, offset,index, 0);
 }
 
 
@@ -1028,28 +1229,64 @@ pCodeOp *popGetWithString(char *str)
   return pcop;
 }
 
-pCodeOp *popRegFromString(char *str)
+/*-----------------------------------------------------------------*/
+/* popRegFromString -                                              */
+/*-----------------------------------------------------------------*/
+pCodeOp *popRegFromString(char *str, int size, int offset)
 {
 
   pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
-  pcop->type = PO_GPR_REGISTER;
-
-  PCOR(pcop)->rIdx = -1;
-  PCOR(pcop)->r = NULL;
+  pcop->type = PO_DIR;
 
   DEBUGpic14_emitcode(";","%d",__LINE__);
-  pcop->name = Safe_strdup( ( (str) ? str : "BAD STRING"));
+
+  if(!str)
+    str = "BAD_STRING";
+
+  pcop->name = Safe_calloc(1,strlen(str)+1);
+  strcpy(pcop->name,str);
+
+  //pcop->name = Safe_strdup( ( (str) ? str : "BAD STRING"));
+
+  PCOR(pcop)->r = dirregWithName(pcop->name);
+  if(PCOR(pcop)->r == NULL) {
+    //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size);
+    PCOR(pcop)->r = allocRegByName (pcop->name,size);
+    DEBUGpic14_emitcode(";","%d  %s   offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset);
+  } else {
+    DEBUGpic14_emitcode(";","%d  %s   offset=%d",__LINE__,pcop->name,offset);
+  }
+  PCOR(pcop)->instance = offset;
 
   return pcop;
 }
 
+pCodeOp *popRegFromIdx(int rIdx)
+{
+  pCodeOp *pcop;
+
+  DEBUGpic14_emitcode ("; ***","%s,%d  , rIdx=0x%x",
+                      __FUNCTION__,__LINE__,rIdx);
+
+  pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
+
+  PCOR(pcop)->rIdx = rIdx;
+  PCOR(pcop)->r = pic14_regWithIdx(rIdx);
+  PCOR(pcop)->r->isFree = 0;
+  PCOR(pcop)->r->wasUsed = 1;
+
+  pcop->type = PCOR(pcop)->r->pc_type;
+
+
+  return pcop;
+}
 /*-----------------------------------------------------------------*/
 /* 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;
+  //char *s = buffer ;
+    //char *rs;
 
     pCodeOp *pcop;
 
@@ -1069,39 +1306,20 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
     case AOP_DPTR:
     case AOP_DPTR2:
     case AOP_ACC:
-        DEBUGpic14_emitcode(";8051 legacy","%d",__LINE__);
-       pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
-       pcop->type = PO_SFR_REGISTER;
-
-       PCOR(pcop)->rIdx = -1;
-       PCOR(pcop)->r = NULL;
-       // Really nasty hack to check for temporary registers
-
-       pcop->name = Safe_strdup("BAD_REGISTER");
-
-       return pcop;
+        DEBUGpic14_emitcode(";8051 legacy","%d type = %s",__LINE__,AopType(aop->type));
+       return NULL;
        
     case AOP_IMMD:
       DEBUGpic14_emitcode(";","%d",__LINE__);
-       pcop = Safe_calloc(1,sizeof(pCodeOp) );
-       pcop->type = PO_IMMEDIATE;
-       if (bit16) 
-           sprintf (s,"%s",aop->aopu.aop_immd);
-       else
-           if (offset) 
-               sprintf(s,"(%s >> %d)",
-                       aop->aopu.aop_immd,
-                       offset*8);
-           else
-               sprintf(s,"%s",
-                       aop->aopu.aop_immd);
-       pcop->name = Safe_calloc(1,strlen(s)+1);
-       strcpy(pcop->name,s);   
-       return pcop;
-       
+      return popGetImmd(aop->aopu.aop_immd,offset,0);
+
     case AOP_DIR:
-       pcop = Safe_calloc(1,sizeof(pCodeOp) );
+      return popRegFromString(aop->aopu.aop_dir, aop->size, offset);
+#if 0
+       pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
        pcop->type = PO_DIR;
+
+       /*
        if (offset)
            sprintf(s,"(%s + %d)",
                    aop->aopu.aop_dir,
@@ -1110,52 +1328,69 @@ pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
            sprintf(s,"%s",aop->aopu.aop_dir);
        pcop->name = Safe_calloc(1,strlen(s)+1);
        strcpy(pcop->name,s);   
+       */
+       pcop->name = Safe_calloc(1,strlen(aop->aopu.aop_dir)+1);
+       strcpy(pcop->name,aop->aopu.aop_dir);   
+       PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir);
+       if(PCOR(pcop)->r == NULL) {
+         //fprintf(stderr,"%d - couldn't find %s in allocated registers, size =%d\n",__LINE__,aop->aopu.aop_dir,aop->size);
+         PCOR(pcop)->r = allocRegByName (aop->aopu.aop_dir,aop->size);
+         DEBUGpic14_emitcode(";","%d  %s   offset=%d - had to alloc by reg name",__LINE__,pcop->name,offset);
+       } else {
+         DEBUGpic14_emitcode(";","%d  %s   offset=%d",__LINE__,pcop->name,offset);
+       }
+       PCOR(pcop)->instance = offset;
+
        return pcop;
+#endif
        
     case AOP_REG:
       {
        int rIdx = aop->aopu.aop_reg[offset]->rIdx;
 
-       DEBUGpic14_emitcode(";","%d",__LINE__);
        pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
-       pcop->type = PO_GPR_REGISTER;
        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);
+       PCOR(pcop)->r->wasUsed=1;
+       PCOR(pcop)->r->isFree=0;
 
+       PCOR(pcop)->instance = offset;
+       pcop->type = PCOR(pcop)->r->pc_type;
+       //rs = aop->aopu.aop_reg[offset]->name;
+       //DEBUGpic14_emitcode(";","%d regiser idx = %d name =%s",__LINE__,rIdx,rs);
        return pcop;
       }
 
     case AOP_CRY:
-      pcop = newpCodeOpBit(aop->aopu.aop_dir,0);
+      pcop = newpCodeOpBit(aop->aopu.aop_dir,-1,1);
+      PCOR(pcop)->r = dirregWithName(aop->aopu.aop_dir);
+      //if(PCOR(pcop)->r == NULL)
+      //fprintf(stderr,"%d - couldn't find %s in allocated registers\n",__LINE__,aop->aopu.aop_dir);
       return pcop;
        
     case AOP_LIT:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
       return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset));
 
     case AOP_STR:
-      DEBUGpic14_emitcode(";","%d",__LINE__);
+      DEBUGpic14_emitcode(";","%d  %s",__LINE__,aop->aopu.aop_str[offset]);
+      return newpCodeOpRegFromStr(aop->aopu.aop_str[offset]);
+      /*
+      pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
+      PCOR(pcop)->r = allocRegByName(aop->aopu.aop_str[offset]);
+      PCOR(pcop)->rIdx = PCOR(pcop)->r->rIdx;
+      pcop->type = PCOR(pcop)->r->pc_type;
+      pcop->name = PCOR(pcop)->r->name;
 
-      pcop = Safe_calloc(1,sizeof(pCodeOp) );
-      pcop->type = PO_STR;
+      return pcop;
+      */
 
-      //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;
-       
+    case AOP_PCODE:
+      DEBUGpic14_emitcode(";","popGet AOP_PCODE (%s) %d %s",pCodeOpType(aop->aopu.pcop),
+                         __LINE__, 
+                         ((aop->aopu.pcop->name)? (aop->aopu.pcop->name) : "no name"));
+      pcop = pCodeOpCopy(aop->aopu.pcop);
+      PCOI(pcop)->offset = offset;
+      return pcop;
     }
 
     werror(E_INTERNAL_ERROR,__FILE__,__LINE__,
@@ -1182,10 +1417,12 @@ void aopPut (asmop *aop, char *s, int offset)
     /* depending on where it is ofcourse */
     switch (aop->type) {
     case AOP_DIR:
-       if (offset)
-           sprintf(d,"(%s + %d)",
-                   aop->aopu.aop_dir,offset);
-       else
+      if (offset) {
+       sprintf(d,"(%s + %d)",
+               aop->aopu.aop_dir,offset);
+       fprintf(stderr,"oops aopPut:AOP_DIR did this %s\n",s);
+
+      } else
            sprintf(d,"%s",aop->aopu.aop_dir);
        
        if (strcmp(d,s)) {
@@ -1194,17 +1431,24 @@ void aopPut (asmop *aop, char *s, int offset)
            pic14_emitcode("movf","%s,w",s);
          pic14_emitcode("movwf","%s",d);
 
-         if(strcmp(s,"W"))
-           pic14_emitcode(";BUG! should have this:movf","%s,w   %d",s,__LINE__);
-         emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
+         if(strcmp(s,"W")) {
+           pic14_emitcode(";BUG!? should have this:movf","%s,w   %d",s,__LINE__);
+           if(offset >= aop->size) {
+             emitpcode(POC_CLRF,popGet(aop,offset));
+             break;
+           } else
+             emitpcode(POC_MOVLW,popGetImmd(s,offset,0));
+         }
+
+         emitpcode(POC_MOVWF,popGet(aop,offset));
 
 
        }
        break;
        
     case AOP_REG:
-       if (strcmp(aop->aopu.aop_reg[offset]->name,s) != 0 &&
-           strcmp(aop->aopu.aop_reg[offset]->dname,s)!= 0){
+      if (strcmp(aop->aopu.aop_reg[offset]->name,s) != 0) { // &&
+       //strcmp(aop->aopu.aop_reg[offset]->dname,s)!= 0){
          /*
            if (*s == '@'           ||
                strcmp(s,"r0") == 0 ||
@@ -1220,13 +1464,16 @@ void aopPut (asmop *aop, char *s, int offset)
            else
          */
 
-         if(strcmp(s,"W"))
+         if(strcmp(s,"W")==0 )
            pic14_emitcode("movf","%s,w  ; %d",s,__LINE__);
 
          pic14_emitcode("movwf","%s",
                   aop->aopu.aop_reg[offset]->name);
 
-         if(strcmp(s,"W")) {
+         if(strcmp(s,zero)==0) {
+           emitpcode(POC_CLRF,popGet(aop,offset));
+
+         } else if(strcmp(s,"W")==0) {
            pCodeOp *pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
            pcop->type = PO_GPR_REGISTER;
 
@@ -1236,9 +1483,13 @@ void aopPut (asmop *aop, char *s, int offset)
            DEBUGpic14_emitcode(";","%d",__LINE__);
            pcop->name = Safe_strdup(s);
            emitpcode(POC_MOVFW,pcop);
+           emitpcode(POC_MOVWF,popGet(aop,offset));
+         } else if(strcmp(s,one)==0) {
+           emitpcode(POC_CLRF,popGet(aop,offset));
+           emitpcode(POC_INCF,popGet(aop,offset));
+         } else {
+           emitpcode(POC_MOVWF,popGet(aop,offset));
          }
-         emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
-
        }
        break;
        
@@ -1377,6 +1628,25 @@ void aopPut (asmop *aop, char *s, int offset)
 
 }
 
+/*-----------------------------------------------------------------*/
+/* mov2w - generate either a MOVLW or MOVFW based operand type     */
+/*-----------------------------------------------------------------*/
+void mov2w (asmop *aop, int offset)
+{
+
+  if(!aop)
+    return;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d  offset=%d",__FUNCTION__,__LINE__,offset);
+
+  if ( aop->type == AOP_PCODE ||
+       aop->type == AOP_LIT )
+    emitpcode(POC_MOVLW,popGet(aop,offset));
+  else
+    emitpcode(POC_MOVFW,popGet(aop,offset));
+
+}
+
 /*-----------------------------------------------------------------*/
 /* reAdjustPreg - points a register back to where it should        */
 /*-----------------------------------------------------------------*/
@@ -1509,18 +1779,21 @@ int pic14_getDataSize(operand *op)
 /*-----------------------------------------------------------------*/
 void pic14_outAcc(operand *result)
 {
-    int size, offset;
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    size = pic14_getDataSize(result);
-    if(size){
-        aopPut(AOP(result),"a",0);
-        size--;
-        offset = 1;
-        /* unsigned or positive */
-        while(size--){
-            aopPut(AOP(result),zero,offset++);
-        }
-    }
+  int size,offset;
+  DEBUGpic14_emitcode ("; ***","%s  %d - ",__FUNCTION__,__LINE__);
+  DEBUGpic14_AopType(__LINE__,NULL,NULL,result);
+
+
+  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++));
+  }
+
 }
 
 /*-----------------------------------------------------------------*/
@@ -1551,12 +1824,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++));
     }
 }
 
@@ -1566,40 +1837,53 @@ 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) {
+    if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) {
+      emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(ic)),0));
+      emitpcode(POC_XORWF,popGet(AOP(IC_RESULT(ic)),0));
+    } else {
+      emitpcode(POC_CLRF,popGet(AOP(IC_RESULT(ic)),0));
+      emitpcode(POC_BTFSS,popGet(AOP(IC_LEFT(ic)),0));
+      emitpcode(POC_INCF,popGet(AOP(IC_RESULT(ic)),0));
     }
+    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);
 }
 
 
@@ -1675,64 +1959,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);    
 }
 
 /*-----------------------------------------------------------------*/
@@ -1743,7 +2021,7 @@ static void saveRegisters(iCode *lic)
     int i;
     iCode *ic;
     bitVect *rsave;
-    sym_link *detype;
+    sym_link *dtype;
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     /* look for call */
@@ -1758,7 +2036,7 @@ static void saveRegisters(iCode *lic)
 
     /* if the registers have been saved already then
     do nothing */
-    if (ic->regsSaved || (OP_SYMBOL(IC_LEFT(ic))->calleeSave))
+    if (ic->regsSaved || IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type))
         return ;
 
     /* find the registers in use at this time 
@@ -1784,19 +2062,19 @@ static void saveRegisters(iCode *lic)
        pic14_emitcode("mov","%s,r0",spname);
        if (bitVectBitValue(rsave,R0_IDX))
            pic14_emitcode("mov","r0,b");           
-    } else
-       for (i = 0 ; i < pic14_nRegs ; i++) {
-           if (bitVectBitValue(rsave,i))
-               pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname);
-       }
-
-    detype = getSpec(operandType(IC_LEFT(ic)));
-    if (detype        && 
-        (SPEC_BANK(currFunc->etype) != SPEC_BANK(detype)) &&
-       IS_ISR(currFunc->etype) &&
+    }// else
+    //for (i = 0 ; i < pic14_nRegs ; i++) {
+    //    if (bitVectBitValue(rsave,i))
+    // pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname);
+    //}
+
+    dtype = operandType(IC_LEFT(ic));
+    if (currFunc && dtype && 
+        (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
+       IFFUNC_ISISR(currFunc->type) &&
         !ic->bankSaved) 
 
-        saverbank(SPEC_BANK(detype),ic,TRUE);
+        saverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
 }
 /*-----------------------------------------------------------------*/
@@ -1829,11 +2107,11 @@ static void unsaveRegisters (iCode *ic)
        pic14_emitcode("mov","%s,r0",spname);
        if (bitVectBitValue(rsave,R0_IDX))
            pic14_emitcode("mov","r0,b");
-    } else
-       for (i =  pic14_nRegs ; i >= 0 ; i--) {
-           if (bitVectBitValue(rsave,i))
-               pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname);
-       }
+    } //else
+    //for (i =  pic14_nRegs ; i >= 0 ; i--) {
+    //    if (bitVectBitValue(rsave,i))
+    // pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname);
+    //}
 
 }  
 
@@ -1843,6 +2121,7 @@ static void unsaveRegisters (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void pushSide(operand * oper, int size)
 {
+#if 0
        int offset = 0;
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
        while (size--) {
@@ -1855,6 +2134,7 @@ static void pushSide(operand * oper, int size)
                } else
                        pic14_emitcode("push","%s",l);
        }
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -1862,68 +2142,39 @@ static void pushSide(operand * oper, int size)
 /*-----------------------------------------------------------------*/
 static void assignResultValue(operand * oper)
 {
-       int offset = 0;
-       int size = AOP_SIZE(oper);
+  int size = AOP_SIZE(oper);
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    // The last byte in the assignment is in W
-    aopPut(AOP(oper),"W",size-1);
+  DEBUGpic14_AopType(__LINE__,oper,NULL,NULL);
 
-    if(size>1) {
-      while (--size) {
-       aopPut(AOP(oper),fReturn[offset],offset);
-       offset++;
+  if(!GpsuedoStkPtr) {
+    /* The last byte in the assignment is in W */
+    size--;
+    emitpcode(POC_MOVWF, popGet(AOP(oper),size));
+    GpsuedoStkPtr++;
+  }
 
-      }
-    }
+  while (size--) {
+    emitpcode(POC_MOVFW,popRegFromIdx(GpsuedoStkPtr-1 + Gstack_base_addr));
+    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) {
@@ -1951,13 +2202,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);
 
@@ -1977,6 +2221,7 @@ static void genIpush (iCode *ic)
     }       
 
     freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -1984,10 +2229,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 ;
@@ -2000,6 +2246,7 @@ static void genIpop (iCode *ic)
                                    FALSE,TRUE));
 
     freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -2007,6 +2254,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;
@@ -2044,7 +2293,8 @@ static void unsaverbank (int bank,iCode *ic,bool popPsw)
        pic14_emitcode("mov","_spx,%s",r->name);
        freeAsmop(NULL,aop,ic,TRUE);
 
-    } 
+    }
+#endif 
 }
 
 /*-----------------------------------------------------------------*/
@@ -2052,6 +2302,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;
@@ -2090,7 +2342,7 @@ static void saverbank (int bank, iCode *ic, bool pushPsw)
        pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff);
     }
     ic->bankSaved = 1;
-
+#endif
 }
 
 /*-----------------------------------------------------------------*/
@@ -2098,105 +2350,129 @@ static void saverbank (int bank, iCode *ic, bool pushPsw)
 /*-----------------------------------------------------------------*/
 static void genCall (iCode *ic)
 {
-    sym_link *detype;   
+  sym_link *dtype;   
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* if caller saves & we have not saved then */
-    if (!ic->regsSaved)
-        saveRegisters(ic);
+  /* if caller saves & we have not saved then */
+  if (!ic->regsSaved)
+    saveRegisters(ic);
 
-    /* if we are calling a function that is not using
-    the same register bank then we need to save the
-    destination registers on the stack */
-    detype = getSpec(operandType(IC_LEFT(ic)));
-    if (detype        && 
-        (SPEC_BANK(currFunc->etype) != SPEC_BANK(detype)) &&
-       IS_ISR(currFunc->etype) &&
-        !ic->bankSaved) 
+  /* if we are calling a function that is not using
+     the same register bank then we need to save the
+     destination registers on the stack */
+  dtype = operandType(IC_LEFT(ic));
+  if (currFunc && dtype && 
+      (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
+      IFFUNC_ISISR(currFunc->type) &&
+      !ic->bankSaved) 
 
-        saverbank(SPEC_BANK(detype),ic,TRUE);
+    saverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
-    /* if send set is not empty the assign */
-    if (_G.sendSet) {
-       iCode *sic ;
+  /* if send set is not empty the assign */
+  if (_G.sendSet) {
+    iCode *sic;
+    /* For the Pic port, there is no data stack.
+     * So parameters passed to functions are stored
+     * in registers. (The pCode optimizer will get
+     * rid of most of these :).
+     */
+    int psuedoStkPtr=-1; 
+    int firstTimeThruLoop = 1;
 
-       for (sic = setFirstItem(_G.sendSet) ; sic ; 
-            sic = setNextItem(_G.sendSet)) {
-           int size, offset = 0;
+    _G.sendSet = reverseSet(_G.sendSet);
 
-           aopOp(IC_LEFT(sic),sic,FALSE);
-           size = AOP_SIZE(IC_LEFT(sic));
-           while (size--) {
-               char *l = aopGet(AOP(IC_LEFT(sic)),offset,
-                               FALSE,FALSE);
-               DEBUGpic14_emitcode(";","%d - left type %d",__LINE__,AOP(IC_LEFT(sic))->type);
+    /* First figure how many parameters are getting passed */
+    for (sic = setFirstItem(_G.sendSet) ; sic ; 
+        sic = setNextItem(_G.sendSet)) {
 
-               if (strcmp(l,fReturn[offset])) {
+      aopOp(IC_LEFT(sic),sic,FALSE);
+      psuedoStkPtr += AOP_SIZE(IC_LEFT(sic));
+      freeAsmop (IC_LEFT(sic),NULL,sic,FALSE);
+    }
 
-                 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);
+    for (sic = setFirstItem(_G.sendSet) ; sic ; 
+        sic = setNextItem(_G.sendSet)) {
+      int size, offset = 0;
 
-                 // The last one is passed in W
-                 if(size)
-                   pic14_emitcode("movwf","%s",fReturn[offset]);
-               }
-               offset++;
-           }
-           freeAsmop (IC_LEFT(sic),NULL,sic,TRUE);
-       }
-       _G.sendSet = NULL;
-    }
-    /* make the call */
-    emitpcode(POC_CALL,popGetWithString(OP_SYMBOL(IC_LEFT(ic))->rname[0] ?
-                                       OP_SYMBOL(IC_LEFT(ic))->rname :
-                                       OP_SYMBOL(IC_LEFT(ic))->name));
+      aopOp(IC_LEFT(sic),sic,FALSE);
+      size = AOP_SIZE(IC_LEFT(sic));
 
-    pic14_emitcode("call","%s",(OP_SYMBOL(IC_LEFT(ic))->rname[0] ?
-                           OP_SYMBOL(IC_LEFT(ic))->rname :
-                           OP_SYMBOL(IC_LEFT(ic))->name));
+      while (size--) {
+       DEBUGpic14_emitcode ("; ","%d left %s",__LINE__,
+                            AopType(AOP_TYPE(IC_LEFT(sic))));
 
-    /* if we need assign a result value */
-    if ((IS_ITEMP(IC_RESULT(ic)) && 
-         (OP_SYMBOL(IC_RESULT(ic))->nRegs ||
-          OP_SYMBOL(IC_RESULT(ic))->spildir )) ||
-        IS_TRUE_SYMOP(IC_RESULT(ic)) ) {
+       if(!firstTimeThruLoop) {
+         /* 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. */
+         emitpcode(POC_MOVWF,popRegFromIdx(--psuedoStkPtr + Gstack_base_addr));
 
-        _G.accInUse++;
-        aopOp(IC_RESULT(ic),ic,FALSE);
-        _G.accInUse--;
+       }
+       firstTimeThruLoop=0;
 
-       assignResultValue(IC_RESULT(ic));
-               
-        freeAsmop(IC_RESULT(ic),NULL, ic,TRUE);
+       //if (strcmp(l,fReturn[offset])) {
+       mov2w (AOP(IC_LEFT(sic)),  offset);
+/*
+       if ( ((AOP(IC_LEFT(sic))->type) == AOP_PCODE) ||
+            ((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));
+*/
+       //}
+       offset++;
+      }
+      freeAsmop (IC_LEFT(sic),NULL,sic,TRUE);
     }
+    _G.sendSet = NULL;
+  }
+  /* make the call */
+  emitpcode(POC_CALL,popGetWithString(OP_SYMBOL(IC_LEFT(ic))->rname[0] ?
+                                     OP_SYMBOL(IC_LEFT(ic))->rname :
+                                     OP_SYMBOL(IC_LEFT(ic))->name));
+
+  GpsuedoStkPtr=0;
+  /* if we need assign a result value */
+  if ((IS_ITEMP(IC_RESULT(ic)) && 
+       (OP_SYMBOL(IC_RESULT(ic))->nRegs ||
+       OP_SYMBOL(IC_RESULT(ic))->spildir )) ||
+      IS_TRUE_SYMOP(IC_RESULT(ic)) ) {
+
+    _G.accInUse++;
+    aopOp(IC_RESULT(ic),ic,FALSE);
+    _G.accInUse--;
 
-    /* adjust the stack for parameters if 
-    required */
-    if (ic->parmBytes) {
-        int i;
-        if (ic->parmBytes > 3) {
-            pic14_emitcode("mov","a,%s",spname);
-            pic14_emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
-            pic14_emitcode("mov","%s,a",spname);
-        } else 
-            for ( i = 0 ; i <  ic->parmBytes ;i++)
-                pic14_emitcode("dec","%s",spname);
+    assignResultValue(IC_RESULT(ic));
 
-    }
+    DEBUGpic14_emitcode ("; ","%d left %s",__LINE__,
+                        AopType(AOP_TYPE(IC_RESULT(ic))));
+               
+    freeAsmop(IC_RESULT(ic),NULL, ic,TRUE);
+  }
+
+  /* adjust the stack for parameters if 
+     required */
+  if (ic->parmBytes) {
+    int i;
+    if (ic->parmBytes > 3) {
+      pic14_emitcode("mov","a,%s",spname);
+      pic14_emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
+      pic14_emitcode("mov","%s,a",spname);
+    } else 
+      for ( i = 0 ; i <  ic->parmBytes ;i++)
+       pic14_emitcode("dec","%s",spname);
+
+  }
 
-    /* if register bank was saved then pop them */
-    if (ic->bankSaved)
-        unsaverbank(SPEC_BANK(detype),ic,TRUE);
+  /* if register bank was saved then pop them */
+  if (ic->bankSaved)
+    unsaverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
-    /* if we hade saved some registers then unsave them */
-    if (ic->regsSaved && !(OP_SYMBOL(IC_LEFT(ic))->calleeSave))
-        unsaveRegisters (ic);
+  /* if we hade saved some registers then unsave them */
+  if (ic->regsSaved && !IFFUNC_CALLEESAVES(dtype))
+    unsaveRegisters (ic);
 
 
 }
@@ -2206,7 +2482,7 @@ static void genCall (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genPcall (iCode *ic)
 {
-    sym_link *detype;
+    sym_link *dtype;
     symbol *rlbl = newiTempLabel(NULL);
 
 
@@ -2218,11 +2494,11 @@ static void genPcall (iCode *ic)
     /* if we are calling a function that is not using
     the same register bank then we need to save the
     destination registers on the stack */
-    detype = getSpec(operandType(IC_LEFT(ic)));
-    if (detype        && 
-       IS_ISR(currFunc->etype) &&
-        (SPEC_BANK(currFunc->etype) != SPEC_BANK(detype)))
-        saverbank(SPEC_BANK(detype),ic,TRUE);
+    dtype = operandType(IC_LEFT(ic));
+    if (currFunc && dtype && 
+       IFFUNC_ISISR(currFunc->type) &&
+        (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
+        saverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
 
     /* push the return address on to the stack */
@@ -2301,10 +2577,9 @@ static void genPcall (iCode *ic)
     }
 
     /* if register bank was saved then unsave them */
-    if (detype        && 
-        (SPEC_BANK(currFunc->etype) != 
-         SPEC_BANK(detype)))
-        unsaverbank(SPEC_BANK(detype),ic,TRUE);
+    if (currFunc && dtype && 
+        (FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
+        unsaverbank(FUNC_REGBANK(dtype),ic,TRUE);
 
     /* if we hade saved some registers then
     unsave them */
@@ -2318,17 +2593,17 @@ static void genPcall (iCode *ic)
 /*-----------------------------------------------------------------*/
 static int resultRemat (iCode *ic)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    if (SKIP_IC(ic) || ic->op == IFX)
-        return 0;
+  //    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  if (SKIP_IC(ic) || ic->op == IFX)
+    return 0;
 
-    if (IC_RESULT(ic) && IS_ITEMP(IC_RESULT(ic))) {
-        symbol *sym = OP_SYMBOL(IC_RESULT(ic));
-        if (sym->remat && !POINTER_SET(ic)) 
-            return 1;
-    }
+  if (IC_RESULT(ic) && IS_ITEMP(IC_RESULT(ic))) {
+    symbol *sym = OP_SYMBOL(IC_RESULT(ic));
+    if (sym->remat && !POINTER_SET(ic)) 
+      return 1;
+  }
 
-    return 0;
+  return 0;
 }
 
 #if defined(__BORLANDC__) || defined(_MSC_VER)
@@ -2337,11 +2612,13 @@ static int resultRemat (iCode *ic)
 #define STRCASECMP strcasecmp
 #endif
 
+#if 0
 /*-----------------------------------------------------------------*/
 /* inExcludeList - return 1 if the string is in exclude Reg list   */
 /*-----------------------------------------------------------------*/
 static bool inExcludeList(char *s)
 {
+  DEBUGpic14_emitcode ("; ***","%s  %d - WARNING no code generated",__FUNCTION__,__LINE__);
     int i =0;
     
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
@@ -2356,6 +2633,7 @@ static bool inExcludeList(char *s)
     }
     return FALSE ;
 }
+#endif
 
 /*-----------------------------------------------------------------*/
 /* genFunction - generated code for function entry                 */
@@ -2363,11 +2641,13 @@ static bool inExcludeList(char *s)
 static void genFunction (iCode *ic)
 {
     symbol *sym;
-    sym_link *fetype;
+    sym_link *ftype;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    labelOffset += FUNCTION_LABEL_INC;
+    DEBUGpic14_emitcode ("; ***","%s  %d curr label offset=%dprevious max_key=%d ",__FUNCTION__,__LINE__,labelOffset,max_key);
 
+    labelOffset += (max_key+4);
+    max_key=0;
+    GpsuedoStkPtr=0;
     _G.nRegsSaved = 0;
     /* create the function header */
     pic14_emitcode(";","-----------------------------------------");
@@ -2377,19 +2657,19 @@ static void genFunction (iCode *ic)
     pic14_emitcode("","%s:",sym->rname);
     addpCode2pBlock(pb,newpCodeFunction(NULL,sym->rname));
 
-    fetype = getSpec(operandType(IC_LEFT(ic)));
+    ftype = operandType(IC_LEFT(ic));
 
     /* if critical function then turn interrupts off */
-    if (SPEC_CRTCL(fetype))
+    if (IFFUNC_ISCRITICAL(ftype))
         pic14_emitcode("clr","ea");
 
     /* here we need to generate the equates for the
        register bank if required */
 #if 0
-    if (SPEC_BANK(fetype) != rbank) {
+    if (FUNC_REGBANK(ftype) != rbank) {
         int i ;
 
-        rbank = SPEC_BANK(fetype);
+        rbank = FUNC_REGBANK(ftype);
         for ( i = 0 ; i < pic14_nRegs ; i++ ) {
             if (strcmp(regspic14[i].base,"0") == 0)
                 pic14_emitcode("","%s = 0x%02x",
@@ -2406,8 +2686,18 @@ static void genFunction (iCode *ic)
 
     /* if this is an interrupt service routine then
     save acc, b, dpl, dph  */
-    if (IS_ISR(sym->etype)) {
-        
+    if (IFFUNC_ISISR(sym->type)) {
+      addpCode2pBlock(pb,newpCode(POC_GOTO,newpCodeOp("END_OF_INTERRUPT+1",PO_STR)));
+      emitpcodeNULLop(POC_NOP);
+      emitpcodeNULLop(POC_NOP);
+      emitpcodeNULLop(POC_NOP);
+      emitpcode(POC_MOVWF,  popCopyReg(&pc_wsave));
+      emitpcode(POC_SWAPFW, popCopyReg(&pc_status));
+      emitpcode(POC_CLRF,   popCopyReg(&pc_status));
+      emitpcode(POC_MOVWF,  popCopyReg(&pc_ssave));
+
+      pBlockConvert2ISR(pb);
+#if 0  
        if (!inExcludeList("acc"))          
            pic14_emitcode ("push","acc");      
        if (!inExcludeList("b"))
@@ -2433,12 +2723,12 @@ static void genFunction (iCode *ic)
        /* if this isr has no bank i.e. is going to
           run with bank 0 , then we need to save more
           registers :-) */
-       if (!SPEC_BANK(sym->etype)) {
+       if (!FUNC_REGBANK(sym->type)) {
 
            /* if this function does not call any other
               function then we can be economical and
               save only those registers that are used */
-           if (! sym->hasFcall) {
+           if (! IFFUNC_HASFCALL(sym->type)) {
                int i;
 
                /* if any registers used */
@@ -2447,7 +2737,7 @@ static void genFunction (iCode *ic)
                    for ( i = 0 ; i < sym->regsUsed->size ; i++) {
                        if (bitVectBitValue(sym->regsUsed,i) ||
                           (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) )
-                           pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname);                         
+                         pic14_emitcode("push","junk");//"%s",pic14_regWithIdx(i)->dname);                         
                    }
                }
                
@@ -2458,10 +2748,11 @@ static void genFunction (iCode *ic)
                saverbank(0,ic,FALSE);
            }       
        }
+#endif
     } else {
        /* if callee-save to be used for this function
           then save the registers being used in this function */
-       if (sym->calleeSave) {
+       if (IFFUNC_CALLEESAVES(sym->type)) {
            int i;
            
            /* if any registers used */
@@ -2470,7 +2761,7 @@ static void genFunction (iCode *ic)
                for ( i = 0 ; i < sym->regsUsed->size ; i++) {
                    if (bitVectBitValue(sym->regsUsed,i) ||
                       (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) ) {
-                       pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname);
+                     //pic14_emitcode("push","%s",pic14_regWithIdx(i)->dname);
                        _G.nRegsSaved++;
                    }
                }
@@ -2479,12 +2770,12 @@ static void genFunction (iCode *ic)
     }
 
     /* set the register bank to the desired value */
-    if (SPEC_BANK(sym->etype) || IS_ISR(sym->etype)) {
+    if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type)) {
         pic14_emitcode("push","psw");
-        pic14_emitcode("mov","psw,#0x%02x",(SPEC_BANK(sym->etype) << 3)&0x00ff);   
+        pic14_emitcode("mov","psw,#0x%02x",(FUNC_REGBANK(sym->type) << 3)&0x00ff);   
     }
 
-    if (IS_RENT(sym->etype) || options.stackAuto) {
+    if (IFFUNC_ISREENT(sym->type) || options.stackAuto) {
 
        if (options.useXstack) {
            pic14_emitcode("mov","r0,%s",spname);
@@ -2537,7 +2828,7 @@ static void genEndFunction (iCode *ic)
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    if (IS_RENT(sym->etype) || options.stackAuto)
+    if (IFFUNC_ISREENT(sym->type) || options.stackAuto)
     {
         pic14_emitcode ("mov","%s,_bp",spname);
     }
@@ -2552,7 +2843,7 @@ static void genEndFunction (iCode *ic)
     }
 
 
-    if ((IS_RENT(sym->etype) || options.stackAuto)) {
+    if ((IFFUNC_ISREENT(sym->type) || options.stackAuto)) {
        if (options.useXstack) {
            pic14_emitcode("mov","r0,%s",spname);
            pic14_emitcode("movx","a,@r0");
@@ -2566,21 +2857,21 @@ static void genEndFunction (iCode *ic)
     }
 
     /* restore the register bank  */    
-    if (SPEC_BANK(sym->etype) || IS_ISR(sym->etype))
+    if (FUNC_REGBANK(sym->type) || FUNC_ISISR(sym->type))
         pic14_emitcode ("pop","psw");
 
-    if (IS_ISR(sym->etype)) {
+    if (IFFUNC_ISISR(sym->type)) {
 
        /* now we need to restore the registers */
        /* if this isr has no bank i.e. is going to
           run with bank 0 , then we need to save more
           registers :-) */
-       if (!SPEC_BANK(sym->etype)) {
+       if (!FUNC_REGBANK(sym->type)) {
            
            /* if this function does not call any other
               function then we can be economical and
               save only those registers that are used */
-           if (! sym->hasFcall) {
+           if (! IFFUNC_HASFCALL(sym->type)) {
                int i;
                
                /* if any registers used */
@@ -2589,7 +2880,7 @@ static void genEndFunction (iCode *ic)
                    for ( i = sym->regsUsed->size ; i >= 0 ; i--) {
                        if (bitVectBitValue(sym->regsUsed,i) ||
                           (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) )
-                           pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname);
+                         pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname);
                    }
                }
                
@@ -2600,7 +2891,7 @@ static void genEndFunction (iCode *ic)
                unsaverbank(0,ic,FALSE);
            }       
        }
-
+#if 0
        if (options.model == MODEL_FLAT24 && !inExcludeList("dpx"))
        {
            if (options.stack10bit)
@@ -2621,8 +2912,9 @@ static void genEndFunction (iCode *ic)
        if (!inExcludeList("acc"))
            pic14_emitcode ("pop","acc");
 
-        if (SPEC_CRTCL(sym->etype))
+        if (IFFUNC_ISCRITICAL(sym->type))
             pic14_emitcode("setb","ea");
+#endif
 
        /* if debug then send end of function */
 /*     if (options.debug && currFunc) { */
@@ -2639,12 +2931,22 @@ static void genEndFunction (iCode *ic)
        }
        
         pic14_emitcode ("reti","");
+
+       emitpcode(POC_CLRF,   popCopyReg(&pc_status));
+       emitpcode(POC_SWAPFW, popCopyReg(&pc_ssave));
+       emitpcode(POC_MOVWF,  popCopyReg(&pc_status));
+       emitpcode(POC_SWAPF,  popCopyReg(&pc_wsave));
+       emitpcode(POC_SWAPFW, popCopyReg(&pc_wsave));
+       addpCode2pBlock(pb,newpCodeLabel("END_OF_INTERRUPT",-1));
+
+       emitpcodeNULLop(POC_RETFIE);
+
     }
     else {
-        if (SPEC_CRTCL(sym->etype))
+        if (IFFUNC_ISCRITICAL(sym->type))
             pic14_emitcode("setb","ea");
        
-       if (sym->calleeSave) {
+       if (IFFUNC_CALLEESAVES(sym->type)) {
            int i;
            
            /* if any registers used */
@@ -2653,7 +2955,7 @@ static void genEndFunction (iCode *ic)
                for ( i = sym->regsUsed->size ; i >= 0 ; i--) {
                    if (bitVectBitValue(sym->regsUsed,i) ||
                       (pic14_ptrRegReq && (i == R0_IDX || i == R1_IDX)) )
-                       pic14_emitcode("pop","%s",pic14_regWithIdx(i)->dname);
+                     pic14_emitcode("pop","junk");//"%s",pic14_regWithIdx(i)->dname);
                }
            }
            
@@ -2673,7 +2975,7 @@ static void genEndFunction (iCode *ic)
        }
 
         pic14_emitcode ("return","");
-       emitpcode(POC_RETURN,NULL);
+       emitpcodeNULLop(POC_RETURN);
 
        /* Mark the end of a function */
        addpCode2pBlock(pb,newpCodeFunction(NULL,NULL));
@@ -2686,61 +2988,65 @@ static void genEndFunction (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genRet (iCode *ic)
 {
-    int size,offset = 0 , pushed = 0;
+  int size,offset = 0 , pushed = 0;
     
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* if we have no return value then
-       just generate the "ret" */
-    if (!IC_LEFT(ic)) 
-       goto jumpret;       
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* if we have no return value then
+     just generate the "ret" */
+  if (!IC_LEFT(ic)) 
+    goto jumpret;       
     
-    /* we have something to return then
-       move the return value into place */
-    aopOp(IC_LEFT(ic),ic,FALSE);
-    size = AOP_SIZE(IC_LEFT(ic));
+  /* we have something to return then
+     move the return value into place */
+  aopOp(IC_LEFT(ic),ic,FALSE);
+  size = AOP_SIZE(IC_LEFT(ic));
     
-    while (size--) {
-           char *l ;
-           if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR) {
-                   /* #NOCHANGE */
-                   l = aopGet(AOP(IC_LEFT(ic)),offset++,
-                          FALSE,TRUE);
-                   pic14_emitcode("push","%s",l);
-                   pushed++;
-           } else {
-                   l = aopGet(AOP(IC_LEFT(ic)),offset,
-                              FALSE,FALSE);
-                   if (strcmp(fReturn[offset],l)) {
-                     if( ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) ||
-                         ((AOP(IC_LEFT(ic))->type) == AOP_LIT) )
-                       pic14_emitcode("movlw","%s",l);
-                     else
-                       pic14_emitcode("movf","%s,w",l);
-                     if(size)
-                       pic14_emitcode("movwf","%s",fReturn[offset]);
-                     offset++;
-                   }
-           }
-    }    
-
-    if (pushed) {
-       while(pushed) {
-           pushed--;
-           if (strcmp(fReturn[pushed],"a"))
-               pic14_emitcode("pop",fReturn[pushed]);
-           else
-               pic14_emitcode("pop","acc");
+  while (size--) {
+    char *l ;
+    if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR) {
+      /* #NOCHANGE */
+      l = aopGet(AOP(IC_LEFT(ic)),offset++,
+                FALSE,TRUE);
+      pic14_emitcode("push","%s",l);
+      pushed++;
+    } else {
+      l = aopGet(AOP(IC_LEFT(ic)),offset,
+                FALSE,FALSE);
+      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));
+       }else {
+         emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset));
        }
+       if(size) {
+         emitpcode(POC_MOVWF,popRegFromIdx(offset + Gstack_base_addr));
+       }
+       offset++;
+      }
+    }
+  }    
+
+  if (pushed) {
+    while(pushed) {
+      pushed--;
+      if (strcmp(fReturn[pushed],"a"))
+       pic14_emitcode("pop",fReturn[pushed]);
+      else
+       pic14_emitcode("pop","acc");
     }
-    freeAsmop (IC_LEFT(ic),NULL,ic,TRUE);
+  }
+  freeAsmop (IC_LEFT(ic),NULL,ic,TRUE);
     
  jumpret:
-       /* generate a jump to the return label
-          if the next is not the return statement */
-    if (!(ic->next && ic->next->op == LABEL &&
-         IC_LABEL(ic->next) == returnLabel))
+  /* generate a jump to the return label
+     if the next is not the return statement */
+  if (!(ic->next && ic->next->op == LABEL &&
+       IC_LABEL(ic->next) == returnLabel)) {
        
-       pic14_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset);
+    emitpcode(POC_GOTO,popGetLabel(returnLabel->key));
+    pic14_emitcode("goto","_%05d_DS_",returnLabel->key+100 + labelOffset);
+  }
     
 }
 
@@ -2754,7 +3060,7 @@ static void genLabel (iCode *ic)
     if (IC_LABEL(ic) == entryLabel)
         return ;
 
-    emitpLabel(IC_LABEL(ic)->key+100 + labelOffset);
+    emitpLabel(IC_LABEL(ic)->key);
     pic14_emitcode("","_%05d_DS_:",(IC_LABEL(ic)->key+100 + labelOffset));
 }
 
@@ -2764,36 +3070,10 @@ static void genLabel (iCode *ic)
 //tsd
 static void genGoto (iCode *ic)
 {
-    pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset);
+  emitpcode(POC_GOTO,popGetLabel(IC_LABEL(ic)->key));
+  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                           */
@@ -2802,11 +3082,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);
 }
 
 
@@ -2817,83 +3101,103 @@ static void genMultOneByte (operand *left,
                             operand *right,
                             operand *result)
 {
-    sym_link *opetype = operandType(result);
-    char *l ;
-    symbol *lbl ;
-    int size,offset;
+  sym_link *opetype = operandType(result);
+
+  // symbol *lbl ;
+  int size,offset;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+  DEBUGpic14_AopTypeSign(__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){
+    operand *t = right;
+    right = left;
+    left = t;
+  }
+
+  size = AOP_SIZE(result);
+  if(size == 1) {
+
+    if (AOP_TYPE(right) == AOP_LIT){
+      pic14_emitcode("multiply ","lit val:%s by variable %s and store in %s", 
+                    aopGet(AOP(right),0,FALSE,FALSE), 
+                    aopGet(AOP(left),0,FALSE,FALSE), 
+                    aopGet(AOP(result),0,FALSE,FALSE));
+      pic14_emitcode("call","genMultLit");
+    } else {
+      pic14_emitcode("multiply ","variable :%s by variable %s and store in %s", 
+                    aopGet(AOP(right),0,FALSE,FALSE), 
+                    aopGet(AOP(left),0,FALSE,FALSE), 
+                    aopGet(AOP(result),0,FALSE,FALSE));
+      pic14_emitcode("call","genMult8X8_8");
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* (if two literals, the value is computed before) */
-    /* if one literal, literal on the right */
-    if (AOP_TYPE(left) == AOP_LIT){
-        operand *t = right;
-        right = left;
-        left = t;
     }
+    genMult8X8_8 (left, right,result);
+
 
-    size = AOP_SIZE(result);
     /* signed or unsigned */
-    pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE));
-    l = aopGet(AOP(left),0,FALSE,FALSE);
-    MOVA(l);       
-    pic14_emitcode("mul","ab");
+    //pic14_emitcode("mov","b,%s", aopGet(AOP(right),0,FALSE,FALSE));
+    //l = aopGet(AOP(left),0,FALSE,FALSE);
+    //MOVA(l);       
+    //pic14_emitcode("mul","ab");
     /* if result size = 1, mul signed = mul unsigned */
-    aopPut(AOP(result),"a",0);
-    if (size > 1){
-        if (SPEC_USIGN(opetype)){
-            aopPut(AOP(result),"b",1);
-            if (size > 2)
-                /* for filling the MSBs */
-                pic14_emitcode("clr","a");
-        }
-        else{
-            pic14_emitcode("mov","a,b");
+    //aopPut(AOP(result),"a",0);
 
-            /* adjust the MSB if left or right neg */
+  } else {  // (size > 1)
 
-            /* if one literal */
-            if (AOP_TYPE(right) == AOP_LIT){
-                /* AND literal negative */
-                if((int) floatFromVal (AOP(right)->aopu.aop_lit) < 0){
-                    /* adjust MSB (c==0 after mul) */
-                    pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE));
-                }
-            }
-            else{
-                lbl = newiTempLabel(NULL);
-                pic14_emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE));
-                pic14_emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100));
-                pic14_emitcode("","%05d_DS_:",(lbl->key+100));
-                pic14_emitcode("xch","a,%s",aopGet(AOP(right),0,FALSE,FALSE));
-                lbl = newiTempLabel(NULL);      
-                pic14_emitcode("jc","%05d_DS_",(lbl->key+100));          
-                pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE));
-                pic14_emitcode("","%05d_DS_:",(lbl->key+100));
-            }
+    pic14_emitcode("multiply (size>1) ","variable :%s by variable %s and store in %s", 
+                  aopGet(AOP(right),0,FALSE,FALSE), 
+                  aopGet(AOP(left),0,FALSE,FALSE), 
+                  aopGet(AOP(result),0,FALSE,FALSE));
 
-            lbl = newiTempLabel(NULL);
-            pic14_emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE));
-            pic14_emitcode("cjne","a,#0x80,%05d_DS_", (lbl->key+100));
-            pic14_emitcode("","%05d_DS_:",(lbl->key+100));
-            pic14_emitcode("xch","a,%s",aopGet(AOP(left),0,FALSE,FALSE));
-            lbl = newiTempLabel(NULL);      
-            pic14_emitcode("jc","%05d_DS_",(lbl->key+100));          
-            pic14_emitcode("subb","a,%s", aopGet(AOP(right),0,FALSE,FALSE));
-            pic14_emitcode("","%05d_DS_:",(lbl->key+100));
+    if (SPEC_USIGN(opetype)){
+      pic14_emitcode("multiply ","unsigned result. size = %d",AOP_SIZE(result));
+      genUMult8X8_16 (left, right, result, NULL);
 
-            aopPut(AOP(result),"a",1);
-            if(size > 2){
-                /* get the sign */
-                pic14_emitcode("rlc","a");
-                pic14_emitcode("subb","a,acc");
-            }
-        }
-        size -= 2;   
-        offset = 2;
-        if (size > 0)
-            while (size--)
-                aopPut(AOP(result),"a",offset++);
+      if (size > 2) {
+       /* for filling the MSBs */
+       emitpcode(POC_CLRF,  popGet(AOP(result),2));
+       emitpcode(POC_CLRF,  popGet(AOP(result),3));
+      }
     }
+    else{
+      pic14_emitcode("multiply ","signed result. size = %d",AOP_SIZE(result));
+
+      pic14_emitcode("mov","a,b");
+
+      /* adjust the MSB if left or right neg */
+
+      /* if one literal */
+      if (AOP_TYPE(right) == AOP_LIT){
+       pic14_emitcode("multiply ","right is a lit");
+       /* AND literal negative */
+       if((int) floatFromVal (AOP(right)->aopu.aop_lit) < 0){
+         /* adjust MSB (c==0 after mul) */
+         pic14_emitcode("subb","a,%s", aopGet(AOP(left),0,FALSE,FALSE));
+       }
+      }
+      else{
+       genSMult8X8_16 (left, right, result, NULL);
+      }
+
+      if(size > 2){
+       pic14_emitcode("multiply ","size is greater than 2, so propogate sign");
+       /* get the sign */
+       pic14_emitcode("rlc","a");
+       pic14_emitcode("subb","a,acc");
+      }
+    }
+
+    size -= 2;   
+    offset = 2;
+    if (size > 0)
+      while (size--)
+       pic14_emitcode("multiply ","size is way greater than 2, so propogate sign");
+    //aopPut(AOP(result),"a",offset++);
+  }
 }
 
 /*-----------------------------------------------------------------*/
@@ -2911,6 +3215,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 &&
@@ -2926,8 +3232,10 @@ static void genMult (iCode *ic)
         goto release ;
     }
 
-    /* should have been converted to function call */       
-    assert(1) ;
+    pic14_emitcode("multiply ","sizes are greater than 2... need to insert proper algor.");
+
+    /* should have been converted to function call */
+    //assert(0) ;
 
 release :
     freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
@@ -3072,7 +3380,7 @@ static void genDiv (iCode *ic)
     }
 
     /* should have been converted to function call */
-    assert(1);
+    assert(0);
 release :
     freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
     freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
@@ -3206,7 +3514,7 @@ static void genMod (iCode *ic)
     }
 
     /* should have been converted to function call */
-    assert(1);
+    assert(0);
 
 release :
     freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
@@ -3217,6 +3525,9 @@ release :
 /*-----------------------------------------------------------------*/
 /* genIfxJump :- will create a jump depending on the ifx           */
 /*-----------------------------------------------------------------*/
+/*
+  note: May need to add parameter to indicate when a variable is in bit space.
+*/
 static void genIfxJump (iCode *ic, char *jval)
 {
 
@@ -3230,11 +3541,8 @@ static void genIfxJump (iCode *ic, char *jval)
        else if (strcmp(jval,"c") == 0)
          emitSKPC;
        else {
-         //pCodeOp *p = popGetWithString(jval);
-         //p->type = PO_BIT;
-         //emitpcode(POC_BTFSC,  p);
-         emitpcode(POC_BTFSC,  newpCodeOpBit(jval,0));
-       //pic14_emitcode("btfsc","(%s >> 3),(%s & 7)",jval,jval);
+         DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval);         
+         emitpcode(POC_BTFSC,  newpCodeOpBit(jval,-1,1));
        }
 
        emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ic)->key));
@@ -3248,12 +3556,8 @@ static void genIfxJump (iCode *ic, char *jval)
        else if (strcmp(jval,"c") == 0)
          emitSKPNC;
        else {
-         //pCodeOp *p = popGetWithString(jval);
-         //p->type = PO_BIT;
-         //emitpcode(POC_BTFSS,  p);
-         emitpcode(POC_BTFSS,  newpCodeOpBit(jval,0));
-
-       //        pic14_emitcode("btfss","(%s >> 3),(%s & 7)",jval,jval);
+         DEBUGpic14_emitcode ("; ***","%d - assuming %s is in bit space",__LINE__,jval);         
+         emitpcode(POC_BTFSS,  newpCodeOpBit(jval,-1,1));
        }
 
        emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ic)->key));
@@ -3319,26 +3623,35 @@ static void genSkip(iCode *ifx,int status_bit)
 /*-----------------------------------------------------------------*/
 /* genSkipc                                                        */
 /*-----------------------------------------------------------------*/
-static void genSkipc(iCode *ifx, int condition)
+static void genSkipc(resolvedIfx *rifx)
 {
-  if(!ifx)
+  if(!rifx)
     return;
 
-  if(condition)
-    emitSKPNC;
-  else
+  if(rifx->condition)
     emitSKPC;
-
-  if ( IC_TRUE(ifx) )
-    emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
   else
-    emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
+    emitSKPNC;
 
-  if ( IC_TRUE(ifx) )
-    pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset);
+  emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+  rifx->generated = 1;
+}
+
+/*-----------------------------------------------------------------*/
+/* genSkipz2                                                       */
+/*-----------------------------------------------------------------*/
+static void genSkipz2(resolvedIfx *rifx, int invert_condition)
+{
+  if(!rifx)
+    return;
+
+  if( (rifx->condition ^ invert_condition) & 1)
+    emitSKPZ;
   else
-    pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset);
+    emitSKPNZ;
 
+  emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+  rifx->generated = 1;
 }
 
 /*-----------------------------------------------------------------*/
@@ -3365,16 +3678,99 @@ 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                       */
 /*-----------------------------------------------------------------*/
 static void genCmp (operand *left,operand *right,
                     operand *result, iCode *ifx, int sign)
 {
-  int size, offset = 0 ;
+  int size; //, offset = 0 ;
   unsigned long lit = 0L,i = 0;
-
+  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(&rFalseIfx,ifx);
+  truelbl  = newiTempLabel(NULL);
+  size = max(AOP_SIZE(left),AOP_SIZE(right));
+
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+
+#define _swapp
+
+  /* if literal is on the right then swap with left */
+  if ((AOP_TYPE(right) == AOP_LIT)) {
+    operand *tmp = right ;
+    unsigned long mask = (0x100 << (8*(size-1))) - 1;
+    lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
+#ifdef _swapp
+
+    lit = (lit - 1) & mask;
+    right = left;
+    left = tmp;
+    rFalseIfx.condition ^= 1;
+#endif
+
+  } else if ((AOP_TYPE(left) == AOP_LIT)) {
+    lit = (unsigned long)floatFromVal(AOP(left)->aopu.aop_lit);
+  }
+
+
+  //if(IC_TRUE(ifx) == NULL)
   /* if left & right are bit variables */
   if (AOP_TYPE(left) == AOP_CRY &&
       AOP_TYPE(right) == AOP_CRY ) {
@@ -3384,278 +3780,948 @@ static void genCmp (operand *left,operand *right,
     /* subtract right from left if at the
        end the carry flag is set then we know that
        left is greater than right */
-    size = max(AOP_SIZE(left),AOP_SIZE(right));
 
-    /* if unsigned char cmp with lit, do cjne left,#right,zz */
-    if((size == 1) && !sign &&
-       (AOP_TYPE(right) == AOP_LIT && AOP_TYPE(left) != AOP_DIR )){
-      symbol *lbl  = newiTempLabel(NULL);
-      pic14_emitcode("cjne","%s,%s,%05d_DS_",
-              aopGet(AOP(left),offset,FALSE,FALSE),
-              aopGet(AOP(right),offset,FALSE,FALSE),
-              lbl->key+100);
-      pic14_emitcode("","%05d_DS_:",lbl->key+100);
-    } else {
+    //    {
 
-      if(AOP_TYPE(right) == AOP_LIT) {
+    symbol *lbl  = newiTempLabel(NULL);
 
-       DEBUGpic14_emitcode(";right lit","%d",sign);
+#ifndef _swapp
+    if(AOP_TYPE(right) == AOP_LIT) {
 
-       lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
-       //default:
-       while(size--) {
-         i = (lit >> (size*8)) & 0xff;
-         if(i == 0) {
-           emitpcode(POC_MOVFW, popGet(AOP(left),size,FALSE,FALSE));
-           pic14_emitcode("movf","%s,w",aopGet(AOP(left),size,FALSE,FALSE));
-           genSkipz(ifx,IC_TRUE(ifx) == NULL);
-         } else {
-           emitpcode(POC_MOVLW, popGetLit(i));
-           emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE));
+      //lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
 
-           pic14_emitcode("movlw","0x%x",i);
-           pic14_emitcode("subwf","%s,w",aopGet(AOP(left),size,FALSE,FALSE));
-           genSkipc(ifx,IC_TRUE(ifx) == NULL);
-         }
+      DEBUGpic14_emitcode(";right lit","lit = 0x%x,sign=%d",lit,sign);
 
-       }
-       ifx->generated = 1;
-       return;
-      }
-      if(AOP_TYPE(left) == AOP_LIT) {
+      /* special cases */
 
-       DEBUGpic14_emitcode(";left lit","%d",sign);
+      if(lit == 0) {
 
-       lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit))+1;
+       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));
 
-       //default:
-       while(size--) {
-         i = (lit >> (size*8)) & 0xff;
-         if(i == 0) {
-           emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE));
-           pic14_emitcode("movf","%s,w",aopGet(AOP(right),size,FALSE,FALSE));
-           genSkipz(ifx,IC_TRUE(ifx) != NULL);
-         } else if( i == 1 ) {
-           emitpcode(POC_DECFW, popGet(AOP(right),size,FALSE,FALSE));
-           pic14_emitcode("decf","%s,w",aopGet(AOP(right),size,FALSE,FALSE));
-           genSkipz(ifx,IC_TRUE(ifx) != NULL);
+       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,0);
          } else {
-           emitpcode(POC_MOVLW, popGetLit(i));
-           emitpcode(POC_SUBFW, popGet(AOP(right),size,FALSE,FALSE));
+           emitpcode(POC_ADDLW, popGetLit(0x80));
+           emitpcode(POC_ADDLW, popGetLit(i^0x80));
+           genSkipc(&rFalseIfx);
+         }
 
-           pic14_emitcode("movlw","0x%x",i);
-           pic14_emitcode("subwf","%s,w",aopGet(AOP(right),size,FALSE,FALSE));
-           genSkipc(ifx,IC_TRUE(ifx) != NULL);
+       } else {
+         if(lit == 1) {
+           genSkipz2(&rFalseIfx,1);
+         } else {
+           emitpcode(POC_ADDLW, popGetLit(i));
+           genSkipc(&rFalseIfx);
          }
        }
-       ifx->generated = 1;
+
+       if(ifx) ifx->generated = 1;
        return;
       }
 
+      /* chars are out of the way. now do ints and longs */
 
-      // 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));//++
+      DEBUGpic14_emitcode(";right lit","line = %d",__LINE__);
+       
+      /* special cases */
 
-      emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
-      emitpcode(POC_SUBFW, popGet(AOP(left),offset++,FALSE,FALSE));
+      if(sign) {
 
-      size--;
-      while (size--) {
+       if(lit == 0) {
+         genSkipCond(&rFalseIfx,left,size,7);
+         if(ifx) ifx->generated = 1;
+         return;
+       }
 
-       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));
+       if(lit <0x100) {
+         DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
 
-/*
-       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++;
-      }
-    }
-  }
+         //rFalseIfx.condition ^= 1;
+         //genSkipCond(&rFalseIfx,left,size,7);
+         //rFalseIfx.condition ^= 1;
 
-  //release:
-  if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) {
-    pic14_outBitC(result);
-  } else {
-    /* if the result is used in the next
-       ifx conditional branch then generate
-       code a little differently */
-    if (ifx )
-      genIfxJump (ifx,"c");
-    else
-      pic14_outBitC(result);
-    /* leave the result in acc */
-  }
+         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));
 
-/*-----------------------------------------------------------------*/
-/* genCmpGt :- greater than comparison                             */
-/*-----------------------------------------------------------------*/
-static void genCmpGt (iCode *ic, iCode *ifx)
-{
-    operand *left, *right, *result;
-    sym_link *letype , *retype;
-    int sign ;
+         while(size > 1)
+           emitpcode(POC_IORFW, popGet(AOP(left),size--));
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    left = IC_LEFT(ic);
-    right= IC_RIGHT(ic);
-    result = IC_RESULT(ic);
+         if(rFalseIfx.condition) {
+           emitSKPZ;
+           emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
 
-    letype = getSpec(operandType(left));
-    retype =getSpec(operandType(right));
-    sign =  !(SPEC_USIGN(letype) | SPEC_USIGN(retype));
-    /* assign the amsops */
-    aopOp (left,ic,FALSE);
-    aopOp (right,ic,FALSE);
-    aopOp (result,ic,TRUE);
+         } else {
+           emitSKPNZ;
+         }
 
-    genCmp(right, left, result, ifx, sign);
+         genSkipc(&rFalseIfx);
+         emitpLabel(truelbl->key);
+         if(ifx) ifx->generated = 1;
+         return;
 
-    freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(result,NULL,ic,TRUE); 
-}
+       }
 
-/*-----------------------------------------------------------------*/
-/* genCmpLt - less than comparisons                                */
-/*-----------------------------------------------------------------*/
-static void genCmpLt (iCode *ic, iCode *ifx)
-{
-    operand *left, *right, *result;
-    sym_link *letype , *retype;
-    int sign ;
+       if(size == 1) {
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    left = IC_LEFT(ic);
-    right= IC_RIGHT(ic);
-    result = IC_RESULT(ic);
+         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);
 
-    letype = getSpec(operandType(left));
-    retype =getSpec(operandType(right));
-    sign =  !(SPEC_USIGN(letype) | SPEC_USIGN(retype));
 
-    /* assign the amsops */
-    aopOp (left,ic,FALSE);
-    aopOp (right,ic,FALSE);
-    aopOp (result,ic,TRUE);
+           if(ifx) ifx->generated = 1;
+           return;
 
-    genCmp(left, right, result, ifx, sign);
+         }
+       } 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);
 
-    freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-    freeAsmop(result,NULL,ic,TRUE); 
-}
 
-/*-----------------------------------------------------------------*/
-/* gencjneshort - compare and jump if not equal                    */
-/*-----------------------------------------------------------------*/
-static void gencjneshort(operand *left, operand *right, symbol *lbl)
-{
-    int size = max(AOP_SIZE(left),AOP_SIZE(right));
-    int offset = 0;
-    unsigned long lit = 0L;
+           if(ifx) ifx->generated = 1;
+           return;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* if the left side is a literal or 
-    if the right is in a pointer register and left 
-    is not */
-    if ((AOP_TYPE(left) == AOP_LIT) || 
-        (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) {
-        operand *t = right;
-        right = left;
-        left = t;
-    }
-    if(AOP_TYPE(right) == AOP_LIT)
-        lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
+         }
 
-    /* if the right side is a literal then anything goes */
-    if (AOP_TYPE(right) == AOP_LIT &&
-        AOP_TYPE(left) != AOP_DIR ) {
-        while (size--) {
-         if(lit & 0xff) {
-           pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-           pic14_emitcode("xorlw","0x%x",lit & 0xff);
-         } else
-           pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+       }
 
-         emitSKPNZ;
-         pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
-         offset++;
-         lit >>= 8;
-        }
-    }
 
-    /* if the right side is in a register or in direct space or
-    if the left is a pointer register & right is not */    
-    else if (AOP_TYPE(right) == AOP_REG ||
-             AOP_TYPE(right) == AOP_DIR || 
-             (AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) ||
-             (IS_AOP_PREG(left) && !IS_AOP_PREG(right))) {
-        while (size--) {
-         if((AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) &&
-            ( (lit & 0xff) != 0)) {
-           pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-           pic14_emitcode("xorlw","0x%x",lit & 0xff);
-           lit >>= 8;
-         } else
-           pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+       if(lit & (0x80 << (size*8))) {
+         /* lit is negative */
+         DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
 
-         emitSKPZ;
-         pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
-         offset++;
-/*
-            MOVA(aopGet(AOP(left),offset,FALSE,FALSE));
-            if((AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) &&
-               ((unsigned int)((lit >> (offset*8)) & 0x0FFL) == 0))
-                pic14_emitcode("jnz","%05d_DS_",lbl->key+100);
-            else
-                pic14_emitcode("cjne","a,%s,%05d_DS_",
-                         aopGet(AOP(right),offset,FALSE,TRUE),
-                         lbl->key+100);
-            offset++;
-*/
-        }
-    } else {
-        /* right is a pointer reg need both a & b */
-        while(size--) {
-            char *l = aopGet(AOP(left),offset,FALSE,FALSE);
-            if(strcmp(l,"b"))
-                pic14_emitcode("mov","b,%s",l);
-            MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
-            pic14_emitcode("cjne","a,b,%05d_DS_",lbl->key+100);    
-            offset++;
-        }
-    }
-}
+         //genSkipCond(&rFalseIfx,left,size,7);
 
-/*-----------------------------------------------------------------*/
-/* gencjne - compare and jump if not equal                         */
-/*-----------------------------------------------------------------*/
-static void gencjne(operand *left, operand *right, symbol *lbl)
-{
-    symbol *tlbl  = newiTempLabel(NULL);
+         emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    gencjneshort(left, right, lbl);
+         if(rFalseIfx.condition)
+           emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+         else
+           emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
 
-    pic14_emitcode("mov","a,%s",one);
-    pic14_emitcode("sjmp","%05d_DS_",tlbl->key+100);
-    pic14_emitcode("","%05d_DS_:",lbl->key+100);
-    pic14_emitcode("clr","a");
-    pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+
+       } 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));
+
+       }
+
+       /*
+         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;
+
+
+      }
+
+
+      /* 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);
+
+
+      /* 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;
+
+
+    }
+#endif  // _swapp
+
+    if(AOP_TYPE(left) == AOP_LIT) {
+      //symbol *lbl = newiTempLabel(NULL);
+
+      //EXPERIMENTAL lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit));
+
+
+      DEBUGpic14_emitcode(";left lit","lit = 0x%x,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));
+
+       genSkipz2(&rFalseIfx,0);
+       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) {
+         /* signed comparisons to a literal byte */
+
+         int lp1 = (lit+1) & 0xff;
+
+         DEBUGpic14_emitcode(";left lit","line = %d lit = 0x%x",__LINE__,lit);
+         switch (lp1) {
+         case 0:
+           rFalseIfx.condition ^= 1;
+           genSkipCond(&rFalseIfx,right,0,7);
+           break;
+         case 0x7f:
+           emitpcode(POC_MOVFW, popGet(AOP(right),0));
+           emitpcode(POC_XORLW, popGetLit(0x7f));
+           genSkipz2(&rFalseIfx,1);
+           break;
+         default:
+           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);
+           break;
+         }
+       } else {
+         /* unsigned comparisons to a literal byte */
+
+         switch(lit & 0xff ) {
+         case 0:
+           emitpcode(POC_MOVFW, popGet(AOP(right),0));
+           genSkipz2(&rFalseIfx,0);
+           break;
+         case 0x7f:
+           rFalseIfx.condition ^= 1;
+           genSkipCond(&rFalseIfx,right,0,7);
+           break;
+
+         default:
+           emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff));
+           emitpcode(POC_SUBFW, popGet(AOP(right),0));
+           DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+           rFalseIfx.condition ^= 1;
+           if (AOP_TYPE(result) == AOP_CRY)
+             genSkipc(&rFalseIfx);
+           else {
+             emitpcode(POC_CLRF, popGet(AOP(result),0));
+             emitpcode(POC_RLF, popGet(AOP(result),0));
+           }         
+           break;
+         }
+       }
+
+       if(ifx) ifx->generated = 1;
+       //goto check_carry;
+       return;
+
+      } else {
+
+       /* Size is greater than 1 */
+
+       if(sign) {
+         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((size == 1) &&  (0 == (lp1&0xff))) {
+           /* lower byte of signed word is zero */
+           DEBUGpic14_emitcode(";left lit","line = %d  0x%x+1 low byte is zero",__LINE__,lit);
+           i = ((lp1 >> 8) & 0xff) ^0x80;
+           emitpcode(POC_MOVFW, popGet(AOP(right),size));
+           emitpcode(POC_ADDLW, popGetLit( 0x80));
+           emitpcode(POC_ADDLW, popGetLit(0x100-i));
+           rFalseIfx.condition ^= 1;
+           genSkipc(&rFalseIfx);
+
+
+           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(rFalseIfx.condition)
+             emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+           else
+             emitpcode(POC_GOTO,  popGetLabel(rFalseIfx.lbl->key));
+
+         }
+
+
+         emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff));
+         emitpcode(POC_SUBFW, popGet(AOP(right),size));
+
+         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;
+         // end of if (sign)
+       } else {
+
+         /* compare word or long to an unsigned literal on the right.*/
+
+
+         size--;
+         if(lit < 0xff) {
+           DEBUGpic14_emitcode ("; ***","%s  %d lit =0x%x < 0xff",__FUNCTION__,__LINE__,lit);
+           switch (lit) {
+           case 0:
+             break; /* handled above */
+/*
+           case 0xff:
+             emitpcode(POC_MOVFW, popGet(AOP(right),size));
+             while(size--)
+               emitpcode(POC_IORFW, popGet(AOP(right),size));
+             genSkipz2(&rFalseIfx,0);
+             break;
+*/
+           default:
+             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));
+             else
+               emitpcode(POC_GOTO,  popGetLabel(truelbl->key));
+
+
+             emitpcode(POC_MOVLW, popGetLit(lit+1));
+             emitpcode(POC_SUBFW, popGet(AOP(right),0));
+
+             rFalseIfx.condition ^= 1;
+             genSkipc(&rFalseIfx);
+           }
+
+           emitpLabel(truelbl->key);
+
+           if(ifx) ifx->generated = 1;
+           return;
+         }
+
+
+         lit++;
+         DEBUGpic14_emitcode ("; ***","%s  %d lit =0x%x",__FUNCTION__,__LINE__,lit);
+         i = (lit >> (size*8)) & 0xff;
+
+         emitpcode(POC_MOVLW, popGetLit(i));
+         emitpcode(POC_SUBFW, popGet(AOP(right),size));
+
+         while(size--) {
+           i = (lit >> (size*8)) & 0xff;
+
+           if(i) {
+             emitpcode(POC_MOVLW, popGetLit(i));
+             emitSKPNZ;
+             emitpcode(POC_SUBFW, popGet(AOP(right),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(right),size));
+           }
+         }
+
+
+         emitpLabel(lbl->key);
+
+         rFalseIfx.condition ^= 1;
+         genSkipc(&rFalseIfx);
+       }
+
+       if(sign)
+         emitpLabel(truelbl->key);
+       if(ifx) ifx->generated = 1;
+       return;
+      }
+    }
+    /* Compare two variables */
+
+    DEBUGpic14_emitcode(";sign","%d",sign);
+
+    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),size));
+      emitpcode(POC_SUBFW, popGet(AOP(left),size));
+    }
+
+
+    /* 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));
+
+
+    }
+
+    emitpLabel(lbl->key);
+
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    if ((AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) || 
+       (AOP_TYPE(result) == AOP_REG)) {
+      emitpcode(POC_CLRF, popGet(AOP(result),0));
+      emitpcode(POC_RLF, popGet(AOP(result),0));
+    } else {
+      genSkipc(&rFalseIfx);
+    }        
+    //genSkipc(&rFalseIfx);
+    if(ifx) ifx->generated = 1;
+
+    return;
+
+  }
+
+  // check_carry:
+  if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) {
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    pic14_outBitC(result);
+  } else {
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    /* if the result is used in the next
+       ifx conditional branch then generate
+       code a little differently */
+    if (ifx )
+      genIfxJump (ifx,"c");
+    else
+      pic14_outBitC(result);
+    /* leave the result in acc */
+  }
+
+}
+
+/*-----------------------------------------------------------------*/
+/* genCmpGt :- greater than comparison                             */
+/*-----------------------------------------------------------------*/
+static void genCmpGt (iCode *ic, iCode *ifx)
+{
+    operand *left, *right, *result;
+    sym_link *letype , *retype;
+    int sign ;
+
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    left = IC_LEFT(ic);
+    right= IC_RIGHT(ic);
+    result = IC_RESULT(ic);
+
+    letype = getSpec(operandType(left));
+    retype =getSpec(operandType(right));
+    sign =  !(SPEC_USIGN(letype) | SPEC_USIGN(retype));
+    /* assign the amsops */
+    aopOp (left,ic,FALSE);
+    aopOp (right,ic,FALSE);
+    aopOp (result,ic,TRUE);
+
+    genCmp(right, left, result, ifx, sign);
+
+    freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+    freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+    freeAsmop(result,NULL,ic,TRUE); 
+}
+
+/*-----------------------------------------------------------------*/
+/* genCmpLt - less than comparisons                                */
+/*-----------------------------------------------------------------*/
+static void genCmpLt (iCode *ic, iCode *ifx)
+{
+    operand *left, *right, *result;
+    sym_link *letype , *retype;
+    int sign ;
+
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    left = IC_LEFT(ic);
+    right= IC_RIGHT(ic);
+    result = IC_RESULT(ic);
+
+    letype = getSpec(operandType(left));
+    retype =getSpec(operandType(right));
+    sign =  !(SPEC_USIGN(letype) | SPEC_USIGN(retype));
+
+    /* assign the amsops */
+    aopOp (left,ic,FALSE);
+    aopOp (right,ic,FALSE);
+    aopOp (result,ic,TRUE);
+
+    genCmp(left, right, result, ifx, sign);
+
+    freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+    freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+    freeAsmop(result,NULL,ic,TRUE); 
+}
+
+/*-----------------------------------------------------------------*/
+/* genc16bit2lit - compare a 16 bit value to a literal             */
+/*-----------------------------------------------------------------*/
+static void genc16bit2lit(operand *op, int lit, int offset)
+{
+  int i;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d, lit = %d",__FUNCTION__,__LINE__,lit);
+  if( (lit&0xff) == 0) 
+    i=1;
+  else
+    i=0;
+
+  switch( BYTEofLONG(lit,i)) { 
+  case 0:
+    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
+    break;
+  case 1:
+    emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
+    break;
+  case 0xff:
+    emitpcode(POC_INCFW,popGet(AOP(op),offset+i));
+    break;
+  default:
+    emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
+    emitpcode(POC_XORLW,popGetLit(BYTEofLONG(lit,i)));
+  }
+
+  i ^= 1;
+
+  switch( BYTEofLONG(lit,i)) { 
+  case 0:
+    emitpcode(POC_IORFW,popGet(AOP(op),offset+i));
+    break;
+  case 1:
+    emitSKPNZ;
+    emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
+    break;
+  case 0xff:
+    emitSKPNZ;
+    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));
+
+  }
+
+}
+
+/*-----------------------------------------------------------------*/
+/* gencjneshort - compare and jump if not equal                    */
+/*-----------------------------------------------------------------*/
+static void gencjne(operand *left, operand *right, operand *result, iCode *ifx)
+{
+  int size = max(AOP_SIZE(left),AOP_SIZE(right));
+  int offset = 0;
+  int res_offset = 0;  /* the result may be a different size then left or right */
+  int res_size = AOP_SIZE(result);
+  resolvedIfx rIfx;
+  symbol *lbl;
+
+  unsigned long lit = 0L;
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+  if(result)
+    DEBUGpic14_emitcode ("; ***","%s  %d result is not null",__FUNCTION__,__LINE__);
+  resolveIfx(&rIfx,ifx);
+  lbl =  newiTempLabel(NULL);
+
+
+  /* if the left side is a literal or 
+     if the right is in a pointer register and left 
+     is not */
+  if ((AOP_TYPE(left) == AOP_LIT) || 
+      (IS_AOP_PREG(right) && !IS_AOP_PREG(left))) {
+    operand *t = right;
+    right = left;
+    left = t;
+  }
+  if(AOP_TYPE(right) == AOP_LIT)
+    lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
+
+  /* if the right side is a literal then anything goes */
+  if (AOP_TYPE(right) == AOP_LIT &&
+      AOP_TYPE(left) != AOP_DIR ) {
+    switch(size) {
+    case 2:
+      genc16bit2lit(left, lit, 0);
+      emitSKPNZ;
+      emitpcode(POC_GOTO,popGetLabel(lbl->key));
+      break;
+    default:
+      while (size--) {
+       if(lit & 0xff) {
+         emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+         emitpcode(POC_XORLW,popGetLit(lit & 0xff));
+       } else {
+         emitpcode(POC_MOVF,popGet(AOP(left),offset));
+       }
+
+       emitSKPNZ;
+       emitpcode(POC_GOTO,popGetLabel(lbl->key));
+       offset++;
+       if(res_offset < res_size-1)
+         res_offset++;
+       lit >>= 8;
+      }
+      break;
+    }
+  }
+
+  /* if the right side is in a register or in direct space or
+     if the left is a pointer register & right is not */    
+  else if (AOP_TYPE(right) == AOP_REG ||
+          AOP_TYPE(right) == AOP_DIR || 
+          (AOP_TYPE(left) == AOP_DIR && AOP_TYPE(right) == AOP_LIT) ||
+          (IS_AOP_PREG(left) && !IS_AOP_PREG(right))) {
+    //int lbl_key = (rIfx.condition) ? rIfx.lbl->key : lbl->key;
+    int lbl_key = lbl->key;
+
+    if(result) {
+      emitpcode(POC_CLRF,popGet(AOP(result),res_offset));
+      //emitpcode(POC_INCF,popGet(AOP(result),res_offset));
+    }else {
+      DEBUGpic14_emitcode ("; ***","%s  %d -- ERROR",__FUNCTION__,__LINE__);
+      fprintf(stderr, "%s  %d error - expecting result to be non_null\n",
+             __FUNCTION__,__LINE__);
+      return;
+    }
+
+/*     switch(size) { */
+/*     case 2: */
+/*       genc16bit2lit(left, lit, 0); */
+/*       emitSKPNZ; */
+/*       emitpcode(POC_GOTO,popGetLabel(lbl->key)); */
+/*       break; */
+/*     default: */
+    while (size--) {
+      int emit_skip=1;
+      if((AOP_TYPE(left) == AOP_DIR) && 
+        ((AOP_TYPE(right) == AOP_REG) || (AOP_TYPE(right) == AOP_DIR))) {
+
+       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));
+         break;
+       case 1:
+         emitpcode(POC_DECFSZW,popGet(AOP(left),offset));
+         emitpcode(POC_INCF,popGet(AOP(result),res_offset));
+         //emitpcode(POC_GOTO,popGetLabel(lbl->key));
+         emit_skip=0;
+         break;
+       case 0xff:
+         emitpcode(POC_INCFSZW,popGet(AOP(left),offset));
+         //emitpcode(POC_INCF,popGet(AOP(result),res_offset));
+         //emitpcode(POC_INCFSZW,popGet(AOP(left),offset));
+         emitpcode(POC_GOTO,popGetLabel(lbl_key));
+         emit_skip=0;
+         break;
+       default:
+         emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+         emitpcode(POC_XORLW,popGetLit(lit & 0xff));
+       }
+       lit >>= 8;
+
+      } else {
+       emitpcode(POC_MOVF,popGet(AOP(left),offset));
+      }
+      if(emit_skip) {
+       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)
+           emitSKPZ;
+         else
+           emitSKPNZ;
+         emitpcode(POC_GOTO,popGetLabel(lbl_key));
+         //emitpcode(POC_INCF,popGet(AOP(result),res_offset));
+       }
+       if(ifx)
+         ifx->generated=1;
+      }
+      emit_skip++;
+      offset++;
+      if(res_offset < res_size-1)
+       res_offset++;
+    }
+/*       break; */
+/*     } */
+  } else if(AOP_TYPE(right) == AOP_REG &&
+           AOP_TYPE(left) != AOP_DIR){
+
+    while(size--) {
+      emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+      emitpcode(POC_XORFW,popGet(AOP(right),offset));
+      pic14_emitcode(";***","%s  %d",__FUNCTION__,__LINE__);
+      if(rIfx.condition)
+       emitSKPNZ;
+      else
+       emitSKPZ;
+      emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+      offset++;
+      if(res_offset < res_size-1)
+       res_offset++;
+    }
+      
+  }else{
+    /* right is a pointer reg need both a & b */
+    while(size--) {
+      char *l = aopGet(AOP(left),offset,FALSE,FALSE);
+      if(strcmp(l,"b"))
+       pic14_emitcode("mov","b,%s",l);
+      MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+      pic14_emitcode("cjne","a,b,%05d_DS_",lbl->key+100);    
+      offset++;
+    }
+  }
+
+  emitpcode(POC_INCF,popGet(AOP(result),res_offset));
+  if(!rIfx.condition)
+    emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+
+  emitpLabel(lbl->key);
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  if(ifx)
+    ifx->generated = 1;
 }
 
+#if 0
+/*-----------------------------------------------------------------*/
+/* gencjne - compare and jump if not equal                         */
+/*-----------------------------------------------------------------*/
+static void gencjne(operand *left, operand *right, iCode *ifx)
+{
+    symbol *tlbl  = newiTempLabel(NULL);
+
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    gencjneshort(left, right, lbl);
+
+    pic14_emitcode("mov","a,%s",one);
+    pic14_emitcode("sjmp","%05d_DS_",tlbl->key+100);
+    pic14_emitcode("","%05d_DS_:",lbl->key+100);
+    pic14_emitcode("clr","a");
+    pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+
+    emitpLabel(lbl->key);
+    emitpLabel(tlbl->key);
+
+}
+#endif
 
 /*-----------------------------------------------------------------*/
 /* genCmpEq - generates code for equal to                          */
@@ -3667,6 +4733,7 @@ static void genCmpEq (iCode *ic, iCode *ifx)
     int size,offset=0;
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
     if(ifx)
       DEBUGpic14_emitcode ("; ifx is non-null","");
     else
@@ -3678,23 +4745,26 @@ static void genCmpEq (iCode *ic, iCode *ifx)
 
     size = max(AOP_SIZE(left),AOP_SIZE(right));
 
+    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");
@@ -3722,188 +4792,112 @@ static void genCmpEq (iCode *ic, iCode *ifx)
                 pic14_emitcode("ljmp","%05d_DS_",IC_FALSE(ifx)->key+100);
             }
             pic14_emitcode("","%05d_DS_:",tlbl->key+100+labelOffset);
+
+           {
+             /* left and right are both bit variables, result is carry */
+             resolvedIfx rIfx;
+             
+             resolveIfx(&rIfx,ifx);
+
+             emitpcode(POC_MOVLW,popGet(AOP(left),0));
+             emitpcode(POC_ANDFW,popGet(AOP(left),0));
+             emitpcode(POC_BTFSC,popGet(AOP(right),0));
+             emitpcode(POC_ANDLW,popGet(AOP(left),0));
+             genSkipz2(&rIfx,0);
+           }
         } else {
 
          /* They're not both bit variables. Is the right a literal? */
          if(AOP_TYPE(right) == AOP_LIT) {
-
            lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
-           while (size--) {
-
-             if(size >= 1) {
-               int l = lit & 0xff;
-               int h = (lit>>8) & 0xff;
-               int optimized=0;
-
-               /* Check special cases for integers */
-               switch(lit & 0xffff) {
-               case 0x0000:
-                 emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                 //pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 //pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                 genSkip(ifx,'z');
-                 optimized++;
-                 break;
-               case 0x0001:
-                 emitpcode(POC_DECFW,popGet(AOP(left),offset,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                 pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                 genSkip(ifx,'z');
-                 optimized++;
-                 break;
-               case 0x0100:
-                 emitpcode(POC_DECFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                 pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 genSkip(ifx,'z');
-                 optimized++;
-                 break;
-               case 0x00ff:
-                 emitpcode(POC_INCFW,popGet(AOP(left),offset,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                 pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                 genSkip(ifx,'z');
-                 optimized++;
-                 break;
-               case 0xff00:
-                 emitpcode(POC_INCFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                 emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                 pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 genSkip(ifx,'z');
-                 optimized++;
-                 break;
-               default:
-                 if(h == 0) {
-                   emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-                   emitpcode(POC_XORLW,popGetLit(l));
-                   emitpcode(POC_IORFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-
-                   pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                   pic14_emitcode("xorlw","0x%x",l);
-                   pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                   optimized++;
-                   genSkip(ifx,'z');
-                 } else if (l == 0) {
-                   emitpcode(POC_MOVFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-                   emitpcode(POC_XORLW,popGetLit(h));
-                   emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE));
-
-                   pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-                   pic14_emitcode("xorlw","0x%x",h);
-                   pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                   optimized++;
-                   genSkip(ifx,'z');
-                 } else {
-                   emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-                   emitpcode(POC_XORLW,popGetLit(l));
-                   emitpcode(POC_MOVLW,popGetLit(h));
-                   emitSKPZ;
-                   emitpcode(POC_XORFW,popGet(AOP(left),offset+1,FALSE,FALSE));
-/*
-                   pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                   pic14_emitcode("xorlw","0x%x",l);
-                   pic14_emitcode("movlw","0x%x",h);
-                   emitSKPZ;
-                   pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset+1,FALSE,FALSE));
-*/
-                   optimized++;
-                   genSkip(ifx,'z');
-                 }
-
-               }
-               if(optimized) {
-                 size--;
-                 offset+=2;
-                 lit>>=16;
+           
+           switch(size) {
 
-                 continue;
-               }
-                 
-             }
-               
+           case 1:
              switch(lit & 0xff) {
              case 1:
                if ( IC_TRUE(ifx) ) {
-
-                 pic14_emitcode("decf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-
-                 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));
-
-                 pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset);
                } 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));
-
-                 pic14_emitcode("decfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset);
                }
                break;
              case 0xff:
                if ( IC_TRUE(ifx) ) {
-                 pic14_emitcode("incf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-
-                 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));
-
-                 pic14_emitcode("goto","_%05d_DS_",IC_TRUE(ifx)->key+100+labelOffset);
                } 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));
-
-                 pic14_emitcode("incfsz","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-                 pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset);
                }
                break;
              default:
-               emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
-               //pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
+               emitpcode(POC_MOVFW,popGet(AOP(left),offset));
                if(lit)
                  emitpcode(POC_XORLW,popGetLit(lit & 0xff));
-               //pic14_emitcode("xorlw","0x%x",lit & 0xff);
                genSkip(ifx,'z');
              }
 
 
-             //              pic14_emitcode("goto","_%05d_DS_",tlbl->key+100+labelOffset);
-             //pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset);                
-             offset++;
-             lit >>= 8;
+             /* end of size == 1 */
+             break;
+             
+           case 2:
+             genc16bit2lit(left,lit,offset);
+             genSkip(ifx,'z');
+             break;
+             /* end of size == 2 */
+
+           default:
+             /* size is 4 */
+             if(lit==0) {
+               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 {
+
+               /* search for patterns that can be optimized */
+
+               genc16bit2lit(left,lit,0);
+               lit >>= 16;
+               if(lit) {
+                 genSkipz(ifx,IC_TRUE(ifx) == NULL);
+                 //genSkip(ifx,'z');
+                 genc16bit2lit(left,lit,2);
+               } else {
+                 emitpcode(POC_IORFW,popGet(AOP(left),2));
+                 emitpcode(POC_IORFW,popGet(AOP(left),3));
+
+               }
+               
+             }
+
+             genSkip(ifx,'z');
            }
+         
+           ifx->generated = 1;
+           goto release ;
+           
 
          } 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;
@@ -3922,11 +4916,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) {
@@ -3946,7 +4937,7 @@ static void genCmpEq (iCode *ic, iCode *ifx)
              offset++;
            }
            if(s>1 && IC_TRUE(ifx)) {
-             emitpLabel(tlbl->key+100+labelOffset);
+             emitpLabel(tlbl->key);
              pic14_emitcode("","_%05d_DS_:",tlbl->key+100+labelOffset);                
            }
          }
@@ -3960,7 +4951,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");
@@ -3990,20 +4981,37 @@ static void genCmpEq (iCode *ic, iCode *ifx)
         then put the result in place */
         pic14_outBitC(result);
     } else {
-        gencjne(left,right,newiTempLabel(NULL));    
-        if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) {
-            aopPut(AOP(result),"a",0);
-            goto release ;
-        }
-        if (ifx) {
-            genIfxJump (ifx,"a");
-            goto release ;
-        }
-        /* 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 */
+      
+      DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      gencjne(left,right,result,ifx);
+/*
+      if(ifx) 
+       gencjne(left,right,newiTempLabel(NULL));
+      else {
+       if(IC_TRUE(ifx)->key)
+         gencjne(left,right,IC_TRUE(ifx)->key);
+       else
+         gencjne(left,right,IC_FALSE(ifx)->key);
+       ifx->generated = 1;
+       goto release ;
+      }
+      if (AOP_TYPE(result) == AOP_CRY && AOP_SIZE(result)) {
+       aopPut(AOP(result),"a",0);
+       goto release ;
+      }
+
+      if (ifx) {
+       genIfxJump (ifx,"a");
+       goto release ;
+      }
+*/
+      /* 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 */
     }
 
 release:
@@ -4031,6 +5039,28 @@ static iCode *ifxForOp ( operand *op, iCode *ic )
         OP_SYMBOL(op)->liveTo <= ic->next->seq )
         return ic->next;
 
+    if (ic->next &&
+        ic->next->op == IFX &&
+        IC_COND(ic->next)->key == op->key) {
+      DEBUGpic14_emitcode ("; WARNING ","%d IGNORING liveTo range in %s",__LINE__,__FUNCTION__);
+      return ic->next;
+    }
+
+    DEBUGpic14_emitcode ("; NULL :(","%d",__LINE__);
+    if (ic->next &&
+        ic->next->op == IFX)
+      DEBUGpic14_emitcode ("; ic-next"," is an IFX");
+
+    if (ic->next &&
+        ic->next->op == IFX &&
+        IC_COND(ic->next)->key == op->key) {
+      DEBUGpic14_emitcode ("; "," key is okay");
+      DEBUGpic14_emitcode ("; "," key liveTo %d, next->seq = %d",
+                          OP_SYMBOL(op)->liveTo,
+                          ic->next->seq);
+    }
+
+
     return NULL;
 }
 /*-----------------------------------------------------------------*/
@@ -4039,7 +5069,7 @@ static iCode *ifxForOp ( operand *op, iCode *ic )
 static void genAndOp (iCode *ic)
 {
     operand *left,*right, *result;
-    symbol *tlbl;
+/*     symbol *tlbl; */
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
     /* note here that && operations that are in an
@@ -4049,20 +5079,26 @@ static void genAndOp (iCode *ic)
     aopOp((right=IC_RIGHT(ic)),ic,FALSE);
     aopOp((result=IC_RESULT(ic)),ic,FALSE);
 
+    DEBUGpic14_AopType(__LINE__,left,right,result);
+
+    emitpcode(POC_MOVFW,popGet(AOP(left),0));
+    emitpcode(POC_ANDFW,popGet(AOP(right),0));
+    emitpcode(POC_MOVWF,popGet(AOP(result),0));
+
     /* if both are bit variables */
-    if (AOP_TYPE(left) == AOP_CRY &&
-        AOP_TYPE(right) == AOP_CRY ) {
-        pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
-        pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir);
-        pic14_outBitC(result);
-    } else {
-        tlbl = newiTempLabel(NULL);
-        pic14_toBoolean(left);    
-        pic14_emitcode("jz","%05d_DS_",tlbl->key+100);
-        pic14_toBoolean(right);
-        pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-        pic14_outBitAcc(result);
-    }
+/*     if (AOP_TYPE(left) == AOP_CRY && */
+/*         AOP_TYPE(right) == AOP_CRY ) { */
+/*         pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir); */
+/*         pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir); */
+/*         pic14_outBitC(result); */
+/*     } else { */
+/*         tlbl = newiTempLabel(NULL); */
+/*         pic14_toBoolean(left);     */
+/*         pic14_emitcode("jz","%05d_DS_",tlbl->key+100); */
+/*         pic14_toBoolean(right); */
+/*         pic14_emitcode("","%05d_DS_:",tlbl->key+100); */
+/*         pic14_outBitAcc(result); */
+/*     } */
 
     freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
     freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
@@ -4091,6 +5127,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 ) {
@@ -4188,258 +5226,284 @@ static void jmpTrueOrFalse (iCode *ic, symbol *tlbl)
 /*-----------------------------------------------------------------*/
 static void genAnd (iCode *ic, iCode *ifx)
 {
-    operand *left, *right, *result;
-    int size, offset=0;  
-    unsigned long lit = 0L;
-    int bytelit = 0;
-    char buffer[10];
-
-    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);
+  operand *left, *right, *result;
+  int size, offset=0;  
+  unsigned long lit = 0L;
+  int bytelit = 0;
+  resolvedIfx rIfx;
 
-#ifdef DEBUG_TYPE
-    pic14_emitcode("","; Type res[%d] = l[%d]&r[%d]",
-             AOP_TYPE(result),
-             AOP_TYPE(left), AOP_TYPE(right));
-    pic14_emitcode("","; Size res[%d] = l[%d]&r[%d]",
-             AOP_SIZE(result),
-             AOP_SIZE(left), AOP_SIZE(right));
-#endif
 
-    /* if left is a literal & right is not then exchange them */
-    if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
-       AOP_NEEDSACC(left)) {
-        operand *tmp = right ;
-        right = left;
-        left = tmp;
-    }
+  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);
+
+  resolveIfx(&rIfx,ifx);
+
+  /* if left is a literal & right is not then exchange them */
+  if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
+      AOP_NEEDSACC(left)) {
+    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)
-    // result = bit & yy;
-    if (AOP_TYPE(left) == AOP_CRY){
-        // c = bit & literal;
-        if(AOP_TYPE(right) == AOP_LIT){
-            if(lit & 1) {
-                if(size && pic14_sameRegs(AOP(result),AOP(left)))
-                    // no change
-                    goto release;
-                pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
-            } else {
-                // bit(result) = 0;
-                if(size && (AOP_TYPE(result) == AOP_CRY)){
-                    pic14_emitcode("clr","%s",AOP(result)->aopu.aop_dir);
-                    goto release;
-                }
-                if((AOP_TYPE(result) == AOP_CRY) && ifx){
-                    jumpIfTrue(ifx);
-                    goto release;
-                }
-                pic14_emitcode("clr","c");
-            }
-        } else {
-            if (AOP_TYPE(right) == AOP_CRY){
-                // c = bit & bit;
-                pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
-                pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir);
-            } else {
-                // c = bit & val;
-                MOVA(aopGet(AOP(right),0,FALSE,FALSE));
-                // c = lsb
-                pic14_emitcode("rrc","a");
-                pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir);
-            }
-        }
-        // bit = c
-        // val = c
-        if(size)
-            pic14_outBitC(result);
-        // if(bit & ...)
-        else if((AOP_TYPE(result) == AOP_CRY) && ifx)
-            genIfxJump(ifx, "c");           
-        goto release ;
+  DEBUGpic14_AopType(__LINE__,left,right,result);
+
+  // if(bit & yy)
+  // result = bit & yy;
+  if (AOP_TYPE(left) == AOP_CRY){
+    // c = bit & literal;
+    if(AOP_TYPE(right) == AOP_LIT){
+      if(lit & 1) {
+       if(size && pic14_sameRegs(AOP(result),AOP(left)))
+         // no change
+         goto release;
+       pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
+      } else {
+       // bit(result) = 0;
+       if(size && (AOP_TYPE(result) == AOP_CRY)){
+         pic14_emitcode("clr","%s",AOP(result)->aopu.aop_dir);
+         goto release;
+       }
+       if((AOP_TYPE(result) == AOP_CRY) && ifx){
+         jumpIfTrue(ifx);
+         goto release;
+       }
+       pic14_emitcode("clr","c");
+      }
+    } else {
+      if (AOP_TYPE(right) == AOP_CRY){
+       // c = bit & bit;
+       pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
+       pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir);
+      } else {
+       // c = bit & val;
+       MOVA(aopGet(AOP(right),0,FALSE,FALSE));
+       // c = lsb
+       pic14_emitcode("rrc","a");
+       pic14_emitcode("anl","c,%s",AOP(left)->aopu.aop_dir);
+      }
     }
+    // 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(val & 0xZZ)       - size = 0, ifx != FALSE  -
-    // bit = val & 0xZZ     - size = 1, ifx = FALSE -
-    if((AOP_TYPE(right) == AOP_LIT) &&
-       (AOP_TYPE(result) == AOP_CRY) &&
-       (AOP_TYPE(left) != AOP_CRY)){
-        int posbit = isLiteralBit(lit);
-        /* left &  2^n */
-        if(posbit){
-            posbit--;
-            MOVA(aopGet(AOP(left),posbit>>3,FALSE,FALSE));
-            // bit = left & 2^n
-            if(size)
-                pic14_emitcode("mov","c,acc.%d",posbit&0x07);
-            // if(left &  2^n)
-            else{
-                if(ifx){
-                    sprintf(buffer,"acc.%d",posbit&0x07);
-                    genIfxJump(ifx, buffer);
-                }
-                goto release;
-            }
-        } else {
-            symbol *tlbl = newiTempLabel(NULL);
-            int sizel = AOP_SIZE(left);
-            if(size)
-                pic14_emitcode("setb","c");
-            while(sizel--){
-                if((bytelit = ((lit >> (offset*8)) & 0x0FFL)) != 0x0L){
-                    MOVA( aopGet(AOP(left),offset,FALSE,FALSE));
-                    // byte ==  2^n ?
-                    if((posbit = isLiteralBit(bytelit)) != 0)
-                        pic14_emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100);
-                    else{
-                        if(bytelit != 0x0FFL)
-                            pic14_emitcode("anl","a,%s",
-                                     aopGet(AOP(right),offset,FALSE,TRUE));
-                        pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
-                    }
-                }
-                offset++;
-            }
-            // bit = left & literal
-            if(size){
-                pic14_emitcode("clr","c");
-                pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-            }
-            // if(left & literal)
-            else{
-                if(ifx)
-                    jmpTrueOrFalse(ifx, tlbl);
-                goto release ;
-            }
-        }
-        pic14_outBitC(result);
-        goto release ;
+  // if(val & 0xZZ)       - size = 0, ifx != FALSE  -
+  // bit = val & 0xZZ     - size = 1, ifx = FALSE -
+  if((AOP_TYPE(right) == AOP_LIT) &&
+     (AOP_TYPE(result) == AOP_CRY) &&
+     (AOP_TYPE(left) != AOP_CRY)){
+    int posbit = isLiteralBit(lit);
+    /* left &  2^n */
+    if(posbit){
+      posbit--;
+      //MOVA(aopGet(AOP(left),posbit>>3,FALSE,FALSE));
+      // bit = left & 2^n
+      if(size)
+       pic14_emitcode("mov","c,acc.%d",posbit&0x07);
+      // if(left &  2^n)
+      else{
+       if(ifx){
+/*
+         if(IC_TRUE(ifx)) {
+           emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),posbit,0));
+           emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ic)->key));
+         } else {
+           emitpcode(POC_BTFSS,newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),posbit,0));
+           emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ic)->key));
+         }
+*/
+         emitpcode(((rIfx.condition) ? POC_BTFSC : POC_BTFSS),
+                   newpCodeOpBit(aopGet(AOP(left),0,FALSE,FALSE),posbit,0));
+         emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+         
+         ifx->generated = 1;
+       }
+       goto release;
+      }
+    } else {
+      symbol *tlbl = newiTempLabel(NULL);
+      int sizel = AOP_SIZE(left);
+      if(size)
+       pic14_emitcode("setb","c");
+      while(sizel--){
+       if((bytelit = ((lit >> (offset*8)) & 0x0FFL)) != 0x0L){
+         MOVA( aopGet(AOP(left),offset,FALSE,FALSE));
+         // byte ==  2^n ?
+         if((posbit = isLiteralBit(bytelit)) != 0)
+           pic14_emitcode("jb","acc.%d,%05d_DS_",(posbit-1)&0x07,tlbl->key+100);
+         else{
+           if(bytelit != 0x0FFL)
+             pic14_emitcode("anl","a,%s",
+                            aopGet(AOP(right),offset,FALSE,TRUE));
+           pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
+         }
+       }
+       offset++;
+      }
+      // bit = left & literal
+      if(size){
+       pic14_emitcode("clr","c");
+       pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+      }
+      // if(left & literal)
+      else{
+       if(ifx)
+         jmpTrueOrFalse(ifx, tlbl);
+       goto release ;
+      }
     }
+    pic14_outBitC(result);
+    goto release ;
+  }
 
-    /* if left is same as result */
-    if(pic14_sameRegs(AOP(result),AOP(left))){
-      for(;size--; offset++,lit>>=8) {
+  /* if left is same as result */
+  if(pic14_sameRegs(AOP(result),AOP(left))){
+    int know_W = -1;
+    for(;size--; offset++,lit>>=8) {
+      if(AOP_TYPE(right) == AOP_LIT){
+       switch(lit & 0xff) {
+       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));
+         break;
+       case 0xff:
+         /* and'ing with 0xff is a nop when the result and left are the same */
+         break;
+
+       default:
+         {
+           int p = my_powof2( (~lit) & 0xff );
+           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,newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0));
+
+           } else {
+             pic14_emitcode("movlw","0x%x", (lit & 0xff));
+             pic14_emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE));
+             if(know_W != (lit&0xff))
+               emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+             know_W = lit &0xff;
+             emitpcode(POC_ANDWF,popGet(AOP(left),offset));
+           }
+         }    
+       }
+      } else {
+       if (AOP_TYPE(left) == AOP_ACC) {
+         emitpcode(POC_ANDFW,popGet(AOP(right),offset));
+       } else {                    
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+         emitpcode(POC_ANDWF,popGet(AOP(left),offset));
+
+       }
+      }
+    }
+
+  } 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 = min(AOP_SIZE(left),AOP_SIZE(right));
+      if(size)
+       pic14_emitcode("setb","c");
+      while(sizer--){
+       MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+       pic14_emitcode("anl","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){
-         switch(lit & 0xff) {
+         int t = (lit >> (offset*8)) & 0x0FFL;
+         switch(t) { 
          case 0x00:
-           /*  and'ing with 0 has clears the result */
-           pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
+           pic14_emitcode("clrf","%s",
+                          aopGet(AOP(result),offset,FALSE,FALSE));
+           emitpcode(POC_CLRF,popGet(AOP(result),offset));
            break;
          case 0xff:
-           pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+           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));
+           emitpcode(POC_MOVWF,popGet(AOP(result),offset));
            break;
-
          default:
-           {
-             int p = my_powof2( (~lit) & 0xff );
-             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);
-             } else {
-               pic14_emitcode("movlw","0x%x", (lit & 0xff));
-               pic14_emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p);
-             }
-           }    
-         }
-       } else {
-         if (AOP_TYPE(left) == AOP_ACC) 
-           pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-         else {                    
-           pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-           pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
-
+           pic14_emitcode("movlw","0x%x",t);
+           pic14_emitcode("andwf","%s,w",
+                          aopGet(AOP(left),offset,FALSE,FALSE));
+           pic14_emitcode("movwf","%s",
+                          aopGet(AOP(result),offset,FALSE,FALSE));
+             
+           emitpcode(POC_MOVLW, popGetLit(t));
+           emitpcode(POC_ANDFW,popGet(AOP(left),offset));
+           emitpcode(POC_MOVWF,popGet(AOP(result),offset));
          }
+         continue;
        }
-      }
 
-    } 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 = min(AOP_SIZE(left),AOP_SIZE(right));
-            if(size)
-                pic14_emitcode("setb","c");
-            while(sizer--){
-                MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
-                pic14_emitcode("anl","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:
-               pic14_emitcode("clrf","%s",
-                        aopGet(AOP(result),offset,FALSE,FALSE));
-               break;
-             case 0xff:
-               pic14_emitcode("movf","%s,w",
-                        aopGet(AOP(left),offset,FALSE,FALSE));
-               pic14_emitcode("movwf","%s",
-                        aopGet(AOP(result),offset,FALSE,FALSE));
-               break;
-             default:
-               pic14_emitcode("movlw","0x%x",t);
-               pic14_emitcode("andwf","%s,w",
+       if (AOP_TYPE(left) == AOP_ACC) {
+         pic14_emitcode("andwf","%s,w",aopGet(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));
-               pic14_emitcode("movwf","%s",
-                        aopGet(AOP(result),offset,FALSE,FALSE));
-             
-             }
-             continue;
-           }
-
-           if (AOP_TYPE(left) == AOP_ACC) 
-             pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-           else {
-             pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-             pic14_emitcode("andwf","%s,w",
-                      aopGet(AOP(left),offset,FALSE,FALSE));
-           }
-           pic14_emitcode("movwf","%s",aopGet(AOP(result),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));
+      }
     }
+  }
 
-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);     
 }
 
 /*-----------------------------------------------------------------*/
@@ -4457,6 +5521,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) ||
@@ -4481,6 +5546,8 @@ static void genOr (iCode *ic, iCode *ifx)
         left = tmp;
     }
 
+    DEBUGpic14_AopType(__LINE__,left,right,result);
+
     if(AOP_TYPE(right) == AOP_LIT)
         lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
 
@@ -4495,7 +5562,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);
@@ -4513,9 +5580,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,
@@ -4527,30 +5594,49 @@ static void genOr (iCode *ic, iCode *ifx)
                         AOP(result)->aopu.aop_dir,
                         AOP(result)->aopu.aop_dir);
              } else {
+               if( AOP_TYPE(result) == AOP_ACC) {
+                 emitpcode(POC_MOVLW, popGetLit(0));
+                 emitpcode(POC_BTFSS, popGet(AOP(right),0));
+                 emitpcode(POC_BTFSC, popGet(AOP(left),0));
+                 emitpcode(POC_MOVLW, popGetLit(1));
 
-               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));
+               } else {
 
-               pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
-                        AOP(result)->aopu.aop_dir,
-                        AOP(result)->aopu.aop_dir);
-               pic14_emitcode("btfss","(%s >> 3), (%s & 7)",
-                        AOP(right)->aopu.aop_dir,
-                        AOP(right)->aopu.aop_dir);
-               pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                        AOP(left)->aopu.aop_dir,
-                        AOP(left)->aopu.aop_dir);
-               pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
-                        AOP(result)->aopu.aop_dir,
-                        AOP(result)->aopu.aop_dir);
+                 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,
+                                AOP(result)->aopu.aop_dir);
+                 pic14_emitcode("btfss","(%s >> 3), (%s & 7)",
+                                AOP(right)->aopu.aop_dir,
+                                AOP(right)->aopu.aop_dir);
+                 pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                                AOP(left)->aopu.aop_dir,
+                                AOP(left)->aopu.aop_dir);
+                 pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
+                                AOP(result)->aopu.aop_dir,
+                                AOP(result)->aopu.aop_dir);
+               }
              }
-            }
-            else{
+            } else {
                 // c = bit | val;
                 symbol *tlbl = newiTempLabel(NULL);
                 pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__);
+
+
+               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));
+                 emitpcode(POC_BSF,   popGet(AOP(result),0));
+               }
+
+
+
                 if(!((AOP_TYPE(result) == AOP_CRY) && ifx))
                     pic14_emitcode(";XXX setb","c");
                 pic14_emitcode(";XXX jb","%s,%05d_DS_",
@@ -4611,6 +5697,7 @@ static void genOr (iCode *ic, iCode *ifx)
 
     /* if left is same as result */
     if(pic14_sameRegs(AOP(result),AOP(left))){
+      int know_W = -1;
       for(;size--; offset++,lit>>=8) {
        if(AOP_TYPE(right) == AOP_LIT){
          if((lit & 0xff) == 0)
@@ -4620,24 +5707,23 @@ static void genOr (iCode *ic, iCode *ifx)
            int p = my_powof2(lit & 0xff);
            if(p>=0) {
              /* only one bit is set in the literal, so use a bsf instruction */
-             emitpcode(POC_BSF,   popGet(AOP(left),offset,FALSE,FALSE));
-             pic14_emitcode("bsf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p);
+             emitpcode(POC_BSF,
+                       newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0));
            } else {
-             emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
-             emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE));
-
-             pic14_emitcode("movlw","0x%x", (lit & 0xff));
-             pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p);
+             if(know_W != (lit & 0xff))
+               emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+             know_W = lit & 0xff;
+             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));
@@ -4655,6 +5741,7 @@ static void genOr (iCode *ic, iCode *ifx)
             int sizer = max(AOP_SIZE(left),AOP_SIZE(right));
            pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__);
 
+
             if(size)
                 pic14_emitcode(";XXX setb","c");
             while(sizer--){
@@ -4677,8 +5764,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));
@@ -4687,8 +5774,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",
@@ -4703,17 +5790,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));
        }
     }
@@ -4729,218 +5816,240 @@ 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__);
-
-    aopOp((left = IC_LEFT(ic)),ic,FALSE);
-    aopOp((right= IC_RIGHT(ic)),ic,FALSE);
-    aopOp((result=IC_RESULT(ic)),ic,TRUE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* 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;
-    }
+  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 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)
+           {emitpcode(POC_BSF,  popGet(AOP(result),offset));
+           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))){
+           emitpcode(POC_MOVLW,  popGet(AOP(result),offset));
+           emitpcode(POC_XORWF,  popGet(AOP(result),offset));
+           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){
-                if(((lit >> (offset*8)) & 0x0FFL) == 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 
-                       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:
-               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("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",
+         pic14_emitcode("movwf","%s",
                         aopGet(AOP(result),offset,FALSE,FALSE));
-               break;
-             case 0xff:
-               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:
-               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)
-               pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
-           else {
-               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)
-             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);     
 }
 
 /*-----------------------------------------------------------------*/
@@ -4961,7 +6070,9 @@ static void genInline (iCode *ic)
     while (*bp) {
         if (*bp == '\n') {
             *bp++ = '\0';
-            pic14_emitcode(bp1,"");
+
+           if(*bp1)
+             addpCode2pBlock(pb,AssembleLine(bp1));
             bp1 = bp;
         } else {
             if (*bp == ':') {
@@ -4974,9 +6085,11 @@ static void genInline (iCode *ic)
                 bp++;
         }
     }
-    if (bp1 != bp)
-        pic14_emitcode(bp1,"");
-    /*     pic14_emitcode("",buffer); */
+    if ((bp1 != bp) && *bp1)
+      addpCode2pBlock(pb,AssembleLine(bp1));
+
+    Safe_free(buffer);
+
     _G.inLine -= (!options.asmpeep);
 }
 
@@ -4985,37 +6098,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);
+
+  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 ;
 
-    /* rotate right with carry */
-    left = IC_LEFT(ic);
-    result=IC_RESULT(ic);
-    aopOp (left,ic,FALSE);
-    aopOp (result,ic,FALSE);
+  while(size--) {
 
-    /* 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);
+    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);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5023,44 +6139,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);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5171,6 +6287,7 @@ static void AccRsh (int shCount)
     }
 }
 
+#if 0
 /*-----------------------------------------------------------------*/
 /* AccSRsh - signed right shift accumulator by known count                 */
 /*-----------------------------------------------------------------*/
@@ -5200,6 +6317,117 @@ static void AccSRsh (int shCount)
         }
     }
 }
+#endif
+/*-----------------------------------------------------------------*/
+/* shiftR1Left2Result - shift right one byte from left to result   */
+/*-----------------------------------------------------------------*/
+static void shiftR1Left2ResultSigned (operand *left, int offl,
+                                operand *result, int offr,
+                                int shCount)
+{
+  int same;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr);
+
+  switch(shCount) {
+  case 1:
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    if(same) 
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
+    else {
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+
+    break;
+  case 2:
+
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    if(same) 
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
+    else {
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+    emitpcode(POC_RLFW, popGet(AOP(result),offr));
+    emitpcode(POC_RRF,  popGet(AOP(result),offr));
+
+    break;
+
+  case 3:
+    if(same)
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
+    else {
+      emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+
+    emitpcode(POC_RLFW,  popGet(AOP(result),offr));
+    emitpcode(POC_RLFW,  popGet(AOP(result),offr));
+    emitpcode(POC_ANDLW, popGetLit(0x1f));
+
+    emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0));
+    emitpcode(POC_IORLW, popGetLit(0xe0));
+
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    break;
+
+  case 4:
+    emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW,  popGetLit(0x0f));
+    emitpcode(POC_BTFSC,  newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0));
+    emitpcode(POC_IORLW,  popGetLit(0xf0));
+    emitpcode(POC_MOVWF,  popGet(AOP(result),offr));
+    break;
+  case 5:
+    if(same) {
+      emitpcode(POC_SWAPF,  popGet(AOP(result),offr));
+    } else {
+      emitpcode(POC_SWAPFW,  popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF,  popGet(AOP(result),offr));
+    }
+    emitpcode(POC_RRFW,   popGet(AOP(result),offr));
+    emitpcode(POC_ANDLW,  popGetLit(0x07));
+    emitpcode(POC_BTFSC,  newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),3,0));
+    emitpcode(POC_IORLW,  popGetLit(0xf8));
+    emitpcode(POC_MOVWF,  popGet(AOP(result),offr));
+    break;
+
+  case 6:
+    if(same) {
+      emitpcode(POC_MOVLW, popGetLit(0x00));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0));
+      emitpcode(POC_MOVLW, popGetLit(0xfe));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0));
+      emitpcode(POC_IORLW, popGetLit(0x01));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    } else {
+      emitpcode(POC_CLRF,  popGet(AOP(result),offr));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0));
+      emitpcode(POC_DECF,  popGet(AOP(result),offr));
+      emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),6,0));
+      emitpcode(POC_BCF,   newpCodeOpBit(aopGet(AOP(result),offr,FALSE,FALSE),0,0));
+    }
+    break;
+
+  case 7:
+    if(same) {
+      emitpcode(POC_MOVLW, popGetLit(0x00));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0));
+      emitpcode(POC_MOVLW, popGetLit(0xff));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    } else {
+      emitpcode(POC_CLRF,  popGet(AOP(result),offr));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),offl,FALSE,FALSE),7,0));
+      emitpcode(POC_DECF,  popGet(AOP(result),offr));
+    }
+
+  default:
+    break;
+  }
+}
 
 /*-----------------------------------------------------------------*/
 /* shiftR1Left2Result - shift right one byte from left to result   */
@@ -5208,14 +6436,90 @@ static void shiftR1Left2Result (operand *left, int offl,
                                 operand *result, int offr,
                                 int shCount, int sign)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    MOVA(aopGet(AOP(left),offl,FALSE,FALSE));
-    /* shift right accumulator */
-    if(sign)
-        AccSRsh(shCount);
-    else
-        AccRsh(shCount);
-    aopPut(AOP(result),"a",offr);
+  int same;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr);
+
+  /* Copy the msb into the carry if signed. */
+  if(sign) {
+    shiftR1Left2ResultSigned(left,offl,result,offr,shCount);
+    return;
+  }
+
+
+
+  switch(shCount) {
+  case 1:
+    emitCLRC;
+    if(same) 
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
+    else {
+      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));
+    } else {
+      emitpcode(POC_RRFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+    emitCLRC;
+    emitpcode(POC_RRF, popGet(AOP(result),offr));
+
+    break;
+  case 3:
+    if(same)
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
+    else {
+      emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+
+    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));
+    break;
+      
+  case 4:
+    emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW, popGetLit(0x0f));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    break;
+
+  case 5:
+    emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW, popGetLit(0x0f));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    emitCLRC;
+    emitpcode(POC_RRF, popGet(AOP(result),offr));
+
+    break;
+  case 6:
+
+    emitpcode(POC_RLFW,  popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW, popGetLit(0x80));
+    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));
+    emitpcode(POC_CLRF, popGet(AOP(result),offr));
+    emitpcode(POC_RLF,  popGet(AOP(result),offr));
+
+    break;
+
+  default:
+    break;
+  }
 }
 
 /*-----------------------------------------------------------------*/
@@ -5224,305 +6528,373 @@ static void shiftR1Left2Result (operand *left, int offl,
 static void shiftL1Left2Result (operand *left, int offl,
                                 operand *result, int offr, int shCount)
 {
-    char *l;
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    l = aopGet(AOP(left),offl,FALSE,FALSE);
-    MOVA(l);
+  int same;
+
+  //    char *l;
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  same = ((left == result) || (AOP(left) == AOP(result))) && (offl==offr);
+  DEBUGpic14_emitcode ("; ***","same =  %d",same);
+    //    l = aopGet(AOP(left),offl,FALSE,FALSE);
+    //    MOVA(l);
     /* shift left accumulator */
-    AccLsh(shCount);
-    aopPut(AOP(result),"a",offr);
+    //AccLsh(shCount); // don't comment out just yet...
+  //    aopPut(AOP(result),"a",offr);
+
+  switch(shCount) {
+  case 1:
+    /* Shift left 1 bit position */
+    emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+    if(same) {
+      emitpcode(POC_ADDWF, popGet(AOP(left),offl));
+    } else {
+      emitpcode(POC_ADDFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+    }
+    break;
+  case 2:
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW,popGetLit(0x7e));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+    break;
+  case 3:
+    emitpcode(POC_RLFW, popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW,popGetLit(0x3e));
+    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));
+    emitpcode(POC_ANDLW, popGetLit(0xf0));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    break;
+  case 5:
+    emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW, popGetLit(0xf0));
+    emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+    break;
+  case 6:
+    emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
+    emitpcode(POC_ANDLW, popGetLit(0x30));
+    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));
+    emitpcode(POC_CLRF, popGet(AOP(result),offr));
+    emitpcode(POC_RRF,  popGet(AOP(result),offr));
+    break;
+
+  default:
+    DEBUGpic14_emitcode ("; ***","%s  %d, shift count is %d",__FUNCTION__,__LINE__,shCount);
+  }
+
 }
 
 /*-----------------------------------------------------------------*/
 /* movLeft2Result - move byte from left to result                  */
 /*-----------------------------------------------------------------*/
 static void movLeft2Result (operand *left, int offl,
-                            operand *result, int offr, int sign)
+                            operand *result, int offr)
 {
-    char *l;
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    if(!pic14_sameRegs(AOP(left),AOP(result)) || (offl != offr)){
-        l = aopGet(AOP(left),offl,FALSE,FALSE);
+  char *l;
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  if(!pic14_sameRegs(AOP(left),AOP(result)) || (offl != offr)){
+    l = aopGet(AOP(left),offl,FALSE,FALSE);
 
-        if (*l == '@' && (IS_AOP_PREG(result))) {
-            pic14_emitcode("mov","a,%s",l);
-            aopPut(AOP(result),"a",offr);
-        } else {
-            if(!sign)
-                aopPut(AOP(result),l,offr);
-            else{
-                /* MSB sign in acc.7 ! */
-                if(pic14_getDataSize(left) == offl+1){
-                    pic14_emitcode("mov","a,%s",l);
-                    aopPut(AOP(result),"a",offr);
-                }
-            }
-        }
+    if (*l == '@' && (IS_AOP_PREG(result))) {
+      pic14_emitcode("mov","a,%s",l);
+      aopPut(AOP(result),"a",offr);
+    } else {
+      emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
     }
+  }
 }
 
 /*-----------------------------------------------------------------*/
-/* AccAXRrl1 - right rotate c->a:x->c by 1                         */
+/* shiftL2Left2Result - shift left two bytes from left to result   */
 /*-----------------------------------------------------------------*/
-static void AccAXRrl1 (char *x)
+static void shiftL2Left2Result (operand *left, int offl,
+                                operand *result, int offr, int shCount)
 {
-    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");
-}
 
-/*-----------------------------------------------------------------*/
-/* 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");
-}
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-/*-----------------------------------------------------------------*/
-/* 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;
-    }
-}
+  if(pic14_sameRegs(AOP(result), AOP(left))) {
+    switch(shCount) {
+    case 0:
+      break;
+    case 1:
+    case 2:
+    case 3:
+
+      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));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+      }
 
-/*-----------------------------------------------------------------*/
-/* 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;
+      break;
+    case 4:
+    case 5:
+      emitpcode(POC_MOVLW, popGetLit(0x0f));
+      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));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+      }
+      break;
+    case 6:
+      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));
+      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));
+      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));
     }
-}
 
-/*-----------------------------------------------------------------*/
-/* 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;
+  } else {
+    switch(shCount) {
+    case 0:
+      break;
+    case 1:
+    case 2:
+    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));
+      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));
+       emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+      }
+      break;
+
+    case 4:
+    case 5:
+      emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16));
+      emitpcode(POC_ANDLW, popGetLit(0xF0));
+      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));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
+
+
+      if(shCount == 5) {
+       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));
+      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));
+      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));
+      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));
     }
-}
+  }
 
+}
 /*-----------------------------------------------------------------*/
-/* shiftL2Left2Result - shift left two bytes from left to result   */
+/* shiftR2Left2Result - shift right two bytes from left to result  */
 /*-----------------------------------------------------------------*/
-static void shiftL2Left2Result (operand *left, int offl,
-                                operand *result, int offr, int shCount)
+static void shiftR2Left2Result (operand *left, int offl,
+                                operand *result, int offr,
+                                int shCount, int sign)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    if(pic14_sameRegs(AOP(result), AOP(left)) &&
-       ((offl + MSB16) == offr)){
-       /* don't crash result[offr] */
-       MOVA(aopGet(AOP(left),offl,FALSE,FALSE));
-       pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE));
+  int same=0;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  same = pic14_sameRegs(AOP(result), AOP(left));
+
+  if(same && ((offl + MSB16) == offr)){
+    same=1;
+    /* don't crash result[offr] */
+    MOVA(aopGet(AOP(left),offl,FALSE,FALSE));
+    pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+MSB16,FALSE,FALSE));
+  }
+/* else {
+    movLeft2Result(left,offl, result, offr);
+    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:
+    if(sign)
+      emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16));
+    else
+      emitCLRC;
+
+    if(same) {
+      emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF,popGet(AOP(result),offr));
     } else {
-       movLeft2Result(left,offl, result, offr, 0);
-       MOVA(aopGet(AOP(left),offl+MSB16,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) {
+      if(sign)
+       emitpcode(POC_RLFW,popGet(AOP(result),offr+MSB16));
+      else
+       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));
+      emitpcode(POC_SWAPF, popGet(AOP(result),offr));
+
+      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_SWAPFW,popGet(AOP(left),offl));
+      emitpcode(POC_ANDLW, popGetLit(0x0f));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+
+      emitpcode(POC_SWAPFW,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));
+    }
+
+    if(shCount >=5) {
+      emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RRF, popGet(AOP(result),offr));
+    }
+
+    if(sign) {
+      emitpcode(POC_MOVLW, popGetLit(0xf0 + (shCount-4)*8 ));
+      emitpcode(POC_BTFSC, 
+               newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),7-shCount,0));
+      emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
     }
-    /* ax << shCount (x = lsb(result))*/
-    AccAXLsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
-    aopPut(AOP(result),"a",offr+MSB16);
-}
 
+    break;
 
-/*-----------------------------------------------------------------*/
-/* shiftR2Left2Result - shift right two bytes from left to result  */
-/*-----------------------------------------------------------------*/
-static void shiftR2Left2Result (operand *left, int offl,
-                                operand *result, int offr,
-                                int shCount, int sign)
-{
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    if(pic14_sameRegs(AOP(result), AOP(left)) &&
-       ((offl + MSB16) == offr)){
-       /* don't crash result[offr] */
-       MOVA(aopGet(AOP(left),offl,FALSE,FALSE));
-       pic14_emitcode("xch","a,%s", aopGet(AOP(left),offl+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));
+      if(sign) {
+       emitpcode(POC_BTFSC, 
+                 newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),1,0));
+       emitpcode(POC_IORLW,popGetLit(0xfc));
+      }
+      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 {
-       movLeft2Result(left,offl, result, offr, 0);
-       MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE));
+      emitpcode(POC_RLFW, popGet(AOP(left),offl));
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      emitpcode(POC_RLFW, popGet(AOP(left),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+MSB16));
+      emitpcode(POC_ANDLW,popGetLit(0x03));
+      if(sign) {
+       emitpcode(POC_BTFSC, 
+                 newpCodeOpBit(aopGet(AOP(result),offr+MSB16,FALSE,FALSE),0,0));
+       emitpcode(POC_IORLW,popGetLit(0xfc));
+      }
+      emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+      //emitpcode(POC_RLF,  popGet(AOP(result),offr));
+
+       
     }
-    /* 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);
-    if(pic14_getDataSize(result) > 1)
-        aopPut(AOP(result),"a",offr+MSB16);
+
+    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));
+    if(sign) {
+      emitSKPNC;
+      emitpcode(POC_DECF, popGet(AOP(result),offr+MSB16));
+    } else 
+      emitpcode(POC_RLF,  popGet(AOP(result),offr+MSB16));
+  }
 }
 
+
 /*-----------------------------------------------------------------*/
 /* shiftLLeftOrResult - shift left one byte from left, or to result*/
 /*-----------------------------------------------------------------*/
@@ -5582,9 +6954,9 @@ static void genlshTwo (operand *result,operand *left, int shCount)
             if (shCount)
                 shiftL1Left2Result(left, LSB, result, MSB16, shCount);
             else 
-                movLeft2Result(left, LSB, result, MSB16, 0);
+                movLeft2Result(left, LSB, result, MSB16);
         }
-        aopPut(AOP(result),zero,LSB);   
+       emitpcode(POC_CLRF,popGet(AOP(result),LSB));
     }
 
     /*  1 <= shCount <= 7 */
@@ -5676,7 +7048,7 @@ static void genlshFour (operand *result, operand *left, int shCount)
             order of the destination */
             shiftL1Left2Result(left, LSB, result, MSB32, shCount);
         else
-            movLeft2Result(left, LSB, result, MSB32, 0);
+            movLeft2Result(left, LSB, result, MSB32);
         aopPut(AOP(result),zero,LSB);
         aopPut(AOP(result),zero,MSB16);
         aopPut(AOP(result),zero,MSB32);
@@ -5691,8 +7063,8 @@ static void genlshFour (operand *result, operand *left, int shCount)
         if (shCount)
             shiftL2Left2Result(left, LSB, result, MSB24, shCount);
         else {
-            movLeft2Result(left, MSB16, result, MSB32, 0);
-            movLeft2Result(left, LSB, result, MSB24, 0);
+            movLeft2Result(left, MSB16, result, MSB32);
+            movLeft2Result(left, LSB, result, MSB24);
         }
         aopPut(AOP(result),zero,MSB16);
         aopPut(AOP(result),zero,LSB);
@@ -5707,13 +7079,13 @@ static void genlshFour (operand *result, operand *left, int shCount)
             if(shCount)
                 shiftL1Left2Result(left, LSB, result, MSB16, shCount);
             else
-                movLeft2Result(left, LSB, result, MSB16, 0);
+                movLeft2Result(left, LSB, result, MSB16);
         }
         else{   /* size = 4 */
             if(shCount == 0){
-                movLeft2Result(left, MSB24, result, MSB32, 0);
-                movLeft2Result(left, MSB16, result, MSB24, 0);
-                movLeft2Result(left, LSB, result, MSB16, 0);
+                movLeft2Result(left, MSB24, result, MSB32);
+                movLeft2Result(left, MSB16, result, MSB24);
+                movLeft2Result(left, LSB, result, MSB16);
                 aopPut(AOP(result),zero,LSB);
             }
             else if(shCount == 1)
@@ -5768,7 +7140,7 @@ static void genLeftShiftLiteral (operand *left,
     /* I suppose that the left size >= result size */
     if(shCount == 0){
         while(size--){
-            movLeft2Result(left, size, result, size, 0);
+            movLeft2Result(left, size, result, size);
         }
     }
 
@@ -5795,103 +7167,201 @@ static void genLeftShiftLiteral (operand *left,
     freeAsmop(result,NULL,ic,TRUE);
 }
 
+/*-----------------------------------------------------------------*
+ * genMultiAsm - repeat assembly instruction for size of register.
+ * if endian == 1, then the high byte (i.e base address + size of 
+ * register) is used first else the low byte is used first;
+ *-----------------------------------------------------------------*/
+static void genMultiAsm( PIC_OPCODE poc, operand *reg, int size, int endian)
+{
+
+  int offset = 0;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  if(!reg)
+    return;
+
+  if(!endian) {
+    endian = 1;
+  } else {
+    endian = -1;
+    offset = size-1;
+  }
+
+  while(size--) {
+    emitpcode(poc,    popGet(AOP(reg),offset));
+    offset += endian;
+  }
+
+}
 /*-----------------------------------------------------------------*/
 /* genLeftShift - generates code for left shifting                 */
 /*-----------------------------------------------------------------*/
 static void genLeftShift (iCode *ic)
 {
-    operand *left,*right, *result;
-    int size, offset;
-    char *l;
-    symbol *tlbl , *tlbl1;
-
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  operand *left,*right, *result;
+  int size, offset;
+  char *l;
+  symbol *tlbl , *tlbl1;
+  pCodeOp *pctemp;
 
-    right = IC_RIGHT(ic);
-    left  = IC_LEFT(ic);
-    result = IC_RESULT(ic);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    aopOp(right,ic,FALSE);
+  right = IC_RIGHT(ic);
+  left  = IC_LEFT(ic);
+  result = IC_RESULT(ic);
 
-    /* if the shift count is known then do it 
-    as efficiently as possible */
-    if (AOP_TYPE(right) == AOP_LIT) {
-        genLeftShiftLiteral (left,right,result,ic);
-        return ;
-    }
+  aopOp(right,ic,FALSE);
 
-    /* shift count is unknown then we have to form 
-    a loop get the loop count in B : Note: we take
-    only the lower order byte since shifting
-    more that 32 bits make no sense anyway, ( the
-    largest size of an object can be only 32 bits ) */  
+  /* if the shift count is known then do it 
+     as efficiently as possible */
+  if (AOP_TYPE(right) == AOP_LIT) {
+    genLeftShiftLiteral (left,right,result,ic);
+    return ;
+  }
 
-    pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE));
-    pic14_emitcode("inc","b");
-    freeAsmop (right,NULL,ic,TRUE);
-    aopOp(left,ic,FALSE);
-    aopOp(result,ic,FALSE);
+  /* shift count is unknown then we have to form 
+     a loop get the loop count in B : Note: we take
+     only the lower order byte since shifting
+     more that 32 bits make no sense anyway, ( the
+     largest size of an object can be only 32 bits ) */  
 
-    /* now move the left to the result if they are not the
-    same */
-    if (!pic14_sameRegs(AOP(left),AOP(result)) && 
-        AOP_SIZE(result) > 1) {
+    
+  aopOp(left,ic,FALSE);
+  aopOp(result,ic,FALSE);
 
-        size = AOP_SIZE(result);
-        offset=0;
-        while (size--) {
-            l = aopGet(AOP(left),offset,FALSE,TRUE);
-            if (*l == '@' && (IS_AOP_PREG(result))) {
+  /* now move the left to the result if they are not the
+     same */
+  if (!pic14_sameRegs(AOP(left),AOP(result)) && 
+      AOP_SIZE(result) > 1) {
 
-                pic14_emitcode("mov","a,%s",l);
-                aopPut(AOP(result),"a",offset);
-            } else
-                aopPut(AOP(result),l,offset);
-            offset++;
-        }
+    size = AOP_SIZE(result);
+    offset=0;
+    while (size--) {
+      l = aopGet(AOP(left),offset,FALSE,TRUE);
+      if (*l == '@' && (IS_AOP_PREG(result))) {
+
+       pic14_emitcode("mov","a,%s",l);
+       aopPut(AOP(result),"a",offset);
+      } else {
+       emitpcode(POC_MOVFW,  popGet(AOP(left),offset));
+       emitpcode(POC_MOVWF,  popGet(AOP(result),offset));
+       //aopPut(AOP(result),l,offset);
+      }
+      offset++;
     }
+  }
 
-    tlbl = newiTempLabel(NULL);
-    size = AOP_SIZE(result);
-    offset = 0 ;   
-    tlbl1 = newiTempLabel(NULL);
+  size = AOP_SIZE(result);
 
-    /* if it is only one byte then */
-    if (size == 1) {
-       symbol *tlbl1 = newiTempLabel(NULL);
+  /* if it is only one byte then */
+  if (size == 1) {
+    if(optimized_for_speed) {
+      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));
+      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));
+      emitpcode(POC_RLFW,   popGet(AOP(result),0));
+      emitpcode(POC_ANDLW,  popGetLit(0xfe));
+      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));
+    } else {
 
-        l = aopGet(AOP(left),0,FALSE,FALSE);
-        MOVA(l);
-       pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); 
-        pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-        pic14_emitcode("add","a,acc");
-       pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
-        pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);      
-        aopPut(AOP(result),"a",0);
-        goto release ;
+      tlbl = newiTempLabel(NULL);
+      if (!pic14_sameRegs(AOP(left),AOP(result))) {
+       emitpcode(POC_MOVFW,  popGet(AOP(left),0));
+       emitpcode(POC_MOVWF,  popGet(AOP(result),0));
+      }
+
+      emitpcode(POC_COMFW,  popGet(AOP(right),0));
+      emitpcode(POC_RRF,    popGet(AOP(result),0));
+      emitpLabel(tlbl->key);
+      emitpcode(POC_RLF,    popGet(AOP(result),0));
+      emitpcode(POC_ADDLW,  popGetLit(1));
+      emitSKPC;
+      emitpcode(POC_GOTO,popGetLabel(tlbl->key));
     }
+    goto release ;
+  }
     
-    reAdjustPreg(AOP(result));    
+  if (pic14_sameRegs(AOP(left),AOP(result))) {
+
+    tlbl = newiTempLabel(NULL);
+    emitpcode(POC_COMFW,  popGet(AOP(right),0));
+    genMultiAsm(POC_RRF, result, size,1);
+    emitpLabel(tlbl->key);
+    genMultiAsm(POC_RLF, result, size,0);
+    emitpcode(POC_ADDLW,  popGetLit(1));
+    emitSKPC;
+    emitpcode(POC_GOTO,popGetLabel(tlbl->key));
+    goto release;
+  }
+
+  //tlbl = newiTempLabel(NULL);
+  //offset = 0 ;   
+  //tlbl1 = newiTempLabel(NULL);
+
+  //reAdjustPreg(AOP(result));    
     
-    pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); 
-    pic14_emitcode("","%05d_DS_:",tlbl->key+100);    
-    l = aopGet(AOP(result),offset,FALSE,FALSE);
-    MOVA(l);
-    pic14_emitcode("add","a,acc");         
-    aopPut(AOP(result),"a",offset++);
-    while (--size) {
-        l = aopGet(AOP(result),offset,FALSE,FALSE);
-        MOVA(l);
-        pic14_emitcode("rlc","a");         
-        aopPut(AOP(result),"a",offset++);
-    }
-    reAdjustPreg(AOP(result));
+  //pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100); 
+  //pic14_emitcode("","%05d_DS_:",tlbl->key+100);    
+  //l = aopGet(AOP(result),offset,FALSE,FALSE);
+  //MOVA(l);
+  //pic14_emitcode("add","a,acc");         
+  //aopPut(AOP(result),"a",offset++);
+  //while (--size) {
+  //  l = aopGet(AOP(result),offset,FALSE,FALSE);
+  //  MOVA(l);
+  //  pic14_emitcode("rlc","a");         
+  //  aopPut(AOP(result),"a",offset++);
+  //}
+  //reAdjustPreg(AOP(result));
+
+  //pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
+  //pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
+
+
+  tlbl = newiTempLabel(NULL);
+  tlbl1= newiTempLabel(NULL);
 
-    pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
-    pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
-release:
-    freeAsmop(left,NULL,ic,TRUE);
-    freeAsmop(result,NULL,ic,TRUE);
+  size = AOP_SIZE(result);
+  offset = 1;
+
+  pctemp = popGetTempReg();  /* grab a temporary working register. */
+
+  emitpcode(POC_MOVFW, popGet(AOP(right),0));
+
+  /* offset should be 0, 1 or 3 */
+  emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3)));
+  emitSKPNZ;
+  emitpcode(POC_GOTO,  popGetLabel(tlbl1->key));
+
+  emitpcode(POC_MOVWF, pctemp);
+
+
+  emitpLabel(tlbl->key);
+
+  emitCLRC;
+  emitpcode(POC_RLF,  popGet(AOP(result),0));
+  while(--size)
+    emitpcode(POC_RLF,   popGet(AOP(result),offset++));
+
+  emitpcode(POC_DECFSZ,  pctemp);
+  emitpcode(POC_GOTO,popGetLabel(tlbl->key));
+  emitpLabel(tlbl1->key);
+
+  popReleaseTempReg(pctemp);
+
+
+ release:
+  freeAsmop (right,NULL,ic,TRUE);
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5910,21 +7380,27 @@ static void genrshOne (operand *result, operand *left,
 static void genrshTwo (operand *result,operand *left,
                        int shCount, int sign)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* if shCount >= 8 */
-    if (shCount >= 8) {
-        shCount -= 8 ;
-        if (shCount)
-            shiftR1Left2Result(left, MSB16, result, LSB,
-                               shCount, sign);
-        else 
-            movLeft2Result(left, MSB16, result, LSB, sign);
-        addSign(result, MSB16, sign);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* if shCount >= 8 */
+  if (shCount >= 8) {
+    shCount -= 8 ;
+    if (shCount)
+      shiftR1Left2Result(left, MSB16, result, LSB,
+                        shCount, sign);
+    else
+      movLeft2Result(left, MSB16, result, LSB);
+
+    emitpcode(POC_CLRF,popGet(AOP(result),MSB16));
+
+    if(sign) {
+      emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),LSB,FALSE,FALSE),7,0));
+      emitpcode(POC_DECF, popGet(AOP(result),MSB16));
     }
+  }
 
-    /*  1 <= shCount <= 7 */
-    else
-        shiftR2Left2Result(left, LSB, result, LSB, shCount, sign); 
+  /*  1 <= shCount <= 7 */
+  else
+    shiftR2Left2Result(left, LSB, result, LSB, shCount, sign); 
 }
 
 /*-----------------------------------------------------------------*/
@@ -5967,56 +7443,57 @@ static void shiftRLong (operand *left, int offl,
 static void genrshFour (operand *result, operand *left,
                         int shCount, int sign)
 {
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* if shifting more that 3 bytes */
-    if(shCount >= 24 ) {
-        shCount -= 24;
-        if(shCount)
-            shiftR1Left2Result(left, MSB32, result, LSB, shCount, sign);
-        else
-            movLeft2Result(left, MSB32, result, LSB, sign);
-        addSign(result, MSB16, sign);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* if shifting more that 3 bytes */
+  if(shCount >= 24 ) {
+    shCount -= 24;
+    if(shCount)
+      shiftR1Left2Result(left, MSB32, result, LSB, shCount, sign);
+    else
+      movLeft2Result(left, MSB32, result, LSB);
+
+    addSign(result, MSB16, sign);
+  }
+  else if(shCount >= 16){
+    shCount -= 16;
+    if(shCount)
+      shiftR2Left2Result(left, MSB24, result, LSB, shCount, sign);
+    else{
+      movLeft2Result(left, MSB24, result, LSB);
+      movLeft2Result(left, MSB32, result, MSB16);
     }
-    else if(shCount >= 16){
-        shCount -= 16;
-        if(shCount)
-            shiftR2Left2Result(left, MSB24, result, LSB, shCount, sign);
-        else{
-            movLeft2Result(left, MSB24, result, LSB, 0);
-            movLeft2Result(left, MSB32, result, MSB16, sign);
-        }
-        addSign(result, MSB24, sign);
+    addSign(result, MSB24, sign);
+  }
+  else if(shCount >= 8){
+    shCount -= 8;
+    if(shCount == 1)
+      shiftRLong(left, MSB16, result, sign);
+    else if(shCount == 0){
+      movLeft2Result(left, MSB16, result, LSB);
+      movLeft2Result(left, MSB24, result, MSB16);
+      movLeft2Result(left, MSB32, result, MSB24);
+      addSign(result, MSB32, sign);
     }
-    else if(shCount >= 8){
-        shCount -= 8;
-        if(shCount == 1)
-            shiftRLong(left, MSB16, result, sign);
-        else if(shCount == 0){
-            movLeft2Result(left, MSB16, result, LSB, 0);
-            movLeft2Result(left, MSB24, result, MSB16, 0);
-            movLeft2Result(left, MSB32, result, MSB24, sign);
-            addSign(result, MSB32, sign);
-        }
-        else{
-            shiftR2Left2Result(left, MSB16, result, LSB, shCount, 0);
-            shiftLLeftOrResult(left, MSB32, result, MSB16, 8 - shCount);
-            /* the last shift is signed */
-            shiftR1Left2Result(left, MSB32, result, MSB24, shCount, sign);
-            addSign(result, MSB32, sign);
-        }
+    else{
+      shiftR2Left2Result(left, MSB16, result, LSB, shCount, 0);
+      shiftLLeftOrResult(left, MSB32, result, MSB16, 8 - shCount);
+      /* the last shift is signed */
+      shiftR1Left2Result(left, MSB32, result, MSB24, shCount, sign);
+      addSign(result, MSB32, sign);
     }
-    else{   /* 1 <= shCount <= 7 */
-        if(shCount <= 2){
-            shiftRLong(left, LSB, result, sign);
-            if(shCount == 2)
-                shiftRLong(result, LSB, result, sign);
-        }
-        else{
-            shiftR2Left2Result(left, LSB, result, LSB, shCount, 0);
-            shiftLLeftOrResult(left, MSB24, result, MSB16, 8 - shCount);
-            shiftR2Left2Result(left, MSB24, result, MSB24, shCount, sign);
-        }
+  }
+  else{   /* 1 <= shCount <= 7 */
+    if(shCount <= 2){
+      shiftRLong(left, LSB, result, sign);
+      if(shCount == 2)
+       shiftRLong(result, LSB, result, sign);
+    }
+    else{
+      shiftR2Left2Result(left, LSB, result, LSB, shCount, 0);
+      shiftLLeftOrResult(left, MSB24, result, MSB16, 8 - shCount);
+      shiftR2Left2Result(left, MSB24, result, MSB24, shCount, sign);
     }
+  }
 }
 
 /*-----------------------------------------------------------------*/
@@ -6028,55 +7505,75 @@ static void genRightShiftLiteral (operand *left,
                                   iCode *ic,
                                   int sign)
 {    
-    int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit);
-    int size;
+  int shCount = (int) floatFromVal (AOP(right)->aopu.aop_lit);
+  int lsize,res_size;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    freeAsmop(right,NULL,ic,TRUE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  freeAsmop(right,NULL,ic,TRUE);
 
-    aopOp(left,ic,FALSE);
-    aopOp(result,ic,FALSE);
+  aopOp(left,ic,FALSE);
+  aopOp(result,ic,FALSE);
 
 #if VIEW_SIZE
-    pic14_emitcode("; shift right ","result %d, left %d",AOP_SIZE(result),
-             AOP_SIZE(left));
+  pic14_emitcode("; shift right ","result %d, left %d",AOP_SIZE(result),
+                AOP_SIZE(left));
 #endif
 
-    size = pic14_getDataSize(left);
-    /* test the LEFT size !!! */
+  lsize = pic14_getDataSize(left);
+  res_size = pic14_getDataSize(result);
+  /* test the LEFT size !!! */
 
-    /* I suppose that the left size >= result size */
-    if(shCount == 0){
-        size = pic14_getDataSize(result);
-        while(size--)
-            movLeft2Result(left, size, result, size, 0);
-    }
+  /* I suppose that the left size >= result size */
+  if(shCount == 0){
+    while(res_size--)
+      movLeft2Result(left, lsize, result, res_size);
+  }
 
-    else if(shCount >= (size * 8)){
-        if(sign)
-            /* get sign in acc.7 */
-            MOVA(aopGet(AOP(left),size-1,FALSE,FALSE));
-        addSign(result, LSB, sign);
-    } else{
-        switch (size) {
-            case 1:
-                genrshOne (result,left,shCount,sign);
-                break;
+  else if(shCount >= (lsize * 8)){
 
-            case 2:
-                genrshTwo (result,left,shCount,sign);
-                break;
+    if(res_size == 1) {
+      emitpcode(POC_CLRF, popGet(AOP(result),LSB));
+      if(sign) {
+       emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0));
+       emitpcode(POC_DECF, popGet(AOP(result),LSB));
+      }
+    } else {
 
-            case 4:
-                genrshFour (result,left,shCount,sign);
-                break;
-            default :
-                break;
-        }
+      if(sign) {
+       emitpcode(POC_MOVLW, popGetLit(0));
+       emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0));
+       emitpcode(POC_MOVLW, popGetLit(0xff));
+       while(res_size--)
+         emitpcode(POC_MOVWF, popGet(AOP(result),res_size));
+
+      } else {
+
+       while(res_size--)
+         emitpcode(POC_CLRF, popGet(AOP(result),res_size));
+      }
+    }
+  } else {
+
+    switch (res_size) {
+    case 1:
+      genrshOne (result,left,shCount,sign);
+      break;
+
+    case 2:
+      genrshTwo (result,left,shCount,sign);
+      break;
 
-        freeAsmop(left,NULL,ic,TRUE);
-        freeAsmop(result,NULL,ic,TRUE);
+    case 4:
+      genrshFour (result,left,shCount,sign);
+      break;
+    default :
+      break;
     }
+
+  }
+
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6084,97 +7581,140 @@ static void genRightShiftLiteral (operand *left,
 /*-----------------------------------------------------------------*/
 static void genSignedRightShift (iCode *ic)
 {
-    operand *right, *left, *result;
-    int size, offset;
-    char *l;
-    symbol *tlbl, *tlbl1 ;
+  operand *right, *left, *result;
+  int size, offset;
+  //  char *l;
+  symbol *tlbl, *tlbl1 ;
+  pCodeOp *pctemp;
 
-    /* we do it the hard way put the shift count in b
-    and loop thru preserving the sign */
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  //same = ((left == result) || (AOP(left) == AOP(result))) && (offl == offr);
 
-    right = IC_RIGHT(ic);
-    left  = IC_LEFT(ic);
-    result = IC_RESULT(ic);
+  /* we do it the hard way put the shift count in b
+     and loop thru preserving the sign */
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    aopOp(right,ic,FALSE);  
+  right = IC_RIGHT(ic);
+  left  = IC_LEFT(ic);
+  result = IC_RESULT(ic);
 
+  aopOp(right,ic,FALSE);  
+  aopOp(left,ic,FALSE);
+  aopOp(result,ic,FALSE);
 
-    if ( AOP_TYPE(right) == AOP_LIT) {
-       genRightShiftLiteral (left,right,result,ic,1);
-       return ;
-    }
-        /* shift count is unknown then we have to form 
-       a loop get the loop count in B : Note: we take
-       only the lower order byte since shifting
-       more that 32 bits make no sense anyway, ( the
-       largest size of an object can be only 32 bits ) */  
 
-    pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE));
-    pic14_emitcode("inc","b");
-    freeAsmop (right,NULL,ic,TRUE);
-    aopOp(left,ic,FALSE);
-    aopOp(result,ic,FALSE);
+  if ( AOP_TYPE(right) == AOP_LIT) {
+    genRightShiftLiteral (left,right,result,ic,1);
+    return ;
+  }
+  /* shift count is unknown then we have to form 
+     a loop get the loop count in B : Note: we take
+     only the lower order byte since shifting
+     more that 32 bits make no sense anyway, ( the
+     largest size of an object can be only 32 bits ) */  
+
+  //pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE));
+  //pic14_emitcode("inc","b");
+  //freeAsmop (right,NULL,ic,TRUE);
+  //aopOp(left,ic,FALSE);
+  //aopOp(result,ic,FALSE);
+
+  /* now move the left to the result if they are not the
+     same */
+  if (!pic14_sameRegs(AOP(left),AOP(result)) && 
+      AOP_SIZE(result) > 1) {
 
-    /* now move the left to the result if they are not the
-    same */
-    if (!pic14_sameRegs(AOP(left),AOP(result)) && 
-        AOP_SIZE(result) > 1) {
+    size = AOP_SIZE(result);
+    offset=0;
+    while (size--) { 
+      /*
+       l = aopGet(AOP(left),offset,FALSE,TRUE);
+       if (*l == '@' && IS_AOP_PREG(result)) {
 
-        size = AOP_SIZE(result);
-        offset=0;
-        while (size--) {
-            l = aopGet(AOP(left),offset,FALSE,TRUE);
-            if (*l == '@' && IS_AOP_PREG(result)) {
+       pic14_emitcode("mov","a,%s",l);
+       aopPut(AOP(result),"a",offset);
+       } else
+       aopPut(AOP(result),l,offset);
+      */
+      emitpcode(POC_MOVFW,  popGet(AOP(left),offset));
+      emitpcode(POC_MOVWF,  popGet(AOP(result),offset));
 
-                pic14_emitcode("mov","a,%s",l);
-                aopPut(AOP(result),"a",offset);
-            } else
-                aopPut(AOP(result),l,offset);
-            offset++;
-        }
+      offset++;
     }
+  }
+
+  /* mov the highest order bit to OVR */    
+  tlbl = newiTempLabel(NULL);
+  tlbl1= newiTempLabel(NULL);
+
+  size = AOP_SIZE(result);
+  offset = size - 1;
+
+  pctemp = popGetTempReg();  /* grab a temporary working register. */
 
-    /* mov the highest order bit to OVR */    
-    tlbl = newiTempLabel(NULL);
-    tlbl1= newiTempLabel(NULL);
+  emitpcode(POC_MOVFW, popGet(AOP(right),0));
 
-    size = AOP_SIZE(result);
-    offset = size - 1;
-    pic14_emitcode("mov","a,%s",aopGet(AOP(left),offset,FALSE,FALSE));
-    pic14_emitcode("rlc","a");
-    pic14_emitcode("mov","ov,c");
-    /* if it is only one byte then */
-    if (size == 1) {
-        l = aopGet(AOP(left),0,FALSE,FALSE);
-        MOVA(l);
-       pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100);
-        pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-        pic14_emitcode("mov","c,ov");
-        pic14_emitcode("rrc","a");
-       pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
-        pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
-        aopPut(AOP(result),"a",0);
-        goto release ;
-    }
+  /* offset should be 0, 1 or 3 */
+  emitpcode(POC_ANDLW, popGetLit(0x07 + ((offset&3) << 3)));
+  emitSKPNZ;
+  emitpcode(POC_GOTO,  popGetLabel(tlbl1->key));
 
-    reAdjustPreg(AOP(result));
+  emitpcode(POC_MOVWF, pctemp);
+
+
+  emitpLabel(tlbl->key);
+
+  emitpcode(POC_RLFW,  popGet(AOP(result),offset));
+  emitpcode(POC_RRF,   popGet(AOP(result),offset));
+
+  while(--size) {
+    emitpcode(POC_RRF,   popGet(AOP(result),--offset));
+  }
+
+  emitpcode(POC_DECFSZ,  pctemp);
+  emitpcode(POC_GOTO,popGetLabel(tlbl->key));
+  emitpLabel(tlbl1->key);
+
+  popReleaseTempReg(pctemp);
+#if 0
+  size = AOP_SIZE(result);
+  offset = size - 1;
+  pic14_emitcode("mov","a,%s",aopGet(AOP(left),offset,FALSE,FALSE));
+  pic14_emitcode("rlc","a");
+  pic14_emitcode("mov","ov,c");
+  /* if it is only one byte then */
+  if (size == 1) {
+    l = aopGet(AOP(left),0,FALSE,FALSE);
+    MOVA(l);
     pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100);
-    pic14_emitcode("","%05d_DS_:",tlbl->key+100);    
+    pic14_emitcode("","%05d_DS_:",tlbl->key+100);
     pic14_emitcode("mov","c,ov");
-    while (size--) {
-        l = aopGet(AOP(result),offset,FALSE,FALSE);
-        MOVA(l);
-        pic14_emitcode("rrc","a");         
-        aopPut(AOP(result),"a",offset--);
-    }
-    reAdjustPreg(AOP(result));
+    pic14_emitcode("rrc","a");
     pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
     pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
+    aopPut(AOP(result),"a",0);
+    goto release ;
+  }
 
-release:
-    freeAsmop(left,NULL,ic,TRUE);
-    freeAsmop(result,NULL,ic,TRUE);
+  reAdjustPreg(AOP(result));
+  pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100);
+  pic14_emitcode("","%05d_DS_:",tlbl->key+100);    
+  pic14_emitcode("mov","c,ov");
+  while (size--) {
+    l = aopGet(AOP(result),offset,FALSE,FALSE);
+    MOVA(l);
+    pic14_emitcode("rrc","a");         
+    aopPut(AOP(result),"a",offset--);
+  }
+  reAdjustPreg(AOP(result));
+  pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
+  pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
+
+ release:
+#endif
+
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
+  freeAsmop(right,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6226,7 +7766,6 @@ static void genRightShift (iCode *ic)
 
     pic14_emitcode("mov","b,%s",aopGet(AOP(right),0,FALSE,FALSE));
     pic14_emitcode("inc","b");
-    freeAsmop (right,NULL,ic,TRUE);
     aopOp(left,ic,FALSE);
     aopOp(result,ic,FALSE);
 
@@ -6256,16 +7795,22 @@ static void genRightShift (iCode *ic)
 
     /* if it is only one byte then */
     if (size == 1) {
-        l = aopGet(AOP(left),0,FALSE,FALSE);
-        MOVA(l);
-       pic14_emitcode("sjmp","%05d_DS_",tlbl1->key+100);
-        pic14_emitcode("","%05d_DS_:",tlbl->key+100);
-        CLRC;
-        pic14_emitcode("rrc","a");
-       pic14_emitcode("","%05d_DS_:",tlbl1->key+100);
-        pic14_emitcode("djnz","b,%05d_DS_",tlbl->key+100);
-        aopPut(AOP(result),"a",0);
-        goto release ;
+
+      tlbl = newiTempLabel(NULL);
+      if (!pic14_sameRegs(AOP(left),AOP(result))) {
+       emitpcode(POC_MOVFW,  popGet(AOP(left),0));
+       emitpcode(POC_MOVWF,  popGet(AOP(result),0));
+      }
+
+      emitpcode(POC_COMFW,  popGet(AOP(right),0));
+      emitpcode(POC_RLF,    popGet(AOP(result),0));
+      emitpLabel(tlbl->key);
+      emitpcode(POC_RRF,    popGet(AOP(result),0));
+      emitpcode(POC_ADDLW,  popGetLit(1));
+      emitSKPC;
+      emitpcode(POC_GOTO,popGetLabel(tlbl->key));
+
+      goto release ;
     }
 
     reAdjustPreg(AOP(result));
@@ -6285,6 +7830,7 @@ static void genRightShift (iCode *ic)
 
 release:
     freeAsmop(left,NULL,ic,TRUE);
+    freeAsmop (right,NULL,ic,TRUE);
     freeAsmop(result,NULL,ic,TRUE);
 }
 
@@ -6394,7 +7940,7 @@ static void genUnpackBits (operand *result, char *rname, int ptype)
     return ;
 }
 
-
+#if 0
 /*-----------------------------------------------------------------*/
 /* genDataPointerGet - generates code when ptr offset is known     */
 /*-----------------------------------------------------------------*/
@@ -6415,19 +7961,21 @@ static void genDataPointerGet (operand *left,
 
   aopOp(result,ic,TRUE);
 
-  emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,TRUE));
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+  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++;
   }
 
   freeAsmop(left,NULL,ic,TRUE);
   freeAsmop(result,NULL,ic,TRUE);
 }
-
+#endif
 /*-----------------------------------------------------------------*/
 /* genNearPointerGet - pic14_emitcode for near pointer fetch             */
 /*-----------------------------------------------------------------*/
@@ -6436,11 +7984,11 @@ static void genNearPointerGet (operand *left,
                               iCode *ic)
 {
     asmop *aop = NULL;
-    regs *preg = NULL ;
+    //regs *preg = NULL ;
     char *rname ;
     sym_link *rtype, *retype;
     sym_link *ltype = operandType(left);    
-    char buffer[80];
+    //char buffer[80];
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
@@ -6453,10 +8001,10 @@ static void genNearPointerGet (operand *left,
        result is not bit variable type and
        the left is pointer to data space i.e
        lower 128 bytes of space */
-    if (AOP_TYPE(left) == AOP_IMMD &&
+    if (AOP_TYPE(left) == AOP_PCODE &&  //AOP_TYPE(left) == AOP_IMMD &&
        !IS_BITVAR(retype)         &&
        DCL_TYPE(ltype) == POINTER) {
-       genDataPointerGet (left,result,ic);
+      //genDataPointerGet (left,result,ic);
        return ;
     }
     
@@ -6467,16 +8015,18 @@ static void genNearPointerGet (operand *left,
     if (!AOP_INPREG(AOP(left))) {
        /* otherwise get a free pointer register */
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+/*
        aop = newAsmop(0);
        preg = getFreePtr(ic,&aop,FALSE);
        pic14_emitcode("mov","%s,%s",
                preg->name,
                aopGet(AOP(left),0,FALSE,TRUE));
        rname = preg->name ;
+*/
+    rname ="BAD";
     } else
        rname = aopGet(AOP(left),0,FALSE,FALSE);
     
-    freeAsmop(left,NULL,ic,TRUE);
     aopOp (result,ic,FALSE);
     
       /* if bitfield then unpack the bits */
@@ -6484,10 +8034,20 @@ static void genNearPointerGet (operand *left,
        genUnpackBits (result,rname,POINTER);
     else {
        /* we have can just get the values */
-       int size = AOP_SIZE(result);
-       int offset = 0 ;        
+      int size = AOP_SIZE(result);
+      int offset = 0 ; 
        
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+      emitpcode(POC_MOVFW,popGet(AOP(left),0));
+      emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
+      while(size--) {
+       emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
+       emitpcode(POC_MOVWF,popGet(AOP(result),offset++));
+       if(size)
+         emitpcode(POC_INCF,popCopyReg(&pc_fsr));
+      }
+/*
        while (size--) {
            if (IS_AOP_PREG(result) || AOP_TYPE(result) == AOP_STK ) {
 
@@ -6501,6 +8061,7 @@ static void genNearPointerGet (operand *left,
            if (size)
                pic14_emitcode("inc","%s",rname);
        }
+*/
     }
 
     /* now some housekeeping stuff */
@@ -6526,6 +8087,7 @@ static void genNearPointerGet (operand *left,
     }
 
     /* done */
+    freeAsmop(left,NULL,ic,TRUE);
     freeAsmop(result,NULL,ic,TRUE);
      
 }
@@ -6660,11 +8222,11 @@ static void genFarPointerGet (operand *left,
 
     freeAsmop(result,NULL,ic,TRUE);
 }
-
+#if 0
 /*-----------------------------------------------------------------*/
-/* pic14_emitcodePointerGet - gget value from code space                  */
+/* genCodePointerGet - get value from code space                  */
 /*-----------------------------------------------------------------*/
-static void pic14_emitcodePointerGet (operand *left,
+static void genCodePointerGet (operand *left,
                                 operand *result, iCode *ic)
 {
     int size, offset ;
@@ -6711,78 +8273,100 @@ static void pic14_emitcodePointerGet (operand *left,
 
     freeAsmop(result,NULL,ic,TRUE);
 }
-
+#endif
 /*-----------------------------------------------------------------*/
 /* genGenPointerGet - gget value from generic pointer space        */
 /*-----------------------------------------------------------------*/
 static void genGenPointerGet (operand *left,
                               operand *result, iCode *ic)
 {
-    int size, offset ;
-    sym_link *retype = getSpec(operandType(result));
+  int size, offset ;
+  sym_link *retype = getSpec(operandType(result));
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    aopOp(left,ic,FALSE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  aopOp(left,ic,FALSE);
+  aopOp(result,ic,FALSE);
 
-    /* if the operand is already in dptr 
-    then we do nothing else we move the value to dptr */
-    if (AOP_TYPE(left) != AOP_STR) {
-        /* if this is remateriazable */
-        if (AOP_TYPE(left) == AOP_IMMD) {
-            pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE));
-           pic14_emitcode("mov","b,#%d",pointerCode(retype));
-       }
-        else { /* we need to get it byte by byte */
-         emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
-         //emitpcode(POC_MOVFW,popGet(AOP(left),0,FALSE,FALSE));
-         //emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
-         pic14_emitcode("movf","%s,w",aopGet(AOP(left),0,FALSE,FALSE));
-         pic14_emitcode("movwf","FSR");
-         /*
-            pic14_emitcode("mov","dpl,%s",aopGet(AOP(left),0,FALSE,FALSE));
-            pic14_emitcode("mov","dph,%s",aopGet(AOP(left),1,FALSE,FALSE));
-            if (options.model == MODEL_FLAT24)
-            {
-               pic14_emitcode("mov", "dpx,%s",aopGet(AOP(left),2,FALSE,FALSE));
-               pic14_emitcode("mov","b,%s",aopGet(AOP(left),3,FALSE,FALSE));
-            }
-            else
-            {
-               pic14_emitcode("mov","b,%s",aopGet(AOP(left),2,FALSE,FALSE));
-            }
-         */
-        }
+
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+  /* if the operand is already in dptr 
+     then we do nothing else we move the value to dptr */
+  //  if (AOP_TYPE(left) != AOP_STR) {
+    /* if this is remateriazable */
+    if (AOP_TYPE(left) == AOP_IMMD) {
+      pic14_emitcode("mov","dptr,%s",aopGet(AOP(left),0,TRUE,FALSE));
+      pic14_emitcode("mov","b,#%d",pointerCode(retype));
     }
-    /* so dptr know contains the address */
-    freeAsmop(left,NULL,ic,TRUE);
-    aopOp(result,ic,FALSE); 
+    else { /* we need to get it byte by byte */
 
-    /* if bit then unpack */
-    if (IS_BITVAR(retype)) 
-        genUnpackBits(result,"dptr",GPOINTER);
-    else {
-        size = AOP_SIZE(result);
-        offset = 0 ;
+      emitpcode(POC_MOVFW,popGet(AOP(left),0));
+      emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
 
-        while (size--) {
-         emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
+      size = AOP_SIZE(result);
+      offset = 0 ;
 
-         emitpcode(POC_MOVWF,popGet(AOP(result),offset++,FALSE,FALSE));
-         if(size)
-           emitpcode(POC_INCF,popCopyReg(&pc_fsr));
-/*
-         pic14_emitcode("movf","indf,w");
-         pic14_emitcode("movwf","%s",
-                  aopGet(AOP(result),offset++,FALSE,FALSE));
-         if (size)
-           pic14_emitcode("incf","fsr,f");
-*/
-        }
+      while(size--) {
+       emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
+       emitpcode(POC_MOVWF,popGet(AOP(result),offset++));
+       if(size)
+         emitpcode(POC_INCF,popCopyReg(&pc_fsr));
+      }
+      goto release;
     }
+    //}
+  /* so dptr know contains the address */
+
+  /* if bit then unpack */
+  //if (IS_BITVAR(retype)) 
+  //  genUnpackBits(result,"dptr",GPOINTER);
+
+ release:
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 
-    freeAsmop(result,NULL,ic,TRUE);
 }
 
+/*-----------------------------------------------------------------*/
+/* genConstPointerGet - get value from const generic pointer space */
+/*-----------------------------------------------------------------*/
+static void genConstPointerGet (operand *left,
+                               operand *result, iCode *ic)
+{
+  //sym_link *retype = getSpec(operandType(result));
+  symbol *albl = newiTempLabel(NULL);
+  symbol *blbl = newiTempLabel(NULL);
+  PIC_OPCODE poc;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  aopOp(left,ic,FALSE);
+  aopOp(result,ic,FALSE);
+
+
+  DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+  DEBUGpic14_emitcode ("; "," %d getting const pointer",__LINE__);
+
+  emitpcode(POC_CALL,popGetLabel(albl->key));
+  emitpcode(POC_GOTO,popGetLabel(blbl->key));
+  emitpLabel(albl->key);
+
+  poc = ( (AOP_TYPE(left) == AOP_PCODE) ? POC_MOVLW : POC_MOVFW);
+    
+  emitpcode(poc,popGet(AOP(left),1));
+  emitpcode(POC_MOVWF,popCopyReg(&pc_pclath));
+  emitpcode(poc,popGet(AOP(left),0));
+  emitpcode(POC_MOVWF,popCopyReg(&pc_pcl));
+
+  emitpLabel(blbl->key);
+
+  emitpcode(POC_MOVWF,popGet(AOP(result),0));
+
+
+  freeAsmop(left,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
+
+}
 /*-----------------------------------------------------------------*/
 /* genPointerGet - generate code for pointer get                   */
 /*-----------------------------------------------------------------*/
@@ -6801,6 +8385,10 @@ static void genPointerGet (iCode *ic)
     move it to the correct pointer register */
     type = operandType(left);
     etype = getSpec(type);
+
+    if (IS_PTR_CONST(type))
+      DEBUGpic14_emitcode ("; ***","%d - const pointer",__LINE__);
+
     /* if left is of type of pointer then it is simple */
     if (IS_PTR(type) && !IS_FUNC(type->next)) 
         p_type = DCL_TYPE(type);
@@ -6808,19 +8396,26 @@ static void genPointerGet (iCode *ic)
        /* we have to go by the storage class */
        p_type = PTR_TYPE(SPEC_OCLS(etype));
 
-/*     if (SPEC_OCLS(etype)->codesp ) { */
-/*         p_type = CPOINTER ;  */
-/*     } */
-/*     else */
-/*         if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */
-/*             p_type = FPOINTER ; */
-/*         else */
-/*             if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */
+       DEBUGpic14_emitcode ("; ***","%d - resolve pointer by storage class",__LINE__);
+
+       if (SPEC_OCLS(etype)->codesp ) {
+         DEBUGpic14_emitcode ("; ***","%d - cpointer",__LINE__);
+         //p_type = CPOINTER ; 
+       }
+       else
+           if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged)
+             DEBUGpic14_emitcode ("; ***","%d - fpointer",__LINE__);
+              /*p_type = FPOINTER ;*/ 
+           else
+               if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged)
+                 DEBUGpic14_emitcode ("; ***","%d - ppointer",__LINE__);
 /*                 p_type = PPOINTER; */
-/*             else */
-/*                 if (SPEC_OCLS(etype) == idata ) */
+               else
+                   if (SPEC_OCLS(etype) == idata )
+                     DEBUGpic14_emitcode ("; ***","%d - ipointer",__LINE__);
 /*                     p_type = IPOINTER; */
-/*                 else */
+                   else
+                     DEBUGpic14_emitcode ("; ***","%d - pointer",__LINE__);
 /*                     p_type = POINTER ; */
     }
 
@@ -6842,12 +8437,16 @@ static void genPointerGet (iCode *ic)
        break;
 
     case CPOINTER:
-       pic14_emitcodePointerGet (left,result,ic);
+       genConstPointerGet (left,result,ic);
+       //pic14_emitcodePointerGet (left,result,ic);
        break;
 
     case GPOINTER:
+      if (IS_PTR_CONST(type))
+       genConstPointerGet (left,result,ic);
+      else
        genGenPointerGet (left,result,ic);
-       break;
+      break;
     }
 
 }
@@ -7024,12 +8623,21 @@ static void genDataPointerSet(operand *right,
     
     l = aopGet(AOP(result),0,FALSE,TRUE);
     size = AOP_SIZE(right);
+/*
+    if ( AOP_TYPE(result) == AOP_PCODE) {
+      fprintf(stderr,"genDataPointerSet   %s, %d\n",
+             AOP(result)->aopu.pcop->name,
+             PCOI(AOP(result)->aopu.pcop)->offset);
+    }
+*/
+
     // tsd, was l+1 - the underline `_' prefix was being stripped
     while (size--) {
-       if (offset)
-           sprintf(buffer,"(%s + %d)",l,offset);
-       else
-           sprintf(buffer,"%s",l);
+      if (offset) {
+       sprintf(buffer,"(%s + %d)",l,offset);
+       fprintf(stderr,"oops  %s\n",buffer);
+      } else
+       sprintf(buffer,"%s",l);
 
        if (AOP_TYPE(right) == AOP_LIT) {
          unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit);
@@ -7039,18 +8647,21 @@ static void genDataPointerSet(operand *right,
            pic14_emitcode("movwf","%s",buffer);
 
            emitpcode(POC_MOVLW, popGetLit(lit&0xff));
-           emitpcode(POC_MOVWF, popRegFromString(buffer));
+           //emitpcode(POC_MOVWF, popRegFromString(buffer));
+           emitpcode(POC_MOVWF, popGet(AOP(result),0));
 
          } else {
            pic14_emitcode("clrf","%s",buffer);
-           emitpcode(POC_CLRF, popRegFromString(buffer));
+           //emitpcode(POC_CLRF, popRegFromString(buffer));
+           emitpcode(POC_CLRF, popGet(AOP(result),0));
          }
        }else {
          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_MOVWF, popRegFromString(buffer));
+         emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+         //emitpcode(POC_MOVWF, popRegFromString(buffer));
+         emitpcode(POC_MOVWF, popGet(AOP(result),0));
 
        }
 
@@ -7068,116 +8679,124 @@ static void genNearPointerSet (operand *right,
                                operand *result, 
                                iCode *ic)
 {
-    asmop *aop = NULL;
-    char *l;
-    sym_link *retype;
-    sym_link *ptype = operandType(result);
+  asmop *aop = NULL;
+  char *l;
+  sym_link *retype;
+  sym_link *ptype = operandType(result);
 
     
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    retype= getSpec(operandType(right));
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  retype= getSpec(operandType(right));
 
-    aopOp(result,ic,FALSE);
-    
-    /* if the result is rematerializable &
-       in data space & not a bit variable */
-    if (AOP_TYPE(result) == AOP_IMMD &&
-       DCL_TYPE(ptype) == POINTER   &&
-       !IS_BITVAR(retype)) {
-       genDataPointerSet (right,result,ic);
-       return;
-    }
+  aopOp(result,ic,FALSE);
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    
+  /* if the result is rematerializable &
+     in data space & not a bit variable */
+  //if (AOP_TYPE(result) == AOP_IMMD &&
+  if (AOP_TYPE(result) == AOP_PCODE &&  //AOP_TYPE(result) == AOP_IMMD &&
+      DCL_TYPE(ptype) == POINTER   &&
+      !IS_BITVAR(retype)) {
+    genDataPointerSet (right,result,ic);
+    freeAsmop(result,NULL,ic,TRUE);
+    return;
+  }
 
-    /* if the value is already in a pointer register
-    then don't need anything more */
-    if (!AOP_INPREG(AOP(result))) {
-        /* otherwise get a free pointer register */
-        //aop = newAsmop(0);
-        //preg = getFreePtr(ic,&aop,FALSE);
-       DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-       //pic14_emitcode("mov","%s,%s",
-        //         preg->name,
-        //         aopGet(AOP(result),0,FALSE,TRUE));
-        //rname = preg->name ;
-       pic14_emitcode("movwf","fsr");
-    }// else
-    //   rname = aopGet(AOP(result),0,FALSE,FALSE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  aopOp(right,ic,FALSE);
+  DEBUGpic14_AopType(__LINE__,NULL,right,result);
 
-    freeAsmop(result,NULL,ic,TRUE);
-    aopOp (right,ic,FALSE);
+  /* if the value is already in a pointer register
+     then don't need anything more */
+  if (!AOP_INPREG(AOP(result))) {
+    /* otherwise get a free pointer register */
+    //aop = newAsmop(0);
+    //preg = getFreePtr(ic,&aop,FALSE);
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-
-    /* if bitfield then unpack the bits */
-    if (IS_BITVAR(retype)) {
-      werror(E_INTERNAL_ERROR,__FILE__,__LINE__,
-            "The programmer is obviously confused");
-      //genPackBits (retype,right,rname,POINTER);
-      exit(1);
-    }
-    else {
-        /* we have can just get the values */
-        int size = AOP_SIZE(right);
-        int offset = 0 ;    
+    //pic14_emitcode("mov","%s,%s",
+    //         preg->name,
+    //         aopGet(AOP(result),0,FALSE,TRUE));
+    //rname = preg->name ;
+    //pic14_emitcode("movwf","fsr");
+    emitpcode(POC_MOVFW, popGet(AOP(result),0));
+    emitpcode(POC_MOVWF, popCopyReg(&pc_fsr));
+    emitpcode(POC_MOVFW, popGet(AOP(right),0));
+    emitpcode(POC_MOVWF, popCopyReg(&pc_indf));
+    goto release;
+
+  }// else
+  //   rname = aopGet(AOP(result),0,FALSE,FALSE);
+
+
+  /* if bitfield then unpack the bits */
+  if (IS_BITVAR(retype)) {
+    werror(E_INTERNAL_ERROR,__FILE__,__LINE__,
+          "The programmer is obviously confused");
+    //genPackBits (retype,right,rname,POINTER);
+    exit(1);
+  }
+  else {
+    /* we have can just get the values */
+    int size = AOP_SIZE(right);
+    int offset = 0 ;    
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-        while (size--) {
-            l = aopGet(AOP(right),offset,FALSE,TRUE);
-            if (*l == '@' ) {
-             //MOVA(l);
-             //pic14_emitcode("mov","@%s,a",rname);
-             pic14_emitcode("movf","indf,w ;1");
-            } else {
+    while (size--) {
+      l = aopGet(AOP(right),offset,FALSE,TRUE);
+      if (*l == '@' ) {
+       //MOVA(l);
+       //pic14_emitcode("mov","@%s,a",rname);
+       pic14_emitcode("movf","indf,w ;1");
+      } else {
 
-             if (AOP_TYPE(right) == AOP_LIT) {
-               unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit);
-               if(lit) {
-                 pic14_emitcode("movlw","%s",l);
-                 pic14_emitcode("movwf","indf ;2");
-               } else 
-                 pic14_emitcode("clrf","indf");
-             }else {
-               pic14_emitcode("movf","%s,w",l);
-               pic14_emitcode("movwf","indf ;2");
-             }
-           //pic14_emitcode("mov","@%s,%s",rname,l);
-           }
-            if (size)
-             pic14_emitcode("incf","fsr,f ;3");
-           //pic14_emitcode("inc","%s",rname);
-            offset++;
-        }
+       if (AOP_TYPE(right) == AOP_LIT) {
+         unsigned int lit = (unsigned int) floatFromVal (AOP(IC_RIGHT(ic))->aopu.aop_lit);
+         if(lit) {
+           pic14_emitcode("movlw","%s",l);
+           pic14_emitcode("movwf","indf ;2");
+         } else 
+           pic14_emitcode("clrf","indf");
+       }else {
+         pic14_emitcode("movf","%s,w",l);
+         pic14_emitcode("movwf","indf ;2");
+       }
+       //pic14_emitcode("mov","@%s,%s",rname,l);
+      }
+      if (size)
+       pic14_emitcode("incf","fsr,f ;3");
+      //pic14_emitcode("inc","%s",rname);
+      offset++;
     }
+  }
 
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* now some housekeeping stuff */
+  if (aop) {
+    /* we had to allocate for this iCode */
+    freeAsmop(NULL,aop,ic,TRUE);
+  } else { 
+    /* we did not allocate which means left
+       already in a pointer register, then
+       if size > 0 && this could be used again
+       we have to point it back to where it 
+       belongs */
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* now some housekeeping stuff */
-    if (aop) {
-        /* we had to allocate for this iCode */
-        freeAsmop(NULL,aop,ic,TRUE);
-    } else { 
-        /* we did not allocate which means left
-        already in a pointer register, then
-        if size > 0 && this could be used again
-        we have to point it back to where it 
-        belongs */
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-        if (AOP_SIZE(right) > 1 &&
-            !OP_SYMBOL(result)->remat &&
-            ( OP_SYMBOL(result)->liveTo > ic->seq ||
-              ic->depth )) {
-            int size = AOP_SIZE(right) - 1;
-            while (size--)
-             pic14_emitcode("decf","fsr,f");
-             //pic14_emitcode("dec","%s",rname);
-        }
+    if (AOP_SIZE(right) > 1 &&
+       !OP_SYMBOL(result)->remat &&
+       ( OP_SYMBOL(result)->liveTo > ic->seq ||
+         ic->depth )) {
+      int size = AOP_SIZE(right) - 1;
+      while (size--)
+       pic14_emitcode("decf","fsr,f");
+      //pic14_emitcode("dec","%s",rname);
     }
+  }
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /* done */
-    freeAsmop(right,NULL,ic,TRUE);
-
-
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  /* done */
+ release:
+  freeAsmop(right,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7317,59 +8936,105 @@ static void genFarPointerSet (operand *right,
 static void genGenPointerSet (operand *right,
                               operand *result, iCode *ic)
 {
-    int size, offset ;
-    sym_link *retype = getSpec(operandType(right));
+  int size, offset ;
+  sym_link *retype = getSpec(operandType(right));
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+  aopOp(result,ic,FALSE);
+  aopOp(right,ic,FALSE);
+  size = AOP_SIZE(right);
+
+  DEBUGpic14_AopType(__LINE__,NULL,right,result);
+
+  /* if the operand is already in dptr 
+     then we do nothing else we move the value to dptr */
+  if (AOP_TYPE(result) != AOP_STR) {
+    /* if this is remateriazable */
+    if (AOP_TYPE(result) == AOP_IMMD) {
+      pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE));
+      pic14_emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE));
+    }
+    else { /* we need to get it byte by byte */
+      //char *l = aopGet(AOP(result),0,FALSE,FALSE);
+      size = AOP_SIZE(right);
+      offset = 0 ;
+
+      /* hack hack! see if this the FSR. If so don't load W */
+      if(AOP_TYPE(right) != AOP_ACC) {
+
+
+       emitpcode(POC_MOVFW,popGet(AOP(result),0));
+       emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+       if(AOP_SIZE(result) > 1) {
+         emitpcode(POC_BCF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT));
+         emitpcode(POC_BTFSC,newpCodeOpBit(aopGet(AOP(result),1,FALSE,FALSE),0,0));
+         emitpcode(POC_BSF,  popCopyGPR2Bit(PCOP(&pc_status),PIC_IRP_BIT));
 
-    aopOp(result,ic,FALSE);
+       }
 
-    /* if the operand is already in dptr 
-    then we do nothing else we move the value to dptr */
-    if (AOP_TYPE(result) != AOP_STR) {
-        /* if this is remateriazable */
-        if (AOP_TYPE(result) == AOP_IMMD) {
-            pic14_emitcode("mov","dptr,%s",aopGet(AOP(result),0,TRUE,FALSE));
-            pic14_emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE));
-        }
-        else { /* we need to get it byte by byte */
-         char *l = aopGet(AOP(result),0,FALSE,FALSE);
+       //if(size==2)
+       //emitpcode(POC_DECF,popCopyReg(&pc_fsr));
+       //if(size==4) {
+       //  emitpcode(POC_MOVLW,popGetLit(0xfd));
+       //  emitpcode(POC_ADDWF,popCopyReg(&pc_fsr));
+       //}
 
-         if(strcmp("FSR",l))
-           emitpcode(POC_MOVLW ,popGet(AOP(result),0,FALSE,FALSE));
+       while(size--) {
+         emitpcode(POC_MOVFW,popGet(AOP(right),offset++));
          emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
+         
+         if(size)
+           emitpcode(POC_INCF,popCopyReg(&pc_fsr));
+       }
 
-         if(strcmp("FSR",l))
-           pic14_emitcode("movlw","%s",aopGet(AOP(result),0,FALSE,FALSE));
 
-         pic14_emitcode("movwf","INDF");
-        }
+       goto release;
+      } 
+
+      if(aopIdx(AOP(result),0) != 4) {
+
+       emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
+       goto release;
+      }
+
+      emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
+      goto release;
+
     }
-    /* so dptr know contains the address */
-    freeAsmop(result,NULL,ic,TRUE);
-    aopOp(right,ic,FALSE);
+  }
+  /* so dptr know contains the address */
 
-    /* if bit then unpack */
-    if (IS_BITVAR(retype)) 
-        genPackBits(retype,right,"dptr",GPOINTER);
-    else {
-        size = AOP_SIZE(right);
-        offset = 0 ;
 
-        while (--size) {
-         //char *l = aopGet(AOP(right),offset++,FALSE,FALSE);
-           if(size)
-             pic14_emitcode("incf","fsr,f");
-           pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset++,FALSE,FALSE));
-           pic14_emitcode("movwf","indf");
-            //MOVA(l);
-            //DEBUGpic14_emitcode(";lcall","__gptrput");
-            //if (size)
-            //    pic14_emitcode("inc","dptr");
-        }
+  /* if bit then unpack */
+  if (IS_BITVAR(retype)) 
+    genPackBits(retype,right,"dptr",GPOINTER);
+  else {
+    size = AOP_SIZE(right);
+    offset = 0 ;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d size=%d",__FUNCTION__,__LINE__,size);
+
+    while (size--) {
+
+      emitpcode(POC_MOVFW,popGet(AOP(result),offset));
+      emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
+
+      if (AOP_TYPE(right) == AOP_LIT) 
+       emitpcode(POC_MOVLW, popGet(AOP(right),offset));
+      else
+       emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+
+      emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
+
+      offset++;
     }
+  }
 
-    freeAsmop(right,NULL,ic,TRUE);
+ release:
+  freeAsmop(right,NULL,ic,TRUE);
+  freeAsmop(result,NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7434,8 +9099,11 @@ static void genPointerSet (iCode *ic)
     case GPOINTER:
        genGenPointerSet (right,result,ic);
        break;
-    }
 
+    default:
+      werror (E_INTERNAL_ERROR, __FILE__, __LINE__, 
+             "genPointerSet: illegal pointer type");
+    }
 }
 
 /*-----------------------------------------------------------------*/
@@ -7443,44 +9111,39 @@ static void genPointerSet (iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genIfx (iCode *ic, iCode *popIc)
 {
-    operand *cond = IC_COND(ic);
-    int isbit =0;
-
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    aopOp(cond,ic,FALSE);
+  operand *cond = IC_COND(ic);
+  int isbit =0;
 
-    /* get the value into acc */
-    if (AOP_TYPE(cond) != AOP_CRY)
-        pic14_toBoolean(cond);
-    else
-        isbit = 1;
-    /* the result is now in the accumulator */
-    freeAsmop(cond,NULL,ic,TRUE);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* if there was something to be popped then do it */
-    if (popIc)
-        genIpop(popIc);
+  aopOp(cond,ic,FALSE);
 
-    /* if the condition is  a bit variable */
-    if (isbit && IS_ITEMP(cond) && 
-       SPIL_LOC(cond)) {
-      genIfxJump(ic,SPIL_LOC(cond)->rname);
-      DEBUGpic14_emitcode ("; isbit  SPIL_LOC","%s",SPIL_LOC(cond)->rname);
-    }
-    else {
-      /*
-       if (isbit && !IS_ITEMP(cond))
-         DEBUGpic14_emitcode ("; isbit OP_SYM","%s",OP_SYMBOL(cond)->rname);
-       else
-         DEBUGpic14_emitcode ("; isbit","a");
-      */
+  /* get the value into acc */
+  if (AOP_TYPE(cond) != AOP_CRY)
+    pic14_toBoolean(cond);
+  else
+    isbit = 1;
+  /* the result is now in the accumulator */
+  freeAsmop(cond,NULL,ic,TRUE);
+
+  /* if there was something to be popped then do it */
+  if (popIc)
+    genIpop(popIc);
+
+  /* if the condition is  a bit variable */
+  if (isbit && IS_ITEMP(cond) && 
+      SPIL_LOC(cond)) {
+    genIfxJump(ic,SPIL_LOC(cond)->rname);
+    DEBUGpic14_emitcode ("; isbit  SPIL_LOC","%s",SPIL_LOC(cond)->rname);
+  }
+  else {
+    if (isbit && !IS_ITEMP(cond))
+      genIfxJump(ic,OP_SYMBOL(cond)->rname);
+    else
+      genIfxJump(ic,"a");
+  }
+  ic->generated = 1;
 
-       if (isbit && !IS_ITEMP(cond))
-           genIfxJump(ic,OP_SYMBOL(cond)->rname);
-       else
-           genIfxJump(ic,"a");
-    }
-    ic->generated = 1;
 }
 
 /*-----------------------------------------------------------------*/
@@ -7488,71 +9151,31 @@ static void genIfx (iCode *ic, iCode *popIc)
 /*-----------------------------------------------------------------*/
 static void genAddrOf (iCode *ic)
 {
-    symbol *sym = OP_SYMBOL(IC_LEFT(ic));
-    int size, offset ;
+  operand *right, *result, *left;
+  int size, offset ;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    aopOp(IC_RESULT(ic),ic,FALSE);
 
-    /* if the operand is on the stack then we 
-    need to get the stack offset of this
-    variable */
-    if (sym->onStack) {
-        /* if it has an offset then we need to compute
-        it */
-        if (sym->stack) {
-            pic14_emitcode("mov","a,_bp");
-            pic14_emitcode("add","a,#0x%02x",((char) sym->stack & 0xff));
-            aopPut(AOP(IC_RESULT(ic)),"a",0);       
-        } else {
-            /* we can just move _bp */
-            aopPut(AOP(IC_RESULT(ic)),"_bp",0);
-        }
-        /* fill the result with zero */
-        size = AOP_SIZE(IC_RESULT(ic)) - 1;
-        
-        
-        if (options.stack10bit && size < (FPTRSIZE - 1))
-        {
-            fprintf(stderr, 
-                   "*** warning: pointer to stack var truncated.\n");
-        }
-        
-        offset = 1;
-        while (size--)
-        {
-            /* Yuck! */
-            if (options.stack10bit && offset == 2)
-            {
-                aopPut(AOP(IC_RESULT(ic)),"#0x40", offset++);
-            }
-            else
-            {
-               aopPut(AOP(IC_RESULT(ic)),zero,offset++);
-            }
-        }
+  //aopOp(IC_RESULT(ic),ic,FALSE);
 
-        goto release;
-    }
+  aopOp((left=IC_LEFT(ic)),ic,FALSE);
+  aopOp((right=IC_RIGHT(ic)),ic,FALSE);
+  aopOp((result=IC_RESULT(ic)),ic,TRUE);
 
-    /* object not on stack then we need the name */
-    size = AOP_SIZE(IC_RESULT(ic));
-    offset = 0;
+  DEBUGpic14_AopType(__LINE__,left,right,result);
 
-    while (size--) {
-        char s[SDCC_NAME_MAX];
-        if (offset) 
-            sprintf(s,"#(%s >> %d)",
-                    sym->rname,
-                    offset*8);
-        else
-            sprintf(s,"#%s",sym->rname);
-        aopPut(AOP(IC_RESULT(ic)),s,offset++);
-    }
+  size = AOP_SIZE(IC_RESULT(ic));
+  offset = 0;
 
-release:
-    freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+  while (size--) {
+    emitpcode(POC_MOVLW, popGet(AOP(left),offset));
+    emitpcode(POC_MOVWF, popGet(AOP(result),offset));
+    offset++;
+  }
+
+  freeAsmop(left,NULL,ic,FALSE);
+  freeAsmop(result,NULL,ic,TRUE);
 
 }
 
@@ -7590,121 +9213,127 @@ static void genFarFarAssign (operand *result, operand *right, iCode *ic)
 /*-----------------------------------------------------------------*/
 static void genAssign (iCode *ic)
 {
-    operand *result, *right;
-    int size, offset ;
-       unsigned long lit = 0L;
+  operand *result, *right;
+  int size, offset,know_W;
+  unsigned long lit = 0L;
 
-    result = IC_RESULT(ic);
-    right  = IC_RIGHT(ic) ;
+  result = IC_RESULT(ic);
+  right  = IC_RIGHT(ic) ;
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* if they are the same */
-    if (operandsEqu (IC_RESULT(ic),IC_RIGHT(ic)))
-        return ;
+  /* if they are the same */
+  if (operandsEqu (IC_RESULT(ic),IC_RIGHT(ic)))
+    return ;
 
-    aopOp(right,ic,FALSE);
-    aopOp(result,ic,TRUE);
+  aopOp(right,ic,FALSE);
+  aopOp(result,ic,TRUE);
 
-    /* if they are the same registers */
-    if (pic14_sameRegs(AOP(right),AOP(result)))
-        goto release;
+  DEBUGpic14_AopType(__LINE__,NULL,right,result);
 
-    /* if the result is a bit */
-    if (AOP_TYPE(result) == AOP_CRY) {
+  /* if they are the same registers */
+  if (pic14_sameRegs(AOP(right),AOP(result)))
+    goto release;
 
-        /* if the right size is a literal then
-        we know what the value is */
-        if (AOP_TYPE(right) == AOP_LIT) {
+  /* if the result is a bit */
+  if (AOP_TYPE(result) == AOP_CRY) {
+
+    /* if the right size is a literal then
+       we know what the value is */
+    if (AOP_TYPE(right) == AOP_LIT) {
          
-         emitpcode(  ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
-                     popGet(AOP(result),0,FALSE,FALSE));
+      emitpcode(  ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
+                 popGet(AOP(result),0));
 
-            if (((int) operandLitValue(right))) 
-             pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
+      if (((int) operandLitValue(right))) 
+       pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
                       AOP(result)->aopu.aop_dir,
                       AOP(result)->aopu.aop_dir);
-            else
-             pic14_emitcode("bcf","(%s >> 3),(%s & 7)",
-                AOP(result)->aopu.aop_dir,
-                AOP(result)->aopu.aop_dir);
-            goto release;
-        }
+      else
+       pic14_emitcode("bcf","(%s >> 3),(%s & 7)",
+                      AOP(result)->aopu.aop_dir,
+                      AOP(result)->aopu.aop_dir);
+      goto release;
+    }
 
-        /* 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));
-
-         pic14_emitcode("bcf","(%s >> 3),(%s & 7)",
-                  AOP(result)->aopu.aop_dir,
-                  AOP(result)->aopu.aop_dir);
-         pic14_emitcode("btfsc","(%s >> 3),(%s & 7)",
-                  AOP(right)->aopu.aop_dir,
-                  AOP(right)->aopu.aop_dir);
-         pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
-                  AOP(result)->aopu.aop_dir,
-                  AOP(result)->aopu.aop_dir);
-         goto release ;
-        }
+    /* the right is also a bit variable */
+    if (AOP_TYPE(right) == AOP_CRY) {
+      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,
+                    AOP(result)->aopu.aop_dir);
+      pic14_emitcode("btfsc","(%s >> 3),(%s & 7)",
+                    AOP(right)->aopu.aop_dir,
+                    AOP(right)->aopu.aop_dir);
+      pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
+                    AOP(result)->aopu.aop_dir,
+                    AOP(result)->aopu.aop_dir);
+      goto release ;
+    }
+
+    /* we need to or */
+    emitpcode(POC_BCF,    popGet(AOP(result),0));
+    pic14_toBoolean(right);
+    emitSKPZ;
+    emitpcode(POC_BSF,    popGet(AOP(result),0));
+    //aopPut(AOP(result),"a",0);
+    goto release ;
+  }
 
-        /* we need to or */
-       emitpcode(POC_BCF,    popGet(AOP(result),0,FALSE,FALSE));
-        pic14_toBoolean(right);
-       emitSKPZ;
-       emitpcode(POC_BSF,    popGet(AOP(result),0,FALSE,FALSE));
-        //aopPut(AOP(result),"a",0);
-        goto release ;
-    }
+  /* bit variables done */
+  /* general case */
+  size = AOP_SIZE(result);
+  offset = 0 ;
+  if(AOP_TYPE(right) == AOP_LIT)
+    lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
 
-    /* bit variables done */
-    /* general case */
-    size = AOP_SIZE(result);
-    offset = 0 ;
-    if(AOP_TYPE(right) == AOP_LIT)
-       lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
-    if((AOP_TYPE(result) != AOP_REG) &&
-       (AOP_TYPE(right) == AOP_LIT) &&
-       !IS_FLOAT(operandType(right)) &&
-       (lit < 256L)){
+  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) {
+  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__);
+  }
 
-       while (size--) {
-         if((unsigned int)((lit >> (size*8)) & 0x0FFL)== 0) {
-           //pic14_emitcode("clrf","%s", aopGet(AOP(result),size,FALSE,FALSE));
-             emitpcode(POC_CLRF,popGet(AOP(result),size,FALSE,FALSE));
-           }else {
-             emitpcode(POC_MOVLW,popGet(AOP(right),size,FALSE,FALSE));
-             emitpcode(POC_MOVWF,popGet(AOP(result),size,FALSE,FALSE));
-             //pic14_emitcode("movlw","%s", aopGet(AOP(right),size,FALSE,FALSE));
-             //pic14_emitcode("movwf","%s", aopGet(AOP(result),size,FALSE,FALSE));
-           }
-       }
+  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));
+      } else
+       emitpcode(POC_CLRF, popGet(AOP(result),offset));
+
+      lit >>= 8;
+
+    } else if (AOP_TYPE(right) == AOP_CRY) {
+      emitpcode(POC_CLRF, popGet(AOP(result),offset));
+      if(offset == 0) {
+       emitpcode(POC_BTFSS, popGet(AOP(right),0));
+       emitpcode(POC_INCF, popGet(AOP(result),0));
+      }
     } else {
-       while (size--) {
-         if(AOP_TYPE(right) == AOP_LIT) {
-           emitpcode(POC_MOVLW, popGet(AOP(right),offset,FALSE,FALSE));
-           emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
-
-         } else if (AOP_TYPE(right) == AOP_CRY) {
-           emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
-           if(offset == 0) {
-             emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
-             emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE));
-           }
-         } else {
-           emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
-           emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
-         }
-           
-         //pic14_emitcode("movwf","%s", aopGet(AOP(result),offset,FALSE,FALSE));
-         offset++;
-       }
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+      emitpcode(POC_MOVWF, popGet(AOP(result),offset));
     }
+           
+    offset++;
+  }
+
     
-release:
-    freeAsmop (right,NULL,ic,FALSE);
-    freeAsmop (result,NULL,ic,TRUE);
+ release:
+  freeAsmop (right,NULL,ic,FALSE);
+  freeAsmop (result,NULL,ic,TRUE);
 }   
 
 /*-----------------------------------------------------------------*/
@@ -7724,16 +9353,28 @@ static void genJumpTab (iCode *ic)
     /* multiply by three */
     pic14_emitcode("add","a,acc");
     pic14_emitcode("add","a,%s",aopGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE));
-    freeAsmop(IC_JTCOND(ic),NULL,ic,TRUE);
 
     jtab = newiTempLabel(NULL);
     pic14_emitcode("mov","dptr,#%05d_DS_",jtab->key+100);
     pic14_emitcode("jmp","@a+dptr");
     pic14_emitcode("","%05d_DS_:",jtab->key+100);
+
+    emitpcode(POC_MOVLW, popGetLabel(jtab->key));
+    emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0));
+    emitSKPNC;
+    emitpcode(POC_INCF, popCopyReg(&pc_pclath));
+    emitpcode(POC_MOVWF, popCopyReg(&pc_pcl));
+    emitpLabel(jtab->key);
+
+    freeAsmop(IC_JTCOND(ic),NULL,ic,TRUE);
+
     /* now generate the jump labels */
     for (jtab = setFirstItem(IC_JTLABELS(ic)) ; jtab;
-         jtab = setNextItem(IC_JTLABELS(ic)))
+         jtab = setNextItem(IC_JTLABELS(ic))) {
         pic14_emitcode("ljmp","%05d_DS_",jtab->key+100);
+       emitpcode(POC_GOTO,popGetLabel(jtab->key));
+       
+    }
 
 }
 
@@ -7875,6 +9516,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 ;
 
@@ -7886,14 +9528,17 @@ 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
         we know what the value is */
+      DEBUGpic14_emitcode("; ***","%s  %d",__FUNCTION__,__LINE__);
         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)",
@@ -7911,7 +9556,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)",
@@ -7922,28 +9567,70 @@ 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);
+
+      DEBUGpic14_emitcode("; ***","%s  %d",__FUNCTION__,__LINE__);
+
+      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)) {
 
         /* if they are in the same place */
-        if (pic14_sameRegs(AOP(right),AOP(result)))
-            goto release;
+      if (pic14_sameRegs(AOP(right),AOP(result)))
+       goto release;
+
+      DEBUGpic14_emitcode("; ***","%s  %d",__FUNCTION__,__LINE__);
+      if (IS_PTR_CONST(rtype))
+       DEBUGpic14_emitcode ("; ***","%d - right is const pointer",__LINE__);
+      if (IS_PTR_CONST(operandType(IC_RESULT(ic))))
+       DEBUGpic14_emitcode ("; ***","%d - result is const pointer",__LINE__);
+
+      if ((AOP_TYPE(right) == AOP_PCODE) && AOP(right)->aopu.pcop->type == PO_IMMEDIATE) {
+       emitpcode(POC_MOVLW, popGet(AOP(right),0));
+       emitpcode(POC_MOVWF, popGet(AOP(result),0));
+       emitpcode(POC_MOVLW, popGet(AOP(right),1));
+       emitpcode(POC_MOVWF, popGet(AOP(result),1));
+        if(AOP_SIZE(result) <2)
+         fprintf(stderr,"%d -- result is not big enough to hold a ptr\n",__LINE__);
+
+      } else {
 
         /* if they in different places then copy */
         size = AOP_SIZE(result);
         offset = 0 ;
         while (size--) {
-            aopPut(AOP(result),
-                   aopGet(AOP(right),offset,FALSE,FALSE),
-                   offset);
-            offset++;
+         emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+         emitpcode(POC_MOVWF, popGet(AOP(result),offset));
+
+         //aopPut(AOP(result),
+         // aopGet(AOP(right),offset,FALSE,FALSE),
+         // offset);
+
+         offset++;
         }
-        goto release;
+      }
+      goto release;
     }
 
 
@@ -7953,6 +9640,7 @@ static void genCast (iCode *ic)
        int p_type;
        sym_link *type = operandType(right);
        sym_link *etype = getSpec(type);
+      DEBUGpic14_emitcode("; ***","%s  %d - pointer cast",__FUNCTION__,__LINE__);
 
        /* pointer to generic pointer */
        if (IS_GENPTR(ctype)) {
@@ -7980,27 +9668,41 @@ static void genCast (iCode *ic)
            }
                
            /* the first two bytes are known */
+      DEBUGpic14_emitcode("; ***","%s  %d - pointer cast2",__FUNCTION__,__LINE__);
            size = GPTRSIZE - 1; 
            offset = 0 ;
            while (size--) {
-               aopPut(AOP(result),
-                      aopGet(AOP(right),offset,FALSE,FALSE),
-                      offset);
-               offset++;
+             if(offset < AOP_SIZE(right)) {
+      DEBUGpic14_emitcode("; ***","%s  %d - pointer cast3",__FUNCTION__,__LINE__);
+               if ((AOP_TYPE(right) == AOP_PCODE) && 
+                   AOP(right)->aopu.pcop->type == PO_IMMEDIATE) {
+                 emitpcode(POC_MOVLW, popGet(AOP(right),offset));
+                 emitpcode(POC_MOVWF, popGet(AOP(result),offset));
+               } else { 
+                 aopPut(AOP(result),
+                        aopGet(AOP(right),offset,FALSE,FALSE),
+                        offset);
+               }
+             } else 
+               emitpcode(POC_CLRF,popGet(AOP(result),offset));
+             offset++;
            }
            /* the last byte depending on type */
            switch (p_type) {
            case IPOINTER:
            case POINTER:
-               l = zero;
+               emitpcode(POC_CLRF,popGet(AOP(result),GPTRSIZE - 1));
                break;
            case FPOINTER:
+             pic14_emitcode(";BUG!? ","%d",__LINE__);
                l = one;
                break;
            case CPOINTER:
+             pic14_emitcode(";BUG!? ","%d",__LINE__);
                l = "#0x02";
                break;                          
            case PPOINTER:
+             pic14_emitcode(";BUG!? ","%d",__LINE__);
                l = "#0x03";
                break;
                
@@ -8010,7 +9712,7 @@ static void genCast (iCode *ic)
                       "got unknown pointer type");
                exit(1);
            }
-           aopPut(AOP(result),l, GPTRSIZE - 1);            
+           //aopPut(AOP(result),l, GPTRSIZE - 1);          
            goto release ;
        }
        
@@ -8027,25 +9729,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.
@@ -8055,51 +9738,45 @@ static void genCast (iCode *ic)
     if(genMixedOperation(ic))
       goto release;
 
+    DEBUGpic14_emitcode("; ***","%s  %d",__FUNCTION__,__LINE__);
     
     /* we move to result for the size of source */
     size = AOP_SIZE(right);
     offset = 0 ;
     while (size--) {
-      pic14_emitcode(";","%d",__LINE__);
-        aopPut(AOP(result),
-               aopGet(AOP(right),offset,FALSE,FALSE),
-               offset);
-        offset++;
+      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 :{ */
-      //char *l = aopGet(AOP(right),AOP_SIZE(right) - 1,FALSE,FALSE);
-      //MOVA(l);
-
-      emitpcode(POC_CLRW,    NULL);
-      emitpcode(POC_BTFSC,   popGet(AOP(right),0,FALSE,FALSE));
-      emitpcode(POC_MOVLW,   popGetLit(0xff));
-
-        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(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);
+
+       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));
 
-    /* we are done hurray !!!! */
+        while (size--)
+         emitpcode(POC_MOVWF,   popGet(AOP(result),offset++));
+      }
+    }
 
 release:
     freeAsmop(right,NULL,ic,TRUE);
@@ -8151,7 +9828,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));
@@ -8174,35 +9851,35 @@ static int genDjnz (iCode *ic, iCode *ifx)
 /*-----------------------------------------------------------------*/
 static void genReceive (iCode *ic)
 {    
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    if (isOperandInFarSpace(IC_RESULT(ic)) && 
-       ( OP_SYMBOL(IC_RESULT(ic))->isspilt ||
-         IS_TRUE_SYMOP(IC_RESULT(ic))) ) {
+  if (isOperandInFarSpace(IC_RESULT(ic)) && 
+      ( OP_SYMBOL(IC_RESULT(ic))->isspilt ||
+       IS_TRUE_SYMOP(IC_RESULT(ic))) ) {
 
-       int size = getSize(operandType(IC_RESULT(ic)));
-       int offset =  fReturnSizePic - size;
-       while (size--) {
-           pic14_emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ?
+    int size = getSize(operandType(IC_RESULT(ic)));
+    int offset =  fReturnSizePic - size;
+    while (size--) {
+      pic14_emitcode ("push","%s", (strcmp(fReturn[fReturnSizePic - offset - 1],"a") ?
                                    fReturn[fReturnSizePic - offset - 1] : "acc"));
-           offset++;
-       }
-       aopOp(IC_RESULT(ic),ic,FALSE);  
-       size = AOP_SIZE(IC_RESULT(ic));
-       offset = 0;
-       while (size--) {
-           pic14_emitcode ("pop","acc");
-           aopPut (AOP(IC_RESULT(ic)),"a",offset++);
-       }
-       
-    } else {
-       _G.accInUse++;
-       aopOp(IC_RESULT(ic),ic,FALSE);  
-       _G.accInUse--;
-       assignResultValue(IC_RESULT(ic));       
+      offset++;
+    }
+    aopOp(IC_RESULT(ic),ic,FALSE);  
+    size = AOP_SIZE(IC_RESULT(ic));
+    offset = 0;
+    while (size--) {
+      pic14_emitcode ("pop","acc");
+      aopPut (AOP(IC_RESULT(ic)),"a",offset++);
     }
+       
+  } else {
+    _G.accInUse++;
+    aopOp(IC_RESULT(ic),ic,FALSE);  
+    _G.accInUse--;
+    assignResultValue(IC_RESULT(ic));  
+  }
 
-    freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+  freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -8228,18 +9905,19 @@ void genpic14Code (iCode *lic)
     addpBlock(pb);
 
     /* if debug information required */
-/*     if (options.debug && currFunc) { */
-    if (currFunc) {
-       cdbSymbol(currFunc,cdbFile,FALSE,TRUE);
+    if (options.debug && currFunc) { 
+      if (currFunc) {
+       debugFile->writeFunction(currFunc);
        _G.debugLine = 1;
        if (IS_STATIC(currFunc->etype)) {
-           pic14_emitcode("",";F%s$%s$0$0     %d",moduleName,currFunc->name,__LINE__);
-           //addpCode2pBlock(pb,newpCodeLabel(moduleName,currFunc->name));
+         pic14_emitcode("",";F%s$%s$0$0     %d",moduleName,currFunc->name,__LINE__);
+         //addpCode2pBlock(pb,newpCodeLabel(moduleName,currFunc->name));
        } else {
-           pic14_emitcode("",";G$%s$0$0   %d",currFunc->name,__LINE__);
-           //addpCode2pBlock(pb,newpCodeLabel(NULL,currFunc->name));
+         pic14_emitcode("",";G$%s$0$0   %d",currFunc->name,__LINE__);
+         //addpCode2pBlock(pb,newpCodeLabel(NULL,currFunc->name));
        }
        _G.debugLine = 0;
+      }
     }
 
 
@@ -8254,9 +9932,23 @@ void genpic14Code (iCode *lic)
                         ic->level,ic->block);
                _G.debugLine = 0;
            }
-           pic14_emitcode(";","%s %d",FileBaseName(ic->filename),ic->lineno);
+           /*
+             pic14_emitcode("#CSRC","%s %d",FileBaseName(ic->filename),ic->lineno);
+             pic14_emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, 
+             printCLine(ic->filename, ic->lineno));
+           */
+           if (!options.noCcodeInAsm) {
+             addpCode2pBlock(pb,
+                             newpCodeCSource(ic->lineno, 
+                                             ic->filename, 
+                                             printCLine(ic->filename, ic->lineno)));
+           }
+
            cln = ic->lineno ;
        }
+
+       // if you want printILine too, look at ../mcs51/gen.c, i don't understand this :)
+
        /* if the result is marked as
           spilt and rematerializable or code for
           this has already been generated then
@@ -8456,14 +10148,15 @@ void genpic14Code (iCode *lic)
     /* now we are ready to call the 
        peep hole optimizer */
     if (!options.nopeep) {
-      printf("peep hole optimizing\n");
-       peepHole (&lineHead);
+      peepHole (&lineHead);
     }
     /* now do the actual printing */
     printLine (lineHead,codeOutFile);
 
-    printf("printing pBlock\n\n");
+#ifdef PCODE_DEBUG
+    DFPRINTF((stderr,"printing pBlock\n\n"));
     printpBlock(stdout,pb);
+#endif
 
     return;
 }