https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81022

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|                            |x86_64-*-*, i?86-*-*
                 CC|                            |kyukhin at gcc dot gnu.org
          Component|c++                         |target

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
You are violating strict aliasing rules when writing with an lvalue of type
double to storage of type 'long long int'.

If the intrinsics documentation suggest that those are fine then our
implementation is buggy:

/* Stores the lower DPFP value.  */
extern __inline void __attribute__((__gnu_inline__, __always_inline__,
__artificial__))
_mm_store_sd (double *__P, __m128d __A)
{
  *__P = ((__v2df)__A)[0];
}

the other intrinsic is fine:

extern __inline void __attribute__((__gnu_inline__, __always_inline__,
__artificial__))
_mm_storel_epi64 (__m128i_u *__P, __m128i __B)
{
  *(__m64_u *)__P = (__m64) ((__v2di)__B)[0];
}

as __m64_u is declared with may_alias:

typedef int __m64_u __attribute__ ((__vector_size__ (8), __may_alias__,
__aligned__ (1)));


So I'd say INVALID but x86 people may want to double-check the official
intrinsic documentation.

Reply via email to