[v2,02/30] ldbl-128ibm-compat: Add wide character printing functions

Message ID 20191025153410.15405-3-gabriel@inconstante.net.br
State Committed
Commit 1771a5cf0eb58b44adcd3d3fba12c4781a5015af
Headers

Commit Message

Gabriel F. T. Gomes Oct. 25, 2019, 3:33 p.m. UTC
  From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>

No changes since v1.

-- 8< --
Similarly to what was done for regular character printing functions,
this patch uses the new mode mask, PRINTF_LDBL_USES_FLOAT128, in the
'mode' argument of the wide characters printing function,
__vfwprintf_internal (which is also extended to support printing
floating-point values with IEEE binary128, by saving floating-point
values into variables of type __float128 and adjusting the parameters to
__printf_fp and __printf_fphex as if it was a call from a wide-character
version of strfromf128 (even though such version does not exist)).

Tested for powerpc64le.
---
 sysdeps/ieee754/ldbl-128ibm-compat/Makefile   |  13 +-
 sysdeps/ieee754/ldbl-128ibm-compat/Versions   |   8 ++
 .../ldbl-128ibm-compat/ieee128-fwprintf.c     |  35 ++++++
 .../ldbl-128ibm-compat/ieee128-swprintf.c     |  36 ++++++
 .../ldbl-128ibm-compat/ieee128-vfwprintf.c    |  27 +++++
 .../ldbl-128ibm-compat/ieee128-vswprintf.c    |  28 +++++
 .../ldbl-128ibm-compat/ieee128-vwprintf.c     |  27 +++++
 .../ldbl-128ibm-compat/ieee128-wprintf.c      |  35 ++++++
 .../ldbl-128ibm-compat/test-wprintf-ibm128.c  |   1 +
 .../ldbl-128ibm-compat/test-wprintf-ieee128.c |   1 +
 .../test-wprintf-ldbl-compat.c                | 111 ++++++++++++++++++
 11 files changed, 321 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
  

Comments

Paul E Murphy Nov. 4, 2019, 3:08 p.m. UTC | #1
On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote:
> From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>
> 
> No changes since v1.
> 
> -- 8< --
> Similarly to what was done for regular character printing functions,
> this patch uses the new mode mask, PRINTF_LDBL_USES_FLOAT128, in the
> 'mode' argument of the wide characters printing function,
> __vfwprintf_internal (which is also extended to support printing
> floating-point values with IEEE binary128, by saving floating-point
> values into variables of type __float128 and adjusting the parameters to
> __printf_fp and __printf_fphex as if it was a call from a wide-character
> version of strfromf128 (even though such version does not exist)).
> 
> Tested for powerpc64le.
> ---
>   sysdeps/ieee754/ldbl-128ibm-compat/Makefile   |  13 +-
>   sysdeps/ieee754/ldbl-128ibm-compat/Versions   |   8 ++
>   .../ldbl-128ibm-compat/ieee128-fwprintf.c     |  35 ++++++
>   .../ldbl-128ibm-compat/ieee128-swprintf.c     |  36 ++++++
>   .../ldbl-128ibm-compat/ieee128-vfwprintf.c    |  27 +++++
>   .../ldbl-128ibm-compat/ieee128-vswprintf.c    |  28 +++++
>   .../ldbl-128ibm-compat/ieee128-vwprintf.c     |  27 +++++
>   .../ldbl-128ibm-compat/ieee128-wprintf.c      |  35 ++++++
>   .../ldbl-128ibm-compat/test-wprintf-ibm128.c  |   1 +
>   .../ldbl-128ibm-compat/test-wprintf-ieee128.c |   1 +
>   .../test-wprintf-ldbl-compat.c                | 111 ++++++++++++++++++
>   11 files changed, 321 insertions(+), 1 deletion(-)
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
>   create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
> 
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> index 89059f37e2..0f2f58d5b9 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
> @@ -11,7 +11,13 @@ ldbl-extra-routines += printf_size \
>   		       vfprintf \
>   		       vprintf \
>   		       vsnprintf \
> -		       vsprintf
> +		       vsprintf \
> +		       fwprintf \
> +		       swprintf \
> +		       wprintf \
> +		       vfwprintf \
> +		       vswprintf \
> +		       vwprintf
> 
>   # Printing long double values with IEEE binary128 format reuses part
>   # of the internal float128 implementation (__printf_fp, __printf_fphex,
> @@ -19,6 +25,7 @@ ldbl-extra-routines += printf_size \
>   # the following functions, must have -mfloat128 and -mabi=ibmlongdouble
>   # passed to the compiler.
>   CFLAGS-vfprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
> +CFLAGS-vfwprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
> 
>   # Basic tests for the implementation of long double with IEEE binary128
>   # format and for the related redirections in installed headers.
> @@ -26,6 +33,10 @@ tests-internal += test-printf-ieee128 test-printf-ibm128
>   CFLAGS-test-printf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
>   CFLAGS-test-printf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
> 
> +tests-internal += test-wprintf-ieee128 test-wprintf-ibm128
> +CFLAGS-test-wprintf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
> +CFLAGS-test-wprintf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
> +
>   tests-internal += test-printf-size-ieee128 test-printf-size-ibm128
>   CFLAGS-test-printf-size-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
>   CFLAGS-test-printf-size-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> index 6a27befed2..0485a2b5d4 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
> @@ -134,5 +134,13 @@ libc {
>       __vprintfieee128;
>       __vsnprintfieee128;
>       __vsprintfieee128;
> +
> +    __fwprintfieee128;
> +    __swprintfieee128;
> +    __wprintfieee128;
> +
> +    __vfwprintfieee128;
> +    __vswprintfieee128;
> +    __vwprintfieee128;
>     }
>   }

