* src/hc08/gen.c (genPackBitsImmed, genUnpackBitsImmed): fix offset
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 28 Aug 2004 00:10:41 +0000 (00:10 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 28 Aug 2004 00:10:41 +0000 (00:10 +0000)
problem in bitfields >= 8 bits.

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

ChangeLog
src/hc08/gen.c

index 00cf8c4a88b33e0c8774c1ff4bbeffe32b0b7703..1a5db842b5e56c40a95bbde9961ba9fb8ab5f310 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-27 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
+
+       * src/hc08/gen.c (genPackBitsImmed, genUnpackBitsImmed): fix offset
+       problem in bitfields >= 8 bits.
+
 2004-08-27 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * src/SDCCsymt.c: undid changes that were not meant to be committed
index b87216333edd0fa3c1811405e649d57db8a1650b..5b755ac39e3e95cfceb7d1533065244707cf4845 100644 (file)
@@ -6618,7 +6618,7 @@ genUnpackBitsImmed (operand * left,
      but the partial byte at the end.  */
   for (rlen=blen;rlen>=8;rlen-=8)
     {
-      loadRegFromAop (hc08_reg_a, derefaop, size-offset);
+      loadRegFromAop (hc08_reg_a, derefaop, size-offset-1);
       if (!ifx)
         storeRegToAop (hc08_reg_a, AOP (result), offset);
       else
@@ -6629,7 +6629,7 @@ genUnpackBitsImmed (operand * left,
   /* Handle the partial byte at the end */
   if (rlen)
     {
-      loadRegFromAop (hc08_reg_a, derefaop, size-offset);
+      loadRegFromAop (hc08_reg_a, derefaop, size-offset-1);
       emitcode ("and", "#0x%02x", ((unsigned char) -1) >> (8-rlen));
       storeRegToAop (hc08_reg_a, AOP (result), offset++);
     }
@@ -6903,7 +6903,7 @@ genPackBits (sym_link * etype,
 }
 
 /*-----------------------------------------------------------------*/
-/* genPackBits - generates code for packed bit storage             */
+/* genPackBitsImmed - generates code for packed bit storage        */
 /*-----------------------------------------------------------------*/
 static void
 genPackBitsImmed (operand *result, sym_link * etype, operand * right, iCode * ic)
@@ -7006,7 +7006,7 @@ genPackBitsImmed (operand *result, sym_link * etype, operand * right, iCode * ic
   /* all except the partial byte at the end                 */
   for (rlen=blen;rlen>=8;rlen-=8)
     {
-      transferAopAop (AOP (right), offset, derefaop, size-offset);
+      transferAopAop (AOP (right), offset, derefaop, size-offset-1);
       offset++;
     }
 
@@ -7022,13 +7022,13 @@ genPackBitsImmed (operand *result, sym_link * etype, operand * right, iCode * ic
           litval = (int) floatFromVal (AOP (right)->aopu.aop_lit);
           litval >>= (blen-rlen);
           litval &= (~mask) & 0xff;
-          loadRegFromAop (hc08_reg_a, derefaop, size-offset);
+          loadRegFromAop (hc08_reg_a, derefaop, size-offset-1);
           if ((mask|litval)!=0xff)
             emitcode ("and","#0x%02x", mask);
           if (litval)
             emitcode ("ora","#0x%02x", litval);
           hc08_dirtyReg (hc08_reg_a, FALSE);
-          storeRegToAop (hc08_reg_a, derefaop, size-offset);
+          storeRegToAop (hc08_reg_a, derefaop, size-offset-1);
           hc08_dirtyReg (hc08_reg_a, FALSE);
           hc08_freeReg (hc08_reg_a);
           goto release;
@@ -7041,10 +7041,10 @@ genPackBitsImmed (operand *result, sym_link * etype, operand * right, iCode * ic
       hc08_dirtyReg (hc08_reg_a, FALSE);
       pushReg (hc08_reg_a, TRUE);
 
-      loadRegFromAop (hc08_reg_a, derefaop, size-offset);
+      loadRegFromAop (hc08_reg_a, derefaop, size-offset-1);
       emitcode ("and", "#0x%02x", mask);
       emitcode ("ora", "1,s");
-      storeRegToAop (hc08_reg_a, derefaop, size-offset);
+      storeRegToAop (hc08_reg_a, derefaop, size-offset-1);
       pullReg (hc08_reg_a);
     }