[svn-r9755] Purpose: New feature

Description:  Start to support software conversion between long double and
all integers.

Solution:  No major changes to the algorithm.  Changes to configure is to
exclude SGI for long double to integers test because there're too many problems
in their compiler.

Platforms tested:  h5committest, modi4, fuss, Teragrid, arabica

Misc. update:  RELEASE.txt
This commit is contained in:
Raymond Lu 2005-01-06 13:17:59 -05:00
parent 03edfaa6e9
commit 82f6a72ec9
8 changed files with 372 additions and 193 deletions

View File

@ -48,3 +48,22 @@ case "X-$CC_BASENAME" in
PROFILE_CPPFLAGS=
;;
esac
# Hard set flag to indicate that the 'unsigned long long' to floating-point
# 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
# 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
# long double -> unsigned char : incorrect rounding
# long double -> short : incorrect rounding
# long double -> unsigned short : incorrect rounding
# long double -> long or long long: incorrect value
# long double -> unsigned long or long long : incorrect value
#
# 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'}

View File

@ -146,3 +146,17 @@ 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
# 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
# long double -> unsigned char : incorrect rounding
# long double -> short : incorrect rounding
# long double -> unsigned short : incorrect rounding
# long double -> long or long long: incorrect value
# long double -> unsigned long or long long : incorrect value
#
# 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'}

36
configure vendored
View File

