The following listing shows that the ~ operation is expanded to a short when
used in a conditional expression. 
Attached is code with the problem, and the workaround.

----
unsigned char g()
{
        return 0x5a;
}

void p(unsigned char c)
{
        volatile unsigned char tmp;

        tmp = c;
}

int main(int argc, char * argv[])
{
        unsigned char XOR = 0xa5;
        unsigned char tmp = 0;

        if (g() == ~XOR)
                p(tmp);

        tmp = ~XOR;
        if  (g() == tmp)
                p(tmp);

        return 0;
}
----
        if (g() == ~XOR)
  ea:   0e 94 52 00     call    0xa4    ; 0xa4 <g>
  ee:   28 2f           mov     r18, r24
  f0:   30 e0           ldi     r19, 0x00       ; 0
  f2:   8a 81           ldd     r24, Y+2        ; 0x02
  f4:   88 2f           mov     r24, r24
  f6:   90 e0           ldi     r25, 0x00       ; 0
  f8:   80 95           com     r24
  fa:   90 95           com     r25
  fc:   28 17           cp      r18, r24
  fe:   39 07           cpc     r19, r25
 100:   19 f4           brne    .+6             ; 0x108 <main+0x3a>
                p(tmp);
 102:   89 81           ldd     r24, Y+1        ; 0x01
 104:   0e 94 5a 00     call    0xb4    ; 0xb4 <p>

        tmp = ~XOR;
 108:   8a 81           ldd     r24, Y+2        ; 0x02
 10a:   80 95           com     r24
 10c:   89 83           std     Y+1, r24        ; 0x01
        if  (g() == tmp)
 10e:   0e 94 52 00     call    0xa4    ; 0xa4 <g>
 112:   98 2f           mov     r25, r24
 114:   89 81           ldd     r24, Y+1        ; 0x01
 116:   98 17           cp      r25, r24
 118:   19 f4           brne    .+6             ; 0x120 <main+0x52>
                p(tmp);
 11a:   89 81           ldd     r24, Y+1        ; 0x01
 11c:   0e 94 5a 00     call    0xb4    ; 0xb4 <p>


-- 
           Summary: [avr] conditional comparison uses short instead of char
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: najay at najay dot com
  GCC host triplet: x86
GCC target triplet: avr-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40935

Reply via email to