diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/dt_arith.c | 267 |
1 files changed, 211 insertions, 56 deletions
diff --git a/test/dt_arith.c b/test/dt_arith.c index 86aca82..9583b47 100644 --- a/test/dt_arith.c +++ b/test/dt_arith.c @@ -61,7 +61,7 @@ const char *FILENAME[] = { * endian. If local variable `endian' is H5T_ORDER_BE then the result will * be I, otherwise the result will be Z-(I+1). */ -#define ENDIAN(Z,I) (H5T_ORDER_BE==endian?(I):(Z)-((I)+1)) +#define ENDIAN(Z,I,E) (H5T_ORDER_BE==E?(I):(Z)-((I)+1)) typedef enum dtype_t { INT_SCHAR, INT_UCHAR, INT_SHORT, INT_USHORT, INT_INT, INT_UINT, @@ -86,6 +86,11 @@ static int skip_overflow_tests_g = 0; #define HANDLE_SIGFPE #endif +/* OpenVMS doesn't have this feature. Make sure to disable it*/ +#ifdef VMS +#undef HANDLE_SIGFPE +#endif + /* * Decide what values of floating-point number we want to test. They are * 1 - normalized; 2 - denormalized; 3 - special. @@ -161,8 +166,8 @@ static int without_hardware_g = 0; */ #define CHANGE_ORDER(EBUF, EORDER, ESIZE) \ { \ + unsigned int m; \ if (H5T_ORDER_BE==EORDER) { \ - unsigned int m; \ unsigned char mediator; \ size_t half_size = ESIZE/2; \ for (m=0; m<half_size; m++) { \ @@ -170,6 +175,18 @@ static int without_hardware_g = 0; EBUF[ESIZE-(m+1)] = EBUF[m]; \ EBUF[m] = mediator; \ } \ + } else if (H5T_ORDER_VAX==EORDER) { \ + unsigned char mediator1, mediator2; \ + for (m = 0; m < ESIZE; m += 4) { \ + mediator1 = EBUF[m]; \ + mediator2 = EBUF[m+1]; \ + \ + EBUF[m] = EBUF[(ESIZE-2)-m]; \ + EBUF[m+1] = EBUF[(ESIZE-1)-m]; \ + \ + EBUF[(ESIZE-2)-m] = mediator1; \ + EBUF[(ESIZE-1)-m] = mediator2; \ + } \ } \ } @@ -372,7 +389,7 @@ static int without_hardware_g = 0; void some_dummy_func(float x); 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 my_isinf(int endian, unsigned char *val, size_t size, +static int my_isinf(dtype_t type, int endian, unsigned char *val, size_t size, size_t mpos, size_t msize, size_t epos, size_t esize); /*------------------------------------------------------------------------- @@ -763,14 +780,14 @@ static int test_particular_fp_integer(void) printf(" test double to signed char:\n"); printf(" src = "); for (j=0; j<src_size1; j++) - printf(" %02x", saved_buf1[ENDIAN(src_size1, j)]); + printf(" %02x", saved_buf1[ENDIAN(src_size1, j, endian)]); HDmemcpy(&x, saved_buf1, src_size1); printf(" %29.20e\n", x); printf(" dst = "); for (j=0; j<dst_size1; j++) - printf(" %02x", buf1[ENDIAN(dst_size1, j)]); + printf(" %02x", buf1[ENDIAN(dst_size1, j, endian)]); HDmemcpy(&y, buf1, dst_size1); printf(" %29d\n", y); @@ -807,14 +824,14 @@ static int test_particular_fp_integer(void) printf(" test float to int:\n"); printf(" src = "); for (j=0; j<src_size2; j++) - printf(" %02x", saved_buf2[ENDIAN(src_size2, j)]); + printf(" %02x", saved_buf2[ENDIAN(src_size2, j, endian)]); HDmemcpy(&x, saved_buf2, src_size2); printf(" %29.20e\n", x); printf(" dst = "); for (j=0; j<dst_size2; j++) - printf(" %02x", buf2[ENDIAN(dst_size2, j)]); + printf(" %02x", buf2[ENDIAN(dst_size2, j, endian)]); HDmemcpy(&y, buf2, dst_size2); printf(" %29d\n", y); @@ -1067,14 +1084,14 @@ test_derived_flt(void) printf(" src = "); for (j=0; j<src_size; j++) - printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j, endian)]); HDmemcpy(aligned, saved_buf+i*sizeof(int), sizeof(int)); printf(" %29d\n", *aligned); printf(" dst = "); for (j=0; j<src_size; j++) - printf(" %02x", buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", buf[i*src_size+ENDIAN(src_size, j, endian)]); HDmemcpy(aligned, buf+i*sizeof(int), sizeof(int)); printf(" %29d\n", *aligned); @@ -1238,12 +1255,12 @@ test_derived_flt(void) printf(" src = "); for (j=0; j<src_size; j++) - printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j, endian)]); printf("\n"); printf(" dst = "); for (j=0; j<src_size; j++) - printf(" %02x", buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", buf[i*src_size+ENDIAN(src_size, j, endian)]); printf("\n"); if (fails_this_test>=max_fails) { @@ -1549,12 +1566,12 @@ test_derived_integer(void) printf(" src = "); for (j=0; j<src_size; j++) - printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", saved_buf[i*src_size+ENDIAN(src_size, j, endian)]); printf("\n"); printf(" dst = "); for (j=0; j<src_size; j++) - printf(" %02x", buf[i*src_size+ENDIAN(src_size, j)]); + printf(" %02x", buf[i*src_size+ENDIAN(src_size, j, endian)]); printf("\n"); if (fails_this_test>=max_fails) { @@ -2276,10 +2293,10 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst) * the `bittests' program. */ for (k=0; k<src_size; k++) - src_bits[src_size-(k+1)] = saved[j*src_size+ENDIAN(src_size, k)]; + src_bits[src_size-(k+1)] = saved[j*src_size+ENDIAN(src_size, k, endian)]; for (k=0; k<dst_size; k++) - dst_bits[dst_size-(k+1)] = buf[j*dst_size+ENDIAN(dst_size, k)]; + dst_bits[dst_size-(k+1)] = buf[j*dst_size+ENDIAN(dst_size, k, endian)]; /* * Hardware usually doesn't handle overflows too gracefully. The @@ -2385,7 +2402,7 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst) printf(" src = "); for (k=0; k<src_size; k++) - printf(" %02x", saved[j*src_size+ENDIAN(src_size, k)]); + printf(" %02x", saved[j*src_size+ENDIAN(src_size, k, endian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)dst_size-(ssize_t)src_size)), ""); switch (src_type) { case INT_SCHAR: @@ -2434,7 +2451,7 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst) printf(" dst = "); for (k=0; k<dst_size; k++) - printf(" %02x", buf[j*dst_size+ENDIAN(dst_size, k)]); + printf(" %02x", buf[j*dst_size+ENDIAN(dst_size, k, endian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); switch (dst_type) { case INT_SCHAR: @@ -2483,7 +2500,7 @@ test_conv_int_1(const char *name, hid_t src, hid_t dst) printf(" ans = "); for (k=0; k<dst_size; k++) - printf(" %02x", hw[ENDIAN(dst_size, k)]); + printf(" %02x", hw[ENDIAN(dst_size, k, endian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); switch (dst_type) { case INT_SCHAR: @@ -2615,7 +2632,7 @@ test_conv_int_2(void) static int my_isnan(dtype_t type, void *val) { - int retval; + int retval = 0; char s[256]; if (FLT_FLOAT==type) { @@ -2662,6 +2679,24 @@ my_isnan(dtype_t type, void *val) retval = 1; } +#ifdef VMS + /* For "float" and "double" on OpenVMS/Alpha, NaN is + * actually a valid value of maximal value.*/ + if(!retval) { + if (FLT_FLOAT==type) { + float x; + HDmemcpy(&x, val, sizeof(float)); + retval = (x==FLT_MAX || x==-FLT_MAX); + } else if (FLT_DOUBLE==type) { + double x; + HDmemcpy(&x, val, sizeof(double)); + retval = (x==DBL_MAX || x==-DBL_MAX); + } else { + return 0; + } + } +#endif /*VMS*/ + return retval; } @@ -2681,7 +2716,7 @@ my_isnan(dtype_t type, void *val) *------------------------------------------------------------------------- */ static int -my_isinf(int endian, unsigned char *val, size_t size, +my_isinf(dtype_t type, int endian, unsigned char *val, size_t size, size_t mpos, size_t msize, size_t epos, size_t esize) { unsigned char *bits; @@ -2690,8 +2725,24 @@ my_isinf(int endian, unsigned char *val, size_t size, ssize_t ret1=0, ret2=0; bits = (unsigned char*)calloc(1, size); + +#ifdef VMS + if(H5T_ORDER_VAX==endian) { + for (i = 0; i < size; i += 4) { + bits[i] = val[(size-2)-i]; + bits[i+1] = val[(size-1)-i]; + + bits[(size-2)-i] = val[i]; + bits[(size-1)-i] = val[i+1]; + } + } else { + for (i=0; i<size; i++) + bits[size-(i+1)] = *(val + ENDIAN(size,i,endian)); + } +#else /*VMS*/ for (i=0; i<size; i++) - bits[size-(i+1)] = *(val + ENDIAN(size, i)); + bits[size-(i+1)] = *(val + ENDIAN(size, i, endian)); +#endif /*VMS*/ if((ret1=H5T_bit_find(bits, mpos, msize, H5T_BIT_LSB, 1))<0 && (ret2=H5T_bit_find(bits, epos, esize, H5T_BIT_LSB, 0))<0) @@ -2749,9 +2800,11 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) unsigned char *hw=NULL; /*ptr to hardware-conv'd*/ int underflow; /*underflow occurred */ int overflow; /*overflow occurred */ + int maximal; /*maximal value occurred, for VMS only. */ int uflow=0; /*underflow debug counters*/ size_t j, k; /*counters */ - int endian; /*machine endianess */ + int sendian; /* source type endianess */ + int dendian; /* Destination type endianess */ size_t dst_ebias; /* Destination type's exponent bias */ size_t src_epos; /* Source type's exponent position */ size_t src_esize; /* Source type's exponent size */ @@ -2794,7 +2847,9 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) * The remainder of this function is executed only by the child if * HANDLE_SIGFPE is defined. */ +#ifndef VMS HDsignal(SIGFPE,fpe_handler); +#endif /* What are the names of the source and destination types */ if (H5Tequal(src, H5T_NATIVE_FLOAT)) { @@ -2877,7 +2932,8 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) dst_ebias=H5Tget_ebias(dst); H5Tget_fields(src,NULL,&src_epos,&src_esize,NULL,NULL); H5Tget_fields(dst,NULL,&dst_epos,&dst_esize,&dst_mpos,&dst_msize); - endian = H5Tget_order(H5T_NATIVE_FLOAT); + sendian = H5Tget_order(src); + dendian = H5Tget_order(dst); /* Allocate buffers */ aligned = HDcalloc(1, MAX(sizeof(long double), sizeof(double))); @@ -2891,32 +2947,59 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) switch (run_test) { case TEST_NOOP: case TEST_NORMAL: +#ifdef VMS if(src_type == FLT_FLOAT) { INIT_FP_NORM(float, FLT_MAX, FLT_MIN, FLT_MAX_10_EXP, FLT_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); - + } else if(src_type == FLT_DOUBLE && dst_type == FLT_FLOAT) { + /*Temporary solution for VMS. Cap double values between maximal and minimal + *destination values because VMS return exception when overflows or underflows. + *Same below.*/ + INIT_FP_NORM(double, FLT_MAX, FLT_MIN, FLT_MAX_10_EXP, FLT_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); } else if(src_type == FLT_DOUBLE) { INIT_FP_NORM(double, DBL_MAX, DBL_MIN, DBL_MAX_10_EXP, DBL_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 + } else if(src_type == FLT_LDOUBLE && dst_type == FLT_FLOAT) { + INIT_FP_NORM(long double, FLT_MAX, FLT_MIN, FLT_MAX_10_EXP, FLT_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); + } else if(src_type == FLT_LDOUBLE && dst_type == FLT_DOUBLE) { + INIT_FP_NORM(long double, DBL_MAX, DBL_MIN, DBL_MAX_10_EXP, DBL_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); } else if(src_type == FLT_LDOUBLE) { INIT_FP_NORM(long double, LDBL_MAX, LDBL_MIN, LDBL_MAX_10_EXP, LDBL_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); #endif } else goto error; - +#else /*VMS*/ + if(src_type == FLT_FLOAT) { + INIT_FP_NORM(float, FLT_MAX, FLT_MIN, FLT_MAX_10_EXP, FLT_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); + } else if(src_type == FLT_DOUBLE) { + INIT_FP_NORM(double, DBL_MAX, DBL_MIN, DBL_MAX_10_EXP, DBL_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); +#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 + } else if(src_type == FLT_LDOUBLE) { + INIT_FP_NORM(long double, LDBL_MAX, LDBL_MIN, LDBL_MAX_10_EXP, LDBL_MIN_10_EXP, + src_size, dst_size, buf, saved, nelmts); +#endif + } else + goto error; +#endif /*VMS*/ + break; case TEST_DENORM: if(src_type == FLT_FLOAT) { - INIT_FP_DENORM(float, FLT_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(float, FLT_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); } else if(src_type == FLT_DOUBLE) { - INIT_FP_DENORM(double, DBL_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(double, DBL_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 } else if(src_type == FLT_LDOUBLE) { - INIT_FP_DENORM(long double, LDBL_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(long double, LDBL_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); #endif } else @@ -2926,14 +3009,14 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) case TEST_SPECIAL: if(src_type == FLT_FLOAT) { - INIT_FP_SPECIAL(src_size, src_nbits, endian, FLT_MANT_DIG, dst_size, + INIT_FP_SPECIAL(src_size, src_nbits, sendian, FLT_MANT_DIG, dst_size, buf, saved, nelmts); } else if(src_type == FLT_DOUBLE) { - INIT_FP_SPECIAL(src_size, src_nbits, endian, DBL_MANT_DIG, dst_size, + INIT_FP_SPECIAL(src_size, src_nbits, sendian, DBL_MANT_DIG, dst_size, buf, saved, nelmts); #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 } else if(src_type == FLT_LDOUBLE) { - INIT_FP_SPECIAL(src_size, src_nbits, endian, LDBL_MANT_DIG, dst_size, + INIT_FP_SPECIAL(src_size, src_nbits, sendian, LDBL_MANT_DIG, dst_size, buf, saved, nelmts); #endif } else @@ -2980,6 +3063,9 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) hw = (unsigned char*)&hw_f; underflow = HDfabs(*((double*)aligned)) < FLT_MIN; overflow = HDfabs(*((double*)aligned)) > FLT_MAX; +#ifdef VMS + maximal = HDfabs(*((double*)aligned)) == FLT_MAX; +#endif } else if (FLT_DOUBLE==dst_type) { hw_d = *((double*)aligned); hw = (unsigned char*)&hw_d; @@ -2997,11 +3083,17 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) hw = (unsigned char*)&hw_f; underflow = HDfabsl(*((long double*)aligned)) < FLT_MIN; overflow = HDfabsl(*((long double*)aligned)) > FLT_MAX; +#ifdef VMS + maximal = HDfabs(*((long double*)aligned)) == FLT_MAX; +#endif } else if (FLT_DOUBLE==dst_type) { hw_d = *((long double*)aligned); hw = (unsigned char*)&hw_d; underflow = HDfabsl(*((long double*)aligned)) < DBL_MIN; overflow = HDfabsl(*((long double*)aligned)) > DBL_MAX; +#ifdef VMS + maximal = HDfabs(*((long double*)aligned)) == DBL_MAX; +#endif } else { hw_ld = *((long double*)aligned); hw = (unsigned char*)&hw_ld; @@ -3019,7 +3111,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) * 0s before compare the values. */ #if H5_SIZEOF_LONG_DOUBLE !=0 - if(endian==H5T_ORDER_LE && dst_type==FLT_LDOUBLE) { + if(sendian==H5T_ORDER_LE && dst_type==FLT_LDOUBLE) { unsigned int q; for(q=dst_nbits/8; q<dst_size; q++) { buf[j*dst_size+q] = 0x00; @@ -3035,6 +3127,18 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) if (k==dst_size) continue; /*no error*/ +#ifdef VMS + /* For "float" and "double" on OpenVMS/Alpha, NaN is + * a valid value of maximal value.*/ + if (FLT_FLOAT==src_type && + my_isnan(src_type, saved+j*sizeof(float))) { + continue; + } else if (FLT_DOUBLE==src_type && + my_isnan(src_type, saved+j*sizeof(double))) { + continue; + } +#endif /*VMS*/ + /* * Assume same if both results are NaN. There are many NaN bit * patterns and the software doesn't attemt to emulate the @@ -3088,9 +3192,14 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) if (underflow && HDfabsf(x) <= FLT_MIN && HDfabsf(hw_f) <= FLT_MIN) continue; /* all underflowed, no error */ - if (overflow && my_isinf(endian, buf+j*sizeof(float), + if (overflow && my_isinf(dst_type, dendian, buf+j*sizeof(float), dst_size, dst_mpos, dst_msize, dst_epos, dst_esize)) continue; /* all overflowed, no error */ +#ifdef VMS + if (maximal && my_isinf(dst_type, dendian, buf+j*sizeof(float), + dst_size, dst_mpos, dst_msize, dst_epos, dst_esize)) + continue; /* maximal value, no error */ +#endif /*VMS*/ check_mant[0] = HDfrexpf(x, check_expo+0); check_mant[1] = HDfrexpf(hw_f, check_expo+1); } else if (FLT_DOUBLE==dst_type) { @@ -3099,9 +3208,14 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) if (underflow && HDfabs(x) <= DBL_MIN && HDfabs(hw_d) <= DBL_MIN) continue; /* all underflowed, no error */ - if (overflow && my_isinf(endian, buf+j*sizeof(double), + if (overflow && my_isinf(dst_type, dendian, buf+j*sizeof(double), dst_size, dst_mpos, dst_msize, dst_epos, dst_esize)) continue; /* all overflowed, no error */ +#ifdef VMS + if (maximal && my_isinf(dst_type, dendian, buf+j*sizeof(double), + dst_size, dst_mpos, dst_msize, dst_epos, dst_esize)) + continue; /* maximal value, no error */ +#endif /*VMS*/ check_mant[0] = HDfrexp(x, check_expo+0); check_mant[1] = HDfrexp(hw_d, check_expo+1); #if H5_SIZEOF_LONG_DOUBLE !=0 && (H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE) @@ -3142,21 +3256,41 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) uint8_t tmp[32]; assert(src_size<=sizeof(tmp)); - if(endian==H5T_ORDER_LE) + if(sendian==H5T_ORDER_LE) HDmemcpy(tmp,&saved[j*src_size],src_size); - else + else if(sendian==H5T_ORDER_BE) for (k=0; k<src_size; k++) tmp[k]=saved[j*src_size+(src_size-(k+1))]; + else { + for (k = 0; k < src_size; k += 4) { + tmp[k] = saved[j*src_size+(src_size-2)-k]; + tmp[k+1] = saved[j*src_size+(src_size-1)-k]; + + tmp[(src_size-2)-k] = saved[j*src_size+k] + tmp[(src_size-1)-k] = saved[j*src_size+k+1]; + } + } + expo = H5T_bit_get_d(tmp, src_epos, src_esize); if(expo==0) continue; /* Denormalized floating-point value detected */ else { assert(dst_size<=sizeof(tmp)); - if(endian==H5T_ORDER_LE) + if(sendian==H5T_ORDER_LE) HDmemcpy(tmp,&buf[j*dst_size],dst_size); - else + else if(sendian==H5T_ORDER_BE) for (k=0; k<dst_size; k++) tmp[k]=buf[j*dst_size+(dst_size-(k+1))]; + else { + for (k = 0; k < src_size; k += 4) { + tmp[k] = buf[j*dst_size+(dst_size-2)-k]; + tmp[k+1] = buf[j*dst_size+(dst_size-1)-k]; + + tmp[(dst_size-2)-k] = buf[j*dst_size+k] + tmp[(dst_size-1)-k] = buf[j*dst_size+k+1]; + } + } + expo = H5T_bit_get_d(tmp, dst_epos, dst_esize); if(expo==0) continue; /* Denormalized floating-point value detected */ @@ -3181,7 +3315,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) printf(" src ="); for (k=0; k<src_size; k++) - printf(" %02x", saved[j*src_size+ENDIAN(src_size,k)]); + printf(" %02x", saved[j*src_size+ENDIAN(src_size,k,sendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)dst_size-(ssize_t)src_size)), ""); if (FLT_FLOAT==src_type) { float x; @@ -3201,7 +3335,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) printf(" dst ="); for (k=0; k<dst_size; k++) - printf(" %02x", buf[j*dst_size+ENDIAN(dst_size,k)]); + printf(" %02x", buf[j*dst_size+ENDIAN(dst_size,k,dendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); if (FLT_FLOAT==dst_type) { float x; @@ -3221,7 +3355,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst) printf(" ans ="); for (k=0; k<dst_size; k++) - printf(" %02x", hw[ENDIAN(dst_size,k)]); + printf(" %02x", hw[ENDIAN(dst_size,k,dendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); if (FLT_FLOAT==dst_type) printf(" %29.20e\n", hw_f); @@ -3331,7 +3465,8 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) dtype_t dst_type; /*data types */ const char *src_type_name=NULL; /*source type name */ const char *dst_type_name=NULL; /*destination type name */ - int endian; /*machine endianess */ + int sendian; /*source endianess */ + int dendian; /*destination endianess */ size_t src_size, dst_size; /*type sizes */ unsigned char *buf=NULL; /*buffer for conversion */ unsigned char *saved=NULL; /*original values */ @@ -3519,7 +3654,8 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) } /* Some information about datatypes */ - endian = H5Tget_order(H5T_NATIVE_INT); + sendian = H5Tget_order(src); + dendian = H5Tget_order(dst); src_size = H5Tget_size(src); dst_size = H5Tget_size(dst); src_nbits = H5Tget_precision(src); /* not 8*src_size, esp on J90 - QAK */ @@ -3589,20 +3725,20 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) INIT_FP_NORM(float, FLT_MAX, FLT_MIN, FLT_MAX_10_EXP, FLT_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); } else if(run_test==TEST_DENORM) { - INIT_FP_DENORM(float, FLT_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(float, FLT_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); } else { - INIT_FP_SPECIAL(src_size, src_nbits, endian, FLT_MANT_DIG, dst_size, buf, saved, nelmts); + INIT_FP_SPECIAL(src_size, src_nbits, sendian, FLT_MANT_DIG, dst_size, buf, saved, nelmts); } } else if(src_type == FLT_DOUBLE) { if(run_test==TEST_NORMAL) { INIT_FP_NORM(double, DBL_MAX, DBL_MIN, DBL_MAX_10_EXP, DBL_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); } else if(run_test==TEST_DENORM) { - INIT_FP_DENORM(double, DBL_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(double, DBL_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); } else { - INIT_FP_SPECIAL(src_size, src_nbits, endian, DBL_MANT_DIG, dst_size, buf, saved, nelmts); + INIT_FP_SPECIAL(src_size, src_nbits, sendian, DBL_MANT_DIG, dst_size, buf, saved, nelmts); } #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 } else if(src_type == FLT_LDOUBLE) { @@ -3610,10 +3746,10 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) INIT_FP_NORM(long double, LDBL_MAX, LDBL_MIN, LDBL_MAX_10_EXP, LDBL_MIN_10_EXP, src_size, dst_size, buf, saved, nelmts); } else if(run_test==TEST_DENORM) { - INIT_FP_DENORM(long double, LDBL_MANT_DIG, src_size, src_nbits, endian, dst_size, + INIT_FP_DENORM(long double, LDBL_MANT_DIG, src_size, src_nbits, sendian, dst_size, buf, saved, nelmts); } else { - INIT_FP_SPECIAL(src_size, src_nbits, endian, LDBL_MANT_DIG, dst_size, buf, saved, nelmts); + INIT_FP_SPECIAL(src_size, src_nbits, sendian, LDBL_MANT_DIG, dst_size, buf, saved, nelmts); } #endif } else @@ -3991,7 +4127,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) * the values. */ #if H5_SIZEOF_LONG_DOUBLE !=0 - if(endian==H5T_ORDER_LE && dst_type==FLT_LDOUBLE) { + if(dendian==H5T_ORDER_LE && dst_type==FLT_LDOUBLE) { unsigned int q; for(q=dst_nbits/8; q<dst_size; q++) { buf[j*dst_size+q] = 0x00; @@ -4012,11 +4148,19 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) * certain things. These routines have already been tested by * the `bittests' program. */ - for (k=0; k<src_size; k++) - src_bits[src_size-(k+1)] = saved[j*src_size+ENDIAN(src_size, k)]; + + if ((FLT_FLOAT==src_type || FLT_DOUBLE==src_type) && sendian==H5T_ORDER_VAX) { + for (k = 0; k < src_size; k += 2) { + src_bits[k] = saved[j*src_size + (src_size - 2) - k]; + src_bits[k + 1] = saved[j*src_size + (src_size - 1) - k]; + } + } else { + for (k=0; k<src_size; k++) + src_bits[src_size-(k+1)] = saved[j*src_size+ENDIAN(src_size, k, sendian)]; + } for (k=0; k<dst_size; k++) - dst_bits[dst_size-(k+1)] = buf[j*dst_size+ENDIAN(dst_size, k)]; + dst_bits[dst_size-(k+1)] = buf[j*dst_size+ENDIAN(dst_size, k, dendian)]; /* Test library's default overflow handling: * Hardware usually doesn't handle overflows too gracefully. The @@ -4177,7 +4321,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) printf(" src = "); for (k=0; k<src_size; k++) - printf(" %02x", saved[j*src_size+ENDIAN(src_size, k)]); + printf(" %02x", saved[j*src_size+ENDIAN(src_size, k, sendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)dst_size-(ssize_t)src_size)), ""); switch (src_type) { case INT_SCHAR: @@ -4240,7 +4384,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) printf(" dst = "); for (k=0; k<dst_size; k++) - printf(" %02x", buf[j*dst_size+ENDIAN(dst_size, k)]); + printf(" %02x", buf[j*dst_size+ENDIAN(dst_size, k, dendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); switch (dst_type) { case INT_SCHAR: @@ -4303,7 +4447,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst) printf(" ans = "); for (k=0; k<dst_size; k++) - printf(" %02x", hw[ENDIAN(dst_size, k)]); + printf(" %02x", hw[ENDIAN(dst_size, k, dendian)]); printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), ""); switch (dst_type) { case INT_SCHAR: @@ -4865,7 +5009,15 @@ run_fp_int_conv(const char *name) run_test = FALSE; #endif +#ifdef VMS + run_test = TRUE; +#endif + if(run_test) { +#ifdef VMS + test_values = TEST_NORMAL; + { +#else for(i=0; i<3; i++) { if(i==0) test_values = TEST_NORMAL; @@ -4873,6 +5025,7 @@ run_fp_int_conv(const char *name) test_values = TEST_DENORM; else test_values = TEST_SPECIAL; +#endif /*VMS*/ nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_SCHAR); nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_SCHAR); @@ -5064,8 +5217,10 @@ main(void) * for user-defined integer types */ nerrors += test_derived_integer(); +#ifndef VMS /* Does floating point overflow generate a SIGFPE? */ generates_sigfpe(); +#endif /* Test degenerate cases */ nerrors += run_fp_tests("noop"); |