1  /* { dg-do run } */
       2  /* { dg-options "-O3 -mpower8-vector -Wno-psabi" } */
       3  /* { dg-require-effective-target p8vector_hw } */
       4  
       5  #define NO_WARN_X86_INTRINSICS 1
       6  
       7  #ifndef CHECK_H
       8  #define CHECK_H "sse-check.h"
       9  #endif
      10  
      11  #include CHECK_H
      12  
      13  #ifndef TEST
      14  #define TEST sse_test_shufps_1
      15  #endif
      16  
      17  #define MASK 0xab
      18  
      19  #include <xmmintrin.h>
      20  
      21  float select4(const float *src, unsigned int control)
      22  {
      23      switch(control) {
      24      case 0:
      25          return src[0];
      26      case 1:
      27          return src[1];
      28      case 2:
      29          return src[2];
      30      case 3:
      31          return src[3];
      32      }
      33      return -1;
      34  }
      35  
      36  static __m128
      37  __attribute__((noinline, unused))
      38  test (__m128 s1, __m128 s2)
      39  {
      40    return _mm_shuffle_ps (s1, s2, MASK); 
      41  }
      42  
      43  static void TEST (void)
      44  {
      45    union128 u, s1, s2;
      46    float e[4] =
      47      { 0.0 };
      48  
      49    s1.x = _mm_set_ps (1.1, 1.2, 1.3, 1.4);
      50    s2.x = _mm_set_ps (2.1, 2.2, 2.3, 2.4);
      51    u.x = test (s1.x, s2.x);
      52  
      53    e[0] = select4 (s1.a, (MASK >> 0) & 0x3);
      54    e[1] = select4 (s1.a, (MASK >> 2) & 0x3);
      55    e[2] = select4 (s2.a, (MASK >> 4) & 0x3);
      56    e[3] = select4 (s2.a, (MASK >> 6) & 0x3);
      57  
      58    if (check_union128 (u, e))
      59    abort ();
      60  }