------- 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