[rs6000] Fix _mm_extract_pi16 for big-endian
authorPaul A. Clarke <pc@us.ibm.com>
Fri, 26 Oct 2018 15:01:22 +0000 (15:01 +0000)
committerPaul Clarke <pc@gcc.gnu.org>
Fri, 26 Oct 2018 15:01:22 +0000 (15:01 +0000)
For compatibility implementation of x86 vector intrinsic, _mm_extract_pi16,
adjust shift value for big-endian mode.

gcc/ChangeLog:

2018-10-25  Paul A. Clarke  <pc@us.ibm.com>

* config/rs6000/xmmintrin.h (_mm_extract_pi16): Fix for big-endian.

From-SVN: r265531

gcc/ChangeLog
gcc/config/rs6000/xmmintrin.h

index 5307ec7353125ada4b7dc586cc43bcf7fd8aa954..3db373cc1d08da12dd5a3dcfb05718b8ccbb03a2 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-26  Paul A. Clarke  <pc@us.ibm.com>
+
+       * config/rs6000/xmmintrin.h (_mm_extract_pi16): Fix for big-endian.
+
 2018-10-26  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-slp.c (vect_mark_slp_stmts): Add visited hash_set
index 528937552c6bc7e2f6ffcc214fce0d414e59b892..86c41a82a31db47d942832bd6ac052745ba4361f 100644 (file)
@@ -1386,9 +1386,12 @@ _mm_load_ps1 (float const *__P)
 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _mm_extract_pi16 (__m64 const __A, int const __N)
 {
-  const int shiftr = (__N & 3) * 16;
+  unsigned int shiftr = __N & 3;
+#ifdef __BIG_ENDIAN__
+  shiftr = 3 - shiftr;
+#endif
 
-  return ((__A >> shiftr) & 0xffff);
+  return ((__A >> (shiftr * 16)) & 0xffff);
 }
 
 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))