Hi, It was recently pointed out that there's a pasto in mmintrin.h for the _mm_sub_pi32 function, so that it performs an addition rather than a subtraction. This won't do.
This patch corrects the problem, and adds a test case to verify it. Installed and tested on powerpc64le-unknown-linux-gnu with no regressions. Is this ok for trunk, and backport to GCC 8? Thanks! Bill [gcc] 2019-03-21 Bill Schmidt <wschm...@linux.ibm.com> * config/rs6000/mmintrin.h (_mm_sub_pi32): Fix typo. [gcc/testsuite] 2019-03-21 Bill Schmidt <wschm...@linux.ibm.com> * gcc.target/powerpc/mmx-psubd-2.c: Test _m_psubd. Index: gcc/config/rs6000/mmintrin.h =================================================================== --- gcc/config/rs6000/mmintrin.h (revision 269843) +++ gcc/config/rs6000/mmintrin.h (working copy) @@ -597,7 +597,7 @@ _mm_sub_pi32 (__m64 __m1, __m64 __m2) extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _m_psubd (__m64 __m1, __m64 __m2) { - return _mm_add_pi32 (__m1, __m2); + return _mm_sub_pi32 (__m1, __m2); } extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) Index: gcc/testsuite/gcc.target/powerpc/mmx-psubd-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/mmx-psubd-2.c (revision 269843) +++ gcc/testsuite/gcc.target/powerpc/mmx-psubd-2.c (working copy) @@ -22,20 +22,28 @@ test (__m64 s1, __m64 s2) return _mm_sub_pi32 (s1, s2); } +static __m64 +__attribute__((noinline, unused)) +test_alias (__m64 s1, __m64 s2) +{ + return _m_psubd (s1, s2); +} + static void TEST (void) { __m64_union u, s1, s2; - __m64_union e; + __m64_union e, v; int i; s1.as_m64 = _mm_setr_pi32 (30, 90); s2.as_m64 = _mm_setr_pi32 (76, -100); u.as_m64 = test (s1.as_m64, s2.as_m64); - + v.as_m64 = test_alias (s1.as_m64, s2.as_m64); + for (i = 0; i < 2; i++) e.as_int[i] = s1.as_int[i] - s2.as_int[i]; - if (u.as_m64 != e.as_m64) + if (u.as_m64 != e.as_m64 || u.as_m64 != v.as_m64) abort (); }