about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-05-16 00:05:28 +0000
committerJoseph Myers <joseph@codesourcery.com>2018-05-16 00:05:28 +0000
commit69a01461ee1417578d2ba20aac935828b50f1118 (patch)
tree1801dbdbca57e3e1ce053aec41e83938d2d19e06 /sysdeps
parenta15529fda8d132621328c3fe32997a3d9c55aef4 (diff)
downloadglibc-69a01461ee1417578d2ba20aac935828b50f1118.tar.gz
glibc-69a01461ee1417578d2ba20aac935828b50f1118.tar.xz
glibc-69a01461ee1417578d2ba20aac935828b50f1118.zip
Add narrowing multiply functions.
This patch adds the narrowing multiply functions from TS 18661-1 to
glibc's libm: fmul, fmull, dmull, f32mulf64, f32mulf32x, f32xmulf64
for all configurations; f32mulf64x, f32mulf128, f64mulf64x,
f64mulf128, f32xmulf64x, f32xmulf128, f64xmulf128 for configurations
with _Float64x and _Float128; __nldbl_dmull for ldbl-opt.

The changes are mostly essentially the same as for the narrowing add
functions, so the description of those generally applies to this patch
as well.  f32xmulf64 for i386 cannot use precision control as used for
add and subtract, because that would result in double rounding for
subnormal results, so that uses round-to-odd with long double
intermediate result instead.  The soft-fp support involves adding a
new FP_TRUNC_COOKED since soft-fp multiplication uses cooked inputs
and outputs.

Tested for x86_64, x86, mips64 (all three ABIs, both hard and soft
float) and powerpc, and with build-many-glibcs.py.

	* math/Makefile (libm-narrow-fns): Add mul.
	(libm-test-funcs-narrow): Likewise.
	* math/Versions (GLIBC_2.28): Add narrowing multiply functions.
	* math/bits/mathcalls-narrow.h (mul): Use __MATHCALL_NARROW.
	* math/gen-auto-libm-tests.c (test_functions): Add mul.
	* math/math-narrow.h (CHECK_NARROW_MUL): New macro.
	(NARROW_MUL_ROUND_TO_ODD): Likewise.
	(NARROW_MUL_TRIVIAL): Likewise.
	* soft-fp/op-common.h (FP_TRUNC_COOKED): Likewise.
	* sysdeps/ieee754/float128/float128_private.h (__fmull): New
	macro.
	(__dmull): Likewise.
	* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add fmul and
	dmul.
	(CFLAGS-nldbl-dmul.c): New variable.
	(CFLAGS-nldbl-fmul.c): Likewise.
	* sysdeps/ieee754/ldbl-opt/Versions (GLIBC_2.28): Add
	__nldbl_dmull.
	* sysdeps/ieee754/ldbl-opt/nldbl-compat.h (__nldbl_dmull): New
	prototype.
	* manual/arith.texi (Misc FP Arithmetic): Document fmul, fmull,
	dmull, fMmulfN, fMmulfNx, fMxmulfN and fMxmulfNx.
	* math/auto-libm-test-in: Add tests of mul.
	* math/auto-libm-test-out-narrow-mul: New generated file.
	* math/libm-test-narrow-mul.inc: New file.
	* sysdeps/i386/fpu/s_f32xmulf64.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_f32xmulf64.c: Likewise.
	* sysdeps/ieee754/dbl-64/s_fmul.c: Likewise.
	* sysdeps/ieee754/float128/s_f32mulf128.c: Likewise.
	* sysdeps/ieee754/float128/s_f64mulf128.c: Likewise.
	* sysdeps/ieee754/float128/s_f64xmulf128.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_dmull.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_f64xmulf128.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_fmull.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_dmull.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_fmull.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_dmull.c: Likewise.
	* sysdeps/ieee754/ldbl-96/s_fmull.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-dmul.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/nldbl-fmul.c: Likewise.
	* sysdeps/ieee754/soft-fp/s_dmull.c: Likewise.
	* sysdeps/ieee754/soft-fp/s_fmul.c: Likewise.
	* sysdeps/ieee754/soft-fp/s_fmull.c: Likewise.
	* sysdeps/powerpc/fpu/libm-test-ulps: Update.
	* sysdeps/mach/hurd/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/fpu/s_f32xmulf64.c29
