OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse4_1-ptest-1.c
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.1" } */
4
5 #include "sse4_1-check.h"
6
7 #include <smmintrin.h>
8
9 static int
10 make_ptestz (__m128i m, __m128i v)
11 {
12   union
13     {
14       __m128i x;
15       unsigned char c[16];
16     } val, mask;
17   int i, z;
18
19   mask.x = m;
20   val.x = v;
21
22   z = 1;
23   for (i = 0; i < 16; i++)
24     if ((mask.c[i] & val.c[i]))
25       {
26         z = 0;
27         break;
28       }
29   return z;
30 }
31
32 static int
33 make_ptestc (__m128i m, __m128i v)
34 {
35   union
36     {
37       __m128i x;
38       unsigned char c[16];
39     } val, mask;
40   int i, c;
41
42   mask.x = m;
43   val.x = v;
44
45   c = 1;
46   for (i = 0; i < 16; i++)
47     if ((val.c[i] & ~mask.c[i]))
48       {
49         c = 0;
50         break;
51       }
52   return c;
53 }
54
55 static void
56 sse4_1_test (void)
57 {
58   union
59     {
60       __m128i x;
61       unsigned int i[4];
62     } val[4];
63   int i, j, l;
64   int res[32];
65
66   val[0].i[0] = 0x11111111;
67   val[0].i[1] = 0x00000000;
68   val[0].i[2] = 0x00000000;
69   val[0].i[3] = 0x11111111;
70     
71   val[1].i[0] = 0x00000000;
72   val[1].i[1] = 0x11111111;
73   val[1].i[2] = 0x11111111;
74   val[1].i[3] = 0x00000000;
75
76   val[2].i[0] = 0;
77   val[2].i[1] = 0;
78   val[2].i[2] = 0;
79   val[2].i[3] = 0;
80
81   val[3].i[0] = 0xffffffff;
82   val[3].i[1] = 0xffffffff;
83   val[3].i[2] = 0xffffffff;
84   val[3].i[3] = 0xffffffff;
85
86   l = 0;
87   for(i = 0; i < 4; i++)
88     for(j = 0; j < 4; j++)
89       {
90         res[l++] = _mm_testz_si128 (val[j].x, val[i].x);
91         res[l++] = _mm_testc_si128 (val[j].x, val[i].x);
92       }
93
94   l = 0;
95   for(i = 0; i < 4; i++)
96     for(j = 0; j < 4; j++)
97       {
98         if (res[l++] != make_ptestz (val[j].x, val[i].x))
99           abort ();
100         if (res[l++] != make_ptestc (val[j].x, val[i].x))
101           abort ();
102       }
103
104   if (res[2] != _mm_testz_si128 (val[1].x, val[0].x))
105     abort ();
106
107   if (res[3] != _mm_testc_si128 (val[1].x, val[0].x))
108     abort ();
109 }