Closed as not planned
Description
#include <immintrin.h>
__m128i a(__m128i __ix, __m128i __iy) {
return _mm_sra_epi32(__ix, _mm_unpacklo_epi32(__iy, _mm_setzero_si128()));
}
__m128i b(__m128i __ix, __m128i __iy) {
return _mm_sra_epi32(__ix, __iy);
}
__m128i c(__m128i __ix, __m128i __iy) {
return _mm_sra_epi32(__ix, _mm_unpackhi_epi32(__iy, _mm_setzero_si128()));
}
__m128i d(__m128i __ix, __m128i __iy) {
return _mm_sra_epi32(__ix, _mm_unpackhi_epi32(__iy, __iy));
}
Expected:
a(long long vector[2], long long vector[2]):
psrad xmm0, xmm1
ret
b(long long vector[2], long long vector[2]):
psrad xmm0, xmm1
ret
c(long long vector[2], long long vector[2]):
pshufd xmm1, xmm1, 250
psrad xmm0, xmm1
ret
d(long long vector[2], long long vector[2]):
pshufd xmm1, xmm1, 250
psrad xmm0, xmm1
ret
Actual:
a(long long vector[2], long long vector[2]):
xorps xmm2, xmm2
movss xmm2, xmm1
psrad xmm0, xmm2
ret
b(long long vector[2], long long vector[2]):
psrad xmm0, xmm1
ret
c(long long vector[2], long long vector[2]):
pxor xmm2, xmm2
punpckhdq xmm1, xmm2
psrad xmm0, xmm1
ret
d(long long vector[2], long long vector[2]):
pshufd xmm1, xmm1, 250
psrad xmm0, xmm1
ret
https://godbolt.org/z/1j5nWoW6q
Originally found in libstdc++ std::experimental::simd https://godbolt.org/z/d5Gdnsqch (they should probably add corresponding fixes to their header)
(See also #141475, though that one's about the shift instructions' lhs/ret, not rhs)