aboutsummaryrefslogtreecommitdiff
path: root/math
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 /math
parenta15529fda8d132621328c3fe32997a3d9c55aef4 (diff)
downloadglibc-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 'math')
-rw-r--r--math/Makefile4
-rw-r--r--math/Versions5
-rw-r--r--math/auto-libm-test-in48
-rw-r--r--math/auto-libm-test-out-narrow-mul11383
-rw-r--r--math/bits/mathcalls-narrow.h3
-rw-r--r--math/gen-auto-libm-tests.c1
-rw-r--r--math/libm-test-narrow-mul.inc179
-rw-r--r--math/math-narrow.h53
8 files changed, 11674 insertions, 2 deletions
diff --git a/math/Makefile b/math/Makefile
index 7cc0d16b0c..892008fd40 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -89,7 +89,7 @@ libm-compat-calls = \
w_lgammaF_r_compat w_lgammaF_compat2 w_expF_compat \
w_lgamma_compatF k_standardF
-libm-narrow-fns = add sub
+libm-narrow-fns = add mul sub
libm-narrow-types-basic = s_fF s_f32xFf64
libm-narrow-types-ldouble-yes = s_fFl s_dFl
libm-narrow-types-float128-yes = s_f32Ff128 s_f64Ff128 s_f64xFf128
@@ -284,7 +284,7 @@ libm-test-funcs-noauto = canonicalize ceil cimag conj copysign cproj creal \
scalbln scalbn setpayload setpayloadsig signbit \
significand totalorder totalordermag trunc ufromfp \
ufromfpx
-libm-test-funcs-narrow = add sub
+libm-test-funcs-narrow = add mul sub
libm-test-funcs-all = $(libm-test-funcs-auto) $(libm-test-funcs-noauto)
libm-test-c-auto = $(foreach f,$(libm-test-funcs-auto),libm-test-$(f).c)
libm-test-c-noauto = $(foreach f,$(libm-test-funcs-noauto),libm-test-$(f).c)
diff --git a/math/Versions b/math/Versions
index 87c7ff601c..edf0daa019 100644
--- a/math/Versions
+++ b/math/Versions
@@ -555,12 +555,17 @@ libm {
# Functions not involving _Float64x or _Float128, for all configurations.
fadd; faddl; daddl;
f32addf32x; f32addf64; f32xaddf64;
+ fmul; fmull; dmull;
+ f32mulf32x; f32mulf64; f32xmulf64;
fsub; fsubl; dsubl;
f32subf32x; f32subf64; f32xsubf64;
# Functions involving _Float64x or _Float128, for some configurations.
f32addf64x; f32addf128;
f32xaddf64x; f32xaddf128; f64addf64x; f64addf128;
f64xaddf128;
+ f32mulf64x; f32mulf128;
+ f32xmulf64x; f32xmulf128; f64mulf64x; f64mulf128;
+ f64xmulf128;
f32subf64x; f32subf128;
f32xsubf64x; f32xsubf128; f64subf64x; f64subf128;
f64xsubf128;
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index bb3c325fec..d102b99e23 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -6445,6 +6445,54 @@ log2 min
log2 min_subnorm
log2 max
+mul 0 0
+mul 0 -0
+mul -0 0
+mul -0 -0
+mul max max
+mul max -max
+mul -max max
+mul -max -max
+mul min min
+mul min -min
+mul -min min
+mul -min -min
+mul min_subnorm min_subnorm
+mul min_subnorm -min_subnorm
+mul -min_subnorm min_subnorm
+mul -min_subnorm -min_subnorm
+mul 1 2
+mul 1 -2
+mul -1 2
+mul -1 -2
+mul 100.5 0.75
+mul 100.5 -0.75
+mul -100.5 0.75
+mul -100.5 -0.75
+# Cases where the product of two values in a wider format is very
+# close to half way between two representable values in a narrower
+# format, so that double rounding would sometimes yield the wrong
+# result. These examples have products of the form
+# (2^a + 1)(2^b + 1)/2^(a+b), where a is the width of the narrower
+# format, b is greater than the width of the wider format and factors
+# have been rearranged between the terms so that both terms do fit
+# within the wider format.
+# a = 24, b = 54
+mul 0x5000005p-24 0xccccccccccccdp-54
+# a = 24, b = 65
+mul 0x3000003p-24 0xaaaaaaaaaaaaaaabp-65
+# a = 24, b = 114
+mul 0x5000005p-24 0xcccccccccccccccccccccccccccdp-114
+# a = 53, b = 65
+mul 0x60000000000003p-53 0xaaaaaaaaaaaaaaabp-65
+# a = 53, b = 114
+mul 0xa0000000000005p-53 0xcccccccccccccccccccccccccccdp-114
+# a = 64, b = 114
+mul 0x50000000000000005p-64 0xcccccccccccccccccccccccccccdp-114
+# Similar, for double rounding to 64 bit of a product of 53-bit values.
+# This product equals 2^64 + 2^11 + 1.
+mul 97689974585 188829449
+
pow 0 0
pow 0 -0
pow -0 0
diff --git a/math/auto-libm-test-out-narrow-mul b/math/auto-libm-test-out-narrow-mul
new file mode 100644
index 0000000000..e371d304f4
--- /dev/null
+++ b/math/auto-libm-test-out-narrow-mul
@@ -0,0 +1,11383 @@
+mul 0 0
+= mul downward binary32:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest binary32:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero binary32:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward binary32:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul downward binary64:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest binary64:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero binary64:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward binary64:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul downward intel96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest intel96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero intel96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward intel96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul downward m68k96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest m68k96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero m68k96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward m68k96:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul downward binary128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest binary128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero binary128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward binary128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul downward ibm128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul tonearest ibm128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul towardzero ibm128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+= mul upward ibm128:arg_fmt(0,0,0,0) 0x0p+0 0x0p+0 : 0x0p+0 :
+mul 0 -0
+= mul downward binary32:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest binary32:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero binary32:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward binary32:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul downward binary64:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest binary64:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero binary64:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward binary64:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul downward intel96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest intel96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero intel96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward intel96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul downward m68k96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest m68k96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero m68k96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward m68k96:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul downward binary128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest binary128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero binary128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward binary128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul downward ibm128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul tonearest ibm128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul towardzero ibm128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+= mul upward ibm128:arg_fmt(0,0,0,0) 0x0p+0 -0x0p+0 : -0x0p+0 :
+mul -0 0
+= mul downward binary32:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest binary32:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero binary32:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward binary32:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul downward binary64:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest binary64:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero binary64:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward binary64:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul downward intel96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest intel96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero intel96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward intel96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul downward m68k96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest m68k96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero m68k96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward m68k96:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul downward binary128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest binary128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero binary128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward binary128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul downward ibm128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul tonearest ibm128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul towardzero ibm128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+= mul upward ibm128:arg_fmt(0,0,0,0) -0x0p+0 0x0p+0 : -0x0p+0 :
+mul -0 -0
+= mul downward binary32:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest binary32:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero binary32:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward binary32:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul downward binary64:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest binary64:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero binary64:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward binary64:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul downward intel96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest intel96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero intel96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward intel96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul downward m68k96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest m68k96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero m68k96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward m68k96:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul downward binary128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest binary128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero binary128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward binary128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul downward ibm128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul tonearest ibm128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul towardzero ibm128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+= mul upward ibm128:arg_fmt(0,0,0,0) -0x0p+0 -0x0p+0 : 0x0p+0 :
+mul max max
+= mul downward binary32:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul tonearest binary32:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary32:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul upward binary32:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : plus_infty : inexact overflow errno-erange
+= mul downward binary64:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul tonearest binary64:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul towardzero binary64:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul upward binary64:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul downward intel96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul tonearest intel96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul towardzero intel96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul upward intel96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul downward m68k96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul tonearest m68k96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul towardzero m68k96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul upward m68k96:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul downward binary128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul tonearest binary128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul towardzero binary128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul upward binary128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul downward ibm128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul tonearest ibm128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul towardzero ibm128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul upward ibm128:arg_fmt(127,24,104,24) 0xf.fffffp+124 0xf.fffffp+124 : 0xf.ffffe000001p+252 :
+= mul downward binary32:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul tonearest binary32:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary32:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul upward binary32:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : inexact overflow errno-erange
+= mul downward binary64:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul tonearest binary64:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary64:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul upward binary64:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : inexact overflow errno-erange
+= mul downward intel96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul tonearest intel96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul towardzero intel96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul upward intel96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff801p+1148 : inexact
+= mul downward m68k96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul tonearest m68k96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul towardzero m68k96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8p+1148 : inexact
+= mul upward m68k96:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff801p+1148 : inexact
+= mul downward binary128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8000008p+1148 :
+= mul tonearest binary128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8000008p+1148 :
+= mul towardzero binary128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8000008p+1148 :
+= mul upward binary128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffefffffff8000008p+1148 :
+= mul downward ibm128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul tonearest ibm128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : inexact overflow errno-erange
+= mul towardzero ibm128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul upward ibm128:arg_fmt(1023,53,104,53) 0xf.fffffp+124 0xf.ffffffffffff8p+1020 : plus_infty : xfail:ibm128-libgcc inexact overflow errno-erange
+= mul downward binary32:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul tonearest binary32:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary32:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul upward binary32:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul downward binary64:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul tonearest binary64:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary64:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul upward binary64:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul downward intel96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul tonearest intel96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero intel96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul upward intel96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul downward m68k96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul tonearest m68k96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero m68k96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul upward m68k96:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul downward binary128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffffffffffffff8p+16380 : inexact overflow errno-erange-ok
+= mul tonearest binary128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.fffffffffffffffffffffffffff8p+16380 : inexact overflow errno-erange-ok
+= mul upward binary128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul downward ibm128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul tonearest ibm128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero ibm128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul upward ibm128:arg_fmt(16383,64,104,64) 0xf.fffffp+124 0xf.fffffffffffffffp+16380 : plus_infty : xfail:ibm128-libgcc inexact overflow errno-erange
+= mul downward binary32:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul tonearest binary32:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary32:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffp+124 : inexact overflow errno-erange-ok
+= mul upward binary32:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul downward binary64:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul tonearest binary64:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary64:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.ffffffffffff8p+1020 : inexact overflow errno-erange-ok
+= mul upward binary64:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul downward intel96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul tonearest intel96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero intel96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul upward intel96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul downward m68k96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul tonearest m68k96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero m68k96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffp+16380 : inexact overflow errno-erange-ok
+= mul upward m68k96:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul downward binary128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffffffffffffff8p+16380 : inexact overflow errno-erange-ok
+= mul tonearest binary128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero binary128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.fffffffffffffffffffffffffff8p+16380 : inexact overflow errno-erange-ok
+= mul upward binary128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul downward ibm128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul tonearest ibm128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : inexact overflow errno-erange
+= mul towardzero ibm128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : 0xf.ffffffffffffbffffffffffffcp+1020 : xfail:ibm128-libgcc inexact overflow errno-erange-ok
+= mul upward ibm128:arg_fmt(16383,113,104,113) 0xf.fffffp+124 0xf.fffffffffffffffffffffffffff8p+16380 : plus_infty : xfail:ibm128-libgcc inexact overflow errno-erange
+= mul downward binary32:arg_fmt(1023,53,104,106) 0xf.fffffp+124 0x