This is the mail archive of the
libstdc++@sources.redhat.com
mailing list for the libstdc++ project.
V3 PATCH: Improve suppot for abs() and pow()
- To: gcc-patches at gcc dot gnu dot org, libstdc++ at gcc dot gnu dot org
- Subject: V3 PATCH: Improve suppot for abs() and pow()
- From: Gabriel Dos Reis <gdr at codesourcery dot com>
- Date: 01 Dec 2000 00:48:22 +0100
- Organization: CodeSourcery, LLC
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 ----