This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.22-286-gd96164c


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  d96164c33012fccc7ba3ebb4d324c7fd0c6b5836 (commit)
      from  54142c44e963f410262fa868c159b6df858f3c53 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d96164c33012fccc7ba3ebb4d324c7fd0c6b5836

commit d96164c33012fccc7ba3ebb4d324c7fd0c6b5836
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Wed Sep 23 22:42:30 2015 +0000

    Refactor code forcing underflow exceptions.
    
    Various floating-point functions have code to force underflow
    exceptions if a tiny result was computed in a way that might not have
    resulted in such exceptions even though the result is inexact.  This
    typically uses math_force_eval to ensure that the underflowing
    expression is evaluated, but sometimes uses volatile.
    
    This patch refactors such code to use three new macros
    math_check_force_underflow, math_check_force_underflow_nonneg and
    math_check_force_underflow_complex (which in turn use
    math_force_eval).  In the limited number of cases not suited to a
    simple conversion to these macros, existing uses of volatile are
    changed to use math_force_eval instead.  The converted code does not
    always execute exactly the same sequence of operations as the original
    code, but the overall effects should be the same.
    
    Tested for x86_64, x86, mips64 and powerpc.
    
    	* sysdeps/generic/math_private.h (fabs_tg): New macro.
    	(min_of_type): Likewise.
    	(math_check_force_underflow): Likewise.
    	(math_check_force_underflow_nonneg): Likewise.
    	(math_check_force_underflow_complex): Likewise.
    	* math/e_exp2l.c (__ieee754_exp2l): Use
    	math_check_force_underflow_nonneg.
    	* math/k_casinh.c (__kernel_casinh): Likewise.
    	* math/k_casinhf.c (__kernel_casinhf): Likewise.
    	* math/k_casinhl.c (__kernel_casinhl): Likewise.
    	* math/s_catan.c (__catan): Use
    	math_check_force_underflow_complex.
    	* math/s_catanf.c (__catanf): Likewise.
    	* math/s_catanh.c (__catanh): Likewise.
    	* math/s_catanhf.c (__catanhf): Likewise.
    	* math/s_catanhl.c (__catanhl): Likewise.
    	* math/s_catanl.c (__catanl): Likewise.
    	* math/s_ccosh.c (__ccosh): Likewise.
    	* math/s_ccoshf.c (__ccoshf): Likewise.
    	* math/s_ccoshl.c (__ccoshl): Likewise.
    	* math/s_cexp.c (__cexp): Likewise.
    	* math/s_cexpf.c (__cexpf): Likewise.
    	* math/s_cexpl.c (__cexpl): Likewise.
    	* math/s_clog.c (__clog): Use math_check_force_underflow_nonneg.
    	* math/s_clog10.c (__clog10): Likewise.
    	* math/s_clog10f.c (__clog10f): Likewise.
    	* math/s_clog10l.c (__clog10l): Likewise.
    	* math/s_clogf.c (__clogf): Likewise.
    	* math/s_clogl.c (__clogl): Likewise.
    	* math/s_csin.c (__csin): Use math_check_force_underflow_complex.
    	* math/s_csinf.c (__csinf): Likewise.
    	* math/s_csinh.c (__csinh): Likewise.
    	* math/s_csinhf.c (__csinhf): Likewise.
    	* math/s_csinhl.c (__csinhl): Likewise.
    	* math/s_csinl.c (__csinl): Likewise.
    	* math/s_csqrt.c (__csqrt): Use math_check_force_underflow.
    	* math/s_csqrtf.c (__csqrtf): Likewise.
    	* math/s_csqrtl.c (__csqrtl): Likewise.
    	* math/s_ctan.c (__ctan): Use math_check_force_underflow_complex.
    	* math/s_ctanf.c (__ctanf): Likewise.
    	* math/s_ctanh.c (__ctanh): Likewise.
    	* math/s_ctanhf.c (__ctanhf): Likewise.
    	* math/s_ctanhl.c (__ctanhl): Likewise.
    	* math/s_ctanl.c (__ctanl): Likewise.
    	* stdlib/strtod_l.c (round_and_return): Use math_force_eval
    	instead of volatile.
    	* sysdeps/ieee754/dbl-64/e_asin.c (__ieee754_asin): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/dbl-64/e_atanh.c (__ieee754_atanh): Likewise.
    	* sysdeps/ieee754/dbl-64/e_exp.c (__ieee754_exp): Do not use
    	volatile when forcing underflow.
    	* sysdeps/ieee754/dbl-64/e_exp2.c (__ieee754_exp2): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/dbl-64/e_gamma_r.c (__ieee754_gamma_r):
    	Likewise.
    	* sysdeps/ieee754/dbl-64/e_j1.c (__ieee754_j1): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_jn): Likewise.
    	* sysdeps/ieee754/dbl-64/e_sinh.c (__ieee754_sinh): Likewise.
    	* sysdeps/ieee754/dbl-64/s_asinh.c (__asinh): Likewise.
    	* sysdeps/ieee754/dbl-64/s_atan.c (atan): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/dbl-64/s_erf.c (__erf): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/dbl-64/s_expm1.c (__expm1): Likewise.
    	* sysdeps/ieee754/dbl-64/s_fma.c (__fma): Use math_force_eval
    	instead of volatile.
    	* sysdeps/ieee754/dbl-64/s_log1p.c (__log1p): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/dbl-64/s_sin.c (__sin): Likewise.
    	* sysdeps/ieee754/dbl-64/s_tan.c (tan): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/dbl-64/s_tanh.c (__tanh): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/flt-32/e_asinf.c (__ieee754_asinf): Likewise.
    	* sysdeps/ieee754/flt-32/e_atanhf.c (__ieee754_atanhf): Likewise.
    	* sysdeps/ieee754/flt-32/e_exp2f.c (__ieee754_exp2f): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/flt-32/e_gammaf_r.c (__ieee754_gammaf_r):
    	Likewise.
    	* sysdeps/ieee754/flt-32/e_j1f.c (__ieee754_j1f): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_jnf): Likewise.
    	* sysdeps/ieee754/flt-32/e_sinhf.c (__ieee754_sinhf): Likewise.
    	* sysdeps/ieee754/flt-32/k_sinf.c (__kernel_sinf): Likewise.
    	* sysdeps/ieee754/flt-32/k_tanf.c (__kernel_tanf): Likewise.
    	* sysdeps/ieee754/flt-32/s_asinhf.c (__asinhf): Likewise.
    	* sysdeps/ieee754/flt-32/s_atanf.c (__atanf): Likewise.
    	* sysdeps/ieee754/flt-32/s_erff.c (__erff): Likewise.
    	* sysdeps/ieee754/flt-32/s_expm1f.c (__expm1f): Likewise.
    	* sysdeps/ieee754/flt-32/s_log1pf.c (__log1pf): Likewise.
    	* sysdeps/ieee754/flt-32/s_tanhf.c (__tanhf): Likewise.
    	* sysdeps/ieee754/ldbl-128/e_asinl.c (__ieee754_asinl): Likewise.
    	* sysdeps/ieee754/ldbl-128/e_atanhl.c (__ieee754_atanhl):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128/e_expl.c (__ieee754_expl): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/ldbl-128/e_gammal_r.c (__ieee754_gammal_r):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-128/e_jnl.c (__ieee754_jnl): Likewise.
    	* sysdeps/ieee754/ldbl-128/e_sinhl.c (__ieee754_sinhl): Likewise.
    	* sysdeps/ieee754/ldbl-128/k_sincosl.c (__kernel_sincosl):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128/k_sinl.c (__kernel_sinl): Likewise.
    	* sysdeps/ieee754/ldbl-128/k_tanl.c (__kernel_tanl): Likewise.
    	* sysdeps/ieee754/ldbl-128/s_asinhl.c (__asinhl): Likewise.
    	* sysdeps/ieee754/ldbl-128/s_atanl.c (__atanl): Likewise.
    	* sysdeps/ieee754/ldbl-128/s_erfl.c (__erfl): Likewise.
    	* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
    	* sysdeps/ieee754/ldbl-128/s_fmal.c (__fmal): Use math_force_eval
    	instead of volatile.
    	* sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-128/s_tanhl.c (__tanhl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/e_asinl.c (__ieee754_asinl): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-128ibm/e_atanhl.c (__ieee754_atanhl):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (__ieee754_gammal_r):
    	Use math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/ldbl-128ibm/e_jnl.c (__ieee754_jnl): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-128ibm/e_sinhl.c (__ieee754_sinhl):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/k_sincosl.c (__kernel_sincosl):
    	Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/k_sinl.c (__kernel_sinl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/k_tanl.c (__kernel_tanl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/s_atanl.c (__atanl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/s_erfl.c (__erfl): Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Likewise.
    	* sysdeps/ieee754/ldbl-96/e_asinl.c (__ieee754_asinl): Likewise.
    	* sysdeps/ieee754/ldbl-96/e_atanhl.c (__ieee754_atanhl): Likewise.
    	* sysdeps/ieee754/ldbl-96/e_gammal_r.c (__ieee754_gammal_r): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/ldbl-96/e_j1l.c (__ieee754_j1l): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-96/e_jnl.c (__ieee754_jnl): Likewise.
    	* sysdeps/ieee754/ldbl-96/e_sinhl.c (__ieee754_sinhl): Likewise.
    	* sysdeps/ieee754/ldbl-96/k_sinl.c (__kernel_sinl): Likewise.
    	* sysdeps/ieee754/ldbl-96/k_tanl.c (__kernel_tanl): Use
    	math_check_force_underflow_nonneg.
    	* sysdeps/ieee754/ldbl-96/s_asinhl.c (__asinhl): Use
    	math_check_force_underflow.
    	* sysdeps/ieee754/ldbl-96/s_erfl.c (__erfl): Likewise.
    	* sysdeps/ieee754/ldbl-96/s_fmal.c (__fmal): Use math_force_eval
    	instead of volatile.
    	* sysdeps/ieee754/ldbl-96/s_tanhl.c (__tanhl): Use
    	math_check_force_underflow.

diff --git a/ChangeLog b/ChangeLog
index 3a5f03d..20fd655 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,158 @@
 2015-09-23  Joseph Myers  <joseph@codesourcery.com>
 
+	* sysdeps/generic/math_private.h (fabs_tg): New macro.
+	(min_of_type): Likewise.
+	(math_check_force_underflow): Likewise.
+	(math_check_force_underflow_nonneg): Likewise.
+	(math_check_force_underflow_complex): Likewise.
+	* math/e_exp2l.c (__ieee754_exp2l): Use
+	math_check_force_underflow_nonneg.
+	* math/k_casinh.c (__kernel_casinh): Likewise.
+	* math/k_casinhf.c (__kernel_casinhf): Likewise.
+	* math/k_casinhl.c (__kernel_casinhl): Likewise.
+	* math/s_catan.c (__catan): Use
+	math_check_force_underflow_complex.
+	* math/s_catanf.c (__catanf): Likewise.
+	* math/s_catanh.c (__catanh): Likewise.
+	* math/s_catanhf.c (__catanhf): Likewise.
+	* math/s_catanhl.c (__catanhl): Likewise.
+	* math/s_catanl.c (__catanl): Likewise.
+	* math/s_ccosh.c (__ccosh): Likewise.
+	* math/s_ccoshf.c (__ccoshf): Likewise.
+	* math/s_ccoshl.c (__ccoshl): Likewise.
+	* math/s_cexp.c (__cexp): Likewise.
+	* math/s_cexpf.c (__cexpf): Likewise.
+	* math/s_cexpl.c (__cexpl): Likewise.
+	* math/s_clog.c (__clog): Use math_check_force_underflow_nonneg.
+	* math/s_clog10.c (__clog10): Likewise.
+	* math/s_clog10f.c (__clog10f): Likewise.
+	* math/s_clog10l.c (__clog10l): Likewise.
+	* math/s_clogf.c (__clogf): Likewise.
+	* math/s_clogl.c (__clogl): Likewise.
+	* math/s_csin.c (__csin): Use math_check_force_underflow_complex.
+	* math/s_csinf.c (__csinf): Likewise.
+	* math/s_csinh.c (__csinh): Likewise.
+	* math/s_csinhf.c (__csinhf): Likewise.
+	* math/s_csinhl.c (__csinhl): Likewise.
+	* math/s_csinl.c (__csinl): Likewise.
+	* math/s_csqrt.c (__csqrt): Use math_check_force_underflow.
+	* math/s_csqrtf.c (__csqrtf): Likewise.
+	* math/s_csqrtl.c (__csqrtl): Likewise.
+	* math/s_ctan.c (__ctan): Use math_check_force_underflow_complex.
+	* math/s_ctanf.c (__ctanf): Likewise.
+	* math/s_ctanh.c (__ctanh): Likewise.
+	* math/s_ctanhf.c (__ctanhf): Likewise.
+	* math/s_ctanhl.c (__ctanhl): Likewise.
+	* math/s_ctanl.c (__ctanl): Likewise.
+	* stdlib/strtod_l.c (round_and_return): Use math_force_eval
+	instead of volatile.
+	* sysdeps/ieee754/dbl-64/e_asin.c (__ieee754_asin): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/dbl-64/e_atanh.c (__ieee754_atanh): Likewise.
+	* sysdeps/ieee754/dbl-64/e_exp.c (__ieee754_exp): Do not use
+	volatile when forcing underflow.
+	* sysdeps/ieee754/dbl-64/e_exp2.c (__ieee754_exp2): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/dbl-64/e_gamma_r.c (__ieee754_gamma_r):
+	Likewise.
+	* sysdeps/ieee754/dbl-64/e_j1.c (__ieee754_j1): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_jn): Likewise.
+	* sysdeps/ieee754/dbl-64/e_sinh.c (__ieee754_sinh): Likewise.
+	* sysdeps/ieee754/dbl-64/s_asinh.c (__asinh): Likewise.
+	* sysdeps/ieee754/dbl-64/s_atan.c (atan): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/dbl-64/s_erf.c (__erf): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/dbl-64/s_expm1.c (__expm1): Likewise.
+	* sysdeps/ieee754/dbl-64/s_fma.c (__fma): Use math_force_eval
+	instead of volatile.
+	* sysdeps/ieee754/dbl-64/s_log1p.c (__log1p): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/dbl-64/s_sin.c (__sin): Likewise.
+	* sysdeps/ieee754/dbl-64/s_tan.c (tan): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/dbl-64/s_tanh.c (__tanh): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/flt-32/e_asinf.c (__ieee754_asinf): Likewise.
+	* sysdeps/ieee754/flt-32/e_atanhf.c (__ieee754_atanhf): Likewise.
+	* sysdeps/ieee754/flt-32/e_exp2f.c (__ieee754_exp2f): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/flt-32/e_gammaf_r.c (__ieee754_gammaf_r):
+	Likewise.
+	* sysdeps/ieee754/flt-32/e_j1f.c (__ieee754_j1f): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_jnf): Likewise.
+	* sysdeps/ieee754/flt-32/e_sinhf.c (__ieee754_sinhf): Likewise.
+	* sysdeps/ieee754/flt-32/k_sinf.c (__kernel_sinf): Likewise.
+	* sysdeps/ieee754/flt-32/k_tanf.c (__kernel_tanf): Likewise.
+	* sysdeps/ieee754/flt-32/s_asinhf.c (__asinhf): Likewise.
+	* sysdeps/ieee754/flt-32/s_atanf.c (__atanf): Likewise.
+	* sysdeps/ieee754/flt-32/s_erff.c (__erff): Likewise.
+	* sysdeps/ieee754/flt-32/s_expm1f.c (__expm1f): Likewise.
+	* sysdeps/ieee754/flt-32/s_log1pf.c (__log1pf): Likewise.
+	* sysdeps/ieee754/flt-32/s_tanhf.c (__tanhf): Likewise.
+	* sysdeps/ieee754/ldbl-128/e_asinl.c (__ieee754_asinl): Likewise.
+	* sysdeps/ieee754/ldbl-128/e_atanhl.c (__ieee754_atanhl):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128/e_expl.c (__ieee754_expl): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/ldbl-128/e_gammal_r.c (__ieee754_gammal_r):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-128/e_jnl.c (__ieee754_jnl): Likewise.
+	* sysdeps/ieee754/ldbl-128/e_sinhl.c (__ieee754_sinhl): Likewise.
+	* sysdeps/ieee754/ldbl-128/k_sincosl.c (__kernel_sincosl):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128/k_sinl.c (__kernel_sinl): Likewise.
+	* sysdeps/ieee754/ldbl-128/k_tanl.c (__kernel_tanl): Likewise.
+	* sysdeps/ieee754/ldbl-128/s_asinhl.c (__asinhl): Likewise.
+	* sysdeps/ieee754/ldbl-128/s_atanl.c (__atanl): Likewise.
+	* sysdeps/ieee754/ldbl-128/s_erfl.c (__erfl): Likewise.
+	* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Likewise.
+	* sysdeps/ieee754/ldbl-128/s_fmal.c (__fmal): Use math_force_eval
+	instead of volatile.
+	* sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-128/s_tanhl.c (__tanhl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/e_asinl.c (__ieee754_asinl): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-128ibm/e_atanhl.c (__ieee754_atanhl):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (__ieee754_gammal_r):
+	Use math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/ldbl-128ibm/e_jnl.c (__ieee754_jnl): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-128ibm/e_sinhl.c (__ieee754_sinhl):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/k_sincosl.c (__kernel_sincosl):
+	Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/k_sinl.c (__kernel_sinl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/k_tanl.c (__kernel_tanl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/s_atanl.c (__atanl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/s_erfl.c (__erfl): Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Likewise.
+	* sysdeps/ieee754/ldbl-96/e_asinl.c (__ieee754_asinl): Likewise.
+	* sysdeps/ieee754/ldbl-96/e_atanhl.c (__ieee754_atanhl): Likewise.
+	* sysdeps/ieee754/ldbl-96/e_gammal_r.c (__ieee754_gammal_r): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/ldbl-96/e_j1l.c (__ieee754_j1l): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-96/e_jnl.c (__ieee754_jnl): Likewise.
+	* sysdeps/ieee754/ldbl-96/e_sinhl.c (__ieee754_sinhl): Likewise.
+	* sysdeps/ieee754/ldbl-96/k_sinl.c (__kernel_sinl): Likewise.
+	* sysdeps/ieee754/ldbl-96/k_tanl.c (__kernel_tanl): Use
+	math_check_force_underflow_nonneg.
+	* sysdeps/ieee754/ldbl-96/s_asinhl.c (__asinhl): Use
+	math_check_force_underflow.
+	* sysdeps/ieee754/ldbl-96/s_erfl.c (__erfl): Likewise.
+	* sysdeps/ieee754/ldbl-96/s_fmal.c (__fmal): Use math_force_eval
+	instead of volatile.
+	* sysdeps/ieee754/ldbl-96/s_tanhl.c (__tanhl): Use
+	math_check_force_underflow.
+
 	* math/s_nexttowardf.c (__nexttowardf): Use math_narrow_eval.
 	* stdlib/strtod_l.c: Include <math_private.h>.
 	(overflow_value): Use math_narrow_eval.
diff --git a/math/e_exp2l.c b/math/e_exp2l.c
index b8cd158..19c9278 100644
--- a/math/e_exp2l.c
+++ b/math/e_exp2l.c
@@ -43,11 +43,7 @@ __ieee754_exp2l (long double x)
 	    result = __scalbnl (1.0L + fractx, intx);
 	  else
 	    result = __scalbnl (__ieee754_expl (M_LN2l * fractx), intx);
-	  if (result < LDBL_MIN)
-	    {
-	      long double force_underflow = result * result;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow_nonneg (result);
 	  return result;
 	}
       else
diff --git a/math/k_casinh.c b/math/k_casinh.c
index cd089ab..69c03e3 100644
--- a/math/k_casinh.c
+++ b/math/k_casinh.c
@@ -180,11 +180,7 @@ __kernel_casinh (__complex__ double x, int adj)
 	  else
 	    __imag__ res = __ieee754_atan2 (ix, s);
 	}
-      if (__real__ res < DBL_MIN)
-	{
-	  volatile double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_nonneg (__real__ res);
     }
   else
     {
diff --git a/math/k_casinhf.c b/math/k_casinhf.c
index 04c1a21..088b61f 100644
--- a/math/k_casinhf.c
+++ b/math/k_casinhf.c
@@ -182,11 +182,7 @@ __kernel_casinhf (__complex__ float x, int adj)
 	  else
 	    __imag__ res = __ieee754_atan2f (ix, s);
 	}
-      if (__real__ res < FLT_MIN)
-	{
-	  volatile float force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_nonneg (__real__ res);
     }
   else
     {
diff --git a/math/k_casinhl.c b/math/k_casinhl.c
index 496c064..8963716 100644
--- a/math/k_casinhl.c
+++ b/math/k_casinhl.c
@@ -189,11 +189,7 @@ __kernel_casinhl (__complex__ long double x, int adj)
 	  else
 	    __imag__ res = __ieee754_atan2l (ix, s);
 	}
-      if (__real__ res < LDBL_MIN)
-	{
-	  volatile long double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_nonneg (__real__ res);
     }
   else
     {
diff --git a/math/s_catan.c b/math/s_catan.c
index 880473b..d9dc149 100644
--- a/math/s_catan.c
+++ b/math/s_catan.c
@@ -131,16 +131,7 @@ __catan (__complex__ double x)
 	    }
 	}
 
-      if (fabs (__real__ res) < DBL_MIN)
-	{
-	  volatile double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabs (__imag__ res) < DBL_MIN)
-	{
-	  volatile double force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_catanf.c b/math/s_catanf.c
index 64f1152..37ae4bf 100644
--- a/math/s_catanf.c
+++ b/math/s_catanf.c
@@ -133,16 +133,7 @@ __catanf (__complex__ float x)
 	    }
 	}
 
-      if (fabsf (__real__ res) < FLT_MIN)
-	{
-	  volatile float force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabsf (__imag__ res) < FLT_MIN)
-	{
-	  volatile float force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_catanh.c b/math/s_catanh.c
index 281183e..a9ad614 100644
--- a/math/s_catanh.c
+++ b/math/s_catanh.c
@@ -125,16 +125,7 @@ __catanh (__complex__ double x)
 	  __imag__ res = 0.5 * __ieee754_atan2 (2.0 * __imag__ x, den);
 	}
 
-      if (fabs (__real__ res) < DBL_MIN)
-	{
-	  volatile double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabs (__imag__ res) < DBL_MIN)
-	{
-	  volatile double force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_catanhf.c b/math/s_catanhf.c
index ea606c5..68296bb 100644
--- a/math/s_catanhf.c
+++ b/math/s_catanhf.c
@@ -127,16 +127,7 @@ __catanhf (__complex__ float x)
 	  __imag__ res = 0.5f * __ieee754_atan2f (2.0f * __imag__ x, den);
 	}
 
-      if (fabsf (__real__ res) < FLT_MIN)
-	{
-	  volatile float force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabsf (__imag__ res) < FLT_MIN)
-	{
-	  volatile float force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_catanhl.c b/math/s_catanhl.c
index a0b7600..c97a39b 100644
--- a/math/s_catanhl.c
+++ b/math/s_catanhl.c
@@ -133,16 +133,7 @@ __catanhl (__complex__ long double x)
 	  __imag__ res = 0.5L * __ieee754_atan2l (2.0L * __imag__ x, den);
 	}
 
-      if (fabsl (__real__ res) < LDBL_MIN)
-	{
-	  volatile long double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabsl (__imag__ res) < LDBL_MIN)
-	{
-	  volatile long double force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_catanl.c b/math/s_catanl.c
index 1c8d976..ea75642 100644
--- a/math/s_catanl.c
+++ b/math/s_catanl.c
@@ -139,16 +139,7 @@ __catanl (__complex__ long double x)
 	    }
 	}
 
-      if (fabsl (__real__ res) < LDBL_MIN)
-	{
-	  volatile long double force_underflow = __real__ res * __real__ res;
-	  (void) force_underflow;
-	}
-      if (fabsl (__imag__ res) < LDBL_MIN)
-	{
-	  volatile long double force_underflow = __imag__ res * __imag__ res;
-	  (void) force_underflow;
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ccosh.c b/math/s_ccosh.c
index 664731a..6192ecf 100644
--- a/math/s_ccosh.c
+++ b/math/s_ccosh.c
@@ -83,18 +83,7 @@ __ccosh (__complex__ double x)
 	      __imag__ retval = __ieee754_sinh (__real__ x) * sinix;
 	    }
 
-	  if (fabs (__real__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabs (__imag__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_ccoshf.c b/math/s_ccoshf.c
index 6f61efc..8acbbbb 100644
--- a/math/s_ccoshf.c
+++ b/math/s_ccoshf.c
@@ -83,18 +83,7 @@ __ccoshf (__complex__ float x)
 	      __imag__ retval = __ieee754_sinhf (__real__ x) * sinix;
 	    }
 
-	  if (fabsf (__real__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsf (__imag__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_ccoshl.c b/math/s_ccoshl.c
index 874786d..afc304d 100644
--- a/math/s_ccoshl.c
+++ b/math/s_ccoshl.c
@@ -83,18 +83,7 @@ __ccoshl (__complex__ long double x)
 	      __imag__ retval = __ieee754_sinhl (__real__ x) * sinix;
 	    }
 
-	  if (fabsl (__real__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsl (__imag__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_cexp.c b/math/s_cexp.c
index 06c5b63..5cb42d1 100644
--- a/math/s_cexp.c
+++ b/math/s_cexp.c
@@ -74,18 +74,7 @@ __cexp (__complex__ double x)
 	      __real__ retval = exp_val * cosix;
 	      __imag__ retval = exp_val * sinix;
 	    }
-	  if (fabs (__real__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabs (__imag__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_cexpf.c b/math/s_cexpf.c
index 35ff36c..7df2038 100644
--- a/math/s_cexpf.c
+++ b/math/s_cexpf.c
@@ -74,18 +74,7 @@ __cexpf (__complex__ float x)
 	      __real__ retval = exp_val * cosix;
 	      __imag__ retval = exp_val * sinix;
 	    }
-	  if (fabsf (__real__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsf (__imag__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_cexpl.c b/math/s_cexpl.c
index e2e703f..264a574 100644
--- a/math/s_cexpl.c
+++ b/math/s_cexpl.c
@@ -74,18 +74,7 @@ __cexpl (__complex__ long double x)
 	      __real__ retval = exp_val * cosix;
 	      __imag__ retval = exp_val * sinix;
 	    }
-	  if (fabsl (__real__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsl (__imag__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_clog.c b/math/s_clog.c
index 15f0459..b010e89 100644
--- a/math/s_clog.c
+++ b/math/s_clog.c
@@ -65,15 +65,8 @@ __clog (__complex__ double x)
 
       if (absx == 1.0 && scale == 0)
 	{
-	  double absy2 = absy * absy;
-	  if (absy2 <= DBL_MIN * 2.0)
-	    {
-	      double force_underflow = absy2 * absy2;
-	      __real__ result = absy2 / 2.0;
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1p (absy2) / 2.0;
+	  __real__ result = __log1p (absy * absy) / 2.0;
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0 && absx < 2.0 && absy < 1.0 && scale == 0)
 	{
diff --git a/math/s_clog10.c b/math/s_clog10.c
index 7990938..b6a4342 100644
--- a/math/s_clog10.c
+++ b/math/s_clog10.c
@@ -71,15 +71,8 @@ __clog10 (__complex__ double x)
 
       if (absx == 1.0 && scale == 0)
 	{
-	  double absy2 = absy * absy;
-	  if (absy2 <= DBL_MIN * 2.0 * M_LN10)
-	    {
-	      double force_underflow = absy2 * absy2;
-	      __real__ result = absy2 * (M_LOG10E / 2.0);
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1p (absy2) * (M_LOG10E / 2.0);
+	  __real__ result = __log1p (absy * absy) * (M_LOG10E / 2.0);
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0 && absx < 2.0 && absy < 1.0 && scale == 0)
 	{
diff --git a/math/s_clog10f.c b/math/s_clog10f.c
index b30ad3a..b77a849 100644
--- a/math/s_clog10f.c
+++ b/math/s_clog10f.c
@@ -71,15 +71,8 @@ __clog10f (__complex__ float x)
 
       if (absx == 1.0f && scale == 0)
 	{
-	  float absy2 = absy * absy;
-	  if (absy2 <= FLT_MIN * 2.0f * (float) M_LN10)
-	    {
-	      float force_underflow = absy2 * absy2;
-	      __real__ result = absy2 * ((float) M_LOG10E / 2.0f);
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1pf (absy2) * ((float) M_LOG10E / 2.0f);
+	  __real__ result = __log1pf (absy * absy) * ((float) M_LOG10E / 2.0f);
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0f && absx < 2.0f && absy < 1.0f && scale == 0)
 	{
diff --git a/math/s_clog10l.c b/math/s_clog10l.c
index 8481e45..86ec512 100644
--- a/math/s_clog10l.c
+++ b/math/s_clog10l.c
@@ -78,15 +78,8 @@ __clog10l (__complex__ long double x)
 
       if (absx == 1.0L && scale == 0)
 	{
-	  long double absy2 = absy * absy;
-	  if (absy2 <= LDBL_MIN * 2.0L * M_LN10l)
-	    {
-	      long double force_underflow = absy2 * absy2;
-	      __real__ result = absy2 * (M_LOG10El / 2.0);
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1pl (absy2) * (M_LOG10El / 2.0L);
+	  __real__ result = __log1pl (absy * absy) * (M_LOG10El / 2.0L);
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0L && absx < 2.0L && absy < 1.0L && scale == 0)
 	{
diff --git a/math/s_clogf.c b/math/s_clogf.c
index bae0fe6..ffec7ce 100644
--- a/math/s_clogf.c
+++ b/math/s_clogf.c
@@ -65,15 +65,8 @@ __clogf (__complex__ float x)
 
       if (absx == 1.0f && scale == 0)
 	{
-	  float absy2 = absy * absy;
-	  if (absy2 <= FLT_MIN * 2.0f)
-	    {
-	      float force_underflow = absy2 * absy2;
-	      __real__ result = absy2 / 2.0f;
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1pf (absy2) / 2.0f;
+	  __real__ result = __log1pf (absy * absy) / 2.0f;
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0f && absx < 2.0f && absy < 1.0f && scale == 0)
 	{
diff --git a/math/s_clogl.c b/math/s_clogl.c
index aebff2a..6325df4 100644
--- a/math/s_clogl.c
+++ b/math/s_clogl.c
@@ -72,15 +72,8 @@ __clogl (__complex__ long double x)
 
       if (absx == 1.0L && scale == 0)
 	{
-	  long double absy2 = absy * absy;
-	  if (absy2 <= LDBL_MIN * 2.0L)
-	    {
-	      long double force_underflow = absy2 * absy2;
-	      __real__ result = absy2 / 2.0L;
-	      math_force_eval (force_underflow);
-	    }
-	  else
-	    __real__ result = __log1pl (absy2) / 2.0L;
+	  __real__ result = __log1pl (absy * absy) / 2.0L;
+	  math_check_force_underflow_nonneg (__real__ result);
 	}
       else if (absx > 1.0L && absx < 2.0L && absy < 1.0L && scale == 0)
 	{
diff --git a/math/s_csin.c b/math/s_csin.c
index e926d7e..e6583bc 100644
--- a/math/s_csin.c
+++ b/math/s_csin.c
@@ -89,18 +89,7 @@ __csin (__complex__ double x)
 	      __imag__ retval = __ieee754_sinh (__imag__ x) * cosix;
 	    }
 
-	  if (fabs (__real__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabs (__imag__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csinf.c b/math/s_csinf.c
index 52cce4b..c20fd0b 100644
--- a/math/s_csinf.c
+++ b/math/s_csinf.c
@@ -89,18 +89,7 @@ __csinf (__complex__ float x)
 	      __imag__ retval = __ieee754_sinhf (__imag__ x) * cosix;
 	    }
 
-	  if (fabsf (__real__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsf (__imag__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csinh.c b/math/s_csinh.c
index 7aa69e7..c944d80 100644
--- a/math/s_csinh.c
+++ b/math/s_csinh.c
@@ -89,18 +89,7 @@ __csinh (__complex__ double x)
 	      __imag__ retval = __ieee754_cosh (__real__ x) * sinix;
 	    }
 
-	  if (fabs (__real__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabs (__imag__ retval) < DBL_MIN)
-	    {
-	      volatile double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csinhf.c b/math/s_csinhf.c
index 72e4800..16c2a0a 100644
--- a/math/s_csinhf.c
+++ b/math/s_csinhf.c
@@ -89,18 +89,7 @@ __csinhf (__complex__ float x)
 	      __imag__ retval = __ieee754_coshf (__real__ x) * sinix;
 	    }
 
-	  if (fabsf (__real__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsf (__imag__ retval) < FLT_MIN)
-	    {
-	      volatile float force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csinhl.c b/math/s_csinhl.c
index 62243da..e7e3dcd 100644
--- a/math/s_csinhl.c
+++ b/math/s_csinhl.c
@@ -89,18 +89,7 @@ __csinhl (__complex__ long double x)
 	      __imag__ retval = __ieee754_coshl (__real__ x) * sinix;
 	    }
 
-	  if (fabsl (__real__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsl (__imag__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csinl.c b/math/s_csinl.c
index 7908aee..7391f2c 100644
--- a/math/s_csinl.c
+++ b/math/s_csinl.c
@@ -89,18 +89,7 @@ __csinl (__complex__ long double x)
 	      __imag__ retval = __ieee754_sinhl (__imag__ x) * cosix;
 	    }
 
-	  if (fabsl (__real__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __real__ retval * __real__ retval;
-	      (void) force_underflow;
-	    }
-	  if (fabsl (__imag__ retval) < LDBL_MIN)
-	    {
-	      volatile long double force_underflow
-		= __imag__ retval * __imag__ retval;
-	      (void) force_underflow;
-	    }
+	  math_check_force_underflow_complex (retval);
 	}
       else
 	{
diff --git a/math/s_csqrt.c b/math/s_csqrt.c
index b86f533..9a3d5d6 100644
--- a/math/s_csqrt.c
+++ b/math/s_csqrt.c
@@ -148,16 +148,8 @@ __csqrt (__complex__ double x)
 	      s = __scalbn (s, scale);
 	    }
 
-	  if (fabs (r) < DBL_MIN)
-	    {
-	      double force_underflow = r * r;
-	      math_force_eval (force_underflow);
-	    }
-	  if (fabs (s) < DBL_MIN)
-	    {
-	      double force_underflow = s * s;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (r);
+	  math_check_force_underflow (s);
 
 	  __real__ res = r;
 	  __imag__ res = __copysign (s, __imag__ x);
diff --git a/math/s_csqrtf.c b/math/s_csqrtf.c
index e433f47..597f0a2 100644
--- a/math/s_csqrtf.c
+++ b/math/s_csqrtf.c
@@ -148,16 +148,8 @@ __csqrtf (__complex__ float x)
 	      s = __scalbnf (s, scale);
 	    }
 
-	  if (fabsf (r) < FLT_MIN)
-	    {
-	      float force_underflow = r * r;
-	      math_force_eval (force_underflow);
-	    }
-	  if (fabsf (s) < FLT_MIN)
-	    {
-	      float force_underflow = s * s;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (r);
+	  math_check_force_underflow (s);
 
 	  __real__ res = r;
 	  __imag__ res = __copysignf (s, __imag__ x);
diff --git a/math/s_csqrtl.c b/math/s_csqrtl.c
index 003d614..f9f31b2 100644
--- a/math/s_csqrtl.c
+++ b/math/s_csqrtl.c
@@ -148,16 +148,8 @@ __csqrtl (__complex__ long double x)
 	      s = __scalbnl (s, scale);
 	    }
 
-	  if (fabsl (r) < LDBL_MIN)
-	    {
-	      long double force_underflow = r * r;
-	      math_force_eval (force_underflow);
-	    }
-	  if (fabsl (s) < LDBL_MIN)
-	    {
-	      long double force_underflow = s * s;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (r);
+	  math_check_force_underflow (s);
 
 	  __real__ res = r;
 	  __imag__ res = __copysignl (s, __imag__ x);
diff --git a/math/s_ctan.c b/math/s_ctan.c
index 674c3b6..2ab1630 100644
--- a/math/s_ctan.c
+++ b/math/s_ctan.c
@@ -117,16 +117,7 @@ __ctan (__complex__ double x)
 	  __real__ res = sinrx * cosrx / den;
 	  __imag__ res = sinhix * coshix / den;
 	}
-      if (fabs (__real__ res) < DBL_MIN)
-	{
-	  double force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabs (__imag__ res) < DBL_MIN)
-	{
-	  double force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ctanf.c b/math/s_ctanf.c
index e0ebe43..1606b05 100644
--- a/math/s_ctanf.c
+++ b/math/s_ctanf.c
@@ -117,16 +117,7 @@ __ctanf (__complex__ float x)
 	  __real__ res = sinrx * cosrx / den;
 	  __imag__ res = sinhix * coshix / den;
 	}
-      if (fabsf (__real__ res) < FLT_MIN)
-	{
-	  float force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabsf (__imag__ res) < FLT_MIN)
-	{
-	  float force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ctanh.c b/math/s_ctanh.c
index 58607b1..486545d 100644
--- a/math/s_ctanh.c
+++ b/math/s_ctanh.c
@@ -117,16 +117,7 @@ __ctanh (__complex__ double x)
 	  __real__ res = sinhrx * coshrx / den;
 	  __imag__ res = sinix * cosix / den;
 	}
-      if (fabs (__real__ res) < DBL_MIN)
-	{
-	  double force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabs (__imag__ res) < DBL_MIN)
-	{
-	  double force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ctanhf.c b/math/s_ctanhf.c
index a4fd230..000820a 100644
--- a/math/s_ctanhf.c
+++ b/math/s_ctanhf.c
@@ -117,16 +117,7 @@ __ctanhf (__complex__ float x)
 	  __real__ res = sinhrx * coshrx / den;
 	  __imag__ res = sinix * cosix / den;
 	}
-      if (fabsf (__real__ res) < FLT_MIN)
-	{
-	  float force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabsf (__imag__ res) < FLT_MIN)
-	{
-	  float force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ctanhl.c b/math/s_ctanhl.c
index fb67b2b..cc80cae 100644
--- a/math/s_ctanhl.c
+++ b/math/s_ctanhl.c
@@ -124,16 +124,7 @@ __ctanhl (__complex__ long double x)
 	  __real__ res = sinhrx * coshrx / den;
 	  __imag__ res = sinix * cosix / den;
 	}
-      if (fabsl (__real__ res) < LDBL_MIN)
-	{
-	  long double force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabsl (__imag__ res) < LDBL_MIN)
-	{
-	  long double force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/math/s_ctanl.c b/math/s_ctanl.c
index 4783dcb..8b04910 100644
--- a/math/s_ctanl.c
+++ b/math/s_ctanl.c
@@ -124,16 +124,7 @@ __ctanl (__complex__ long double x)
 	  __real__ res = sinrx * cosrx / den;
 	  __imag__ res = sinhix * coshix / den;
 	}
-      if (fabsl (__real__ res) < LDBL_MIN)
-	{
-	  long double force_underflow = __real__ res * __real__ res;
-	  math_force_eval (force_underflow);
-	}
-      if (fabsl (__imag__ res) < LDBL_MIN)
-	{
-	  long double force_underflow = __imag__ res * __imag__ res;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_complex (res);
     }
 
   return res;
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index 7950870..da8e4df 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -297,8 +297,8 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative,
 	      || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0))
 	{
 	  __set_errno (ERANGE);
-	  volatile FLOAT force_underflow_exception = MIN_VALUE * MIN_VALUE;
-	  (void) force_underflow_exception;
+	  FLOAT force_underflow = MIN_VALUE * MIN_VALUE;
+	  math_force_eval (force_underflow);
 	}
     }
 
diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h
index 35591ee..a8f1a8e 100644
--- a/sysdeps/generic/math_private.h
+++ b/sysdeps/generic/math_private.h
@@ -429,6 +429,58 @@ extern long double __lgamma_productl (long double t, long double x,
    })
 #endif
 
+#define fabs_tg(x) __builtin_choose_expr			\
+  (__builtin_types_compatible_p (__typeof (x), float),		\
+   __builtin_fabsf (x),						\
+   __builtin_choose_expr					\
+   (__builtin_types_compatible_p (__typeof (x), double),	\
+    __builtin_fabs (x), __builtin_fabsl (x)))
+#define min_of_type(type) __builtin_choose_expr		\
+  (__builtin_types_compatible_p (type, float),		\
+   FLT_MIN,						\
+   __builtin_choose_expr				\
+   (__builtin_types_compatible_p (type, double),	\
+    DBL_MIN, LDBL_MIN))
+
+/* If X (which is not a NaN) is subnormal, force an underflow
+   exception.  */
+#define math_check_force_underflow(x)				\
+  do								\
+    {								\
+      __typeof (x) force_underflow_tmp = (x);			\
+      if (fabs_tg (force_underflow_tmp)				\
+	  < min_of_type (__typeof (force_underflow_tmp)))	\
+	{							\
+	  __typeof (force_underflow_tmp) force_underflow_tmp2	\
+	    = force_underflow_tmp * force_underflow_tmp;	\
+	  math_force_eval (force_underflow_tmp2);		\
+	}							\
+    }								\
+  while (0)
+/* Likewise, but X is also known to be nonnegative.  */
+#define math_check_force_underflow_nonneg(x)			\
+  do								\
+    {								\
+      __typeof (x) force_underflow_tmp = (x);			\
+      if (force_underflow_tmp					\
+	  < min_of_type (__typeof (force_underflow_tmp)))	\
+	{							\
+	  __typeof (force_underflow_tmp) force_underflow_tmp2	\
+	    = force_underflow_tmp * force_underflow_tmp;	\
+	  math_force_eval (force_underflow_tmp2);		\
+	}							\
+    }								\
+  while (0)
+/* Likewise, for both real and imaginary parts of a complex
+   result.  */
+#define math_check_force_underflow_complex(x)				\
+  do									\
+    {									\
+      __typeof (x) force_underflow_complex_tmp = (x);			\
+      math_check_force_underflow (__real__ force_underflow_complex_tmp); \
+      math_check_force_underflow (__imag__ force_underflow_complex_tmp); \
+    }									\
+  while (0)
 
 /* The standards only specify one variant of the fenv.h interfaces.
    But at least for some architectures we can be more efficient if we
diff --git a/sysdeps/ieee754/dbl-64/e_asin.c b/sysdeps/ieee754/dbl-64/e_asin.c
index a7684d1..214a612 100644
--- a/sysdeps/ieee754/dbl-64/e_asin.c
+++ b/sysdeps/ieee754/dbl-64/e_asin.c
@@ -71,11 +71,7 @@ __ieee754_asin(double x){
 
   if (k < 0x3e500000)
     {
-      if (fabs (x) < DBL_MIN)
-	{
-	  double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       return x;  /* for x->0 => sin(x)=x */
     }
   /*----------------------2^-26 <= |x| < 2^ -3    -----------------*/
diff --git a/sysdeps/ieee754/dbl-64/e_atanh.c b/sysdeps/ieee754/dbl-64/e_atanh.c
index 6b00b80..f011e4c 100644
--- a/sysdeps/ieee754/dbl-64/e_atanh.c
+++ b/sysdeps/ieee754/dbl-64/e_atanh.c
@@ -52,11 +52,7 @@ __ieee754_atanh (double x)
       if (__glibc_unlikely (xa < 0x1.0p-28))
 	{
 	  math_force_eval (huge + x);
-	  if (fabs (x) < DBL_MIN)
-	    {
-	      double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  return x;
 	}
 
diff --git a/sysdeps/ieee754/dbl-64/e_exp.c b/sysdeps/ieee754/dbl-64/e_exp.c
index bb76907..db76268 100644
--- a/sysdeps/ieee754/dbl-64/e_exp.c
+++ b/sysdeps/ieee754/dbl-64/e_exp.c
@@ -200,10 +200,7 @@ __ieee754_exp (double x)
       check_uflow_ret:
 	if (retval < DBL_MIN)
 	  {
-#if FLT_EVAL_METHOD != 0
-	    volatile
-#endif
-	      double force_underflow = tiny * tiny;
+	    double force_underflow = tiny * tiny;
 	    math_force_eval (force_underflow);
 	  }
 	if (retval == 0)
diff --git a/sysdeps/ieee754/dbl-64/e_exp2.c b/sysdeps/ieee754/dbl-64/e_exp2.c
index 01df621..48a7254 100644
--- a/sysdeps/ieee754/dbl-64/e_exp2.c
+++ b/sysdeps/ieee754/dbl-64/e_exp2.c
@@ -122,11 +122,7 @@ __ieee754_exp2 (double x)
       else
 	{
 	  result *= scale_u.d;
-	  if (result < DBL_MIN)
-	    {
-	      double force_underflow = result * result;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow_nonneg (result);
 	  return result;
 	}
     }
diff --git a/sysdeps/ieee754/dbl-64/e_gamma_r.c b/sysdeps/ieee754/dbl-64/e_gamma_r.c
index d3fb8af..a09a3fc 100644
--- a/sysdeps/ieee754/dbl-64/e_gamma_r.c
+++ b/sysdeps/ieee754/dbl-64/e_gamma_r.c
@@ -187,11 +187,7 @@ __ieee754_gamma_r (double x, int *signgamp)
 	      double tret = M_PI / (-x * sinpix
 				    * gamma_positive (-x, &exp2_adj));
 	      ret = __scalbn (tret, -exp2_adj);
-	      if (ret < DBL_MIN)
-		{
-		  double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (ret);
 	    }
 	}
       ret = math_narrow_eval (ret);
diff --git a/sysdeps/ieee754/dbl-64/e_j1.c b/sysdeps/ieee754/dbl-64/e_j1.c
index 26ffdfe..7f80b3c 100644
--- a/sysdeps/ieee754/dbl-64/e_j1.c
+++ b/sysdeps/ieee754/dbl-64/e_j1.c
@@ -128,11 +128,7 @@ __ieee754_j1 (double x)
       if (huge + x > one)                 /* inexact if x!=0 necessary */
 	{
 	  double ret = 0.5 * x;
-	  if (fabs (ret) < DBL_MIN)
-	    {
-	      double force_underflow = ret * ret;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (ret);
 	  return ret;
 	}
     }
diff --git a/sysdeps/ieee754/dbl-64/e_jn.c b/sysdeps/ieee754/dbl-64/e_jn.c
index ccef2dc..d6ab0bc 100644
--- a/sysdeps/ieee754/dbl-64/e_jn.c
+++ b/sysdeps/ieee754/dbl-64/e_jn.c
@@ -246,11 +246,8 @@ __ieee754_jn (int n, double x)
   }
   if (ret == 0)
     ret = __copysign (DBL_MIN, ret) * DBL_MIN;
-  else if (fabs (ret) < DBL_MIN)
-    {
-      double force_underflow = ret * ret;
-      math_force_eval (force_underflow);
-    }
+  else
+    math_check_force_underflow (ret);
   return ret;
 }
 strong_alias (__ieee754_jn, __jn_finite)
diff --git a/sysdeps/ieee754/dbl-64/e_sinh.c b/sysdeps/ieee754/dbl-64/e_sinh.c
index 291bfad..8479bdd 100644
--- a/sysdeps/ieee754/dbl-64/e_sinh.c
+++ b/sysdeps/ieee754/dbl-64/e_sinh.c
@@ -60,11 +60,7 @@ __ieee754_sinh (double x)
   if (ix < 0x40360000)                  /* |x|<22 */
     {
       if (__glibc_unlikely (ix < 0x3e300000)) {            /* |x|<2**-28 */
-	if (fabs (x) < DBL_MIN)
-	  {
-	    double force_underflow = x * x;
-	    math_force_eval (force_underflow);
-	  }
+	math_check_force_underflow (x);
 	if (shuge + x > one)
 	  return x;
 	/* sinh(tiny) = tiny with inexact */
diff --git a/sysdeps/ieee754/dbl-64/s_asinh.c b/sysdeps/ieee754/dbl-64/s_asinh.c
index ebe4710..9193301 100644
--- a/sysdeps/ieee754/dbl-64/s_asinh.c
+++ b/sysdeps/ieee754/dbl-64/s_asinh.c
@@ -39,11 +39,7 @@ __asinh (double x)
   ix = hx & 0x7fffffff;
   if (__glibc_unlikely (ix < 0x3e300000))                  /* |x|<2**-28 */
     {
-      if (fabs (x) < DBL_MIN)
-	{
-	  double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       if (huge + x > one)
 	return x;                       /* return x inexact except 0 */
     }
diff --git a/sysdeps/ieee754/dbl-64/s_atan.c b/sysdeps/ieee754/dbl-64/s_atan.c
index 5035ae8..5160cd1 100644
--- a/sysdeps/ieee754/dbl-64/s_atan.c
+++ b/sysdeps/ieee754/dbl-64/s_atan.c
@@ -90,11 +90,7 @@ atan (double x)
 	{
 	  if (u < A)
 	    {
-	      if (u < DBL_MIN)
-		{
-		  double force_underflow = x * x;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (u);
 	      return x;
 	    }
 	  else
diff --git a/sysdeps/ieee754/dbl-64/s_erf.c b/sysdeps/ieee754/dbl-64/s_erf.c
index 77cd50d..e59f5f3 100644
--- a/sysdeps/ieee754/dbl-64/s_erf.c
+++ b/sysdeps/ieee754/dbl-64/s_erf.c
@@ -213,11 +213,7 @@ __erf (double x)
 	    {
 	      /* Avoid spurious underflow.  */
 	      double ret = 0.0625 * (16.0 * x + (16.0 * efx) * x);
-	      if (fabs (ret) < DBL_MIN)
-		{
-		  double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (ret);
 	      return ret;
 	    }
 	  return x + efx * x;
diff --git a/sysdeps/ieee754/dbl-64/s_expm1.c b/sysdeps/ieee754/dbl-64/s_expm1.c
index 41ef63a..54d7710 100644
--- a/sysdeps/ieee754/dbl-64/s_expm1.c
+++ b/sysdeps/ieee754/dbl-64/s_expm1.c
@@ -195,11 +195,7 @@ __expm1 (double x)
     }
   else if (hx < 0x3c900000)             /* when |x|<2**-54, return x */
     {
-      if (fabs (x) < DBL_MIN)
-	{
-	  double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       t = huge + x;     /* return x with inexact flags when x!=0 */
       return x - (t - (huge + x));
     }
diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c
index 278b690..8b4e133 100644
--- a/sysdeps/ieee754/dbl-64/s_fma.c
+++ b/sysdeps/ieee754/dbl-64/s_fma.c
@@ -90,8 +90,8 @@ __fma (double x, double y, double z)
 		     && w.ieee.mantissa1 == 0
 		     && w.ieee.mantissa0 == 0)))
 	    {
-	      volatile double force_underflow = x * y;
-	      (void) force_underflow;
+	      double force_underflow = x * y;
+	      math_force_eval (force_underflow);
 	    }
 	  return v.d * 0x1p-54;
 	}
diff --git a/sysdeps/ieee754/dbl-64/s_log1p.c b/sysdeps/ieee754/dbl-64/s_log1p.c
index cff555b..340f637 100644
--- a/sysdeps/ieee754/dbl-64/s_log1p.c
+++ b/sysdeps/ieee754/dbl-64/s_log1p.c
@@ -120,11 +120,7 @@ __log1p (double x)
 	  math_force_eval (two54 + x);          /* raise inexact */
 	  if (ax < 0x3c900000)                  /* |x| < 2**-54 */
 	    {
-	      if (fabs (x) < DBL_MIN)
-		{
-		  double force_underflow = x * x;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (x);
 	      return x;
 	    }
 	  else
diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
index eff120e..48c924c 100644
--- a/sysdeps/ieee754/dbl-64/s_sin.c
+++ b/sysdeps/ieee754/dbl-64/s_sin.c
@@ -297,11 +297,7 @@ __sin (double x)
   k = 0x7fffffff & m;		/* no sign           */
   if (k < 0x3e500000)		/* if x->0 =>sin(x)=x */
     {
-      if (fabs (x) < DBL_MIN)
-	{
-	  double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       retval = x;
     }
  /*---------------------------- 2^-26 < |x|< 0.25 ----------------------*/
diff --git a/sysdeps/ieee754/dbl-64/s_tan.c b/sysdeps/ieee754/dbl-64/s_tan.c
index b4e3bd2..65d056a 100644
--- a/sysdeps/ieee754/dbl-64/s_tan.c
+++ b/sysdeps/ieee754/dbl-64/s_tan.c
@@ -92,11 +92,7 @@ tan (double x)
   /* (I) The case abs(x) <= 1.259e-8 */
   if (w <= g1.d)
     {
-      if (w < DBL_MIN)
-	{
-	  double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow_nonneg (w);
       retval = x;
       goto ret;
     }
diff --git a/sysdeps/ieee754/dbl-64/s_tanh.c b/sysdeps/ieee754/dbl-64/s_tanh.c
index 4f9fcfd..344a2f0 100644
--- a/sysdeps/ieee754/dbl-64/s_tanh.c
+++ b/sysdeps/ieee754/dbl-64/s_tanh.c
@@ -70,11 +70,7 @@ __tanh (double x)
 	return x;                       /* x == +-0 */
       if (ix < 0x3c800000)              /* |x|<2**-55 */
 	{
-	  if (fabs (x) < DBL_MIN)
-	    {
-	      double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  return x * (one + x);           /* tanh(small) = small */
 	}
       if (ix >= 0x3ff00000)             /* |x|>=1  */
diff --git a/sysdeps/ieee754/flt-32/e_asinf.c b/sysdeps/ieee754/flt-32/e_asinf.c
index 00bad42..2ca2dbc 100644
--- a/sysdeps/ieee754/flt-32/e_asinf.c
+++ b/sysdeps/ieee754/flt-32/e_asinf.c
@@ -73,11 +73,7 @@ float __ieee754_asinf(float x)
 	    return (x-x)/(x-x);		/* asin(|x|>1) is NaN */
 	} else if (ix<0x3f000000) {	/* |x|<0.5 */
 	    if(ix<0x32000000) {		/* if |x| < 2**-27 */
-		if (fabsf (x) < FLT_MIN)
-		  {
-		    float force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		if(huge+x>one) return x;/* return x with inexact if x!=0*/
 	    } else {
 		t = x*x;
diff --git a/sysdeps/ieee754/flt-32/e_atanhf.c b/sysdeps/ieee754/flt-32/e_atanhf.c
index bc74960..77e4b03 100644
--- a/sysdeps/ieee754/flt-32/e_atanhf.c
+++ b/sysdeps/ieee754/flt-32/e_atanhf.c
@@ -52,11 +52,7 @@ __ieee754_atanhf (float x)
       if (__glibc_unlikely (xa < 0x1.0p-28f))
 	{
 	  math_force_eval (huge + x);
-	  if (fabsf (x) < FLT_MIN)
-	    {
-	      float force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  return x;
 	}
 
diff --git a/sysdeps/ieee754/flt-32/e_exp2f.c b/sysdeps/ieee754/flt-32/e_exp2f.c
index 170c565..d8e7a9c 100644
--- a/sysdeps/ieee754/flt-32/e_exp2f.c
+++ b/sysdeps/ieee754/flt-32/e_exp2f.c
@@ -111,11 +111,7 @@ __ieee754_exp2f (float x)
       else
 	{
 	  result *= scale_u.f;
-	  if (result < FLT_MIN)
-	    {
-	      float force_underflow = result * result;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow_nonneg (result);
 	  return result;
 	}
     }
diff --git a/sysdeps/ieee754/flt-32/e_gammaf_r.c b/sysdeps/ieee754/flt-32/e_gammaf_r.c
index 183db1e..f97ca34 100644
--- a/sysdeps/ieee754/flt-32/e_gammaf_r.c
+++ b/sysdeps/ieee754/flt-32/e_gammaf_r.c
@@ -179,11 +179,7 @@ __ieee754_gammaf_r (float x, int *signgamp)
 	      float tret = (float) M_PI / (-x * sinpix
 					   * gammaf_positive (-x, &exp2_adj));
 	      ret = __scalbnf (tret, -exp2_adj);
-	      if (ret < FLT_MIN)
-		{
-		  float force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (ret);
 	    }
 	}
       ret = math_narrow_eval (ret);
diff --git a/sysdeps/ieee754/flt-32/e_j1f.c b/sysdeps/ieee754/flt-32/e_j1f.c
index 63de21f..e24024f 100644
--- a/sysdeps/ieee754/flt-32/e_j1f.c
+++ b/sysdeps/ieee754/flt-32/e_j1f.c
@@ -72,10 +72,7 @@ __ieee754_j1f(float x)
 	if(__builtin_expect(ix<0x32000000, 0)) {	/* |x|<2**-27 */
 	    if(huge+x>one) {		/* inexact if x!=0 necessary */
 		float ret = (float) 0.5 * x;
-		if (fabsf (ret) < FLT_MIN) {
-		    float force_underflow = ret * ret;
-		    math_force_eval (force_underflow);
-		}
+		math_check_force_underflow (ret);
 		return ret;
 	    }
 	}
diff --git a/sysdeps/ieee754/flt-32/e_jnf.c b/sysdeps/ieee754/flt-32/e_jnf.c
index 44a3761..d18922a 100644
--- a/sysdeps/ieee754/flt-32/e_jnf.c
+++ b/sysdeps/ieee754/flt-32/e_jnf.c
@@ -170,10 +170,8 @@ __ieee754_jnf(int n, float x)
     }
     if (ret == 0)
 	ret = __copysignf (FLT_MIN, ret) * FLT_MIN;
-    else if (fabsf (ret) < FLT_MIN) {
-	float force_underflow = ret * ret;
-	math_force_eval (force_underflow);
-    }
+    else
+	math_check_force_underflow (ret);
     return ret;
 }
 strong_alias (__ieee754_jnf, __jnf_finite)
diff --git a/sysdeps/ieee754/flt-32/e_sinhf.c b/sysdeps/ieee754/flt-32/e_sinhf.c
index a24fa0c..6100d95 100644
--- a/sysdeps/ieee754/flt-32/e_sinhf.c
+++ b/sysdeps/ieee754/flt-32/e_sinhf.c
@@ -36,11 +36,7 @@ __ieee754_sinhf(float x)
     /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
 	if (ix < 0x41b00000) {		/* |x|<22 */
 	    if (__builtin_expect(ix<0x31800000, 0)) {	/* |x|<2**-28 */
-		if (fabsf (x) < FLT_MIN)
-		  {
-		    float force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
 	    }
 	    t = __expm1f(fabsf(x));
diff --git a/sysdeps/ieee754/flt-32/k_sinf.c b/sysdeps/ieee754/flt-32/k_sinf.c
index 0c98a2a..a195d59 100644
--- a/sysdeps/ieee754/flt-32/k_sinf.c
+++ b/sysdeps/ieee754/flt-32/k_sinf.c
@@ -38,11 +38,7 @@ float __kernel_sinf(float x, float y, int iy)
 	ix &= 0x7fffffff;			/* high word of x */
 	if(ix<0x32000000)			/* |x| < 2**-27 */
 	  {
-	    if (fabsf (x) < FLT_MIN)
-	      {
-		float force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    if ((int) x == 0)
 	      return x;		/* generate inexact */
 	  }
diff --git a/sysdeps/ieee754/flt-32/k_tanf.c b/sysdeps/ieee754/flt-32/k_tanf.c
index 2f2076d..9f0e558 100644
--- a/sysdeps/ieee754/flt-32/k_tanf.c
+++ b/sysdeps/ieee754/flt-32/k_tanf.c
@@ -51,11 +51,7 @@ float __kernel_tanf(float x, float y, int iy)
 		if((ix|(iy+1))==0) return one/fabsf(x);
 		else if (iy == 1)
 		  {
-		    if (fabsf (x) < FLT_MIN)
-		      {
-			float force_underflow = x * x;
-			math_force_eval (force_underflow);
-		      }
+		    math_check_force_underflow (x);
 		    return x;
 		  }
 		else
diff --git a/sysdeps/ieee754/flt-32/s_asinhf.c b/sysdeps/ieee754/flt-32/s_asinhf.c
index 697faa8..da9cafb 100644
--- a/sysdeps/ieee754/flt-32/s_asinhf.c
+++ b/sysdeps/ieee754/flt-32/s_asinhf.c
@@ -30,11 +30,7 @@ __asinhf(float x)
 	GET_FLOAT_WORD(hx,x);
 	ix = hx&0x7fffffff;
 	if(__builtin_expect(ix< 0x38000000, 0)) {	/* |x|<2**-14 */
-	    if (fabsf (x) < FLT_MIN)
-	      {
-		float force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    if(huge+x>one) return x;	/* return x inexact except 0 */
 	}
 	if(__builtin_expect(ix>0x47000000, 0)) {	/* |x| > 2**14 */
diff --git a/sysdeps/ieee754/flt-32/s_atanf.c b/sysdeps/ieee754/flt-32/s_atanf.c
index be2addb..e322a1d 100644
--- a/sysdeps/ieee754/flt-32/s_atanf.c
+++ b/sysdeps/ieee754/flt-32/s_atanf.c
@@ -67,11 +67,7 @@ float __atanf(float x)
 	    else     return -atanhi[3]-atanlo[3];
 	} if (ix < 0x3ee00000) {	/* |x| < 0.4375 */
 	    if (ix < 0x31000000) {	/* |x| < 2^-29 */
-		if (fabsf (x) < FLT_MIN)
-		  {
-		    float force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		if(huge+x>one) return x;	/* raise inexact */
 	    }
 	    id = -1;
diff --git a/sysdeps/ieee754/flt-32/s_erff.c b/sysdeps/ieee754/flt-32/s_erff.c
index 1aabce5..3162d81 100644
--- a/sysdeps/ieee754/flt-32/s_erff.c
+++ b/sysdeps/ieee754/flt-32/s_erff.c
@@ -113,11 +113,7 @@ float __erff(float x)
 		  {
 		    /* Avoid spurious underflow.  */
 		    float ret = 0.0625f * (16.0f * x + (16.0f * efx) * x);
-		    if (fabsf (ret) < FLT_MIN)
-		      {
-			float force_underflow = ret * ret;
-			math_force_eval (force_underflow);
-		      }
+		    math_check_force_underflow (ret);
 		    return ret;
 		  }
 		return x + efx*x;
diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c
index c81b057..c515d25 100644
--- a/sysdeps/ieee754/flt-32/s_expm1f.c
+++ b/sysdeps/ieee754/flt-32/s_expm1f.c
@@ -81,11 +81,7 @@ __expm1f(float x)
 	    c  = (hi-x)-lo;
 	}
 	else if(hx < 0x33000000) {	/* when |x|<2**-25, return x */
-	    if (fabsf (x) < FLT_MIN)
-	      {
-		float force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    t = huge+x;	/* return x with inexact flags when x!=0 */
 	    return x - (t-(huge+x));
 	}
diff --git a/sysdeps/ieee754/flt-32/s_log1pf.c b/sysdeps/ieee754/flt-32/s_log1pf.c
index 83a09f1..ade60a2 100644
--- a/sysdeps/ieee754/flt-32/s_log1pf.c
+++ b/sysdeps/ieee754/flt-32/s_log1pf.c
@@ -50,11 +50,7 @@ __log1pf(float x)
 		math_force_eval(two25+x);	/* raise inexact */
 		if (ax<0x24800000)		/* |x| < 2**-54 */
 		  {
-		    if (fabsf (x) < FLT_MIN)
-		      {
-			float force_underflow = x * x;
-			math_force_eval (force_underflow);
-		      }
+		    math_check_force_underflow (x);
 		    return x;
 		  }
 		else
diff --git a/sysdeps/ieee754/flt-32/s_tanhf.c b/sysdeps/ieee754/flt-32/s_tanhf.c
index 5b48fb2..f70702b 100644
--- a/sysdeps/ieee754/flt-32/s_tanhf.c
+++ b/sysdeps/ieee754/flt-32/s_tanhf.c
@@ -43,11 +43,7 @@ float __tanhf(float x)
 		return x;		/* x == +-0 */
 	    if (ix<0x24000000) 		/* |x|<2**-55 */
 	      {
-		if (fabsf (x) < FLT_MIN)
-		  {
-		    float force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		return x*(one+x);    	/* tanh(small) = small */
 	      }
 	    if (ix>=0x3f800000) {	/* |x|>=1  */
diff --git a/sysdeps/ieee754/ldbl-128/e_asinl.c b/sysdeps/ieee754/ldbl-128/e_asinl.c
index 691ac26..5a0e473 100644
--- a/sysdeps/ieee754/ldbl-128/e_asinl.c
+++ b/sysdeps/ieee754/ldbl-128/e_asinl.c
@@ -153,11 +153,7 @@ __ieee754_asinl (long double x)
     {
       if (ix < 0x3fc60000) /* |x| < 2**-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  long double force_inexact = huge + x;
 	  math_force_eval (force_inexact);
 	  return x;		/* return x with inexact if x!=0 */
diff --git a/sysdeps/ieee754/ldbl-128/e_atanhl.c b/sysdeps/ieee754/ldbl-128/e_atanhl.c
index a5a7ee0..7fa53ef 100644
--- a/sysdeps/ieee754/ldbl-128/e_atanhl.c
+++ b/sysdeps/ieee754/ldbl-128/e_atanhl.c
@@ -60,11 +60,7 @@ __ieee754_atanhl(long double x)
 	  }
 	if(ix<0x3fc60000 && (huge+x)>zero)	/* x < 2^-57 */
 	  {
-	    if (fabsl (x) < LDBL_MIN)
-	      {
-		long double force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    return x;
 	  }
 
diff --git a/sysdeps/ieee754/ldbl-128/e_expl.c b/sysdeps/ieee754/ldbl-128/e_expl.c
index 1cd095c..30ec341 100644
--- a/sysdeps/ieee754/ldbl-128/e_expl.c
+++ b/sysdeps/ieee754/ldbl-128/e_expl.c
@@ -232,11 +232,7 @@ __ieee754_expl (long double x)
       else
 	{
 	  result *= scale_u.d;
-	  if (result < LDBL_MIN)
-	    {
-	      long double force_underflow = result * result;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow_nonneg (result);
 	  return result;
 	}
     }
diff --git a/sysdeps/ieee754/ldbl-128/e_gammal_r.c b/sysdeps/ieee754/ldbl-128/e_gammal_r.c
index c44f031..7c11ae4 100644
--- a/sysdeps/ieee754/ldbl-128/e_gammal_r.c
+++ b/sysdeps/ieee754/ldbl-128/e_gammal_r.c
@@ -194,11 +194,7 @@ __ieee754_gammal_r (long double x, int *signgamp)
 	      ret = M_PIl / (-x * sinpix
 			     * gammal_positive (-x, &exp2_adj));
 	      ret = __scalbnl (ret, -exp2_adj);
-	      if (ret < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (ret);
 	    }
 	}
     }
diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c
index 591c38e..70ecf5e 100644
--- a/sysdeps/ieee754/ldbl-128/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-128/e_j1l.c
@@ -700,11 +700,7 @@ __ieee754_j1l (long double x)
   if (xx <= 0x1p-58L)
     {
       long double ret = x * 0.5L;
-      if (fabsl (ret) < LDBL_MIN)
-	{
-	  long double force_underflow = ret * ret;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (ret);
       return ret;
     }
   if (xx <= 2.0L)
diff --git a/sysdeps/ieee754/ldbl-128/e_jnl.c b/sysdeps/ieee754/ldbl-128/e_jnl.c
index a419994..ee5a16b 100644
--- a/sysdeps/ieee754/ldbl-128/e_jnl.c
+++ b/sysdeps/ieee754/ldbl-128/e_jnl.c
@@ -297,11 +297,8 @@ __ieee754_jnl (int n, long double x)
   }
   if (ret == 0)
     ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
-  else if (fabsl (ret) < LDBL_MIN)
-    {
-      long double force_underflow = ret * ret;
-      math_force_eval (force_underflow);
-    }
+  else
+    math_check_force_underflow (ret);
   return ret;
 }
 strong_alias (__ieee754_jnl, __jnl_finite)
diff --git a/sysdeps/ieee754/ldbl-128/e_sinhl.c b/sysdeps/ieee754/ldbl-128/e_sinhl.c
index b0244a8..11974a3 100644
--- a/sysdeps/ieee754/ldbl-128/e_sinhl.c
+++ b/sysdeps/ieee754/ldbl-128/e_sinhl.c
@@ -88,11 +88,7 @@ __ieee754_sinhl (long double x)
     {
       if (ix < 0x3fc60000) /* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (shuge + x > one)
 	    return x;		/* sinh(tiny) = tiny with inexact */
 	}
diff --git a/sysdeps/ieee754/ldbl-128/k_sincosl.c b/sysdeps/ieee754/ldbl-128/k_sincosl.c
index 7b5c4b0..4f0de3d 100644
--- a/sysdeps/ieee754/ldbl-128/k_sincosl.c
+++ b/sysdeps/ieee754/ldbl-128/k_sincosl.c
@@ -111,11 +111,7 @@ __kernel_sincosl(long double x, long double y, long double *sinx, long double *c
 	 polynomial of degree 16(17).  */
       if (tix < 0x3fc60000)		/* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (!((int)x))			/* generate inexact */
 	    {
 	      *sinx = x;
diff --git a/sysdeps/ieee754/ldbl-128/k_sinl.c b/sysdeps/ieee754/ldbl-128/k_sinl.c
index 04d539f..d9ef62c 100644
--- a/sysdeps/ieee754/ldbl-128/k_sinl.c
+++ b/sysdeps/ieee754/ldbl-128/k_sinl.c
@@ -92,11 +92,7 @@ __kernel_sinl(long double x, long double y, int iy)
 	 polynomial of degree 17.  */
       if (tix < 0x3fc60000)		/* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (!((int)x)) return x;	/* generate inexact */
 	}
       z = x * x;
diff --git a/sysdeps/ieee754/ldbl-128/k_tanl.c b/sysdeps/ieee754/ldbl-128/k_tanl.c
index 6a6fa9f..8ff9192 100644
--- a/sysdeps/ieee754/ldbl-128/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128/k_tanl.c
@@ -101,11 +101,7 @@ __kernel_tanl (long double x, long double y, int iy)
 	    return one / fabs (x);
 	  else if (iy == 1)
 	    {
-	      if (fabsl (x) < LDBL_MIN)
-		{
-		  long double force_underflow = x * x;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (x);
 	      return x;
 	    }
 	  else
diff --git a/sysdeps/ieee754/ldbl-128/s_asinhl.c b/sysdeps/ieee754/ldbl-128/s_asinhl.c
index 8d5721a..5f3b9f2 100644
--- a/sysdeps/ieee754/ldbl-128/s_asinhl.c
+++ b/sysdeps/ieee754/ldbl-128/s_asinhl.c
@@ -52,11 +52,7 @@ __asinhl (long double x)
     return x + x;		/* x is inf or NaN */
   if (ix < 0x3fc70000)
     {				/* |x| < 2^ -56 */
-      if (fabsl (x) < LDBL_MIN)
-	{
-	  long double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       if (huge + x > one)
 	return x;		/* return x inexact except 0 */
     }
diff --git a/sysdeps/ieee754/ldbl-128/s_atanl.c b/sysdeps/ieee754/ldbl-128/s_atanl.c
index 1367b6b..aaae701 100644
--- a/sysdeps/ieee754/ldbl-128/s_atanl.c
+++ b/sysdeps/ieee754/ldbl-128/s_atanl.c
@@ -202,11 +202,7 @@ __atanl (long double x)
 
   if (k <= 0x3fc50000) /* |x| < 2**-58 */
     {
-      if (fabsl (x) < LDBL_MIN)
-	{
-	  long double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       /* Raise inexact. */
       if (huge + x > 0.0)
 	return x;
diff --git a/sysdeps/ieee754/ldbl-128/s_erfl.c b/sysdeps/ieee754/ldbl-128/s_erfl.c
index 08c80a3..dd275a7 100644
--- a/sysdeps/ieee754/ldbl-128/s_erfl.c
+++ b/sysdeps/ieee754/ldbl-128/s_erfl.c
@@ -785,11 +785,7 @@ __erfl (long double x)
 	    {
 	      /* Avoid spurious underflow.  */
 	      long double ret =  0.0625 * (16.0 * x + (16.0 * efx) * x);
-	      if (fabsl (ret) < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (ret);
 	      return ret;
 	    }
 	  return x + efx * x;
diff --git a/sysdeps/ieee754/ldbl-128/s_expm1l.c b/sysdeps/ieee754/ldbl-128/s_expm1l.c
index f1a68c8..b1100a9 100644
--- a/sysdeps/ieee754/ldbl-128/s_expm1l.c
+++ b/sysdeps/ieee754/ldbl-128/s_expm1l.c
@@ -128,11 +128,7 @@ __expm1l (long double x)
      when the result does underflow.  */
   if (fabsl (x) < 0x1p-113L)
     {
-      if (fabsl (x) < LDBL_MIN)
-	{
-	  long double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       return x;
     }
 
diff --git a/sysdeps/ieee754/ldbl-128/s_fmal.c b/sysdeps/ieee754/ldbl-128/s_fmal.c
index 5abc910..e231ce6 100644
--- a/sysdeps/ieee754/ldbl-128/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-128/s_fmal.c
@@ -94,8 +94,8 @@ __fmal (long double x, long double y, long double z)
 		     && w.ieee.mantissa1 == 0
 		     && w.ieee.mantissa0 == 0)))
 	    {
-	      volatile long double force_underflow = x * y;
-	      (void) force_underflow;
+	      long double force_underflow = x * y;
+	      math_force_eval (force_underflow);
 	    }
 	  return v.d * 0x1p-114L;
 	}
diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c
index 9609550..9806ab6 100644
--- a/sysdeps/ieee754/ldbl-128/s_log1pl.c
+++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c
@@ -140,11 +140,7 @@ __log1pl (long double xm1)
 
   if ((hx & 0x7fffffff) < 0x3f8e0000)
     {
-      if (fabsl (xm1) < LDBL_MIN)
-	{
-	  long double force_underflow = xm1 * xm1;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (xm1);
       if ((int) xm1 == 0)
 	return xm1;
     }
diff --git a/sysdeps/ieee754/ldbl-128/s_tanhl.c b/sysdeps/ieee754/ldbl-128/s_tanhl.c
index 8b1706f..f7a1d20 100644
--- a/sysdeps/ieee754/ldbl-128/s_tanhl.c
+++ b/sysdeps/ieee754/ldbl-128/s_tanhl.c
@@ -75,11 +75,7 @@ __tanhl (long double x)
 	return x;		/* x == +- 0 */
       if (ix < 0x3fc60000)	/* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  return x * (one + tiny); /* tanh(small) = small */
 	}
       u.parts32.w0 = ix;	/* Absolute value of x.  */
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_asinl.c b/sysdeps/ieee754/ldbl-128ibm/e_asinl.c
index 57c3ac0..6ed5e8d 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_asinl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_asinl.c
@@ -147,11 +147,7 @@ __ieee754_asinl (long double x)
     {
       if (a < 6.938893903907228e-18L) /* |x| < 2**-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  long double force_inexact =  huge + x;
 	  math_force_eval (force_inexact);
 	  return x;		/* return x with inexact if x!=0 */
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c b/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c
index bcd1fce..b576f42 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c
@@ -57,11 +57,7 @@ __ieee754_atanhl(long double x)
 	}
 	if(ix<0x3c70000000000000LL&&(huge+x)>zero)	/* x<2**-56 */
 	  {
-	    if (fabsl (x) < LDBL_MIN)
-	      {
-		long double force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    return x;
 	  }
 	x = fabsl (x);
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c b/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c
index 420842e..e8e443f 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c
@@ -194,11 +194,7 @@ __ieee754_gammal_r (long double x, int *signgamp)
 	      ret = M_PIl / (-x * sinpix
 			     * gammal_positive (-x, &exp2_adj));
 	      ret = __scalbnl (ret, -exp2_adj);
-	      if (ret < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (ret);
 	    }
 	}
     }
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_jnl.c b/sysdeps/ieee754/ldbl-128ibm/e_jnl.c
index 7594196..c33bc19 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_jnl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_jnl.c
@@ -297,11 +297,8 @@ __ieee754_jnl (int n, long double x)
   }
   if (ret == 0)
     ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
-  else if (fabsl (ret) < LDBL_MIN)
-    {
-      long double force_underflow = ret * ret;
-      math_force_eval (force_underflow);
-    }
+  else
+    math_check_force_underflow (ret);
   return ret;
 }
 strong_alias (__ieee754_jnl, __jnl_finite)
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c b/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c
index 00115df..29700ad 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_sinhl.c
@@ -54,11 +54,7 @@ __ieee754_sinhl(long double x)
     /* |x| in [0,40], return sign(x)*0.5*(E+E/(E+1))) */
 	if (ix < 0x4044000000000000LL) {	/* |x|<40 */
 	    if (ix<0x3c90000000000000LL) {	/* |x|<2**-54 */
-		if (fabsl (x) < LDBL_MIN)
-		  {
-		    long double force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		if(shuge+x>one) return x;/* sinhl(tiny) = tiny with inexact */
 	    }
 	    t = __expm1l(fabsl(x));
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
index 0a76e1c..b361043 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
@@ -114,11 +114,7 @@ __kernel_sincosl(long double x, long double y, long double *sinx, long double *c
 	 polynomial of degree 16(17).  */
       if (tix < 0x3c600000)		/* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (!((int)x))			/* generate inexact */
 	    {
 	      *sinx = x;
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_sinl.c b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
index 2050cd2..800bd54 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
@@ -95,11 +95,7 @@ __kernel_sinl(long double x, long double y, int iy)
 	 polynomial of degree 17.  */
       if (tix < 0x3c600000)		/* |x| < 2^-57 */
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (!((int)x)) return x;	/* generate inexact */
 	}
       z = x * x;
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
index e50cc88..22e53fc 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
@@ -101,11 +101,7 @@ __kernel_tanl (long double x, long double y, int iy)
 	    return one / fabs (x);
 	  else if (iy == 1)
 	    {
-	      if (fabsl (x) < LDBL_MIN)
-		{
-		  long double force_underflow = x * x;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (x);
 	      return x;
 	    }
 	  else
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c b/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c
index dda7f78..aa9a9ba 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c
@@ -46,11 +46,7 @@ long double __asinhl(long double x)
 	ix = hx&0x7fffffffffffffffLL;
 	if(ix>=0x7ff0000000000000LL) return x+x;	/* x is inf or NaN */
 	if(ix< 0x3c70000000000000LL) {	/* |x|<2**-56 */
-	    if (fabsl (x) < LDBL_MIN)
-	      {
-		long double force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    if(huge+x>one) return x;	/* return x inexact except 0 */
 	}
 	if(ix>0x4370000000000000LL) {	/* |x| > 2**56 */
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_atanl.c b/sysdeps/ieee754/ldbl-128ibm/s_atanl.c
index 6ddf4b1..0560d82 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_atanl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_atanl.c
@@ -199,11 +199,7 @@ __atanl (long double x)
 
   if (k <= 0x3c800000) /* |x| <= 2**-55.  */
     {
-      if (fabsl (x) < LDBL_MIN)
-	{
-	  long double force_underflow = x * x;
-	  math_force_eval (force_underflow);
-	}
+      math_check_force_underflow (x);
       /* Raise inexact.  */
       if (1e300L + x > 0.0)
 	return x;
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
index f6fcf48..455c645 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
@@ -805,11 +805,7 @@ __erfl (long double x)
 	      if (x == 0)
 		return x;
 	      long double ret = 0.0625 * (16.0 * x + (16.0 * efx) * x);
-	      if (fabsl (ret) < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (ret);
 	      return ret;
 	    }
 	  return x + efx * x;
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c
index 5342a8b..292020c 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c
@@ -68,11 +68,7 @@ long double __tanhl(long double x)
 		return x;		/* x == +-0 */
 	    if (ix<0x3c60000000000000LL) 	/* |x|<2**-57 */
 	      {
-		if (fabsl (x) < LDBL_MIN)
-		  {
-		    long double force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		return x*(one+x);    	/* tanh(small) = small */
 	      }
 	    if (ix>=0x3ff0000000000000LL) {	/* |x|>=1  */
diff --git a/sysdeps/ieee754/ldbl-96/e_asinl.c b/sysdeps/ieee754/ldbl-96/e_asinl.c
index 2973bf0..f52b931 100644
--- a/sysdeps/ieee754/ldbl-96/e_asinl.c
+++ b/sysdeps/ieee754/ldbl-96/e_asinl.c
@@ -112,11 +112,7 @@ __ieee754_asinl (long double x)
     {				/* |x|<0.5 */
       if (ix < 0x3fde8000)
 	{			/* if |x| < 2**-33 */
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (huge + x > one)
 	    return x;		/* return x with inexact if x!=0 */
 	}
diff --git a/sysdeps/ieee754/ldbl-96/e_atanhl.c b/sysdeps/ieee754/ldbl-96/e_atanhl.c
index 9a957c9..b99a83c 100644
--- a/sysdeps/ieee754/ldbl-96/e_atanhl.c
+++ b/sysdeps/ieee754/ldbl-96/e_atanhl.c
@@ -55,11 +55,7 @@ __ieee754_atanhl(long double x)
 	    return x/zero;
 	if(ix<0x3fdf) {
 	    math_force_eval(huge+x);
-	    if (fabsl (x) < LDBL_MIN)
-	      {
-		long double force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    return x;	/* x<2**-32 */
 	}
 	SET_LDOUBLE_EXP(x,ix);
diff --git a/sysdeps/ieee754/ldbl-96/e_gammal_r.c b/sysdeps/ieee754/ldbl-96/e_gammal_r.c
index a5767e7..78495d1 100644
--- a/sysdeps/ieee754/ldbl-96/e_gammal_r.c
+++ b/sysdeps/ieee754/ldbl-96/e_gammal_r.c
@@ -186,11 +186,7 @@ __ieee754_gammal_r (long double x, int *signgamp)
 	      ret = M_PIl / (-x * sinpix
 			     * gammal_positive (-x, &exp2_adj));
 	      ret = __scalbnl (ret, -exp2_adj);
-	      if (ret < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (ret);
 	    }
 	}
     }
diff --git a/sysdeps/ieee754/ldbl-96/e_j1l.c b/sysdeps/ieee754/ldbl-96/e_j1l.c
index 46e28df..1bca949 100644
--- a/sysdeps/ieee754/ldbl-96/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-96/e_j1l.c
@@ -154,11 +154,7 @@ __ieee754_j1l (long double x)
       if (huge + x > one)		/* inexact if x!=0 necessary */
 	{
 	  long double ret = 0.5 * x;
-	  if (fabsl (ret) < LDBL_MIN)
-	    {
-	      long double force_underflow = ret * ret;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (ret);
 	  return ret;
 	}
     }
diff --git a/sysdeps/ieee754/ldbl-96/e_jnl.c b/sysdeps/ieee754/ldbl-96/e_jnl.c
index 2f3a452..ed2068b 100644
--- a/sysdeps/ieee754/ldbl-96/e_jnl.c
+++ b/sysdeps/ieee754/ldbl-96/e_jnl.c
@@ -290,11 +290,8 @@ __ieee754_jnl (int n, long double x)
   }
   if (ret == 0)
     ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
-  else if (fabsl (ret) < LDBL_MIN)
-    {
-      long double force_underflow = ret * ret;
-      math_force_eval (force_underflow);
-    }
+  else
+    math_check_force_underflow (ret);
   return ret;
 }
 strong_alias (__ieee754_jnl, __jnl_finite)
diff --git a/sysdeps/ieee754/ldbl-96/e_sinhl.c b/sysdeps/ieee754/ldbl-96/e_sinhl.c
index de6dff6..095b142 100644
--- a/sysdeps/ieee754/ldbl-96/e_sinhl.c
+++ b/sysdeps/ieee754/ldbl-96/e_sinhl.c
@@ -60,11 +60,7 @@ __ieee754_sinhl(long double x)
     /* |x| in [0,25], return sign(x)*0.5*(E+E/(E+1))) */
 	if (ix < 0x4003 || (ix == 0x4003 && i0 <= 0xc8000000)) { /* |x|<25 */
 	    if (ix<0x3fdf) {		/* |x|<2**-32 */
-		if (fabsl (x) < LDBL_MIN)
-		  {
-		    long double force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
 	    }
 	    t = __expm1l(fabsl(x));
diff --git a/sysdeps/ieee754/ldbl-96/k_sinl.c b/sysdeps/ieee754/ldbl-96/k_sinl.c
index b7b5ae3..b709740 100644
--- a/sysdeps/ieee754/ldbl-96/k_sinl.c
+++ b/sysdeps/ieee754/ldbl-96/k_sinl.c
@@ -96,11 +96,7 @@ __kernel_sinl(long double x, long double y, int iy)
 	 polynomial of degree 17.  */
       if (absx < 0x1p-33L)
 	{
-	  if (fabsl (x) < LDBL_MIN)
-	    {
-	      long double force_underflow = x * x;
-	      math_force_eval (force_underflow);
-	    }
+	  math_check_force_underflow (x);
 	  if (!((int)x)) return x;	/* generate inexact */
 	}
       z = x * x;
diff --git a/sysdeps/ieee754/ldbl-96/k_tanl.c b/sysdeps/ieee754/ldbl-96/k_tanl.c
index 6276c06..6bee53e 100644
--- a/sysdeps/ieee754/ldbl-96/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-96/k_tanl.c
@@ -98,11 +98,7 @@ __kernel_tanl (long double x, long double y, int iy)
 	    return one / fabsl (x);
 	  else if (iy == 1)
 	    {
-	      if (absx < LDBL_MIN)
-		{
-		  long double force_underflow = x * x;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow_nonneg (absx);
 	      return x;
 	    }
 	  else
diff --git a/sysdeps/ieee754/ldbl-96/s_asinhl.c b/sysdeps/ieee754/ldbl-96/s_asinhl.c
index 75e47c7..da49ea5 100644
--- a/sysdeps/ieee754/ldbl-96/s_asinhl.c
+++ b/sysdeps/ieee754/ldbl-96/s_asinhl.c
@@ -45,11 +45,7 @@ long double __asinhl(long double x)
 	GET_LDOUBLE_EXP(hx,x);
 	ix = hx&0x7fff;
 	if(__builtin_expect(ix< 0x3fde, 0)) {	/* |x|<2**-34 */
-	    if (fabsl (x) < LDBL_MIN)
-	      {
-		long double force_underflow = x * x;
-		math_force_eval (force_underflow);
-	      }
+	    math_check_force_underflow (x);
 	    if(huge+x>one) return x;	/* return x inexact except 0 */
 	}
 	if(__builtin_expect(ix>0x4020,0)) {		/* |x| > 2**34 */
diff --git a/sysdeps/ieee754/ldbl-96/s_erfl.c b/sysdeps/ieee754/ldbl-96/s_erfl.c
index c27de81..d00adb1 100644
--- a/sysdeps/ieee754/ldbl-96/s_erfl.c
+++ b/sysdeps/ieee754/ldbl-96/s_erfl.c
@@ -274,11 +274,7 @@ __erfl (long double x)
 	    {
 	      /* Avoid spurious underflow.  */
 	      long double ret = 0.0625 * (16.0 * x + (16.0 * efx) * x);
-	      if (fabsl (ret) < LDBL_MIN)
-		{
-		  long double force_underflow = ret * ret;
-		  math_force_eval (force_underflow);
-		}
+	      math_check_force_underflow (ret);
 	      return ret;
 	    }
 	  return x + efx * x;
diff --git a/sysdeps/ieee754/ldbl-96/s_fmal.c b/sysdeps/ieee754/ldbl-96/s_fmal.c
index 1232c9e..d11885e 100644
--- a/sysdeps/ieee754/ldbl-96/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-96/s_fmal.c
@@ -92,8 +92,8 @@ __fmal (long double x, long double y, long double z)
 		     && w.ieee.mantissa1 == 0
 		     && w.ieee.mantissa0 == 0x80000000)))
 	    {
-	      volatile long double force_underflow = x * y;
-	      (void) force_underflow;
+	      long double force_underflow = x * y;
+	      math_force_eval (force_underflow);
 	    }
 	  return v.d * 0x1p-65L;
 	}
diff --git a/sysdeps/ieee754/ldbl-96/s_tanhl.c b/sysdeps/ieee754/ldbl-96/s_tanhl.c
index 035037c..38edf9f 100644
--- a/sysdeps/ieee754/ldbl-96/s_tanhl.c
+++ b/sysdeps/ieee754/ldbl-96/s_tanhl.c
@@ -71,11 +71,7 @@ long double __tanhl(long double x)
 		return x;		/* x == +- 0 */
 	    if (ix<0x3fc8)		/* |x|<2**-55 */
 	      {
-		if (fabsl (x) < LDBL_MIN)
-		  {
-		    long double force_underflow = x * x;
-		    math_force_eval (force_underflow);
-		  }
+		math_check_force_underflow (x);
 		return x*(one+tiny);	/* tanh(small) = small */
 	      }
 	    if (ix>=0x3fff) {	/* |x|>=1  */

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                |  153 ++++++++++++++++++++++++++++++
 math/e_exp2l.c                           |    6 +-
 math/k_casinh.c                          |    6 +-
 math/k_casinhf.c                         |    6 +-
 math/k_casinhl.c                         |    6 +-
 math/s_catan.c                           |   11 +--
 math/s_catanf.c                          |   11 +--
 math/s_catanh.c                          |   11 +--
 math/s_catanhf.c                         |   11 +--
 math/s_catanhl.c                         |   11 +--
 math/s_catanl.c                          |   11 +--
 math/s_ccosh.c                           |   13 +---
 math/s_ccoshf.c                          |   13 +---
 math/s_ccoshl.c                          |   13 +---
 math/s_cexp.c                            |   13 +---
 math/s_cexpf.c                           |   13 +---
 math/s_cexpl.c                           |   13 +---
 math/s_clog.c                            |   11 +--
 math/s_clog10.c                          |   11 +--
 math/s_clog10f.c                         |   11 +--
 math/s_clog10l.c                         |   11 +--
 math/s_clogf.c                           |   11 +--
 math/s_clogl.c                           |   11 +--
 math/s_csin.c                            |   13 +---
 math/s_csinf.c                           |   13 +---
 math/s_csinh.c                           |   13 +---
 math/s_csinhf.c                          |   13 +---
 math/s_csinhl.c                          |   13 +---
 math/s_csinl.c                           |   13 +---
 math/s_csqrt.c                           |   12 +--
 math/s_csqrtf.c                          |   12 +--
 math/s_csqrtl.c                          |   12 +--
 math/s_ctan.c                            |   11 +--
 math/s_ctanf.c                           |   11 +--
 math/s_ctanh.c                           |   11 +--
 math/s_ctanhf.c                          |   11 +--
 math/s_ctanhl.c                          |   11 +--
 math/s_ctanl.c                           |   11 +--
 stdlib/strtod_l.c                        |    4 +-
 sysdeps/generic/math_private.h           |   52 ++++++++++
 sysdeps/ieee754/dbl-64/e_asin.c          |    6 +-
 sysdeps/ieee754/dbl-64/e_atanh.c         |    6 +-
 sysdeps/ieee754/dbl-64/e_exp.c           |    5 +-
 sysdeps/ieee754/dbl-64/e_exp2.c          |    6 +-
 sysdeps/ieee754/dbl-64/e_gamma_r.c       |    6 +-
 sysdeps/ieee754/dbl-64/e_j1.c            |    6 +-
 sysdeps/ieee754/dbl-64/e_jn.c            |    7 +-
 sysdeps/ieee754/dbl-64/e_sinh.c          |    6 +-
 sysdeps/ieee754/dbl-64/s_asinh.c         |    6 +-
 sysdeps/ieee754/dbl-64/s_atan.c          |    6 +-
 sysdeps/ieee754/dbl-64/s_erf.c           |    6 +-
 sysdeps/ieee754/dbl-64/s_expm1.c         |    6 +-
 sysdeps/ieee754/dbl-64/s_fma.c           |    4 +-
 sysdeps/ieee754/dbl-64/s_log1p.c         |    6 +-
 sysdeps/ieee754/dbl-64/s_sin.c           |    6 +-
 sysdeps/ieee754/dbl-64/s_tan.c           |    6 +-
 sysdeps/ieee754/dbl-64/s_tanh.c          |    6 +-
 sysdeps/ieee754/flt-32/e_asinf.c         |    6 +-
 sysdeps/ieee754/flt-32/e_atanhf.c        |    6 +-
 sysdeps/ieee754/flt-32/e_exp2f.c         |    6 +-
 sysdeps/ieee754/flt-32/e_gammaf_r.c      |    6 +-
 sysdeps/ieee754/flt-32/e_j1f.c           |    5 +-
 sysdeps/ieee754/flt-32/e_jnf.c           |    6 +-
 sysdeps/ieee754/flt-32/e_sinhf.c         |    6 +-
 sysdeps/ieee754/flt-32/k_sinf.c          |    6 +-
 sysdeps/ieee754/flt-32/k_tanf.c          |    6 +-
 sysdeps/ieee754/flt-32/s_asinhf.c        |    6 +-
 sysdeps/ieee754/flt-32/s_atanf.c         |    6 +-
 sysdeps/ieee754/flt-32/s_erff.c          |    6 +-
 sysdeps/ieee754/flt-32/s_expm1f.c        |    6 +-
 sysdeps/ieee754/flt-32/s_log1pf.c        |    6 +-
 sysdeps/ieee754/flt-32/s_tanhf.c         |    6 +-
 sysdeps/ieee754/ldbl-128/e_asinl.c       |    6 +-
 sysdeps/ieee754/ldbl-128/e_atanhl.c      |    6 +-
 sysdeps/ieee754/ldbl-128/e_expl.c        |    6 +-
 sysdeps/ieee754/ldbl-128/e_gammal_r.c    |    6 +-
 sysdeps/ieee754/ldbl-128/e_j1l.c         |    6 +-
 sysdeps/ieee754/ldbl-128/e_jnl.c         |    7 +-
 sysdeps/ieee754/ldbl-128/e_sinhl.c       |    6 +-
 sysdeps/ieee754/ldbl-128/k_sincosl.c     |    6 +-
 sysdeps/ieee754/ldbl-128/k_sinl.c        |    6 +-
 sysdeps/ieee754/ldbl-128/k_tanl.c        |    6 +-
 sysdeps/ieee754/ldbl-128/s_asinhl.c      |    6 +-
 sysdeps/ieee754/ldbl-128/s_atanl.c       |    6 +-
 sysdeps/ieee754/ldbl-128/s_erfl.c        |    6 +-
 sysdeps/ieee754/ldbl-128/s_expm1l.c      |    6 +-
 sysdeps/ieee754/ldbl-128/s_fmal.c        |    4 +-
 sysdeps/ieee754/ldbl-128/s_log1pl.c      |    6 +-
 sysdeps/ieee754/ldbl-128/s_tanhl.c       |    6 +-
 sysdeps/ieee754/ldbl-128ibm/e_asinl.c    |    6 +-
 sysdeps/ieee754/ldbl-128ibm/e_atanhl.c   |    6 +-
 sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c |    6 +-
 sysdeps/ieee754/ldbl-128ibm/e_jnl.c      |    7 +-
 sysdeps/ieee754/ldbl-128ibm/e_sinhl.c    |    6 +-
 sysdeps/ieee754/ldbl-128ibm/k_sincosl.c  |    6 +-
 sysdeps/ieee754/ldbl-128ibm/k_sinl.c     |    6 +-
 sysdeps/ieee754/ldbl-128ibm/k_tanl.c     |    6 +-
 sysdeps/ieee754/ldbl-128ibm/s_asinhl.c   |    6 +-
 sysdeps/ieee754/ldbl-128ibm/s_atanl.c    |    6 +-
 sysdeps/ieee754/ldbl-128ibm/s_erfl.c     |    6 +-
 sysdeps/ieee754/ldbl-128ibm/s_tanhl.c    |    6 +-
 sysdeps/ieee754/ldbl-96/e_asinl.c        |    6 +-
 sysdeps/ieee754/ldbl-96/e_atanhl.c       |    6 +-
 sysdeps/ieee754/ldbl-96/e_gammal_r.c     |    6 +-
 sysdeps/ieee754/ldbl-96/e_j1l.c          |    6 +-
 sysdeps/ieee754/ldbl-96/e_jnl.c          |    7 +-
 sysdeps/ieee754/ldbl-96/e_sinhl.c        |    6 +-
 sysdeps/ieee754/ldbl-96/k_sinl.c         |    6 +-
 sysdeps/ieee754/ldbl-96/k_tanl.c         |    6 +-
 sysdeps/ieee754/ldbl-96/s_asinhl.c       |    6 +-
 sysdeps/ieee754/ldbl-96/s_erfl.c         |    6 +-
 sysdeps/ieee754/ldbl-96/s_fmal.c         |    4 +-
 sysdeps/ieee754/ldbl-96/s_tanhl.c        |    6 +-
 113 files changed, 334 insertions(+), 723 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]