rs6000: Fix _mm_movemask_pi8 emulation for 32 bit
authorSegher Boessenkool <segher@kernel.crashing.org>
Sat, 23 Mar 2019 16:15:48 +0000 (17:15 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Sat, 23 Mar 2019 16:15:48 +0000 (17:15 +0100)
* config/rs6000/xmmintrin.h (_mm_movemask_pi8): Implement for 32-bit
big endian.

From-SVN: r269891

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

index 14977c95187c5bfa5b65ab6d87ec91f05f1ce97d..6b9f1c4a2b6206d3854a46130dc0ca90243fc185 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-23  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/xmmintrin.h (_mm_movemask_pi8): Implement for 32-bit
+       big endian.
+
 2019-03-22  Andrew Pinski  <apinski@marvell.com>
 
        * config/aarch64/aarch64.md (zero_extendsidi2_aarch64): Fix type
index 71e4bd4e8cf2947402880baa3908bd931038fa6d..f9474b6322984675bd564ef1e30825305ad7956f 100644 (file)
@@ -1586,9 +1586,15 @@ _mm_movemask_pi8 (__m64 __A)
 #endif
   return __builtin_bpermd (p, __A);
 #else
+#ifdef __LITTLE_ENDIAN__
   unsigned int mask = 0x20283038UL;
   unsigned int r1 = __builtin_bpermd (mask, __A) & 0xf;
   unsigned int r2 = __builtin_bpermd (mask, __A >> 32) & 0xf;
+#else
+  unsigned int mask = 0x38302820UL;
+  unsigned int r1 = __builtin_bpermd (mask, __A >> 32) & 0xf;
+  unsigned int r2 = __builtin_bpermd (mask, __A) & 0xf;
+#endif
   return (r2 << 4) | r1;
 #endif
 }