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