1  /* { dg-do run } */
       2  /* { dg-require-effective-target sse4 } */
       3  /* { dg-options "-O2 -msse4.1" } */
       4  
       5  #ifndef CHECK_H
       6  #define CHECK_H "sse4_1-check.h"
       7  #endif
       8  
       9  #ifndef TEST
      10  #define TEST sse4_1_test
      11  #endif
      12  
      13  #include CHECK_H
      14  #include <smmintrin.h>
      15  
      16  
      17  #define msk0   0
      18  #define msk1   1
      19  #define msk2   2
      20  #define msk3   3
      21  
      22  static void
      23  TEST (void)
      24  {
      25    union
      26      {
      27        __m128i x;
      28        int i[4];
      29      } val1;
      30    int res[4], masks[4];
      31    int i;
      32  
      33    val1.i[0] = 0x04030201;
      34    val1.i[1] = 0x08070605;
      35    val1.i[2] = 0x0C0B0A09;
      36    val1.i[3] = 0x100F0E0D;
      37  
      38    res[0] = _mm_extract_epi32 (val1.x, msk0);
      39    res[1] = _mm_extract_epi32 (val1.x, msk1);
      40    res[2] = _mm_extract_epi32 (val1.x, msk2);
      41    res[3] = _mm_extract_epi32 (val1.x, msk3);
      42  
      43    masks[0] = msk0;
      44    masks[1] = msk1;
      45    masks[2] = msk2;
      46    masks[3] = msk3;
      47  
      48    for (i = 0; i < 4; i++)
      49      if (res[i] != val1.i [masks[i]])
      50        abort ();
      51  }