extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_loadu_si32 (void const *__P)
{
- return _mm_set_epi32 (*(int *)__P, (int)0, (int)0, (int)0);
+ return _mm_set_epi32 (0, 0, 0, (*(__m32_u *)__P)[0]);
}
extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_loadu_si16 (void const *__P)
{
- return _mm_set_epi16 (*(short *)__P, (short)0, (short)0, (short)0,
- (short)0, (short)0, (short)0, (short)0);
+ return _mm_set_epi16 (0, 0, 0, 0, 0, 0, 0, (*(__m16_u *)__P)[0]);
}
extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
--- /dev/null
+/* PR target/99754 */
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+/* { dg-require-effective-target sse2 } */
+
+#include "sse2-check.h"
+#include <emmintrin.h>
+
+static void
+sse2_test (void)
+{
+ union { unsigned char buf[32]; long long ll; } u;
+ u.buf[1] = 0xfe;
+ u.buf[2] = 0xca;
+ u.buf[17] = 0xaa;
+ u.buf[18] = 0x55;
+ _mm_storeu_si16 (&u.buf[17], _mm_loadu_si16 (&u.buf[1]));
+ if (u.buf[17] != 0xfe || u.buf[18] != 0xca)
+ abort ();
+}
--- /dev/null
+/* PR target/99754 */
+/* { dg-do run } */
+/* { dg-options "-O2 -msse2" } */
+/* { dg-require-effective-target sse2 } */
+
+#include "sse2-check.h"
+#include <emmintrin.h>
+
+static void
+sse2_test (void)
+{
+ union { unsigned char buf[32]; long long ll; } u;
+ u.buf[1] = 0xbe;
+ u.buf[2] = 0xba;
+ u.buf[3] = 0xfe;
+ u.buf[4] = 0xca;
+ u.buf[17] = 0xaa;
+ u.buf[18] = 0x55;
+ u.buf[19] = 0xaa;
+ u.buf[20] = 0x55;
+ _mm_storeu_si32 (&u.buf[17], _mm_loadu_si32 (&u.buf[1]));
+ if (u.buf[17] != 0xbe || u.buf[18] != 0xba || u.buf[19] != 0xfe || u.buf[20] != 0xca)
+ abort ();
+}