aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>2018-06-10 22:42:34 -0300
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>2018-12-07 17:28:26 -0200
commit10446f5d9f2cf4d91c8ae483fd2b5470242ae2a1 (patch)
tree68e631fca5b65a44e28f5b3791ff2e9b8fc56a25 /stdio-common
parenthurd: Fix linknamespace of spawni (diff)
downloadglibc-10446f5d9f2cf4d91c8ae483fd2b5470242ae2a1.tar.gz
glibc-10446f5d9f2cf4d91c8ae483fd2b5470242ae2a1.tar.bz2
glibc-10446f5d9f2cf4d91c8ae483fd2b5470242ae2a1.zip
Prepare vfscanf to use __strtof128_internal
On powerpc64le, long double can currently take two formats: the same as double (-mlong-double-64) or IBM Extended Precision (default with -mlong-double-128 or explicitly with -mabi=ibmlongdouble). The internal implementation of scanf-like functions is aware of these possibilites and, based on the format in use, properly calls __strtold_internal or __strtod_internal, saving the return to a variable of type double or long double. When library support for TS 18661-3 was added to glibc, a new function, __strtof128_internal, was added to enable reading of floating-point values with IEEE binary128 format into the _Float128 type. Now that powerpc64le is getting support for its third long double format, and taking into account that this format is the same as the format of _Float128, this patch extends __vfscanf_internal and __vfwscanf_internal to call __strtof128_internal or __wcstof128_internal when appropriate. The result gets saved into a variable of _Float128 type. Tested for powerpc64le.
Diffstat (limited to 'stdio-common')
-rw-r--r--stdio-common/vfscanf-internal.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c
index 19cfef0906..5d002078d8 100644
--- a/stdio-common/vfscanf-internal.c
+++ b/stdio-common/vfscanf-internal.c
@@ -98,6 +98,9 @@
# define __strtold_internal __wcstold_internal
# define __strtod_internal __wcstod_internal
# define __strtof_internal __wcstof_internal
+# if __HAVE_FLOAT128_UNLIKE_LDBL
+# define __strtof128_internal __wcstof128_internal
+# endif
# define L_(Str) L##Str
# define CHAR_T wchar_t
@@ -2420,6 +2423,17 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr,
done = EOF;
goto errout;
}
+#if __HAVE_FLOAT128_UNLIKE_LDBL
+ if ((flags & LONGDBL) \
+ && (mode_flags & SCANF_LDBL_USES_FLOAT128) != 0)
+ {
+ _Float128 d = __strtof128_internal
+ (char_buffer_start (&charbuf), &tw, flags & GROUP);
+ if (!(flags & SUPPRESS) && tw != char_buffer_start (&charbuf))
+ *ARG (_Float128 *) = d;
+ }
+ else
+#endif
if ((flags & LONGDBL) \
&& __glibc_likely ((mode_flags & SCANF_LDBL_IS_DBL) == 0))
{