Hi all,
I noticed that G++ 4.1.2 (on a Pentium 4) generates different instructions
for
lea 0x0(%esi),%esi
or
lea 0x0(%edi),%edi
with the same meaning but different encoding depending on the switch
"-momit-leaf-frame-pointer".
If I compile and "objdump" a short function with "-O2" I get
<_ZN18errorbintestentityptEv>:
55 push %ebp
89 e5 mov %esp,%ebp
83 ec 18 sub $0x18,%esp
89 75 fc mov %esi,0xfffffffc(%ebp)
8b 75 08 mov 0x8(%ebp),%esi
89 5d f8 mov %ebx,0xfffffff8(%ebp)
8b 5e 08 mov 0x8(%esi),%ebx
85 db test %ebx,%ebx
74 1a je cd0 <_ZN18errorbintestentityptEv+0x30>
89 d8 mov %ebx,%eax
8b 75 fc mov 0xfffffffc(%ebp),%esi
8b 5d f8 mov 0xfffffff8(%ebp),%ebx
89 ec mov %ebp,%esp
5d pop %ebp
c3 ret
8d b4 26 00 00 00 00 lea 0x0(%esi),%esi
8d bc 27 00 00 00 00 lea 0x0(%edi),%edi
c7 04 24 24 00 00 00 movl $0x24,(%esp)
e8 fc ff ff ff call cd8 <_ZN18errorbintestentityptEv+0x38>
85 c0 test %eax,%eax
89 c3 mov %eax,%ebx
74 08 je cea <_ZN18errorbintestentityptEv+0x4a>
89 04 24 mov %eax,(%esp)
e8 fc ff ff ff call ce6 <_ZN18errorbintestentityptEv+0x46>
ff 43 04 incl 0x4(%ebx)
89 d8 mov %ebx,%eax
89 5e 08 mov %ebx,0x8(%esi)
8b 5d f8 mov 0xfffffff8(%ebp),%ebx
8b 75 fc mov 0xfffffffc(%ebp),%esi
89 ec mov %ebp,%esp
5d pop %ebp
c3 ret
If I additionally set "-momit-leaf-frame-pointer" I get
<_ZN18errorbintestentityptEv>:
83 ec 0c sub $0xc,%esp
89 74 24 08 mov %esi,0x8(%esp)
8b 74 24 10 mov 0x10(%esp),%esi
89 5c 24 04 mov %ebx,0x4(%esp)
8b 5e 08 mov 0x8(%esi),%ebx
85 db test %ebx,%ebx
74 1a je d20 <_ZN18errorbintestentityptEv+0x30>
89 d8 mov %ebx,%eax
8b 74 24 08 mov 0x8(%esp),%esi
8b 5c 24 04 mov 0x4(%esp),%ebx
83 c4 0c add $0xc,%esp
c3 ret
8d b6 00 00 00 00 lea 0x0(%esi),%esi ; <--- DIFFERENT
8d bf 00 00 00 00 lea 0x0(%edi),%edi ; <--- DIFFERENT
c7 04 24 24 00 00 00 movl $0x24,(%esp)
e8 fc ff ff ff call d28 <_ZN18errorbintestentityptEv+0x38>
85 c0 test %eax,%eax
89 c3 mov %eax,%ebx
74 08 je d3a <_ZN18errorbintestentityptEv+0x4a>
89 04 24 mov %eax,(%esp)
e8 fc ff ff ff call d36 <_ZN18errorbintestentityptEv+0x46>
ff 43 04 incl 0x4(%ebx)
89 d8 mov %ebx,%eax
89 5e 08 mov %ebx,0x8(%esi)
8b 5c 24 04 mov 0x4(%esp),%ebx
8b 74 24 08 mov 0x8(%esp),%esi
83 c4 0c add $0xc,%esp
c3 ret
In the first case I get instructions with an SIB byte
8d b4 26 00 00 00 00 lea 0x0(%esi),%esi
8d bc 27 00 00 00 00 lea 0x0(%edi),%edi
in the second without SIB byte
8d b6 00 00 00 00 lea 0x0(%esi),%esi
8d bf 00 00 00 00 lea 0x0(%edi),%edi
Identical function but different length (according to my pentium manual).
Why ?
Cheers
Maett Eugster