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