summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-09-15 20:20:39 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-09-15 20:20:39 (GMT)
commitb047710a9577cb381308f30b67e81f2974029333 (patch)
tree5888c6f563bc2946d91a590ac5f7b76f5a66812b
parent24725d64aa4e944c4be4e0dcefa0880cb8ac627c (diff)
downloadhdf5-b047710a9577cb381308f30b67e81f2974029333.zip
hdf5-b047710a9577cb381308f30b67e81f2974029333.tar.gz
hdf5-b047710a9577cb381308f30b67e81f2974029333.tar.bz2
[svn-r12669] Description:
Use a slightly less efficient method of computing the log2() on SGI IRIX64, in order to avoid a compiler bug when optimizations are turned on. Tested on: SGI IRIX64 6.5 (atlantia)
-rw-r--r--config/irix6.x6
-rwxr-xr-xconfigure22
-rw-r--r--configure.in17
-rw-r--r--src/H5Vprivate.h29
-rw-r--r--src/H5config.h.in3
5 files changed, 67 insertions, 10 deletions
diff --git a/config/irix6.x b/config/irix6.x
index 89cd1a4..5aeed35 100644
--- a/config/irix6.x
+++ b/config/irix6.x
@@ -189,3 +189,9 @@ if [ -z "$hdf5_mpi_complex_derived_datatype_works" -a $CC_BASENAME = cc ]; then
# hdf5_mpi_special_collective_io_works='no'
fi
fi
+
+# Set flag to generate alternate code for H5V_log2_gen, to avoid
+# problems with the MIPSpro compiler 7.30 and IRIX64 6.5 (ie. other
+# combinations might work, but haven't been tested)
+# (9/15/06 - QAK)
+hdf5_cv_bad_log2_code_generated=${hdf5_cv_bad_log2_code_generated='yes'}
diff --git a/configure b/configure
index bbfe704..1bff238 100755
--- a/configure
+++ b/configure
@@ -51915,6 +51915,28 @@ else
echo "${ECHO_T}no" >&6
fi
+echo "$as_me:$LINENO: checking if bad code for log2 routine is generated" >&5
+echo $ECHO_N "checking if bad code for log2 routine is generated... $ECHO_C" >&6
+if test "${hdf5_cv_bad_log2_code_generated+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ hdf5_cv_bad_log2_code_generated=no
+fi
+
+
+if test ${hdf5_cv_bad_log2_code_generated} = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define BAD_LOG2_CODE_GENERATED 1
+_ACEOF
+
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
H5_VERSION="`cut -d' ' -f3 $srcdir/README.txt | head -1`"
diff --git a/configure.in b/configure.in
index edb848c..ef31a23 100644
--- a/configure.in
+++ b/configure.in
@@ -3244,6 +3244,23 @@ else
fi
dnl ----------------------------------------------------------------------
+dnl Set the flag to indicate that the machine generates bad code
+dnl for the H5V_log2_gen() routine in src/H5Vprivate.h
+dnl (This flag should be set to no for all machines, except for SGI IRIX64,
+dnl where the cache value is set to yes in it's config file)
+dnl
+AC_MSG_CHECKING([if bad code for log2 routine is generated])
+AC_CACHE_VAL([hdf5_cv_bad_log2_code_generated], [hdf5_cv_bad_log2_code_generated=no])
+
+if test ${hdf5_cv_bad_log2_code_generated} = "yes"; then
+ AC_DEFINE([BAD_LOG2_CODE_GENERATED], [1],
+ [Define if your system generates wrong code for log2 routine.])
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+fi
+
+dnl ----------------------------------------------------------------------
dnl Set some variables for general configuration information to be saved
dnl and installed with the libraries.
dnl
diff --git a/src/H5Vprivate.h b/src/H5Vprivate.h
index 5848a57..0554c47 100644
--- a/src/H5Vprivate.h
+++ b/src/H5Vprivate.h
@@ -346,19 +346,28 @@ static const char LogTable256[] =
static H5_inline unsigned UNUSED
H5V_log2_gen(hsize_t n)
{
- unsigned r = 0; /* r will be log2(n) */
+ unsigned r; /* r will be log2(n) */
register unsigned int t, tt, ttt; /* temporaries */
- if((ttt = (unsigned)(n >> 32)))
- if((tt = (unsigned)(n >> 48)))
- r = (t = (unsigned)(n >> 56)) ? 56 + LogTable256[t] : 48 + LogTable256[tt & 0xFF];
+#ifdef H5_BAD_LOG2_CODE_GENERATED
+ if(n > (uint64_t)0x7fffffffffffffff)
+ r = 63;
+ else {
+ n &= (uint64_t)0x7fffffffffffffff;
+#endif /* H5_BAD_LOG2_CODE_GENERATED */
+ if((ttt = (unsigned)(n >> 32)))
+ if((tt = (unsigned)(n >> 48)))
+ r = (t = (unsigned)(n >> 56)) ? 56 + LogTable256[t] : 48 + LogTable256[tt & 0xFF];
+ else
+ r = (t = (unsigned)(n >> 40)) ? 40 + LogTable256[t] : 32 + LogTable256[ttt & 0xFF];
else
- r = (t = (unsigned)(n >> 40)) ? 40 + LogTable256[t] : 32 + LogTable256[ttt & 0xFF];
- else
- if((tt = (unsigned)(n >> 16)))
- r = (t = (unsigned)(n >> 24)) ? 24 + LogTable256[t] : 16 + LogTable256[tt & 0xFF];
- else
- r = (t = (unsigned)(n >> 8)) ? 8 + LogTable256[t] : LogTable256[n];
+ if((tt = (unsigned)(n >> 16)))
+ r = (t = (unsigned)(n >> 24)) ? 24 + LogTable256[t] : 16 + LogTable256[tt & 0xFF];
+ else
+ r = (t = (unsigned)(n >> 8)) ? 8 + LogTable256[t] : LogTable256[n];
+#ifdef H5_BAD_LOG2_CODE_GENERATED
+ } /* end else */
+#endif /* H5_BAD_LOG2_CODE_GENERATED */
return(r);
} /* H5V_log2_gen() */
diff --git a/src/H5config.h.in b/src/H5config.h.in
index 9022204..6addc39 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -1,5 +1,8 @@
/* src/H5config.h.in. Generated from configure.in by autoheader. */
+/* Define if your system generates wrong code for log2 routine. */
+#undef BAD_LOG2_CODE_GENERATED
+
/* Define if your system can handle converting denormalized floating-point
values. */
#undef CONVERT_DENORMAL_FLOAT