[PATCH] rs6000: Fix typo in mmintrin.h

Bill Schmidt wschmidt@linux.ibm.com
Thu Mar 21 22:00:00 GMT 2019


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  <wschmidt@linux.ibm.com>

	* config/rs6000/mmintrin.h (_mm_sub_pi32): Fix typo.

[gcc/testsuite]

2019-03-21  Bill Schmidt  <wschmidt@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 ();
 }



More information about the Gcc-patches mailing list