dattalo - Major commit! re-wrote register allocation and flow analysis.
[fw/sdcc] / src / pic / genarith.c
index 284a5809ff764572d478b7a613f1df33c20cc7d6..832fa55f9ee86c092d00083a3514c1dedec43ae6 100644 (file)
 #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__)
+#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 "pcode.h"
 #include "gen.h"
 
+
+#define BYTEofLONG(l,b) ( (l>> (b<<3)) & 0xff)
+void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result);
+
+const char *AopType(short type)
+{
+  switch(type) {
+  case AOP_LIT:
+    return "AOP_LIT";
+    break;
+  case AOP_REG:
+    return "AOP_REG";
+    break;
+  case AOP_DIR:
+    return "AOP_DIR";
+    break;
+  case AOP_DPTR:
+    return "AOP_DPTR";
+    break;
+  case AOP_DPTR2:
+    return "AOP_DPTR2";
+    break;
+  case AOP_R0:
+    return "AOP_R0";
+    break;
+  case AOP_R1:
+    return "AOP_R1";
+    break;
+  case AOP_STK:
+    return "AOP_STK";
+    break;
+  case AOP_IMMD:
+    return "AOP_IMMD";
+    break;
+  case AOP_STR:
+    return "AOP_STR";
+    break;
+  case AOP_CRY:
+    return "AOP_CRY";
+    break;
+  case AOP_ACC:
+    return "AOP_ACC";
+    break;
+  }
+
+  return "BAD TYPE";
+}
 /*-----------------------------------------------------------------*/
 /* genPlusIncr :- does addition with increment if possible         */
 /*-----------------------------------------------------------------*/
@@ -68,10 +119,10 @@ bool genPlusIncr (iCode *ic)
     unsigned int size = pic14_getDataSize(IC_RESULT(ic));
 
     DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    DEBUGpic14_emitcode ("; ","result %d, left %d, right %d",
-                  AOP_TYPE(IC_RESULT(ic)),
-                  AOP_TYPE(IC_LEFT(ic)),
-                  AOP_TYPE(IC_RIGHT(ic)));
+    DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
+                        AopType(AOP_TYPE(IC_RESULT(ic))),
+                        AopType(AOP_TYPE(IC_LEFT(ic))),
+                        AopType(AOP_TYPE(IC_RIGHT(ic))));
 
     /* will try to generate an increment */
     /* if the right side is not a literal 
@@ -91,12 +142,12 @@ bool genPlusIncr (iCode *ic)
 
       int offset = MSB16;
 
-      emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
+      emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),LSB));
       //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
 
       while(--size) {
        emitSKPNZ;
-       emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE));
+       emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset++));
        //pic14_emitcode(" incf","%s,f",aopGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE));
       }
 
@@ -108,7 +159,7 @@ bool genPlusIncr (iCode *ic)
     if( strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a")  &&
        (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) ) {
       
-      emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0));
       pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
               AOP(IC_RESULT(ic))->aopu.aop_dir,
               AOP(IC_RESULT(ic))->aopu.aop_dir);
@@ -120,7 +171,7 @@ bool genPlusIncr (iCode *ic)
       //pic14_emitcode("andlw","1");
 
       emitSKPZ;
-      emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0));
       pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
               AOP(IC_RESULT(ic))->aopu.aop_dir,
               AOP(IC_RESULT(ic))->aopu.aop_dir);
@@ -140,15 +191,14 @@ bool genPlusIncr (iCode *ic)
     if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
        
       while (icount--) 
-       emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+       emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0));
       //pic14_emitcode("incf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
        
       return TRUE ;
     }
     
-    DEBUGpic14_emitcode ("; ","couldn't increment result-%s  left-%s",
-                  aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE),
-                  aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+    DEBUGpic14_emitcode ("; ","couldn't increment ");
+
     return FALSE ;
 }
 
@@ -178,61 +228,73 @@ void pic14_outBitAcc(operand *result)
 void genPlusBits (iCode *ic)
 {
 
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-    /*
-      The following block of code will add two bits. 
-      Note that it'll even work if the destination is
-      the carry (C in the status register).
-      It won't work if the 'Z' bit is a source or destination.
-    */
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* If the result is stored in the accumulator (w) */
-    //if(strcmp(aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE),"a") == 0 ) {
-    if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) {
-      //emitpcode(  ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
-      //             popGet(AOP(result),0,FALSE,FALSE));
-
-      emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_BCF,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-
-       pic14_emitcode("movlw","(1 << (%s & 7))",
-                AOP(IC_RESULT(ic))->aopu.aop_dir,
-                AOP(IC_RESULT(ic))->aopu.aop_dir);
-       pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
-                AOP(IC_RESULT(ic))->aopu.aop_dir,
-                AOP(IC_RESULT(ic))->aopu.aop_dir);
-       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                AOP(IC_RIGHT(ic))->aopu.aop_dir);
-       pic14_emitcode("xorwf","(%s >>3),f",
-                AOP(IC_RESULT(ic))->aopu.aop_dir);
-       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                AOP(IC_LEFT(ic))->aopu.aop_dir,
-                AOP(IC_LEFT(ic))->aopu.aop_dir);
-       pic14_emitcode("xorwf","(%s>>3),f",
-                AOP(IC_RESULT(ic))->aopu.aop_dir);
-    } else { 
-
-      emitpcode(POC_CLRW, NULL);
-      emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_XORLW, popGetLit(1));
-      emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_XORLW, popGetLit(1));
-
-      pic14_emitcode("clrw","");
-      pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                AOP(IC_RIGHT(ic))->aopu.aop_dir);
-      pic14_emitcode("xorlw","1");
-      pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-              AOP(IC_LEFT(ic))->aopu.aop_dir,
-              AOP(IC_LEFT(ic))->aopu.aop_dir);
-      pic14_emitcode("xorlw","1");
-    }
+  DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
+                      AopType(AOP_TYPE(IC_RESULT(ic))),
+                      AopType(AOP_TYPE(IC_LEFT(ic))),
+                      AopType(AOP_TYPE(IC_RIGHT(ic))));
+  /*
+    The following block of code will add two bits. 
+    Note that it'll even work if the destination is
+    the carry (C in the status register).
+    It won't work if the 'Z' bit is a source or destination.
+  */
+
+  /* If the result is stored in the accumulator (w) */
+  //if(strcmp(aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE),"a") == 0 ) {
+  switch(AOP_TYPE(IC_RESULT(ic))) {
+  case AOP_ACC:
+    emitpcode(POC_CLRW, NULL);
+    emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0));
+    emitpcode(POC_XORLW, popGetLit(1));
+    emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0));
+    emitpcode(POC_XORLW, popGetLit(1));
+
+    pic14_emitcode("clrw","");
+    pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                  AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                  AOP(IC_RIGHT(ic))->aopu.aop_dir);
+    pic14_emitcode("xorlw","1");
+    pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                  AOP(IC_LEFT(ic))->aopu.aop_dir,
+                  AOP(IC_LEFT(ic))->aopu.aop_dir);
+    pic14_emitcode("xorlw","1");
+    break;
+  case AOP_REG:
+    emitpcode(POC_MOVLW, popGetLit(0));
+    emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0));
+    emitpcode(POC_XORLW, popGetLit(1));
+    emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0));
+    emitpcode(POC_XORLW, popGetLit(1));
+    emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),0));
+    break;
+  default:
+    emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0));
+    emitpcode(POC_BCF,   popGet(AOP(IC_RESULT(ic)),0));
+    emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0));
+    emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0));
+    emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0));
+    emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0));
+
+    pic14_emitcode("movlw","(1 << (%s & 7))",
+                  AOP(IC_RESULT(ic))->aopu.aop_dir,
+                  AOP(IC_RESULT(ic))->aopu.aop_dir);
+    pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
+                  AOP(IC_RESULT(ic))->aopu.aop_dir,
+                  AOP(IC_RESULT(ic))->aopu.aop_dir);
+    pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                  AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                  AOP(IC_RIGHT(ic))->aopu.aop_dir);
+    pic14_emitcode("xorwf","(%s >>3),f",
+                  AOP(IC_RESULT(ic))->aopu.aop_dir);
+    pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                  AOP(IC_LEFT(ic))->aopu.aop_dir,
+                  AOP(IC_LEFT(ic))->aopu.aop_dir);
+    pic14_emitcode("xorwf","(%s>>3),f",
+                  AOP(IC_RESULT(ic))->aopu.aop_dir);
+    break;
+  }
 
 }
 
