1  /* { dg-do run } */
       2  /* { dg-options "-O2 -msse2" } */
       3  /* { dg-require-effective-target sse2 } */
       4  
       5  #include "sse2-check.h"
       6  
       7  #ifdef DEBUG
       8  #include <stdio.h>
       9  #endif
      10  
      11  #include <emmintrin.h>
      12  
      13  static void
      14  __attribute__((noinline))
      15  check (__m128i x, unsigned long long *v, int j)
      16  {
      17    union
      18      {
      19        __m128i x;
      20        unsigned long long i[2];
      21      } u;
      22    unsigned int i;
      23  
      24    u.x = x;
      25    
      26    for (i = 0; i < sizeof (u) / sizeof (v[0]); i++)
      27      if (i == j)
      28        {
      29  	if (v[i] != u.i[i])
      30  	  {
      31  #ifdef DEBUG
      32  	    printf ("%i: 0x%llx != 0x%llx\n", i, v[i], u.i[i]);
      33  #endif
      34  	    abort ();
      35  	  }
      36        }
      37      else if (u.i[i] != 0)
      38        {
      39  #ifdef DEBUG
      40  	printf ("%i: 0x%llx != 0\n", i, u.i[i]);
      41  #endif
      42  	abort ();
      43        }
      44  }
      45  
      46  static void
      47  __attribute__((noinline))
      48  test (unsigned long long *v)
      49  {
      50    __m128i x;
      51  
      52    x = _mm_set_epi64x (0, v[0]);
      53    check (x, v, 0);
      54    x = _mm_set_epi64x (v[1], 0);
      55    check (x, v, 1);
      56  }
      57  
      58  static void
      59  sse2_test (void)
      60  {
      61    unsigned long long v[2]
      62      = { 0x7B5B546573745665LL, 0x63746F725D53475DLL };
      63    test (v);
      64  }