[svn-r9783] Purpose: Bug fix

Description: For HP-UX 11.00, the compiler generates 'floating exception'
when converting 'long double' to most of integer types.

Solution: Define a macro for all other systems except HP-UX 11.00.  Hard set
this macro to 'no' in config/hpux11.00 to skip this test for HP-UX 11.00.

Platforms tested:  modi4, kelgia, fuss
This commit is contained in:
Raymond Lu 2005-01-08 15:56:12 -05:00
parent 19efec650d
commit 7faa297ea6
7 changed files with 84 additions and 29 deletions

View File

@ -96,3 +96,9 @@ case "X-$CXX" in
PROFILE_CPPFLAGS=
;;
esac
# Set flag to avoid conversion from 'long double' to integers because of
# HP-UX's compiler problems. For HP-UX 11.00, the compiler has 'floating exception'
# when converting 'long double' to all integers except 'unsigned long long'.
# Other HP-UX systems are unknown yet. (1/8/05 - SLU)
hdf5_cv_sw_ldouble_to_integer_works=${hdf5_cv_sw_ldouble_to_integer_works='no'}

View File

@ -53,7 +53,7 @@ esac
# value conversion are broken by the compilers (as of 4/27/04 - QAK)
hdf5_cv_sw_ulong_to_fp_bottom_bit_works=${hdf5_cv_sw_ulong_to_fp_bottom_bit_works='no'}
# Set flag to avoid conversion between 'long double' and integers because of
# Set flags to avoid conversion between 'long double' and integers because of
# SGI's compiler problems. For both IRIX64 6.5 and IRIX 6.5, the compilers
# have the following problems,
# long double -> signed char : incorrect rounding
@ -67,3 +67,4 @@ hdf5_cv_sw_ulong_to_fp_bottom_bit_works=${hdf5_cv_sw_ulong_to_fp_bottom_bit_work
# unsigned long or long long -> long double : correct value but incorrect bit pattern
# (1/5/05 - SLU)
hdf5_cv_sw_ldouble_to_int_works=${hdf5_cv_sw_ldouble_to_int_works='no'}
hdf5_cv_sw_integer_to_ldouble_works=${hdf5_cv_sw_integer_to_ldouble_works='no'}

View File

@ -146,7 +146,7 @@ fi
# value conversion are broken by the compilers (as of 4/27/04 - QAK)
hdf5_cv_sw_ulong_to_fp_bottom_bit_works=${hdf5_cv_sw_ulong_to_fp_bottom_bit_works='no'}
# Set flag to avoid conversion between 'long double' and integers because of
# Set flags to avoid conversion between 'long double' and integers because of
# SGI's compiler problems. For both IRIX64 6.5 and IRIX 6.5, the compilers
# have the following problems,
# long double -> signed char : incorrect rounding
@ -159,4 +159,5 @@ hdf5_cv_sw_ulong_to_fp_bottom_bit_works=${hdf5_cv_sw_ulong_to_fp_bottom_bit_work
# long or long long -> long double : correct value but incorrect bit pattern
# unsigned long or long long -> long double : correct value but incorrect bit pattern
# (1/5/05 - SLU)
hdf5_cv_sw_ldouble_to_int_works=${hdf5_cv_sw_ldouble_to_int_works='no'}
hdf5_cv_sw_ldouble_to_integer_works=${hdf5_cv_sw_ldouble_to_integer_works='no'}
hdf5_cv_sw_integer_to_ldouble_works=${hdf5_cv_sw_integer_to_ldouble_works='no'}

34
configure vendored
View File

@ -33547,19 +33547,41 @@ else
echo "${ECHO_T}no" >&6
fi
echo "$as_me:$LINENO: checking if accurately converting between long double and integers works" >&5
echo $ECHO_N "checking if accurately converting between long double and integers works... $ECHO_C" >&6
if test "${hdf5_cv_sw_ldouble_to_int_works+set}" = set; then
echo "$as_me:$LINENO: checking if accurately converting from long double to integers works" >&5
echo $ECHO_N "checking if accurately converting from long double to integers works... $ECHO_C" >&6
if test "${hdf5_cv_sw_ldouble_to_integer_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
hdf5_cv_sw_ldouble_to_int_works=yes
hdf5_cv_sw_ldouble_to_integer_works=yes
fi
if test ${hdf5_cv_sw_ldouble_to_int_works} = "yes"; then
if test ${hdf5_cv_sw_ldouble_to_integer_works} = "yes"; then
cat >>confdefs.h <<\_ACEOF
#define SW_LDOUBLE_TO_INT_WORKS 1
#define SW_LDOUBLE_TO_INTEGER_WORKS 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
echo "$as_me:$LINENO: checking if accurately converting from integers to long double works" >&5
echo $ECHO_N "checking if accurately converting from integers to long double works... $ECHO_C" >&6
if test "${hdf5_cv_sw_integer_to_ldouble_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
hdf5_cv_sw_integer_to_ldouble_works=yes
fi
if test ${hdf5_cv_sw_integer_to_ldouble_works} = "yes"; then
cat >>confdefs.h <<\_ACEOF
#define SW_INTEGER_TO_LDOUBLE_WORKS 1
_ACEOF
echo "$as_me:$LINENO: result: yes" >&5

View File

@ -2507,17 +2507,36 @@ else
fi
dnl -----------------------------------------------------------------------
dnl Set flag to indicate that the machine can handle conversion between
dnl long double and integers. (This flag should be set "yes" for all
dnl machines except all SGIs, where some conversions are incorrect and its
dnl cache value is set "no" in its config/irix6.x file.)
dnl Set flag to indicate that the machine can handle conversion from
dnl long double to integers. (This flag should be set "yes" for all
dnl machines except all SGIs and HP-UX 11.00, where some conversions are
dnl incorrect and its cache value is set "no" in its config/irix6.x and
dnl irix5.x and config/hpux11.00 files.)
dnl
AC_MSG_CHECKING([if accurately converting between long double and integers works])
AC_CACHE_VAL([hdf5_cv_sw_ldouble_to_int_works], [hdf5_cv_sw_ldouble_to_int_works=yes])
AC_MSG_CHECKING([if accurately converting from long double to integers works])
AC_CACHE_VAL([hdf5_cv_sw_ldouble_to_integer_works], [hdf5_cv_sw_ldouble_to_integer_works=yes])
if test ${hdf5_cv_sw_ldouble_to_int_works} = "yes"; then
AC_DEFINE([SW_LDOUBLE_TO_INT_WORKS], [1],
[Define if your system can accurately convert between long double and integer values.])
if test ${hdf5_cv_sw_ldouble_to_integer_works} = "yes"; then
AC_DEFINE([SW_LDOUBLE_TO_INTEGER_WORKS], [1],
[Define if your system can accurately convert from long double to integer values.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
dnl -----------------------------------------------------------------------
dnl Set flag to indicate that the machine can handle conversion from
dnl integers to long double. (This flag should be set "yes" for all
dnl machines except all SGIs, where some conversions are
dnl incorrect and its cache value is set "no" in its config/irix6.x and
dnl irix5.x)
dnl
AC_MSG_CHECKING([if accurately converting from integers to long double works])
AC_CACHE_VAL([hdf5_cv_sw_integer_to_ldouble_works], [hdf5_cv_sw_integer_to_ldouble_works=yes])
if test ${hdf5_cv_sw_integer_to_ldouble_works} = "yes"; then
AC_DEFINE([SW_INTEGER_TO_LDOUBLE_WORKS], [1],
[Define if your system can accurately convert from integers to long double values.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])

View File

@ -519,9 +519,13 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define if your system can accurately convert between long double and
integer values. */
#undef SW_LDOUBLE_TO_INT_WORKS
/* Define if your system can accurately convert from integers to long double
values. */
#undef SW_INTEGER_TO_LDOUBLE_WORKS
/* Define if your system can accurately convert from long double to integer
values. */
#undef SW_LDOUBLE_TO_INTEGER_WORKS
/* Define if your system can accurately convert unsigned long long values to
floating-point values. */

View File

@ -6368,7 +6368,7 @@ run_int_float_conv(const char *name)
#endif
if(!strcmp(name, "sw")) {
#if H5_SW_LDOUBLE_TO_INT_WORKS
#if H5_SW_INTEGER_TO_LDOUBLE_WORKS
#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE
nerrors += test_conv_int_float(name, H5T_NATIVE_SCHAR, H5T_NATIVE_LDOUBLE);
nerrors += test_conv_int_float(name, H5T_NATIVE_UCHAR, H5T_NATIVE_LDOUBLE);
@ -6397,7 +6397,7 @@ run_int_float_conv(const char *name)
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
#endif
#endif
#else /*H5_SW_LDOUBLE_TO_INT_WORKS*/
#else /*H5_SW_INTEGER_TO_LDOUBLE_WORKS*/
{
char str[256]; /*string */
@ -6407,7 +6407,7 @@ run_int_float_conv(const char *name)
SKIPPED();
HDputs(" Test skipped due to hardware conversion error.");
}
#endif /*H5_SW_LDOUBLE_TO_INT_WORKS*/
#endif /*H5_SW_INTEGER_TO_LDOUBLE_WORKS*/
}
return nerrors;
@ -6432,7 +6432,7 @@ static int
run_float_int_conv(const char *name)
{
int nerrors = 0;
#ifndef TMP
nerrors += test_conv_int_float(name, H5T_NATIVE_FLOAT, H5T_NATIVE_SCHAR);
nerrors += test_conv_int_float(name, H5T_NATIVE_DOUBLE, H5T_NATIVE_SCHAR);
@ -6493,8 +6493,9 @@ run_float_int_conv(const char *name)
#endif /*H5_FP_TO_ULLONG_RIGHT_MAXIMUM*/
#endif
#endif /*TMP*/
if(!strcmp(name, "sw")) {
#if H5_SW_LDOUBLE_TO_INT_WORKS
#if H5_SW_LDOUBLE_TO_INTEGER_WORKS
#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_SCHAR);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_UCHAR);
@ -6524,7 +6525,7 @@ run_float_int_conv(const char *name)
#endif /*H5_FP_TO_ULLONG_RIGHT_MAXIMUM*/
#endif
#endif
#else /*H5_SW_LDOUBLE_TO_INT_WORKS*/
#else /*H5_SW_LDOUBLE_TO_INTEGER_WORKS*/
{
char str[256]; /*hello string */
@ -6534,7 +6535,7 @@ run_float_int_conv(const char *name)
SKIPPED();
HDputs(" Test skipped due to hardware conversion error.");
}
#endif /*H5_SW_LDOUBLE_TO_INT_WORKS*/
#endif /*H5_SW_LDOUBLE_TO_INTEGER_WORKS*/
}
return nerrors;
@ -6969,7 +6970,7 @@ main(void)
if (ALIGNMENT)
printf("Testing non-aligned conversions (ALIGNMENT=%d)....\n", ALIGNMENT);
#ifndef TMP
/* Do the tests */
nerrors += test_classes();
nerrors += test_copy();
@ -7045,6 +7046,7 @@ main(void)
/* Test software float-integer conversion functions */
nerrors += run_float_int_conv("sw");
#endif /*TMP*/
/* Test software integer-float conversion functions */
nerrors += run_int_float_conv("sw");