This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

avr: optimizing assignment to a bit field


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?

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]