@@ -306,281 +368,631 @@ static void adjustArithmeticResult(iCode *ic)
 #endif
 
 /*-----------------------------------------------------------------*/
-/* genPlus - generates code for addition                           */
+/* genAddlit - generates code for addition                         */
 /*-----------------------------------------------------------------*/
-void genPlus (iCode *ic)
+static void genAddLit2byte (operand *result, int offr, int lit)
 {
-    int size, offset = 0;
 
-    /* special cases :- */
-    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  switch(lit & 0xff) {
+  case 0:
+    break;
+  case 1:
+    emitpcode(POC_INCF, popGet(AOP(result),offr));
+    break;
+  case 0xff:
+    emitpcode(POC_DECF, popGet(AOP(result),offr));
+    break;
+  default:
+    emitpcode(POC_MOVLW,popGetLit(lit&0xff));
+    emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+  }
 
-    aopOp (IC_LEFT(ic),ic,FALSE);
-    aopOp (IC_RIGHT(ic),ic,FALSE);
-    aopOp (IC_RESULT(ic),ic,TRUE);
+}
 
-    /* if literal, literal on the right or
-       if left requires ACC or right is already
-       in ACC */
+static void emitMOVWF(operand *reg, int offset)
+{
+  if(!reg)
+    return;
 
-    if (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) {
-        operand *t = IC_RIGHT(ic);
-        IC_RIGHT(ic) = IC_LEFT(ic);
-        IC_LEFT(ic) = t;
-    }
+  if (AOP_TYPE(reg) == AOP_ACC) {
+    DEBUGpic14_emitcode ("; ***","%s  %d ignoring mov into W",__FUNCTION__,__LINE__);
+    return;
+  }
 
-    /* if both left & right are in bit space */
-    if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY &&
-        AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) {
-        genPlusBits (ic);
-        goto release ;
-    }
+  emitpcode(POC_MOVWF, popGet(AOP(reg),offset));
 
