OSDN Git Service

PR rtl-optimization/323
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse4_1-ptest-2.c
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
17 static int
18 make_ptestnzc (__m128i m, __m128i v)
19 {
20   union
21     {
22       __m128i x;
23       unsigned char c[16];
24     } val, mask;
25   int i, z, c;
26
27   mask.x = m;
28   val.x = v;
29
30   z = c = 1;
31   for (i = 0; i < 16; i++)
32     {
33       if ((mask.c[i] & val.c[i]))
34         z = 0;
35       if ((~mask.c[i] & val.c[i]))
36         c = 0;
37     }
38
39   return (z == 0 && c == 0) ? 1 : 0;
40 }
41
42 static void
43 TEST (void)
44 {
45   union
46     {
47       __m128i x;
48       unsigned int i[4];
49     } val[4];
50   int i, j, l;
51   int res[32];
52
53   val[0].i[0] = 0x11111111;
54   val[0].i[1] = 0x00000000;
55   val[0].i[2] = 0x00000000;
56   val[0].i[3] = 0x11111111;
57     
58   val[1].i[0] = 0x00000000;
59   val[1].i[1] = 0x11111111;
60   val[1].i[2] = 0x11111111;
61   val[1].i[3] = 0x00000000;
62
63   val[2].i[0] = 0;
64   val[2].i[1] = 0;
65   val[2].i[2] = 0;
66   val[2].i[3] = 0;
67
68   val[3].i[0] = 0xffffffff;
69   val[3].i[1] = 0xffffffff;
70   val[3].i[2] = 0xffffffff;
71   val[3].i[3] = 0xffffffff;
72
73   l = 0;
74   for(i = 0; i < 4; i++)
75     for(j = 0; j < 4; j++)
76       {
77         res[l++] = _mm_testnzc_si128 (val[j].x, val[i].x);
78         res[l++] = _mm_testnzc_si128 (val[j].x, val[i].x);
79       }
80
81   l = 0;
82   for(i = 0; i < 4; i++)
83     for(j = 0; j < 4; j++)
84       {
85         if (res[l++] != make_ptestnzc (val[j].x, val[i].x))
86           abort ();
87         if (res[l++] != make_ptestnzc (val[j].x, val[i].x))
88           abort ();
89       }
90
91   if (res[2] != _mm_testnzc_si128 (val[1].x, val[0].x))
92     abort ();
93
94   if (res[3] != _mm_testnzc_si128 (val[1].x, val[0].x))
95     abort ();
96 }