* applied a previous patch from Raphael Neider that wasn't included
[fw/sdcc] / src / pic16 / genutils.c
index ab5f75be5a57e5d2bfe6f5eb5c0ccdcf5ef499a8..55e5bbe9d3572bf9262d77b7b1b75ad8d4a0529b 100644 (file)
@@ -75,46 +75,46 @@ void pic16_genNot (iCode *ic)
  * result[AOP_CRY,AOP_REG]  = ! left[AOP_CRY, AOP_REG]
  */
 
-       DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-
-       /* assign asmOps to operand & result */
-       pic16_aopOp (IC_LEFT(ic),ic,FALSE);
-       pic16_aopOp (IC_RESULT(ic),ic,TRUE);
-       DEBUGpic16_pic16_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) {
-                       pic16_emitpcode(POC_MOVLW,pic16_popGet(AOP(IC_LEFT(ic)),0));
-                       pic16_emitpcode(POC_XORWF,pic16_popGet(AOP(IC_RESULT(ic)),0));
-               } else {
-                       pic16_emitpcode(POC_CLRF,pic16_popGet(AOP(IC_RESULT(ic)),0));
-                       pic16_emitpcode(POC_BTFSS,pic16_popGet(AOP(IC_LEFT(ic)),0));
-                       pic16_emitpcode(POC_INCF,pic16_popGet(AOP(IC_RESULT(ic)),0));
-               }
-               goto release;
-       }
-
-       size = AOP_SIZE(IC_LEFT(ic));
+    FENTRY;
+   
+    /* assign asmOps to operand & result */
+    pic16_aopOp (IC_LEFT(ic),ic,FALSE);
+    pic16_aopOp (IC_RESULT(ic),ic,TRUE);
+    DEBUGpic16_pic16_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) {
+        pic16_emitpcode(POC_MOVLW,pic16_popGet(AOP(IC_LEFT(ic)),0));
+        pic16_emitpcode(POC_XORWF,pic16_popGet(AOP(IC_RESULT(ic)),0));
+      } else {
+        pic16_emitpcode(POC_CLRF,pic16_popGet(AOP(IC_RESULT(ic)),0));
+        pic16_emitpcode(POC_BTFSS,pic16_popGet(AOP(IC_LEFT(ic)),0));
+        pic16_emitpcode(POC_INCF,pic16_popGet(AOP(IC_RESULT(ic)),0));
+      }
+      goto release;
+    }
+
+    size = AOP_SIZE(IC_LEFT(ic));
 #if 0
-       if(size == 1) {
-               pic16_emitpcode(POC_COMFW,pic16_popGet(AOP(IC_LEFT(ic)),0));
-               pic16_emitpcode(POC_ANDLW,pic16_popGetLit(1));
-               pic16_emitpcode(POC_MOVWF,pic16_popGet(AOP(IC_RESULT(ic)),0));
-               goto release;
-       }
+    if(size == 1) {
+      pic16_emitpcode(POC_COMFW,pic16_popGet(AOP(IC_LEFT(ic)),0));
+      pic16_emitpcode(POC_ANDLW,pic16_popGetLit(1));
+      pic16_emitpcode(POC_MOVWF,pic16_popGet(AOP(IC_RESULT(ic)),0));
+      goto release;
+    }
 #endif
 
-       pic16_toBoolean( IC_LEFT(ic) );
-       emitSETC;
-       pic16_emitpcode(POC_TSTFSZ, pic16_popCopyReg( &pic16_pc_wreg ));
-       emitCLRC;
-       pic16_outBitC( IC_RESULT(ic) );
+    pic16_toBoolean( IC_LEFT(ic) );
+    emitSETC;
+    pic16_emitpcode(POC_TSTFSZ, pic16_popCopyReg( &pic16_pc_wreg ));
+    emitCLRC;
+    pic16_outBitC( IC_RESULT(ic) );
 
 release:    
-       /* release the aops */
-       pic16_freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
-       pic16_freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+    /* release the aops */
+    pic16_freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
+    pic16_freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
 }
 
 #endif /* defined(GEN_Not) */
