$ cat b.cpp unsigned char byte0( unsigned long long x ) { return x; } unsigned char byte1( unsigned long long x ) { return ( x >> 8 ); } unsigned char byte6( unsigned long long x ) { return ( x >> 48 ); } unsigned char byte7( unsigned long long x ) { return ( x >> 56 ); }
$ /opt/gcc43/bin/g++ b.cpp -fomit-frame-pointer -m32 -O2 -c && objdump -dC b.o 00000000 <byte0(unsigned long long)>: 0: 0f b6 44 24 04 movzbl 0x4(%esp),%eax 5: c3 ret 00000010 <byte1(unsigned long long)>: 10: 8b 44 24 04 mov 0x4(%esp),%eax \ 14: 8b 54 24 08 mov 0x8(%esp),%edx = why not movzbl 5(esp)? 18: 0f ac d0 08 shrd $0x8,%edx,%eax / 1c: c3 ret 00000020 <byte6(unsigned long long)>: 20: 0f b7 44 24 0a movzwl 0xa(%esp),%eax 25: c3 ret 00000030 <byte7(unsigned long long)>: 30: 0f b6 44 24 0b movzbl 0xb(%esp),%eax 35: c3 ret -- Summary: unoptimal byte extraction. Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: pluto at agmk dot net GCC target triplet: ix86-gnu-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34072