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