-    /* if left in bit space & right literal */
-    if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY &&
-        AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) {
-        /* if result in bit space */
-        if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){
-         if((unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit) != 0L) {
-           emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-           if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
-             emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-           emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-         }
-        } else {
-            size = pic14_getDataSize(IC_RESULT(ic));
-            while (size--) {
-                MOVA(aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));  
-                pic14_emitcode("addc","a,#00  ;%d",__LINE__);
-                aopPut(AOP(IC_RESULT(ic)),"a",offset++);
-            }
-        }
-        goto release ;
-    }
+}
+
+static void genAddLit (iCode *ic, int lit)
+{
+
+  int size,same;
+  int lo;
+
+  operand *result;
+  operand *left;
+
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-    /* if I can do an increment instead
-    of add then GOOD for ME */
-    if (genPlusIncr (ic) == TRUE)
-        goto release;   
 
-    size = pic14_getDataSize(IC_RESULT(ic));
+  left = IC_LEFT(ic);
+  result = IC_RESULT(ic);
+  same = pic14_sameRegs(AOP(left), AOP(result));
+  size = pic14_getDataSize(result);
 
-    if(AOP(IC_RIGHT(ic))->type == AOP_LIT) {
-      /* Add a literal to something else */
-      bool know_W=0;
-      unsigned lit = (unsigned) floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
-      unsigned l1=0;
+  if(same) {
 
-      offset = 0;
-      DEBUGpic14_emitcode(";","adding lit to something. size %d",size);
-      while(size--){
+    /* Handle special cases first */
+    if(size == 1) 
+      genAddLit2byte (result, 0, lit);
+     
+    else if(size == 2) {
+      int hi = 0xff & (lit >> 8);
+      lo = lit & 0xff;
 
-      DEBUGpic14_emitcode(";","size %d",size);
+      switch(hi) {
+      case 0: 
 
-       switch (lit & 0xff) {
+       /* lit = 0x00LL */
+       DEBUGpic14_emitcode ("; hi = 0","%s  %d",__FUNCTION__,__LINE__);
+       switch(lo) {
        case 0:
          break;
        case 1:
-         if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))))
-           emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         else {
-           know_W = 0;
-           emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-           if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
-             emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
-         }
+         emitpcode(POC_INCF, popGet(AOP(result),0));
+         emitSKPNZ;
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
          break;
        case 0xff:
-         if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))))
-           emitpcode(POC_DECF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         else {
-           know_W = 0;
-           emitpcode(POC_DECFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-           if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
-             emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
-         }
+         emitpcode(POC_DECF, popGet(AOP(result),0));
+         emitpcode(POC_INCFSZW, popGet(AOP(result),0));
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+
          break;
        default:
-         if( !know_W || ( (lit&0xff) != l1)  ) {
-           know_W = 1;
-           emitpcode(POC_MOVLW,popGetLit(lit&0xff));
-         }
-         if(pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))))
-           emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         else {
-           know_W = 0;
-           emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-           emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
-           if(size) {
+         emitpcode(POC_MOVLW,popGetLit(lit&0xff));
+         emitpcode(POC_ADDWF,popGet(AOP(result),0));
+         emitSKPNC;
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+
+
+       }
+       break;
+
+      case 1:
+       /* lit = 0x01LL */
+       DEBUGpic14_emitcode ("; hi = 1","%s  %d",__FUNCTION__,__LINE__);
+       switch(lo) {
+       case 0:  /* 0x0100 */
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+         break;
+       case 1:  /* 0x0101  */
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+         emitpcode(POC_INCF, popGet(AOP(result),0));
+         emitSKPNZ;
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+         break;
+       case 0xff: /* 0x01ff */
+         emitpcode(POC_DECF, popGet(AOP(result),0));
+         emitpcode(POC_INCFSZW, popGet(AOP(result),0));
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16));
+       }         
+       break;
+
+      case 0xff:
+       DEBUGpic14_emitcode ("; hi = ff","%s  %d",__FUNCTION__,__LINE__);
+       /* lit = 0xffLL */
+       switch(lo) {
+       case 0:  /* 0xff00 */
+         emitpcode(POC_DECF, popGet(AOP(result),MSB16));
+         break;
+       case 1:  /*0xff01 */
+         emitpcode(POC_INCFSZ, popGet(AOP(result),0));
+         emitpcode(POC_DECF, popGet(AOP(result),MSB16));
+         break;
+/*     case 0xff: * 0xffff *
+         emitpcode(POC_INCFSZW, popGet(AOP(result),0,FALSE,FALSE));
+         emitpcode(POC_INCF, popGet(AOP(result),MSB16,FALSE,FALSE));
+         emitpcode(POC_DECF, popGet(AOP(result),0,FALSE,FALSE));
+         break;
+*/
+       default:
+         emitpcode(POC_MOVLW,popGetLit(lo));
+         emitpcode(POC_ADDWF,popGet(AOP(result),0));
+         emitSKPC;
+         emitpcode(POC_DECF, popGet(AOP(result),MSB16));
+         
+       }
+
+       break;
+       
+      default:
+       DEBUGpic14_emitcode ("; hi is generic","%d   %s  %d",hi,__FUNCTION__,__LINE__);
+
+       /* lit = 0xHHLL */
+       switch(lo) {
+       case 0:  /* 0xHH00 */
+         genAddLit2byte (result, MSB16, hi);
+         break;
+       case 1:  /* 0xHH01 */
+         emitpcode(POC_MOVLW,popGetLit((hi+1)&0xff));
+         emitpcode(POC_INCFSZ, popGet(AOP(result),0));
+         emitpcode(POC_MOVLW,popGetLit(hi));
+         emitpcode(POC_ADDWF,popGet(AOP(result),MSB16));
+         break;
+/*     case 0xff: * 0xHHff *
+         emitpcode(POC_MOVFW, popGet(AOP(result),0,FALSE,FALSE));
+         emitpcode(POC_DECF, popGet(AOP(result),MSB16,FALSE,FALSE));
+         emitpcode(POC_MOVLW,popGetLit(hi));
+         emitpcode(POC_ADDWF,popGet(AOP(result),MSB16,FALSE,FALSE));
+         break;
+*/     default:  /* 0xHHLL */
+         emitpcode(POC_MOVLW,popGetLit(lo));
+         emitpcode(POC_ADDWF, popGet(AOP(result),0));
+         emitpcode(POC_MOVLW,popGetLit(hi));
+         emitSKPNC;
+         emitpcode(POC_MOVLW,popGetLit((hi+1) & 0xff));
+         emitpcode(POC_ADDWF,popGet(AOP(result),MSB16));
+         break;
+       }
+
+      }
+    } else {
+      int carry_info = 0;
+      int offset = 0;
+      /* size > 2 */
+      DEBUGpic14_emitcode (";  add lit to long","%s  %d",__FUNCTION__,__LINE__);
+
+      while(size--) {
+       lo = BYTEofLONG(lit,0);
+
+       if(carry_info) {
+         switch(lo) {
+         case 0:
+           switch(carry_info) {
+           case 1:
+             emitSKPNZ;
+             emitpcode(POC_INCF, popGet(AOP(result),offset));
+             break;
+           case 2:
+             emitpcode(POC_RLFW, popGet(AOP(result),offset));
+             emitpcode(POC_ANDLW,popGetLit(1));
+             emitpcode(POC_ADDWF, popGet(AOP(result),offset));
+             break;
+           default: /* carry_info = 3  */
              emitSKPNC;
-             emitpcode(POC_INCF, popGet(AOP(IC_LEFT(ic)),offset+1,FALSE,FALSE));
+             emitpcode(POC_INCF, popGet(AOP(result),offset));
+             carry_info = 1;
+             break;
            }
+           break;
+         case 0xff:
+           emitpcode(POC_MOVLW,popGetLit(lo));
+           if(carry_info==1) 
+             emitSKPZ;
+           else
+             emitSKPC;
+           emitpcode(POC_ADDWF, popGet(AOP(result),offset));
+           break;
+         default:
+           emitpcode(POC_MOVLW,popGetLit(lo));
+           if(carry_info==1) 
+             emitSKPNZ;
+           else
+             emitSKPNC;
+           emitpcode(POC_MOVLW,popGetLit(lo+1));
+           emitpcode(POC_ADDWF, popGet(AOP(result),offset));
+           carry_info=2;
+           break;
+         }
+       }else {
+         /* no carry info from previous step */
+         /* this means this is the first time to add */
+         switch(lo) {
+         case 0:
+           break;
+         case 1:
+           emitpcode(POC_INCF, popGet(AOP(result),offset));
+           carry_info=1;
+           break;
+         default:
+           emitpcode(POC_MOVLW,popGetLit(lo));
+           emitpcode(POC_ADDWF, popGet(AOP(result),offset));
+           if(lit <0x100) 
+             carry_info = 3;  /* Were adding only one byte and propogating the carry */
+           else
+             carry_info = 2;
+           break;
          }
        }
-
-       l1 = lit & 0xff;
-       lit >>= 8;
        offset++;
+       lit >>= 8;
       }
+    
+/*
+      lo = BYTEofLONG(lit,0);
 
-    } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) {
+      if(lit < 0x100) {
+       if(lo) {
+         if(lo == 1) {
+           emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE));
+           emitSKPNZ;
+         } else {
+           emitpcode(POC_MOVLW,popGetLit(lo));
+           emitpcode(POC_ADDWF, popGet(AOP(result),0,FALSE,FALSE));
+           emitSKPNC;
+         }
+         emitpcode(POC_INCF, popGet(AOP(result),1,FALSE,FALSE));
+         emitSKPNZ;
+         emitpcode(POC_INCF, popGet(AOP(result),2,FALSE,FALSE));
+         emitSKPNZ;
+         emitpcode(POC_INCF, popGet(AOP(result),3,FALSE,FALSE));
+
+       } 
+      } 
+    }
 
-      pic14_emitcode(";bitadd","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-      pic14_emitcode(";bitadd","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-      pic14_emitcode(";bitadd","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+*/
+    }
+  } else {
+    int offset = 1;
+    DEBUGpic14_emitcode (";  left and result aren't same","%s  %d",__FUNCTION__,__LINE__);
 
-      /* here we are adding a bit to a char or int */
-      if(size == 1) {
-       if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
+    if(size == 1) {
 
-         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_INCF ,  popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      if(AOP_TYPE(left) == AOP_ACC) {
+       /* left addend is already in accumulator */
+       switch(lit & 0xff) {
+       case 0:
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+         break;
+       default:
+         emitpcode(POC_ADDLW, popGetLit(lit & 0xff));
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+       }
+      } else {
+       /* left addend is in a register */
+       switch(lit & 0xff) {
+       case 0:
+         emitpcode(POC_MOVFW, popGet(AOP(left),0));
+         emitMOVWF(result, 0);
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+         break;
+       case 1:
+         emitpcode(POC_INCFW, popGet(AOP(left),0));
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+         break;
+       case 0xff:
+         emitpcode(POC_DECFW, popGet(AOP(left),0));
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+         break;
+       default:
+         emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+         emitpcode(POC_ADDFW, popGet(AOP(left),0));
+         //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+         emitMOVWF(result,0);
+       }
+      }
 
-         pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir);
-         pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-       } else {
+    } else {
 
-         if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
-           emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-           emitpcode(POC_XORLW , popGetLit(1));
+      /* left is not the accumulator */
+      if(lit & 0xff) {
+       emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+       emitpcode(POC_ADDFW, popGet(AOP(left),0));
+      } else
+       emitpcode(POC_MOVFW, popGet(AOP(left),0));
 
-           pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                    AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                    AOP(IC_RIGHT(ic))->aopu.aop_dir);
-           pic14_emitcode(" xorlw","1");
-         } else {
-           emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-           emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-           emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-
-           pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-           pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                    AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                    AOP(IC_RIGHT(ic))->aopu.aop_dir);
-           pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         }
-         
-         if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) {
-           
-           if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) {
-             emitpcode(POC_ANDLW , popGetLit(1));
-             emitpcode(POC_BCF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-             emitSKPZ;
-             emitpcode(POC_BSF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-           } else {
-             emitpcode(POC_MOVWF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-             pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-           }
-         }
+      //emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+      emitMOVWF(result,0);
+      lit >>= 8;
+      while(--size) {
+      
+       if(lit & 0xff) {
+         emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+         //emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+         emitMOVWF(result,offset);
+         emitpcode(POC_MOVFW, popGet(AOP(left),offset));
+         emitSKPNC;
+         emitpcode(POC_INCFSZW,popGet(AOP(left),offset));
+         emitpcode(POC_ADDWF,  popGet(AOP(result),offset));
+       } else {
+         emitpcode(POC_CLRF,  popGet(AOP(result),offset));
+         emitpcode(POC_RLF,   popGet(AOP(result),offset));
+         emitpcode(POC_MOVFW, popGet(AOP(left),offset));
+         emitpcode(POC_ADDWF, popGet(AOP(result),offset));
        }
+      offset++;
+      }
+    }
+  }
+}
 
