From d20c96fdb2fc3a4e9e6eb0243ddfe4bd296d1ccb Mon Sep 17 00:00:00 2001 From: tecodev Date: Mon, 4 Sep 2006 23:09:44 +0000 Subject: [PATCH] * src/pic16/gen.c (genPackBits): fix assignemnt to 8-bit, byte-aligned bitfields, fixes #1539278 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4359 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 5 +++++ src/pic16/gen.c | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 36f6e5ec..54e7aa36 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-09-05 Raphael Neider + + * src/pic16/gen.c (genPackBits): fix assignemnt to 8-bit, + byte-aligned bitfields, fixes #1539278 + 2006-09-05 Raphael Neider * src/pic/gen.c (genReceive): skip unreferenced arguments, diff --git a/src/pic16/gen.c b/src/pic16/gen.c index e8773440..3c2cb782 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -11722,7 +11722,7 @@ static void genPackBits (sym_link *etype , operand *result, || SPEC_BLEN(etype) <= 8 ) { int fsr0_setup = 0; - if (blen != 8 || bstr != 0) { + if (blen != 8 || (bstr % 8) != 0) { // we need to combine the value with the old value if(!shifted_and_masked) { @@ -11757,7 +11757,12 @@ static void genPackBits (sym_link *etype , operand *result, if (lit != 0) pic16_emitpcode(POC_IORLW, pic16_popGetLit(lit)); } - } // if (blen != 8 || bstr != 0) + } else { // if (blen == 8 && (bstr % 8) == 0) + if (shifted_and_masked) { + // move right (literal) to WREG (only case where right is not yet in WREG) + pic16_mov2w(AOP(right), (bstr / 8)); + } + } /* write new value back */ if ((IS_SYMOP(result) && !IS_PTR(operandType(result))) -- 2.47.2