diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2007-05-18 01:42:15 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2007-05-18 01:42:15 +0000 |
commit | bf460eec6facce43acc1bb89fd3fa3c271e3dd22 (patch) | |
tree | 9b7cc1714bd2bf985cd41854074a5e4fdf0d9365 | |
parent | ea91f95764aaa7a1ab8ceb78e81414dc28fb6b42 (diff) | |
download | gcc-bf460eec6facce43acc1bb89fd3fa3c271e3dd22.zip gcc-bf460eec6facce43acc1bb89fd3fa3c271e3dd22.tar.gz gcc-bf460eec6facce43acc1bb89fd3fa3c271e3dd22.tar.bz2 |
builtins.c (CASE_MATHFN_REENT): New macro.
* builtins.c (CASE_MATHFN_REENT): New macro.
(mathfn_built_in): Use it.
* builtins.def (BUILT_IN_GAMMA_R, BUILT_IN_GAMMAF_R,
BUILT_IN_GAMMAL_R, BUILT_IN_LGAMMA_R, BUILT_IN_LGAMMAF_R,
BUILT_IN_LGAMMAL_R): New.
* doc/extend.texi: Document new builtins.
testsuite:
* gcc.dg/builtins-1.c: Test reentrant gamma functions.
From-SVN: r124821
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/builtins.c | 7 | ||||
-rw-r--r-- | gcc/builtins.def | 6 | ||||
-rw-r--r-- | gcc/doc/extend.texi | 32 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/builtins-1.c | 10 |
6 files changed, 52 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7b9b0c..f355683 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2007-05-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + * builtins.c (CASE_MATHFN_REENT): New macro. + (mathfn_built_in): Use it. + * builtins.def (BUILT_IN_GAMMA_R, BUILT_IN_GAMMAF_R, + BUILT_IN_GAMMAL_R, BUILT_IN_LGAMMA_R, BUILT_IN_LGAMMAF_R, + BUILT_IN_LGAMMAL_R): New. + * doc/extend.texi: Document new builtins. + PR middle-end/31796 * builtins.c (do_mpfr_remquo): New. (fold_builtin_2): Handle BUILT_IN_DREM/BUILT_IN_REMAINDER. diff --git a/gcc/builtins.c b/gcc/builtins.c index 96c1c03..de62d15 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1653,6 +1653,11 @@ expand_builtin_classify_type (tree exp) case BUILT_IN_MATHFN: case BUILT_IN_MATHFN##F: case BUILT_IN_MATHFN##L: \ fcode = BUILT_IN_MATHFN; fcodef = BUILT_IN_MATHFN##F ; \ fcodel = BUILT_IN_MATHFN##L ; break; +/* Similar to above, but appends _R after any F/L suffix. */ +#define CASE_MATHFN_REENT(BUILT_IN_MATHFN) \ + case BUILT_IN_MATHFN##_R: case BUILT_IN_MATHFN##F_R: case BUILT_IN_MATHFN##L_R: \ + fcode = BUILT_IN_MATHFN##_R; fcodef = BUILT_IN_MATHFN##F_R ; \ + fcodel = BUILT_IN_MATHFN##L_R ; break; /* Return mathematic function equivalent to FN but operating directly on TYPE, if available. If we can't do the conversion, return zero. */ @@ -1692,6 +1697,7 @@ mathfn_built_in (tree type, enum built_in_function fn) CASE_MATHFN (BUILT_IN_FMOD) CASE_MATHFN (BUILT_IN_FREXP) CASE_MATHFN (BUILT_IN_GAMMA) + CASE_MATHFN_REENT (BUILT_IN_GAMMA) /* GAMMA_R */ CASE_MATHFN (BUILT_IN_HUGE_VAL) CASE_MATHFN (BUILT_IN_HYPOT) CASE_MATHFN (BUILT_IN_ILOGB) @@ -1704,6 +1710,7 @@ mathfn_built_in (tree type, enum built_in_function fn) CASE_MATHFN (BUILT_IN_LDEXP) CASE_MATHFN (BUILT_IN_LFLOOR) CASE_MATHFN (BUILT_IN_LGAMMA) + CASE_MATHFN_REENT (BUILT_IN_LGAMMA) /* LGAMMA_R */ CASE_MATHFN (BUILT_IN_LLCEIL) CASE_MATHFN (BUILT_IN_LLFLOOR) CASE_MATHFN (BUILT_IN_LLRINT) diff --git a/gcc/builtins.def b/gcc/builtins.def index 1c17edb..7289fa6 100644 --- a/gcc/builtins.def +++ b/gcc/builtins.def @@ -258,6 +258,9 @@ DEF_C99_C90RES_BUILTIN (BUILT_IN_FREXPL, "frexpl", BT_FN_LONGDOUBLE_LONGDOUBLE_I DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMA, "gamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_STORE) DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMAF, "gammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_STORE) DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMAL, "gammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMA_R, "gamma_r", BT_FN_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMAF_R, "gammaf_r", BT_FN_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_GAMMAL_R, "gammal_r", BT_FN_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) DEF_GCC_BUILTIN (BUILT_IN_HUGE_VAL, "huge_val", BT_FN_DOUBLE, ATTR_CONST_NOTHROW_LIST) DEF_GCC_BUILTIN (BUILT_IN_HUGE_VALF, "huge_valf", BT_FN_FLOAT, ATTR_CONST_NOTHROW_LIST) DEF_GCC_BUILTIN (BUILT_IN_HUGE_VALL, "huge_vall", BT_FN_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST) @@ -294,6 +297,9 @@ DEF_GCC_BUILTIN (BUILT_IN_LFLOORL, "lfloorl", BT_FN_LONG_LONGDOUBLE, ATTR 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_LGAMMAL, "lgammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_LGAMMA_R, "lgamma_r", BT_FN_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_LGAMMAF_R, "lgammaf_r", BT_FN_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) +DEF_EXT_LIB_BUILTIN (BUILT_IN_LGAMMAL_R, "lgammal_r", BT_FN_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE) 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_CONST_NOTHROW_LIST) DEF_GCC_BUILTIN (BUILT_IN_LLCEILL, "llceill", BT_FN_LONGLONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 4a8f674..2a31057 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -5521,6 +5521,9 @@ should be called and the @var{flag} argument passed to it. @findex gamma @findex gammaf @findex gammal +@findex gamma_r +@findex gammaf_r +@findex gammal_r @findex gettext @findex hypot @findex hypotf @@ -5571,6 +5574,9 @@ should be called and the @var{flag} argument passed to it. @findex lgamma @findex lgammaf @findex lgammal +@findex lgamma_r +@findex lgammaf_r +@findex lgammal_r @findex llabs @findex llrint @findex llrintf @@ -5752,20 +5758,22 @@ Outside strict ISO C mode (@option{-ansi}, @option{-std=c89} or @code{_exit}, @code{alloca}, @code{bcmp}, @code{bzero}, @code{dcgettext}, @code{dgettext}, @code{dremf}, @code{dreml}, @code{drem}, @code{exp10f}, @code{exp10l}, @code{exp10}, @code{ffsll}, -@code{ffsl}, @code{ffs}, @code{fprintf_unlocked}, @code{fputs_unlocked}, -@code{gammaf}, @code{gammal}, @code{gamma}, @code{gettext}, +@code{ffsl}, @code{ffs}, @code{fprintf_unlocked}, +@code{fputs_unlocked}, @code{gammaf}, @code{gammal}, @code{gamma}, +@code{gammaf_r}, @code{gammal_r}, @code{gamma_r}, @code{gettext}, @code{index}, @code{isascii}, @code{j0f}, @code{j0l}, @code{j0}, @code{j1f}, @code{j1l}, @code{j1}, @code{jnf}, @code{jnl}, @code{jn}, -@code{mempcpy}, @code{pow10f}, @code{pow10l}, @code{pow10}, -@code{printf_unlocked}, @code{rindex}, @code{scalbf}, @code{scalbl}, -@code{scalb}, @code{signbit}, @code{signbitf}, @code{signbitl}, -@code{signbitd32}, @code{signbitd64}, @code{signbitd128}, -@code{significandf}, @code{significandl}, @code{significand}, -@code{sincosf}, @code{sincosl}, @code{sincos}, @code{stpcpy}, -@code{stpncpy}, @code{strcasecmp}, @code{strdup}, @code{strfmon}, -@code{strncasecmp}, @code{strndup}, @code{toascii}, @code{y0f}, -@code{y0l}, @code{y0}, @code{y1f}, @code{y1l}, @code{y1}, @code{ynf}, -@code{ynl} and @code{yn} +@code{lgammaf_r}, @code{lgammal_r}, @code{lgamma_r}, @code{mempcpy}, +@code{pow10f}, @code{pow10l}, @code{pow10}, @code{printf_unlocked}, +@code{rindex}, @code{scalbf}, @code{scalbl}, @code{scalb}, +@code{signbit}, @code{signbitf}, @code{signbitl}, @code{signbitd32}, +@code{signbitd64}, @code{signbitd128}, @code{significandf}, +@code{significandl}, @code{significand}, @code{sincosf}, +@code{sincosl}, @code{sincos}, @code{stpcpy}, @code{stpncpy}, +@code{strcasecmp}, @code{strdup}, @code{strfmon}, @code{strncasecmp}, +@code{strndup}, @code{toascii}, @code{y0f}, @code{y0l}, @code{y0}, +@code{y1f}, @code{y1l}, @code{y1}, @code{ynf}, @code{ynl} and +@code{yn} may be handled as built-in functions. All these functions have corresponding versions prefixed with @code{__builtin_}, which may be used even in strict C89 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c0f4b67..905f269 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2007-05-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + * gcc.dg/builtins-1.c: Test reentrant gamma functions. + * gcc.dg/torture/builtin-math-2.c: Add tests for remquo, remainder and drem. * gcc.dg/torture/builtin-math-4.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/builtins-1.c b/gcc/testsuite/gcc.dg/builtins-1.c index 640576a5..573a879 100644 --- a/gcc/testsuite/gcc.dg/builtins-1.c +++ b/gcc/testsuite/gcc.dg/builtins-1.c @@ -44,6 +44,14 @@ double test_##FN(double x, TYPE y) { return __builtin_##FN(x, y); } \ float test_##FN##f(float x, TYPE y) { return __builtin_##FN##f(x, y); } \ long double test_##FN##l(long double x, TYPE y) { return __builtin_##FN##l(x, y); } +/* Test FP functions taking two arguments, the second argument is of a + supplied type. The function is named reentrant style, meaning "_r" + appears after the possible f/l suffix. */ +#define FPTEST2ARG2_REENT(FN, TYPE) \ +double test_##FN##_r(double x, TYPE y) { return __builtin_##FN##_r(x, y); } \ +float test_##FN##f_r(float x, TYPE y) { return __builtin_##FN##f_r(x, y); } \ +long double test_##FN##l_r(long double x, TYPE y) { return __builtin_##FN##l_r(x, y); } + /* Test FP functions taking two arguments, the second argument is a FP pointer. */ #define FPTEST2FPP2(FN) \ @@ -132,6 +140,7 @@ FPTEST2 (fmin) FPTEST2 (fmod) FPTEST2ARG2 (frexp, int *) FPTEST1 (gamma) +FPTEST2ARG2_REENT (gamma, int *) /* gamma_r */ FPTEST0 (huge_val) FPTEST2 (hypot) FPTEST1 (ilogb) @@ -141,6 +150,7 @@ FPTEST1 (j1) FPTEST2ARG1 (jn, int) FPTEST2ARG2 (ldexp, int) FPTEST1 (lgamma) +FPTEST2ARG2_REENT (lgamma, int *) /* lgamma_r */ FPTEST1RET (llrint, long long) FPTEST1RET (llround, long long) FPTEST1 (log) |