mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-02-17 16:10:24 +08:00
[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:
parent
19efec650d
commit
7faa297ea6
@ -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'}
|
||||
|
@ -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'}
|
||||
|
@ -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
34
configure
vendored
@ -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
|
||||
|
37
configure.in
37
configure.in
@ -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])
|
||||
|
@ -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. */
|
||||
|
@ -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");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user