summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2015-03-26 03:05:30 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2015-03-26 03:05:30 (GMT)
commit90cc5df290516821b0b4c535c805771516832c60 (patch)
tree44b61a8acfba0eeadbcb9b0bbcb1cc31326cb332
parent27dd4e0f05c72c9ec3745965d525cc4637fc2e0a (diff)
downloadhdf5-90cc5df290516821b0b4c535c805771516832c60.zip
hdf5-90cc5df290516821b0b4c535c805771516832c60.tar.gz
hdf5-90cc5df290516821b0b4c535c805771516832c60.tar.bz2
[svn-r26598] Description:
Bring r26501 from the autotools_rework branch to the trunk: Remove ULLONG_TO_LDOUBLE_PRECISION macro/define, as it's targeting bugs in the FreeBSD and Cygwin compilers. Tested on: Linux/32 2.6.18 (jam) w/serial & parallel (Daily tested on branch for 2+ days)
-rw-r--r--config/cmake/ConfigureChecks.cmake8
-rw-r--r--config/cmake/ConversionTests.c79
-rw-r--r--config/cmake/H5pubconf.h.in4
-rwxr-xr-xconfigure124
-rw-r--r--configure.ac98
-rw-r--r--src/H5Tpkg.h3
-rw-r--r--src/H5config.h.in4
-rw-r--r--test/dt_arith.c24
8 files changed, 4 insertions, 340 deletions
diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake
index e8951c6..2b4c4a3 100644
--- a/config/cmake/ConfigureChecks.cmake
+++ b/config/cmake/ConfigureChecks.cmake
@@ -259,14 +259,6 @@ ENDMACRO (H5MiscConversionTest)
#-----------------------------------------------------------------------------
# ----------------------------------------------------------------------
-# Set the flag to indicate that the machine can convert from
-# 'unsigned long long' to 'long double' without precision loss.
-# (This flag should be set for all machines, except for FreeBSD(sleipnir)
-# where the last 2 bytes of mantissa are lost when compiler tries to do
-# the conversion, and Cygwin where compiler doesn't do rounding correctly.)
-#
-H5ConversionTests (H5_ULLONG_TO_LDOUBLE_PRECISION "Checking IF converting unsigned long long to long double with precision")
-# ----------------------------------------------------------------------
# Set the flag to indicate that the machine can handle overflow converting
# all floating-point to all integer types.
# (This flag should be set for all machines, except for Cray X1 where
diff --git a/config/cmake/ConversionTests.c b/config/cmake/ConversionTests.c
index 3003ef2..9a81a20 100644
--- a/config/cmake/ConversionTests.c
+++ b/config/cmake/ConversionTests.c
@@ -266,82 +266,3 @@ main ()
#endif
-#ifdef H5_ULLONG_TO_LDOUBLE_PRECISION_TEST
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-int main(void)
-{
- /* General variables */
- int endian;
- int tst_value = 1;
- int ret = 0;
-
- /* For FreeBSD */
- unsigned long long l = 0xa601e80bda85fcefULL;
- long double ld;
- unsigned char *c1, *c2;
- size_t size;
-
- /* For Cygwin */
- unsigned long long l_cyg = 0xfffffffffffffff0ULL;
- long double ld_cyg;
- unsigned char *c2_cyg;
- size_t size_cyg;
-
-
- /* Determine this system's endianess */
- c1 = (unsigned char*)calloc(1, sizeof(int));
- memcpy((void*)c1, &tst_value, sizeof(int));
- if(c1[0]==1)
- endian = 0; /* little endian */
- else
- endian = 1; /* big endian */
-
- /* For FreeBSD */
- size = sizeof(long double);
- memset(&ld, 0, size);
- ld = (long double)l;
-
- c2 = (unsigned char*)calloc(1, size);
- memcpy((void*)c2, &ld, size);
-
- /* Test if the last 2 bytes of mantissa are lost. Mainly for FreeBSD on Intel
- * architecture(sleipnir) where it happens. */
- /*if(endian==0 && c2[0]==0 && c2[1]==0)*/ /*little endian*/
- if(endian==0 && c2[0]==0) { /*little endian*/
- ret = 1;
- goto done;
- }
-
- /* For Cygwin */
- size_cyg = sizeof(long double);
- memset(&ld_cyg, 0, size);
- ld_cyg = (long double)l_cyg;
-
- c2_cyg = (unsigned char*)calloc(1, size_cyg);
- memcpy((void*)c2_cyg, &ld_cyg, size_cyg);
-
- /* Test if the last 4 bytes(roughly) of mantissa are rounded up. Mainly for Cygwin
- * where the values like 0xffffffffffffffff, 0xfffffffffffffffe, ...,
- * 0xfffffffffffff000 ... are rounded up as 0x0000403f8000000000000000
- * instead of 0x0000403effffffffffffffff, 0x0000403efffffffffffffffe, ...,
- * 0x0000403efffffffffffff000 ...
- */
- if(endian==0 && c2_cyg[0]==0 && c2_cyg[1]==0 && c2_cyg[2]==0 && c2_cyg[3]==0)
- ret = 1;
-
-done:
- if(c1)
- free(c1);
- if(c2)
- free(c2);
- if(c2_cyg)
- free(c2_cyg);
- exit(ret);
-}
-
-#endif
-
diff --git a/config/cmake/H5pubconf.h.in b/config/cmake/H5pubconf.h.in
index 39b6a60..8d7642e 100644
--- a/config/cmake/H5pubconf.h.in
+++ b/config/cmake/H5pubconf.h.in
@@ -646,10 +646,6 @@
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
#cmakedefine H5_TM_IN_SYS_TIME @H5_TM_IN_SYS_TIME@
-/* Define if your system can convert unsigned long long to long double with
- correct precision. */
-#cmakedefine H5_ULLONG_TO_LDOUBLE_PRECISION @H5_ULLONG_TO_LDOUBLE_PRECISION@
-
/* Define using v1.6 public API symbols by default */
#cmakedefine H5_USE_16_API_DEFAULT @H5_USE_16_API_DEFAULT@
diff --git a/configure b/configure
index 4d36297..28461c8 100755
--- a/configure
+++ b/configure
@@ -28151,130 +28151,6 @@ $as_echo "no" >&6; }
esac
## ----------------------------------------------------------------------
-## Set the flag to indicate that the machine can convert from
-## 'unsigned long long' to 'long double' without precision loss.
-## (This flag should be set for all machines, except for FreeBSD(sleipnir)
-## where the last 2 bytes of mantissa are lost when compiler tries to do
-## the conversion, and Cygwin where compiler doesn't do rounding correctly.)
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if converting unsigned long long to long double with precision" >&5
-$as_echo_n "checking if converting unsigned long long to long double with precision... " >&6; }
-
-if test ${ac_cv_sizeof_long_double} = 0; then
- hdf5_cv_ullong_to_ldouble_precision=${hdf5_cv_ullong_to_ldouble_precision=no}
-else
- if ${hdf5_cv_ullong_to_ldouble_precision+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #include <stdlib.h>
- #include <string.h>
-
- int main(void)
- {
- /* General variables */
- int endian;
- int tst_value = 1;
- int ret = 0;
-
- /* For FreeBSD */
- unsigned long long l = 0xa601e80bda85fcefULL;
- long double ld;
- unsigned char *c1, *c2;
- size_t size;
-
- /* For Cygwin */
- unsigned long long l_cyg = 0xfffffffffffffff0ULL;
- long double ld_cyg;
- unsigned char *c2_cyg;
- size_t size_cyg;
-
-
- /* Determine this system's endianess */
- c1 = (unsigned char*)calloc(1, sizeof(int));
- memcpy((void*)c1, &tst_value, sizeof(int));
- if(c1[0]==1)
- endian = 0; /* little endian */
- else
- endian = 1; /* big endian */
-
- /* For FreeBSD */
- size = sizeof(long double);
- memset(&ld, 0, size);
- ld = (long double)l;
-
- c2 = (unsigned char*)calloc(1, size);
- memcpy((void*)c2, &ld, size);
-
- /* Test if the last 2 bytes of mantissa are lost. Mainly for FreeBSD on Intel
- * architecture(sleipnir) where it happens. */
- /*if(endian==0 && c2[0]==0 && c2[1]==0)*/ /*little endian*/
- if(endian==0 && c2[0]==0) { /*little endian*/
- ret = 1;
- goto done;
- }
-
- /* For Cygwin */
- size_cyg = sizeof(long double);
- memset(&ld_cyg, 0, size);
- ld_cyg = (long double)l_cyg;
-
- c2_cyg = (unsigned char*)calloc(1, size_cyg);
- memcpy((void*)c2_cyg, &ld_cyg, size_cyg);
-
- /* Test if the last 4 bytes(roughly) of mantissa are rounded up. Mainly for Cygwin
- * where the values like 0xffffffffffffffff, 0xfffffffffffffffe, ...,
- * 0xfffffffffffff000 ... are rounded up as 0x0000403f8000000000000000
- * instead of 0x0000403effffffffffffffff, 0x0000403efffffffffffffffe, ...,
- * 0x0000403efffffffffffff000 ...
- */
- if(endian==0 && c2_cyg[0]==0 && c2_cyg[1]==0 && c2_cyg[2]==0 && c2_cyg[3]==0)
- ret = 1;
-
- done:
- if(c1)
- free(c1);
- if(c2)
- free(c2);
- if(c2_cyg)
- free(c2_cyg);
- exit(ret);
- }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- hdf5_cv_ullong_to_ldouble_precision=yes
-else
- hdf5_cv_ullong_to_ldouble_precision=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-
-fi
-
-if test ${hdf5_cv_ullong_to_ldouble_precision} = "yes"; then
-
-$as_echo "#define ULLONG_TO_LDOUBLE_PRECISION 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-## ----------------------------------------------------------------------
## Set the flag to indicate that the machine can handle overflow converting
## all floating-point to all integer types.
## (This flag should be set for all machines, except for Cray X1 where
diff --git a/configure.ac b/configure.ac
index eae1b9c..5949e70 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2575,104 +2575,6 @@ case "`uname`" in
esac
## ----------------------------------------------------------------------
-## Set the flag to indicate that the machine can convert from
-## 'unsigned long long' to 'long double' without precision loss.
-## (This flag should be set for all machines, except for FreeBSD(sleipnir)
-## where the last 2 bytes of mantissa are lost when compiler tries to do
-## the conversion, and Cygwin where compiler doesn't do rounding correctly.)
-##
-AC_MSG_CHECKING([if converting unsigned long long to long double with precision])
-
-if test ${ac_cv_sizeof_long_double} = 0; then
- hdf5_cv_ullong_to_ldouble_precision=${hdf5_cv_ullong_to_ldouble_precision=no}
-else
- AC_CACHE_VAL([hdf5_cv_ullong_to_ldouble_precision],
- [AC_TRY_RUN([
- #include <stdlib.h>
- #include <string.h>
-
- int main(void)
- {
- /* General variables */
- int endian;
- int tst_value = 1;
- int ret = 0;
-
- /* For FreeBSD */
- unsigned long long l = 0xa601e80bda85fcefULL;
- long double ld;
- unsigned char *c1, *c2;
- size_t size;
-
- /* For Cygwin */
- unsigned long long l_cyg = 0xfffffffffffffff0ULL;
- long double ld_cyg;
- unsigned char *c2_cyg;
- size_t size_cyg;
-
-
- /* Determine this system's endianess */
- c1 = (unsigned char*)calloc(1, sizeof(int));
- memcpy((void*)c1, &tst_value, sizeof(int));
- if(c1[0]==1)
- endian = 0; /* little endian */
- else
- endian = 1; /* big endian */
-
- /* For FreeBSD */
- size = sizeof(long double);
- memset(&ld, 0, size);
- ld = (long double)l;
-
- c2 = (unsigned char*)calloc(1, size);
- memcpy((void*)c2, &ld, size);
-
- /* Test if the last 2 bytes of mantissa are lost. Mainly for FreeBSD on Intel
- * architecture(sleipnir) where it happens. */
- /*if(endian==0 && c2[0]==0 && c2[1]==0)*/ /*little endian*/
- if(endian==0 && c2[0]==0) { /*little endian*/
- ret = 1;
- goto done;
- }
-
- /* For Cygwin */
- size_cyg = sizeof(long double);
- memset(&ld_cyg, 0, size);
- ld_cyg = (long double)l_cyg;
-
- c2_cyg = (unsigned char*)calloc(1, size_cyg);
- memcpy((void*)c2_cyg, &ld_cyg, size_cyg);
-
- /* Test if the last 4 bytes(roughly) of mantissa are rounded up. Mainly for Cygwin
- * where the values like 0xffffffffffffffff, 0xfffffffffffffffe, ...,
- * 0xfffffffffffff000 ... are rounded up as 0x0000403f8000000000000000
- * instead of 0x0000403effffffffffffffff, 0x0000403efffffffffffffffe, ...,
- * 0x0000403efffffffffffff000 ...
- */
- if(endian==0 && c2_cyg[0]==0 && c2_cyg[1]==0 && c2_cyg[2]==0 && c2_cyg[3]==0)
- ret = 1;
-
- done:
- if(c1)
- free(c1);
- if(c2)
- free(c2);
- if(c2_cyg)
- free(c2_cyg);
- exit(ret);
- }
- ], [hdf5_cv_ullong_to_ldouble_precision=yes], [hdf5_cv_ullong_to_ldouble_precision=no],)])
-fi
-
-if test ${hdf5_cv_ullong_to_ldouble_precision} = "yes"; then
- AC_DEFINE([ULLONG_TO_LDOUBLE_PRECISION], [1],
- [Define if your system can convert unsigned long long to long double with correct precision.])
- AC_MSG_RESULT([yes])
-else
- AC_MSG_RESULT([no])
-fi
-
-## ----------------------------------------------------------------------
## Set the flag to indicate that the machine can handle overflow converting
## all floating-point to all integer types.
## (This flag should be set for all machines, except for Cray X1 where
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index ffcfe0a..ab64fdc 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -135,8 +135,7 @@
* not support unsigned long long. For FreeBSD(sleipnir), the last 2 bytes of mantissa are lost when
* compiler tries to do the conversion. For Cygwin, compiler doesn't do rounding correctly.
* Mac OS 10.4 gives some incorrect result. */
-#if (H5_WANT_DATA_ACCURACY && \
- defined(H5_ULLONG_TO_LDOUBLE_PRECISION) && defined(H5_LLONG_TO_LDOUBLE_CORRECT)) || (!H5_WANT_DATA_ACCURACY)
+#if (H5_WANT_DATA_ACCURACY && defined(H5_LLONG_TO_LDOUBLE_CORRECT)) || (!H5_WANT_DATA_ACCURACY)
#define H5T_CONV_INTERNAL_ULLONG_LDOUBLE 1
#endif
diff --git a/src/H5config.h.in b/src/H5config.h.in
index 4baab7e..5299d44 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -557,10 +557,6 @@
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME
-/* Define if your system can convert unsigned long long to long double with
- correct precision. */
-#undef ULLONG_TO_LDOUBLE_PRECISION
-
/* Define using v1.6 public API symbols by default */
#undef USE_16_API_DEFAULT
diff --git a/test/dt_arith.c b/test/dt_arith.c
index b47b6e2..f6349de 100644
--- a/test/dt_arith.c
+++ b/test/dt_arith.c
@@ -4489,24 +4489,6 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
}
#endif /*end H5_FP_TO_ULLONG_BOTTOM_BIT_WORKS*/
-/* For GNU compilers on FreeBSD(sleipnir), during conversion from 'unsigned long long'
-* to 'long double', the last 2 bytes of mantissa are lost. But this loss seems
-* acceptable. We allow it to go through instead of fail it. Sometimes, there's roundup
-* to the 3rd last byte of mantissa. So we only try to compare all but the last 3 bytes.
-*/
-#ifndef H5_ULLONG_TO_LDOUBLE_PRECISION
-#if H5_SIZEOF_LONG_DOUBLE !=0
- if(src_type==INT_ULLONG && dst_type==FLT_LDOUBLE) {
- long double tmp_s, tmp_h;
- HDmemcpy(&tmp_s,&buf[j*dst_size],sizeof(long double));
- HDmemcpy(&tmp_h,&hw[0],sizeof(long double));
- /*Don't compare the last 3 bytes of mantissa*/
- if(!HDmemcmp(&tmp_s+4, &tmp_h+4, sizeof(long double)-4))
- continue; /*no error*/
- }
-#endif
-#endif /*end H5_ULLONG_TO_LDOUBLE_PRECISION*/
-
/* Print errors */
if (0==fails_this_test++) {
if(run_test==TEST_NORMAL) {
@@ -5159,9 +5141,9 @@ run_int_fp_conv(const char *name)
HDputs(" Test skipped due to compiler error in handling conversion.");
}
#endif /* H5_LLONG_TO_LDOUBLE_CORRECT */
-#if H5_ULLONG_TO_LDOUBLE_PRECISION && H5_LLONG_TO_LDOUBLE_CORRECT
+#if H5_LLONG_TO_LDOUBLE_CORRECT
nerrors += test_conv_int_fp(name, TEST_NORMAL, H5T_NATIVE_ULLONG, H5T_NATIVE_LDOUBLE);
-#else /* H5_ULLONG_TO_LDOUBLE_PRECISION && H5_LLONG_TO_LDOUBLE_CORRECT */
+#else /* H5_LLONG_TO_LDOUBLE_CORRECT */
{
char str[256]; /*hello string */
@@ -5171,7 +5153,7 @@ run_int_fp_conv(const char *name)
SKIPPED();
HDputs(" Test skipped due to compiler not handling conversion.");
}
-#endif /* H5_ULLONG_TO_LDOUBLE_PRECISION && H5_LLONG_TO_LDOUBLE_CORRECT */
+#endif /* H5_LLONG_TO_LDOUBLE_CORRECT */
#endif
#endif