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