-      } else {
-       int offset = 1;
+/*-----------------------------------------------------------------*/
+/* genPlus - generates code for addition                           */
+/*-----------------------------------------------------------------*/
+void genPlus (iCode *ic)
+{
+  int size, offset = 0;
 
-       if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
-         emitCLRZ;
-         emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+  /* special cases :- */
+  DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-         pic14_emitcode("clrz","");
+  aopOp (IC_LEFT(ic),ic,FALSE);
+  aopOp (IC_RIGHT(ic),ic,FALSE);
+  aopOp (IC_RESULT(ic),ic,TRUE);
 
-         pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir);
-         pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+  DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),IC_RIGHT(ic),IC_RESULT(ic));
 
-       } else {
+  /* if literal, literal on the right or
+     if left requires ACC or right is already
+     in ACC */
 
-         emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+  if (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) {
+    operand *t = IC_RIGHT(ic);
+    IC_RIGHT(ic) = IC_LEFT(ic);
+    IC_LEFT(ic) = t;
+  }
 
+  /* if both left & right are in bit space */
+  if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY &&
+      AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) {
+    genPlusBits (ic);
+    goto release ;
+  }
+
+  /* if left in bit space & right literal */
+  if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY &&
+      AOP_TYPE(IC_RIGHT(ic)) == AOP_LIT) {
+    /* if result in bit space */
+    if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY){
+      if((unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit) != 0L) {
+       emitpcode(POC_MOVLW, popGet(AOP(IC_RESULT(ic)),0));
+       if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
+         emitpcode(POC_BTFSC, popGet(AOP(IC_LEFT(ic)),0));
+       emitpcode(POC_XORWF, popGet(AOP(IC_RESULT(ic)),0));
+      }
+    } else {
+      size = pic14_getDataSize(IC_RESULT(ic));
+      while (size--) {
+       MOVA(aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));  
+       pic14_emitcode("addc","a,#00  ;%d",__LINE__);
+       aopPut(AOP(IC_RESULT(ic)),"a",offset++);
+      }
+    }
+    goto release ;
+  }
+
+  /* if I can do an increment instead
+     of add then GOOD for ME */
+  if (genPlusIncr (ic) == TRUE)
+    goto release;   
+
+  size = pic14_getDataSize(IC_RESULT(ic));
+
+  if(AOP(IC_RIGHT(ic))->type == AOP_LIT) {
+    /* Add a literal to something else */
+    //bool know_W=0;
+    unsigned lit = (unsigned) floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
+    //      unsigned l1=0;
+
+    //      offset = 0;
+    DEBUGpic14_emitcode(";","adding lit to something. size %d",size);
+
+    genAddLit (ic,  lit);
+    goto release;
+
+  } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) {
+
+    pic14_emitcode(";bitadd","right is bit: %s",aopGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+    pic14_emitcode(";bitadd","left is bit: %s",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+    pic14_emitcode(";bitadd","result is bit: %s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+
+    /* here we are adding a bit to a char or int */
+    if(size == 1) {
+      if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
+
+       emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_INCF ,  popGet(AOP(IC_RESULT(ic)),0));
+
+       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir);
+       pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      } else {
+
+       if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
+         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+         emitpcode(POC_XORLW , popGetLit(1));
+
+         pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                        AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                        AOP(IC_RIGHT(ic))->aopu.aop_dir);
+         pic14_emitcode(" xorlw","1");
+       } else {
+         emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0));
+         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+         emitpcode(POC_INCFW , popGet(AOP(IC_LEFT(ic)),0));
 
          pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
          pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir,
