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).