This is the mail archive of the libstdc++@gcc.gnu.org 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]
Other format: [Raw text]

[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;
+}

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