1 /* Copyright (C) 2004 Free Software Foundation.
3 Verify that builtin math functions (with fixed point return types)
4 are converted to smaller FP types correctly by the compiler.
6 Written by Kaveh Ghazi, 2004-05-01. */
9 /* { dg-options "-ffast-math" } */
10 /* { dg-add-options c99_runtime } */
12 #include "../builtins-config.h"
14 #define PROTOTYPE1_RET(FN, RET) \
15 extern RET FN(double); \
16 extern RET FN##f(float); \
17 extern RET FN##l(long double);
19 /* Test converting math builtins to narrower FP types based on if the
20 argument is a narrower type (perhaps implicitly) cast to a wider
22 #define INNER_CAST1(MATHFN, RET) \
23 PROTOTYPE1_RET (MATHFN, RET); \
24 extern void link_failure_inner_##MATHFN##l_##MATHFN(void); \
25 extern void link_failure_inner_##MATHFN##l_##MATHFN##f(void); \
26 extern void link_failure_inner_##MATHFN##_##MATHFN##f(void); \
27 if (sizeof (long double) > sizeof (double) \
28 && MATHFN##l(d1) != MATHFN(d1)) \
29 link_failure_inner_##MATHFN##l_##MATHFN(); \
30 if (sizeof (long double) > sizeof (float) \
31 && MATHFN##l(f1) != MATHFN##f(f1)) \
32 link_failure_inner_##MATHFN##l_##MATHFN##f(); \
33 if (sizeof (long double) > sizeof (float) \
34 && MATHFN##l((double)f1) != MATHFN##f(f1)) \
35 link_failure_inner_##MATHFN##l_##MATHFN##f(); \
36 if (sizeof (double) > sizeof (float) \
37 && MATHFN(f1) != MATHFN##f(f1)) \
38 link_failure_inner_##MATHFN##_##MATHFN##f()
40 void __attribute__ ((__noinline__
)) test (double d1
, float f1
)
43 #ifdef HAVE_C99_RUNTIME
44 /* We're converting to implicitly generated C99 functions. */
45 INNER_CAST1 (__builtin_lceil
, long);
46 INNER_CAST1 (__builtin_llceil
, long long);
47 INNER_CAST1 (__builtin_lfloor
, long);
48 INNER_CAST1 (__builtin_llfloor
, long long);
49 INNER_CAST1 (lround
, long);
50 INNER_CAST1 (llround
, long long);
51 INNER_CAST1 (lrint
, long);
52 INNER_CAST1 (llrint
, long long);
53 #endif /* HAVE_C99_RUNTIME */
54 #endif /* __OPTIMIZE__ */