OSDN Git Service

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