@ -33538,6 +33538,28 @@ 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 $ECHO_N "(cached) $ECHO_C" >&6
else
hdf5_cv_sw_ldouble_to_int_works=yes
fi
if test ${hdf5_cv_sw_ldouble_to_int_works} = "yes"; then
cat >>confdefs.h <<\_ACEOF
#define SW_LDOUBLE_TO_INT_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 unsigned long long to floating-point values works" >&5
echo $ECHO_N "checking if accurately converting unsigned long long to floating-point values works... $ECHO_C" >&6
@ -33748,18 +33770,20 @@ else
{
float f = 9701917572145405952.00f;
double d1 = 9701917572145405952.00L;
double d2 = 2e40L;
long double d2 = 9701917572145405952.00L;
double d3 = 2e40L;
unsigned long long l1 = (unsigned long long)f;
unsigned long long l2 = (unsigned long long)d1;
unsigned long long l3;
unsigned long long l4 = 0x7fffffffffffffffLLU;
unsigned long long l3 = (unsigned long long)d2;
unsigned long long l4;
unsigned long long l5 = 0x7fffffffffffffffLLU;
int ret = 0;
if(l1 <= l4 || l2 <= l4)
if(l1 <= l5 || l2 <= l5 || l3 <= l5)
ret = 1;
l3 = (unsigned long long)d2;
if(l3 <= l4)
l4 = (unsigned long long)d3;
if(l4 <= l5)
ret = 1;
done:

View File

@ -2500,6 +2500,23 @@ else
AC_MSG_RESULT([no])
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
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])
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.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
dnl ----------------------------------------------------------------------
dnl Set the flag to indicate that the machine can accurately convert
dnl 'unsigned (long) long' values to 'float' and 'double' values.
@ -2623,7 +2640,7 @@ fi
dnl ----------------------------------------------------------------------
dnl Set the flag to indicate that the machine can accurately convert
dnl 'float' or 'double' to 'unsigned (long) long' values.
dnl 'float', 'double' or 'long double' to 'unsigned (long) long' values.
dnl (This flag should be set for all machines, except for HP-UX machines
dnl where the maximal number for unsigned long long is 0x7fffffffffffffff
dnl during conversion.
@ -2636,18 +2653,20 @@ AC_CACHE_VAL([hdf5_cv_fp_to_ullong_right_maximum],
{
float f = 9701917572145405952.00f;
double d1 = 9701917572145405952.00L;
double d2 = 2e40L;
long double d2 = 9701917572145405952.00L;
double d3 = 2e40L;
unsigned long long l1 = (unsigned long long)f;
unsigned long long l2 = (unsigned long long)d1;
unsigned long long l3;
unsigned long long l4 = 0x7fffffffffffffffLLU;
unsigned long long l3 = (unsigned long long)d2;
unsigned long long l4;
unsigned long long l5 = 0x7fffffffffffffffLLU;
int ret = 0;
if(l1 <= l4 || l2 <= l4)
if(l1 <= l5 || l2 <= l5 || l3 <= l5)
ret = 1;
l3 = (unsigned long long)d2;
if(l3 <= l4)
l4 = (unsigned long long)d3;
if(l4 <= l5)
ret = 1;
done:

View File

@ -36,6 +36,8 @@ New Features
Configuration:
--------------
- Started to support software conversion between long double and
integers. Hardware conversion will come very soon. SLU - 2005/1/6
- Intel v8.0 compiler would infinite loop when compiling some test
code with -O3 option. Changed enable-production default compiler
option to -O2. AKC - 2004/12/06

View File

@ -8914,10 +8914,7 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
* the source exponent bias.
*/
if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
bitno = H5T_bit_find(s, src.u.f.mpos, src.u.f.msize,
H5T_BIT_MSB, TRUE);
assert(bitno>=0);
expo -= (src.u.f.ebias-1) + (src.u.f.msize-bitno);
expo -= (src.u.f.ebias-1);
} else if (H5T_NORM_IMPLIED==src.u.f.norm) {
expo -= src.u.f.ebias;
} else {
@ -8948,7 +8945,7 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
* Shift mantissa part by exponent minus mantissa size(right shift),
* or by mantissa size minus exponent(left shift). Example: Sequence
* 10...010111, expo=20, expo-msize=-3. Right-shift the sequence, we get
* 00010...01. The last three ones were dropped.
* 00010...10. The last three bits were dropped.
*/
H5T_bit_shift(int_buf, (ssize_t)(expo-src.u.f.msize), 0, buf_size*8);
@ -8959,17 +8956,10 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
if (expo < src.u.f.msize && cb_struct.func)
truncated = TRUE;
/* Convert to integer representation if negative.
* equivalent to ~(value - 1).
*/
if(sign) {
H5T_bit_dec(int_buf, 0, 8*buf_size);
H5T_bit_neg(int_buf, 0, 8*buf_size);
}
/*
* What is the bit position for the most significant bit(MSB) of S
* which is set?
* which is set? This is checked before converted to negative
* integer.
*/
sfirst = H5T_bit_find(int_buf, 0, 8*buf_size, H5T_BIT_MSB, TRUE);
first = (size_t)sfirst;
@ -9041,9 +9031,13 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
/*copy source value into it if case is ignored by user handler*/
H5T_bit_copy (d, dst.offset, int_buf, 0, first+1);
if(except_ret == H5T_CONV_UNHANDLED) { /*If this case ignored by user handler*/
/*Convert to integer representation. Equivalent to ~(value - 1).*/
H5T_bit_dec(int_buf, 0, 8*buf_size);
H5T_bit_neg(int_buf, 0, 8*buf_size);
/*copy source value into destiny*/
H5T_bit_copy (d, dst.offset, int_buf, 0, dst.prec-1);
H5T_bit_set (d, (dst.offset + dst.prec-1), 1, TRUE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
@ -9055,7 +9049,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
* the sign bit because 0x80...00 is the biggest negative value.
*/
if(cb_struct.func) { /*If user's exception handler is present, use it*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/
/*reverse order first*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
@ -9072,7 +9067,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
if (first >= dst.prec-1) {
/*overflow*/
if(cb_struct.func) { /*If user's exception handler is present, use it*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/
/*reverse order first*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
@ -9086,7 +9082,8 @@ H5T_conv_f_i (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
reverse = FALSE;
} else if(first < dst.prec-1) {
if(truncated && cb_struct.func) { /*If user's exception handler is present, use it*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); /*reverse order first*/
/*reverse order first*/
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
@ -9396,11 +9393,10 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
/*
* Calculate the true destination exponent by adjusting according to
* the destination exponent bias.
* the destination exponent bias. Implied and non-implied normalization
* should be the same.
*/
if (H5T_NORM_NONE==src.u.f.norm) {
expo = first + 1 + dst.u.f.ebias;
} else if (H5T_NORM_IMPLIED==src.u.f.norm) {
if (H5T_NORM_NONE==dst.u.f.norm || H5T_NORM_IMPLIED==dst.u.f.norm) {
expo = first + dst.u.f.ebias;
} else {
assert("normalization method not implemented yet" && 0);
@ -9408,10 +9404,10 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
}
/* Handle mantissa part here */
if (H5T_NORM_IMPLIED==src.u.f.norm) {
if (H5T_NORM_IMPLIED==dst.u.f.norm) {
/* Imply first bit */
H5T_bit_set(int_buf, first, 1, 0);
} else if (H5T_NORM_NONE==src.u.f.norm) {
} else if (H5T_NORM_NONE==dst.u.f.norm) {
first++;
}
@ -9461,13 +9457,13 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
* last f, we get 0x100...000. Treat this special case here.
*/
if(H5T_bit_get_d(int_buf, dst.u.f.msize, 1)) {
if (H5T_NORM_IMPLIED==src.u.f.norm) {
if (H5T_NORM_IMPLIED==dst.u.f.norm) {
/* The bit at this 1's position was impled already, so this
* number should be 0x200...000. We need to increment the
* exponent in this case.
*/
expo++;
} else if (H5T_NORM_NONE==src.u.f.norm) {
} else if (H5T_NORM_NONE==dst.u.f.norm) {
/* Right shift 1 bit to let the carried 1 fit in the mantissa,
* and increment exponent by 1.
*/
@ -9479,7 +9475,7 @@ H5T_conv_i_f (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
} else {
/* The bit sequence can fit mantissa part. Left shift to fit in from high-order of
* bit position. */
H5T_bit_shift(int_buf, (ssize_t)(dst.u.f.msize-first), 0, buf_size*8);
H5T_bit_shift(int_buf, (ssize_t)(dst.u.f.msize-first), 0, dst.u.f.msize);
}

View File

@ -516,6 +516,10 @@
/* 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 unsigned long long values to
floating-point values. */
#undef SW_ULONG_TO_FP_BOTTOM_BIT_WORKS

View File

@ -117,8 +117,7 @@ static int num_opaque_conversions_g = 0;
#define aligned_free(M) HDfree((char*)(M)-ALIGNMENT)
void some_dummy_func(float x);
static hbool_t overflows(unsigned char *origin_bits, dtype_t src_dtype,
size_t src_size_bytes, size_t dst_num_bits);
static hbool_t overflows(unsigned char *origin_bits, hid_t src_id, size_t dst_num_bits);
static int my_isnan(dtype_t type, void *val);
static int opaque_check(int tag_it);
static herr_t convert_opaque(hid_t UNUSED st, hid_t UNUSED dt,
@ -3595,8 +3594,8 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
unsigned hw_uint;
long hw_long;
unsigned long hw_ulong;
long_long hw_llong;
unsigned long_long hw_ullong;
long long hw_llong;
unsigned long long hw_ullong;
@ -3691,7 +3690,7 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
dst_sign = H5Tget_sign(dst);
buf = aligned_malloc(nelmts*MAX(src_size, dst_size));
saved = aligned_malloc(nelmts*MAX(src_size, dst_size));
aligned = HDmalloc(sizeof(long_long));
aligned = HDmalloc(sizeof(long long));
#ifdef SHOW_OVERFLOWS
noverflows_g = 0;
#endif
@ -3759,12 +3758,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_char = (char)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_char = (char)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_char = (char)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_char = (char)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_char = (char)(*((unsigned long long*)aligned));
break;
default:
break;
@ -3805,12 +3804,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_uchar = (unsigned char)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_uchar = (unsigned char)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_uchar = (unsigned char)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_uchar = (unsigned char)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_uchar = (unsigned char)(*((unsigned long long*)aligned));
break;
default:
break;
@ -3851,12 +3850,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_short = (short)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_short = (short)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_short = (short)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_short = (short)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_short = (short)(*((unsigned long long*)aligned));
break;
default:
@ -3898,12 +3897,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_ushort = (unsigned short)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_ushort = (unsigned short)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_ushort = (unsigned short)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_ushort = (unsigned short)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_ushort = (unsigned short)(*((unsigned long long*)aligned));
break;
default:
break;
@ -3944,12 +3943,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_int = (int)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_int = (int)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_int = (int)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_int = (int)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_int = (int)(*((unsigned long long*)aligned));
break;
default:
break;
@ -3990,12 +3989,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_uint = (unsigned int)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_uint = (unsigned int)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_uint = (unsigned int)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_uint = (unsigned int)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_uint = (unsigned int)(*((unsigned long long*)aligned));
break;
default:
break;
@ -4036,12 +4035,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_long = (long int)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_long = (long int)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_long = (long int)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_long = (long int)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_long = (long int)(*((unsigned long long*)aligned));
break;
default:
break;
@ -4082,12 +4081,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
hw_ulong = (unsigned long)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_ulong = (unsigned long)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_ulong = (unsigned long)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_ulong = (unsigned long)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_ulong = (unsigned long)(*((unsigned long long*)aligned));
break;
default:
break;
@ -4097,43 +4096,43 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
switch (src_type) {
case INT_SCHAR:
HDmemcpy(aligned, saved+j*sizeof(char), sizeof(char));
hw_llong = (long_long)(*((char*)aligned));
hw_llong = (long long)(*((char*)aligned));
break;
case INT_UCHAR:
HDmemcpy(aligned, saved+j*sizeof(unsigned char), sizeof(unsigned char));
hw_llong = (long_long)(*((unsigned char*)aligned));
hw_llong = (long long)(*((unsigned char*)aligned));
break;
case INT_SHORT:
HDmemcpy(aligned, saved+j*sizeof(short), sizeof(short));
hw_llong = (long_long)(*((short*)aligned));
hw_llong = (long long)(*((short*)aligned));
break;
case INT_USHORT:
HDmemcpy(aligned, saved+j*sizeof(unsigned short), sizeof(unsigned short));
hw_llong = (long_long)(*((unsigned short*)aligned));
hw_llong = (long long)(*((unsigned short*)aligned));
break;
case INT_INT:
HDmemcpy(aligned, saved+j*sizeof(int), sizeof(int));
hw_llong = (long_long)(*((int*)aligned));
hw_llong = (long long)(*((int*)aligned));
break;
case INT_UINT:
HDmemcpy(aligned, saved+j*sizeof(unsigned), sizeof(unsigned));
hw_llong = (long_long)(*((unsigned*)aligned));
hw_llong = (long long)(*((unsigned*)aligned));
break;
case INT_LONG:
HDmemcpy(aligned, saved+j*sizeof(long), sizeof(long));
hw_llong = (long_long)(*((long*)aligned));
hw_llong = (long long)(*((long*)aligned));
break;
case INT_ULONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long), sizeof(unsigned long));
hw_llong = (long_long)(*((unsigned long*)aligned));
hw_llong = (long long)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_llong = (long_long)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_llong = (long long)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_llong = (long_long)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_llong = (long long)(*((unsigned long long*)aligned));
break;
default:
break;
@ -4143,43 +4142,43 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
switch (src_type) {
case INT_SCHAR:
HDmemcpy(aligned, saved+j*sizeof(char), sizeof(char));
hw_ullong = (unsigned long_long)(*((char*)aligned));
hw_ullong = (unsigned long long)(*((char*)aligned));
break;
case INT_UCHAR:
HDmemcpy(aligned, saved+j*sizeof(unsigned char), sizeof(unsigned char));
hw_ullong = (unsigned long_long)(*((unsigned char*)aligned));
hw_ullong = (unsigned long long)(*((unsigned char*)aligned));
break;
case INT_SHORT:
HDmemcpy(aligned, saved+j*sizeof(short), sizeof(short));
hw_ullong = (unsigned long_long)(*((short*)aligned));
hw_ullong = (unsigned long long)(*((short*)aligned));
break;
case INT_USHORT:
HDmemcpy(aligned, saved+j*sizeof(unsigned short), sizeof(unsigned short));
hw_ullong = (unsigned long_long)(*((unsigned short*)aligned));
hw_ullong = (unsigned long long)(*((unsigned short*)aligned));
break;
case INT_INT:
HDmemcpy(aligned, saved+j*sizeof(int), sizeof(int));
hw_ullong = (unsigned long_long)(*((int*)aligned));
hw_ullong = (unsigned long long)(*((int*)aligned));
break;
case INT_UINT:
HDmemcpy(aligned, saved+j*sizeof(unsigned), sizeof(unsigned));
hw_ullong = (unsigned long_long)(*((unsigned*)aligned));
hw_ullong = (unsigned long long)(*((unsigned*)aligned));
break;
case INT_LONG:
HDmemcpy(aligned, saved+j*sizeof(long), sizeof(long));
hw_ullong = (unsigned long_long)(*((long*)aligned));
hw_ullong = (unsigned long long)(*((long*)aligned));
break;
case INT_ULONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long), sizeof(unsigned long));
hw_ullong = (unsigned long_long)(*((unsigned long*)aligned));
hw_ullong = (unsigned long long)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_ullong = (unsigned long_long)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_ullong = (unsigned long long)(*((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_ullong = (unsigned long_long)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_ullong = (unsigned long long)(*((unsigned long long*)aligned));
break;
default:
break;
@ -4348,12 +4347,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)aligned));
break;
default:
break;
@ -4397,12 +4396,12 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, buf+j*sizeof(long_long), sizeof(long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)aligned));
HDmemcpy(aligned, buf+j*sizeof(long long), sizeof(long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, buf+j*sizeof(long_long), sizeof(unsigned long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)aligned));
HDmemcpy(aligned, buf+j*sizeof(long long), sizeof(unsigned long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)aligned));
break;
default:
break;
@ -4438,10 +4437,10 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)hw));
break;
case INT_LLONG:
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)hw));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)hw));
break;
case INT_ULLONG:
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)hw));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)hw));
break;
default:
break;
@ -4587,7 +4586,7 @@ my_isnan(dtype_t type, void *val)
} else if (FLT_LDOUBLE==type) {
long double x;
HDmemcpy(&x, val, sizeof(long double));
sprintf(s, "%Lg", x);
sprintf(s, "%LLg", x);
#endif
} else {
return 0;
@ -5136,7 +5135,7 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
void *user_data; /*returned pointer to user data passed in to the callback*/
hbool_t except_set = FALSE; /*whether user's exception handling is set*/
const size_t ntests=NTESTS; /*number of tests */
const size_t nelmts=NTESTELEM; /*num values per test */
size_t nelmts; /*num values per test */
const size_t max_fails=40; /*max number of failures*/
size_t fails_all_tests=0; /*number of failures */
size_t fails_this_test; /*fails for this test */
@ -5156,19 +5155,19 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
size_t src_nbits; /*source length in bits */
size_t dst_nbits; /*dst length in bits */
void *aligned=NULL; /*aligned temp buffer */
float hw_float;
double hw_double;
long double hw_ldouble;
signed char hw_schar;
unsigned char hw_uchar;
short hw_short;
unsigned short hw_ushort;
int hw_int;
unsigned hw_uint;
long hw_long;
unsigned long hw_ulong;
long_long hw_llong;
unsigned long_long hw_ullong;
float hw_float=0;
double hw_double=0;
long double hw_ldouble=0;
signed char hw_schar=0;
unsigned char hw_uchar=0;
short hw_short=0;
unsigned short hw_ushort=0;
int hw_int=0;
unsigned hw_uint=0;
long hw_long=0;
unsigned long hw_ulong=0;
long long hw_llong=0;
unsigned long long hw_ullong=0;
/* What is the name of the source type */
if (H5Tequal(src, H5T_NATIVE_SCHAR)) {
@ -5299,7 +5298,15 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
HDputs(" 2. Not a float-integer conversion.");
goto error;
}
/* Reduce the number of elements if the source is "long double"
* because it takes too long.
*/
if(src_type == FLT_LDOUBLE)
nelmts = NTESTELEM / 10;
else
nelmts = NTESTELEM;
/* Allocate buffers */
endian = H5Tget_order(H5T_NATIVE_INT);
src_size = H5Tget_size(src);
@ -5308,7 +5315,7 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
dst_nbits = H5Tget_precision(dst); /* not 8*dst_size, esp on J90 - QAK */
buf = aligned_malloc(nelmts*MAX(src_size, dst_size));
saved = aligned_malloc(nelmts*MAX(src_size, dst_size));
aligned = HDmalloc(sizeof(long_long));
aligned = HDmalloc(MAX(sizeof(long double), sizeof(long long)));
#ifdef SHOW_OVERFLOWS
noverflows_g = 0;
#endif
@ -5405,13 +5412,13 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
hw_float = (float)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_float = (float)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_float = (float)(*((long long*)aligned));
break;
#ifdef H5_ULLONG_TO_FP_CAST_WORKS
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_float = (float)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_float = (float)(*((unsigned long long*)aligned));
break;
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
default:
@ -5453,13 +5460,13 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
hw_double = (double)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_double = (double)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_double = (double)(*((long long*)aligned));
break;
#ifdef H5_ULLONG_TO_FP_CAST_WORKS
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_double = (double)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_double = (double)(*((unsigned long long*)aligned));
break;
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
default:
@ -5501,13 +5508,13 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
hw_ldouble = (long double)(*((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
hw_ldouble = (long double)(*((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
hw_ldouble = (long double)(*((long long*)aligned));
break;
#ifdef H5_ULLONG_TO_FP_CAST_WORKS
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
hw_ldouble = (long double)(*((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
hw_ldouble = (long double)(*((unsigned long long*)aligned));
break;
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
default:
@ -5662,15 +5669,15 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
switch (src_type) {
case FLT_FLOAT:
HDmemcpy(aligned, saved+j*sizeof(float), sizeof(float));
hw_llong = (long_long)(*((float*)aligned));
hw_llong = (long long)(*((float*)aligned));
break;
case FLT_DOUBLE:
HDmemcpy(aligned, saved+j*sizeof(double), sizeof(double));
hw_llong = (long_long)(*((double*)aligned));
hw_llong = (long long)(*((double*)aligned));
break;
case FLT_LDOUBLE:
HDmemcpy(aligned, saved+j*sizeof(long double), sizeof(double));
hw_llong = (long_long)(*((long double*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long double), sizeof(long double));
hw_llong = (long long)(*((long double*)aligned));
break;
default:
break;
@ -5680,15 +5687,15 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
switch (src_type) {
case FLT_FLOAT:
HDmemcpy(aligned, saved+j*sizeof(float), sizeof(float));
hw_ullong = (unsigned long_long)(*((float*)aligned));
hw_ullong = (unsigned long long)(*((float*)aligned));
break;
case FLT_DOUBLE:
HDmemcpy(aligned, saved+j*sizeof(double), sizeof(double));
hw_ullong = (unsigned long_long)(*((double*)aligned));
hw_ullong = (unsigned long long)(*((double*)aligned));
break;
case FLT_LDOUBLE:
HDmemcpy(aligned, saved+j*sizeof(long double), sizeof(double));
hw_ullong = (unsigned long_long)(*((long double*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long double), sizeof(long double));
hw_ullong = (unsigned long long)(*((long double*)aligned));
break;
default:
break;
@ -5730,7 +5737,7 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
&& (INT_SCHAR==dst_type || INT_SHORT==dst_type || INT_INT==dst_type
|| INT_LONG==dst_type || INT_LLONG==dst_type)) {
if(0==H5T_bit_get_d(src_bits, src_nbits-1, 1) &&
overflows(src_bits, src_type, src_size, dst_nbits-1)) {
overflows(src_bits, src, dst_nbits-1)) {
/*
* Source is positive and the magnitude is too large for
* the destination. The destination should be set to the
@ -5746,7 +5753,7 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
continue; /*no error*/
}
} else if (1==H5T_bit_get_d(src_bits, src_nbits-1, 1) &&
overflows(src_bits, src_type, src_size, dst_nbits-1)) {
overflows(src_bits, src, dst_nbits-1)) {
/*
* Source is negative but the magnitude is too large for
* the destination. The destination should be set to the
@ -5779,7 +5786,7 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
if (dst_bits[0] == fill_value)
continue; /*no error*/
}
} else if (overflows(src_bits, src_type, src_size, dst_nbits)) {
} else if (overflows(src_bits, src, dst_nbits)) {
/*
* The source is a value with a magnitude too large for
* the destination. The destination should be the
@ -5815,10 +5822,10 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
if((tmp_s+1)==tmp_h || (tmp_s-1)==tmp_h)
continue; /*no error*/
} /* end if */
else if (dst_size==sizeof(unsigned long_long)) {
unsigned long_long tmp_s, tmp_h;
HDmemcpy(&tmp_s,&buf[j*dst_size],sizeof(unsigned long_long));
HDmemcpy(&tmp_h,&hw[0],sizeof(unsigned long_long));
else if (dst_size==sizeof(unsigned long long)) {
unsigned long long tmp_s, tmp_h;
HDmemcpy(&tmp_s,&buf[j*dst_size],sizeof(unsigned long long));
HDmemcpy(&tmp_h,&hw[0],sizeof(unsigned long long));
if((tmp_s+1)==tmp_h || (tmp_s-1)==tmp_h)
continue; /*no error*/
} /* end if */
@ -5830,9 +5837,9 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
*/
#ifndef H5_FP_TO_ULLONG_BOTTOM_BIT_WORKS
if((src_type==FLT_FLOAT || src_type==FLT_DOUBLE) && dst_type==INT_ULLONG) {
unsigned long_long tmp_s, tmp_h;
HDmemcpy(&tmp_s,&buf[j*dst_size],sizeof(unsigned long_long));
HDmemcpy(&tmp_h,&hw[0],sizeof(unsigned long_long));
unsigned long long tmp_s, tmp_h;
HDmemcpy(&tmp_s,&buf[j*dst_size],sizeof(unsigned long long));
HDmemcpy(&tmp_h,&hw[0],sizeof(unsigned long long));
if((tmp_s+1)==tmp_h)
continue; /*no error*/
}
@ -5881,12 +5888,12 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, saved+j*sizeof(long_long), sizeof(long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(long long), sizeof(long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, saved+j*sizeof(unsigned long_long), sizeof(unsigned long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)aligned));
HDmemcpy(aligned, saved+j*sizeof(unsigned long long), sizeof(unsigned long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)aligned));
break;
case FLT_FLOAT:
HDmemcpy(aligned, saved+j*sizeof(float), sizeof(float));
@ -5942,12 +5949,12 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)aligned));
break;
case INT_LLONG:
HDmemcpy(aligned, buf+j*sizeof(long_long), sizeof(long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)aligned));
HDmemcpy(aligned, buf+j*sizeof(long long), sizeof(long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)aligned));
break;
case INT_ULLONG:
HDmemcpy(aligned, buf+j*sizeof(long_long), sizeof(unsigned long_long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)aligned));
HDmemcpy(aligned, buf+j*sizeof(unsigned long long), sizeof(unsigned long long));
HDfprintf(stdout," %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)aligned));
break;
case FLT_FLOAT:
HDmemcpy(aligned, buf+j*sizeof(float), sizeof(float));
@ -5995,10 +6002,10 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
printf(" %29lu\n", *((unsigned long*)hw));
break;
case INT_LLONG:
printf(" %29"H5_PRINTF_LL_WIDTH"d\n", *((long_long*)hw));
printf(" %29"H5_PRINTF_LL_WIDTH"d\n", *((long long*)hw));
break;
case INT_ULLONG:
printf(" %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long_long*)hw));
printf(" %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)hw));
break;
case FLT_FLOAT:
printf(" %29f\n", *((float*)hw));
@ -6064,27 +6071,33 @@ test_conv_int_float(const char *name, hid_t src, hid_t dst)
*-------------------------------------------------------------------------
*/
static hbool_t
overflows(unsigned char *origin_bits, dtype_t src_dtype, size_t src_size_bytes, size_t dst_num_bits)
overflows(unsigned char *origin_bits, hid_t src_id, size_t dst_num_bits)
{
hbool_t ret_value=FALSE;
hsize_t expt, sig;
size_t frct_digits=0, expt_digits=0, bias=0;
size_t mant_digits=0, expt_digits=0, bias=0;
size_t src_prec=0; /*source type precision in bits*/
H5T_norm_t norm;
ssize_t indx;
unsigned char bits[32];
unsigned char bits[32], mant_bits[32];
HDmemcpy(bits, origin_bits, src_size_bytes);
HDmemset(bits, 0, 32);
HDmemset(mant_bits, 0, 32);
/*
* Sometimes, type size isn't equal to the precision like Linux's "long
* double", where size is 96 bits and precision is 80 bits.
*/
src_prec = H5Tget_precision(src_id);
H5Tget_fields(src_id, NULL, NULL, &expt_digits, NULL, &mant_digits);
bias = H5Tget_ebias(src_id);
norm = H5Tget_norm(src_id);
HDmemcpy(bits, origin_bits, src_prec/8+1);
if(src_dtype==FLT_FLOAT) {
frct_digits = (FLT_MANT_DIG-1);
expt_digits = (sizeof(float)*8)-(frct_digits+1);
} else if(src_dtype==FLT_DOUBLE) {
frct_digits = (DBL_MANT_DIG-1);
expt_digits = (sizeof(double)*8)-(frct_digits+1);
}
bias = (1<<(expt_digits-2)) - 1;
/* get exponent */
expt = H5T_bit_get_d(bits, frct_digits, expt_digits) - bias;
expt = H5T_bit_get_d(bits, mant_digits, expt_digits) - bias;
if(expt>=(dst_num_bits-1)) {
ret_value=TRUE;
@ -6092,18 +6105,19 @@ overflows(unsigned char *origin_bits, dtype_t src_dtype, size_t src_size_bytes,
}
/* get significand */
sig = H5T_bit_get_d(bits, 0, frct_digits);
H5T_bit_copy (mant_bits, 0, bits, 0, mant_digits);
/* restore implicit bit*/
sig |= (hsize_t)1<<frct_digits;
/* restore implicit bit if normalization is implied*/
if(norm == H5T_NORM_IMPLIED) {
H5T_bit_inc(mant_bits, mant_digits, 1);
mant_digits++;
}
/* shift significand */
if(expt>expt_digits)
sig <<= expt - expt_digits;
else
sig >>= expt_digits - expt;
H5T_bit_shift (mant_bits, (expt-expt_digits), 0, 32*8);
indx = H5T_bit_find((uint8_t *)&sig, 0, 8*sizeof(hsize_t), H5T_BIT_MSB, 1);
indx = H5T_bit_find(mant_bits, 0, 32*8, H5T_BIT_MSB, 1);
if((size_t)indx>=dst_num_bits)
ret_value=TRUE;
@ -6347,6 +6361,49 @@ run_int_float_conv(const char *name)
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
#endif
if(!strcmp(name, "sw")) {
#if H5_SW_LDOUBLE_TO_INT_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);
nerrors += test_conv_int_float(name, H5T_NATIVE_SHORT, H5T_NATIVE_LDOUBLE);
nerrors += test_conv_int_float(name, H5T_NATIVE_USHORT, H5T_NATIVE_LDOUBLE);
nerrors += test_conv_int_float(name, H5T_NATIVE_INT, H5T_NATIVE_LDOUBLE);
nerrors += test_conv_int_float(name, H5T_NATIVE_UINT, H5T_NATIVE_LDOUBLE);
#if H5_SIZEOF_LONG!=H5_SIZEOF_INT
nerrors += test_conv_int_float(name, H5T_NATIVE_LONG, H5T_NATIVE_LDOUBLE);
nerrors += test_conv_int_float(name, H5T_NATIVE_ULONG, H5T_NATIVE_LDOUBLE);
#endif
#if H5_SIZEOF_LONG_LONG!=H5_SIZEOF_LONG
nerrors += test_conv_int_float(name, H5T_NATIVE_LLONG, H5T_NATIVE_LDOUBLE);
#ifdef H5_ULLONG_TO_FP_CAST_WORKS
nerrors += test_conv_int_float(name, H5T_NATIVE_ULLONG, H5T_NATIVE_LDOUBLE);
#else /* H5_ULLONG_TO_FP_CAST_WORKS */
{
char str[256]; /*hello string */
sprintf(str, "Testing random %s %s -> %s conversions",
name, "unsigned long long", "long double");
printf("%-70s", str);
SKIPPED();
HDputs(" Test skipped due to compiler not handling conversion.");
}
#endif /* H5_ULLONG_TO_FP_CAST_WORKS */
#endif
#endif
#else /*H5_SW_LDOUBLE_TO_INT_WORKS*/
{
char str[256]; /*string */
sprintf(str, "Testing random %s %s -> %s conversions",
name, "all integers", "long double");
printf("%-70s", str);
SKIPPED();
HDputs(" Test skipped due to hardware conversion error.");
}
#endif /*H5_SW_LDOUBLE_TO_INT_WORKS*/
}
return nerrors;
}
@ -6420,7 +6477,51 @@ run_float_int_conv(const char *name)
}
#endif /*H5_FP_TO_ULLONG_RIGHT_MAXIMUM*/
#endif
if(!strcmp(name, "sw")) {
#if H5_SW_LDOUBLE_TO_INT_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);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_SHORT);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_USHORT);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_INT);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_UINT);
#if H5_SIZEOF_LONG!=H5_SIZEOF_INT
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_LONG);
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_ULONG);
#endif
#if H5_SIZEOF_LONG_LONG!=H5_SIZEOF_LONG
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_LLONG);
#ifdef H5_FP_TO_ULLONG_RIGHT_MAXIMUM
nerrors += test_conv_int_float(name, H5T_NATIVE_LDOUBLE, H5T_NATIVE_ULLONG);
#else /*H5_FP_TO_ULLONG_RIGHT_MAXIMUM*/
{
char str[256]; /*string */
sprintf(str, "Testing random %s %s -> %s conversions",
name, "long double", "unsigned long long");
printf("%-70s", str);
SKIPPED();
HDputs(" Test skipped due to hardware conversion error.");
}
#endif /*H5_FP_TO_ULLONG_RIGHT_MAXIMUM*/
#endif
#endif
#else /*H5_SW_LDOUBLE_TO_INT_WORKS*/
{
char str[256]; /*hello string */
sprintf(str, "Testing random %s %s -> %s conversions",
name, "long double", "all integers");
printf("%-70s", str);
SKIPPED();
HDputs(" Test skipped due to hardware conversion error.");
}
#endif /*H5_SW_LDOUBLE_TO_INT_WORKS*/
}
return nerrors;
}