@@ -133,37 +133,36 @@ void pic16_genCpl (iCode *ic)
 /*
  * result[CRY,REG] = ~left[CRY,REG]
  */
-
-       DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
-       /* assign asmOps to operand & result */
-       pic16_aopOp (IC_LEFT(ic),ic,FALSE);
-       pic16_aopOp (IC_RESULT(ic),ic,TRUE);
-       DEBUGpic16_pic16_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic));
-
-       /* if both are in bit space then 
-          a special case */
-       if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY &&
-               AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { 
-
-               /* FIXME */
-               pic16_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); 
-               pic16_emitcode("cpl","c"); 
-               pic16_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); 
-               goto release; 
-       } 
-
-       size = AOP_SIZE(IC_RESULT(ic));
-       while (size--) {
-
-               if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
-                       pic16_emitpcode(POC_COMF,  pic16_popGet(AOP(IC_LEFT(ic)), offset));
-               } else {
-                       pic16_emitpcode(POC_COMFW, pic16_popGet(AOP(IC_LEFT(ic)),offset));
-                       pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(IC_RESULT(ic)),offset));
-               }
-               offset++;
-       }
+    FENTRY;
+
+    DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+    /* assign asmOps to operand & result */
+    pic16_aopOp (IC_LEFT(ic),ic,FALSE);
+    pic16_aopOp (IC_RESULT(ic),ic,TRUE);
+    DEBUGpic16_pic16_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic));
+
+    /* if both are in bit space then 
+     * a special case */
+    if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY
+      && AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { 
+
+        /* FIXME */
+        pic16_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir); 
+        pic16_emitcode("cpl","c"); 
+        pic16_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir); 
+        goto release; 
+    } 
+
+    size = AOP_SIZE(IC_RESULT(ic));
+    while (size--) {
+      if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) {
+        pic16_emitpcode(POC_COMF,  pic16_popGet(AOP(IC_LEFT(ic)), offset));
+      } else {
+        pic16_emitpcode(POC_COMFW, pic16_popGet(AOP(IC_LEFT(ic)),offset));
+        pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(IC_RESULT(ic)),offset));
+      }
+      offset++;
+    }
 
 release:
     /* release the aops */
@@ -417,3 +416,50 @@ void pic16_DumpOp(char *prefix, operand *op)
        }
 
 }
+
+void _debugf(char *f, int l, char *frm, ...)
+{
+  va_list ap;
+  
+    va_start(ap, frm);
+    fprintf(stderr, "%s:%d ", f, l);
+    vfprintf(stderr, frm, ap);
+    va_end(ap);
+}
+
+
+
+void gpsimio2_pcop(pCodeOp *pcop)
+{
+  pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pcop, pic16_popCopyReg(&pic16_pc_gpsimio2)));
+}
+
+void gpsimio2_lit(unsigned char lit)
+{
+  pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit));
+  pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pic16_popCopyReg(&pic16_pc_wreg), pic16_popCopyReg(&pic16_pc_gpsimio2)));
+}
+
+void gpsimio2_str(char *buf)
+{
+  while(*buf) {
+    gpsimio2_lit(*buf);
+    buf++;
+  }
+}
+
+void gpsimDebug_StackDump(char *fname, int line, char *info)
+{
+  pic16_emitpcomment("; gpsim debug stack dump; %s @ %d\tinfo: ", fname, line, info);
+  
+  gpsimio2_str("&c[S:");
+  gpsimio2_str(info);
+  gpsimio2_str("] &h");
+  
+  pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pic16_popCopyReg(&pic16_pc_fsr1h),
+                pic16_popCopyReg(&pic16_pc_gpsimio2)));
+  pic16_emitpcode(POC_MOVFF, pic16_popGet2p(pic16_popCopyReg(&pic16_pc_fsr1l),
+                pic16_popCopyReg(&pic16_pc_gpsimio2)));
+
+  gpsimio2_lit('\n');
+}