GCC 4.1.2 generates different pentium instructions

fafa fafa@freesurf.ch
Wed Mar 21 20:20:00 GMT 2007


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



More information about the Gcc mailing list