-                  AOP(IC_RIGHT(ic))->aopu.aop_dir);
+                        AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                        AOP(IC_RIGHT(ic))->aopu.aop_dir);
          pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-
        }
-
-       while(--size){
-         emitSKPZ;
-         emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),offset++,FALSE,FALSE));
-      //pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE));
+         
+       if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) {
+           
+         if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) {
+           emitpcode(POC_ANDLW , popGetLit(1));
+           emitpcode(POC_BCF ,   popGet(AOP(IC_RESULT(ic)),0));
+           emitSKPZ;
+           emitpcode(POC_BSF ,   popGet(AOP(IC_RESULT(ic)),0));
+         } else {
+           emitpcode(POC_MOVWF ,   popGet(AOP(IC_RESULT(ic)),0));
+           pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+         }
        }
+      }
+
+    } else {
+      int offset = 1;
+      DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+      if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
+       emitCLRZ;
+       emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),0));
+
+       pic14_emitcode("clrz","");
+
+       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir);
+       pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+
+      } else {
+
+       emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),0));
+       emitpcode(POC_BTFSC, popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_INCFW, popGet(AOP(IC_LEFT(ic)),0));
+       //emitpcode(POC_MOVWF, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+       emitMOVWF(IC_RIGHT(ic),0);
+
+       pic14_emitcode("movf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+       pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir,
+                      AOP(IC_RIGHT(ic))->aopu.aop_dir);
+       pic14_emitcode(" incf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+       pic14_emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+
+      }
 
+      while(--size){
+       emitSKPZ;
+       emitpcode(POC_INCF,  popGet(AOP(IC_RESULT(ic)),offset++));
+       //pic14_emitcode(" incf","%s,f", aopGet(AOP(IC_RIGHT(ic)),offset++,FALSE,FALSE));
       }
+
+    }
       
+  } else {
+    DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);    
+
+    /* Add the first bytes */
+
+    if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) {
+      emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0));
+      emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
     } else {
-    
-      if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) {
-       emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-       emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+
+      if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
+       emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0));
+       if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
+         emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
       } else {
 
-       if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
-         emitpcode(POC_ADDFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-         if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
-           emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-       } else {
+       emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0));
 
