https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21150

--- Comment #7 from Denis Vlasenko <vda.linux at googlemail dot com> ---
Fixed at least in 4.7.2, maybe earlier. With -m32 -fomit-frame-pointer -O2:

a:      movzbl  v+45, %eax
        xorb    v+36, %al
        xorb    v, %al
        xorb    v+54, %al
        xorb    v+63, %al
        xorb    v+9, %al
        xorb    v+18, %al
        xorb    v+27, %al
        ret
b:      movzbl  v+18, %eax
        xorb    v+9, %al
        xorb    v, %al
        xorb    v+27, %al
        xorb    v+36, %al
        xorb    v+45, %al
        xorb    v+54, %al
        xorb    v+63, %al
        ret
c:      movzbl  v+9, %eax
        xorb    v, %al
        xorb    v+18, %al
        xorb    v+27, %al
        xorb    v+36, %al
        xorb    v+45, %al
        xorb    v+54, %al
        xorb    v+63, %al
        ret
d:      movzbl  v+18, %eax
        xorb    v+9, %al
        xorb    v, %al
        xorb    v+27, %al
        xorb    v+36, %al
        xorb    v+45, %al
        xorb    v+54, %al
        xorb    v+63, %al
        ret

With same but -Os, my only complaint is that word-sized XORs are needlessly
adding partial register update stalls:

d:      movb    v+18, %al
        xorb    v+9, %al
        xorl    v, %eax
        xorb    v+27, %al
        xorl    v+36, %eax
        xorb    v+45, %al
        xorb    v+54, %al
        xorb    v+63, %al
        ret

but overall it looks much better. Feel free to close this BZ.

Reply via email to