1 /* { dg-do compile } */
2 /* { dg-require-effective-target powerpc_vsx_ok } */
3 /* { dg-options "-mdejagnu-cpu=power9 -mvsx -O2 -mpower9-minmax" } */
4 /* { dg-final { scan-assembler-not "fsel" } } */
5 /* { dg-final { scan-assembler "xscmpeqdp" } } */
6 /* { dg-final { scan-assembler "xscmpgtdp" } } */
7 /* { dg-final { scan-assembler-not "xscmpodp" } } */
8 /* { dg-final { scan-assembler-not "xscmpudp" } } */
9 /* { dg-final { scan-assembler "xsmaxcdp" } } */
10 /* { dg-final { scan-assembler-not "xsmaxdp" } } */
11 /* { dg-final { scan-assembler "xsmincdp" } } */
12 /* { dg-final { scan-assembler-not "xsmindp" } } */
13 /* { dg-final { scan-assembler "xxsel" } } */
15 /* Due to NaN support, <= and >= are not handled presently unless -ffast-math
16 is used. At some point this will be fixed and the xscmpgedp instruction can
17 be generated normally. The <= and >= tests are bracketed with
22 dbl_max1 (double a
, double b
)
24 return (a
>= b
) ? a
: b
;
29 dbl_max2 (double a
, double b
)
31 return (a
> b
) ? a
: b
;
35 dbl_min1 (double a
, double b
)
37 return (a
< b
) ? a
: b
;
42 dbl_min2 (double a
, double b
)
44 return (a
<= b
) ? a
: b
;
49 dbl_cmp_eq (double a
, double b
, double c
, double d
)
51 return (a
== b
) ? c
: d
;
55 dbl_cmp_ne (double a
, double b
, double c
, double d
)
57 return (a
!= b
) ? c
: d
;
61 dbl_cmp_gt (double a
, double b
, double c
, double d
)
63 return (a
> b
) ? c
: d
;
68 dbl_cmp_ge (double a
, double b
, double c
, double d
)
70 return (a
>= b
) ? c
: d
;
75 dbl_cmp_lt (double a
, double b
, double c
, double d
)
77 return (a
< b
) ? c
: d
;
82 dbl_cmp_le (double a
, double b
, double c
, double d
)
84 return (a
<= b
) ? c
: d
;
90 flt_max1 (float a
, float b
)
92 return (a
>= b
) ? a
: b
;
97 flt_max2 (float a
, float b
)
99 return (a
> b
) ? a
: b
;
103 flt_min1 (float a
, float b
)
105 return (a
< b
) ? a
: b
;
110 flt_min2 (float a
, float b
)
112 return (a
<= b
) ? a
: b
;
117 flt_cmp_eq (float a
, float b
, float c
, float d
)
119 return (a
== b
) ? c
: d
;
123 flt_cmp_ne (float a
, float b
, float c
, float d
)
125 return (a
!= b
) ? c
: d
;
129 flt_cmp_gt (float a
, float b
, float c
, float d
)
131 return (a
> b
) ? c
: d
;
136 flt_cmp_ge (float a
, float b
, float c
, float d
)
138 return (a
>= b
) ? c
: d
;
143 flt_cmp_lt (float a
, float b
, float c
, float d
)
145 return (a
< b
) ? c
: d
;
150 flt_cmp_le (float a
, float b
, float c
, float d
)
152 return (a
<= b
) ? c
: d
;
157 dbl_flt_max1 (float a
, float b
)
159 return (a
> b
) ? a
: b
;
163 dbl_flt_max2 (double a
, float b
)
165 return (a
> b
) ? a
: b
;
169 dbl_flt_max3 (float a
, double b
)
171 return (a
> b
) ? a
: b
;
175 dbl_flt_min1 (float a
, float b
)
177 return (a
< b
) ? a
: b
;
181 dbl_flt_min2 (double a
, float b
)
183 return (a
< b
) ? a
: b
;
187 dbl_flt_min3 (float a
, double b
)
189 return (a
< b
) ? a
: b
;