-rw-r--r--sysdeps/ieee754/dbl-64/s_f32xmulf64.c30
-rw-r--r--sysdeps/ieee754/dbl-64/s_fmul.c34
-rw-r--r--sysdeps/ieee754/float128/float128_private.h2
-rw-r--r--sysdeps/ieee754/float128/s_f32mulf128.c6
-rw-r--r--sysdeps/ieee754/float128/s_f64mulf128.c10
-rw-r--r--sysdeps/ieee754/float128/s_f64xmulf128.c2
-rw-r--r--sysdeps/ieee754/ldbl-128/s_dmull.c37
-rw-r--r--sysdeps/ieee754/ldbl-128/s_f64xmulf128.c38
-rw-r--r--sysdeps/ieee754/ldbl-128/s_fmull.c33
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_dmull.c27
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_fmull.c27
-rw-r--r--sysdeps/ieee754/ldbl-96/s_dmull.c33
-rw-r--r--sysdeps/ieee754/ldbl-96/s_fmull.c31
-rw-r--r--sysdeps/ieee754/ldbl-opt/Makefile4
-rw-r--r--sysdeps/ieee754/ldbl-opt/Versions2
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-compat.h1
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-dmul.c28
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-fmul.c28
-rw-r--r--sysdeps/ieee754/soft-fp/s_dmull.c59
-rw-r--r--sysdeps/ieee754/soft-fp/s_fmul.c56
-rw-r--r--sysdeps/ieee754/soft-fp/s_fmull.c55
-rw-r--r--sysdeps/mach/hurd/i386/libm.abilist13
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps16
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/arm/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/i386/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/sh/libm.abilist6
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist14
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libm.abilist13
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist13
48 files changed, 842 insertions, 2 deletions
diff --git a/sysdeps/i386/fpu/s_f32xmulf64.c b/sysdeps/i386/fpu/s_f32xmulf64.c
new file mode 100644
index 0000000000..7710fa47a8
--- /dev/null
+++ b/sysdeps/i386/fpu/s_f32xmulf64.c
@@ -0,0 +1,29 @@
+/* Multiply _Float64 values, converting the result to _Float32x.  i386 version.
+   Copyright (C) 2018 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 <math.h>
+#include <math-narrow.h>
+
+_Float32x
+__f32xmulf64 (_Float64 x, _Float64 y)
+{
+  /* To avoid double rounding, use round-to-odd on long double.  */
+  NARROW_MUL_ROUND_TO_ODD ((long double) x, (long double) y, double,
+			   union ieee854_long_double, l, mantissa1);
+}
+libm_alias_float32x_float64 (mul)
diff --git a/sysdeps/ieee754/dbl-64/s_f32xmulf64.c b/sysdeps/ieee754/dbl-64/s_f32xmulf64.c
new file mode 100644
index 0000000000..f899c84567
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_f32xmulf64.c
@@ -0,0 +1,30 @@
+/* Multiply _Float64 values, converting the result to _Float32x.
+   Copyright (C) 2018 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/>.  */
+
+#define dmull __hide_dmull
+#include <math.h>
+#undef dmull
+
+#include <math-narrow.h>
+
+_Float32x
+__f32xmulf64 (_Float64 x, _Float64 y)
+{
+  NARROW_MUL_TRIVIAL (x, y, _Float32x);
+}
+libm_alias_float32x_float64 (mul)
diff --git a/sysdeps/ieee754/dbl-64/s_fmul.c b/sysdeps/ieee754/dbl-64/s_fmul.c
new file mode 100644
index 0000000000..ad9ab7e94d
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/s_fmul.c
@@ -0,0 +1,34 @@
+/* Multiply double values, narrowing the result to float.
+   Copyright (C) 2018 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/>.  */
+
+#define f32mulf64 __hide_f32mulf64
+#define f32mulf32x __hide_f32mulf32x
+#define fmull __hide_fmull
+#include <math.h>
+#undef f32mulf64
+#undef f32mulf32x
+#undef fmull
+
+#include <math-narrow.h>
+
+float
+__fmul (double x, double y)
+{
+  NARROW_MUL_ROUND_TO_ODD (x, y, float, union ieee754_double, , mantissa1);
+}
+libm_alias_float_double (mul)
diff --git a/sysdeps/ieee754/float128/float128_private.h b/sysdeps/ieee754/float128/float128_private.h
index 7606026593..9136e5351b 100644
--- a/sysdeps/ieee754/float128/float128_private.h
+++ b/sysdeps/ieee754/float128/float128_private.h
@@ -258,6 +258,8 @@
 
 #define __faddl __f32addf128
 #define __daddl __f64addf128
