From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 62686 invoked by alias); 14 Nov 2019 18:03:51 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 62677 invoked by uid 89); 14 Nov 2019 18:03:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.1 spammy=Double, HX-Languages-Length:4638 X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH v2 16/30] ldbl-128ibm-compat: Add strfmon_l with IEEE long double format To: "Gabriel F. T. Gomes" , libc-alpha@sourceware.org References: <20191025153410.15405-1-gabriel@inconstante.net.br> <20191025153410.15405-17-gabriel@inconstante.net.br> From: Paul E Murphy Message-ID: Date: Thu, 14 Nov 2019 18:03:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0 MIME-Version: 1.0 In-Reply-To: <20191025153410.15405-17-gabriel@inconstante.net.br> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2019-11/txt/msg00561.txt.bz2 On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote: > From: Rajalakshmi Srinivasaraghavan > > No changes since v1. > > -- 8< -- > Similarly to what has been done for printf-like functions, more > specifically to the internal implementation in __vfprintf_internal, this > patch extends __vstrfmon_l_internal to deal with long double values with > binary128 format (as a third format option and reusing the float128 > implementation). > > Tested for powerpc64le and x86_64. > --- > include/monetary.h | 1 + > stdlib/strfmon_l.c | 31 +++++++++++++--- > sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 12 +++++++ > sysdeps/ieee754/ldbl-128ibm-compat/Versions | 3 ++ > .../ldbl-128ibm-compat/ieee128-strfmon.c | 35 +++++++++++++++++++ > .../ldbl-128ibm-compat/ieee128-strfmon_l.c | 35 +++++++++++++++++++ > 6 files changed, 113 insertions(+), 4 deletions(-) > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon.c > create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon_l.c > > diff --git a/include/monetary.h b/include/monetary.h > index f59bdf9150..240925e87d 100644 > --- a/include/monetary.h > +++ b/include/monetary.h > @@ -15,5 +15,6 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > same format as double, in which case the flag should be set to one, > or as another format, otherwise. */ > #define STRFMON_LDBL_IS_DBL 0x0001 > +#define STRFMON_LDBL_USES_FLOAT128 0x0002 > > #endif > diff --git a/stdlib/strfmon_l.c b/stdlib/strfmon_l.c > index 134dad6963..b26cec24e2 100644 > --- a/stdlib/strfmon_l.c > +++ b/stdlib/strfmon_l.c > @@ -29,6 +29,7 @@ > #include > #include > #include "../locale/localeinfo.h" > +#include > > > #define out_char(Ch) \ > @@ -96,6 +97,9 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > { > double dbl; > long double ldbl; > +#if __HAVE_DISTINCT_FLOAT128 > + _Float128 f128; Nit, should this be a hard tab? Otherwise, OK > +#endif > } > fpnum; > int int_format; > @@ -106,6 +110,7 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > int group; > char pad; > int is_long_double; > + int is_binary128; > int p_sign_posn; > int n_sign_posn; > int sign_posn; > @@ -150,6 +155,7 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > group = 1; /* Print digits grouped. */ > pad = ' '; /* Fill character is . */ > is_long_double = 0; /* Double argument by default. */ > + is_binary128 = 0; /* Long double argument by default. */ Nit, is the spacing of the comment off here too? > p_sign_posn = -2; /* This indicates whether the */ > n_sign_posn = -2; /* '(' flag is given. */ > width = -1; /* No width specified so far. */ > @@ -270,6 +276,10 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > ++fmt; > if (__glibc_likely ((flags & STRFMON_LDBL_IS_DBL) == 0)) > is_long_double = 1; > +#if __HAVE_DISTINCT_FLOAT128 > + if (__glibc_likely ((flags & STRFMON_LDBL_USES_FLOAT128) != 0)) > + is_binary128 = is_long_double; > +#endif OK > } > > /* Handle format specifier. */ > @@ -324,10 +334,22 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > /* Now it's time to get the value. */ > if (is_long_double == 1) > { > - fpnum.ldbl = va_arg (ap, long double); > - is_negative = fpnum.ldbl < 0; > - if (is_negative) > - fpnum.ldbl = -fpnum.ldbl; > +#if __HAVE_DISTINCT_FLOAT128 > + if (is_binary128 == 1) > + { > + fpnum.f128 = va_arg (ap, _Float128); > + is_negative = fpnum.f128 < 0; > + if (is_negative) > + fpnum.f128 = -fpnum.f128; > + } > + else > +#endif > + { > + fpnum.ldbl = va_arg (ap, long double); > + is_negative = fpnum.ldbl < 0; > + if (is_negative) > + fpnum.ldbl = -fpnum.ldbl; > + } OK > } > else > { > @@ -517,6 +539,7 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc, > info.width = left_prec + (right_prec ? (right_prec + 1) : 0); > info.spec = 'f'; > info.is_long_double = is_long_double; > + info.is_binary128 = is_binary128; OK > info.group = group; > info.pad = pad; > info.extra = 1; /* This means use values from LC_MONETARY. */ > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon.c > diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon_l.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-strfmon_l.c OK