This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch, master, updated. glibc-2.15-85-g41d0e86


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  41d0e8696f370d625390da356d95cab174c7990e (commit)
      from  5452bffeefe076a12eeb04f784ef1209a4282038 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=41d0e8696f370d625390da356d95cab174c7990e

commit 41d0e8696f370d625390da356d95cab174c7990e
Author: Ulrich Drepper <drepper@gmail.com>
Date:   Wed Jan 11 12:49:16 2012 -0500

    Optimize scalbln

diff --git a/ChangeLog b/ChangeLog
index 9ebbdf9..7b87e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-01-11  Ulrich Drepper  <drepper@gmail.com>
+
+	* sysdeps/ieee754/dbl-64/s_scalbln.c: Add branch prediction.
+	* sysdeps/ieee754/flt-32/s_scalblnf.c: Likewise.
+	* sysdeps/ieee754/ldbl-96/s_scalblnl.c: Likewise.
+	* sysdeps/ieee754/dbl-64/wordsize-64/s_scalbln.c: New file.
+
 2012-01-10  Ulrich Drepper  <drepper@gmail.com>
 
 	* sysdeps/ieee754/dbl-64/wordsize-64/s_modf.c: New file.
@@ -9,9 +16,9 @@
 	* math/bits/mathcalls.h: Add const attribute to fmin and fmax.
 
 	* sysdeps/ieee754/dbl-64/s_scalbn.c: Add branch prediction.
-	* sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c: Likewise.
 	* sysdeps/ieee754/flt-32/s_scalbnf.c: Likewise.
 	* sysdeps/ieee754/ldbl-96/s_scalbnl.c: Likewise.
+	* sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c: New file.
 
 	* math/bits/math-finite.h: Add ldexp support.
 
diff --git a/sysdeps/ieee754/dbl-64/s_scalbln.c b/sysdeps/ieee754/dbl-64/s_scalbln.c
index aa6134f..89174b4 100644
--- a/sysdeps/ieee754/dbl-64/s_scalbln.c
+++ b/sysdeps/ieee754/dbl-64/s_scalbln.c
@@ -1,4 +1,3 @@
-/* @(#)s_scalbn.c 5.1 93/09/24 */
 /*
  * ====================================================
  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@@ -10,10 +9,6 @@
  * ====================================================
  */
 
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_scalbn.c,v 1.8 1995/05/10 20:48:08 jtc Exp $";
-#endif
-
 /*
  * scalbn (double x, int n)
  * scalbn(x,n) returns x* 2**n  computed by  exponent
@@ -24,44 +19,37 @@ static char rcsid[] = "$NetBSD: s_scalbn.c,v 1.8 1995/05/10 20:48:08 jtc Exp $";
 #include "math.h"
 #include "math_private.h"
 
-#ifdef __STDC__
 static const double
-#else
-static double
-#endif
 two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
 twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
 huge   = 1.0e+300,
 tiny   = 1.0e-300;
 
-#ifdef __STDC__
-	double __scalbln (double x, long int n)
-#else
-	double __scalbln (x,n)
-	double x; long int n;
-#endif
+double
+__scalbln (double x, long int n)
 {
 	int32_t k,hx,lx;
 	EXTRACT_WORDS(hx,lx,x);
-        k = (hx&0x7ff00000)>>20;		/* extract exponent */
-        if (k==0) {				/* 0 or subnormal x */
-            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
+	k = (hx&0x7ff00000)>>20;		/* extract exponent */
+	if (__builtin_expect(k==0, 0)) {	/* 0 or subnormal x */
+	    if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
 	    x *= two54;
 	    GET_HIGH_WORD(hx,x);
 	    k = ((hx&0x7ff00000)>>20) - 54;
 	    }
-        if (k==0x7ff) return x+x;		/* NaN or Inf */
-        k = k+n;
-        if (n> 50000 || k >  0x7fe)
+	if (__builtin_expect(k==0x7ff, 0)) return x+x;	/* NaN or Inf */
+	k = k+n;
+	if (__builtin_expect(n> 50000 || k >  0x7fe, 0))
 	  return huge*__copysign(huge,x); /* overflow  */
-	if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/
-        if (k > 0) 				/* normal result */
+	if (__builtin_expect(n< -50000, 0))
+	  return tiny*__copysign(tiny,x); /*underflow*/
+	if (__builtin_expect(k > 0, 1))		/* normal result */
 	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
-        if (k <= -54)
+	if (k <= -54)
 	  return tiny*__copysign(tiny,x); 	/*underflow*/
-        k += 54;				/* subnormal result */
+	k += 54;				/* subnormal result */
 	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
-        return x*twom54;
+	return x*twom54;
 }
 weak_alias (__scalbln, scalbln)
 #ifdef NO_LONG_DOUBLE
diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbln.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbln.c
new file mode 100644
index 0000000..d6b97b5
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbln.c
@@ -0,0 +1,60 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * scalbn (double x, int n)
+ * scalbn(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
+huge   = 1.0e+300,
+tiny   = 1.0e-300;
+
+double
+__scalbln (double x, long int n)
+{
+	int64_t ix;
+	int64_t k;
+	EXTRACT_WORDS64(ix,x);
+	k = (ix >> 52) & 0x7ff;			/* extract exponent */
+	if (__builtin_expect(k==0, 0)) {	/* 0 or subnormal x */
+	    if ((ix & UINT64_C(0xfffffffffffff))==0) return x; /* +-0 */
+	    x *= two54;
+	    EXTRACT_WORDS64(ix,x);
+	    k = ((ix >> 52) & 0x7ff) - 54;
+	    }
+	if (__builtin_expect(k==0x7ff, 0)) return x+x;	/* NaN or Inf */
+	k = k+n;
+	if (__builtin_expect(n> 50000 || k >  0x7fe, 0))
+	  return huge*__copysign(huge,x); /* overflow  */
+	if (__builtin_expect(n< -50000, 0))
+	  return tiny*__copysign(tiny,x); /*underflow*/
+	if (__builtin_expect(k > 0, 1))		/* normal result */
+	    {INSERT_WORDS64(x,(ix&UINT64_C(0x800fffffffffffff))|(k<<52));
+	      return x;}
+	if (k <= -54)
+	  return tiny*__copysign(tiny,x);	/*underflow*/
+	k += 54;				/* subnormal result */
+	INSERT_WORDS64(x,(ix&INT64_C(0x800fffffffffffff))|(k<<52));
+	return x*twom54;
+}
+weak_alias (__scalbln, scalbln)
+#ifdef NO_LONG_DOUBLE
+strong_alias (__scalbln, __scalblnl)
+weak_alias (__scalbln, scalblnl)
+#endif
diff --git a/sysdeps/ieee754/flt-32/s_scalblnf.c b/sysdeps/ieee754/flt-32/s_scalblnf.c
index 4ed4873..5256c32 100644
--- a/sysdeps/ieee754/flt-32/s_scalblnf.c
+++ b/sysdeps/ieee754/flt-32/s_scalblnf.c
@@ -13,51 +13,39 @@
  * ====================================================
  */
 
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_scalbnf.c,v 1.4 1995/05/10 20:48:10 jtc Exp $";
-#endif
-
 #include "math.h"
 #include "math_private.h"
 
-#ifdef __STDC__
 static const float
-#else
-static float
-#endif
 two25   =  3.355443200e+07,	/* 0x4c000000 */
 twom25  =  2.9802322388e-08,	/* 0x33000000 */
 huge   = 1.0e+30,
 tiny   = 1.0e-30;
 
-#ifdef __STDC__
-	float __scalblnf (float x, long int n)
-#else
-	float __scalblnf (x,n)
-	float x; long int n;
-#endif
+float
+__scalblnf (float x, long int n)
 {
 	int32_t k,ix;
 	GET_FLOAT_WORD(ix,x);
-        k = (ix&0x7f800000)>>23;		/* extract exponent */
-        if (k==0) {				/* 0 or subnormal x */
-            if ((ix&0x7fffffff)==0) return x; /* +-0 */
+	k = (ix&0x7f800000)>>23;		/* extract exponent */
+	if (__builtin_expect(k==0, 0)) {	/* 0 or subnormal x */
+	    if ((ix&0x7fffffff)==0) return x; /* +-0 */
 	    x *= two25;
 	    GET_FLOAT_WORD(ix,x);
 	    k = ((ix&0x7f800000)>>23) - 25;
 	    }
-        if (k==0xff) return x+x;		/* NaN or Inf */
-        k = k+n;
-        if (n> 50000 || k >  0xfe)
+	if (__builtin_expect(k==0xff, 0)) return x+x;	/* NaN or Inf */
+	k = k+n;
+	if (__builtin_expect(n> 50000 || k >  0xfe, 0))
 	  return huge*copysignf(huge,x); /* overflow  */
-	if (n< -50000)
+	if (__builtin_expect(n< -50000, 0))
 	  return tiny*copysignf(tiny,x);	/*underflow*/
-        if (k > 0) 				/* normal result */
+	if (__builtin_expect(k > 0, 1))		/* normal result */
 	    {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
-        if (k <= -25)
+	if (k <= -25)
 	    return tiny*copysignf(tiny,x);	/*underflow*/
-        k += 25;				/* subnormal result */
+	k += 25;				/* subnormal result */
 	SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
-        return x*twom25;
+	return x*twom25;
 }
 weak_alias (__scalblnf, scalblnf)
diff --git a/sysdeps/ieee754/ldbl-96/s_scalblnl.c b/sysdeps/ieee754/ldbl-96/s_scalblnl.c
index 8e556fa..ada587b 100644
--- a/sysdeps/ieee754/ldbl-96/s_scalblnl.c
+++ b/sysdeps/ieee754/ldbl-96/s_scalblnl.c
@@ -14,10 +14,6 @@
  * ====================================================
  */
 
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
 /*
  * scalbnl (long double x, int n)
  * scalbnl(x,n) returns x* 2**n  computed by  exponent
@@ -28,44 +24,36 @@ static char rcsid[] = "$NetBSD: $";
 #include "math.h"
 #include "math_private.h"
 
-#ifdef __STDC__
 static const long double
-#else
-static long double
-#endif
 two63   =  4.50359962737049600000e+15,
 twom63  =  1.08420217248550443400e-19,
 huge   = 1.0e+4900L,
 tiny   = 1.0e-4900L;
 
-#ifdef __STDC__
-	long double __scalblnl (long double x, long int n)
-#else
-	long double __scalblnl (x,n)
-	long double x; long int n;
-#endif
+long double
+__scalblnl (long double x, long int n)
 {
 	int32_t k,es,hx,lx;
 	GET_LDOUBLE_WORDS(es,hx,lx,x);
-        k = es&0x7fff;				/* extract exponent */
-        if (k==0) {				/* 0 or subnormal x */
-            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
+	k = es&0x7fff;				/* extract exponent */
+	if (__builtin_expect(k==0, 0)) {	/* 0 or subnormal x */
+	    if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
 	    x *= two63;
 	    GET_LDOUBLE_EXP(es,x);
 	    k = (hx&0x7fff) - 63;
 	    }
-        if (k==0x7fff) return x+x;		/* NaN or Inf */
-        k = k+n;
-        if (n> 50000 || k > 0x7ffe)
+	if (__builtin_expect(k==0x7fff, 0)) return x+x;	/* NaN or Inf */
+	k = k+n;
+	if (__builtin_expect(n> 50000 || k > 0x7ffe, 0))
 	  return huge*__copysignl(huge,x); /* overflow  */
-	if (n< -50000)
+	if (__builtin_expect(n< -50000, 0))
 	  return tiny*__copysignl(tiny,x);
-        if (k > 0) 				/* normal result */
+	if (__builtin_expect(k > 0, 1))		/* normal result */
 	    {SET_LDOUBLE_EXP(x,(es&0x8000)|k); return x;}
-        if (k <= -63)
+	if (k <= -63)
 	    return tiny*__copysignl(tiny,x); 	/*underflow*/
-        k += 63;				/* subnormal result */
+	k += 63;				/* subnormal result */
 	SET_LDOUBLE_EXP(x,(es&0x8000)|k);
-        return x*twom63;
+	return x*twom63;
 }
 weak_alias (__scalblnl, scalblnl)

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |    9 ++++-
 sysdeps/ieee754/dbl-64/s_scalbln.c                 |   40 +++++++-------------
 .../dbl-64/wordsize-64/{s_scalbn.c => s_scalbln.c} |    8 ++--
 sysdeps/ieee754/flt-32/s_scalblnf.c                |   38 ++++++------------
 sysdeps/ieee754/ldbl-96/s_scalblnl.c               |   38 ++++++------------
 5 files changed, 52 insertions(+), 81 deletions(-)
 copy sysdeps/ieee754/dbl-64/wordsize-64/{s_scalbn.c => s_scalbln.c} (92%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]