* as/z80/z80mch.c: fixed bug #1704376: missing as-z80 errors
[fw/sdcc] / src / pic16 / genutils.c
index 4e077b4dce4eb2921315b3adbf599ac37b19b4be..c4743a581232c71f502e5b336f800cda039a09e9 100644 (file)
@@ -155,6 +155,8 @@ void pic16_genCpl (iCode *ic)
     } 
 
     size = AOP_SIZE(IC_RESULT(ic));
+    if (size >= AOP_SIZE(IC_LEFT(ic))) size = AOP_SIZE(IC_LEFT(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));
@@ -165,6 +167,34 @@ void pic16_genCpl (iCode *ic)
       offset++;
     }
 
+    /* handle implicit upcast */
+    size = AOP_SIZE(IC_RESULT(ic));
+    if (offset < size)
+    {
+      if (SPEC_USIGN(operandType(IC_LEFT(ic)))) {
+       while (offset < size) {
+         pic16_emitpcode(POC_SETF, pic16_popGet(AOP(IC_RESULT(ic)), offset));
+         offset++;
+       } // while
+      } else {
+       if ((offset + 1) == size) {
+         /* just one byte to fix */
+         pic16_emitpcode(POC_SETF, pic16_popGet(AOP(IC_RESULT(ic)), offset));
+         pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RESULT(ic)),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
+         pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(IC_RESULT(ic)), offset));
+       } else {
+         /* two or more byte to adjust */
+         pic16_emitpcode(POC_SETF, pic16_popCopyReg( &pic16_pc_wreg ));
+         pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RESULT(ic)),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER));
+         pic16_emitpcode(POC_CLRF, pic16_popCopyReg( &pic16_pc_wreg ));
+         while (offset < size) {
+           pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(IC_RESULT(ic)), offset));
+           offset++;
+         } // while
+       } // if
+      }
+    } // if
+
 release:
     /* release the aops */
     pic16_freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
@@ -287,23 +317,10 @@ void pic16_DumpAop(char *prefix, asmop *aop)
                DEBUGpic16_emitcode (";", " %s type:AOP_DIR",prefix);
                DEBUGpic16_emitcode (";", " %s aopu.aop_dir:%s",prefix,aop->aopu.aop_dir);
        }
-       if (aop->type == AOP_DPTR)
-               DEBUGpic16_emitcode (";", " %s type:AOP_DPTR",prefix);
-       if (aop->type == AOP_DPTR2)
-               DEBUGpic16_emitcode (";", " %s type:AOP_DPTR2",prefix);
-       if (aop->type == AOP_R0)
-               DEBUGpic16_emitcode (";", " %s type:AOP_R0",prefix);
-       if (aop->type == AOP_R1)
-               DEBUGpic16_emitcode (";", " %s type:AOP_R1",prefix);
        if (aop->type == AOP_STK)
                DEBUGpic16_emitcode (";", " %s type:AOP_STK",prefix);
        if (aop->type == AOP_STA)
                DEBUGpic16_emitcode (";", " %s type:AOP_STA",prefix);
-       if (aop->type == AOP_IMMD)
-       {
-               DEBUGpic16_emitcode (";", " %s type:AOP_IMMD",prefix);
-               DEBUGpic16_emitcode (";", " %s aopu.aop_immd:%s",prefix,aop->aopu.aop_immd);
-       }
        if (aop->type == AOP_STR)
        {
                DEBUGpic16_emitcode (";", " %s type:AOP_STR",prefix);
@@ -418,6 +435,25 @@ void pic16_DumpOp(char *prefix, operand *op)
 
 }
 
+void pic16_DumpOpX(FILE *fp, char *prefix, operand *op)
+{
+  if(!op)return;
+    
+  fprintf(fp, "%s [", prefix);
+  fprintf(fp, "%s", IS_SYMOP(op)?"S":" ");
+  fprintf(fp, "%s", IS_VALOP(op)?"V":" ");
+  fprintf(fp, "%s", IS_TYPOP(op)?"T":" ");
+  fprintf(fp, "] ");
+
+  fprintf(fp, "isaddr:%d,", op->isaddr);
+  fprintf(fp, "isvolatile:%d,", op->isvolatile);
+  fprintf(fp, "isGlobal:%d,", op->isGlobal);
+  fprintf(fp, "isPtr:%d,", op->isPtr);
+  fprintf(fp, "isParm:%d,", op->isParm);
+  fprintf(fp, "isLit:%d\n", op->isLiteral);
+}  
+    
+
 void _debugf(char *f, int l, char *frm, ...)
 {
   va_list ap;
@@ -555,7 +591,7 @@ int pic16_genCmp_special(operand *left, operand *right, operand *result,
     
     if(isAOP_REGlike(left) && isAOP_LIT(right)) {
       /* comparing register vs. literal */
-      lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
+      lit = ulFromVal(AOP(right)->aopu.aop_lit);
       
       
       if(size == 1) {
@@ -571,7 +607,7 @@ int pic16_genCmp_special(operand *left, operand *right, operand *result,
                 tmplbl = newiTempLabel( NULL );
                 pic16_emitpcode(POC_TSTFSZ, pic16_popGet(AOP(left), 0));
                 pic16_emitpcode(POC_BRA, pic16_popGetLabel(tmplbl->key));
-                pic16_emitpcode(POC_BRA, pic16_popGetLabel(rIfx->lbl->key));
+                pic16_emitpcode(POC_GOTO, pic16_popGetLabel(rIfx->lbl->key));
                 pic16_emitpLabel(tmplbl->key);
 
                 ifx->generated = 1;