re PR target/70118 (UBSan claims misaligned access in SSE instrinsics)
authorAllan Sandfeld Jensen <allan.jensen@qt.io>
Sun, 11 Dec 2016 16:27:08 +0000 (22:27 +0600)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 11 Dec 2016 16:27:08 +0000 (17:27 +0100)
PR target/70118
* config/i386/mmintrin.h (__m64_u): New type
* config/i386/emmintrin.h (_mm_loadl_epi64, _mm_storel_epi64):
Make the allowed unaligned memory access explicit.

From-SVN: r243527

gcc/ChangeLog
gcc/config/i386/emmintrin.h
gcc/config/i386/mmintrin.h

index b384a8f..a990b2d 100644 (file)
@@ -1,3 +1,10 @@
+2016-12-10  Allan Sandfeld Jensen  <allan.jensen@qt.io>
+
+       PR target/70118
+       * config/i386/mmintrin.h (__m64_u): New type
+       * config/i386/emmintrin.h (_mm_loadl_epi64, _mm_storel_epi64):
+       Make the allowed unaligned memory access explicit.
+
 2016-12-10  Krister Walfridsson  <krister.walfridsson@gmail.com>
 
        * config.gcc (i386-*-netbsd*): Make i486 the default arch on NetBSD.
index b299cbc..d5aa46a 100644 (file)
@@ -703,9 +703,9 @@ _mm_loadu_si128 (__m128i_u const *__P)
 }
 
 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_loadl_epi64 (__m128i const *__P)
+_mm_loadl_epi64 (__m128i_u const *__P)
 {
-  return _mm_set_epi64 ((__m64)0LL, *(__m64 *)__P);
+  return _mm_set_epi64 ((__m64)0LL, *(__m64_u *)__P);
 }
 
 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
@@ -721,9 +721,9 @@ _mm_storeu_si128 (__m128i_u *__P, __m128i __B)
 }
 
 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_storel_epi64 (__m128i *__P, __m128i __B)
+_mm_storel_epi64 (__m128i_u *__P, __m128i __B)
 {
-  *(long long *)__P = ((__v2di)__B)[0];
+  *(__m64_u *)__P = (__m64) ((__v2di)__B)[0];
 }
 
 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
index d5a1f00..2bd3bd1 100644 (file)
@@ -37,6 +37,9 @@
    vector types, and their scalar components.  */
 typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
 
+/* Unaligned version of the same type  */
+typedef int __m64_u __attribute__ ((__vector_size__ (8), __may_alias__, __aligned__ (1)));
+
 /* Internal data types for implementing the intrinsics.  */
 typedef int __v2si __attribute__ ((__vector_size__ (8)));
 typedef short __v4hi __attribute__ ((__vector_size__ (8)));