+#define __fmull __f32mulf128
+#define __dmull __f64mulf128
 #define __fsubl __f32subf128
 #define __dsubl __f64subf128
 
diff --git a/sysdeps/ieee754/float128/s_f32mulf128.c b/sysdeps/ieee754/float128/s_f32mulf128.c
new file mode 100644
index 0000000000..45fdc66ba6
--- /dev/null
+++ b/sysdeps/ieee754/float128/s_f32mulf128.c
@@ -0,0 +1,6 @@
+#define f32mulf64x __hide_f32mulf64x
+#define f32mulf128 __hide_f32mulf128
+#include <float128_private.h>
+#undef f32mulf64x
+#undef f32mulf128
+#include "../ldbl-128/s_fmull.c"
diff --git a/sysdeps/ieee754/float128/s_f64mulf128.c b/sysdeps/ieee754/float128/s_f64mulf128.c
new file mode 100644
index 0000000000..47a645ac4d
--- /dev/null
+++ b/sysdeps/ieee754/float128/s_f64mulf128.c
@@ -0,0 +1,10 @@
+#define f32xmulf64x __hide_f32xmulf64x
+#define f32xmulf128 __hide_f32xmulf128
+#define f64mulf64x __hide_f64mulf64x
+#define f64mulf128 __hide_f64mulf128
+#include <float128_private.h>
+#undef f32xmulf64x
+#undef f32xmulf128
+#undef f64mulf64x
+#undef f64mulf128
+#include "../ldbl-128/s_dmull.c"
diff --git a/sysdeps/ieee754/float128/s_f64xmulf128.c b/sysdeps/ieee754/float128/s_f64xmulf128.c
new file mode 100644
index 0000000000..085bf9fe4e
--- /dev/null
+++ b/sysdeps/ieee754/float128/s_f64xmulf128.c
@@ -0,0 +1,2 @@
+#include <float128_private.h>
+#include "../ldbl-128/s_f64xmulf128.c"
diff --git a/sysdeps/ieee754/ldbl-128/s_dmull.c b/sysdeps/ieee754/ldbl-128/s_dmull.c
new file mode 100644
index 0000000000..d32c4284e0
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_dmull.c
@@ -0,0 +1,37 @@
+/* Multiply long double (ldbl-128) values, narrowing the result to double.
+   Copyright (C) 2018 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/>.  */
+
+#define f32xmulf64x __hide_f32xmulf64x
+#define f32xmulf128 __hide_f32xmulf128
+#define f64mulf64x __hide_f64mulf64x
+#define f64mulf128 __hide_f64mulf128
+#include <math.h>
+#undef f32xmulf64x
+#undef f32xmulf128
+#undef f64mulf64x
+#undef f64mulf128
+
+#include <math-narrow.h>
+
+double
+__dmull (_Float128 x, _Float128 y)
+{
+  NARROW_MUL_ROUND_TO_ODD (x, y, double, union ieee854_long_double, l,
+			   mantissa3);
+}
+libm_alias_double_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-128/s_f64xmulf128.c b/sysdeps/ieee754/ldbl-128/s_f64xmulf128.c
new file mode 100644
index 0000000000..ed88eabe40
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_f64xmulf128.c
@@ -0,0 +1,38 @@
+/* Multiply _Float128 values, converting the result to _Float64x.
+   Copyright (C) 2018 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 <math.h>
+#include <math-narrow.h>
+
+/* math_ldbl.h defines _Float128 to long double for this directory,
+   but when they are different, this function must be defined with
+   _Float128 arguments to avoid defining an alias with an incompatible
+   type.  */
+#undef _Float128
+
+_Float64x
+__f64xmulf128 (_Float128 x, _Float128 y)
+{
+#if __HAVE_FLOAT64X_LONG_DOUBLE && __HAVE_DISTINCT_FLOAT128
+  NARROW_MUL_ROUND_TO_ODD (x, y, _Float64x, union ieee854_long_double, l,
+			   mantissa3);
+#else
+  NARROW_MUL_TRIVIAL (x, y, _Float64x);
+#endif
+}
+libm_alias_float64x_float128 (mul)
diff --git a/sysdeps/ieee754/ldbl-128/s_fmull.c b/sysdeps/ieee754/ldbl-128/s_fmull.c
new file mode 100644
index 0000000000..dd399f9590
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/s_fmull.c
@@ -0,0 +1,33 @@
+/* Multiply long double (ldbl-128) values, narrowing the result to float.
+   Copyright (C) 2018 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/>.  */
+
+#define f32mulf64x __hide_f32mulf64x
+#define f32mulf128 __hide_f32mulf128
+#include <math.h>
+#undef f32mulf64x
+#undef f32mulf128
+
+#include <math-narrow.h>
+
+float
+__fmull (_Float128 x, _Float128 y)
+{
+  NARROW_MUL_ROUND_TO_ODD (x, y, float, union ieee854_long_double, l,
+			   mantissa3);
+}
+libm_alias_float_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_dmull.c b/sysdeps/ieee754/ldbl-128ibm/s_dmull.c
new file mode 100644
index 0000000000..7b75b2b0f1
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_dmull.c
@@ -0,0 +1,27 @@
+/* Multiply long double (ldbl-128ibm) values, narrowing the result to double.
+   Copyright (C) 2018 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 <math.h>
+#include <math-narrow.h>
+
+double
+__dmull (long double x, long double y)
+{
+  NARROW_MUL_TRIVIAL (x, y, double);
+}
+libm_alias_double_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fmull.c b/sysdeps/ieee754/ldbl-128ibm/s_fmull.c
new file mode 100644
index 0000000000..d1988f168d
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fmull.c
@@ -0,0 +1,27 @@
+/* Multiply long double (ldbl-128ibm) values, narrowing the result to float.
+   Copyright (C) 2018 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 <math.h>
+#include <math-narrow.h>
+
+float
+__fmull (long double x, long double y)
+{
+  NARROW_MUL_TRIVIAL (x, y, float);
+}
+libm_alias_float_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-96/s_dmull.c b/sysdeps/ieee754/ldbl-96/s_dmull.c
new file mode 100644
index 0000000000..a717b0aa07
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_dmull.c
@@ -0,0 +1,33 @@
+/* Multiply long double (ldbl-96) values, narrowing the result to double.
+   Copyright (C) 2018 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/>.  */
+
+#define f32xmulf64x __hide_f32xmulf64x
+#define f64mulf64x __hide_f64mulf64x
+#include <math.h>
+#undef f32xmulf64x
+#undef f64mulf64x
+
+#include <math-narrow.h>
+
+double
+__dmull (long double x, long double y)
+{
+  NARROW_MUL_ROUND_TO_ODD (x, y, double, union ieee854_long_double, l,
+			   mantissa1);
+}
+libm_alias_double_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-96/s_fmull.c b/sysdeps/ieee754/ldbl-96/s_fmull.c
new file mode 100644
index 0000000000..b7582526a6
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_fmull.c
@@ -0,0 +1,31 @@
+/* Multiply long double (ldbl-96) values, narrowing the result to float.
+   Copyright (C) 2018 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/>.  */
+
+#define f32mulf64x __hide_f32mulf64x
+#include <math.h>
+#undef f32mulf64x
+
+#include <math-narrow.h>
+
+float
+__fmull (long double x, long double y)
+{
+  NARROW_MUL_ROUND_TO_ODD (x, y, float, union ieee854_long_double, l,
+			   mantissa1);
+}
+libm_alias_float_ldouble (mul)
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index 7cdeaad2f2..90b2c928a9 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -45,7 +45,7 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \
 		 nextup nextdown totalorder totalordermag getpayload \
 		 canonicalize setpayload setpayloadsig llogb fmaxmag fminmag \
 		 roundeven fromfp ufromfp fromfpx ufromfpx fadd dadd \