-         emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-
-         if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
-           emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         else {
-           if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) ||
-               (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) {
-             emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-           } else {
-             emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-             if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
-               emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
-           }
+       if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
+         emitpcode(POC_ADDWF, popGet(AOP(IC_LEFT(ic)),0));
+       else {
+         if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) ||
+             (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) {
+           emitpcode(POC_ADDLW, popGet(AOP(IC_LEFT(ic)),0));
+         } else {
+           emitpcode(POC_ADDFW, popGet(AOP(IC_LEFT(ic)),0));
+           if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
+             emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
          }
        }
       }
+    }
 
-      offset = 1;
-      size--;
+    size = min( AOP_SIZE(IC_RESULT(ic)), AOP_SIZE(IC_RIGHT(ic))) - 1;
+    offset = 1;
 
-      while(size--){
-       if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
-         emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
 
-         pic14_emitcode("movf","%s,w",  aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
-         pic14_emitcode("movwf","%s",  aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
-       }
+    while(size--){
+      if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
+       emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset));
+       emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset));
 
-       emitpcode(POC_MOVFW,   popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
-       emitSKPNC;
-       emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
-       emitpcode(POC_ADDWF,   popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
+       pic14_emitcode("movf","%s,w",  aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
+       pic14_emitcode("movwf","%s",  aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
+      }
+
+      emitpcode(POC_MOVFW,   popGet(AOP(IC_RIGHT(ic)),offset));
+      emitSKPNC;
+      emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset));
+      emitpcode(POC_ADDWF,   popGet(AOP(IC_RESULT(ic)),offset));
 
-       /*
+      /*
        pic14_emitcode("movf","%s,w",  aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
        emitSKPNC;
        pic14_emitcode("incfsz","%s,w",aopGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
        pic14_emitcode("addwf","%s,f", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
-       */
+      */
 
-       offset++;
+      offset++;
+    }
+
+  }
+
+  if (AOP_SIZE(IC_RESULT(ic)) > AOP_SIZE(IC_RIGHT(ic))) {
+    int sign =  !(SPEC_USIGN(getSpec(operandType(IC_LEFT(ic)))) |
+                 SPEC_USIGN(getSpec(operandType(IC_RIGHT(ic)))) );
+
+
+    /* Need to extend result to higher bytes */
+    size = AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_RIGHT(ic)) - 1;
+
+    /* First grab the carry from the lower bytes */
+    emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset));
+    emitpcode(POC_RLF,  popGet(AOP(IC_RESULT(ic)),offset));
+
+
+    if(sign) {
+      /* Now this is really horrid. Gotta check the sign of the addends and propogate
+       * to the result */
+
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_LEFT(ic)),offset-1,FALSE,FALSE),7,0));
+      emitpcode(POC_DECF,  popGet(AOP(IC_RESULT(ic)),offset));
+      emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RIGHT(ic)),offset-1,FALSE,FALSE),7,0));
+      emitpcode(POC_DECF,  popGet(AOP(IC_RESULT(ic)),offset));
+
+      /* if chars or ints or being signed extended to longs: */
+      if(size) {
+       emitpcode(POC_MOVLW, popGetLit(0));
+       emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE),7,0));
+       emitpcode(POC_MOVLW, popGetLit(0xff));
       }
+    }
 
+    offset++;
+    while(size--) {
+      
+      if(sign)
+       emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset));
+      else
+       emitpcode(POC_CLRF,  popGet(AOP(IC_RESULT(ic)),offset));
+
+      offset++;
     }
+  }
 
-    //adjustArithmeticResult(ic);
+
+  //adjustArithmeticResult(ic);
 
  release:
-      freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-      freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
-      freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+  freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+  freeAsmop(IC_RIGHT(ic),NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+  freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -613,9 +1025,10 @@ bool genMinusDec (iCode *ic)
         (icount == 1)) {
 
       if(size == 2) { 
-       emitpcode(POC_DECF,    popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
-       emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
-       emitpcode(POC_DECF,    popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE));
+       emitpcode(POC_DECF,    popGet(AOP(IC_RESULT(ic)),LSB));
+       emitpcode(POC_INCFSZW, popGet(AOP(IC_RESULT(ic)),LSB));
+       emitpcode(POC_INCF,    popGet(AOP(IC_RESULT(ic)),MSB16));
+       emitpcode(POC_DECF,    popGet(AOP(IC_RESULT(ic)),MSB16));
 
        pic14_emitcode("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
        pic14_emitcode("incfsz","%s,w",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
@@ -623,11 +1036,11 @@ bool genMinusDec (iCode *ic)
       } else {
        /* size is 3 or 4 */
        emitpcode(POC_MOVLW,  popGetLit(0xff));
-       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),LSB));
        emitSKPNC;
-       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB16,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB16));
        emitSKPNC;
-       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB24,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB24));
 
        pic14_emitcode("movlw","0xff");
        pic14_emitcode("addwf","%s,f",aopGet(AOP(IC_RESULT(ic)),LSB,FALSE,FALSE));
@@ -639,7 +1052,7 @@ bool genMinusDec (iCode *ic)
 
        if(size > 3) {
          emitSKPNC;
-         emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB32,FALSE,FALSE));
+         emitpcode(POC_ADDWF,  popGet(AOP(IC_RESULT(ic)),MSB32));
 
          pic14_emitcode("skpnc","");
          emitSKPNC;
