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
make_ptestnzc(__m128i m,__m128i v)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
TEST(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 }
97