[PATCH] [x86] Don't use builtins for SIMD shifts
Marc Glisse
marc.glisse@inria.fr
Sat Dec 10 18:02:00 GMT 2016
On Sat, 10 Dec 2016, Marc Glisse wrote:
> On Sat, 10 Dec 2016, Allan Sandfeld Jensen wrote:
>
>> Replaces the definitions of the shift intrinsics with GCC extension syntax
>> to
>> allow GCC to reason about what the instructions does. Tests are added to
>> ensure the intrinsics still produce the right instructions, and that a few
>> basic optimizations now work.
>
> I don't think we can do it in such a straightforward way. Those intrinsics
> are well defined for any shift argument, while operator<< and operator>> are
> considered undefined for many input values. I believe you may need to use an
> unsigned type for the lhs of left shifts, and write a << (b & 31) to match
> the semantics for the rhs (I haven't checked Intel's doc). Which might
> require adding a few patterns in sse.md to avoid generating code for that
> AND.
Oups, apparently I got that wrong, got confused with the scalar case. Left
shift by more than precision is well defined for vectors, but it gives 0,
it doesn't take the shift count modulo the precision. Which is even harder
to explain to gcc (maybe ((unsigned)b<=31)?a<<b:0...). Yes, the way we
model operations in gcc is often inconvenient.
There was a similar issue for LLVM (https://reviews.llvm.org/D3353).
> (also, the patch can't go in until next stage 1, around March or April, but
> that doesn't prevent from discussing it)
--
Marc Glisse
More information about the Gcc-patches
mailing list