1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
3 /* { dg-require-effective-target powerpc_p9vector_ok } */
4 /* { dg-options "-mcpu=power9 -O2 -mpower9-minmax" } */
5 /* { dg-final { scan-assembler-not "fsel" } } */
6 /* { dg-final { scan-assembler "xscmpeqdp" } } */
7 /* { dg-final { scan-assembler "xscmpgtdp" } } */
8 /* { dg-final { scan-assembler-not "xscmpodp" } } */
9 /* { dg-final { scan-assembler-not "xscmpudp" } } */
10 /* { dg-final { scan-assembler "xsmaxcdp" } } */
11 /* { dg-final { scan-assembler-not "xsmaxdp" } } */
12 /* { dg-final { scan-assembler "xsmincdp" } } */
13 /* { dg-final { scan-assembler-not "xsmindp" } } */
14 /* { dg-final { scan-assembler "xxsel" } } */
16 /* Due to NaN support, <= and >= are not handled presently unless -ffast-math
17 is used. At some point this will be fixed and the xscmpgedp instruction can
18 be generated normally. The <= and >= tests are bracketed with
23 dbl_max1 (double a
, double b
)
25 return (a
>= b
) ? a
: b
;
30 dbl_max2 (double a
, double b
)
32 return (a
> b
) ? a
: b
;
36 dbl_min1 (double a
, double b
)
38 return (a
< b
) ? a
: b
;
43 dbl_min2 (double a
, double b
)
45 return (a
<= b
) ? a
: b
;
50 dbl_cmp_eq (double a
, double b
, double c
, double d
)
52 return (a
== b
) ? c
: d
;
56 dbl_cmp_ne (double a
, double b
, double c
, double d
)
58 return (a
!= b
) ? c
: d
;
62 dbl_cmp_gt (double a
, double b
, double c
, double d
)
64 return (a
> b
) ? c
: d
;
69 dbl_cmp_ge (double a
, double b
, double c
, double d
)
71 return (a
>= b
) ? c
: d
;
76 dbl_cmp_lt (double a
, double b
, double c
, double d
)
78 return (a
< b
) ? c
: d
;
83 dbl_cmp_le (double a
, double b
, double c
, double d
)
85 return (a
<= b
) ? c
: d
;
91 flt_max1 (float a
, float b
)
93 return (a
>= b
) ? a
: b
;
98 flt_max2 (float a
, float b
)
100 return (a
> b
) ? a
: b
;
104 flt_min1 (float a
, float b
)
106 return (a
< b
) ? a
: b
;
111 flt_min2 (float a
, float b
)
113 return (a
<= b
) ? a
: b
;
118 flt_cmp_eq (float a
, float b
, float c
, float d
)
120 return (a
== b
) ? c
: d
;
124 flt_cmp_ne (float a
, float b
, float c
, float d
)
126 return (a
!= b
) ? c
: d
;
130 flt_cmp_gt (float a
, float b
, float c
, float d
)
132 return (a
> b
) ? c
: d
;
137 flt_cmp_ge (float a
, float b
, float c
, float d
)
139 return (a
>= b
) ? c
: d
;
144 flt_cmp_lt (float a
, float b
, float c
, float d
)
146 return (a
< b
) ? c
: d
;
151 flt_cmp_le (float a
, float b
, float c
, float d
)
153 return (a
<= b
) ? c
: d
;
158 dbl_flt_max1 (float a
, float b
)
160 return (a
> b
) ? a
: b
;
164 dbl_flt_max2 (double a
, float b
)
166 return (a
> b
) ? a
: b
;
170 dbl_flt_max3 (float a
, double b
)
172 return (a
> b
) ? a
: b
;
176 dbl_flt_min1 (float a
, float b
)
178 return (a
< b
) ? a
: b
;
182 dbl_flt_min2 (double a
, float b
)
184 return (a
< b
) ? a
: b
;
188 dbl_flt_min3 (float a
, double b
)
190 return (a
< b
) ? a
: b
;