summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2009-05-13 00:02:10 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2009-05-13 00:02:10 +0000
commit9fb70f48699bc5575f39b281cb2d6c0b89c44b75 (patch)
tree0b0a2e1be7e8dd51f1caaddd4433ac59ca784d8b
parent5ebe70ce5c51481b181addee782ac65e4500749f (diff)
downloadmpfr-9fb70f48699bc5575f39b281cb2d6c0b89c44b75.tar.gz
fms.c: improve the performance of memory allocations in small precision
(almost identical to changeset 6195 for fma.c). git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@6196 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--fms.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/fms.c b/fms.c
index 6560ab671..60459dc11 100644
--- a/fms.c
+++ b/fms.c
@@ -35,6 +35,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
int inexact;
mpfr_t u;
MPFR_SAVE_EXPO_DECL (expo);
+ MPFR_GROUP_DECL(group);
/* particular cases */
if (MPFR_UNLIKELY( MPFR_IS_SINGULAR(x) ||
@@ -105,7 +106,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
/* If we take prec(u) >= prec(x) + prec(y), the product u <- x*y
is exact, except in case of overflow or underflow. */
MPFR_SAVE_EXPO_MARK (expo);
- mpfr_init2 (u, MPFR_PREC(x) + MPFR_PREC(y));
+ MPFR_GROUP_INIT_1 (group, MPFR_PREC(x) + MPFR_PREC(y), u);
if (MPFR_UNLIKELY (mpfr_mul (u, x, y, MPFR_RNDN)))
{
@@ -125,7 +126,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
if (MPFR_SIGN (u) != MPFR_SIGN (z) ||
MPFR_GET_EXP (x) + MPFR_GET_EXP (y) >= __gmpfr_emax + 3)
{
- mpfr_clear (u);
+ MPFR_GROUP_CLEAR (group);
MPFR_SAVE_EXPO_FREE (expo);
return mpfr_overflow (s, rnd_mode, - MPFR_SIGN (z));
}
@@ -181,7 +182,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
if (zz != z)
mpfr_clear (zo4);
- mpfr_clear (u);
+ MPFR_GROUP_CLEAR (group);
MPFR_ASSERTN (! MPFR_OVERFLOW (flags));
inex2 = mpfr_mul_2ui (s, s, 2, rnd_mode);
if (inex2) /* overflow */
@@ -248,7 +249,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
if (xy_underflows)
{
/* Let's replace xy by sign(xy) * 2^(emin-1). */
- mpfr_set_prec (u, MPFR_PREC_MIN);
+ MPFR_PREC (u) = MPFR_PREC_MIN;
mpfr_setmin (u, __gmpfr_emin);
MPFR_SET_SIGN (u, MPFR_MULT_SIGN (MPFR_SIGN (x),
MPFR_SIGN (y)));
@@ -258,8 +259,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
MPFR_BLOCK_DECL (flags);
MPFR_BLOCK (flags, inexact = mpfr_sub (s, u, new_z, rnd_mode));
- mpfr_clear (u);
-
+ MPFR_GROUP_CLEAR (group);
if (scale != 0)
{
int inex2;
@@ -288,7 +288,7 @@ mpfr_fms (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
}
inexact = mpfr_sub (s, u, z, rnd_mode);
- mpfr_clear (u);
+ MPFR_GROUP_CLEAR (group);
MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
end:
MPFR_SAVE_EXPO_FREE (expo);