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