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 15#include <smmintrin.h> 16 17int masks[4]; 18 19#define msk0 0x00 20#define msk1 0x01 21#define msk2 0x02 22#define msk3 0x03 23 24static void 25TEST (void) 26{ 27 union 28 { 29 __m128 x; 30 float f[4]; 31 } val1, val2; 32 union 33 { 34 int i; 35 float f; 36 } res[4]; 37 float resm[4]; 38 int i; 39 40 val1.f[0] = 10.; 41 val1.f[1] = 2.; 42 val1.f[2] = 3.; 43 val1.f[3] = 40.; 44 45 val2.f[0] = 77.; 46 val2.f[1] = 21.; 47 val2.f[2] = 34.; 48 val2.f[3] = 49.; 49 50 res[0].i = _mm_extract_ps (val1.x, msk0); 51 res[1].i = _mm_extract_ps (val1.x, msk1); 52 res[2].i = _mm_extract_ps (val1.x, msk2); 53 res[3].i = _mm_extract_ps (val1.x, msk3); 54 55 _MM_EXTRACT_FLOAT (resm[0], val2.x, msk0); 56 _MM_EXTRACT_FLOAT (resm[1], val2.x, msk1); 57 _MM_EXTRACT_FLOAT (resm[2], val2.x, msk2); 58 _MM_EXTRACT_FLOAT (resm[3], val2.x, msk3); 59 60 masks[0] = msk0; 61 masks[1] = msk1; 62 masks[2] = msk2; 63 masks[3] = msk3; 64 65 for( i=0; i < 4; i++ ) 66 { 67 if (res[i].f != val1.f[masks[i]]) 68 abort (); 69 if (resm[i] != val2.f[masks[i]]) 70 abort (); 71 } 72} 73