This is the mail archive of the libstdc++@sources.redhat.com mailing list for the libstdc++ project.


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

V3 PATCH: Improve suppot for abs() and pow()



These bits improve our support for the abs() and pow() functions.
Built and tested on an i686-pc-linux-gnu.  No additional regressions.

-- Gaby
CodeSourcery, LLC            http://www.codesourcery.com
     http://www.codesourcery.com/gcc-compile.shtml

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/ChangeLog,v
retrieving revision 1.319
diff -p -r1.319 ChangeLog
*** ChangeLog	2000/11/29 21:30:30	1.319
--- ChangeLog	2000/11/30 23:43:21
***************
*** 1,3 ****
--- 1,18 ----
+ 2000-12-01  Gabriel Dos Reis  <gdr@codesourcery.com>
+ 
+ 	* src/cmath.cc: Remove.
+ 	* src/Makefile.am (c_base_headers): Add bits/cmath.tcc.
+ 	(sources): Remove cmath.cc
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* include/c/bits/std_cmath.h (__cmath_power<>): Declare.
+ 	(__cmath_abs<>): New function.
+ 	(abs, fabs): Use __cmath_abs when no direct support is available.
+ 	(__pow_helper<>): New function.
+ 	(pow): Define here.  Use __pow_helper<>.
+ 
+ 	* include/c/bits/cmath.tcc: New file.
+ 
  2000-11-29  Benjamin Kosnik  <bkoz@redhat.com>
  
  	Fixes for build directories with colons, AIX build problems.
Index: include/c/bits/std_cmath.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/include/c/bits/std_cmath.h,v
retrieving revision 1.7
diff -p -r1.7 std_cmath.h
*** std_cmath.h	2000/11/20 21:13:06	1.7
--- std_cmath.h	2000/11/30 23:43:21
***************
*** 44,49 ****
--- 44,60 ----
  
  namespace std 
  {
+   // Forward declaration of a helper function.  This really should be
+   // an `exported' forward declaration.
+   template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
+ 
+   template<typename _Tp>
+   inline _Tp
+     __cmath_abs(_Tp __x)
+     {
+       return __x < _Tp() ? -__x : __x;
+     }
+ 
    inline long 
    abs(long __i) { return ::labs(__i); }
  
*************** namespace std 
*** 58,64 ****
    abs(float __x) { return ::fabsf(__x); }
  #else
    inline float 
!   abs(float __x) { return ::fabs(static_cast<double>(__x)); }
  #endif
  
  #if _GLIBCPP_HAVE_ACOSF
--- 69,75 ----
    abs(float __x) { return ::fabsf(__x); }
  #else
    inline float 
!   abs(float __x) { return __cmath_abs(__x); }
  #endif
  
  #if _GLIBCPP_HAVE_ACOSF
*************** namespace std 
*** 137,143 ****
    fabs(float __x) { return ::fabsf(__x); }
  #else
    inline float 
!   fabs(float __x) { return ::fabs(static_cast<double>(__x)); }
  #endif
  
  #if _GLIBCPP_HAVE_FLOORF
--- 148,154 ----
    fabs(float __x) { return ::fabsf(__x); }
  #else
    inline float 
!   fabs(float __x) { return __cmath_abs(__x); }
  #endif
  
  #if _GLIBCPP_HAVE_FLOORF
*************** namespace std 
*** 204,209 ****
--- 215,229 ----
    }
  #endif
  
+   template<typename _Tp>
+     inline _Tp
+     __pow_helper(_Tp __x, int __n)
+     {
+       return __n < 0
+         ? _Tp(1)/__cmath_power(__x, -__n)
+         : __cmath_power(__x, __n);
+     }
+   
  #if _GLIBCPP_HAVE_POWF
    inline float 
    pow(float __x, float __y) { return ::powf(__x, __y); }