@@ -663,7 +1076,7 @@ bool genMinusDec (iCode *ic)
     if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) {
 
       while (icount--) 
-       emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+       emitpcode(POC_DECF, popGet(AOP(IC_RESULT(ic)),0));
 
        //pic14_emitcode ("decf","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
 
@@ -678,8 +1091,8 @@ bool genMinusDec (iCode *ic)
       pic14_emitcode("decf","%s,w",aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
       pic14_emitcode("movwf","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
 
-      emitpcode(POC_DECFW,  popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-      emitpcode(POC_MOVWF,  popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_DECFW,  popGet(AOP(IC_LEFT(ic)),0));
+      emitpcode(POC_MOVWF,  popGet(AOP(IC_RESULT(ic)),0));
 
       return TRUE;
     }
@@ -736,7 +1149,7 @@ void genMinusBits (iCode *ic)
 /*-----------------------------------------------------------------*/
 void genMinus (iCode *ic)
 {
-  int size, offset = 0;
+  int size, offset = 0, same=0;
   unsigned long lit = 0L;
 
   DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
@@ -751,6 +1164,11 @@ void genMinus (iCode *ic)
     IC_LEFT(ic) = t;
   }
 
+  DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
+                  AopType(AOP_TYPE(IC_RESULT(ic))),
+                  AopType(AOP_TYPE(IC_LEFT(ic))),
+                  AopType(AOP_TYPE(IC_RIGHT(ic))));
+
   /* special cases :- */
   /* if both left & right are in bit space */
   if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY &&
@@ -761,10 +1179,11 @@ void genMinus (iCode *ic)
 
   /* if I can do an decrement instead
      of subtract then GOOD for ME */
-  if (genMinusDec (ic) == TRUE)
-    goto release;   
+  //  if (genMinusDec (ic) == TRUE)
+  //    goto release;   
 
   size = pic14_getDataSize(IC_RESULT(ic));   
+  same = pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)));
 
   if(AOP(IC_RIGHT(ic))->type == AOP_LIT) {
     /* Add a literal to something else */
@@ -772,11 +1191,14 @@ void genMinus (iCode *ic)
     lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
     lit = - (long)lit;
 
+    genAddLit ( ic,  lit);
+    
+#if 0
     /* add the first byte: */
     pic14_emitcode("movlw","0x%x", lit & 0xff);
     pic14_emitcode("addwf","%s,f", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
     emitpcode(POC_MOVLW,  popGetLit(lit & 0xff));
-    emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+    emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),0));
 
 
     offset = 1;
@@ -791,23 +1213,23 @@ void genMinus (iCode *ic)
        if((lit & 0xff) == 0xff) {
          emitpcode(POC_MOVLW,  popGetLit(0xff));
          emitSKPC;
-         emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
+         emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset));
        } else {
          emitpcode(POC_MOVLW,  popGetLit(lit & 0xff));
          emitSKPNC;
          emitpcode(POC_MOVLW,  popGetLit((lit+1) & 0xff));
-         emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
+         emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset));
        }
 
       } else {
        /* do the rlf known zero trick here */
        emitpcode(POC_MOVLW,  popGetLit(1));
        emitSKPNC;
-       emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
+       emitpcode(POC_ADDWF,  popGet(AOP(IC_LEFT(ic)),offset));
       }
       offset++;
     }
-
+#endif
   } else if(AOP_TYPE(IC_RIGHT(ic)) == AOP_CRY) {
     // bit subtraction
 
@@ -819,8 +1241,8 @@ void genMinus (iCode *ic)
     if(size == 1) {
       if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
 
-       emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-       emitpcode(POC_DECF ,  popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+       emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_DECF ,  popGet(AOP(IC_RESULT(ic)),0));
 
        pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
                 AOP(IC_RIGHT(ic))->aopu.aop_dir,
@@ -829,7 +1251,7 @@ void genMinus (iCode *ic)
       } else {
 
        if(AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
-         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
          emitpcode(POC_XORLW , popGetLit(1));
        }else  if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) ||
              (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) {
@@ -839,35 +1261,35 @@ void genMinus (iCode *ic)
          if(AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) {
            if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) {
              if(lit & 1) {
-               emitpcode(POC_MOVLW , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-               emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+               emitpcode(POC_MOVLW , popGet(AOP(IC_RIGHT(ic)),0));
+               emitpcode(POC_XORWF , popGet(AOP(IC_RIGHT(ic)),0));
              }
            }else{
-             emitpcode(POC_BCF ,     popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+             emitpcode(POC_BCF ,     popGet(AOP(IC_RESULT(ic)),0));
              if(lit & 1) 
-               emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+               emitpcode(POC_BTFSS , popGet(AOP(IC_RIGHT(ic)),0));
              else
-               emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-             emitpcode(POC_BSF ,     popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+               emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+             emitpcode(POC_BSF ,     popGet(AOP(IC_RESULT(ic)),0));
            }
            goto release;
          } else {
            emitpcode(POC_MOVLW , popGetLit(lit & 0xff));
-           emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+           emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
            emitpcode(POC_MOVLW , popGetLit((lit-1) & 0xff));
-           emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+           emitpcode(POC_MOVWF , popGet(AOP(IC_RESULT(ic)),0));
 
          }
 
        } else {
-         emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
-         emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_MOVFW , popGet(AOP(IC_LEFT(ic)),0));
+         emitpcode(POC_BTFSC , popGet(AOP(IC_RIGHT(ic)),0));
+         emitpcode(POC_DECFW , popGet(AOP(IC_LEFT(ic)),0));
        }
          
        if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) {
            
-         emitpcode(POC_MOVWF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_MOVWF ,   popGet(AOP(IC_RESULT(ic)),0));
 
        } else  {
          emitpcode(POC_ANDLW , popGetLit(1));
@@ -881,42 +1303,135 @@ void genMinus (iCode *ic)
       }
 
     }
