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
17static int
18make_ptestz (__m128i m, __m128i v)
19{
20  union
21    {
22      __m128i x;
23      unsigned char c[16];
24    } val, mask;
25  int i, z;
26
27  mask.x = m;
28  val.x = v;
29
30  z = 1;
31  for (i = 0; i < 16; i++)
32    if ((mask.c[i] & val.c[i]))
33      {
34	z = 0;
35	break;
36      }
37  return z;
38}
39
40static int
41make_ptestc (__m128i m, __m128i v)
42{
43  union
44    {
45      __m128i x;
46      unsigned char c[16];
47    } val, mask;
48  int i, c;
49
50  mask.x = m;
51  val.x = v;
52
53  c = 1;
54  for (i = 0; i < 16; i++)
55    if ((val.c[i] & ~mask.c[i]))
56      {
57	c = 0;
58	break;
59      }
60  return c;
61}
62
63static void
64TEST (void)
65{
66  union
67    {
68      __m128i x;
69      unsigned int i[4];
70    } val[4];
71  int i, j, l;
72  int res[32];
73
74  val[0].i[0] = 0x11111111;
75  val[0].i[1] = 0x00000000;
76  val[0].i[2] = 0x00000000;
77  val[0].i[3] = 0x11111111;
78
79  val[1].i[0] = 0x00000000;
80  val[1].i[1] = 0x11111111;
81  val[1].i[2] = 0x11111111;
82  val[1].i[3] = 0x00000000;
83
84  val[2].i[0] = 0;
85  val[2].i[1] = 0;
86  val[2].i[2] = 0;
87  val[2].i[3] = 0;
88
89  val[3].i[0] = 0xffffffff;
90  val[3].i[1] = 0xffffffff;
91  val[3].i[2] = 0xffffffff;
92  val[3].i[3] = 0xffffffff;
93
94  l = 0;
95  for(i = 0; i < 4; i++)
96    for(j = 0; j < 4; j++)
97      {
98	res[l++] = _mm_testz_si128 (val[j].x, val[i].x);
99	res[l++] = _mm_testc_si128 (val[j].x, val[i].x);
100      }
101
102  l = 0;
103  for(i = 0; i < 4; i++)
104    for(j = 0; j < 4; j++)
105      {
106	if (res[l++] != make_ptestz (val[j].x, val[i].x))
107	  abort ();
108	if (res[l++] != make_ptestc (val[j].x, val[i].x))
109	  abort ();
110      }
111
112  if (res[2] != _mm_testz_si128 (val[1].x, val[0].x))
113    abort ();
114
115  if (res[3] != _mm_testc_si128 (val[1].x, val[0].x))
116    abort ();
117}
118