1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
https://bugs.gentoo.org/642300
From 36a84f43f326de14db888ba07936cc9621c23f19 Mon Sep 17 00:00:00 2001
From: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Date: Sun, 10 Jan 2016 23:19:37 +0100
Subject: [PATCH] use mpfr_fmma and mpfr_fmms if provided by mpfr
---
configure.ac | 16 ++++++++++++++++
src/mul.c | 15 ++++++++++++---
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index b6fa199..bdb21ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -165,6 +165,22 @@ AC_LINK_IFELSE(
AC_MSG_ERROR([libmpfr not found or uses a different ABI (including static vs shared).])
])
+AC_MSG_CHECKING(for mpfr_fmma)
+LIBS="-lmpfr $LIBS"
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include "mpfr.h"]],
+ [[mpfr_t x; mpfr_fmma (x, x, x, x, x, 0);]]
+ )],
+ [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_MPFR_FMMA, 1, [mpfr_fmma is present])
+ ],
+ [
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_MPFR_FMMA, 0, [mpfr_fmma is not present])
+ ])
+
# Check for a recent GMP
# We only guarantee that with a *functional* and recent enough GMP version,
# MPC will compile; we do not guarantee that GMP will compile.
diff --git a/src/mul.c b/src/mul.c
index 3c9c0a7..8c4afe4 100644
--- a/src/mul.c
+++ b/src/mul.c
@@ -175,8 +175,9 @@ mul_imag (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd)
#define MPFR_EXP(x) ((x)->_mpfr_exp)
#define MPFR_LIMB_SIZE(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS + 1)
+#if HAVE_MPFR_FMMA == 0
static int
-mpfr_fmma (mpfr_ptr z, mpfr_srcptr a, mpfr_srcptr b, mpfr_srcptr c,
+mpc_fmma (mpfr_ptr z, mpfr_srcptr a, mpfr_srcptr b, mpfr_srcptr c,
mpfr_srcptr d, int sign, mpfr_rnd_t rnd)
{
/* Computes z = ab+cd if sign >= 0, or z = ab-cd if sign < 0.
@@ -359,6 +360,7 @@ mpfr_fmma (mpfr_ptr z, mpfr_srcptr a, mpfr_srcptr b, mpfr_srcptr c,
return inex;
}
+#endif
int
mpc_mul_naive (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd)
@@ -375,10 +377,17 @@ mpc_mul_naive (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd)
else
rop [0] = z [0];
- inex = MPC_INEX (mpfr_fmma (mpc_realref (rop), mpc_realref (x), mpc_realref (y), mpc_imagref (x),
- mpc_imagref (y), -1, MPC_RND_RE (rnd)),
+#if HAVE_MPFR_FMMA
+ inex = MPC_INEX (mpfr_fmms (mpc_realref (rop), mpc_realref (x), mpc_realref (y), mpc_imagref (x),
+ mpc_imagref (y), MPC_RND_RE (rnd)),
mpfr_fmma (mpc_imagref (rop), mpc_realref (x), mpc_imagref (y), mpc_imagref (x),
+ mpc_realref (y), MPC_RND_IM (rnd)));
+#else
+ inex = MPC_INEX (mpc_fmma (mpc_realref (rop), mpc_realref (x), mpc_realref (y), mpc_imagref (x),
+ mpc_imagref (y), -1, MPC_RND_RE (rnd)),
+ mpc_fmma (mpc_imagref (rop), mpc_realref (x), mpc_imagref (y), mpc_imagref (x),
mpc_realref (y), +1, MPC_RND_IM (rnd)));
+#endif
mpc_set (z, rop, MPC_RNDNN);
if (overlap)
--- a/configure
+++ b/configure
@@ -13835,6 +13835,41 @@ else
$as_echo "no" >&6; }
as_fn_error $? "libmpfr not found or uses a different ABI (including static vs shared)." "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpfr_fmma" >&5
+$as_echo_n "checking for mpfr_fmma... " >&6; }
+LIBS="-lmpfr $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "mpfr.h"
+int
+main ()
+{
+mpfr_t x; mpfr_fmma (x, x, x, x, x, 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_MPFR_FMMA 1" >>confdefs.h
+
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define HAVE_MPFR_FMMA 0" >>confdefs.h
+
+
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
--
2.15.1
|