*************** namespace std 
*** 213,220 ****
    { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  #endif
  
!   float 
!   pow(float, int);
  
  #if _GLIBCPP_HAVE___BUILTIN_SINF
    inline float 
--- 233,243 ----
    { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  #endif
  
!   inline float 
!   pow(float __x, int __n)
!   {
!     return __pow_helper(__x, __n);
!   }
  
  #if _GLIBCPP_HAVE___BUILTIN_SINF
    inline float 
*************** namespace std 
*** 315,322 ****
  
    extern "C" double pow(double __x, double __y);
  
!   double 
!   pow(double __x, int __i);
  
  #if _GLIBCPP_HAVE___BUILTIN_SIN
    inline double 
--- 338,348 ----
  
    extern "C" double pow(double __x, double __y);
  
!   inline double 
!   pow(double __x, int __i)
!   {
!     return __pow_helper(__x, __i);
!   }
  
  #if _GLIBCPP_HAVE___BUILTIN_SIN
    inline double 
*************** namespace std 
*** 347,353 ****
    abs(long double __x) { return ::fabsl(__x); }
  #else
    inline long double 
!   abs(long double __x) { return fabs(static_cast<double>(__x)); }
  #endif
  
  #if _GLIBCPP_HAVE_ACOSL
--- 373,379 ----
    abs(long double __x) { return ::fabsl(__x); }
  #else
    inline long double 
!   abs(long double __x) { return __cmath_abs(__x); }
  #endif
  
  #if _GLIBCPP_HAVE_ACOSL
*************** namespace std 
*** 426,432 ****
    fabs(long double __x) { return ::fabsl(__x); }
  #else
    inline long double 
!   fabs(long double __x) { return ::fabs(static_cast<double>(__x)); }
  #endif
  
  #if _GLIBCPP_HAVE_FLOORL
--- 452,458 ----
    fabs(long double __x) { return ::fabsl(__x); }
  #else
    inline long double 
!   fabs(long double __x) { return __cmath_abs(__x); }
  #endif
  
  #if _GLIBCPP_HAVE_FLOORL
*************** namespace std 
*** 503,510 ****
    { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  #endif
  
!   long double 
!   pow(long double, int);
  
  #if _GLIBCPP_HAVE___BUILTIN_SINL
    inline long double 
--- 529,539 ----
    { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  #endif
  
!   inline long double 
!   pow(long double __x, int __n)
!   {
!     return __pow_helper(__x, __n);
!   }
  
  #if _GLIBCPP_HAVE___BUILTIN_SINL
    inline long double 
*************** namespace std 
*** 551,568 ****
    inline long double 
    tanh(long double __x) { return ::tanh(static_cast<double>(__x)); }
  #endif
- } // std
- 
- #endif
- 
- 
- 
- 
- 
  
  
! 
! 
! 
  
  
--- 580,592 ----
    inline long double 
    tanh(long double __x) { return ::tanh(static_cast<double>(__x)); }
  #endif
  
  
! } // std
  
+ #ifdef _GLIBCPP_NO_TEMPLATE_EXPORT
+ #  define export
+ #  include <bits/cmath.tcc>
+ #endif
  
+ #endif
Index: include/c/bits/cmath.tcc
===================================================================
RCS file: cmath.tcc
diff -N cmath.tcc
*** /dev/null	Tue May  5 13:32:27 1998
--- cmath.tcc	Thu Nov 30 15:43:21 2000
***************
*** 0 ****
--- 1,53 ----
+ // -*- C++ -*- C math library.
+ 
+ // Copyright (C) 2000 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This 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 General Public License for more details.
+ 
+ // You should have received a copy of the GNU General Public License along
+ // with this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ // This file was written by Gabriel Dos Reis <gdr@codesourcery.com>
+ 
+ #ifndef _CPP_BITS_CMATH_TCC
+ #define _CPP_BITS_CMATH_TCC 1
+ 
+ namespace std {
+   export template<typename _Tp>
+     _Tp
+     __cmath_power(_Tp __x, unsigned int __n)
+     {
+       _Tp __y = __n % 2 ? __x : 1;
+ 
+       while (__n >>= 1)
+         {
+           __x = __x * __x;
+           if (__n % 2)
+             __y = __y * __x;
+         }
+ 
+       return __y;
+     }
+ }
+ 
+ #endif
Index: src/Makefile.am
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/src/Makefile.am,v
retrieving revision 1.54
diff -p -r1.54 Makefile.am
*** Makefile.am	2000/11/29 21:30:30	1.54
--- Makefile.am	2000/11/30 23:43:21
*************** c_base_headers = \
*** 135,141 ****
  	bits/std_cmath.h bits/std_csetjmp.h bits/std_csignal.h \
  	bits/std_cstdarg.h bits/std_cstddef.h bits/std_cstdio.h \
  	bits/std_cstdlib.h bits/std_cstring.h bits/std_ctime.h \
! 	bits/std_cwchar.h bits/std_cwctype.h 
  
  if GLIBCPP_USE_CSHADOW
  c_shadow_headers = \
--- 135,141 ----
  	bits/std_cmath.h bits/std_csetjmp.h bits/std_csignal.h \
  	bits/std_cstdarg.h bits/std_cstddef.h bits/std_cstdio.h \
  	bits/std_cstdlib.h bits/std_cstring.h bits/std_ctime.h \
! 	bits/std_cwchar.h bits/std_cwctype.h bits/cmath.tcc
  
  if GLIBCPP_USE_CSHADOW
  c_shadow_headers = \
*************** build_headers = \
*** 174,180 ****
  
  sources = \
  	limitsMEMBERS.cc \
- 	cmath.cc \
  	complex.cc complexf.cc complexl.cc complex_io.cc \
  	stdexcept.cc bitset.cc \
  	c++io.cc ios.cc stdstreams.cc strstream.cc \
--- 174,179 ----
Index: src/Makefile.in
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/src/Makefile.in,v
retrieving revision 1.74
diff -p -r1.74 Makefile.in
*** Makefile.in	2000/11/29 21:30:30	1.74
--- Makefile.in	2000/11/30 23:43:21
*************** backward_headers =  	backward/complex.h 
*** 156,162 ****
  ext_headers =  	ext/ropeimpl.h ext/stl_rope.h 	ext/stl_bvector.h ext/stl_hashtable.h ext/stl_hash_fun.h 	ext/hash_map ext/hash_set ext/rope ext/slist 	ext/tree ext/bvector 
  
  
! c_base_headers =  	bits/std_cassert.h bits/std_cctype.h bits/std_cerrno.h 	bits/std_cfloat.h bits/std_climits.h bits/std_clocale.h 	bits/std_cmath.h bits/std_csetjmp.h bits/std_csignal.h 	bits/std_cstdarg.h bits/std_cstddef.h bits/std_cstdio.h 	bits/std_cstdlib.h bits/std_cstring.h bits/std_ctime.h 	bits/std_cwchar.h bits/std_cwctype.h 
  
  @GLIBCPP_USE_CSHADOW_TRUE@c_shadow_headers = 	assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h 	signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h wchar.h 	wctype.h fcntl.h libio.h iolibio.h libioP.h pthread.h iconv.h 	features.h langinfo.h 	bits/wrap_libio.h bits/wrap_iolibio.h bits/wrap_libioP.h 	bits/wrap_iconv.h bits/wrap_fcntl.h bits/wrap_pthread.h 	bits/wrap_features.h bits/wrap_langinfo.h 	sys/cdefs.h 
  @GLIBCPP_USE_CSHADOW_FALSE@c_shadow_headers = 
--- 156,162 ----
  ext_headers =  	ext/ropeimpl.h ext/stl_rope.h 	ext/stl_bvector.h ext/stl_hashtable.h ext/stl_hash_fun.h 	ext/hash_map ext/hash_set ext/rope ext/slist 	ext/tree ext/bvector 
  
  
! c_base_headers =  	bits/std_cassert.h bits/std_cctype.h bits/std_cerrno.h 	bits/std_cfloat.h bits/std_climits.h bits/std_clocale.h 	bits/std_cmath.h bits/std_csetjmp.h bits/std_csignal.h 	bits/std_cstdarg.h bits/std_cstddef.h bits/std_cstdio.h 	bits/std_cstdlib.h bits/std_cstring.h bits/std_ctime.h 	bits/std_cwchar.h bits/std_cwctype.h bits/cmath.tcc
  
  @GLIBCPP_USE_CSHADOW_TRUE@c_shadow_headers = 	assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h 	signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h wchar.h 	wctype.h fcntl.h libio.h iolibio.h libioP.h pthread.h iconv.h 	features.h langinfo.h 	bits/wrap_libio.h bits/wrap_iolibio.h bits/wrap_libioP.h 	bits/wrap_iconv.h bits/wrap_fcntl.h bits/wrap_pthread.h 	bits/wrap_features.h bits/wrap_langinfo.h 	sys/cdefs.h 
  @GLIBCPP_USE_CSHADOW_FALSE@c_shadow_headers = 
*************** std_headers =  	algorithm bitset complex
*** 169,175 ****
  build_headers =  	bits/std_limits.h bits/c++config.h bits/c++io.h bits/c++threads.h 	bits/atomicity.h bits/os_defines.h 	bits/ctype_base.h bits/ctype_noninline.h bits/ctype_inline.h 
  
  
! sources =  	limitsMEMBERS.cc 	cmath.cc 	complex.cc complexf.cc complexl.cc complex_io.cc 	stdexcept.cc bitset.cc 	c++io.cc ios.cc stdstreams.cc strstream.cc 	locale.cc localename.cc codecvt.cc 	locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
  
  
  wstring_sources =  	wstring-inst.cc
--- 169,175 ----
  build_headers =  	bits/std_limits.h bits/c++config.h bits/c++io.h bits/c++threads.h 	bits/atomicity.h bits/os_defines.h 	bits/ctype_base.h bits/ctype_noninline.h bits/ctype_inline.h 
  
  
! sources =  	limitsMEMBERS.cc 	complex.cc complexf.cc complexl.cc complex_io.cc 	stdexcept.cc bitset.cc 	c++io.cc ios.cc stdstreams.cc strstream.cc 	locale.cc localename.cc codecvt.cc 	locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
  
  
  wstring_sources =  	wstring-inst.cc
*************** libinst_string_la_OBJECTS =  libinst-str
*** 254,260 ****
  libinst_wstring_la_LDFLAGS = 
  libinst_wstring_la_LIBADD = 
  libinst_wstring_la_OBJECTS =  wstring-inst.lo
! libstdc___la_OBJECTS =  limitsMEMBERS.lo cmath.lo complex.lo complexf.lo \
  complexl.lo complex_io.lo stdexcept.lo bitset.lo c++io.lo ios.lo \
  stdstreams.lo strstream.lo locale.lo localename.lo codecvt.lo \
  locale-inst.lo stl-inst.lo misc-inst.lo valarray-inst.lo string-inst.lo
--- 254,260 ----
  libinst_wstring_la_LDFLAGS = 
  libinst_wstring_la_LIBADD = 
  libinst_wstring_la_OBJECTS =  wstring-inst.lo
! libstdc___la_OBJECTS =  limitsMEMBERS.lo complex.lo complexf.lo \
  complexl.lo complex_io.lo stdexcept.lo bitset.lo c++io.lo ios.lo \
  stdstreams.lo strstream.lo locale.lo localename.lo codecvt.lo \
  locale-inst.lo stl-inst.lo misc-inst.lo valarray-inst.lo string-inst.lo
Index: src/cmath.cc
===================================================================
RCS file: cmath.cc
diff -N cmath.cc
*** /sourceware/cvs-tmp/cvshCIVZF	Thu Nov 30 15:43:21 2000
--- /dev/null	Tue May  5 13:32:27 1998
***************
*** 1,85 ****
- // -*- C++ -*- C math library.
- 
- // Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This 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 General Public License for more details.
- 
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 26.5  C library
- // Code for signatures not found in the C library
- //
- 
- #include <bits/std_cmath.h>
- 
- namespace std {
- 
-   namespace {
-     template <typename T>
-     inline T pow_helper(T x, unsigned int y)
-     {
-       T z = y&1? x : 1;
-       while(y >>= 1)
-         {
-           x *= x;
-           if(y & 1) z *= x;
-         }
-       return z;
-     }
-   }
- 
-   float
-   pow(float x, int y)
-   {
-     if(y < 0)
-       return 1.0f/pow_helper(x, -y);
-     else
-       return pow_helper(x, y);
-   }
- 
-   double
-   pow(double x, int y)
-   {
-     if(y < 0)
-       return 1.0/pow_helper(x, -y);
-     else
-       return pow_helper(x, y);
-   }
- 
-   long double
-   pow(long double x, int y)
-   {
-     if(y < 0)
-       return 1.0l/pow_helper(x, -y);
-     else
-       return pow_helper(x, y);
-   }
- 
- } // std
- 
- 
- 
- 
- 
--- 0 ----

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