------- Additional Comments From vda at port dot imtp dot ilyichevsk dot odessa 
dot ua  2005-04-24 13:26 -------
I don't think that bug description is correct.
I believe similar observation will be valid for byte extraction
from u32 and u16, and for u16-from-u32, etc.

Update for latest gcc.
This is what 4.0.0 produces from the testcase:

# gcc -O2 -fomit-frame-pointer -S helper.c
# cat helper.s
 [I removed non-essential stuff]
a:
        movl    v+8, %eax
        shrl    $8, %eax
        xorb    v, %al
        xorb    v+18, %al
        xorb    v+27, %al
        xorb    v+36, %al
        movl    v+40, %edx
        movl    v+44, %ecx
        movl    %ecx, %edx
        xorl    %ecx, %ecx
        shrl    $8, %edx
        xorl    %edx, %eax
        xorb    v+54, %al
        xorb    v+63, %al
        movzbl  %al, %eax
        ret
b:
        movl    v+8, %eax
        movl    v+12, %edx
        shrdl   $8, %edx, %eax
        shrl    $8, %edx
        xorb    v, %al
        movl    v+16, %edx
        movl    v+20, %ecx
        shrdl   $16, %ecx, %edx
        shrl    $16, %ecx
        xorl    %edx, %eax
        movl    v+24, %edx
        movl    v+28, %ecx
        shrdl   $24, %ecx, %edx
        shrl    $24, %ecx
        xorl    %edx, %eax
        xorb    v+36, %al
        movl    v+40, %edx
        movl    v+44, %ecx
        movl    %ecx, %edx
        xorl    %ecx, %ecx
        shrl    $8, %edx
        xorl    %edx, %eax
        xorb    v+54, %al
        xorb    v+63, %al
        movzbl  %al, %eax
        ret
c:
        movb    v+9, %al
        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
        movzbl  %al, %eax
        ret
d:
        movl    v+8, %eax
        movl    v+12, %edx
        shrdl   $8, %edx, %eax
        shrl    $8, %edx
        xorb    v, %al
        movl    v+16, %edx
        movl    v+20, %ecx
        shrdl   $16, %ecx, %edx
        shrl    $16, %ecx
        xorl    %edx, %eax
        movl    v+24, %edx
        movl    v+28, %ecx
        shrdl   $24, %ecx, %edx
        shrl    $24, %ecx
        xorl    %edx, %eax
        xorb    v+36, %al
        movl    v+40, %edx
        movl    v+44, %ecx
        movl    %ecx, %edx
        xorl    %ecx, %ecx
        shrl    $8, %edx
        xorl    %edx, %eax
        xorb    v+54, %al
        xorb    v+63, %al
        movzbl  %al, %eax
        ret

As you can see, a,b and d results are far from optimal,
while c is almost perfect.

Note that people typically use d, i.e. this:
#define D7(v) (((v) >> 56))
#define D6(v) (((v) >> 48) & 0xff)
#define D5(v) (((v) >> 40) & 0xff)
#define D4(v) (((v) >> 32) & 0xff)
#define D3(v) (((v) >> 24) & 0xff)
#define D2(v) (((v) >> 16) & 0xff)
#define D1(v) (((v) >>  8) & 0xff)
#define D0(v) ((v) & 0xff)


-- 


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

Reply via email to