Reimplement min_of_type using __MATH_TG.

This patch reimplements the libm-internal min_of_type macro to use
__MATH_TG instead of its own local type-generic implementation, so
simplifying the code and reducing the number of different type-generic
implementation variants in use in glibc.

Tested for x86_64.

	* sysdeps/generic/math_private.h (__EXPR_FLT128): Remove macro.
	(min_of_type_f): New macro.
	(min_of_type_): Likewise.
	(min_of_type_l): Likewise.
	(min_of_type_f128): Likewise.
	(min_of_type): Define using __MATH_TG and taking an expression
	argument.
	(math_check_force_underflow): Pass expression instead of type to
	min_of_type.
	(math_check_force_underflow_nonneg): Likewise.
This commit is contained in:
Joseph Myers 2017-08-04 21:32:57 +00:00
parent 64d4dea6cd
commit 219dd320d6
2 changed files with 21 additions and 18 deletions

View File

@ -1,3 +1,16 @@
2017-08-04 Joseph Myers <joseph@codesourcery.com>
* sysdeps/generic/math_private.h (__EXPR_FLT128): Remove macro.
(min_of_type_f): New macro.
(min_of_type_): Likewise.
(min_of_type_l): Likewise.
(min_of_type_f128): Likewise.
(min_of_type): Define using __MATH_TG and taking an expression
argument.
(math_check_force_underflow): Pass expression instead of type to
min_of_type.
(math_check_force_underflow_nonneg): Likewise.
2017-08-04 H.J. Lu <hongjiu.lu@intel.com> 2017-08-04 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86/cpu-features.h [__ASSEMBLER__] * sysdeps/x86/cpu-features.h [__ASSEMBLER__]

View File

@ -301,24 +301,14 @@ extern void __docos (double __x, double __dx, double __v[]);
}) })
#endif #endif
#if __HAVE_DISTINCT_FLOAT128
# define __EXPR_FLT128(x, yes, no) \
__builtin_choose_expr (__builtin_types_compatible_p \
(x, long double), no, yes)
#else
# define __EXPR_FLT128(x, yes, no) no
#endif
#define fabs_tg(x) __MATH_TG ((x), (__typeof (x)) __builtin_fabs, (x)) #define fabs_tg(x) __MATH_TG ((x), (__typeof (x)) __builtin_fabs, (x))
#define min_of_type(type) __builtin_choose_expr \ #define min_of_type_f FLT_MIN
(__builtin_types_compatible_p (type, float), \ #define min_of_type_ DBL_MIN
FLT_MIN, \ #define min_of_type_l LDBL_MIN
__builtin_choose_expr \ #define min_of_type_f128 FLT128_MIN
(__builtin_types_compatible_p (type, double), \
DBL_MIN, \ #define min_of_type(x) __MATH_TG ((x), (__typeof (x)) min_of_type_, )
__EXPR_FLT128 (type, FLT128_MIN, LDBL_MIN)))
/* If X (which is not a NaN) is subnormal, force an underflow /* If X (which is not a NaN) is subnormal, force an underflow
exception. */ exception. */
@ -327,7 +317,7 @@ extern void __docos (double __x, double __dx, double __v[]);
{ \ { \
__typeof (x) force_underflow_tmp = (x); \ __typeof (x) force_underflow_tmp = (x); \
if (fabs_tg (force_underflow_tmp) \ if (fabs_tg (force_underflow_tmp) \
< min_of_type (__typeof (force_underflow_tmp))) \ < min_of_type (force_underflow_tmp)) \
{ \ { \
__typeof (force_underflow_tmp) force_underflow_tmp2 \ __typeof (force_underflow_tmp) force_underflow_tmp2 \
= force_underflow_tmp * force_underflow_tmp; \ = force_underflow_tmp * force_underflow_tmp; \
@ -341,7 +331,7 @@ extern void __docos (double __x, double __dx, double __v[]);
{ \ { \
__typeof (x) force_underflow_tmp = (x); \ __typeof (x) force_underflow_tmp = (x); \
if (force_underflow_tmp \ if (force_underflow_tmp \
< min_of_type (__typeof (force_underflow_tmp))) \ < min_of_type (force_underflow_tmp)) \
{ \ { \
__typeof (force_underflow_tmp) force_underflow_tmp2 \ __typeof (force_underflow_tmp) force_underflow_tmp2 \
= force_underflow_tmp * force_underflow_tmp; \ = force_underflow_tmp * force_underflow_tmp; \