source code:
volatile uint16_t tmp;
void main(void) {
PORTA=0xFF;
// tmp check for non-zero, except for the eighth bit
if(tmp&(~((uint16_t)1<<8))) {
PORTA=0;
}
}
Generated code:
MOVLW 0xff
BANKSEL PORTA
MOVWF _PORTA
; .line 8; "bug6.c" if(tmp&(~((uint16_t)1<<8))) {
BANKSEL _tmp
MOVF _tmp,W
ANDLW 0xff
BTFSC STATUS,2
GOTO _00001_DS
MOVF (tmp + 1),W
; .line 9; "bug6.c" PORTA=0;
ANDLW 0xfe
BTFSC STATUS,2
GOTO _00001_DS
BANKSEL PORTA
CLRF _PORTA
_00001_DS
RETURN
Result:
tmp=0x0000 => PORTA=FF -- Good
tmp=0x1000 => PORTA=FF -- BAD
tmp=0x0100 => PORTA=FF -- BAD
tmp=0x0001 => PORTA=FF -- BAD
$ sdcc -v
SDCC : mcs51/gbz80/z80/z180/r2k/r3ka/ds390/pic16/pic14/TININative/ds400/hc08/s08 3.2.0 #8008 (Jul 6 2012) (Linux)