From: epetrich Date: Sat, 28 Aug 2004 00:10:41 +0000 (+0000) Subject: * src/hc08/gen.c (genPackBitsImmed, genUnpackBitsImmed): fix offset X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=4b37035647e82a2f2bd19f053500756ab5b99a8d;p=fw%2Fsdcc * src/hc08/gen.c (genPackBitsImmed, genUnpackBitsImmed): fix offset problem in bitfields >= 8 bits. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3454 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 00cf8c4a..1a5db842 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-08-27 Erik Petrich + + * src/hc08/gen.c (genPackBitsImmed, genUnpackBitsImmed): fix offset + problem in bitfields >= 8 bits. + 2004-08-27 Maarten Brock * src/SDCCsymt.c: undid changes that were not meant to be committed diff --git a/src/hc08/gen.c b/src/hc08/gen.c index b8721633..5b755ac3 100644 --- a/src/hc08/gen.c +++ b/src/hc08/gen.c @@ -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); }