1168404Spjd/* { dg-do run { target { ! { ia32 } } } } */
2168404Spjd/* { dg-require-effective-target sse4 } */
3168404Spjd/* { dg-options "-O2 -msse4.1" } */
4168404Spjd
5168404Spjd#ifndef CHECK_H
6168404Spjd#define CHECK_H "sse4_1-check.h"
7168404Spjd#endif
8168404Spjd
9168404Spjd#ifndef TEST
10168404Spjd#define TEST sse4_1_test
11168404Spjd#endif
12168404Spjd
13168404Spjd#include CHECK_H
14168404Spjd
15168404Spjd#include <smmintrin.h>
16168404Spjd
17168404Spjd#define msk0   0
18168404Spjd#define msk1   1
19168404Spjd
20168404Spjdstatic void
21168404Spjd__attribute__((noinline))
22168404SpjdTEST (void)
23219089Spjd{
24229578Smm  union
25249643Smm    {
26248369Smm      __m128i x;
27168404Spjd      long long ll[2];
28168404Spjd    } val1;
29168404Spjd  long long res[2];
30168404Spjd  int masks[2];
31168404Spjd  int i;
32168404Spjd
33168404Spjd  val1.ll[0] = 0x0807060504030201LL;
34168404Spjd  val1.ll[1] = 0x100F0E0D0C0B0A09LL;
35168404Spjd
36168404Spjd  res[0] = _mm_extract_epi64 (val1.x, msk0);
37168404Spjd  res[1] = _mm_extract_epi64 (val1.x, msk1);
38168404Spjd
39168404Spjd  masks[0] = msk0;
40168404Spjd  masks[1] = msk1;
41168404Spjd
42168404Spjd  for (i = 0; i < 2; i++)
43185029Spjd    if (res[i] != val1.ll [masks[i]])
44213197Smm      abort ();
45219089Spjd}
46251419Ssmh