This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: avr: optimizing assignment to a bit field
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Shaun Jackman <sjackman at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Sat, 28 Nov 2009 23:57:04 +0100
- Subject: Re: avr: optimizing assignment to a bit field
- References: <7f45d9390911281443j4db07fa9hedad1ae0416b725c@mail.gmail.com>
On Sat, Nov 28, 2009 at 11:43 PM, Shaun Jackman <sjackman@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
>