Looks OK, and is consistent with committed patches.

> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c

The 6 wide-character printf wrappers look OK too.

> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
> new file mode 100644
> index 0000000000..9e230cd6f8
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
> @@ -0,0 +1 @@
> +#include <test-wprintf-ldbl-compat.c>
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
> new file mode 100644
> index 0000000000..9e230cd6f8
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
> @@ -0,0 +1 @@
> +#include <test-wprintf-ldbl-compat.c>
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
> new file mode 100644
> index 0000000000..71edfec235
> --- /dev/null
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
> @@ -0,0 +1,111 @@
> +/* Test for the long double variants of *w*printf functions.
> +   Copyright (C) 2019 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdarg.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <wchar.h>
> +
> +#include <support/capture_subprocess.h>
> +#include <support/check.h>
> +
> +static void
> +do_test_call_varg (FILE *stream, const wchar_t *format, ...)
> +{
> +  wchar_t string[128];
> +  va_list args;
> +
> +  wprintf (L"%15Ls", L"vfwprintf: ");
> +  va_start (args, format);
> +  vfwprintf (stream, format, args);
> +  va_end (args);
> +  wprintf (L"\n");
> +
> +  wprintf (L"%15Ls", L"vswprintf: ");
> +  va_start (args, format);
> +  vswprintf (string, 127, format, args);
> +  va_end (args);
> +  wprintf (L"%Ls", string);
> +  wprintf (L"\n");
> +
> +  wprintf (L"%15Ls", L"vwprintf: ");
> +  va_start (args, format);
> +  vwprintf (format, args);
> +  va_end (args);
> +  wprintf (L"\n");
> +}
> +
> +static void
> +do_test_call_rarg (FILE *stream, const wchar_t *format, long double ld)
> +{
> +  wchar_t string[128];
> +
> +  wprintf (L"%15Ls", L"fwprintf: ");
> +  fwprintf (stream, format, ld);
> +  wprintf (L"\n");
> +
> +  wprintf (L"%15Ls", L"swprintf: ");
> +  swprintf (string, 127, format, ld);
> +  wprintf (L"%Ls", string);
> +  wprintf (L"\n");
> +
> +  wprintf (L"%15Ls", L"wprintf: ");
> +  wprintf (format, ld);
> +  wprintf (L"\n");
> +}
> +
> +static void
> +do_test_call (void)
> +{
> +  long double ld = -1;
> +
> +  /* Print in decimal notation.  */
> +  do_test_call_rarg (stdout, L"%.10Lf", ld);
> +  do_test_call_varg (stdout, L"%.10Lf", ld);
> +
> +  /* Print in hexadecimal notation.  */
> +  do_test_call_rarg (stdout, L"%.10La", ld);
> +  do_test_call_varg (stdout, L"%.10La", ld);
> +}
> +
> +static int
> +do_test (void)
> +{
> +  struct support_capture_subprocess result;
> +  result = support_capture_subprocess ((void *) &do_test_call, NULL);
> +
> +  /* Compare against the expected output.  */
> +  const char *expected =
> +    "     fwprintf: -1.0000000000\n"
> +    "     swprintf: -1.0000000000\n"
> +    "      wprintf: -1.0000000000\n"
> +    "    vfwprintf: -1.0000000000\n"
> +    "    vswprintf: -1.0000000000\n"
> +    "     vwprintf: -1.0000000000\n"
> +    "     fwprintf: -0x1.0000000000p+0\n"
> +    "     swprintf: -0x1.0000000000p+0\n"
> +    "      wprintf: -0x1.0000000000p+0\n"
> +    "    vfwprintf: -0x1.0000000000p+0\n"
> +    "    vswprintf: -0x1.0000000000p+0\n"
> +    "     vwprintf: -0x1.0000000000p+0\n";
> +  TEST_COMPARE_STRING (expected, result.out.buffer);
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> 

Is it prohibitively difficult to merge the wide character tester with 
the one in the previous patch? Otherwise, this looks OK too.
  
Gabriel F. T. Gomes Nov. 4, 2019, 6:10 p.m. UTC | #2
Hi, Paul,

On Mon, 04 Nov 2019, Paul E Murphy wrote:
>
>Is it prohibitively difficult to merge the wide character tester with 
>the one in the previous patch? Otherwise, this looks OK too.

It's not difficult...  In fact, that's how I started it, but it ended up
being too hard to read (imo, anyway), because of the excessive use of
macros and because of the not so nice correspondence between function
names.

I suppose you're suggesting it so that we have less code duplication.
I can make the merge...  It's just not how I would do it.
  
Paul E Murphy Nov. 4, 2019, 8:11 p.m. UTC | #3
On 11/4/19 12:10 PM, Gabriel F. T. Gomes wrote:
> Hi, Paul,
> 
> On Mon, 04 Nov 2019, Paul E Murphy wrote:
>>
>> Is it prohibitively difficult to merge the wide character tester with
>> the one in the previous patch? Otherwise, this looks OK too.
> 
> It's not difficult...  In fact, that's how I started it, but it ended up
> being too hard to read (imo, anyway), because of the excessive use of
> macros and because of the not so nice correspondence between function
> names.
> 
> I suppose you're suggesting it so that we have less code duplication.
> I can make the merge...  It's just not how I would do it.

I can agree with this line of reasoning. I think the tradeoff made by 
these patches is OK. I don't think these tests will see much change once 
merged.
  

Patch

diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 89059f37e2..0f2f58d5b9 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
@@ -11,7 +11,13 @@  ldbl-extra-routines += printf_size \
 		       vfprintf \
 		       vprintf \
 		       vsnprintf \
-		       vsprintf
+		       vsprintf \
+		       fwprintf \
+		       swprintf \
+		       wprintf \
+		       vfwprintf \
+		       vswprintf \
+		       vwprintf
 
 # Printing long double values with IEEE binary128 format reuses part
 # of the internal float128 implementation (__printf_fp, __printf_fphex,
@@ -19,6 +25,7 @@  ldbl-extra-routines += printf_size \
 # the following functions, must have -mfloat128 and -mabi=ibmlongdouble
 # passed to the compiler.
 CFLAGS-vfprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
+CFLAGS-vfwprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
 
 # Basic tests for the implementation of long double with IEEE binary128
 # format and for the related redirections in installed headers.
@@ -26,6 +33,10 @@  tests-internal += test-printf-ieee128 test-printf-ibm128
 CFLAGS-test-printf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-test-printf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
 
+tests-internal += test-wprintf-ieee128 test-wprintf-ibm128
+CFLAGS-test-wprintf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
+CFLAGS-test-wprintf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+
 tests-internal += test-printf-size-ieee128 test-printf-size-ibm128
 CFLAGS-test-printf-size-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-test-printf-size-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
index 6a27befed2..0485a2b5d4 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
@@ -134,5 +134,13 @@  libc {
     __vprintfieee128;
     __vsnprintfieee128;
     __vsprintfieee128;
+
+    __fwprintfieee128;
+    __swprintfieee128;
+    __wprintfieee128;
+
+    __vfwprintfieee128;
+    __vswprintfieee128;
+    __vwprintfieee128;
   }
 }
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c
new file mode 100644
index 0000000000..4b350a6e0b
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf.c
@@ -0,0 +1,35 @@ 
+/* Wrapper for fwprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern int
+___ieee128_fwprintf (FILE *fp, const wchar_t *format, ...)
+{
+  va_list ap;
+  int done;
+
+  va_start (ap, format);
+  done = __vfwprintf_internal (fp, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+  va_end (ap);
+
+  return done;
+}
+strong_alias (___ieee128_fwprintf, __fwprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c
new file mode 100644
index 0000000000..4fb40e3c42
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf.c
@@ -0,0 +1,36 @@ 
+/* Wrapper for swprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern int
+___ieee128_swprintf (wchar_t *string, size_t maxlen,
+		    const wchar_t *format, ...)
+{
+  va_list ap;
+  int done;
+
+  va_start (ap, format);
+  done = __vswprintf_internal (string, maxlen, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+  va_end (ap);
+
+  return done;
+}
+strong_alias (___ieee128_swprintf, __swprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c
new file mode 100644
index 0000000000..757f4b31a8
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf.c
@@ -0,0 +1,27 @@ 
+/* Wrapper for vfwprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <libio/libioP.h>
+
+extern int
+___ieee128_vfwprintf (FILE *fp, const wchar_t *format, va_list ap)
+{
+  return __vfwprintf_internal (fp, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+}
+strong_alias (___ieee128_vfwprintf, __vfwprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c
new file mode 100644
index 0000000000..9bb36cfae9
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf.c
@@ -0,0 +1,28 @@ 
+/* Wrapper for vswprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <libio/libioP.h>
+
+extern int
+___ieee128_vswprintf (wchar_t *string, size_t maxlen,
+		     const wchar_t *format, va_list ap)
+{
+  return __vswprintf_internal (string, maxlen, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+}
+strong_alias (___ieee128_vswprintf, __vswprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c
new file mode 100644
index 0000000000..44ec37e24f
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf.c
@@ -0,0 +1,27 @@ 
+/* Wrapper for vwprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <libio/libioP.h>
+
+extern int
+___ieee128_vwprintf (const wchar_t *format, va_list ap)
+{
+  return __vfwprintf_internal (stdout, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+}
+strong_alias (___ieee128_vwprintf, __vwprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c
new file mode 100644
index 0000000000..c949f328c2
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf.c
@@ -0,0 +1,35 @@ 
+/* Wrapper for wprintf.  IEEE128 version.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern int
+___ieee128_wprintf (const wchar_t *format, ...)
+{
+  va_list ap;
+  int done;
+
+  va_start (ap, format);
+  done = __vfwprintf_internal (stdout, format, ap,
+			       PRINTF_LDBL_USES_FLOAT128);
+  va_end (ap);
+
+  return done;
+}
+strong_alias (___ieee128_wprintf, __wprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
new file mode 100644
index 0000000000..9e230cd6f8
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ibm128.c
@@ -0,0 +1 @@ 
+#include <test-wprintf-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
new file mode 100644
index 0000000000..9e230cd6f8
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ieee128.c
@@ -0,0 +1 @@ 
+#include <test-wprintf-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
new file mode 100644
index 0000000000..71edfec235
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-wprintf-ldbl-compat.c
@@ -0,0 +1,111 @@ 
+/* Test for the long double variants of *w*printf functions.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <wchar.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+
+static void
+do_test_call_varg (FILE *stream, const wchar_t *format, ...)
+{
+  wchar_t string[128];
+  va_list args;
+
+  wprintf (L"%15Ls", L"vfwprintf: ");
+  va_start (args, format);
+  vfwprintf (stream, format, args);
+  va_end (args);
+  wprintf (L"\n");
+
+  wprintf (L"%15Ls", L"vswprintf: ");
+  va_start (args, format);
+  vswprintf (string, 127, format, args);
+  va_end (args);
+  wprintf (L"%Ls", string);
+  wprintf (L"\n");
+
+  wprintf (L"%15Ls", L"vwprintf: ");
+  va_start (args, format);
+  vwprintf (format, args);
+  va_end (args);
+  wprintf (L"\n");
+}
+
+static void
+do_test_call_rarg (FILE *stream, const wchar_t *format, long double ld)
+{
+  wchar_t string[128];
+
+  wprintf (L"%15Ls", L"fwprintf: ");
+  fwprintf (stream, format, ld);
+  wprintf (L"\n");
+
+  wprintf (L"%15Ls", L"swprintf: ");
+  swprintf (string, 127, format, ld);
+  wprintf (L"%Ls", string);
+  wprintf (L"\n");
+
+  wprintf (L"%15Ls", L"wprintf: ");
+  wprintf (format, ld);
+  wprintf (L"\n");
+}
+
+static void
+do_test_call (void)
+{
+  long double ld = -1;
+
+  /* Print in decimal notation.  */
+  do_test_call_rarg (stdout, L"%.10Lf", ld);
+  do_test_call_varg (stdout, L"%.10Lf", ld);
+
+  /* Print in hexadecimal notation.  */
+  do_test_call_rarg (stdout, L"%.10La", ld);
+  do_test_call_varg (stdout, L"%.10La", ld);
+}
+
+static int
+do_test (void)
+{
+  struct support_capture_subprocess result;
+  result = support_capture_subprocess ((void *) &do_test_call, NULL);
+
+  /* Compare against the expected output.  */
+  const char *expected =
+    "     fwprintf: -1.0000000000\n"
+    "     swprintf: -1.0000000000\n"
+    "      wprintf: -1.0000000000\n"
+    "    vfwprintf: -1.0000000000\n"
+    "    vswprintf: -1.0000000000\n"
+    "     vwprintf: -1.0000000000\n"
+    "     fwprintf: -0x1.0000000000p+0\n"
+    "     swprintf: -0x1.0000000000p+0\n"
+    "      wprintf: -0x1.0000000000p+0\n"
+    "    vfwprintf: -0x1.0000000000p+0\n"
+    "    vswprintf: -0x1.0000000000p+0\n"
+    "     vwprintf: -0x1.0000000000p+0\n";
+  TEST_COMPARE_STRING (expected, result.out.buffer);
+
+  return 0;
+}
+
+#include <support/test-driver.c>