* src/pic16/gen.c (pic16_aopOp): use WREG as destination even for
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 10 Jun 2006 09:31:29 +0000 (09:31 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 10 Jun 2006 09:31:29 +0000 (09:31 +0000)
  multibyte dummy reads (fixes #1503234)

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4211 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/pic16/gen.c

index c92c3a1a8d79c6f1a63b7adf3c490b9e6e9fc655..e4a435565201cc7dc85e21a66a2ba46b09822ced 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-06-10 Raphael Neider <rneider AT web.de>
+
+       * src/pic16/gen.c (pic16_aopOp): use WREG as destination even for
+         multibyte dummy reads (fixes #1503234)
+
 2006-06-10 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * device/include/mcs51/compiler.h: new, added header file to enable
index b1f315daaac3dde4ad950c5b674b4bb78f719cc7..61ed3aa72d29028f83828c2dfb5fc9fc5351cc95 100644 (file)
@@ -1288,23 +1288,30 @@ void pic16_aopOp (operand *op, iCode *ic, bool result)
                            sym->rname, sym->usl.spillLoc->offset);
 #endif
 
-       sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
-       if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
-           /* Don't reuse the new aop */
-           sym->usl.spillLoc->aop = NULL;
-       }
        //aop->aopu.pcop = pic16_popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset);
        if (sym->usl.spillLoc && sym->usl.spillLoc->rname) {
+         sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
          aop->aopu.pcop = pic16_popRegFromString(sym->usl.spillLoc->rname, 
                                                  getSize(sym->type), 
                                                  sym->usl.spillLoc->offset, op);
-       } else {
-         fprintf (stderr, "%s:%d called for a spillLocation -- assigning WREG instead --- CHECK!\n", __FUNCTION__, __LINE__);
+       } else if (getSize(sym->type) <= 1) {
+         //fprintf (stderr, "%s:%d called for a spillLocation -- assigning WREG instead --- CHECK (size:%u)!\n", __FUNCTION__, __LINE__, getSize(sym->type));
          pic16_emitpcomment (";!!! %s:%d called for a spillLocation -- assigning WREG instead --- CHECK", __FUNCTION__, __LINE__);
          assert (getSize(sym->type) <= 1);
+         sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
          aop->aopu.pcop = pic16_popCopyReg (&pic16_pc_wreg);
+       } else {
+         /* We need some kind of dummy area for getSize(sym->type) byte,
+          * use WREG for all storage locations.
+          * XXX: This only works if we are implementing a `dummy read',
+          *      the stored value will not be retrievable...
+          *      See #1503234 for a case requiring this. */
+         sym->aop = op->aop = aop = newAsmop(AOP_REG);
+         aop->size = getSize(sym->type);
+         for ( i = 0 ; i < aop->size ;i++)
+           aop->aopu.aop_reg[i] = pic16_pc_wreg.r;
        }
-        aop->size = getSize(sym->type);
+       aop->size = getSize(sym->type);
 
         return;
     }