http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50849

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-10-24 
11:20:47 UTC ---
Because there is no such instruction?
There is {,v}psll{w,d,q}, {,v}psrl{w,d,q} and {,v}psra{w,d} but not
{,v}psraq.
To replace the non-existing vpsraq $52, %xmm1, %xmm0, we'd have to do something
like vpcmpeq %%xmm1, %xmm1, %xmm2; vpcmpgt %%xmm1, %xmm2, %xmm2; vpsraq $52,
%xmm1, %xmm0; vpsllq $(64 - 52), %xmm2, %xmm2; vpor %xmm2, %xmm0, %xmm0
(where the first insn could be hoisted out of the loop, it is setting the
register to all ones mask).  I.e. basically
the ((long long) x >> cnt shift do as
(((unsigned long long) x) >> cnt) | ((long long) x < 0 ? -1ULL << (64 - cnt) :
0).

Reply via email to