1 /* { dg-do run } */
2 /* { dg-options "-O2 -ftree-vectorize -fno-inline -save-temps" } */
3 
4 
5 extern void abort (void);
6 double fmax (double, double);
7 float fmaxf (float, float);
8 double fmin (double, double);
9 float fminf (float, float);
10 
11 #define isnan __builtin_isnan
12 #define isinf __builtin_isinf
13 
14 #define NAN __builtin_nan ("")
15 #define INFINITY __builtin_inf ()
16 
17 #define NUM_ELEMS(TYPE) (16 / sizeof (TYPE))
18 
19 #define DEF_MAXMIN(TYPE,FUN)\
20 void test_##FUN (TYPE *__restrict__ r, TYPE *__restrict__ a,\
21 		 TYPE *__restrict__ b)\
22 {\
23   int i;\
24   for (i = 0; i < NUM_ELEMS (TYPE); i++)\
25     r[i] = FUN (a[i], b[i]);\
26 }\
27 
DEF_MAXMIN(float,fmaxf)28 DEF_MAXMIN (float, fmaxf)
29 DEF_MAXMIN (double, fmax)
30 
31 DEF_MAXMIN (float, fminf)
32 DEF_MAXMIN (double, fmin)
33 
34 int main ()
35 {
36   float a_f[4] = { 4, NAN, -3, INFINITY };
37   float b_f[4] = { 1,   7,NAN, 0 };
38   float r_f[4];
39   double a_d[4] = { 4, NAN,  -3,  INFINITY };
40   double b_d[4] = { 1,   7, NAN,  0 };
41   double r_d[4];
42 
43   test_fmaxf (r_f, a_f, b_f);
44   if (r_f[0] != 4 || isnan (r_f[1]) || isnan (r_f[2]) || !isinf (r_f[3]))
45     abort ();
46 
47   test_fminf (r_f, a_f, b_f);
48   if (r_f[0] != 1 || isnan (r_f[1]) || isnan (r_f[2]) || isinf (r_f[3]))
49     abort ();
50 
51   test_fmax (r_d, a_d, b_d);
52   test_fmax (&r_d[2], &a_d[2], &b_d[2]);
53   if (r_d[0] != 4 || isnan (r_d[1]) || isnan (r_d[2]) || !isinf (r_d[3]))
54     abort ();
55 
56   test_fmin (r_d, a_d, b_d);
57   test_fmin (&r_d[2], &a_d[2], &b_d[2]);
58   if (r_d[0] != 1 || isnan (r_d[1]) || isnan (r_d[2]) || isinf (r_d[3]))
59     abort ();
60 
61   return 0;
62 }
63 
64 /* { dg-final { scan-assembler-times "fmaxnm\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
65 /* { dg-final { scan-assembler-times "fmaxnm\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
66 
67 /* { dg-final { scan-assembler-times "fminnm\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
68 /* { dg-final { scan-assembler-times "fminnm\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
69 
70