#include #include #include #include #include #include #define MAX(a,b) (((a)>(b)) ? (a) : (b)) /* Initialize source buffer of integer for integer->integer and conversion test. * This algorithm is mainly to avoid any casting and comparison between source and destination types * for compiler, because we're testing conversions. */ #define INIT_INTEGER(TYPE, SRC_MAX, SRC_MIN, SRC_SIZE, DST_SIZE, SRC_PREC, BUF, NELMTS) \ { \ unsigned char *buf_p; \ unsigned int n; \ TYPE value1 = 1; \ TYPE value2 = 0; \ \ /* Allocate buffers */ \ NELMTS=(SRC_PREC-1)*3+1; \ BUF = (unsigned char*)malloc(NELMTS*MAX(SRC_SIZE, DST_SIZE)); \ memset(BUF, 0, NELMTS*MAX(SRC_SIZE, DST_SIZE)); \ \ buf_p = BUF; \ \ /*positive values, ascending order. VALUE1 starts from 00000001, to 00000010, until 10000000*/ \ /*VALUE2 ascends from 00000000, to 00000011, 00000111,..., until 11111111.*/ \ for(n=0; n=SRC_MIN) { \ memcpy(buf_p, &value1, SRC_SIZE); \ buf_p += SRC_SIZE; \ } \ if(value2<=SRC_MAX && value2>=SRC_MIN) { \ memcpy(buf_p, &value2, SRC_SIZE); \ buf_p += SRC_SIZE; \ } \ \ value1 <<= 1; \ value2 = (value1 - 1) | value1; \ } \ \ /* negative values for signed; descending positive values for unsigned */ \ /* VALUE2 descends from 11111111 to 11111110, 11111100, ..., until 10000000. */ \ for(n=0; n=SRC_MIN) { \ memcpy(buf_p, &value2, SRC_SIZE); \ buf_p += SRC_SIZE; \ } \ value2 <<= 1; \ } \ } /* Convert from short to integer using the compiler. */ conv_short_int( size_t nelmts, void *buf) { size_t elmtno; uint8_t *src, *s; uint8_t *dst, *d; long long aligned; ssize_t s_stride = 2; ssize_t d_stride = 4; /* In-place conversion, from the last to the first element. */ if(d_stride>s_stride) { src = (uint8_t*)buf+(nelmts-1)*s_stride; dst = (uint8_t*)buf+(nelmts-1)*d_stride; s_stride = -s_stride; d_stride = -d_stride; } for (elmtno=0; elmtno