-		 fsub dsub
+		 fmul dmul fsub dsub
 libnldbl-routines = $(libnldbl-calls:%=nldbl-%)
 libnldbl-inhibit-o = $(object-suffixes)
 libnldbl-static-only-routines = $(libnldbl-routines)
@@ -88,6 +88,7 @@ CFLAGS-nldbl-csqrt.c = -fno-builtin-csqrtl
 CFLAGS-nldbl-ctan.c = -fno-builtin-ctanl
 CFLAGS-nldbl-ctanh.c = -fno-builtin-ctanhl
 CFLAGS-nldbl-dadd.c = -fno-builtin-daddl
+CFLAGS-nldbl-dmul.c = -fno-builtin-dmull
 CFLAGS-nldbl-dsub.c = -fno-builtin-dsubl
 CFLAGS-nldbl-erf.c = -fno-builtin-erfl
 CFLAGS-nldbl-erfc.c = -fno-builtin-erfcl
@@ -106,6 +107,7 @@ CFLAGS-nldbl-fmaxmag.c = -fno-builtin-fmaxmagl
 CFLAGS-nldbl-fmin.c = -fno-builtin-fminl
 CFLAGS-nldbl-fminmag.c = -fno-builtin-fminmagl
 CFLAGS-nldbl-fmod.c = -fno-builtin-fmodl