+  } else   if(// (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) || 
+             (AOP(IC_LEFT(ic))->type == AOP_LIT) &&
+             (AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC)) {
+
+    lit = (unsigned long)floatFromVal(AOP(IC_LEFT(ic))->aopu.aop_lit);
+    DEBUGpic14_emitcode ("; left is lit","line %d result %s, left %s, right %s",__LINE__,
+                  AopType(AOP_TYPE(IC_RESULT(ic))),
+                  AopType(AOP_TYPE(IC_LEFT(ic))),
+                  AopType(AOP_TYPE(IC_RIGHT(ic))));
+
+
+    if( (size == 1) && ((lit & 0xff) == 0) ) {
+      /* res = 0 - right */
+      if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic))) ) {
+       emitpcode(POC_COMF,  popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_INCF,  popGet(AOP(IC_RIGHT(ic)),0));
+      } else { 
+       emitpcode(POC_COMFW,  popGet(AOP(IC_RIGHT(ic)),0));
+       emitpcode(POC_MOVWF,  popGet(AOP(IC_RESULT(ic)),0));
+       emitpcode(POC_INCF,   popGet(AOP(IC_RESULT(ic)),0));
+      }
+      goto release;
+    }
+
+    emitpcode(POC_MOVFW,  popGet(AOP(IC_RIGHT(ic)),0));
+    emitpcode(POC_SUBLW, popGetLit(lit & 0xff));    
+    emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
+
+
+    offset = 1;
+    while(--size) {
+      lit >>= 8;
+
+      if(size == 1) {
+       /* This is the last byte in a multibyte subtraction 
+        * There are a couple of tricks we can do by not worrying about 
+        * propogating the carry */
+       if(lit == 0xff) {
+         /* 0xff - x == ~x */
+         if(same) {
+           emitpcode(POC_COMF,  popGet(AOP(IC_RESULT(ic)),offset));
+           emitSKPC;
+           emitpcode(POC_DECF,  popGet(AOP(IC_RESULT(ic)),offset));
+         } else {
+           emitpcode(POC_COMFW, popGet(AOP(IC_RIGHT(ic)),offset));
+           emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset));
+           emitSKPC;
+           emitpcode(POC_DECF,  popGet(AOP(IC_RESULT(ic)),offset));
+         }
+       } else {
+           emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset));
+           emitSKPC;
+           emitpcode(POC_INCFW, popGet(AOP(IC_RIGHT(ic)),offset));
+           emitpcode(POC_SUBLW, popGetLit(lit & 0xff));
+           emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset));
+       }
+
+       goto release;
+      }
+
+      if(same) {
+
+       if(lit & 0xff) {
+         emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+         emitSKPC;
+         emitpcode(POC_MOVLW, popGetLit((lit & 0xff)-1));
+         emitpcode(POC_SUBWF,  popGet(AOP(IC_RESULT(ic)),offset));
+       } else {
+         emitSKPNC;
+         emitpcode(POC_SUBWF,  popGet(AOP(IC_RESULT(ic)),offset));
+
+       }
+      } else {
+
+       if(lit & 0xff) {
+         emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
+         emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset));
+       } else
+         emitpcode(POC_CLRF, popGet(AOP(IC_RESULT(ic)),offset));
+
+       emitpcode(POC_MOVFW,  popGet(AOP(IC_RIGHT(ic)),offset));
+       emitSKPC;
+       emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset));
+       emitpcode(POC_SUBWF,  popGet(AOP(IC_RESULT(ic)),offset));
+      }
+    }
+  
+
   } else {
 
+    DEBUGpic14_emitcode ("; ","line %d result %s, left %s, right %s",__LINE__,
+                  AopType(AOP_TYPE(IC_RESULT(ic))),
+                  AopType(AOP_TYPE(IC_LEFT(ic))),
+                  AopType(AOP_TYPE(IC_RIGHT(ic))));
+
     if(strcmp(aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE),"a") == 0 ) {
       DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-      emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0));
       emitpcode(POC_SUBLW, popGetLit(0));
-      emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+      emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
     } else {
 
       if ( AOP_TYPE(IC_LEFT(ic)) == AOP_ACC) {
-       emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+       emitpcode(POC_SUBFW, popGet(AOP(IC_RIGHT(ic)),0));
        emitpcode(POC_SUBLW, popGetLit(0));
        if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
-         emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
       } else {
 
        DEBUGpic14_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
        if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC) 
-         emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_MOVFW,popGet(AOP(IC_RIGHT(ic)),0));
 
        if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
-         emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+         emitpcode(POC_SUBWF, popGet(AOP(IC_LEFT(ic)),0));
        else {
          if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) ||
              (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) {
-           emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+           emitpcode(POC_SUBLW, popGet(AOP(IC_LEFT(ic)),0));
          } else {
-           emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
+           emitpcode(POC_SUBFW, popGet(AOP(IC_LEFT(ic)),0));
          }
          if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) {
            if ( AOP_TYPE(IC_RESULT(ic)) == AOP_CRY) {
-             emitpcode(POC_BCF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+             emitpcode(POC_BCF ,   popGet(AOP(IC_RESULT(ic)),0));
              emitSKPZ;
-             emitpcode(POC_BSF ,   popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+             emitpcode(POC_BSF ,   popGet(AOP(IC_RESULT(ic)),0));
            }else
-             emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+             emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
          }
        }
       }
@@ -937,13 +1452,13 @@ void genMinus (iCode *ic)
 
     while(size--){
       if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
-       emitpcode(POC_MOVFW,  popGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
-       emitpcode(POC_MOVWF,  popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+       emitpcode(POC_MOVFW,  popGet(AOP(IC_LEFT(ic)),offset));
+       emitpcode(POC_MOVWF,  popGet(AOP(IC_RESULT(ic)),offset));
       }
-      emitpcode(POC_MOVFW,  popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
-      emitSKPNC;
-      emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset,FALSE,FALSE));
-      emitpcode(POC_SUBWF,  popGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
+      emitpcode(POC_MOVFW,  popGet(AOP(IC_RIGHT(ic)),offset));
+      emitSKPC;
+      emitpcode(POC_INCFSZW,popGet(AOP(IC_RIGHT(ic)),offset));
+      emitpcode(POC_SUBWF,  popGet(AOP(IC_RESULT(ic)),offset));
 
       offset++;
     }