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

Reply via email to