builtins.def (lceil, [...]): Mark with ATTR_CONST_NOTHROW_LIST.

* builtins.def (lceil, lceilf, lceill, lfloor, lfloorf, lfloorl,
	llceil, llceilf, llceill, llfloor, llfloorf, llfloorl): Mark with
	ATTR_CONST_NOTHROW_LIST.
	
	* fold-const.c (tree_expr_nonnegative_warnv_p): Handle
	FIX_TRUNC_EXPR.

testsuite:
	* gcc.dg/builtins-55.c: Test *lceil* and *lfloor*.
	* gcc.dg/torture/builtin-attr-1.c: Likewise.
	* gcc.dg/torture/builtin-convert-1.c: Likewise.  Also test *lrint* and *lround*.
	* gcc.dg/torture/builtin-convert-2.c: Test ceil->lceil and floor->lfloor.
	* gcc.dg/torture/builtin-convert-3.c: Test *lceil* and *lfloor*.
	* gcc.dg/torture/builtin-integral-1.c: Likewise.
	* gcc.dg/torture/builtin-minmax-1.c: Likewise.  Also test *lrint*
	and *lround*.  Correct macro names.
	* gcc.dg/torture/builtin-nonneg-1.c: Test *lceil* and *lfloor*.
	* gcc.dg/torture/builtin-rounding-1.c: Likewise.

From-SVN: r122713
This commit is contained in:
Kaveh R. Ghazi 2007-03-08 21:37:28 +00:00 committed by Kaveh Ghazi
parent f53e867d73
commit aeabd15d45
13 changed files with 188 additions and 127 deletions

View File

@ -1,3 +1,12 @@
2007-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.def (lceil, lceilf, lceill, lfloor, lfloorf, lfloorl,
llceil, llceilf, llceill, llfloor, llfloorf, llfloorl): Mark with
ATTR_CONST_NOTHROW_LIST.
* fold-const.c (tree_expr_nonnegative_warnv_p): Handle
FIX_TRUNC_EXPR.
2007-03-08 Diego Novillo <dnovillo@redhat.com> 2007-03-08 Diego Novillo <dnovillo@redhat.com>
* doc/tree-ssa.texi: Remove documentation for V_MUST_DEF. * doc/tree-ssa.texi: Remove documentation for V_MUST_DEF.

View File