+CFLAGS-nldbl-fmul.c = -fno-builtin-fmull
 CFLAGS-nldbl-frexp.c = -fno-builtin-frexpl
 CFLAGS-nldbl-fromfp.c = -fno-builtin-fromfpl
 CFLAGS-nldbl-fromfpx.c = -fno-builtin-fromfpxl
diff --git a/sysdeps/ieee754/ldbl-opt/Versions b/sysdeps/ieee754/ldbl-opt/Versions
index c33dc42d81..17aa035248 100644
--- a/sysdeps/ieee754/ldbl-opt/Versions
+++ b/sysdeps/ieee754/ldbl-opt/Versions
@@ -101,6 +101,6 @@ libm {
     # Functions taking long double = double argument and rounding
     # result to double (same as f32x*f64 functions, but those names
     # are not reserved in TS 18661-1).
-    __nldbl_daddl; __nldbl_dsubl;
+    __nldbl_daddl; __nldbl_dmull; __nldbl_dsubl;
   }
 }
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
index 4f5ae2dd26..e0d12545a3 100644
--- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
@@ -104,6 +104,7 @@ extern void __nldbl___vsyslog_chk (int, int, const char *, va_list);
 /* The original declarations of these were hidden by the including
    file.  */
 extern double __nldbl_daddl (double, double) __THROW;
