OSDN Git Service

2007-07-06 Josh Conner <jconner@apple.com>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / builtins-20.c
1 /* Copyright (C) 2003  Free Software Foundation.
2
3    Verify that built-in math function constant folding doesn't break
4    anything and produces the expected results.
5
6    Written by Roger Sayle, 8th June 2003.  */
7
8 /* { dg-do link } */
9 /* { dg-options "-O2 -ffast-math" } */
10 /* { dg-options "-O2 -ffast-math -mmacosx-version-min=10.3" { target powerpc-*-darwin* } } */
11 /* { dg-options "-O2 -ffast-math -std=c99" { target *-*-solaris2* } } */
12
13 #include "builtins-config.h"
14
15 extern double cos (double);
16 extern double sin (double);
17 extern double tan (double);
18 extern double fabs (double);
19 extern double atan2 (double, double);
20 extern double copysign (double, double);
21 extern double fmin (double, double);
22 extern double fmax (double, double);
23 extern double hypot (double, double);
24 extern double pure (double) __attribute__ ((__pure__));
25 extern double carg (__complex__ double);
26 extern __complex__ double ccos (__complex__ double);
27 extern __complex__ double ctan (__complex__ double);
28 extern float cosf (float);
29 extern float sinf (float);
30 extern float tanf (float);
31 extern float fabsf (float);
32 extern float atan2f (float, float);
33 extern float copysignf (float, float);
34 extern float fminf (float, float);
35 extern float fmaxf (float, float);
36 extern float hypotf (float, float);
37 extern float puref (float) __attribute__ ((__pure__));
38 extern float cargf (__complex__ float);
39 extern __complex__ float ccosf (__complex__ float);
40 extern __complex__ float ctanf (__complex__ float);
41 extern long double cosl (long double);
42 extern long double sinl (long double);
43 extern long double tanl (long double);
44 extern long double fabsl (long double);
45 extern long double atan2l (long double, long double);
46 extern long double copysignl (long double, long double);
47 extern long double fminl (long double, long double);
48 extern long double fmaxl (long double, long double);
49 extern long double hypotl (long double, long double);
50 extern long double purel (long double) __attribute__ ((__pure__));
51 extern long double cargl (__complex__ long double);
52 extern __complex__ long double ccosl (__complex__ long double);
53 extern __complex__ long double ctanl (__complex__ long double);
54
55 extern void link_error(void);
56
57 void test1(double x)
58 {
59   if (cos(x) != cos(-x))
60     link_error ();
61
62   if (cos(x) != cos(fabs(x)))
63     link_error ();
64
65   if (cos(x) != cos(-fabs(x)))
66     link_error ();
67
68   if (cos(tan(x)) != cos(tan(-fabs(x))))
69     link_error ();
70
71   if (sin(x)/cos(x) != tan(x))
72     link_error ();
73
74   if (cos(x)/sin(x) != 1.0/tan(x))
75     link_error ();
76
77   if (tan(x)*cos(x) != sin(x))
78     link_error ();
79
80   if (cos(x)*tan(x) != sin(x))
81     link_error ();
82
83   if (sin(x)/tan(x) != cos(x))
84     link_error ();
85
86   if (tan(x)/sin(x) != 1.0/cos(x))
87     link_error ();
88 }
89
90 void test2(double x, double y)
91 {
92   if (-tan(x-y) != tan(y-x))
93     link_error ();
94
95   if (-sin(x-y) != sin(y-x))
96     link_error ();
97
98   if (cos(-x*y) != cos(x*y))
99     link_error ();
100
101   if (cos(x*-y) != cos(x*y))
102     link_error ();
103
104   if (cos(-x/y) != cos(x/y))
105     link_error ();
106
107   if (cos(x/-y) != cos(x/y))
108     link_error ();
109
110   if (cos(-fabs(tan(x/-y))) != cos(tan(x/y)))
111     link_error ();
112
113   if (cos(y<10 ? -x : y) != cos(y<10 ? x : y))
114     link_error ();
115
116   if (cos(y<10 ? x : -y) != cos(y<10 ? x : y))
117     link_error ();
118
119   if (cos(y<10 ? -fabs(x) : tan(x<20 ? -x : -fabs(y)))
120       != cos(y<10 ? x : tan(x<20 ? x : y)))
121     link_error ();
122
123   if (cos((y*=3, -x)) != cos((y*=3,x)))
124     link_error ();
125
126   if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y))))
127     link_error ();
128
129   if (cos(copysign(x,y)) != cos(x))
130     link_error ();
131
132   if (cos(copysign(-fabs(x),y*=2)) != cos((y*=2,x)))
133     link_error ();
134
135   if (hypot (x, 0) != fabs(x))
136     link_error ();
137
138   if (hypot (0, x) != fabs(x))
139     link_error ();
140
141   if (hypot (x, x) != fabs(x) * __builtin_sqrt(2))
142     link_error ();
143
144   if (hypot (-x, y) != hypot (x, y))
145     link_error ();
146
147   if (hypot (x, -y) != hypot (x, y))
148     link_error ();
149
150   if (hypot (-x, -y) != hypot (x, y))
151     link_error ();
152
153   if (hypot (fabs(x), y) != hypot (x, y))
154     link_error ();
155
156   if (hypot (x, fabs(y)) != hypot (x, y))
157     link_error ();
158
159   if (hypot (fabs(x), fabs(y)) != hypot (x, y))
160     link_error ();
161
162   if (hypot (-fabs(-x), -fabs(fabs(fabs(-y)))) != hypot (x, y))
163     link_error ();
164
165   if (hypot (-x, 0) != fabs(x))
166     link_error ();
167
168   if (hypot (-x, x) != fabs(x) * __builtin_sqrt(2))
169     link_error ();
170
171   if (hypot (pure(x), -pure(x)) != fabs(pure(x)) * __builtin_sqrt(2))
172     link_error ();
173
174   if (hypot (tan(-x), tan(-fabs(y))) != hypot (tan(x), tan(y)))
175     link_error ();
176
177   if (fmin (fmax(x,y),y) != y)
178     link_error ();
179
180   if (fmin (fmax(y,x),y) != y)
181     link_error ();
182
183   if (fmin (x,fmax(x,y)) != x)
184     link_error ();
185   
186   if (fmin (x,fmax(y,x)) != x)
187     link_error ();
188   
189   if (fmax (fmin(x,y),y) != y)
190     link_error ();
191
192   if (fmax (fmin(y,x),y) != y)
193     link_error ();
194
195   if (fmax (x,fmin(x,y)) != x)
196     link_error ();
197   
198   if (fmax (x,fmin(y,x)) != x)
199     link_error ();
200
201   if ((__complex__ double) x != -(__complex__ double) (-x))
202     link_error ();
203
204   if (x*1i != -(-x*1i))
205     link_error ();
206
207   if (x+(x-y)*1i != -(-x+(y-x)*1i))
208     link_error ();
209
210   if (x+(x-y)*1i != -(-x-(x-y)*1i))
211     link_error ();
212
213   if (ccos(tan(x)+sin(y)*1i) != ccos(-tan(-x)+-sin(-y)*1i))
214     link_error ();
215
216   if (ccos(tan(x)+sin(x-y)*1i) != ccos(-tan(-x)-sin(y-x)*1i))
217     link_error ();
218
219   if (-5+x*1i != -~(5+x*1i))
220     link_error ();
221
222   if (tan(x)+tan(y)*1i != -~(tan(-x)+tan(y)*1i))
223     link_error ();
224 }
225
226 void test3(__complex__ double x, __complex__ double y, int i)
227 {
228   if (carg(x) != atan2(__imag__ x, __real__ x))
229     link_error ();
230
231   if (ccos(x) != ccos(-x))
232     link_error();
233
234   if (ccos(ctan(x)) != ccos(ctan(-x)))
235     link_error();
236
237   if (ctan(x-y) != -ctan(y-x))
238     link_error();
239
240   if (ccos(x/y) != ccos(-x/y))
241     link_error();
242
243   if (ccos(x/y) != ccos(x/-y))
244     link_error();
245
246   if (ccos(x/ctan(y)) != ccos(-x/ctan(-y)))
247     link_error();
248
249   if (ccos(x*y) != ccos(-x*y))
250     link_error();
251
252   if (ccos(x*y) != ccos(x*-y))
253     link_error();
254
255   if (ccos(ctan(x)*y) != ccos(ctan(-x)*-y))
256     link_error();
257
258   if (ccos(ctan(x/y)) != ccos(-ctan(x/-y)))
259     link_error();
260
261   if (ccos(i ? x : y) != ccos(i ? -x : y))
262     link_error();
263
264   if (ccos(i ? x : y) != ccos(i ? x : -y))
265     link_error();
266
267   if (ccos(i ? x : ctan(y/x)) != ccos(i ? -x : -ctan(-y/x)))
268     link_error();
269
270   if (~x != -~-x)
271     link_error();
272
273   if (ccos(~x) != ccos(-~-x))
274     link_error();
275
276   if (ctan(~(x-y)) != -ctan(~(y-x)))
277     link_error();
278
279   if (ctan(~(x/y)) != -ctan(~(x/-y)))
280     link_error();
281 }
282
283 void test1f(float x)
284 {
285   if (cosf(x) != cosf(-x))
286     link_error ();
287
288   if (cosf(x) != cosf(fabsf(x)))
289     link_error ();
290
291   if (cosf(x) != cosf(-fabsf(x)))
292     link_error ();
293
294   if (cosf(tanf(x)) != cosf(tanf(-fabsf(x))))
295     link_error ();
296
297 #ifdef HAVE_C99_RUNTIME
298   if (sinf(x)/cosf(x) != tanf(x))
299     link_error ();
300
301   if (cosf(x)/sinf(x) != 1.0f/tanf(x))
302     link_error ();
303
304   if (tanf(x)*cosf(x) != sinf(x))
305     link_error ();
306
307   if (cosf(x)*tanf(x) != sinf(x))
308     link_error ();
309
310   if (sinf(x)/tanf(x) != cosf(x))
311     link_error ();
312
313   if (tanf(x)/sinf(x) != 1.0f/cosf(x))
314     link_error ();
315 #endif
316 }
317
318 void test2f(float x, float y)
319 {
320   if (-tanf(x-y) != tanf(y-x))
321     link_error ();
322
323   if (-sinf(x-y) != sinf(y-x))
324     link_error ();
325
326   if (cosf(-x*y) != cosf(x*y))
327     link_error ();
328
329   if (cosf(x*-y) != cosf(x*y))
330     link_error ();
331
332   if (cosf(-x/y) != cosf(x/y))
333     link_error ();
334
335   if (cosf(x/-y) != cosf(x/y))
336     link_error ();
337
338   if (cosf(-fabsf(tanf(x/-y))) != cosf(tanf(x/y)))
339     link_error ();
340
341   if (cosf(y<10 ? -x : y) != cosf(y<10 ? x : y))
342     link_error ();
343
344   if (cosf(y<10 ? x : -y) != cosf(y<10 ? x : y))
345     link_error ();
346
347   if (cosf(y<10 ? -fabsf(x) : tanf(x<20 ? -x : -fabsf(y)))
348       != cosf(y<10 ? x : tanf(x<20 ? x : y)))
349     link_error ();
350
351   if (cosf((y*=3, -x)) != cosf((y*=3,x)))
352     link_error ();
353
354   if (cosf((y*=2, -fabsf(tanf(x/-y)))) != cosf((y*=2,tanf(x/y))))
355     link_error ();
356
357   if (cosf(copysignf(x,y)) != cosf(x))
358     link_error ();
359
360   if (cosf(copysignf(-fabsf(x),y*=2)) != cosf((y*=2,x)))
361     link_error ();
362
363   if (hypotf (x, 0) != fabsf(x))
364     link_error ();
365
366   if (hypotf (0, x) != fabsf(x))
367     link_error ();
368
369   if (hypotf (x, x) != fabsf(x) * __builtin_sqrtf(2))
370     link_error ();
371
372   if (hypotf (-x, y) != hypotf (x, y))
373     link_error ();
374
375   if (hypotf (x, -y) != hypotf (x, y))
376     link_error ();
377
378   if (hypotf (-x, -y) != hypotf (x, y))
379     link_error ();
380
381   if (hypotf (fabsf(x), y) != hypotf (x, y))
382     link_error ();
383
384   if (hypotf (x, fabsf(y)) != hypotf (x, y))
385     link_error ();
386
387   if (hypotf (fabsf(x), fabsf(y)) != hypotf (x, y))
388     link_error ();
389
390   if (hypotf (-fabsf(-x), -fabsf(fabsf(fabsf(-y)))) != hypotf (x, y))
391     link_error ();
392
393   if (hypotf (-x, 0) != fabsf(x))
394     link_error ();
395
396   if (hypotf (-x, x) != fabsf(x) * __builtin_sqrtf(2))
397     link_error ();
398
399   if (hypotf (puref(x), -puref(x)) != fabsf(puref(x)) * __builtin_sqrtf(2))
400     link_error ();
401
402   if (hypotf (tanf(-x), tanf(-fabsf(y))) != hypotf (tanf(x), tanf(y)))
403     link_error ();
404
405   if (fminf (fmaxf(x,y),y) != y)
406     link_error ();
407
408   if (fminf (fmaxf(y,x),y) != y)
409     link_error ();
410
411   if (fminf (x,fmaxf(x,y)) != x)
412     link_error ();
413   
414   if (fminf (x,fmaxf(y,x)) != x)
415     link_error ();
416   
417   if (fmaxf (fminf(x,y),y) != y)
418     link_error ();
419
420   if (fmaxf (fminf(y,x),y) != y)
421     link_error ();
422
423   if (fmaxf (x,fminf(x,y)) != x)
424     link_error ();
425   
426   if (fmaxf (x,fminf(y,x)) != x)
427     link_error ();
428
429   if ((__complex__ float) x != -(__complex__ float) (-x))
430     link_error ();
431
432   if (x+(x-y)*1i != -(-x+(y-x)*1i))
433     link_error ();
434
435   if (x+(x-y)*1i != -(-x-(x-y)*1i))
436     link_error ();
437
438   if (ccosf(tanf(x)+sinf(y)*1i) != ccosf(-tanf(-x)+-sinf(-y)*1i))
439     link_error ();
440
441   if (ccosf(tanf(x)+sinf(x-y)*1i) != ccosf(-tanf(-x)-sinf(y-x)*1i))
442     link_error ();
443
444   if (-5+x*1i != -~(5+x*1i))
445     link_error ();
446
447   if (tanf(x)+tanf(y)*1i != -~(tanf(-x)+tanf(y)*1i))
448     link_error ();
449 }
450
451 void test3f(__complex__ float x, __complex__ float y, int i)
452 {
453   if (cargf(x) != atan2f(__imag__ x, __real__ x))
454     link_error ();
455
456   if (ccosf(x) != ccosf(-x))
457     link_error();
458
459   if (ccosf(ctanf(x)) != ccosf(ctanf(-x)))
460     link_error();
461
462   if (ctanf(x-y) != -ctanf(y-x))
463     link_error();
464
465   if (ccosf(x/y) != ccosf(-x/y))
466     link_error();
467
468   if (ccosf(x/y) != ccosf(x/-y))
469     link_error();
470
471   if (ccosf(x/ctanf(y)) != ccosf(-x/ctanf(-y)))
472     link_error();
473
474   if (ccosf(x*y) != ccosf(-x*y))
475     link_error();
476
477   if (ccosf(x*y) != ccosf(x*-y))
478     link_error();
479
480   if (ccosf(ctanf(x)*y) != ccosf(ctanf(-x)*-y))
481     link_error();
482
483   if (ccosf(ctanf(x/y)) != ccosf(-ctanf(x/-y)))
484     link_error();
485
486   if (ccosf(i ? x : y) != ccosf(i ? -x : y))
487     link_error();
488
489   if (ccosf(i ? x : y) != ccosf(i ? x : -y))
490     link_error();
491
492   if (ccosf(i ? x : ctanf(y/x)) != ccosf(i ? -x : -ctanf(-y/x)))
493     link_error();
494
495   if (~x != -~-x)
496     link_error();
497
498   if (ccosf(~x) != ccosf(-~-x))
499     link_error();
500
501   if (ctanf(~(x-y)) != -ctanf(~(y-x)))
502     link_error();
503
504   if (ctanf(~(x/y)) != -ctanf(~(x/-y)))
505     link_error();
506 }
507
508 void test1l(long double x)
509 {
510   if (cosl(x) != cosl(-x))
511     link_error ();
512
513   if (cosl(x) != cosl(fabsl(x)))
514     link_error ();
515
516   if (cosl(x) != cosl(-fabsl(x)))
517     link_error ();
518
519   if (cosl(tanl(x)) != cosl(tanl(-fabsl(x))))
520     link_error ();
521
522 #ifdef HAVE_C99_RUNTIME
523   if (sinl(x)/cosl(x) != tanl(x))
524     link_error ();
525
526   if (cosl(x)/sinl(x) != 1.0l/tanl(x))
527     link_error ();
528
529   if (tanl(x)*cosl(x) != sinl(x))
530     link_error ();
531
532   if (cosl(x)*tanl(x) != sinl(x))
533     link_error ();
534
535   if (sinl(x)/tanl(x) != cosl(x))
536     link_error ();
537
538   if (tanl(x)/sinl(x) != 1.0l/cosl(x))
539     link_error ();
540 #endif
541 }
542
543 void test2l(long double x, long double y)
544 {
545   if (-tanl(x-y) != tanl(y-x))
546     link_error ();
547
548   if (-sinl(x-y) != sinl(y-x))
549     link_error ();
550
551   if (cosl(-x*y) != cosl(x*y))
552     link_error ();
553
554   if (cosl(x*-y) != cosl(x*y))
555     link_error ();
556
557   if (cosl(-x/y) != cosl(x/y))
558     link_error ();
559
560   if (cosl(x/-y) != cosl(x/y))
561     link_error ();
562
563   if (cosl(-fabsl(tanl(x/-y))) != cosl(tanl(x/y)))
564     link_error ();
565
566   if (cosl(y<10 ? -x : y) != cosl(y<10 ? x : y))
567     link_error ();
568
569   if (cosl(y<10 ? x : -y) != cosl(y<10 ? x : y))
570     link_error ();
571
572   if (cosl(y<10 ? -fabsl(x) : tanl(x<20 ? -x : -fabsl(y)))
573       != cosl(y<10 ? x : tanl(x<20 ? x : y)))
574     link_error ();
575
576   if (cosl((y*=3, -x)) != cosl((y*=3,x)))
577     link_error ();
578
579   if (cosl((y*=2, -fabsl(tanl(x/-y)))) != cosl((y*=2,tanl(x/y))))
580     link_error ();
581
582   if (cosl(copysignl(x,y)) != cosl(x))
583     link_error ();
584
585   if (cosl(copysignl(-fabsl(x),y*=2)) != cosl((y*=2,x)))
586     link_error ();
587
588   if (hypotl (x, 0) != fabsl(x))
589     link_error ();
590
591   if (hypotl (0, x) != fabsl(x))
592     link_error ();
593
594   if (hypotl (x, x) != fabsl(x) * __builtin_sqrtl(2))
595     link_error ();
596
597   if (hypotl (-x, y) != hypotl (x, y))
598     link_error ();
599
600   if (hypotl (x, -y) != hypotl (x, y))
601     link_error ();
602
603   if (hypotl (-x, -y) != hypotl (x, y))
604     link_error ();
605
606   if (hypotl (fabsl(x), y) != hypotl (x, y))
607     link_error ();
608
609   if (hypotl (x, fabsl(y)) != hypotl (x, y))
610     link_error ();
611
612   if (hypotl (fabsl(x), fabsl(y)) != hypotl (x, y))
613     link_error ();
614
615   if (hypotl (-fabsl(-x), -fabsl(fabsl(fabsl(-y)))) != hypotl (x, y))
616     link_error ();
617
618   if (hypotl (-x, 0) != fabsl(x))
619     link_error ();
620
621   if (hypotl (-x, x) != fabsl(x) * __builtin_sqrtl(2))
622     link_error ();
623
624   if (hypotl (purel(x), -purel(x)) != fabsl(purel(x)) * __builtin_sqrtl(2))
625     link_error ();
626
627   if (hypotl (tanl(-x), tanl(-fabsl(y))) != hypotl (tanl(x), tanl(y)))
628     link_error ();
629
630   if (fminl (fmaxl(x,y),y) != y)
631     link_error ();
632
633   if (fminl (fmaxl(y,x),y) != y)
634     link_error ();
635
636   if (fminl (x,fmaxl(x,y)) != x)
637     link_error ();
638   
639   if (fminl (x,fmaxl(y,x)) != x)
640     link_error ();
641   
642   if (fmaxl (fminl(x,y),y) != y)
643     link_error ();
644
645   if (fmaxl (fminl(y,x),y) != y)
646     link_error ();
647
648   if (fmaxl (x,fminl(x,y)) != x)
649     link_error ();
650   
651   if (fmaxl (x,fminl(y,x)) != x)
652     link_error ();
653
654   if ((__complex__ long double) x != -(__complex__ long double) (-x))
655     link_error ();
656
657   if (x+(x-y)*1i != -(-x+(y-x)*1i))
658     link_error ();
659
660   if (x+(x-y)*1i != -(-x-(x-y)*1i))
661     link_error ();
662
663   if (ccosl(tanl(x)+sinl(y)*1i) != ccosl(-tanl(-x)+-sinl(-y)*1i))
664     link_error ();
665
666   if (ccosl(tanl(x)+sinl(x-y)*1i) != ccosl(-tanl(-x)-sinl(y-x)*1i))
667     link_error ();
668
669   if (-5+x*1i != -~(5+x*1i))
670     link_error ();
671
672   if (tanl(x)+tanl(y)*1i != -~(tanl(-x)+tanl(y)*1i))
673     link_error ();
674 }
675
676 void test3l(__complex__ long double x, __complex__ long double y, int i)
677 {
678   if (cargl(x) != atan2l(__imag__ x, __real__ x))
679     link_error ();
680
681   if (ccosl(x) != ccosl(-x))
682     link_error();
683
684   if (ccosl(ctanl(x)) != ccosl(ctanl(-x)))
685     link_error();
686
687   if (ctanl(x-y) != -ctanl(y-x))
688     link_error();
689
690   if (ccosl(x/y) != ccosl(-x/y))
691     link_error();
692
693   if (ccosl(x/y) != ccosl(x/-y))
694     link_error();
695
696   if (ccosl(x/ctanl(y)) != ccosl(-x/ctanl(-y)))
697     link_error();
698
699   if (ccosl(x*y) != ccosl(-x*y))
700     link_error();
701
702   if (ccosl(x*y) != ccosl(x*-y))
703     link_error();
704
705   if (ccosl(ctanl(x)*y) != ccosl(ctanl(-x)*-y))
706     link_error();
707
708   if (ccosl(ctanl(x/y)) != ccosl(-ctanl(x/-y)))
709     link_error();
710
711   if (ccosl(i ? x : y) != ccosl(i ? -x : y))
712     link_error();
713
714   if (ccosl(i ? x : y) != ccosl(i ? x : -y))
715     link_error();
716
717   if (ccosl(i ? x : ctanl(y/x)) != ccosl(i ? -x : -ctanl(-y/x)))
718     link_error();
719
720   if (~x != -~-x)
721     link_error();
722
723   if (ccosl(~x) != ccosl(-~-x))
724     link_error();
725
726   if (ctanl(~(x-y)) != -ctanl(~(y-x)))
727     link_error();
728
729   if (ctanl(~(x/y)) != -ctanl(~(x/-y)))
730     link_error();
731 }
732
733 int main()
734 {
735   test1 (1.0);
736   test2 (1.0, 2.0);
737
738   test1f (1.0f);
739   test2f (1.0f, 2.0f);
740
741   test1l (1.0l);
742   test2l (1.0l, 2.0l);
743
744   return 0;
745 }
746