Re: Specifying additional information of pointers

2011-05-18 Thread Ian Lance Taylor
Piotr Wyderski  writes:

> I'm implementing in C++ a semi-portable portable bit vector based on
> SIMD extensions
> available on the platform. GCC automatically vectorizes it to a large
> extent, but much
> better code could have been generated it there were a way to annotate
> the source code somehow.
> Namely, in many places I know that a pointer points to an 8-bytes
> aligned array of std::uint64_t
> (hence the compiler should use movdqu), but the number of elements is
> divisible by 2, so no fixup
> code needs to be generated and only the SSE2-based variant should be emitted.
>
> Is there a way to tell the compiler about it via some attribute or
> pragma? Of course a full-blown
> platform-specific variant of the source code is possible, but as the
> vectorizer does a good job
> (relatively to its limited knowledge), I would prefer to help it
> instead of reimplementing the vector.

If you are asking for help using gcc, then the right mailing list is
gcc-h...@gcc.gnu.org.  The mailing list gcc@gcc.gnu.org is about the
development of gcc itself.  If you just want to use gcc, then please
take any followups to gcc-help.  Thanks.

You can use __attribute__ ((aligned)) to set the alignment.  However, as
far as I know there is no way to indicate anything about the number of
elements.  I assume from your description that you are passing in the
number of elements; perhaps you should pass in half that number and
multiply it by 2 in your code.  That may give gcc enough information to
compile your code as you prefer.

Ian


Specifying additional information of pointers

2011-05-18 Thread Piotr Wyderski
Hello,

I'm implementing in C++ a semi-portable portable bit vector based on
SIMD extensions
available on the platform. GCC automatically vectorizes it to a large
extent, but much
better code could have been generated it there were a way to annotate
the source code somehow.
Namely, in many places I know that a pointer points to an 8-bytes
aligned array of std::uint64_t
(hence the compiler should use movdqu), but the number of elements is
divisible by 2, so no fixup
code needs to be generated and only the SSE2-based variant should be emitted.

Is there a way to tell the compiler about it via some attribute or
pragma? Of course a full-blown
platform-specific variant of the source code is possible, but as the
vectorizer does a good job
(relatively to its limited knowledge), I would prefer to help it
instead of reimplementing the vector.

Best regards
Piotr Wyderski