This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch] libstdc++/11706
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Sat, 12 Feb 2005 22:29:21 +0100
- Subject: [Patch] libstdc++/11706
Hi,
finally we have both the appropriate integer power builtins and the
basic folding in place, and seems safe and convenient to switch the
library to use the infrastructure.
Indeed, I regtested succesfully the below - which includes a basic
sanity check, adding to the existing compiler-side tests - on
x86/x86_64/ia64-linux.
I'll wait 'til tomorrow in case of issues.
Thanks,
Paolo.
//////////////
2005-02-13 Richard Guenther <rguenth@gcc.gnu.org>
Paolo Carlini <pcarlini@suse.de>
PR libstdc++/11706
* include/c_std/std_cmath.h (pow): Use __builtin_powi[lf]
for integer overloads.
* testsuite/26_numerics/cmath/powi.cc: New.
diff -urN libstdc++-v3-orig/include/c_std/std_cmath.h libstdc++-v3/include/c_std/std_cmath.h
--- libstdc++-v3-orig/include/c_std/std_cmath.h 2005-02-01 14:30:32.000000000 +0100
+++ libstdc++-v3/include/c_std/std_cmath.h 2005-02-12 21:24:17.000000000 +0100
@@ -350,15 +350,15 @@
inline double
pow(double __x, int __i)
- { return __pow_helper(__x, __i); }
+ { return __builtin_powi(__x, __i); }
inline float
pow(float __x, int __n)
- { return __pow_helper(__x, __n); }
+ { return __builtin_powif(__x, __n); }
inline long double
pow(long double __x, int __n)
- { return __pow_helper(__x, __n); }
+ { return __builtin_powil(__x, __n); }
using ::sin;
diff -urN libstdc++-v3-orig/testsuite/26_numerics/cmath/powi.cc libstdc++-v3/testsuite/26_numerics/cmath/powi.cc
--- libstdc++-v3-orig/testsuite/26_numerics/cmath/powi.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/26_numerics/cmath/powi.cc 2005-02-12 21:32:05.000000000 +0100
@@ -0,0 +1,64 @@
+// 2005-02-13 Paolo Carlini <pcarlini@suse.de>
+
+// Copyright (C) 2005 Free Software Foundation
+//
+// 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.
+
+// 26.5 C Library
+
+#include <cmath>
+#include <testsuite_hooks.h>
+
+template<typename T>
+ void test01_do()
+ {
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ VERIFY( pow(T(1.0), 0) == T(1.0) );
+ VERIFY( pow(T(2.0), 0) == T(1.0) );
+ VERIFY( pow(T(-1.0), 0) == T(1.0) );
+ VERIFY( pow(T(-4.0), 0) == T(1.0) );
+
+ VERIFY( pow(T(1.0), 1) == T(1.0) );
+ VERIFY( pow(T(2.0), 1) == T(2.0) );
+ VERIFY( pow(T(-1.0), 1) == T(-1.0) );
+ VERIFY( pow(T(-4.0), 1) == T(-4.0) );
+
+ VERIFY( pow(T(1.0), -1) == T(1.0) / T(1.0) );
+ VERIFY( pow(T(2.0), -1) == T(1.0) / T(2.0) );
+ VERIFY( pow(T(-1.0), -1) == T(1.0) / T(-1.0) );
+ VERIFY( pow(T(-4.0), -1) == T(1.0) / T(-4.0) );
+
+ VERIFY( pow(T(1.0), 2) == T(1.0) * T(1.0) );
+ VERIFY( pow(T(2.0), 2) == T(2.0) * T(2.0) );
+ VERIFY( pow(T(-1.0), 2) == T(-1.0) * T(-1.0) );
+ VERIFY( pow(T(-4.0), 2) == T(-4.0) * T(-4.0) );
+ }
+
+void test01()
+{
+ test01_do<float>();
+ test01_do<double>();
+ test01_do<long double>();
+}
+
+int main()
+{
+ test01();
+ return 0;
+}