* src/z80/gen.c (genUnpackBits): fixed bug 1019480
authormaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 13 Feb 2006 13:50:50 +0000 (13:50 +0000)
committermaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 13 Feb 2006 13:50:50 +0000 (13:50 +0000)
* support/regression/tests/bitfields.c: enabled signed bitfield for z80

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

ChangeLog
src/z80/gen.c
support/regression/tests/bitfields.c

index 58be5c38e3180d53f125031a51bf2ceaaaf359eb..8118e9888eeb179fb56936884f834c49c96393fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-12 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * src/z80/gen.c (genUnpackBits): fixed bug 1019480
+       * support/regression/tests/bitfields.c: enabled signed bitfield for z80
+
 2006-02-11 Borut Razem <borut.razem AT siol.net>
 
        * src/SDCCmain.c: Added "sdcc: Calling linker..." if --verbose,
index 72d5726683ebcc6742b85efb135b77742e0331a3..1deec7c76cf69fe307f77c5f2c8755b20e2056db 100644 (file)
@@ -5268,7 +5268,7 @@ genOr (iCode * ic, iCode * ifx)
         {
           wassertl (0, "Result is assigned to a bit");
         }
-      /* PENDING: Modeled after the AND code which is inefficent. */
+      /* PENDING: Modeled after the AND code which is inefficient. */
       while (sizel--)
         {
           bytelit = (lit >> (offset * 8)) & 0x0FFL;
@@ -6395,8 +6395,18 @@ genUnpackBits (operand * result, int pair)
   if (blen < 8)
     {
       emit2 ("ld a,!*pair", _pairs[pair].name);
-      AccRsh (bstr);
+      AccRol (8 - bstr);
       emit2 ("and a,!immedbyte", ((unsigned char) -1) >> (8 - blen));
+      if (!SPEC_USIGN (etype))
+        {
+          /* signed bitfield */
+          symbol *tlbl = newiTempLabel (NULL);
+
+          emit2 ("bit %d,a", blen - 1);
+          emit2 ("jp z,!tlabel", tlbl->key + 100);
+          emit2 ("or a,!immedbyte", (unsigned char) (0xff << blen));
+         emitLabel (tlbl->key + 100);
+        }
       aopPut (AOP (result), "a", offset++);
       goto finish;
     }
@@ -6411,6 +6421,16 @@ genUnpackBits (operand * result, int pair)
       emit2 ("ld l,a");
       emit2 ("ld a,h");
       emit2 ("and a,!immedbyte", ((unsigned char) -1) >> (16 - blen));
+      if (!SPEC_USIGN (etype))
+        {
+          /* signed bitfield */
+          symbol *tlbl = newiTempLabel (NULL);
+
+          emit2 ("bit %d,a", blen - 1);
+          emit2 ("jp z,!tlabel", tlbl->key + 100);
+          emit2 ("or a,!immedbyte", (unsigned char) (0xff << blen));
+         emitLabel (tlbl->key + 100);
+        }
       emit2 ("ld h,a");
       spillPair (PAIR_HL);
       return;
@@ -6434,15 +6454,37 @@ genUnpackBits (operand * result, int pair)
     {
       emit2 ("ld a,!*pair", _pairs[pair].name);
       emit2 ("and a,!immedbyte", ((unsigned char) -1) >> (8 - rlen));
+      if (!SPEC_USIGN (etype))
+        {
+          /* signed bitfield */
+          symbol *tlbl = newiTempLabel (NULL);
+
+          emit2 ("bit %d,a", rlen - 1);
+          emit2 ("jp z,!tlabel", tlbl->key + 100);
+          emit2 ("or a,!immedbyte", (unsigned char) (0xff << rlen));
+         emitLabel (tlbl->key + 100);
+        }
       aopPut (AOP (result), "a", offset++);
     }
 
 finish:
   if (offset < rsize)
     {
+      char *source;
+
+      if (SPEC_USIGN (etype))
+        source = "!zero";
+      else
+        {
+          /* signed bitfield: sign extension with 0x00 or 0xff */
+          emit2 ("rla");
+          emit2 ("sbc a,a");
+
+          source = "a";
+        }
       rsize -= offset;
       while (rsize--)
-       aopPut (AOP (result), "!zero", offset++);
+       aopPut (AOP (result), source, offset++);
     }
 }
 
index b511baa8bdb46ebb2da5bc1029fdd6e76da62976..095734fb6958eec07fd24029b62eaef31defa287 100644 (file)
@@ -345,7 +345,7 @@ testBitfields(void)
 void
 testSignedBitfields(void)
 {
-#if !defined(SDCC_hc08) && !defined(SDCC_z80) && !defined(SDCC_gbz80)
+#if !defined(SDCC_hc08)
   s_bf.s0_7 =   0xf0;
   s_bf.s7_1 =      1;
   s_bf.s8_9 = 0xfff8;