* src/pic16/genarith.c (genAddLit): fix structure access (#1888004)
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 8 Aug 2008 18:00:57 +0000 (18:00 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 8 Aug 2008 18:00:57 +0000 (18:00 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@5208 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/pic16/genarith.c

index a1ee78daf125b392b0484009fd2f9e2903fd48cb..78943f9b25fc4c0bb418b1612def841ed121dd0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-08-08 Raphael Neider <rneider AT web.de>
+
+       * src/pic16/genarith.c (genAddLit): fix structure access (#1888004)
+
 2008-08-08 Raphael Neider <rneider AT web.de>
 
        * src/pic/pcoderegs.c,
index fbb240bf8c8995176b03379e18926bb311846fda..1e06e7b911d71762f34a9bef7aec569fea0a3a17 100644 (file)
@@ -424,19 +424,30 @@ static void genAddLit (iCode *ic, int lit)
 {
 
   int size,same;
-  int lo;
+  int lo, offset;
 
   operand *result;
   operand *left;
 
-    FENTRY;
-
+  FENTRY;
 
   left = IC_LEFT(ic);
   result = IC_RESULT(ic);
   same = pic16_sameRegs(AOP(left), AOP(result));
   size = pic16_getDataSize(result);
 
+  if ((AOP_PCODE == AOP_TYPE(left))
+          && (PO_IMMEDIATE == AOP(left)->aopu.pcop->type))
+  {
+      /* see #1888004 for an example case for this */
+      for (offset = 0; offset < size; offset++) {
+          pic16_emitpcode(POC_MOVLW, pic16_newpCodeOpImmd(AOP(left)->aopu.pcop->name,
+                  offset, PCOI(AOP(left)->aopu.pcop)->index + lit, 0));
+          pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result), offset));
+      } // for
+      return;
+  } // if
+
   if(same) {
 
     /* Handle special cases first */