This code
struct B { unsigned b : 2; };
void store (struct B *b, int v)
{ b->b = v;}
produces this assembler
store:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
movb 12(%ebp), %dl
andl $3, %edx
andl $3, %edx
movl (%ecx), %eax
andl $-4, %eax
orl %edx, %eax
movl %eax, (%ecx)
leave
ret
Those two andl $3's get inserted becuase rtl expansion generates somethine
daft. Here's the bits of rtl
(insn 13 11 14 1 (parallel [
(set (reg:QI 60)
(and:QI (subreg:QI (reg/v:SI 59 [ v ]) 0)
(const_int 3 [0x3])))
(clobber (reg:CC 17 flags))
]) -1 (nil)
(nil))
(insn 15 14 16 1 (parallel [
(set (reg:SI 62)
(zero_extend:SI (reg:QI 60)))
(clobber (reg:CC 17 flags))
]) -1 (nil)
(nil))
(insn 16 15 17 1 (parallel [
(set (reg:SI 63)
(and:SI (reg:SI 62)
(const_int 3 [0x3])))
(clobber (reg:CC 17 flags))
]) -1 (nil)
(nil))
huh?
--
Summary: Duplicate mask on bitfield insertion
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: nathan at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18008