Gcc generates poor codes for this: [...@gnu-6 tmp]$ cat x.i typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); extern fpu_control_t __fpu_control; struct rtld_global_ro { fpu_control_t _dl_fpu_control; }; extern const struct rtld_global_ro _rtld_global_ro; extern void __setfpucw (fpu_control_t); int __libc_multiple_libcs __attribute__ ((visibility ("hidden"))) = 1; int __libc_argc __attribute__ ((visibility ("hidden"))); char **__libc_argv __attribute__ ((visibility ("hidden"))); extern char **__environ; extern void __init_misc (int, char **, char **); extern void __libc_global_ctors (void); extern int _dl_starting_up; #pragma weak _dl_starting_up void __attribute__ ((visibility ("hidden"))) _init (int argc, char **argv, char **envp) { __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up; if (!__libc_multiple_libcs && __fpu_control != _rtld_global_ro._dl_fpu_control) __setfpucw (__fpu_control); __libc_argc = argc; __libc_argv = argv; __environ = envp; __init_misc (argc, argv, envp); __libc_global_ctors (); } [...@gnu-6 tmp]$ /usr/gcc-4.5/bin/gcc -m32 -march=i686 -fPIC -O2 x.i -c -fomit-frame-pointer [...@gnu-6 tmp]$ objdump -dw x.o
x.o: file format elf32-i386 Disassembly of section .text: 00000000 <_init>: 0: 83 ec 2c sub $0x2c,%esp 3: 89 5c 24 1c mov %ebx,0x1c(%esp) 7: e8 fc ff ff ff call 8 <_init+0x8> c: 81 c3 02 00 00 00 add $0x2,%ebx 12: 89 74 24 20 mov %esi,0x20(%esp) 16: 8b 74 24 30 mov 0x30(%esp),%esi 1a: 89 7c 24 24 mov %edi,0x24(%esp) 1e: 8b 7c 24 34 mov 0x34(%esp),%edi 22: 89 6c 24 28 mov %ebp,0x28(%esp) 26: 8b 6c 24 38 mov 0x38(%esp),%ebp 2a: 8b 83 00 00 00 00 mov 0x0(%ebx),%eax 30: 85 c0 test %eax,%eax 32: 74 54 je 88 <_init+0x88> 34: 8b 00 mov (%eax),%eax 36: 85 c0 test %eax,%eax 38: 75 4e jne 88 <_init+0x88> 3a: c7 83 00 00 00 00 01 00 00 00 movl $0x1,0x0(%ebx) 44: 8b 83 00 00 00 00 mov 0x0(%ebx),%eax 4a: 89 b3 00 00 00 00 mov %esi,0x0(%ebx) 50: 89 bb 00 00 00 00 mov %edi,0x0(%ebx) 56: 89 28 mov %ebp,(%eax) 58: 89 6c 24 08 mov %ebp,0x8(%esp) 5c: 89 7c 24 04 mov %edi,0x4(%esp) 60: 89 34 24 mov %esi,(%esp) 63: e8 fc ff ff ff call 64 <_init+0x64> 68: e8 fc ff ff ff call 69 <_init+0x69> 6d: 8b 5c 24 1c mov 0x1c(%esp),%ebx 71: 8b 74 24 20 mov 0x20(%esp),%esi 75: 8b 7c 24 24 mov 0x24(%esp),%edi 79: 8b 6c 24 28 mov 0x28(%esp),%ebp 7d: 83 c4 2c add $0x2c,%esp 80: c3 ret 81: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi 88: 8b 83 00 00 00 00 mov 0x0(%ebx),%eax 8e: 8b 93 00 00 00 00 mov 0x0(%ebx),%edx 94: c7 83 00 00 00 00 00 00 00 00 movl $0x0,0x0(%ebx) 9e: 0f b7 00 movzwl (%eax),%eax a1: 66 39 02 cmp %ax,(%edx) a4: 74 9e je 44 <_init+0x44> a6: 0f b7 c0 movzwl %ax,%eax a9: 89 04 24 mov %eax,(%esp) ac: e8 fc ff ff ff call ad <_init+0xad> b1: eb 91 jmp 44 <_init+0x44> Why does gcc choose EBP over ECX/EDX? -- Summary: Poor register choice on x86 Product: gcc Version: 4.5.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hjl dot tools at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44958