From 44db9114471a9e1458b22ce3899bbba0549b9c88 Mon Sep 17 00:00:00 2001 From: maartenbrock Date: Mon, 13 Feb 2006 13:50:50 +0000 Subject: [PATCH] * src/z80/gen.c (genUnpackBits): fixed bug 1019480 * 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 | 5 +++ src/z80/gen.c | 48 ++++++++++++++++++++++++++-- support/regression/tests/bitfields.c | 2 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 58be5c38..8118e988 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-02-12 Maarten Brock + + * src/z80/gen.c (genUnpackBits): fixed bug 1019480 + * support/regression/tests/bitfields.c: enabled signed bitfield for z80 + 2006-02-11 Borut Razem * src/SDCCmain.c: Added "sdcc: Calling linker..." if --verbose, diff --git a/src/z80/gen.c b/src/z80/gen.c index 72d57266..1deec7c7 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -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++); } } diff --git a/support/regression/tests/bitfields.c b/support/regression/tests/bitfields.c index b511baa8..095734fb 100644 --- a/support/regression/tests/bitfields.c +++ b/support/regression/tests/bitfields.c @@ -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; -- 2.30.2