OSDN Git Service

PR middle-end/29274
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / sse4_2-pcmpistri-2.c
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_MOST_SIGNIFICANT)
29
30
31 static void
32 TEST (void)
33 {
34   union
35     {
36       __m128i x[NUM];
37       char c[NUM *16];
38     } src1, src2;
39   int res, correct, correct_flags;
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       switch ((rand () % 4))
52         {
53         case 0:
54           res = _mm_cmpistri (src1.x[i], src2.x[i], IMM_VAL0);
55           cf = _mm_cmpistrc (src1.x[i], src2.x[i], IMM_VAL0);
56           zf = _mm_cmpistrz (src1.x[i], src2.x[i], IMM_VAL0);
57           sf = _mm_cmpistrs (src1.x[i], src2.x[i], IMM_VAL0);
58           of = _mm_cmpistro (src1.x[i], src2.x[i], IMM_VAL0);
59           af = _mm_cmpistra (src1.x[i], src2.x[i], IMM_VAL0);
60           correct = cmp_ii (&src1.x[i], &src2.x[i], IMM_VAL0,
61                             &correct_flags);
62           break;
63
64         case 1:
65           res = _mm_cmpistri (src1.x[i], src2.x[i], IMM_VAL1);
66           cf = _mm_cmpistrc (src1.x[i], src2.x[i], IMM_VAL1);
67           zf = _mm_cmpistrz (src1.x[i], src2.x[i], IMM_VAL1);
68           sf = _mm_cmpistrs (src1.x[i], src2.x[i], IMM_VAL1);
69           of = _mm_cmpistro (src1.x[i], src2.x[i], IMM_VAL1);
70           af = _mm_cmpistra (src1.x[i], src2.x[i], IMM_VAL1);
71           correct = cmp_ii (&src1.x[i], &src2.x[i], IMM_VAL1,
72                             &correct_flags);
73           break;
74
75         case 2:
76           res = _mm_cmpistri (src1.x[i], src2.x[i], IMM_VAL2);
77           cf = _mm_cmpistrc (src1.x[i], src2.x[i], IMM_VAL2);
78           zf = _mm_cmpistrz (src1.x[i], src2.x[i], IMM_VAL2);
79           sf = _mm_cmpistrs (src1.x[i], src2.x[i], IMM_VAL2);
80           of = _mm_cmpistro (src1.x[i], src2.x[i], IMM_VAL2);
81           af = _mm_cmpistra (src1.x[i], src2.x[i], IMM_VAL2);
82           correct = cmp_ii (&src1.x[i], &src2.x[i], IMM_VAL2,
83                             &correct_flags);
84           break;
85
86         default:
87           res = _mm_cmpistri (src1.x[i], src2.x[i], IMM_VAL3);
88           cf = _mm_cmpistrc (src1.x[i], src2.x[i], IMM_VAL3);
89           zf = _mm_cmpistrz (src1.x[i], src2.x[i], IMM_VAL3);
90           sf = _mm_cmpistrs (src1.x[i], src2.x[i], IMM_VAL3);
91           of = _mm_cmpistro (src1.x[i], src2.x[i], IMM_VAL3);
92           af = _mm_cmpistra (src1.x[i], src2.x[i], IMM_VAL3);
93           correct = cmp_ii (&src1.x[i], &src2.x[i], IMM_VAL3,
94                             &correct_flags);
95           break;
96         }
97       
98       if (correct != res)
99         abort ();
100
101       flags = 0;
102       if (cf)
103         flags |= CFLAG;
104       if (zf)
105         flags |= ZFLAG;
106       if (sf)
107         flags |= SFLAG;
108       if (of)
109         flags |= OFLAG;
110       
111       if (flags != correct_flags
112           || (af && (cf || zf))
113           || (!af && !(cf || zf)))
114         abort ();
115     }
116 }