@ -282,24 +282,24 @@ DEF_EXT_LIB_BUILTIN (BUILT_IN_J1L, "j1l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_M
DEF_EXT_LIB_BUILTIN (BUILT_IN_JN, "jn", BT_FN_DOUBLE_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_EXT_LIB_BUILTIN (BUILT_IN_JN, "jn", BT_FN_DOUBLE_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_EXT_LIB_BUILTIN (BUILT_IN_JNF, "jnf", BT_FN_FLOAT_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_EXT_LIB_BUILTIN (BUILT_IN_JNF, "jnf", BT_FN_FLOAT_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_EXT_LIB_BUILTIN (BUILT_IN_JNL, "jnl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_EXT_LIB_BUILTIN (BUILT_IN_JNL, "jnl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_GCC_BUILTIN (BUILT_IN_LCEIL, "lceil", BT_FN_LONG_DOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LCEIL, "lceil", BT_FN_LONG_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LCEILF, "lceilf", BT_FN_LONG_FLOAT, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LCEILF, "lceilf", BT_FN_LONG_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LCEILL, "lceill", BT_FN_LONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LCEILL, "lceill", BT_FN_LONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_LIB_BUILTIN (BUILT_IN_LDEXP, "ldexp", BT_FN_DOUBLE_DOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_LIB_BUILTIN (BUILT_IN_LDEXP, "ldexp", BT_FN_DOUBLE_DOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPF, "ldexpf", BT_FN_FLOAT_FLOAT_INT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPF, "ldexpf", BT_FN_FLOAT_FLOAT_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPL, "ldexpl", BT_FN_LONGDOUBLE_LONGDOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPL, "ldexpl", BT_FN_LONGDOUBLE_LONGDOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_GCC_BUILTIN (BUILT_IN_LFLOOR, "lfloor", BT_FN_LONG_DOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LFLOOR, "lfloor", BT_FN_LONG_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LFLOORF, "lfloorf", BT_FN_LONG_FLOAT, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LFLOORF, "lfloorf", BT_FN_LONG_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LFLOORL, "lfloorl", BT_FN_LONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LFLOORL, "lfloorl", BT_FN_LONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_LGAMMA, "lgamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_STORE) DEF_C99_BUILTIN (BUILT_IN_LGAMMA, "lgamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
DEF_C99_BUILTIN (BUILT_IN_LGAMMAF, "lgammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_STORE) DEF_C99_BUILTIN (BUILT_IN_LGAMMAF, "lgammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_STORE)
DEF_C99_BUILTIN (BUILT_IN_LGAMMAL, "lgammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE) DEF_C99_BUILTIN (BUILT_IN_LGAMMAL, "lgammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
DEF_GCC_BUILTIN (BUILT_IN_LLCEIL, "llceil", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLCEIL, "llceil", BT_FN_LONGLONG_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LLCEILF, "llceilf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLCEILF, "llceilf", BT_FN_LONGLONG_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LLCEILL, "llceill", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLCEILL, "llceill", BT_FN_LONGLONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LLFLOOR, "llfloor", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLFLOOR, "llfloor", BT_FN_LONGLONG_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LLFLOORF, "llfloorf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLFLOORF, "llfloorf", BT_FN_LONGLONG_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN (BUILT_IN_LLFLOORL, "llfloorl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING) DEF_GCC_BUILTIN (BUILT_IN_LLFLOORL, "llfloorl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_LLRINT, "llrint", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_BUILTIN (BUILT_IN_LLRINT, "llrint", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_C99_BUILTIN (BUILT_IN_LLRINTF, "llrintf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_BUILTIN (BUILT_IN_LLRINTF, "llrintf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
DEF_C99_BUILTIN (BUILT_IN_LLRINTL, "llrintl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_BUILTIN (BUILT_IN_LLRINTL, "llrintl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)

View File

@ -13256,6 +13256,7 @@ tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
case SAVE_EXPR: case SAVE_EXPR:
case NON_LVALUE_EXPR: case NON_LVALUE_EXPR:
case FLOAT_EXPR: case FLOAT_EXPR:
case FIX_TRUNC_EXPR:
return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0), return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
strict_overflow_p); strict_overflow_p);

View File

@ -1,3 +1,16 @@
2007-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/builtins-55.c: Test *lceil* and *lfloor*.
* gcc.dg/torture/builtin-attr-1.c: Likewise.
* gcc.dg/torture/builtin-convert-1.c: Likewise. Also test *lrint* and *lround*.
* gcc.dg/torture/builtin-convert-2.c: Test ceil->lceil and floor->lfloor.
* gcc.dg/torture/builtin-convert-3.c: Test *lceil* and *lfloor*.
* gcc.dg/torture/builtin-integral-1.c: Likewise.
* gcc.dg/torture/builtin-minmax-1.c: Likewise. Also test *lrint*
and *lround*. Correct macro names.
* gcc.dg/torture/builtin-nonneg-1.c: Test *lceil* and *lfloor*.
* gcc.dg/torture/builtin-rounding-1.c: Likewise.
2007-03-08 Ian Lance Taylor <iant@google.com> 2007-03-08 Ian Lance Taylor <iant@google.com>
* gcc.dg/no-strict-overflow-5.c: New test. * gcc.dg/no-strict-overflow-5.c: New test.

View File

@ -32,6 +32,10 @@ void test(double x)
if (sizeof(long) != sizeof(long long)) if (sizeof(long) != sizeof(long long))
return; return;
if (__builtin_lceil(x) != __builtin_llceil(x))
link_error();
if (__builtin_lfloor(x) != __builtin_llfloor(x))
link_error();
if (lround(x) != llround(x)) if (lround(x) != llround(x))
link_error(); link_error();
if (lrint(x) != llrint(x)) if (lrint(x) != llrint(x))
@ -45,6 +49,10 @@ void testf(float x)
if (sizeof(long) != sizeof(long long)) if (sizeof(long) != sizeof(long long))
return; return;
if (__builtin_lceilf(x) != __builtin_llceilf(x))
link_error();
if (__builtin_lfloorf(x) != __builtin_llfloorf(x))
link_error();
if (lroundf(x) != llroundf(x)) if (lroundf(x) != llroundf(x))
link_error(); link_error();
if (lrintf(x) != llrintf(x)) if (lrintf(x) != llrintf(x))
@ -58,6 +66,10 @@ void testl(long double x)
if (sizeof(long) != sizeof(long long)) if (sizeof(long) != sizeof(long long))
return; return;
if (__builtin_lceill(x) != __builtin_llceill(x))
link_error();
if (__builtin_lfloorl(x) != __builtin_llfloorl(x))
link_error();
if (lroundl(x) != llroundl(x)) if (lroundl(x) != llroundl(x))
link_error(); link_error();
if (lrintl(x) != llrintl(x)) if (lrintl(x) != llrintl(x))

View File

@ -344,6 +344,8 @@ FPTEST1 (j0)
FPTEST1 (j1) FPTEST1 (j1)
FPTEST2ARG1 (jn, int) FPTEST2ARG1 (jn, int)
FPTEST2ARG2 (ldexp, int) FPTEST2ARG2 (ldexp, int)
BUILTIN_FPTEST1 (llceil)
BUILTIN_FPTEST1 (llfloor)
FPTEST1T (llrint, long long) FPTEST1T (llrint, long long)
FPTEST1T (llround, long long) FPTEST1T (llround, long long)
FPTEST1 (log) FPTEST1 (log)
@ -351,6 +353,8 @@ FPTEST1 (log10)
FPTEST1 (log1p) FPTEST1 (log1p)
FPTEST1 (log2) FPTEST1 (log2)
FPTEST1 (logb) FPTEST1 (logb)
BUILTIN_FPTEST1 (lceil)
BUILTIN_FPTEST1 (lfloor)
FPTEST1T (lrint, long) FPTEST1T (lrint, long)
FPTEST1T (lround, long) FPTEST1T (lround, long)
BUILTIN_FPTEST1ARG (nan, char *) BUILTIN_FPTEST1ARG (nan, char *)

View File

@ -21,9 +21,6 @@
#define MAYBEC99(CODE, C99) (!(C99) && (CODE)) #define MAYBEC99(CODE, C99) (!(C99) && (CODE))
#endif #endif
#define PROTOTYPE1(FN) extern double FN(double); extern float FN##f(float); \
extern long double FN##l(long double);
void test(double d1, float f1, long double ld1) void test(double d1, float f1, long double ld1)
{ {
/* Test converting math builtins to narrower FP types based on a /* Test converting math builtins to narrower FP types based on a
@ -33,7 +30,6 @@ void test(double d1, float f1, long double ld1)
is only performed if the replacement function is actually is only performed if the replacement function is actually
narrower in width, so check that first. */ narrower in width, so check that first. */
#define OUTER_CAST1(MATHFN, C99) \ #define OUTER_CAST1(MATHFN, C99) \
PROTOTYPE1 (MATHFN) \
extern void link_failure_outer_##MATHFN##l_##MATHFN##_1(void); \ extern void link_failure_outer_##MATHFN##l_##MATHFN##_1(void); \
extern void link_failure_outer_##MATHFN##l_##MATHFN##_2(void); \ extern void link_failure_outer_##MATHFN##l_##MATHFN##_2(void); \
extern void link_failure_outer_##MATHFN##l_##MATHFN##f_1(void); \ extern void link_failure_outer_##MATHFN##l_##MATHFN##f_1(void); \
@ -41,52 +37,51 @@ void test(double d1, float f1, long double ld1)
extern void link_failure_outer_##MATHFN##_##MATHFN##f_1(void); \ extern void link_failure_outer_##MATHFN##_##MATHFN##f_1(void); \
extern void link_failure_outer_##MATHFN##_##MATHFN##f_2(void); \ extern void link_failure_outer_##MATHFN##_##MATHFN##f_2(void); \
if (sizeof (long double) > sizeof (double) \ if (sizeof (long double) > sizeof (double) \
&& MAYBEC99 ((double) MATHFN##l((double)ld1) != MATHFN(ld1), C99)) \ && MAYBEC99 ((double) __builtin_##MATHFN##l((double)ld1) != __builtin_##MATHFN(ld1), C99)) \
link_failure_outer_##MATHFN##l_##MATHFN##_1(); \ link_failure_outer_##MATHFN##l_##MATHFN##_1(); \
if (sizeof (long double) > sizeof (double) \ if (sizeof (long double) > sizeof (double) \
&& MAYBEC99 ((double) MATHFN##l(d1) != MATHFN(d1), C99)) \ && MAYBEC99 ((double) __builtin_##MATHFN##l(d1) != __builtin_##MATHFN(d1), C99)) \
link_failure_outer_##MATHFN##l_##MATHFN##_1(); \ link_failure_outer_##MATHFN##l_##MATHFN##_1(); \
if (sizeof (long double) > sizeof (double) \ if (sizeof (long double) > sizeof (double) \
&& MAYBEC99 ((double) MATHFN##l(f1) != MATHFN(f1), C99)) \ && MAYBEC99 ((double) __builtin_##MATHFN##l(f1) != __builtin_##MATHFN(f1), C99)) \
link_failure_outer_##MATHFN##l_##MATHFN##_2(); \ link_failure_outer_##MATHFN##l_##MATHFN##_2(); \
if (sizeof (long double) > sizeof (float) \ if (sizeof (long double) > sizeof (float) \
&& C99CODE ((float) MATHFN##l((float) ld1) != MATHFN##f(ld1))) \ && C99CODE ((float) __builtin_##MATHFN##l((float) ld1) != __builtin_##MATHFN##f(ld1))) \
link_failure_outer_##MATHFN##l_##MATHFN##f_1(); \ link_failure_outer_##MATHFN##l_##MATHFN##f_1(); \
if (sizeof (long double) > sizeof (float) \ if (sizeof (long double) > sizeof (float) \
&& C99CODE ((float) MATHFN##l((float) d1) != MATHFN##f(d1))) \ && C99CODE ((float) __builtin_##MATHFN##l((float) d1) != __builtin_##MATHFN##f(d1))) \
link_failure_outer_##MATHFN##l_##MATHFN##f_1(); \ link_failure_outer_##MATHFN##l_##MATHFN##f_1(); \
if (sizeof (long double) > sizeof (float) \ if (sizeof (long double) > sizeof (float) \
&& C99CODE ((float) MATHFN##l(f1) != MATHFN##f(f1))) \ && C99CODE ((float) __builtin_##MATHFN##l(f1) != __builtin_##MATHFN##f(f1))) \
link_failure_outer_##MATHFN##l_##MATHFN##f_2(); \ link_failure_outer_##MATHFN##l_##MATHFN##f_2(); \
if (sizeof (double) > sizeof (float) \ if (sizeof (double) > sizeof (float) \
&& C99CODE ((float) MATHFN((float) ld1) != MATHFN##f(ld1))) \ && C99CODE ((float) __builtin_##MATHFN((float) ld1) != __builtin_##MATHFN##f(ld1))) \
link_failure_outer_##MATHFN##_##MATHFN##f_1(); \ link_failure_outer_##MATHFN##_##MATHFN##f_1(); \
if (sizeof (double) > sizeof (float) \ if (sizeof (double) > sizeof (float) \
&& C99CODE ((float) MATHFN((float) d1) != MATHFN##f(d1))) \ && C99CODE ((float) __builtin_##MATHFN((float) d1) != __builtin_##MATHFN##f(d1))) \
link_failure_outer_##MATHFN##_##MATHFN##f_1(); \ link_failure_outer_##MATHFN##_##MATHFN##f_1(); \
if (sizeof (double) > sizeof (float) \ if (sizeof (double) > sizeof (float) \
&& C99CODE ((float) MATHFN(f1) != MATHFN##f(f1))) \ && C99CODE ((float) __builtin_##MATHFN(f1) != __builtin_##MATHFN##f(f1))) \
link_failure_outer_##MATHFN##_##MATHFN##f_2() link_failure_outer_##MATHFN##_##MATHFN##f_2()
/* Test converting math builtins to narrower FP types based on if /* Test converting math builtins to narrower FP types based on if
the argument is a narrower type (perhaps implicitly) cast to a the argument is a narrower type (perhaps implicitly) cast to a
wider one. */ wider one. */
#define INNER_CAST1(MATHFN, C99) \ #define INNER_CAST1(MATHFN, C99) \
PROTOTYPE1 (MATHFN) \
extern void link_failure_inner_##MATHFN##l_##MATHFN(void); \ extern void link_failure_inner_##MATHFN##l_##MATHFN(void); \
extern void link_failure_inner_##MATHFN##l_##MATHFN##f(void); \ extern void link_failure_inner_##MATHFN##l_##MATHFN##f(void); \
extern void link_failure_inner_##MATHFN##_##MATHFN##f(void); \ extern void link_failure_inner_##MATHFN##_##MATHFN##f(void); \
if (sizeof (long double) > sizeof (double) \ if (sizeof (long double) > sizeof (double) \
&& MAYBEC99 (MATHFN##l(d1) != (long double) MATHFN(d1), C99)) \ && MAYBEC99 (__builtin_##MATHFN##l(d1) != (long double) __builtin_##MATHFN(d1), C99)) \
link_failure_inner_##MATHFN##l_##MATHFN(); \ link_failure_inner_##MATHFN##l_##MATHFN(); \
if (sizeof (long double) > sizeof (float) \ if (sizeof (long double) > sizeof (float) \
&& C99CODE (MATHFN##l(f1) != (long double) MATHFN##f(f1))) \ && C99CODE (__builtin_##MATHFN##l(f1) != (long double) __builtin_##MATHFN##f(f1))) \
link_failure_inner_##MATHFN##l_##MATHFN##f(); \ link_failure_inner_##MATHFN##l_##MATHFN##f(); \
if (sizeof (long double) > sizeof (float) \ if (sizeof (long double) > sizeof (float) \
&& C99CODE (MATHFN##l((double)f1) != (long double) MATHFN##f(f1))) \ && C99CODE (__builtin_##MATHFN##l((double)f1) != (long double) __builtin_##MATHFN##f(f1))) \
link_failure_inner_##MATHFN##l_##MATHFN##f(); \ link_failure_inner_##MATHFN##l_##MATHFN##f(); \
if (sizeof (double) > sizeof (float) \ if (sizeof (double) > sizeof (float) \
&& C99CODE (MATHFN(f1) != (double) MATHFN##f(f1))) \ && C99CODE (__builtin_##MATHFN(f1) != (double) __builtin_##MATHFN##f(f1))) \
link_failure_inner_##MATHFN##_##MATHFN##f() link_failure_inner_##MATHFN##_##MATHFN##f()
@ -122,6 +117,22 @@ void test(double d1, float f1, long double ld1)
OUTER_CAST1 (ceil, /*C99=*/ 0); OUTER_CAST1 (ceil, /*C99=*/ 0);
INNER_CAST1 (floor, /*C99=*/ 0); INNER_CAST1 (floor, /*C99=*/ 0);
OUTER_CAST1 (floor, /*C99=*/ 0); OUTER_CAST1 (floor, /*C99=*/ 0);
INNER_CAST1 (lceil, /*C99=*/ 1);
OUTER_CAST1 (lceil, /*C99=*/ 1);
INNER_CAST1 (lfloor, /*C99=*/ 1);
OUTER_CAST1 (lfloor, /*C99=*/ 1);
INNER_CAST1 (lrint, /*C99=*/ 1);
OUTER_CAST1 (lrint, /*C99=*/ 1);
INNER_CAST1 (lround, /*C99=*/ 1);
OUTER_CAST1 (lround, /*C99=*/ 1);
INNER_CAST1 (llceil, /*C99=*/ 1);
OUTER_CAST1 (llceil, /*C99=*/ 1);
INNER_CAST1 (llfloor, /*C99=*/ 1);
OUTER_CAST1 (llfloor, /*C99=*/ 1);
INNER_CAST1 (llrint, /*C99=*/ 1);
OUTER_CAST1 (llrint, /*C99=*/ 1);
INNER_CAST1 (llround, /*C99=*/ 1);
OUTER_CAST1 (llround, /*C99=*/ 1);
INNER_CAST1 (nearbyint, /*C99=*/ 1); INNER_CAST1 (nearbyint, /*C99=*/ 1);
OUTER_CAST1 (nearbyint, /*C99=*/ 1); OUTER_CAST1 (nearbyint, /*C99=*/ 1);
INNER_CAST1 (rint, /*C99=*/ 1); INNER_CAST1 (rint, /*C99=*/ 1);

View File

@ -12,36 +12,26 @@
#include "../builtins-config.h" #include "../builtins-config.h"
#define PROTOTYPE(FN) extern double FN(double); \
extern float FN##f(float); \
extern long double FN##l(long double);
#define PROTOTYPE_RET(FN, RET) extern RET FN(double); \
extern RET FN##f(float); \
extern RET FN##l(long double);
/* Macro to do all FP type combinations. The second half tests /* Macro to do all FP type combinations. The second half tests
narrowing the FP type. */ narrowing the FP type. */
#define TEST_FP2FIXED(FN1, FN2) \ #define TEST_FP2FIXED(FN1, FN2) \
PROTOTYPE(FN1) \
PROTOTYPE_RET(FN2, long) \
PROTOTYPE_RET(l##FN2, long long) \
extern void link_error_##FN1##_##FN2(void); \ extern void link_error_##FN1##_##FN2(void); \
extern void link_error_##FN1##f_##FN2##f(void); \ extern void link_error_##FN1##f_##FN2##f(void); \
extern void link_error_##FN1##l_##FN2##l(void); \ extern void link_error_##FN1##l_##FN2##l(void); \
extern void link_error_##FN1##_l##FN2(void); \ extern void link_error_##FN1##_l##FN2(void); \
extern void link_error_##FN1##f_l##FN2##f(void); \ extern void link_error_##FN1##f_l##FN2##f(void); \
extern void link_error_##FN1##l_l##FN2##l(void); \ extern void link_error_##FN1##l_l##FN2##l(void); \
if ((long)FN1(d) != FN2(d)) \ if ((long)__builtin_##FN1(d) != __builtin_##FN2(d)) \
link_error_##FN1##_##FN2(); \ link_error_##FN1##_##FN2(); \
if ((long)FN1##f(f) != FN2##f(f)) \ if ((long)__builtin_##FN1##f(f) != __builtin_##FN2##f(f)) \
link_error_##FN1##f_##FN2##f(); \ link_error_##FN1##f_##FN2##f(); \
if ((long)FN1##l(ld) != FN2##l(ld)) \ if ((long)__builtin_##FN1##l(ld) != __builtin_##FN2##l(ld)) \
link_error_##FN1##l_##FN2##l(); \ link_error_##FN1##l_##FN2##l(); \
if ((long long)FN1(d) != l##FN2(d)) \ if ((long long)__builtin_##FN1(d) != __builtin_l##FN2(d)) \
link_error_##FN1##_l##FN2(); \ link_error_##FN1##_l##FN2(); \
if ((long long)FN1##f(f) != l##FN2##f(f)) \ if ((long long)__builtin_##FN1##f(f) != __builtin_l##FN2##f(f)) \
link_error_##FN1##f_l##FN2##f(); \ link_error_##FN1##f_l##FN2##f(); \
if ((long long)FN1##l(ld) != l##FN2##l(ld)) \ if ((long long)__builtin_##FN1##l(ld) != __builtin_l##FN2##l(ld)) \
link_error_##FN1##l_l##FN2##l(); \ link_error_##FN1##l_l##FN2##l(); \
extern void link_error_##FN1##_##FN2##f(void); \ extern void link_error_##FN1##_##FN2##f(void); \
extern void link_error_##FN1##l_##FN2(void); \ extern void link_error_##FN1##l_##FN2(void); \
@ -49,17 +39,23 @@
extern void link_error_##FN1##_l##FN2##f(void); \ extern void link_error_##FN1##_l##FN2##f(void); \
extern void link_error_##FN1##l_l##FN2(void); \ extern void link_error_##FN1##l_l##FN2(void); \
extern void link_error_##FN1##l_l##FN2##f(void); \ extern void link_error_##FN1##l_l##FN2##f(void); \
if (sizeof(double) > sizeof(float) && (long)FN1(f) != FN2##f(f)) \ if (sizeof(double) > sizeof(float) \
&& (long)__builtin_##FN1(f) != __builtin_##FN2##f(f)) \
link_error_##FN1##_##FN2##f(); \ link_error_##FN1##_##FN2##f(); \
if (sizeof(long double) > sizeof(double) && (long)FN1##l(d) != FN2(d)) \ if (sizeof(long double) > sizeof(double) \
&& (long)__builtin_##FN1##l(d) != __builtin_##FN2(d)) \
link_error_##FN1##l_##FN2(); \ link_error_##FN1##l_##FN2(); \
if (sizeof(long double) > sizeof(float) && (long)FN1##l(f) != FN2##f(f)) \ if (sizeof(long double) > sizeof(float) \
&& (long)__builtin_##FN1##l(f) != __builtin_##FN2##f(f)) \
link_error_##FN1##l_##FN2##f(); \ link_error_##FN1##l_##FN2##f(); \
if (sizeof(double) > sizeof(float) && (long long)FN1(f) != l##FN2##f(f)) \ if (sizeof(double) > sizeof(float) \
&& (long long)__builtin_##FN1(f) != __builtin_l##FN2##f(f)) \
link_error_##FN1##_l##FN2##f(); \ link_error_##FN1##_l##FN2##f(); \
if (sizeof(long double) > sizeof(double) && (long long)FN1##l(d) != l##FN2(d)) \ if (sizeof(long double) > sizeof(double) \
&& (long long)__builtin_##FN1##l(d) != __builtin_l##FN2(d)) \
link_error_##FN1##l_l##FN2(); \ link_error_##FN1##l_l##FN2(); \
if (sizeof(long double) > sizeof(float) && (long long)FN1##l(f) != l##FN2##f(f)) \ if (sizeof(long double) > sizeof(float) \
&& (long long)__builtin_##FN1##l(f) != __builtin_l##FN2##f(f)) \
link_error_##FN1##l_l##FN2##f() link_error_##FN1##l_l##FN2##f()
void __attribute__ ((__noinline__)) foo (double d, float f, long double ld) void __attribute__ ((__noinline__)) foo (double d, float f, long double ld)
@ -67,6 +63,8 @@ void __attribute__ ((__noinline__)) foo (double d, float f, long double ld)
#ifdef __OPTIMIZE__ #ifdef __OPTIMIZE__
# ifdef HAVE_C99_RUNTIME # ifdef HAVE_C99_RUNTIME
/* The resulting transformation functions are all C99. */ /* The resulting transformation functions are all C99. */
TEST_FP2FIXED (ceil, lceil);
TEST_FP2FIXED (floor, lfloor);
TEST_FP2FIXED (round, lround); TEST_FP2FIXED (round, lround);
TEST_FP2FIXED (nearbyint, lrint); TEST_FP2FIXED (nearbyint, lrint);
TEST_FP2FIXED (rint, lrint); TEST_FP2FIXED (rint, lrint);

View File

@ -43,6 +43,10 @@ void __attribute__ ((__noinline__)) test (double d1, float f1)
#ifdef __OPTIMIZE__ #ifdef __OPTIMIZE__
#ifdef HAVE_C99_RUNTIME #ifdef HAVE_C99_RUNTIME
/* We're converting to implicitly generated C99 functions. */ /* We're converting to implicitly generated C99 functions. */
INNER_CAST1 (__builtin_lceil, long);
INNER_CAST1 (__builtin_llceil, long long);
INNER_CAST1 (__builtin_lfloor, long);
INNER_CAST1 (__builtin_llfloor, long long);
INNER_CAST1 (lround, long); INNER_CAST1 (lround, long);
INNER_CAST1 (llround, long long); INNER_CAST1 (llround, long long);
INNER_CAST1 (lrint, long); INNER_CAST1 (lrint, long);

View File

@ -5,48 +5,30 @@
Written by Kaveh Ghazi, 2004-03-16. */ Written by Kaveh Ghazi, 2004-03-16. */
/* { dg-do link } */ /* { dg-do link } */
/* { dg-options "-ffast-math" } */ /* We need -ffinite-math-only so that we can fold "foo != foo", where
foo is a floating point expression. We need -fno-math-errno so
that various math functions are marked const/pure and can be
folded. */
/* { dg-options "-ffinite-math-only -fno-math-errno" } */
#define PROTOTYPE1(FN) extern double FN(double); extern float FN##f(float); \ extern int link_failure (int);
extern long double FN##l(long double);
#define PROTOTYPE1_RET(FN, RET) extern RET FN(double); extern RET FN##f(float); \
extern RET FN##l(long double);
#define PROTOTYPE_LINK_FAILURE(FN) extern void link_failure_##FN(void); \
extern void link_failure_##FN##f(void); \
extern void link_failure_##FN##l(void); \
PROTOTYPE1(fabs)
PROTOTYPE1(ceil)
PROTOTYPE1(floor)
PROTOTYPE1(nearbyint)
PROTOTYPE1(rint)
PROTOTYPE1(round)
PROTOTYPE1(trunc)
PROTOTYPE1_RET(lround, long)
PROTOTYPE1_RET(llround, long long)
PROTOTYPE1_RET(lrint, long)
PROTOTYPE1_RET(llrint, long long)
/* Test that the various FP truncation builtins detect integral /* Test that the various FP truncation builtins detect integral
arguments. */ arguments. */
#define CHECK_FN(MATHFN) \ #define CHECK_FN(MATHFN) \
PROTOTYPE_LINK_FAILURE(MATHFN); \ if (__builtin_##MATHFN(i1) != i1) link_failure (__LINE__); \
if (MATHFN(i1) != i1) link_failure_##MATHFN(); \ if (__builtin_##MATHFN##f(i1) != i1) link_failure (__LINE__); \
if (MATHFN##f(i1) != i1) link_failure_##MATHFN##f(); \ if (__builtin_##MATHFN##l(i1) != i1) link_failure (__LINE__);
if (MATHFN##l(i1) != i1) link_failure_##MATHFN##l();
#define CHECK_FN_RET(MATHFN, RET) \ #define CHECK_FN_RET(MATHFN, RET) \
PROTOTYPE_LINK_FAILURE(MATHFN); \ if (__builtin_##MATHFN(i1) != (RET)(double)i1) link_failure (__LINE__); \
if (MATHFN(i1) != (RET)(double)i1) link_failure_##MATHFN(); \ if (__builtin_##MATHFN##f(i1) != (RET)(float)i1) link_failure (__LINE__); \
if (MATHFN##f(i1) != (RET)(float)i1) link_failure_##MATHFN##f(); \ if (__builtin_##MATHFN##l(i1) != (RET)(long double)i1) link_failure (__LINE__);
if (MATHFN##l(i1) != (RET)(long double)i1) link_failure_##MATHFN##l();
/* Check that various other integral expressions are detected. */ /* Check that various other integral expressions are detected. */
#define CHECK_EXPR(EXPR,NAME) \ #define CHECK_EXPR(EXPR,NAME) \
extern void link_failure_FP_##NAME(void); \ if (__builtin_ceill(EXPR) != (EXPR)) link_failure (__LINE__); \
extern void link_failure_fixed_##NAME(void); \ if (__builtin_lroundl(EXPR) != (long)(long double)(EXPR)) link_failure (__LINE__);
if (ceill(EXPR) != (EXPR)) link_failure_FP_##NAME(); \
if (lroundl(EXPR) != (long)(long double)(EXPR)) link_failure_fixed_##NAME();
void __attribute__ ((__noinline__)) test (int i1, int i2) void __attribute__ ((__noinline__)) test (int i1, int i2)
{ {
@ -60,6 +42,10 @@ void __attribute__ ((__noinline__)) test (int i1, int i2)
CHECK_FN_RET(llround, long long); CHECK_FN_RET(llround, long long);
CHECK_FN_RET(lrint, long); CHECK_FN_RET(lrint, long);
CHECK_FN_RET(llrint, long long); CHECK_FN_RET(llrint, long long);
CHECK_FN_RET(lceil, long);
CHECK_FN_RET(llceil, long long);
CHECK_FN_RET(lfloor, long);
CHECK_FN_RET(llfloor, long long);
CHECK_EXPR (5.0, REAL_CST); CHECK_EXPR (5.0, REAL_CST);
CHECK_EXPR (5.0F, REAL_CSTf); CHECK_EXPR (5.0F, REAL_CSTf);
@ -67,9 +53,9 @@ void __attribute__ ((__noinline__)) test (int i1, int i2)
CHECK_EXPR ((double)i1, FLOAT_EXPR); CHECK_EXPR ((double)i1, FLOAT_EXPR);
CHECK_EXPR ((float)i1, FLOAT_EXPRf); CHECK_EXPR ((float)i1, FLOAT_EXPRf);
CHECK_EXPR ((long double)i1, FLOAT_EXPRl); CHECK_EXPR ((long double)i1, FLOAT_EXPRl);
CHECK_EXPR (fabs(i1), ABS_EXPR); CHECK_EXPR (__builtin_fabs(i1), ABS_EXPR);
CHECK_EXPR (fabsf(i1), ABS_EXPRf); CHECK_EXPR (__builtin_fabsf(i1), ABS_EXPRf);
CHECK_EXPR (fabsl(i1), ABS_EXPRl); CHECK_EXPR (__builtin_fabsl(i1), ABS_EXPRl);
CHECK_EXPR (((void)i1,(double)i2), COMPOUND_EXPR); CHECK_EXPR (((void)i1,(double)i2), COMPOUND_EXPR);
CHECK_EXPR ((double)i1+i2, PLUS_EXPR); CHECK_EXPR ((double)i1+i2, PLUS_EXPR);
CHECK_EXPR ((double)i1-i2, MINUS_EXPR); CHECK_EXPR ((double)i1-i2, MINUS_EXPR);

View File

@ -15,10 +15,6 @@ extern void link_error(int);
extern float FUNC##f (float); \ extern float FUNC##f (float); \
extern double FUNC (double); \ extern double FUNC (double); \
extern long double FUNC##l (long double) extern long double FUNC##l (long double)
#define DECLARE_L(FUNC) \
extern long FUNC##f (float); \
extern long FUNC (double); \
extern long FUNC##l (long double)
#define DECLARE2(FUNC) \ #define DECLARE2(FUNC) \
extern float FUNC##f (float, float); \ extern float FUNC##f (float, float); \
extern double FUNC (double, double); \ extern double FUNC (double, double); \
@ -26,9 +22,6 @@ extern void link_error(int);
DECLARE2(fmin); DECLARE2(fmin);
DECLARE2(fmax); DECLARE2(fmax);
DECLARE_L(lround);
DECLARE_L(lrint);
DECLARE(sqrt);
DECLARE(fabs); DECLARE(fabs);
extern int pure(int) __attribute__ ((__pure__)); extern int pure(int) __attribute__ ((__pure__));
@ -52,20 +45,32 @@ extern int pure(int) __attribute__ ((__pure__));
link_error(__LINE__); \ link_error(__LINE__); \
} while (0) } while (0)
/* Test that lround(FUNC(int,int)) == lrint(FUNC(int,int)), i.e. both /* Test that FIXFUNC(FUNC(int1,int2)) == (TYPE)FUNC(int1,int2),
lround() and lrint() should be folded away. */ i.e. FIXFUNC should be folded away and replaced with a cast. */
#define TEST_NONNEG(FUNC) do { \ #define TEST_FIXFUNC(FUNC,FIXFUNC,TYPE) do { \
if (lroundf(FUNC##f(i,j)) != lrintf(FUNC##f(i,j))) \ if (FIXFUNC##f(FUNC##f(i,j)) != (TYPE)FUNC##f(i,j)) \
link_error(__LINE__); \ link_error(__LINE__); \
if (lround(FUNC(i,j)) != lrint(FUNC(i,j))) \ if (FIXFUNC(FUNC(i,j)) != (TYPE)FUNC(i,j)) \
link_error(__LINE__); \ link_error(__LINE__); \
if (lroundl(FUNC##l(i,j)) != lrintl(FUNC##l(i,j))) \ if (FIXFUNC##l(FUNC##l(i,j)) != (TYPE)FUNC##l(i,j)) \
link_error(__LINE__); \ link_error(__LINE__); \
} while (0) } while (0)
/* Test that FUNC(int1,int2) has an integer return type. */
#define TEST_INT(FUNC) do { \
TEST_FIXFUNC(FUNC,__builtin_lround,long); \
TEST_FIXFUNC(FUNC,__builtin_llround,long long); \
TEST_FIXFUNC(FUNC,__builtin_lrint,long); \
TEST_FIXFUNC(FUNC,__builtin_llrint,long long); \
TEST_FIXFUNC(FUNC,__builtin_lceil,long); \
TEST_FIXFUNC(FUNC,__builtin_llceil,long long); \
TEST_FIXFUNC(FUNC,__builtin_lfloor,long); \
TEST_FIXFUNC(FUNC,__builtin_llfloor,long long); \
} while (0)
/* Test that (long)fabs(FUNC(fabs(x),fabs(y))) == /* Test that (long)fabs(FUNC(fabs(x),fabs(y))) ==
(long)FUNC(fabs(x),fabs(y)). We cast to (long) so "!=" folds. */ (long)FUNC(fabs(x),fabs(y)). We cast to (long) so "!=" folds. */
#define TEST_INT(FUNC) do { \ #define TEST_NONNEG(FUNC) do { \
if ((long)fabsf(FUNC##f(fabsf(xf),fabsf(yf))) != (long)FUNC##f(fabsf(xf),fabsf(yf))) \ if ((long)fabsf(FUNC##f(fabsf(xf),fabsf(yf))) != (long)FUNC##f(fabsf(xf),fabsf(yf))) \
link_error(__LINE__); \ link_error(__LINE__); \
if ((long)fabs(FUNC(fabs(x),fabs(y))) != (long)FUNC(fabs(x),fabs(y))) \ if ((long)fabs(FUNC(fabs(x),fabs(y))) != (long)FUNC(fabs(x),fabs(y))) \

View File

@ -144,8 +144,12 @@ void test(double d1, double d2, float f1, float f2,
ARG1TEST1 (floor); ARG1TEST1 (floor);
ARG1TEST2 (fmod); ARG1TEST2 (fmod);
ARG1TEST2_A2INT (ldexp, int); ARG1TEST2_A2INT (ldexp, int);
ARG1TEST1_RTYPE (__builtin_llceil, long long);
ARG1TEST1_RTYPE (__builtin_llfloor, long long);
ARG1TEST1_RTYPE (llrint, long long); ARG1TEST1_RTYPE (llrint, long long);
ARG1TEST1_RTYPE (llround, long long); ARG1TEST1_RTYPE (llround, long long);
ARG1TEST1_RTYPE (__builtin_lceil, long);
ARG1TEST1_RTYPE (__builtin_lfloor, long);
ARG1TEST1_RTYPE (lrint, long); ARG1TEST1_RTYPE (lrint, long);
ARG1TEST1_RTYPE (lround, long); ARG1TEST1_RTYPE (lround, long);
/* The modf* functions aren't ever "const" or "pure" even with /* The modf* functions aren't ever "const" or "pure" even with

View File

@ -7,34 +7,12 @@
/* { dg-do link } */ /* { dg-do link } */
#define PROTOTYPE(FN) \ extern int link_error (int);
PROTOTYPE_LINK_ERROR(FN) \
extern double FN (double); \
extern float FN##f (float); \
extern long double FN##l (long double);
#define PROTOTYPE_RET(FN, RET) \
PROTOTYPE_LINK_ERROR(FN) \
extern RET FN (double); \
extern RET FN##f (float); \
extern RET FN##l (long double);
#define PROTOTYPE_LINK_ERROR(FN) \
extern void link_error_##FN(void); \
extern void link_error_##FN##f(void); \
extern void link_error_##FN##l(void);
#define TEST(FN, VALUE, RESULT) \ #define TEST(FN, VALUE, RESULT) \
if (FN (VALUE) != RESULT) link_error_##FN(); \ if (__builtin_##FN (VALUE) != RESULT) link_error (__LINE__); \
if (FN##f (VALUE) != RESULT) link_error_##FN##f(); \ if (__builtin_##FN##f (VALUE) != RESULT) link_error (__LINE__); \
if (FN##l (VALUE) != RESULT) link_error_##FN##l(); \ if (__builtin_##FN##l (VALUE) != RESULT) link_error (__LINE__); \
PROTOTYPE (trunc);
PROTOTYPE (floor);
PROTOTYPE (ceil);
PROTOTYPE (round);
PROTOTYPE_RET (lround, long);
PROTOTYPE_RET (llround, long long);
int int
main (void) main (void)
@ -45,6 +23,10 @@ main (void)
TEST(round, 0, 0); TEST(round, 0, 0);
TEST(lround, 0, 0); TEST(lround, 0, 0);
TEST(llround, 0, 0); TEST(llround, 0, 0);
TEST(lfloor, 0, 0);
TEST(llfloor, 0, 0);
TEST(lceil, 0, 0);
TEST(llceil, 0, 0);
TEST(trunc, 6, 6); TEST(trunc, 6, 6);
TEST(floor, 6, 6); TEST(floor, 6, 6);
@ -52,6 +34,10 @@ main (void)
TEST(round, 6, 6); TEST(round, 6, 6);
TEST(lround, 6, 6); TEST(lround, 6, 6);
TEST(llround, 6, 6); TEST(llround, 6, 6);
TEST(lfloor, 6, 6);
TEST(llfloor, 6, 6);
TEST(lceil, 6, 6);
TEST(llceil, 6, 6);
TEST(trunc, -8, -8); TEST(trunc, -8, -8);
TEST(floor, -8, -8); TEST(floor, -8, -8);
@ -59,6 +45,10 @@ main (void)
TEST(round, -8, -8); TEST(round, -8, -8);
TEST(lround, -8, -8); TEST(lround, -8, -8);
TEST(llround, -8, -8); TEST(llround, -8, -8);
TEST(lfloor, -8, -8);
TEST(llfloor, -8, -8);
TEST(lceil, -8, -8);
TEST(llceil, -8, -8);
TEST(trunc, 3.2, 3); TEST(trunc, 3.2, 3);
TEST(floor, 3.2, 3); TEST(floor, 3.2, 3);
@ -66,6 +56,10 @@ main (void)
TEST(round, 3.2, 3); TEST(round, 3.2, 3);
TEST(lround, 3.2, 3); TEST(lround, 3.2, 3);
TEST(llround, 3.2, 3); TEST(llround, 3.2, 3);
TEST(lfloor, 3.2, 3);
TEST(llfloor, 3.2, 3);
TEST(lceil, 3.2, 4);
TEST(llceil, 3.2, 4);
TEST(trunc, -2.8, -2); TEST(trunc, -2.8, -2);
TEST(floor, -2.8, -3); TEST(floor, -2.8, -3);
@ -73,6 +67,10 @@ main (void)
TEST(round, -2.8, -3); TEST(round, -2.8, -3);
TEST(lround, -2.8, -3); TEST(lround, -2.8, -3);
TEST(llround, -2.8, -3); TEST(llround, -2.8, -3);
TEST(lfloor, -2.8, -3);
TEST(llfloor, -2.8, -3);
TEST(lceil, -2.8, -2);
TEST(llceil, -2.8, -2);
TEST(trunc, 0.01, 0); TEST(trunc, 0.01, 0);
TEST(floor, 0.01, 0); TEST(floor, 0.01, 0);
@ -80,6 +78,10 @@ main (void)
TEST(round, 0.01, 0); TEST(round, 0.01, 0);
TEST(lround, 0.01, 0); TEST(lround, 0.01, 0);
TEST(llround, 0.01, 0); TEST(llround, 0.01, 0);
TEST(lfloor, 0.01, 0);
TEST(llfloor, 0.01, 0);
TEST(lceil, 0.01, 1);
TEST(llceil, 0.01, 1);
TEST(trunc, -0.7, 0); TEST(trunc, -0.7, 0);
TEST(floor, -0.7, -1); TEST(floor, -0.7, -1);
@ -87,6 +89,10 @@ main (void)
TEST(round, -0.7, -1); TEST(round, -0.7, -1);
TEST(lround, -0.7, -1); TEST(lround, -0.7, -1);
TEST(llround, -0.7, -1); TEST(llround, -0.7, -1);
TEST(lfloor, -0.7, -1);
TEST(llfloor, -0.7, -1);
TEST(lceil, -0.7, 0);
TEST(llceil, -0.7, 0);
TEST(trunc, 2.5, 2); TEST(trunc, 2.5, 2);
TEST(floor, 2.5, 2); TEST(floor, 2.5, 2);
@ -94,6 +100,10 @@ main (void)
TEST(round, 2.5, 3); TEST(round, 2.5, 3);
TEST(lround, 2.5, 3); TEST(lround, 2.5, 3);
TEST(llround, 2.5, 3); TEST(llround, 2.5, 3);
TEST(lfloor, 2.5, 2);
TEST(llfloor, 2.5, 2);
TEST(lceil, 2.5, 3);
TEST(llceil, 2.5, 3);
TEST(trunc, -1.5, -1); TEST(trunc, -1.5, -1);
TEST(floor, -1.5, -2); TEST(floor, -1.5, -2);
@ -101,6 +111,10 @@ main (void)
TEST(round, -1.5, -2); TEST(round, -1.5, -2);
TEST(lround, -1.5, -2); TEST(lround, -1.5, -2);
TEST(llround, -1.5, -2); TEST(llround, -1.5, -2);
TEST(lfloor, -1.5, -2);
TEST(llfloor, -1.5, -2);
TEST(lceil, -1.5, -1);
TEST(llceil, -1.5, -1);
return 0; return 0;
} }