Skip to content

LLVM doesn't know that psrad xmm,xmm ignores the high part of rhs #142221

Closed as not planned
@Alcaro

Description

@Alcaro
#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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    backend:X86questionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions