[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commits] r9303 - in /trunk/libc: ./ math/ sysdeps/ieee754/dbl-wrap/ sysdeps/ieee754/ldbl-128/ sysdeps/ieee754/ldbl-128ibm/ sysdeps/ie...



Author: maxim
Date: Thu Nov 19 08:20:05 2009
New Revision: 9303

Log:
	* option-groups.def (OPTION_EGLIBC_LIBM_BIG): New option group.
	* option-groups.defaults (OPTION_EGLIBC_LIBM_BIG): Set.
	* configure.in: Handle OPTION_EGLIBC_LIBM_BIG.
	* configure: Regenerate.

	* math/Makefile (tests: atest-*): Condition on OPTION_EGLIBC_LIBM_BIG.
	(libm-test.stmt): Override default result checking precision.
	* math/gen-libm-test.pl (default_ulp): New variable.  Use it to
	override default precision with which test results are checked.
	* math/libm-test.inc (MANT_DIG): Handle [l]dbl-wrap math.
	* math/test-dbl-wrap: New test.

	* sysdeps/ieee754/ldbl-128/s_erfl.c,
	* sysdeps/ieee754/ldbl-128/s_log1pl.c,
	* sysdeps/ieee754/ldbl-128ibm/s_erfl.c,
	* sysdeps/ieee754/ldbl-128ibm/s_log1pl.c,
	* sysdeps/ieee754/ldbl-96/s_erfl.c,
	* sysdeps/ieee754/ldbl-opt/s_atan.c,
	* sysdeps/ieee754/ldbl-opt/s_sin.c,
	* sysdeps/ieee754/ldbl-opt/s_tan.c: Handle !OPTION_EGLIBC_LIBM_BIG.

	* sysdeps/ieee754/dbl-wrap/dbl-wrap.h,
	* sysdeps/ieee754/dbl-wrap/dosincos.c,
	* sysdeps/ieee754/dbl-wrap/e_asin.c,
	* sysdeps/ieee754/dbl-wrap/e_atan2.c,
	* sysdeps/ieee754/dbl-wrap/e_exp.c,
	* sysdeps/ieee754/dbl-wrap/e_exp2.c,
	* sysdeps/ieee754/dbl-wrap/e_log.c,
	* sysdeps/ieee754/dbl-wrap/e_pow.c,
	* sysdeps/ieee754/dbl-wrap/s_atan.c,
	* sysdeps/ieee754/dbl-wrap/s_sin.c,
	* sysdeps/ieee754/dbl-wrap/s_tan.c,
	* sysdeps/ieee754/ldbl-wrap/e_acosl.c,
	* sysdeps/ieee754/ldbl-wrap/e_asinl.c,
	* sysdeps/ieee754/ldbl-wrap/e_expl.c,
	* sysdeps/ieee754/ldbl-wrap/e_j0l.c,
	* sysdeps/ieee754/ldbl-wrap/e_j1l.c,
	* sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c,
	* sysdeps/ieee754/ldbl-wrap/e_powl.c,
	* sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h,
	* sysdeps/ieee754/ldbl-wrap/s_erfl.c,
	* sysdeps/ieee754/ldbl-wrap/s_log1pl.c: New files.

Added:
    trunk/libc/math/test-dbl-wrap.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/
    trunk/libc/sysdeps/ieee754/dbl-wrap/dbl-wrap.h
    trunk/libc/sysdeps/ieee754/dbl-wrap/dosincos.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_asin.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_atan2.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp2.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_log.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/e_pow.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/s_atan.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/s_sin.c
    trunk/libc/sysdeps/ieee754/dbl-wrap/s_tan.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_acosl.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_asinl.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_expl.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j0l.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j1l.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/e_powl.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h
    trunk/libc/sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c
    trunk/libc/sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c
Modified:
    trunk/libc/ChangeLog.eglibc
    trunk/libc/configure
    trunk/libc/configure.in
    trunk/libc/math/Makefile
    trunk/libc/math/gen-libm-test.pl
    trunk/libc/math/libm-test.inc
    trunk/libc/option-groups.def
    trunk/libc/option-groups.defaults
    trunk/libc/sysdeps/ieee754/ldbl-128/s_erfl.c
    trunk/libc/sysdeps/ieee754/ldbl-128/s_log1pl.c
    trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
    trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c
    trunk/libc/sysdeps/ieee754/ldbl-96/s_erfl.c
    trunk/libc/sysdeps/ieee754/ldbl-opt/s_atan.c
    trunk/libc/sysdeps/ieee754/ldbl-opt/s_sin.c
    trunk/libc/sysdeps/ieee754/ldbl-opt/s_tan.c

Modified: trunk/libc/ChangeLog.eglibc
==============================================================================
--- trunk/libc/ChangeLog.eglibc (original)
+++ trunk/libc/ChangeLog.eglibc Thu Nov 19 08:20:05 2009
@@ -1,3 +1,48 @@
+2009-11-19  Maxim Kuvyrkov  <maxim@xxxxxxxxxxxxxxxx>
+
+	* option-groups.def (OPTION_EGLIBC_LIBM_BIG): New option group.
+	* option-groups.defaults (OPTION_EGLIBC_LIBM_BIG): Set.
+	* configure.in: Handle OPTION_EGLIBC_LIBM_BIG.
+	* configure: Regenerate.
+
+	* math/Makefile (tests: atest-*): Condition on OPTION_EGLIBC_LIBM_BIG.
+	(libm-test.stmt): Override default result checking precision.
+	* math/gen-libm-test.pl (default_ulp): New variable.  Use it to
+	override default precision with which test results are checked.
+	* math/libm-test.inc (MANT_DIG): Handle [l]dbl-wrap math.
+	* math/test-dbl-wrap: New test.
+
+	* sysdeps/ieee754/ldbl-128/s_erfl.c,
+	* sysdeps/ieee754/ldbl-128/s_log1pl.c,
+	* sysdeps/ieee754/ldbl-128ibm/s_erfl.c,
+	* sysdeps/ieee754/ldbl-128ibm/s_log1pl.c,
+	* sysdeps/ieee754/ldbl-96/s_erfl.c,
+	* sysdeps/ieee754/ldbl-opt/s_atan.c,
+	* sysdeps/ieee754/ldbl-opt/s_sin.c,
+	* sysdeps/ieee754/ldbl-opt/s_tan.c: Handle !OPTION_EGLIBC_LIBM_BIG.
+
+	* sysdeps/ieee754/dbl-wrap/dbl-wrap.h,
+	* sysdeps/ieee754/dbl-wrap/dosincos.c,
+	* sysdeps/ieee754/dbl-wrap/e_asin.c,
+	* sysdeps/ieee754/dbl-wrap/e_atan2.c,
+	* sysdeps/ieee754/dbl-wrap/e_exp.c,
+	* sysdeps/ieee754/dbl-wrap/e_exp2.c,
+	* sysdeps/ieee754/dbl-wrap/e_log.c,
+	* sysdeps/ieee754/dbl-wrap/e_pow.c,
+	* sysdeps/ieee754/dbl-wrap/s_atan.c,
+	* sysdeps/ieee754/dbl-wrap/s_sin.c,
+	* sysdeps/ieee754/dbl-wrap/s_tan.c,
+	* sysdeps/ieee754/ldbl-wrap/e_acosl.c,
+	* sysdeps/ieee754/ldbl-wrap/e_asinl.c,
+	* sysdeps/ieee754/ldbl-wrap/e_expl.c,
+	* sysdeps/ieee754/ldbl-wrap/e_j0l.c,
+	* sysdeps/ieee754/ldbl-wrap/e_j1l.c,
+	* sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c,
+	* sysdeps/ieee754/ldbl-wrap/e_powl.c,
+	* sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h,
+	* sysdeps/ieee754/ldbl-wrap/s_erfl.c,
+	* sysdeps/ieee754/ldbl-wrap/s_log1pl.c: New files.
+
 2009-11-16  Maxim Kuvyrkov  <maxim@xxxxxxxxxxxxxxxx>
 
 	OPTION_EGLIBC_CRYPT and OPTION_EGLIBC_CRYPT_UFC.

Modified: trunk/libc/configure
==============================================================================
--- trunk/libc/configure (original)
+++ trunk/libc/configure Thu Nov 19 08:20:05 2009
@@ -4464,6 +4464,10 @@
   sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
 fi
 
+# Peek into option-groups.config to check if sysdeps/ieee754/[l]dbl-wrap needs
+# to be included into $sysnames.
+grep "OPTION_EGLIBC_LIBM_BIG = n" option-groups.config > /dev/null 2>&1
+use_dbl_wrap=$?
 
 # Expand the list of system names into a full list of directories
 # from each element's parent name and Implies file (if present).
@@ -4497,6 +4501,14 @@
     for x in $implied_candidate; do
       found=no
       if test -d $xsrcdir$name_base/$x; then
+	# If !OPTION_EGLIBC_LIBM_BIG, add ieee754/dbl-wrap just before
+	# ieee754/dbl-64.
+	if test "$use_dbl_wrap" = "0"; then
+	  case $x in
+	    ieee754/dbl-64) implied="$implied $name_base/ieee754/dbl-wrap" ;;
+	    ieee754/ldbl-*) implied="$implied $name_base/ieee754/ldbl-wrap" ;;
+	  esac
+	fi
 	implied="$implied $name_base/$x";
 	found=yes
       fi
@@ -4510,6 +4522,16 @@
 	 echo "DEBUG: $name implied $x try($d) {$try_srcdir}$try" >&2
 	if test $try != $xsrcdir$name_base/$x && test -d $try_srcdir$try;
 	then
+	  # If !OPTION_EGLIBC_LIBM_BIG, add ieee754/dbl-wrap just before
+	  # ieee754/dbl-64.
+	  if test "$use_dbl_wrap" = "0"; then
+	    case $try in
+	    sysdeps/ieee754/dbl-64)
+	      implied="$implied sysdeps/ieee754/dbl-wrap" ;;
+	    sysdeps/ieee754/ldbl-*)
+	      implied="$implied sysdeps/ieee754/ldbl-wrap" ;;
+	    esac
+	  fi
 	  implied="$implied $try"
 	  found=yes
 	  case "$sysnames_add_ons" in

Modified: trunk/libc/configure.in
==============================================================================
--- trunk/libc/configure.in (original)
+++ trunk/libc/configure.in Thu Nov 19 08:20:05 2009
@@ -758,6 +758,10 @@
   sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
 fi
 
+# Peek into option-groups.config to check if sysdeps/ieee754/[l]dbl-wrap needs
+# to be included into $sysnames.
+grep "OPTION_EGLIBC_LIBM_BIG = n" option-groups.config > /dev/null 2>&1
+use_dbl_wrap=$?
 
 # Expand the list of system names into a full list of directories
 # from each element's parent name and Implies file (if present).
@@ -791,6 +795,14 @@
     for x in $implied_candidate; do
       found=no
       if test -d $xsrcdir$name_base/$x; then
+	# If !OPTION_EGLIBC_LIBM_BIG, add ieee754/dbl-wrap just before
+	# ieee754/dbl-64.
+	if test "$use_dbl_wrap" = "0"; then
+	  case $x in
+	    ieee754/dbl-64) implied="$implied $name_base/ieee754/dbl-wrap" ;;
+	    ieee754/ldbl-*) implied="$implied $name_base/ieee754/ldbl-wrap" ;;
+	  esac
+	fi
 	implied="$implied $name_base/$x";
 	found=yes
       fi
@@ -804,6 +816,16 @@
 	 echo "[DEBUG]: $name implied $x try($d) {$try_srcdir}$try" >&2
 	if test $try != $xsrcdir$name_base/$x && test -d $try_srcdir$try;
 	then
+	  # If !OPTION_EGLIBC_LIBM_BIG, add ieee754/dbl-wrap just before
+	  # ieee754/dbl-64.
+	  if test "$use_dbl_wrap" = "0"; then
+	    case $try in
+	    sysdeps/ieee754/dbl-64)
+	      implied="$implied sysdeps/ieee754/dbl-wrap" ;;
+	    sysdeps/ieee754/ldbl-*)
+	      implied="$implied sysdeps/ieee754/ldbl-wrap" ;;
+	    esac
+	  fi
 	  implied="$implied $try"
 	  found=yes
 	  case "$sysnames_add_ons" in

Modified: trunk/libc/math/Makefile
==============================================================================
--- trunk/libc/math/Makefile (original)
+++ trunk/libc/math/Makefile Thu Nov 19 08:20:05 2009
@@ -90,9 +90,11 @@
 distribute += $(filter-out $(generated),$(long-m-yes:=.c) $(long-c-yes:=.c))
 
 # Rules for the test suite.
-tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
+tests = test-matherr test-fenv basic-test \
 	test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
-	bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2
+	bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2 \
+	test-dbl-wrap
+tests-$(OPTION_EGLIBC_LIBM_BIG) += atest-exp atest-sincos atest-exp2
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl
@@ -114,9 +116,12 @@
 
 $(addprefix $(objpfx), $(libm-tests-generated)): $(objpfx)libm-test.stmp
 
+ifeq (n,$(OPTION_EGLIBC_LIBM_BIG))
+default_ulp = -d 1
+endif
 $(objpfx)libm-test.stmp: $(ulps-file) libm-test.inc gen-libm-test.pl
 	$(make-target-directory)
-	$(PERL) gen-libm-test.pl -u $< -o "$(objpfx)"
+	$(PERL) gen-libm-test.pl -u $< $(default_ulp) -o "$(objpfx)"
 	@echo > $@
 
 $(objpfx)test-float.o: $(objpfx)libm-test.stmp

Modified: trunk/libc/math/gen-libm-test.pl
==============================================================================
--- trunk/libc/math/gen-libm-test.pl (original)
+++ trunk/libc/math/gen-libm-test.pl Thu Nov 19 08:20:05 2009
@@ -48,7 +48,7 @@
 use vars qw (@tests @functions);
 use vars qw ($count);
 use vars qw (%beautify @all_floats);
-use vars qw ($output_dir $ulps_file);
+use vars qw ($output_dir $ulps_file $default_ulp);
 
 # all_floats is sorted and contains all recognised float types
 @all_floats = ('double', 'float', 'idouble',
@@ -93,11 +93,12 @@
 # h: help
 # o: output-directory
 # n: generate new ulps file
-use vars qw($opt_u $opt_h $opt_o $opt_n);
-getopts('u:o:nh');
+use vars qw($opt_u $opt_h $opt_o $opt_n $opt_d);
+getopts('u:o:d:nh');
 
 $ulps_file = 'libm-test-ulps';
 $output_dir = '';
+$default_ulp = '0';
 
 if ($opt_h) {
   print "Usage: gen-libm-test.pl [OPTIONS]\n";
@@ -105,11 +106,13 @@
   print " -o DIR     directory where generated files will be placed\n";
   print " -n         only generate sorted file NewUlps from libm-test-ulps\n";
   print " -u FILE    input file with ulps\n";
+  print " -d NUM     set the default value for ulp to NUM\n";
   exit 0;
 }
 
 $ulps_file = $opt_u if ($opt_u);
 $output_dir = $opt_o if ($opt_o);
+$default_ulp = $opt_d if ($opt_d);
 
 $input = "libm-test.inc";
 $output = "${output_dir}libm-test.c";
@@ -463,7 +466,11 @@
       if (exists $results{$fct}{'has_ulps'}) {
 	$line .= "DELTA$fct";
       } else {
-	$line .= '0';
+	if ($type eq 'complex') {
+	  $line .= "BUILD_COMPLEX ($default_ulp, $default_ulp)";
+	} else {
+	  $line .= "$default_ulp";
+	}
       }
       if (exists $results{$fct}{'has_fails'}) {
 	$line .= ", FAIL$fct";
@@ -642,22 +649,21 @@
 
   if ($type eq 'complex') {
     my ($res);
-    # Return 0 instead of BUILD_COMPLEX (0,0)
     if (!exists $results{$test}{'real'}{'ulp'}{$float} &&
 	!exists $results{$test}{'imag'}{'ulp'}{$float}) {
-      return "0";
+      return "BUILD_COMPLEX ($default_ulp, $default_ulp)";
     }
     $res = 'BUILD_COMPLEX (';
     $res .= (exists $results{$test}{'real'}{'ulp'}{$float}
-	     ? $results{$test}{'real'}{'ulp'}{$float} : "0");
+	     ? $results{$test}{'real'}{'ulp'}{$float} : "$default_ulp");
     $res .= ', ';
     $res .= (exists $results{$test}{'imag'}{'ulp'}{$float}
-	     ? $results{$test}{'imag'}{'ulp'}{$float} : "0");
+	     ? $results{$test}{'imag'}{'ulp'}{$float} : "$default_ulp");
     $res .= ')';
     return $res;
   }
   return (exists $results{$test}{'normal'}{'ulp'}{$float}
-	  ? $results{$test}{'normal'}{'ulp'}{$float} : "0");
+	  ? $results{$test}{'normal'}{'ulp'}{$float} : "$default_ulp");
 }
 
 sub get_failure {

Modified: trunk/libc/math/libm-test.inc
==============================================================================
--- trunk/libc/math/libm-test.inc (original)
+++ trunk/libc/math/libm-test.inc Thu Nov 19 08:20:05 2009
@@ -128,6 +128,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <argp.h>
+#include <gnu/option-groups.h>
 
 /* Possible exceptions */
 #define NO_EXCEPTION			0x0
@@ -188,8 +189,15 @@
      __retval; })
 
 
+#if __OPTION_EGLIBC_LIBM_BIG
 #define MANT_DIG CHOOSE ((LDBL_MANT_DIG-1), (DBL_MANT_DIG-1), (FLT_MANT_DIG-1),  \
                          (LDBL_MANT_DIG-1), (DBL_MANT_DIG-1), (FLT_MANT_DIG-1))
+#else
+/* Reduce precision to which the results are checked against
+   expected values.  */
+#define MANT_DIG CHOOSE ((FLT_MANT_DIG-3), (FLT_MANT_DIG-4), (FLT_MANT_DIG-1), \
+                         (FLT_MANT_DIG-3), (FLT_MANT_DIG-4), (FLT_MANT_DIG-1))
+#endif
 
 static void
 init_max_error (void)
@@ -2483,7 +2491,12 @@
 #ifdef TEST_LDOUBLE
   /* The result can only be represented in long double.  */
 # if LDBL_MIN_10_EXP < -319
+#  if __OPTION_EGLIBC_LIBM_BIG
   TEST_f_f (erfc, 27.0L, 0.523704892378925568501606768284954709e-318L);
+#  else
+  /* ldbl-wrap uses single-precision erfc, so it can't handle e-318 values.  */
+  TEST_f_f (erfc, 27.0L, 0.0L);
+#  endif
 # endif
 #endif
 

Added: trunk/libc/math/test-dbl-wrap.c
==============================================================================
--- trunk/libc/math/test-dbl-wrap.c (added)
+++ trunk/libc/math/test-dbl-wrap.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,110 @@
+#include <math.h>
+#include <stdio.h>
+
+#define N 4
+
+static int
+do_test (int argc, char *argv[])
+{
+  int i;
+  int result = 0;
+
+  const double eps = 0.01, pi = 3.14;
+  const double sin_data[N][2]
+    = {{0.0, 0.0}, {pi / 6, 0.5}, {pi / 4, 0.707}, {pi / 3, 0.866}};
+  const double exp_data[N][2]
+    = {{0.0, 1.0}, {0.5, 1.649}, {1.0, 2.718}, {2.718, 15.150}};
+
+  for (i = 0; i < N; ++i)
+    {
+      double x, y;
+      double s1, c1, t1, e1;
+      double s2, c2, t2, as2, ac2, at2, e2, l2;
+
+      x = sin_data[i][0];
+      s1 = sin_data[i][1];
+      c1 = sqrt (1 - s1 * s1);
+      t1 = s1 / c1;
+
+      s2 = sin (x);
+      c2 = cos (x);
+      t2 = tan (x);
+      as2 = asin (s1);
+      ac2 = acos (c1);
+      at2 = atan (t1);
+
+      y = exp_data[i][0];
+      e1 = exp_data[i][1];
+
+      e2 = exp (y);
+      l2 = log (e1);
+
+      if (fabs (s1 - s2) > eps)
+	{
+	  result |= 1;
+#if PRINT
+	  printf ("sin(%.3lf) = %.3lf\n", x, s2);
+#endif
+	}
+
+      if (fabs (c1 - c2) > eps)
+	{
+	  result |= 2;
+#if PRINT
+	  printf ("cos(%.3lf) = %.3lf\n", x, c2);
+#endif
+	}
+
+      if (fabs (t1 - t2) > eps)
+	{
+	  result |= 4;
+#if PRINT
+	  printf ("tan(%.3lf) = %.3lf\n", x, t2);
+#endif
+	}
+
+      if (fabs (x - as2) > eps)
+	{
+	  result |= 8;
+#if PRINT
+	  printf ("asin(%.3lf) = %.3lf\n", s1, as2);
+#endif
+	}
+
+      if (fabs (x - ac2) > eps)
+	{
+	  result |= 16;
+#if PRINT
+	  printf ("acos(%.3lf) = %.3lf\n", c1, ac2);
+#endif
+	}
+
+      if (fabs (x - at2) > eps)
+	{
+	  result |= 32;
+#if PRINT
+	  printf ("atan(%.3lf) = %.3lf\n", t1, at2);
+#endif
+	}
+
+      if (fabs (e1 - e2) > eps)
+	{
+	  result |= 64;
+#if PRINT
+	  printf ("exp(%.3lf) = %.3lf\n", y, e2);
+#endif
+	}
+
+      if (fabs (y - l2) > eps)
+	{
+	  result |= 128;
+#if PRINT
+	  printf ("log(%.3lf) = %.3lf\n", e1, l2);
+#endif
+	}
+    }
+
+  return result;
+}
+
+#include "../test-skeleton.c"

Modified: trunk/libc/option-groups.def
==============================================================================
--- trunk/libc/option-groups.def (original)
+++ trunk/libc/option-groups.def Thu Nov 19 08:20:05 2009
@@ -464,6 +464,19 @@
        group, you will not be able to build 'libstdc++' against the
        resulting EGLIBC installation.
 
+config OPTION_EGLIBC_LIBM_BIG
+   bool "Math library size"
+   help
+       This option group enables default configuration of the math library.
+       Not selecting this option group removes most of the extended and
+       double precision math functions and replaces them with wrappers
+       to the single precision couterparts.
+       Doing so greatly degrades quality of calculations carried
+       out by the functions of the math library, but also significantly
+       reduces the size of the libm.
+       This option group is useful for systems that do not rely on precise
+       floating point math.
+
 config OPTION_EGLIBC_LOCALES
    bool "Locale definitions"
    help

Modified: trunk/libc/option-groups.defaults
==============================================================================
--- trunk/libc/option-groups.defaults (original)
+++ trunk/libc/option-groups.defaults Thu Nov 19 08:20:05 2009
@@ -28,6 +28,7 @@
 OPTION_EGLIBC_INET = y
 OPTION_EGLIBC_INET_ANL = y
 OPTION_EGLIBC_LIBM = y
+OPTION_EGLIBC_LIBM_BIG = y
 OPTION_EGLIBC_LOCALES = y
 OPTION_EGLIBC_LOCALE_CODE = y
 OPTION_EGLIBC_MEMUSAGE = y

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/dbl-wrap.h
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/dbl-wrap.h (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/dbl-wrap.h Thu Nov 19 08:20:05 2009
@@ -1,0 +1,2 @@
+typedef float wrap_type_t;
+#define WRAP_FUNC(func) func ## f

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/dosincos.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/dosincos.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/dosincos.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,1 @@
+/* empty */

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_asin.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_asin.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_asin.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,17 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_asin) (wrap_type_t);
+
+double
+__ieee754_asin (double x)
+{
+  return (double) WRAP_FUNC (__ieee754_asin) ((wrap_type_t) x);
+}
+
+wrap_type_t WRAP_FUNC (__ieee754_acos) (wrap_type_t);
+
+double
+__ieee754_acos (double x)
+{
+  return (double) WRAP_FUNC (__ieee754_acos) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_atan2.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_atan2.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_atan2.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_atan2) (wrap_type_t, wrap_type_t);
+
+double
+__ieee754_atan2 (double y, double x)
+{
+  return (double) WRAP_FUNC (__ieee754_atan2) ((wrap_type_t) y, (wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_exp) (wrap_type_t);
+
+double
+__ieee754_exp (double x)
+{
+  return (double) WRAP_FUNC (__ieee754_exp) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp2.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp2.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_exp2.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_exp2) (wrap_type_t);
+
+double
+__ieee754_exp2 (double x)
+{
+  return (double) WRAP_FUNC (__ieee754_exp2) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_log.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_log.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_log.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,8 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_log) (wrap_type_t);
+
+double __ieee754_log (double x)
+{
+  return (double) WRAP_FUNC (__ieee754_log) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/e_pow.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/e_pow.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/e_pow.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_pow) (wrap_type_t, wrap_type_t);
+
+double
+__ieee754_pow (double x, double y)
+{
+  return (double) WRAP_FUNC (__ieee754_pow) ((wrap_type_t) x, (wrap_type_t) y);
+}

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/s_atan.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/s_atan.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/s_atan.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,13 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (atan) (wrap_type_t);
+
+double
+atan (double x)
+{
+  return (double) WRAP_FUNC (atan) ((wrap_type_t) x);
+}
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (atan, atanl)
+#endif

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/s_sin.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/s_sin.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/s_sin.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,27 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__sin) (wrap_type_t);
+
+double
+__sin (double x)
+{
+  return (double) WRAP_FUNC (__sin) ((wrap_type_t) x);
+}
+
+wrap_type_t WRAP_FUNC (__cos) (wrap_type_t);
+
+double
+__cos (double x)
+{
+  return (double) WRAP_FUNC (__cos) ((wrap_type_t) x);
+}
+
+weak_alias (__cos, cos)
+weak_alias (__sin, sin)
+
+#ifdef NO_LONG_DOUBLE
+strong_alias (__sin, __sinl)
+weak_alias (__sin, sinl)
+strong_alias (__cos, __cosl)
+weak_alias (__cos, cosl)
+#endif

Added: trunk/libc/sysdeps/ieee754/dbl-wrap/s_tan.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/dbl-wrap/s_tan.c (added)
+++ trunk/libc/sysdeps/ieee754/dbl-wrap/s_tan.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,13 @@
+#include "dbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (tan) (wrap_type_t);
+
+double
+tan (double x)
+{
+  return (double) WRAP_FUNC (tan) ((wrap_type_t) x);
+}
+
+#ifdef NO_LONG_DOUBLE
+weak_alias (tan, tanl)
+#endif

Modified: trunk/libc/sysdeps/ieee754/ldbl-128/s_erfl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-128/s_erfl.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-128/s_erfl.c Thu Nov 19 08:20:05 2009
@@ -98,6 +98,9 @@
 
 #include "math.h"
 #include "math_private.h"
+#include <gnu/option-groups.h>
+
+#if __OPTION_EGLIBC_LIBM_BIG
 
 /* Evaluate P[n] x^n  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
 
@@ -948,4 +951,9 @@
     }
 }
 
+#else /* !__OPTION_EGLIBC_LIBM_BIG */
+# include <sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c>
+weak_alias (__erfl, erfl)
+#endif /* __OPTION_EGLIBC_LIBM_BIG */
+
 weak_alias (__erfcl, erfcl)

Modified: trunk/libc/sysdeps/ieee754/ldbl-128/s_log1pl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-128/s_log1pl.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-128/s_log1pl.c Thu Nov 19 08:20:05 2009
@@ -55,6 +55,9 @@
 
 #include "math.h"
 #include "math_private.h"
+#include <gnu/option-groups.h>
+
+#if __OPTION_EGLIBC_LIBM_BIG
 
 /* Coefficients for log(1+x) = x - x^2 / 2 + x^3 P(x)/Q(x)
  * 1/sqrt(2) <= 1+x < sqrt(2)
@@ -246,4 +249,8 @@
   return (z);
 }
 
+#else /* !__OPTION_EGLIBC_LIBM_BIG */
+# include <sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c>
+#endif /* __OPTION_EGLIBC_LIBM_BIG */
+
 weak_alias (__log1pl, log1pl)

Modified: trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_erfl.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_erfl.c Thu Nov 19 08:20:05 2009
@@ -99,6 +99,9 @@
 #include "math.h"
 #include "math_private.h"
 #include <math_ldbl_opt.h>
+#include <gnu/option-groups.h>
+
+#if __OPTION_EGLIBC_LIBM_BIG
 
 /* Evaluate P[n] x^n  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
 
@@ -955,4 +958,9 @@
     }
 }
 
+#else /* !__OPTION_EGLIBC_LIBM_BIG */
+# include <sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c>
+long_double_symbol (libm, __erfl, erfl);
+#endif /* __OPTION_EGLIBC_LIBM_BIG */
+
 long_double_symbol (libm, __erfcl, erfcl);

Modified: trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c Thu Nov 19 08:20:05 2009
@@ -56,6 +56,9 @@
 #include "math.h"
 #include "math_private.h"
 #include <math_ldbl_opt.h>
+#include <gnu/option-groups.h>
+
+#if __OPTION_EGLIBC_LIBM_BIG
 
 /* Coefficients for log(1+x) = x - x^2 / 2 + x^3 P(x)/Q(x)
  * 1/sqrt(2) <= 1+x < sqrt(2)
@@ -248,4 +251,8 @@
   return (z);
 }
 
+#else /* !__OPTION_EGLIBC_LIBM_BIG */
+# include <sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c>
+#endif /* __OPTION_EGLIBC_LIBM_BIG */
+
 long_double_symbol (libm, __log1pl, log1pl);

Modified: trunk/libc/sysdeps/ieee754/ldbl-96/s_erfl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-96/s_erfl.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-96/s_erfl.c Thu Nov 19 08:20:05 2009
@@ -106,6 +106,9 @@
 
 #include "math.h"
 #include "math_private.h"
+#include <gnu/option-groups.h>
+
+#if __OPTION_EGLIBC_LIBM_BIG
 
 #ifdef __STDC__
 static const long double
@@ -451,4 +454,9 @@
     }
 }
 
+#else /* !__OPTION_EGLIBC_LIBM_BIG */
+# include <sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c>
+weak_alias (__erfl, erfl)
+#endif /* __OPTION_EGLIBC_LIBM_BIG */
+
 weak_alias (__erfcl, erfcl)

Modified: trunk/libc/sysdeps/ieee754/ldbl-opt/s_atan.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-opt/s_atan.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-opt/s_atan.c Thu Nov 19 08:20:05 2009
@@ -1,5 +1,10 @@
 #include <math_ldbl_opt.h>
-#include <sysdeps/ieee754/dbl-64/s_atan.c>
+#include <gnu/option-groups.h>
+#if __OPTION_EGLIBC_LIBM_BIG
+# include <sysdeps/ieee754/dbl-64/s_atan.c>
+#else
+# include <sysdeps/ieee754/dbl-wrap/s_atan.c>
+#endif
 #if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
 compat_symbol (libm, atan, atanl, GLIBC_2_0);
 #endif

Modified: trunk/libc/sysdeps/ieee754/ldbl-opt/s_sin.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-opt/s_sin.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-opt/s_sin.c Thu Nov 19 08:20:05 2009
@@ -1,9 +1,14 @@
 /* dbl-64/s_sin.c uses NAN and sincos identifiers internally.  */
 #define sincos sincos_disable
 #include <math_ldbl_opt.h>
+#include <gnu/option-groups.h>
 #undef NAN
 #undef sincos
-#include <sysdeps/ieee754/dbl-64/s_sin.c>
+#if __OPTION_EGLIBC_LIBM_BIG
+# include <sysdeps/ieee754/dbl-64/s_sin.c>
+#else
+# include <sysdeps/ieee754/dbl-wrap/s_sin.c>
+#endif
 #if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
 compat_symbol (libm, __sin, sinl, GLIBC_2_0);
 compat_symbol (libm, __cos, cosl, GLIBC_2_0);

Modified: trunk/libc/sysdeps/ieee754/ldbl-opt/s_tan.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-opt/s_tan.c (original)
+++ trunk/libc/sysdeps/ieee754/ldbl-opt/s_tan.c Thu Nov 19 08:20:05 2009
@@ -1,5 +1,10 @@
 #include <math_ldbl_opt.h>
-#include <sysdeps/ieee754/dbl-64/s_tan.c>
+#include <gnu/option-groups.h>
+#if __OPTION_EGLIBC_LIBM_BIG
+# include <sysdeps/ieee754/dbl-64/s_tan.c>
+#else
+# include <sysdeps/ieee754/dbl-wrap/s_tan.c>
+#endif
 #if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
 compat_symbol (libm, tan, tanl, GLIBC_2_0);
 #endif

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_acosl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_acosl.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_acosl.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_acos) (wrap_type_t);
+
+long double
+__ieee754_acosl (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_acos) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_asinl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_asinl.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_asinl.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_asin) (wrap_type_t);
+
+long double
+__ieee754_asinl (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_asin) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_expl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_expl.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_expl.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_exp) (wrap_type_t);
+
+long double
+__ieee754_expl (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_exp) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j0l.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j0l.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j0l.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,17 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_j0) (wrap_type_t);
+
+long double
+__ieee754_j0l (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_j0) ((wrap_type_t) x);
+}
+
+wrap_type_t WRAP_FUNC (__ieee754_y0) (wrap_type_t);
+
+long double
+__ieee754_y0l (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_y0) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j1l.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j1l.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_j1l.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,17 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_j1) (wrap_type_t);
+
+long double
+__ieee754_j1l (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_j1) ((wrap_type_t) x);
+}
+
+wrap_type_t WRAP_FUNC (__ieee754_y1) (wrap_type_t);
+
+long double
+__ieee754_y1l (long double x)
+{
+  return (long double) WRAP_FUNC (__ieee754_y1) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_lgammal_r.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC2 (__ieee754_lgamma, _r) (wrap_type_t, int *);
+
+long double
+__ieee754_lgammal_r (long double x, int *s)
+{
+  return (long double) WRAP_FUNC2 (__ieee754_lgamma, _r) ((wrap_type_t) x, s);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/e_powl.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/e_powl.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/e_powl.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,10 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__ieee754_pow) (wrap_type_t, wrap_type_t);
+
+long double
+__ieee754_powl (long double x, long double y)
+{
+  return (long double) WRAP_FUNC (__ieee754_pow) ((wrap_type_t) x,
+						  (wrap_type_t) y);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/ldbl-wrap.h Thu Nov 19 08:20:05 2009
@@ -1,0 +1,3 @@
+typedef float wrap_type_t;
+#define WRAP_FUNC(func) func ## f
+#define WRAP_FUNC2(func, suffix) func ## f ## suffix

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/s_erfl-wrap.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,17 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__erf) (wrap_type_t);
+
+long double
+__erfl (long double x)
+{
+  return (long double) WRAP_FUNC (__erf) ((wrap_type_t) x);
+}
+
+wrap_type_t WRAP_FUNC (__erfc) (wrap_type_t);
+
+long double
+__erfcl (long double x)
+{
+  return (long double) WRAP_FUNC (__erfc) ((wrap_type_t) x);
+}

Added: trunk/libc/sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c
==============================================================================
--- trunk/libc/sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c (added)
+++ trunk/libc/sysdeps/ieee754/ldbl-wrap/s_log1pl-wrap.c Thu Nov 19 08:20:05 2009
@@ -1,0 +1,9 @@
+#include "ldbl-wrap.h"
+
+wrap_type_t WRAP_FUNC (__log1p) (wrap_type_t);
+
+long double
+__log1pl (long double x)
+{
+  return (long double) WRAP_FUNC (__log1p) ((wrap_type_t) x);
+}