From 865fc9684661c46589a30c6021cf44de560940f3 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Sun, 11 Dec 2016 22:27:08 +0600 Subject: [PATCH] re PR target/70118 (UBSan claims misaligned access in SSE instrinsics) 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 | 7 +++++++ gcc/config/i386/emmintrin.h | 8 ++++---- gcc/config/i386/mmintrin.h | 3 +++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b384a8f..a990b2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-12-10 Allan Sandfeld Jensen + + 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 * config.gcc (i386-*-netbsd*): Make i486 the default arch on NetBSD. diff --git a/gcc/config/i386/emmintrin.h b/gcc/config/i386/emmintrin.h index b299cbc..d5aa46a 100644 --- a/gcc/config/i386/emmintrin.h +++ b/gcc/config/i386/emmintrin.h @@ -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__)) diff --git a/gcc/config/i386/mmintrin.h b/gcc/config/i386/mmintrin.h index d5a1f00..2bd3bd1 100644 --- a/gcc/config/i386/mmintrin.h +++ b/gcc/config/i386/mmintrin.h @@ -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))); -- 2.7.4