1/* { dg-do run } */
2/* { dg-require-effective-target sse4 } */
3/* { dg-options "-O2 -msse4.2" } */
4
5#ifndef CHECK_H
6#define CHECK_H "sse4_2-check.h"
7#endif
8
9#ifndef TEST
10#define TEST sse4_2_test
11#endif
12
13#include CHECK_H
14
15#include "sse4_2-pcmpstr.h"
16
17#define NUM 1024
18
19#define IMM_VAL0 \
20  (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MASKED_POSITIVE_POLARITY)
21#define IMM_VAL1 \
22 (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY \
23  | _SIDD_MOST_SIGNIFICANT)
24#define IMM_VAL2 \
25 (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MASKED_NEGATIVE_POLARITY)
26#define IMM_VAL3 \
27  (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED \
28   | _SIDD_MASKED_NEGATIVE_POLARITY | _SIDD_LEAST_SIGNIFICANT)
29
30
31static void
32TEST (void)
33{
34  union
35    {
36      __m128i x[NUM];
37      char c[NUM *16];
38    } src1, src2;
39  int res, correct, correct_flags, l1, l2;
40  int flags, cf, zf, sf, of, af;
41  int i;
42
43  for (i = 0; i < NUM *16; i++)
44    {
45      src1.c[i] = rand ();
46      src2.c[i] = rand ();
47    }
48
49  for (i = 0; i < NUM; i++)
50    {
51      l1 = rand () % 18;
52      l2 = rand () % 18;
53
54      switch ((rand () % 4))
55	{
56	case 0:
57	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
58	  cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
59	  zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
60	  sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
61	  of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
62	  af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
63	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL0,
64			    &correct_flags);
65	  break;
66
67	case 1:
68	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
69	  cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
70	  zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
71	  sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
72	  of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
73	  af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
74	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL1,
75			    &correct_flags);
76	  break;
77
78	case 2:
79	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
80	  cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
81	  zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
82	  sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
83	  of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
84	  af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
85	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL2,
86			    &correct_flags);
87	  break;
88
89	default:
90	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
91	  cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
92	  zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
93	  sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
94	  of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
95	  af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
96	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL3,
97			    &correct_flags);
98	  break;
99	}
100
101      if (correct != res)
102	abort ();
103
104      flags = 0;
105      if (cf)
106	flags |= CFLAG;
107      if (zf)
108	flags |= ZFLAG;
109      if (sf)
110	flags |= SFLAG;
111      if (of)
112	flags |= OFLAG;
113
114      if (flags != correct_flags
115	  || (af && (cf || zf))
116	  || (!af && !(cf || zf)))
117	abort ();
118    }
119}
120