[testsuite] require sqrt_insn effective target where needed
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / pr92132-fp-1.c
blobc5cbb62ee736bd9ac2cee93a94a571d872287985
1 /* { dg-do run } */
2 /* { dg-require-effective-target vsx_hw } */
3 /* { dg-options "-O2 -ftree-vectorize -mvsx -fno-vect-cost-model -fdump-tree-vect-details" } */
5 /* To test condition reduction vectorization, where comparison operands are of
6 double type and condition true/false values are integer type. Cover all
7 float point comparison codes. */
9 #include <math.h>
11 extern void
12 abort (void) __attribute__ ((noreturn));
14 #define N 27
15 #define FP_TYPE double
17 #define LTGT(a, b) (__builtin_islessgreater ((a), (b)))
18 #define UNORD(a, b) (__builtin_isunordered ((a), (b)))
19 #define ORD(a, b) (!__builtin_isunordered ((a), (b)))
20 #define UNEQ(a, b) (!__builtin_islessgreater ((a), (b)))
21 #define UNGT(a, b) (!__builtin_islessequal ((a), (b)))
22 #define UNGE(a, b) (!__builtin_isless ((a), (b)))
23 #define UNLT(a, b) (!__builtin_isgreaterequal ((a), (b)))
24 #define UNLE(a, b) (!__builtin_isgreater ((a), (b)))
26 __attribute__ ((noinline)) int
27 test_eq (FP_TYPE *a, FP_TYPE min_v)
29 int last = 0;
31 for (int i = 0; i < N; i++)
32 if (a[i] == min_v)
33 last = i;
35 return last;
38 __attribute__ ((noinline)) int
39 test_ne (FP_TYPE *a, FP_TYPE min_v)
41 int last = 0;
43 for (int i = 0; i < N; i++)
44 if (a[i] != min_v)
45 last = i;
47 return last;
50 __attribute__ ((noinline)) int
51 test_gt (FP_TYPE *a, FP_TYPE min_v)
53 int last = 0;
55 for (int i = 0; i < N; i++)
56 if (a[i] > min_v)
57 last = i;
59 return last;
62 __attribute__ ((noinline)) int
63 test_ge (FP_TYPE *a, FP_TYPE min_v)
65 int last = 0;
67 for (int i = 0; i < N; i++)
68 if (a[i] >= min_v)
69 last = i;
71 return last;
74 __attribute__ ((noinline)) int
75 test_lt (FP_TYPE *a, FP_TYPE min_v)
77 int last = 0;
79 for (int i = 0; i < N; i++)
80 if (a[i] < min_v)
81 last = i;
83 return last;
86 __attribute__ ((noinline)) int
87 test_le (FP_TYPE *a, FP_TYPE min_v)
89 int last = 0;
91 for (int i = 0; i < N; i++)
92 if (a[i] <= min_v)
93 last = i;
95 return last;
98 __attribute__ ((noinline)) int
99 test_ltgt (FP_TYPE *a, FP_TYPE min_v)
101 int last = 0;
103 for (int i = 0; i < N; i++)
104 if (LTGT (a[i], min_v))
105 last = i;
107 return last;
110 __attribute__ ((noinline)) int
111 test_ord (FP_TYPE *a, FP_TYPE min_v)
113 int last = 0;
115 for (int i = 0; i < N; i++)
116 if (ORD (a[i], min_v))
117 last = i;
119 return last;
122 __attribute__ ((noinline)) int
123 test_unord (FP_TYPE *a, FP_TYPE min_v)
125 int last = 0;
127 for (int i = 0; i < N; i++)
128 if (UNORD (a[i], min_v))
129 last = i;
131 return last;
134 __attribute__ ((noinline)) int
135 test_uneq (FP_TYPE *a, FP_TYPE min_v)
137 int last = 0;
139 for (int i = 0; i < N; i++)
140 if (UNEQ (a[i], min_v))
141 last = i;
143 return last;
146 __attribute__ ((noinline)) int
147 test_ungt (FP_TYPE *a, FP_TYPE min_v)
149 int last = 0;
151 for (int i = 0; i < N; i++)
152 if (UNGT (a[i], min_v))
153 last = i;
155 return last;
158 __attribute__ ((noinline)) int
159 test_unge (FP_TYPE *a, FP_TYPE min_v)
161 int last = 0;
163 for (int i = 0; i < N; i++)
164 if (UNGE (a[i], min_v))
165 last = i;
167 return last;
170 __attribute__ ((noinline)) int
171 test_unlt (FP_TYPE *a, FP_TYPE min_v)
173 int last = 0;
175 for (int i = 0; i < N; i++)
176 if (UNLT (a[i], min_v))
177 last = i;
179 return last;
182 __attribute__ ((noinline)) int
183 test_unle (FP_TYPE *a, FP_TYPE min_v)
185 int last = 0;
187 for (int i = 0; i < N; i++)
188 if (UNLE (a[i], min_v))
189 last = i;
191 return last;
195 main (void)
197 int ret = 0;
199 FP_TYPE a1[N] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4,
200 5, 6, 7, 8, 9, 10, 21, 22, 23, 24, 25, 26, 27};
202 FP_TYPE a2[N] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4,
203 5, 6, 7, 8, 9, 10, 21, 22, 23, NAN, 25, 26, 27};
205 FP_TYPE a3[N] = {21, 22, 23, 24, 25, 26, 27, 28, 29, 10, 11, 12, 13, 14,
206 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7};
208 FP_TYPE a4[N] = {21, 22, 23, 24, 25, 26, 27, 28, 29, 10, 11, 12, 13, 14,
209 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, NAN, 6, 7};
211 FP_TYPE a5[N] = {21, 22, 23, 24, 25, 26, 27, 28, 29, 10, 11, 12, 13, 14,
212 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, NAN, 10, 10};
214 ret = test_eq (a1, 10);
215 if (ret != 19)
216 abort ();
218 ret = test_ne (a1, 10);
219 if (ret != 26)
220 abort ();
222 ret = test_gt (a3, 10);
223 if (ret != 19)
224 abort ();
226 ret = test_ge (a3, 10);
227 if (ret != 19)
228 abort ();
230 ret = test_lt (a1, 10);
231 if (ret != 18)
232 abort ();
234 ret = test_le (a1, 10);
235 if (ret != 19)
236 abort ();
238 ret = test_ltgt (a3, 10);
239 if (ret != 26)
240 abort ();
242 ret = test_ltgt (a5, 10);
243 if (ret != 23)
244 abort ();
246 ret = test_unord (a5, 10);
247 if (ret != 24)
248 abort ();
250 ret = test_ord (a5, 10);
251 if (ret != 26)
252 abort ();
254 ret = test_uneq (a1, 10);
255 if (ret != 19)
256 abort ();
258 ret = test_uneq (a4, 10);
259 if (ret != 24)
260 abort ();
262 ret = test_ungt (a3, 10);
263 if (ret != 19)
264 abort ();
266 ret = test_ungt (a4, 10);
267 if (ret != 24)
268 abort ();
270 ret = test_unge (a3, 10);
271 if (ret != 19)
272 abort ();
274 ret = test_ungt (a4, 10);
275 if (ret != 24)
276 abort ();
278 ret = test_unlt (a1, 10);
279 if (ret != 18)
280 abort ();
282 ret = test_unlt (a2, 10);
283 if (ret != 23)
284 abort ();
286 ret = test_unle (a1, 10);
287 if (ret != 19)
288 abort ();
290 ret = test_unle (a2, 10);
291 if (ret != 23)
292 abort ();
294 return 0;
297 /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 14 "vect" { target has_arch_pwr8 } } } */