This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v3] Enable inlining issignalingf within glibc (was "v2")
- From: Paul Clarke <pc at us dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Cc: joseph at codesourcery dot com
- Date: Mon, 30 Sep 2019 10:19:25 -0500
- Subject: Re: [PATCH v3] Enable inlining issignalingf within glibc (was "v2")
- References: <1569851517-5682-1-git-send-email-pc@us.ibm.com>
Sorry, this should've been noted as "v3". ugh
On 9/30/19 8:51 AM, Paul A. Clarke wrote:
> From: "Paul A. Clarke" <pc@us.ibm.com>
>
> issignalingf is a very small function used in some areas where
> better performance (and smaller code) might be helpful.
>
> Create inline implementation for issignalingf.
>
> 2019-09-30 Paul A. Clarke <pc@us.ibm.com>
>
> * sysdeps/generic/math_private.h (GET_FLOAT_WORD, SET_FLOAT_WORD):
> Moved...
> * include/math.h (GET_FLOAT_WORD, SET_FLOAT_WORD): to here.
> (__issignalingf): New, copied from
> sysdeps/iee754/flt-32/s_issignalingf.c.
> ---
> v2:
> - New approach as suggested by Joseph Myers: no implementations in
> math_private.h, instead in include/math.h.
> - Moved GET_FLOAT_WORD from math_private.h to include/math.h in support.
> - Brought along matching SET_FLOAT_WORD for consistency.
>
> include/math.h | 53 ++++++++++++++++++++++++++++++++++++++++++
> sysdeps/generic/math_private.h | 29 -----------------------
> 2 files changed, 53 insertions(+), 29 deletions(-)
>
> diff --git a/include/math.h b/include/math.h
> index 79ebbae..a274f2b 100644
> --- a/include/math.h
> +++ b/include/math.h
> @@ -54,6 +54,59 @@ libm_hidden_proto (__expf128)
> libm_hidden_proto (__expm1f128)
> # endif
>
> +#include <stdint.h>
> +#include <nan-high-order-bit.h>
> +
> +/* A union which permits us to convert between a float and a 32 bit
> + int. */
> +
> +typedef union
> +{
> + float value;
> + uint32_t word;
> +} ieee_float_shape_type;
> +
> +/* Get a 32 bit int from a float. */
> +#ifndef GET_FLOAT_WORD
> +# define GET_FLOAT_WORD(i,d) \
> +do { \
> + ieee_float_shape_type gf_u; \
> + gf_u.value = (d); \
> + (i) = gf_u.word; \
> +} while (0)
> +#endif
> +
> +/* Set a float from a 32 bit int. */
> +#ifndef SET_FLOAT_WORD
> +# define SET_FLOAT_WORD(d,i) \
> +do { \
> + ieee_float_shape_type sf_u; \
> + sf_u.word = (i); \
> + (d) = sf_u.value; \
> +} while (0)
> +#endif
> +
> +extern inline int
> +__issignalingf (float x)
> +{
> + uint32_t xi;
> + GET_FLOAT_WORD (xi, x);
> +#if HIGH_ORDER_BIT_IS_SET_FOR_SNAN
> + /* We only have to care about the high-order bit of x's significand, because
> + having it set (sNaN) already makes the significand different from that
> + used to designate infinity. */
> + return (xi & 0x7fc00000) == 0x7fc00000;
> +#else
> + /* To keep the following comparison simple, toggle the quiet/signaling bit,
> + so that it is set for sNaNs. This is inverse to IEEE 754-2008 (as well as
> + common practice for IEEE 754-1985). */
> + xi ^= 0x00400000;
> + /* We have to compare for greater (instead of greater or equal), because x's
> + significand being all-zero designates infinity not NaN. */
> + return (xi & 0x7fffffff) > 0x7fc00000;
> +#endif
> +}
> +
> # if __HAVE_DISTINCT_FLOAT128
>
> /* __builtin_isinf_sign is broken in GCC < 7 for float128. */
> diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h
> index d91b929..9296324 100644
> --- a/sysdeps/generic/math_private.h
> +++ b/sysdeps/generic/math_private.h
> @@ -153,35 +153,6 @@ do { \
> } while (0)
> #endif
>
> -/* A union which permits us to convert between a float and a 32 bit
> - int. */
> -
> -typedef union
> -{
> - float value;
> - uint32_t word;
> -} ieee_float_shape_type;
> -
> -/* Get a 32 bit int from a float. */
> -#ifndef GET_FLOAT_WORD
> -# define GET_FLOAT_WORD(i,d) \
> -do { \
> - ieee_float_shape_type gf_u; \
> - gf_u.value = (d); \
> - (i) = gf_u.word; \
> -} while (0)
> -#endif
> -
> -/* Set a float from a 32 bit int. */
> -#ifndef SET_FLOAT_WORD
> -# define SET_FLOAT_WORD(d,i) \
> -do { \
> - ieee_float_shape_type sf_u; \
> - sf_u.word = (i); \
> - (d) = sf_u.value; \
> -} while (0)
> -#endif
> -
> /* We need to guarantee an expansion of name when building
> ldbl-128 files as another type (e.g _Float128). */
> #define mathx_hidden_def(name) hidden_def(name)
>
PC