PR ipa/61602
[official-gcc.git] / gcc / testsuite / gcc.dg / torture / builtin-math-6.c
blob462c7d3ee019370ff6a4ea48cf220eabef337da2
1 /* Copyright (C) 2009 Free Software Foundation.
3 Verify that folding of built-in complex math functions with
4 constant arguments is correctly performed by the compiler.
6 Origin: Kaveh R. Ghazi, January 28, 2009. */
8 /* { dg-do link } */
10 /* All references to link_error should go away at compile-time. The
11 first number is the line number and the second is the value number
12 among several tests. These appear in the tree dump file and aid in
13 debugging. */
14 extern void link_error(int, int);
16 #define CONJ(X) __builtin_conjf(X)
18 /* Return TRUE if the signs of floating point values X and Y are not
19 equal. This is important when comparing signed zeros. */
20 #define CKSGN_F(X,Y) \
21 (__builtin_copysignf(1,(X)) != __builtin_copysignf(1,(Y)))
22 #define CKSGN(X,Y) \
23 (__builtin_copysign(1,(X)) != __builtin_copysign(1,(Y)))
24 #define CKSGN_L(X,Y) \
25 (__builtin_copysignl(1,(X)) != __builtin_copysignl(1,(Y)))
27 /* Return TRUE if signs of the real parts, and the signs of the
28 imaginary parts, of X and Y are not equal. */
29 #define COMPLEX_CKSGN_F(X,Y) \
30 (CKSGN_F(__real__ (X), __real__ (Y)) || CKSGN_F (__imag__ (X), __imag__ (Y)))
31 #define COMPLEX_CKSGN(X,Y) \
32 (CKSGN(__real__ (X), __real__ (Y)) || CKSGN (__imag__ (X), __imag__ (Y)))
33 #define COMPLEX_CKSGN_L(X,Y) \
34 (CKSGN_L(__real__ (X), __real__ (Y)) || CKSGN_L (__imag__ (X), __imag__ (Y)))
36 /* For complex numbers, test that FUNC(ARG) == (RES). */
37 #define TESTIT_COMPLEX(VAL_NUM, FUNC, ARG, RES) do { \
38 if (__builtin_##FUNC##f(ARG) != (RES) \
39 || COMPLEX_CKSGN_F(__builtin_##FUNC##f(ARG), (RES))) \
40 link_error(__LINE__, VAL_NUM); \
41 if (__builtin_##FUNC(ARG) != (RES) \
42 || COMPLEX_CKSGN(__builtin_##FUNC(ARG), (RES))) \
43 link_error(__LINE__, VAL_NUM); \
44 if (__builtin_##FUNC##l(ARG) != (RES) \
45 || COMPLEX_CKSGN_L(__builtin_##FUNC##l(ARG), (RES))) \
46 link_error(__LINE__, VAL_NUM); \
47 } while (0)
49 /* For complex numbers, call the TESTIT_COMPLEX macro for all
50 combinations of neg and conj. */
51 #define TESTIT_COMPLEX_ALLNEG(FUNC, ARG, RES1, RES2, RES3, RES4) do { \
52 TESTIT_COMPLEX(1, FUNC, (_Complex float)(ARG), RES1); \
53 TESTIT_COMPLEX(2, FUNC, -CONJ(ARG), RES2); \
54 TESTIT_COMPLEX(3, FUNC, CONJ(ARG), RES3); \
55 TESTIT_COMPLEX(4, FUNC, -(_Complex float)(ARG), RES4); \
56 } while (0)
58 /* For complex numbers, call the TESTIT_COMPLEX_R macro for all
59 combinations of neg and conj. */
60 #define TESTIT_COMPLEX_R_ALLNEG(FUNC, ARG, RES1, RES2, RES3, RES4) do { \
61 TESTIT_COMPLEX_R(1, FUNC, (_Complex float)(ARG), RES1); \
62 TESTIT_COMPLEX_R(2, FUNC, -CONJ(ARG), RES2); \
63 TESTIT_COMPLEX_R(3, FUNC, CONJ(ARG), RES3); \
64 TESTIT_COMPLEX_R(4, FUNC, -(_Complex float)(ARG), RES4); \
65 } while (0)
67 /* For complex numbers, test that FUNC(ARG0, ARG1) == (RES). */
68 #define TESTIT_COMPLEX2(VAL_NUM, FUNC, ARG0, ARG1, RES) do { \
69 if (__builtin_##FUNC##f(ARG0, ARG1) != (RES) \
70 || COMPLEX_CKSGN_F(__builtin_##FUNC##f(ARG0, ARG1), (RES))) \
71 link_error(__LINE__, VAL_NUM); \
72 if (__builtin_##FUNC(ARG0, ARG1) != (RES) \
73 || COMPLEX_CKSGN(__builtin_##FUNC(ARG0, ARG1), (RES))) \
74 link_error(__LINE__, VAL_NUM); \
75 if (__builtin_##FUNC##l(ARG0, ARG1) != (RES) \
76 || COMPLEX_CKSGN_L(__builtin_##FUNC##l(ARG0, ARG1), (RES))) \
77 link_error(__LINE__, VAL_NUM); \
78 } while (0)
80 /* For complex numbers, call the TESTIT_COMPLEX2 macro for all
81 combinations of neg and conj. */
82 #define TESTIT_COMPLEX2_ALLNEG(FUNC, ARG0, ARG1, RES1, RES2, RES3, RES4, RES5,\
83 RES6, RES7, RES8, RES9, RES10, RES11, RES12, RES13, RES14, RES15, RES16) do{ \
84 TESTIT_COMPLEX2(1, FUNC, (_Complex float)(ARG0),(_Complex float)(ARG1), RES1);\
85 TESTIT_COMPLEX2(2, FUNC, (_Complex float)(ARG0),CONJ(ARG1), RES2); \
86 TESTIT_COMPLEX2(3, FUNC, (_Complex float)(ARG0),-(_Complex float)(ARG1), RES3); \
87 TESTIT_COMPLEX2(4, FUNC, (_Complex float)(ARG0),-CONJ(ARG1), RES4); \
88 TESTIT_COMPLEX2(5, FUNC, -(_Complex float)(ARG0),(_Complex float)(ARG1), RES5); \
89 TESTIT_COMPLEX2(6, FUNC, -(_Complex float)(ARG0),CONJ(ARG1), RES6); \
90 TESTIT_COMPLEX2(7, FUNC, -(_Complex float)(ARG0),-(_Complex float)(ARG1), RES7); \
91 TESTIT_COMPLEX2(8, FUNC, -(_Complex float)(ARG0),-CONJ(ARG1), RES8); \
92 TESTIT_COMPLEX2(9, FUNC, CONJ(ARG0),(_Complex float)(ARG1), RES9); \
93 TESTIT_COMPLEX2(10, FUNC, CONJ(ARG0),CONJ(ARG1), RES10); \
94 TESTIT_COMPLEX2(11, FUNC, CONJ(ARG0),-(_Complex float)(ARG1), RES11); \
95 TESTIT_COMPLEX2(12, FUNC, CONJ(ARG0),-CONJ(ARG1), RES12); \
96 TESTIT_COMPLEX2(13, FUNC, -CONJ(ARG0),(_Complex float)(ARG1), RES13); \
97 TESTIT_COMPLEX2(14, FUNC, -CONJ(ARG0),CONJ(ARG1), RES14); \
98 TESTIT_COMPLEX2(15, FUNC, -CONJ(ARG0),-(_Complex float)(ARG1), RES15); \
99 TESTIT_COMPLEX2(16, FUNC, -CONJ(ARG0),-CONJ(ARG1), RES16); \
100 } while (0)
102 /* Return TRUE if X differs from EXPECTED by more than 1%. If
103 EXPECTED is zero, then any difference may return TRUE. We don't
104 worry about signed zeros. */
105 #define DIFF1PCT_F(X,EXPECTED) \
106 (__builtin_fabsf((X)-(EXPECTED)) * 100 > __builtin_fabsf(EXPECTED))
107 #define DIFF1PCT(X,EXPECTED) \
108 (__builtin_fabs((X)-(EXPECTED)) * 100 > __builtin_fabs(EXPECTED))
109 #define DIFF1PCT_L(X,EXPECTED) \
110 (__builtin_fabsl((X)-(EXPECTED)) * 100 > __builtin_fabsl(EXPECTED))
112 /* Return TRUE if complex value X differs from EXPECTED by more than
113 1% in either the real or imaginary parts. */
114 #define COMPLEX_DIFF1PCT_F(X,EXPECTED) \
115 (DIFF1PCT_F(__real__ (X), __real__ (EXPECTED)) \
116 || DIFF1PCT_F(__imag__ (X), __imag__ (EXPECTED)))
117 #define COMPLEX_DIFF1PCT(X,EXPECTED) \
118 (DIFF1PCT(__real__ (X), __real__ (EXPECTED)) \
119 || DIFF1PCT(__imag__ (X), __imag__ (EXPECTED)))
120 #define COMPLEX_DIFF1PCT_L(X,EXPECTED) \
121 (DIFF1PCT_L(__real__ (X), __real__ (EXPECTED)) \
122 || DIFF1PCT_L(__imag__ (X), __imag__ (EXPECTED)))
124 /* Range test, for complex numbers check that FUNC(ARG) is within 1%
125 of RES. This is NOT a test for accuracy to the last-bit, we're
126 merely checking that we get relatively sane results. I.e. the GCC
127 builtin is hooked up to the correct MPC function call. We first
128 check the magnitude and then the sign. */
129 #define TESTIT_COMPLEX_R(VAL_NUM, FUNC, ARG, RES) do { \
130 if (COMPLEX_DIFF1PCT_F (__builtin_##FUNC##f(ARG), (RES)) \
131 || COMPLEX_CKSGN_F(__builtin_##FUNC##f(ARG), (RES))) \
132 link_error(__LINE__, VAL_NUM); \
133 if (COMPLEX_DIFF1PCT (__builtin_##FUNC(ARG), (RES)) \
134 || COMPLEX_CKSGN(__builtin_##FUNC(ARG), (RES))) \
135 link_error(__LINE__, VAL_NUM); \
136 if (COMPLEX_DIFF1PCT (__builtin_##FUNC(ARG), (RES)) \
137 || COMPLEX_CKSGN(__builtin_##FUNC(ARG), (RES))) \
138 link_error(__LINE__, VAL_NUM); \
139 } while (0)
141 /* Range test, for complex numbers check that FUNC(ARG0, ARG1) is
142 within 1% of RES. This is NOT a test for accuracy to the last-bit,
143 we're merely checking that we get relatively sane results.
144 I.e. the GCC builtin is hooked up to the correct MPC function call.
145 We first check the magnitude and then the sign. */
146 #define TESTIT_COMPLEX_R2(VAL_NUM, FUNC, ARG0, ARG1, RES) do { \
147 if (COMPLEX_DIFF1PCT_F (__builtin_##FUNC##f(ARG0, ARG1), (RES)) \
148 || COMPLEX_CKSGN_F (__builtin_##FUNC##f(ARG0, ARG1), (RES))) \
149 link_error(__LINE__, VAL_NUM); \
150 if (COMPLEX_DIFF1PCT (__builtin_##FUNC(ARG0, ARG1), (RES)) \
151 || COMPLEX_CKSGN (__builtin_##FUNC(ARG0, ARG1), (RES))) \
152 link_error(__LINE__, VAL_NUM); \
153 if (COMPLEX_DIFF1PCT_L (__builtin_##FUNC##l(ARG0, ARG1), (RES)) \
154 || COMPLEX_CKSGN_L (__builtin_##FUNC##l(ARG0, ARG1), (RES))) \
155 link_error(__LINE__, VAL_NUM); \
156 } while (0)
158 /* For complex numbers, call the TESTIT_COMPLEX_R2 macro for all
159 combinations of neg and conj. */
160 #define TESTIT_COMPLEX_R2_ALLNEG(FUNC, ARG0, ARG1, RES1, RES2, RES3, RES4, RES5,\
161 RES6, RES7, RES8, RES9, RES10, RES11, RES12, RES13, RES14, RES15, RES16) do{ \
162 TESTIT_COMPLEX_R2(1, FUNC, (_Complex float)(ARG0),(_Complex float)(ARG1), RES1);\
163 TESTIT_COMPLEX_R2(2, FUNC, (_Complex float)(ARG0),CONJ(ARG1), RES2); \
164 TESTIT_COMPLEX_R2(3, FUNC, (_Complex float)(ARG0),-(_Complex float)(ARG1), RES3); \
165 TESTIT_COMPLEX_R2(4, FUNC, (_Complex float)(ARG0),-CONJ(ARG1), RES4); \
166 TESTIT_COMPLEX_R2(5, FUNC, -(_Complex float)(ARG0),(_Complex float)(ARG1), RES5); \
167 TESTIT_COMPLEX_R2(6, FUNC, -(_Complex float)(ARG0),CONJ(ARG1), RES6); \
168 TESTIT_COMPLEX_R2(7, FUNC, -(_Complex float)(ARG0),-(_Complex float)(ARG1), RES7); \
169 TESTIT_COMPLEX_R2(8, FUNC, -(_Complex float)(ARG0),-CONJ(ARG1), RES8); \
170 TESTIT_COMPLEX_R2(9, FUNC, CONJ(ARG0),(_Complex float)(ARG1), RES9); \
171 TESTIT_COMPLEX_R2(10, FUNC, CONJ(ARG0),CONJ(ARG1), RES10); \
172 TESTIT_COMPLEX_R2(11, FUNC, CONJ(ARG0),-(_Complex float)(ARG1), RES11); \
173 TESTIT_COMPLEX_R2(12, FUNC, CONJ(ARG0),-CONJ(ARG1), RES12); \
174 TESTIT_COMPLEX_R2(13, FUNC, -CONJ(ARG0),(_Complex float)(ARG1), RES13); \
175 TESTIT_COMPLEX_R2(14, FUNC, -CONJ(ARG0),CONJ(ARG1), RES14); \
176 TESTIT_COMPLEX_R2(15, FUNC, -CONJ(ARG0),-(_Complex float)(ARG1), RES15); \
177 TESTIT_COMPLEX_R2(16, FUNC, -CONJ(ARG0),-CONJ(ARG1), RES16); \
178 } while (0)
180 int main (void)
182 TESTIT_COMPLEX (1, cacos, 1, CONJ(0));
183 TESTIT_COMPLEX_R (1, cacos, -1, CONJ(3.141593F));
184 TESTIT_COMPLEX (1, cacos, CONJ(1), 0);
185 TESTIT_COMPLEX_R (1, cacos, CONJ(-1), 3.141593F);
186 TESTIT_COMPLEX_R_ALLNEG (cacos, 3.45678F + 2.34567FI,
187 0.60971F - 2.11780FI, 2.531875F - 2.117800FI,
188 0.60971F + 2.11780FI, 2.531875F + 2.117800FI);
190 TESTIT_COMPLEX_ALLNEG (casin, 0,
191 0, -CONJ(0), CONJ(0), CONJ(-0.F));
192 TESTIT_COMPLEX_R_ALLNEG (casin, 3.45678F + 2.34567FI,
193 0.96107F + 2.11780FI, -0.96107F + 2.11780FI,
194 0.96107F - 2.11780FI, -0.96107F - 2.11780FI);
196 TESTIT_COMPLEX_ALLNEG (catan, 0,
197 0, -CONJ(0), CONJ(0), CONJ(-0.F));
198 TESTIT_COMPLEX_R_ALLNEG (catan, 3.45678F + 2.34567FI,
199 1.37188F + 0.12997FI, -1.37188F + 0.12997FI,
200 1.37188F - 0.12997FI, -1.37188F - 0.12997FI);
202 TESTIT_COMPLEX (1, cacosh, 1, 0);
203 TESTIT_COMPLEX_R (1, cacosh, -1, 3.141593FI);
204 TESTIT_COMPLEX (1, cacosh, CONJ(1), CONJ(0));
205 TESTIT_COMPLEX_R (1, cacosh, CONJ(-1), CONJ(3.141593FI));
206 TESTIT_COMPLEX_R_ALLNEG (cacosh, 3.45678F + 2.34567FI,
207 2.11780F + 0.60971FI, 2.11780F + 2.531875FI,
208 2.11780F - 0.60971FI, 2.11780F - 2.531875FI);
210 TESTIT_COMPLEX_ALLNEG (casinh, 0,
211 0, -CONJ(0), CONJ(0), CONJ(-0.F));
212 TESTIT_COMPLEX_R_ALLNEG (casinh, 3.45678F + 2.34567FI,
213 2.12836F + 0.58310FI, -2.12836F + 0.58310FI,
214 2.12836F - 0.58310FI, -2.12836F - 0.58310FI);
216 TESTIT_COMPLEX_ALLNEG (catanh, 0,
217 0, -CONJ(0), CONJ(0), CONJ(-0.F));
218 TESTIT_COMPLEX_R_ALLNEG (catanh, 3.45678F + 2.34567FI,
219 0.19693F + 1.43190FI, -0.19693F + 1.43190FI,
220 0.19693F - 1.43190FI, -0.19693F - 1.43190FI);
222 TESTIT_COMPLEX_ALLNEG (csin, 0,
223 0, -0.F, CONJ(0), CONJ(-0.F));
224 TESTIT_COMPLEX_R_ALLNEG (csin, 3.45678F + 2.34567FI,
225 -1.633059F - 4.917448FI, 1.633059F - 4.917448FI,
226 -1.633059F + 4.917448FI, 1.633059F + 4.917448FI);
228 TESTIT_COMPLEX_ALLNEG (ccos, 0,
229 CONJ(1), 1, 1, CONJ(1));
230 TESTIT_COMPLEX_R_ALLNEG (ccos, 3.45678F + 2.34567FI,
231 -5.008512F + 1.603367FI, -5.008512F - 1.603367FI,
232 -5.008512F - 1.603367FI, -5.008512F + 1.603367FI);
234 TESTIT_COMPLEX_ALLNEG (ctan, 0,
235 0, -0.F, CONJ(0), CONJ(-0.F));
236 TESTIT_COMPLEX_R_ALLNEG (ctan, 3.45678F + 2.34567FI,
237 0.010657F + 0.985230FI, -0.010657F + 0.985230FI,
238 0.010657F - 0.985230FI, -0.010657F - 0.985230FI);
240 TESTIT_COMPLEX_ALLNEG (csinh, 0,
241 0, -0.F, CONJ(0), CONJ(-0.F));
242 TESTIT_COMPLEX_R_ALLNEG (csinh, 3.45678F + 2.34567FI,
243 -11.083178F + 11.341487FI, 11.083178F +11.341487FI,
244 -11.083178F - 11.341487FI, 11.083178F -11.341487FI);
246 TESTIT_COMPLEX_ALLNEG (ccosh, 0,
247 1, CONJ(1), CONJ(1), 1);
248 TESTIT_COMPLEX_R_ALLNEG (ccosh, 3.45678F + 2.34567FI,
249 -11.105238F + 11.318958FI,-11.105238F -11.318958FI,
250 -11.105238F - 11.318958FI,-11.105238F +11.318958FI);
252 TESTIT_COMPLEX_ALLNEG (ctanh, 0,
253 0, -0.F, CONJ(0), CONJ(-0.F));
254 TESTIT_COMPLEX_R_ALLNEG (ctanh, 3.45678F + 2.34567FI,
255 1.000040F - 0.001988FI, -1.000040F - 0.001988FI,
256 1.000040F + 0.001988FI, -1.000040F + 0.001988FI);
258 TESTIT_COMPLEX (1, clog, 1, 0);
259 TESTIT_COMPLEX_R (1, clog, -1, 3.141593FI);
260 TESTIT_COMPLEX (1, clog, CONJ(1), CONJ(0));
261 TESTIT_COMPLEX_R (1, clog, CONJ(-1), CONJ(3.141593FI));
262 TESTIT_COMPLEX_R_ALLNEG (clog, 3.45678F + 2.34567FI,
263 1.429713F + 0.596199FI, 1.429713F + 2.545394FI,
264 1.429713F - 0.596199FI, 1.429713F - 2.545394FI);
266 TESTIT_COMPLEX_ALLNEG (csqrt, 0,
267 0, 0, CONJ(0), CONJ(0));
268 TESTIT_COMPLEX_R_ALLNEG (csqrt, 3.45678F + 2.34567FI,
269 1.953750F + 0.600299FI, 0.600299F + 1.953750FI,
270 1.953750F - 0.600299FI, 0.600299F - 1.953750FI);
272 TESTIT_COMPLEX2_ALLNEG (cpow, 1, 0,
273 1, 1, CONJ(1), CONJ(1), CONJ(1), CONJ(1), 1, 1,
274 CONJ(1), CONJ(1), 1, 1, 1, 1, CONJ(1), CONJ(1));
275 TESTIT_COMPLEX2_ALLNEG (cpow, 1.FI, 0,
276 1, 1, CONJ(1), CONJ(1), CONJ(1), CONJ(1), 1, 1,
277 CONJ(1), CONJ(1), 1, 1, 1, 1, CONJ(1), CONJ(1));
278 TESTIT_COMPLEX_R2_ALLNEG (cpow, 2, 3,
279 8, 8, CONJ(1/8.F), CONJ(1/8.F), CONJ(-8), CONJ(-8), -1/8.F, -1/8.F,
280 CONJ(8), CONJ(8), 1/8.F, 1/8.F, -8, -8, CONJ(-1/8.F), CONJ(-1/8.F));
281 TESTIT_COMPLEX_R2_ALLNEG (cpow, 3, 4,
282 81, 81, CONJ(1/81.F), CONJ(1/81.F), CONJ(81), CONJ(81), 1/81.F, 1/81.F,
283 CONJ(81), CONJ(81), 1/81.F, 1/81.F, 81, 81, CONJ(1/81.F), CONJ(1/81.F));
284 TESTIT_COMPLEX_R2_ALLNEG (cpow, 3, 5,
285 243, 243, CONJ(1/243.F), CONJ(1/243.F), CONJ(-243), CONJ(-243), -1/243.F, -1/243.F,
286 CONJ(243), CONJ(243), 1/243.F, 1/243.F, -243, -243, CONJ(-1/243.F), CONJ(-1/243.F));
287 TESTIT_COMPLEX_R2_ALLNEG (cpow, 4, 2,
288 16, 16, CONJ(1/16.F), CONJ(1/16.F), CONJ(16), CONJ(16), 1/16.F, 1/16.F,
289 CONJ(16), CONJ(16), 1/16.F, 1/16.F, 16, 16, CONJ(1/16.F), CONJ(1/16.F));
290 TESTIT_COMPLEX_R2_ALLNEG (cpow, 1.5, 3,
291 3.375F, 3.375F, CONJ(1/3.375F), CONJ(1/3.375F), CONJ(-3.375F), CONJ(-3.375F), -1/3.375F, -1/3.375F,
292 CONJ(3.375F), CONJ(3.375F), 1/3.375F, 1/3.375F, -3.375F, -3.375F, CONJ(-1/3.375F), CONJ(-1/3.375F));
294 TESTIT_COMPLEX2 (1, cpow, 16, 0.25F, 2);
296 TESTIT_COMPLEX_R2 (1, cpow, 3.45678F + 2.34567FI, 1.23456 + 4.56789FI, 0.212485F + 0.319304FI);
297 TESTIT_COMPLEX_R2 (1, cpow, 3.45678F - 2.34567FI, 1.23456 + 4.56789FI, 78.576402F + -41.756208FI);
298 TESTIT_COMPLEX_R2 (1, cpow, -1.23456F + 2.34567FI, 2.34567 - 1.23456FI, -110.629847F + -57.021655FI);
299 TESTIT_COMPLEX_R2 (1, cpow, -1.23456F - 2.34567FI, 2.34567 - 1.23456FI, 0.752336F + 0.199095FI);
301 return 0;