From: SourceForge.net <no...@so...> - 2012-06-14 20:00:18
|
Bugs item #3486135, was opened at 2012-02-09 02:05 Message generated for change (Comment added) made by patryks You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3486135&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: mcs51(8051) target Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Phil () Assigned to: Nobody/Anonymous (nobody) Summary: Masking bits generates non-atomic code Initial Comment: An expression to clear a bit (or bits) in a byte in the DATA area (or an SFR) should be atomic. // sdcc -c testcase.c #define MASK 0x0f unsigned char reg; void testcase(void) { reg &= ~MASK; } should generate: anl _reg,#0xFe but actually generates: mov r7,_reg anl ar7,#0xF0 mov _reg,r7 Using SDCC : mcs51 3.1.0 #7066 (Nov 28 2011) (Mac OS X x86_64) Suggestion: Could this be fixed by a peeophole rule? ---------------------------------------------------------------------- Comment By: Patryk (patryks) Date: 2012-06-14 13:00 Message: >> Also, are SFR's implitly considered DATA or IDATA? SFR's can be accessed only directly, i.e. as DATA. ---------------------------------------------------------------------- Comment By: Phil () Date: 2012-06-12 02:27 Message: See https://sourceforge.net/projects/sdcc/forums/forum/1865/topic/5343383/index/page/1 for discussion of workaround using a peephole rule. ---------------------------------------------------------------------- Comment By: Phil () Date: 2012-02-14 01:07 Message: Note also that by using an inverse macro, avoiding the need for the ~ operator, the correct code is generated with 3.1.0: #define IMASK 0xf0 unsigned char reg; void testcase(void) { reg &= IMASK; } ---------------------------------------------------------------------- Comment By: Gabriele Gorla (gorlik) Date: 2012-02-14 00:58 Message: sdcc 3.0 compiles it as anl _reg,#0xF0 without the cast. ---------------------------------------------------------------------- Comment By: Thomas Sailer (tsailer) Date: 2012-02-09 04:55 Message: If you change reg &= ~MASK to reg &= (unsigned char)~MASK, then it will generate what you want, i.e. anl _reg,#0xF0 And yes, that cast shouldn't be necessary... ---------------------------------------------------------------------- Comment By: Phil () Date: 2012-02-09 02:32 Message: On checking the instruction set reference (http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51anl), I may have this wrong as anl only suppords an indirect address as the first operand. However, I would then expect SDCC to generate an atomic operation if 'reg' is declared as IDATA, viz: unsigned char __idata reg; Instead, it generates the following: mov r0,#_reg mov ar7,@r0 anl ar7,#0xF0 mov r0,#_reg mov @r0,ar7 Also, are SFR's implitly considered DATA or IDATA? Apologies if I'm being daft here :) ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=3486135&group_id=599 |