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, l1, l2;
40  int i;
41
42  for (i = 0; i < NUM *16; i++)
43    {
44      src1.c[i] = rand ();
45      src2.c[i] = rand ();
46    }
47
48  for (i = 0; i < NUM; i++)
49    {
50      l1 = rand () % 18;
51      l2 = rand () % 18;
52
53      switch ((rand () % 4))
54	{
55	case 0:
56	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
57	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL0,
58			    NULL);
59	  break;
60
61	case 1:
62	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
63	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL1,
64			    NULL);
65	  break;
66
67	case 2:
68	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
69	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL2,
70			    NULL);
71	  break;
72
73	default:
74	  res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
75	  correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL3,
76			    NULL);
77	  break;
78        }
79
80      if (correct != res)
81	abort ();
82    }
83}
84