Update concepts branch to revision 131834
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse4_2-pcmpestri-2.c
blobbc35eb7a323d4fa9d19d718c22dea195268ace43
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse4 } */
3 /* { dg-options "-O2 -msse4.2" } */
5 #include "sse4_2-check.h"
6 #include "sse4_2-pcmpstr.h"
8 #define NUM 1024
10 #define IMM_VAL0 \
11 (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MASKED_POSITIVE_POLARITY)
12 #define IMM_VAL1 \
13 (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY \
14 | _SIDD_MOST_SIGNIFICANT)
15 #define IMM_VAL2 \
16 (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MASKED_NEGATIVE_POLARITY)
17 #define IMM_VAL3 \
18 (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED \
19 | _SIDD_MASKED_NEGATIVE_POLARITY | _SIDD_LEAST_SIGNIFICANT)
22 static void
23 sse4_2_test (void)
25 union
27 __m128i x[NUM];
28 char c[NUM *16];
29 } src1, src2;
30 int res, correct, correct_flags, l1, l2;
31 int flags, cf, zf, sf, of, af;
32 int i;
34 for (i = 0; i < NUM *16; i++)
36 src1.c[i] = rand ();
37 src2.c[i] = rand ();
40 for (i = 0; i < NUM; i++)
42 l1 = rand () % 18;
43 l2 = rand () % 18;
45 switch ((rand () % 4))
47 case 0:
48 res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
49 cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
50 zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
51 sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
52 of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
53 af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL0);
54 correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL0,
55 &correct_flags);
56 break;
58 case 1:
59 res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
60 cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
61 zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
62 sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
63 of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
64 af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL1);
65 correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL1,
66 &correct_flags);
67 break;
69 case 2:
70 res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
71 cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
72 zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
73 sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
74 of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
75 af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL2);
76 correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL2,
77 &correct_flags);
78 break;
80 default:
81 res = _mm_cmpestri (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
82 cf = _mm_cmpestrc (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
83 zf = _mm_cmpestrz (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
84 sf = _mm_cmpestrs (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
85 of = _mm_cmpestro (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
86 af = _mm_cmpestra (src1.x[i], l1, src2.x[i], l2, IMM_VAL3);
87 correct = cmp_ei (&src1.x[i], l1, &src2.x[i], l2, IMM_VAL3,
88 &correct_flags);
89 break;
92 if (correct != res)
93 abort ();
95 flags = 0;
96 if (cf)
97 flags |= CFLAG;
98 if (zf)
99 flags |= ZFLAG;
100 if (sf)
101 flags |= SFLAG;
102 if (of)
103 flags |= OFLAG;
105 if (flags != correct_flags
106 || (af && (cf || zf))
107 || (!af && !(cf || zf)))
108 abort ();