[linux-audio-dev] [ot] [rant] gcc, you let me down one time toomany

stefan kersten steve at k-hornz.de
Thu Jun 9 16:14:53 UTC 2005


On Thu, Jun 09, 2005 at 11:41:00PM +0900, David Cournapeau wrote:
> The other problem "is [] as efficient for vector and plain
> c array ?"

possibly maybe:

#include <vector>

int access(int* v, int i)
{ 
    return v[i];
} 

int access(std::vector<int> v, int i)
{ 
    return v[i];
}       

produces (g++ -fverbose-asm -O3 -S):

_Z6accessPii:
        pushl   %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %ecx  #  i,  i
        movl    8(%ebp), %edx   #  v,  v
        popl    %ebp
        movl    (%edx,%ecx,4), %eax     # * v
        ret

_Z6accessSt6vectorIiSaIiEEi:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx   #  v,  this
        movl    12(%ebp), %eax  #  i,  i
        popl    %ebp
        movl    (%edx), %ecx    # * this
        sall    $2, %eax
        addl    %ecx, %eax
        movl    (%eax), %eax
        ret

on intel and

_Z6accessPii:
        slwi 0,4,2       #  i
        lwzx 3,3,0       # * v,  v
        blr

_Z6accessSt6vectorIiSaIiEEi:
        lwz 0,0(3)       # * this
        slwi 5,4,2       #  i
        lwzx 3,5,0       #  this
        blr

on ppc. note that on ppc the generated code is equivalent,
while on intel

movl (%edx,%ecx,4), %eax

might translate to a shift, add, fetch anyway. but probably
it's one of the 172 addressing modes.

basically, accessing std::vector needs one indirection more;
gcc should be smart enough (only verified on ppc) to hold
the actual array pointer in one of the numerous registers
when chaining accesses.

<sk>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.linuxaudio.org/pipermail/linux-audio-dev/attachments/20050609/40b1a571/attachment.pgp>


More information about the Linux-audio-dev mailing list