How can I tell the compiler to not store excessively?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear gcc-help,
I am trying to write several inline assembly functions to facilitate
use of MMX instructions and I would like for them to be concatenated
without transfer in and out of registers between calls if the data is
already loaded in a register. Example:
===========================================
#include <stdio.h>

typedef int mmx_t __attribute__ ((mode(V8QI)));

inline void padd (const char* p, char* r)
{
asm ("paddb %1, %0" : "=&y"(*(mmx_t*)r) : "y"(*(const mmx_t*)p), "0"(*(mmx_t*)r));
}


inline void psub (const char* p, char* r)
{
asm ("psubb %1, %0" : "=&y"(*(mmx_t*)r) : "y"(*(const mmx_t*)p), "0"(*(mmx_t*)r));
}


int main (void)
{
   char v1[8], v2[8];
   padd (v1, v2);
   psub (v1, v2);
   printf ("v2[3] = %d\n", v2[3]);
   return (0);
}
===========================================
Here I would like to see v1 and v2 loaded into registers before the call to
padd and not leave them until the return from psub. Now, gcc already can do
this for the read-only v1, generating the following (-O3 -march=athlon-mp):
===========================================
       pxor    %mm0, %mm0
       movl    %esp, %ebp
.LCFI1:
       subl    $24, %esp
.LCFI2:
       movq    -8(%ebp), %mm1
       andl    $-16, %esp
#APP
       paddb %mm0, %mm1
#NO_APP
       movq    %mm1, -8(%ebp)
       subl    $16, %esp
#APP
       psubb %mm0, %mm1
#NO_APP
       movq    %mm1, -8(%ebp)
       movsbl  -5(%ebp),%eax
       movl    $.LC0, (%esp)
       movl    %eax, 4(%esp)
       call    printf
===========================================
Here %mm0 is not reloaded because it remains the same value for both
padd and psub calls. However, the value from %mm1 is stored into v2
twice; the first time after padd and the second time after psub. It
is understandable that the optimizer would do this, because, for
example, several threads could be accessing v2 concurrently. Is it
possible to add some directives to the source code above to tell
the optimizer that it is ok to keep v2 in a register until something
(like the printf) actually asks for its contents through another method?

--
Mike Sharov
msharov@xxxxxxxxxxx



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux