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

Reply via email to