Use conditional internal functions in if-conversion
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / p9-minmax-2.c
blobf674214296634de11c5364e83fee1ec87dbb2512
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
19 #ifdef DO_GE_LE. */
21 #ifdef DO_GE_LE
22 double
23 dbl_max1 (double a, double b)
25 return (a >= b) ? a : b;
27 #endif
29 double
30 dbl_max2 (double a, double b)
32 return (a > b) ? a : b;
35 double
36 dbl_min1 (double a, double b)
38 return (a < b) ? a : b;
41 #ifdef DO_GE_LE
42 double
43 dbl_min2 (double a, double b)
45 return (a <= b) ? a : b;
47 #endif
49 double
50 dbl_cmp_eq (double a, double b, double c, double d)
52 return (a == b) ? c : d;
55 double
56 dbl_cmp_ne (double a, double b, double c, double d)
58 return (a != b) ? c : d;
61 double
62 dbl_cmp_gt (double a, double b, double c, double d)
64 return (a > b) ? c : d;
67 #ifdef DO_GE_LE
68 double
69 dbl_cmp_ge (double a, double b, double c, double d)
71 return (a >= b) ? c : d;
73 #endif
75 double
76 dbl_cmp_lt (double a, double b, double c, double d)
78 return (a < b) ? c : d;
81 #ifdef DO_GE_LE
82 double
83 dbl_cmp_le (double a, double b, double c, double d)
85 return (a <= b) ? c : d;
87 #endif
89 #ifdef DO_GE_LE
90 float
91 flt_max1 (float a, float b)
93 return (a >= b) ? a : b;
95 #endif
97 float
98 flt_max2 (float a, float b)
100 return (a > b) ? a : b;
103 float
104 flt_min1 (float a, float b)
106 return (a < b) ? a : b;
109 #ifdef DO_GE_LE
110 float
111 flt_min2 (float a, float b)
113 return (a <= b) ? a : b;
115 #endif
117 float
118 flt_cmp_eq (float a, float b, float c, float d)
120 return (a == b) ? c : d;
123 float
124 flt_cmp_ne (float a, float b, float c, float d)
126 return (a != b) ? c : d;
129 float
130 flt_cmp_gt (float a, float b, float c, float d)
132 return (a > b) ? c : d;
135 #ifdef DO_GE_LE
136 float
137 flt_cmp_ge (float a, float b, float c, float d)
139 return (a >= b) ? c : d;
141 #endif
143 float
144 flt_cmp_lt (float a, float b, float c, float d)
146 return (a < b) ? c : d;
149 #ifdef DO_GE_LE
150 float
151 flt_cmp_le (float a, float b, float c, float d)
153 return (a <= b) ? c : d;
155 #endif
157 double
158 dbl_flt_max1 (float a, float b)
160 return (a > b) ? a : b;
163 double
164 dbl_flt_max2 (double a, float b)
166 return (a > b) ? a : b;
169 double
170 dbl_flt_max3 (float a, double b)
172 return (a > b) ? a : b;
175 double
176 dbl_flt_min1 (float a, float b)
178 return (a < b) ? a : b;
181 double
182 dbl_flt_min2 (double a, float b)
184 return (a < b) ? a : b;
187 double
188 dbl_flt_min3 (float a, double b)
190 return (a < b) ? a : b;