OSDN Git Service

PR target/16144
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / builtin-convert-3.c
1 /* Copyright (C) 2004  Free Software Foundation.
2
3    Verify that builtin math functions (with fixed point return types)
4    are converted to smaller FP types correctly by the compiler.
5
6    Written by Kaveh Ghazi, 2004-05-01.  */
7
8 /* { dg-do link } */
9 /* { dg-options "-ffast-math" } */
10
11 #include "../builtins-config.h"
12
13 #define PROTOTYPE1_RET(FN, RET) \
14   extern RET FN(double); \
15   extern RET FN##f(float); \
16   extern RET FN##l(long double);
17
18 /* Test converting math builtins to narrower FP types based on if the
19    argument is a narrower type (perhaps implicitly) cast to a wider
20    one.  */
21 #define INNER_CAST1(MATHFN, RET) \
22  PROTOTYPE1_RET (MATHFN, RET); \
23  extern void link_failure_inner_##MATHFN##l_##MATHFN(void); \
24  extern void link_failure_inner_##MATHFN##l_##MATHFN##f(void); \
25  extern void link_failure_inner_##MATHFN##_##MATHFN##f(void); \
26  if (sizeof (long double) > sizeof (double) \
27      && MATHFN##l(d1) != MATHFN(d1)) \
28     link_failure_inner_##MATHFN##l_##MATHFN(); \
29  if (sizeof (long double) > sizeof (float) \
30      && MATHFN##l(f1) != MATHFN##f(f1)) \
31     link_failure_inner_##MATHFN##l_##MATHFN##f(); \
32  if (sizeof (long double) > sizeof (float) \
33      && MATHFN##l((double)f1) != MATHFN##f(f1)) \
34     link_failure_inner_##MATHFN##l_##MATHFN##f(); \
35  if (sizeof (double) > sizeof (float) \
36      && MATHFN(f1) != MATHFN##f(f1)) \
37     link_failure_inner_##MATHFN##_##MATHFN##f()
38
39 void __attribute__ ((__noinline__)) test (double d1, float f1)
40 {
41 #ifdef __OPTIMIZE__
42 #ifdef HAVE_C99_RUNTIME
43   /* We're converting to implicitly generated C99 functions.  */
44   INNER_CAST1 (lround, long);
45   INNER_CAST1 (llround, long long);
46   INNER_CAST1 (lrint, long);
47   INNER_CAST1 (llrint, long long);
48 #endif /* HAVE_C99_RUNTIME */
49 #endif /* __OPTIMIZE__ */
50 }
51
52 int main (void)
53 {
54   test (1, 2);
55   return 0;
56 }