1260067Skargl/* { dg-do run } */
2260067Skargl/* { dg-require-effective-target sse4 } */
3260067Skargl/* { dg-options "-O2 -msse4.1" } */
4260067Skargl
5260067Skargl#include "sse4_1-check.h"
6260067Skargl
7260067Skargl#ifdef DEBUG
8260067Skargl#include <stdio.h>
9260067Skargl#endif
10260067Skargl
11260067Skargl#include <emmintrin.h>
12260067Skargl
13260067Skarglstatic void
14260067Skargl__attribute__((noinline))
15260067Skarglcheck (__m128i x, unsigned int *v, int j)
16260067Skargl{
17260067Skargl  union
18260067Skargl    {
19260067Skargl      __m128i x;
20260067Skargl      unsigned int i[4];
21260067Skargl    } u;
22260067Skargl  unsigned int i;
23260067Skargl
24260067Skargl  u.x = x;
25260067Skargl
26260067Skargl  for (i = 0; i < sizeof (v) / sizeof (v[0]); i++)
27260067Skargl    if (i == j)
28260067Skargl      {
29260067Skargl	if (v[i] != u.i[i])
30260067Skargl	  {
31260067Skargl#ifdef DEBUG
32260067Skargl	    printf ("%i: 0x%x != 0x%x\n", i, v[i], u.i[i]);
33260067Skargl#endif
34260067Skargl	    abort ();
35260067Skargl	  }
36260067Skargl      }
37260067Skargl    else if (u.i[i] != 0)
38260067Skargl      {
39260067Skargl#ifdef DEBUG
40260067Skargl	printf ("%i: 0x%x != 0\n", i, u.i[i]);
41260067Skargl#endif
42260067Skargl	abort ();
43260067Skargl      }
44260067Skargl}
45260067Skargl
46260067Skarglstatic void
47260067Skargl__attribute__((noinline))
48260067Skargltest (unsigned int *v)
49260067Skargl{
50260067Skargl  __m128i x;
51260067Skargl
52260067Skargl  x = _mm_set_epi32 (0, 0, 0, v[0]);
53260067Skargl  check (x, v, 0);
54260067Skargl  x = _mm_set_epi32 (0, 0, v[1], 0);
55260067Skargl  check (x, v, 1);
56260067Skargl  x = _mm_set_epi32 (0, v[2], 0, 0);
57260067Skargl  check (x, v, 2);
58260067Skargl  x = _mm_set_epi32 (v[3], 0, 0, 0);
59260067Skargl  check (x, v, 3);
60260067Skargl}
61260067Skargl
62260067Skarglstatic void
63260067Skarglsse4_1_test (void)
64260067Skargl{
65260067Skargl  unsigned int v[4]
66260067Skargl    = { 0x7B5B5465, 0x73745665, 0x63746F72, 0x5D53475D };
67260067Skargl  test (v);
68260067Skargl}
69260067Skargl