+extern double __nldbl_dmull (double, double) __THROW;
 extern double __nldbl_dsubl (double, double) __THROW;
 
 #endif /* __NLDBL_COMPAT_H */
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-dmul.c b/sysdeps/ieee754/ldbl-opt/nldbl-dmul.c
new file mode 100644
index 0000000000..9c9b94e067
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-dmul.c
@@ -0,0 +1,28 @@
+/* Compatibility routine for IEEE double as long double for dmul.
+   Copyright (C) 2018 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/>.  */
+
+#define dmull __hide_dmull
+#include "nldbl-compat.h"
+#undef dmull
+
+double
+attribute_hidden
+dmull (double x, double y)
+{
+  return __nldbl_dmull (x, y);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fmul.c b/sysdeps/ieee754/ldbl-opt/nldbl-fmul.c
new file mode 100644
index 0000000000..2520d1b014
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-fmul.c
@@ -0,0 +1,28 @@
+/* Compatibility routine for IEEE double as long double for fmul.
+   Copyright (C) 2018 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/>.  */
+
+#define fmull __hide_fmull
+#include "nldbl-compat.h"
+#undef fmull
+
+float
+attribute_hidden
+fmull (double x, double y)
+{
+  return fmul (x, y);
+}
diff --git a/sysdeps/ieee754/soft-fp/s_dmull.c b/sysdeps/ieee754/soft-fp/s_dmull.c
new file mode 100644
index 0000000000..4ebf31140b
--- /dev/null
+++ b/sysdeps/ieee754/soft-fp/s_dmull.c
@@ -0,0 +1,59 @@
+/* Multiply long double (ldbl-128) values, narrowing the result to
+   double, using soft-fp.
+   Copyright (C) 2018 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/>.  */
+
+#define f32xmulf64x __hide_f32xmulf64x
+#define f32xmulf128 __hide_f32xmulf128
+#define f64mulf64x __hide_f64mulf64x
+#define f64mulf128 __hide_f64mulf128
+#include <math.h>
+#undef f32xmulf64x
+#undef f32xmulf128
+#undef f64mulf64x
+#undef f64mulf128
+
+#include <math-narrow.h>
+#include <soft-fp.h>
+#include <double.h>
+#include <quad.h>
+
+double
+__dmull (_Float128 x, _Float128 y)
+{
+  FP_DECL_EX;
+  FP_DECL_Q (X);
+  FP_DECL_Q (Y);
+  FP_DECL_Q (R);
+  FP_DECL_D (RN);
+  double ret;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q (X, x);
+  FP_UNPACK_Q (Y, y);
+  FP_MUL_Q (R, X, Y);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_TRUNC_COOKED (D, Q, 2, 4, RN, R);
+#else
+  FP_TRUNC_COOKED (D, Q, 1, 2, RN, R);
+#endif
+  FP_PACK_D (ret, RN);
+  FP_HANDLE_EXCEPTIONS;
+  CHECK_NARROW_MUL (ret, x, y);
+  return ret;
+}
+libm_alias_double_ldouble (mul)
diff --git a/sysdeps/ieee754/soft-fp/s_fmul.c b/sysdeps/ieee754/soft-fp/s_fmul.c
new file mode 100644
index 0000000000..5f679b1d45
--- /dev/null
+++ b/sysdeps/ieee754/soft-fp/s_fmul.c
@@ -0,0 +1,56 @@
+/* Multiply double values, narrowing the result to float, using soft-fp.
+   Copyright (C) 2018 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/>.  */
+
+#define f32mulf64 __hide_f32mulf64
+#define f32mulf32x __hide_f32mulf32x
+#define fmull __hide_fmull
+#include <math.h>
+#undef f32mulf64
+#undef f32mulf32x
+#undef fmull
+
+#include <math-narrow.h>
+#include <soft-fp.h>
+#include <single.h>
+#include <double.h>
+
+float
+__fmul (double x, double y)
+{
+  FP_DECL_EX;
+  FP_DECL_D (X);
+  FP_DECL_D (Y);
+  FP_DECL_D (R);
+  FP_DECL_S (RN);
+  float ret;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_D (X, x);
+  FP_UNPACK_D (Y, y);
+  FP_MUL_D (R, X, Y);
+#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
+  FP_TRUNC_COOKED (S, D, 1, 2, RN, R);
+#else
+  FP_TRUNC_COOKED (S, D, 1, 1, RN, R);
+#endif
+  FP_PACK_S (ret, RN);
+  FP_HANDLE_EXCEPTIONS;
+  CHECK_NARROW_MUL (ret, x, y);
+  return ret;
+}
+libm_alias_float_double (mul)
diff --git a/sysdeps/ieee754/soft-fp/s_fmull.c b/sysdeps/ieee754/soft-fp/s_fmull.c
new file mode 100644
index 0000000000..da4a12c8ec
--- /dev/null
+++ b/sysdeps/ieee754/soft-fp/s_fmull.c
@@ -0,0 +1,55 @@
+/* Multiply long double (ldbl-128) values, narrowing the result to
+   float, using soft-fp.
+   Copyright (C) 2018 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/>.  */
+
+#define f32mulf64x __hide_f32mulf64x
+#define f32mulf128 __hide_f32mulf128
+#include <math.h>
+#undef f32mulf64x
+#undef f32mulf128
+
+#include <math-narrow.h>
+#include <soft-fp.h>
+#include <single.h>
+#include <quad.h>
+
+float
+__fmull (_Float128 x, _Float128 y)
+{
+  FP_DECL_EX;
+  FP_DECL_Q (X);
+  FP_DECL_Q (Y);
+  FP_DECL_Q (R);
+  FP_DECL_S (RN);
+  float ret;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q (X, x);
+  FP_UNPACK_Q (Y, y);
+  FP_MUL_Q (R, X, Y);
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+  FP_TRUNC_COOKED (S, Q, 1, 4, RN, R);
+#else
+  FP_TRUNC_COOKED (S, Q, 1, 2, RN, R);
+#endif
+  FP_PACK_S (ret, RN);
+  FP_HANDLE_EXCEPTIONS;
+  CHECK_NARROW_MUL (ret, x, y);
+  return ret;
+}
+libm_alias_float_ldouble (mul)
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 11b8fd1dac..8aef1bdbf0 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1017,11 +1017,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1029,16 +1034,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index ea5df2d0e2..e5098d663e 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -2457,6 +2457,22 @@ ifloat128: 1
 ildouble: 1
 ldouble: 1
 
+Function: "mul_downward_ldouble":
+double: 1
+float: 1
+
+Function: "mul_ldouble":
+double: 1
+float: 1
+
+Function: "mul_towardzero_ldouble":
+double: 1
+float: 1
+
+Function: "mul_upward_ldouble":
+double: 1
+float: 1
+
 Function: "nextafter_downward":
 ildouble: 1
 ldouble: 1
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index e22190e5bc..c31b1140fb 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -981,11 +981,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -993,16 +998,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 0da51ce555..eed5f2012a 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -988,13 +988,19 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1002,17 +1008,25 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.3.4 __c1_cabsf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index a355af5104..8226f6169b 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -430,15 +430,21 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 _LIB_VERSION D 0x4
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index 2f923c0f4c..81a9b8b13e 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -741,15 +741,21 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index d65f2370fb..106a2bda29 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1024,11 +1024,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1036,16 +1041,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index 2dd457b109..bfef4e16f3 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -954,11 +954,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -966,16 +971,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index a355af5104..8226f6169b 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -430,15 +430,21 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 _LIB_VERSION D 0x4
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index 1e3218515a..2c86d3bb0e 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -781,14 +781,20 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index dab26bcb99..b410ba296a 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -742,14 +742,20 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 4400071795..39438e6770 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -741,15 +741,21 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index bfc16d517f..4280f2ca27 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -981,11 +981,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -993,16 +998,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index 6b2d3b280d..100546874a 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -742,14 +742,20 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index fc09e3253d..3110eeab81 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -783,17 +783,24 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 __clog10l F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 40562195df..c3c38792d8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -782,17 +782,24 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 __clog10l F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index 511b839c94..19956e049d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -1021,13 +1021,19 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1035,16 +1041,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index e14fc553fa..dc97d82bfd 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -461,17 +461,24 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.3 _LIB_VERSION D 0x4
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
index fa672de41f..e9e623e5b0 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
@@ -968,11 +968,16 @@ GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.27 ynl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -980,16 +985,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index f8c32bda47..06345a650e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -978,13 +978,19 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -992,17 +998,25 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 __clog10l F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 0b88ee7135..bc40b6cb86 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -978,13 +978,19 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -992,17 +998,25 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 __clog10l F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index 5f2f34ba7c..20a497405f 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -741,15 +741,21 @@ GLIBC_2.27 ynf32 F
 GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
 GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 f32xmulf64 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index f31e748e05..b1364bac57 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -985,13 +985,19 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 __nldbl_daddl F
+GLIBC_2.28 __nldbl_dmull F
 GLIBC_2.28 __nldbl_dsubl F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -999,17 +1005,25 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.4 __clog10l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index a3585ce70f..133d2d302c 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -981,11 +981,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -993,16 +998,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 4f4cc3ce28..66ab054b20 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1015,11 +1015,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1027,16 +1032,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 36e8130e4c..9442ef1735 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1015,11 +1015,16 @@ GLIBC_2.27 ynf32x F
 GLIBC_2.27 ynf64 F
 GLIBC_2.27 ynf64x F
 GLIBC_2.28 daddl F
+GLIBC_2.28 dmull F
 GLIBC_2.28 dsubl F
 GLIBC_2.28 f32addf128 F
 GLIBC_2.28 f32addf32x F
 GLIBC_2.28 f32addf64 F
 GLIBC_2.28 f32addf64x F
+GLIBC_2.28 f32mulf128 F
+GLIBC_2.28 f32mulf32x F
+GLIBC_2.28 f32mulf64 F
+GLIBC_2.28 f32mulf64x F
 GLIBC_2.28 f32subf128 F
 GLIBC_2.28 f32subf32x F
 GLIBC_2.28 f32subf64 F
@@ -1027,16 +1032,24 @@ GLIBC_2.28 f32subf64x F
 GLIBC_2.28 f32xaddf128 F
 GLIBC_2.28 f32xaddf64 F
 GLIBC_2.28 f32xaddf64x F
+GLIBC_2.28 f32xmulf128 F
+GLIBC_2.28 f32xmulf64 F
+GLIBC_2.28 f32xmulf64x F
 GLIBC_2.28 f32xsubf128 F
 GLIBC_2.28 f32xsubf64 F
 GLIBC_2.28 f32xsubf64x F
 GLIBC_2.28 f64addf128 F
 GLIBC_2.28 f64addf64x F
+GLIBC_2.28 f64mulf128 F
+GLIBC_2.28 f64mulf64x F
 GLIBC_2.28 f64subf128 F
 GLIBC_2.28 f64subf64x F
 GLIBC_2.28 f64xaddf128 F
+GLIBC_2.28 f64xmulf128 F
 GLIBC_2.28 f64xsubf128 F
 GLIBC_2.28 fadd F
 GLIBC_2.28 faddl F
+GLIBC_2.28 fmul F
+GLIBC_2.28 fmull F
 GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F