On Sat, Nov 28, 2009 at 11:43 PM, Shaun Jackman <sjack...@gmail.com> wrote:
> When assigning a bool to a single bit of a bitfield located in the
> bit-addressable region of memory, better code is produced by
>        if (flag)
>                bitfield.bit = true;
>        else
>                bitfield.bit = false;
> than
>        bitfield.bit = flag;
>
> I've included a short test and the assembler output by both forms.
> Should I file a bug suggesting a possible improvement here?

Yes, a bugreport is useful - but there might be a bug with this issue
already.

Richard.

> Cheers,
> Shaun
>
> #include <stdbool.h>
> #include <stdint.h>
>
> struct byte { uint8_t x0:1; uint8_t x1:1; uint8_t x2:1; uint8_t x3:1;
>        uint8_t x4:1; uint8_t x5:1; uint8_t x6:1; uint8_t x7:1; };
>
> volatile struct byte *const porte = (void*)0x23;
>
> void set_flag_good(bool flag)
> {
>        if (flag)
>                porte->x6 = true;
>        else
>                porte->x6 = false;
> }
>
> void set_flag_bad(bool flag)
> {
>        porte->x6 = flag;
> }
>
>
> 00000000 <set_flag_good>:
>   0:   88 23           and     r24, r24
>   2:   01 f4           brne    .+0             ; 0x4 <set_flag_good+0x4>
>                        2: R_AVR_7_PCREL        .text+0x8
>   4:   1e 98           cbi     0x03, 6 ; 3
>   6:   08 95           ret
>   8:   1e 9a           sbi     0x03, 6 ; 3
>   a:   08 95           ret
>
> 0000000c <set_flag_bad>:
>   c:   81 70           andi    r24, 0x01       ; 1
>   e:   82 95           swap    r24
>  10:   88 0f           add     r24, r24
>  12:   88 0f           add     r24, r24
>  14:   80 7c           andi    r24, 0xC0       ; 192
>  16:   93 b1           in      r25, 0x03       ; 3
>  18:   9f 7b           andi    r25, 0xBF       ; 191
>  1a:   98 2b           or      r25, r24
>  1c:   93 b9           out     0x03, r25       ; 3
>  1e:   08 95           ret
>

Reply via email to