From: Jens Axboe Date: Thu, 13 Oct 2011 12:12:40 +0000 (+0200) Subject: Move IEEE754 support code to lib/ X-Git-Tag: fio-1.99.6~2 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=c7c6cb4cb3114ec4ce3107e15c184e161b50122e Move IEEE754 support code to lib/ It's not strictly core code. Signed-off-by: Jens Axboe --- diff --git a/Makefile b/Makefile index 8b8898c9..6a3f85bc 100644 --- a/Makefile +++ b/Makefile @@ -12,9 +12,9 @@ UNAME := $(shell uname) SOURCE = gettime.c fio.c ioengines.c init.c stat.c log.c time.c filesetup.c \ eta.c verify.c memory.c io_u.c parse.c mutex.c options.c \ rbtree.c smalloc.c filehash.c profile.c debug.c lib/rand.c \ - lib/num2str.c $(wildcard crc/*.c) engines/cpu.c \ + lib/num2str.c lib/ieee754.c $(wildcard crc/*.c) engines/cpu.c \ engines/mmap.c engines/sync.c engines/null.c engines/net.c \ - memalign.c server.c client.c iolog.c ieee754.c + memalign.c server.c client.c iolog.c ifeq ($(UNAME), Linux) SOURCE += diskutil.c fifo.c blktrace.c helpers.c cgroup.c trim.c \ diff --git a/ieee754.c b/ieee754.c deleted file mode 100644 index c7742a2d..00000000 --- a/ieee754.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Shamelessly lifted from Beej's Guide to Network Programming, found here: - * - * http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#serialization - * - * Below code was granted to the public domain. - */ -#include -#include "ieee754.h" - -uint64_t pack754(long double f, unsigned bits, unsigned expbits) -{ - long double fnorm; - int shift; - long long sign, exp, significand; - unsigned significandbits = bits - expbits - 1; // -1 for sign bit - - // get this special case out of the way - if (f == 0.0) - return 0; - - // check sign and begin normalization - if (f < 0) { - sign = 1; - fnorm = -f; - } else { - sign = 0; - fnorm = f; - } - - // get the normalized form of f and track the exponent - shift = 0; - while (fnorm >= 2.0) { - fnorm /= 2.0; - shift++; - } - while (fnorm < 1.0) { - fnorm *= 2.0; - shift--; - } - fnorm = fnorm - 1.0; - - // calculate the binary form (non-float) of the significand data - significand = fnorm * ((1LL << significandbits) + 0.5f); - - // get the biased exponent - exp = shift + ((1 << (expbits - 1)) - 1); // shift + bias - - // return the final answer - return (sign << (bits - 1)) | (exp << (bits-expbits - 1)) | significand; -} - -long double unpack754(uint64_t i, unsigned bits, unsigned expbits) -{ - long double result; - long long shift; - unsigned bias; - unsigned significandbits = bits - expbits - 1; // -1 for sign bit - - if (i == 0) - return 0.0; - - // pull the significand - result = (i & ((1LL << significandbits) - 1)); // mask - result /= (1LL << significandbits); // convert back to float - result += 1.0f; // add the one back on - - // deal with the exponent - bias = (1 << (expbits - 1)) - 1; - shift = ((i >> significandbits) & ((1LL << expbits) - 1)) - bias; - while (shift > 0) { - result *= 2.0; - shift--; - } - while (shift < 0) { - result /= 2.0; - shift++; - } - - // sign it - result *= (i >> (bits - 1)) & 1 ? -1.0 : 1.0; - - return result; -} diff --git a/ieee754.h b/ieee754.h deleted file mode 100644 index 5af9518e..00000000 --- a/ieee754.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef FIO_IEEE754_H -#define FIO_IEEE754_H - -#include - -extern uint64_t pack754(long double f, unsigned bits, unsigned expbits); -extern long double unpack754(uint64_t i, unsigned bits, unsigned expbits); - -#define fio_double_to_uint64(val) pack754((val), 64, 11) -#define fio_uint64_to_double(val) unpack754((val), 64, 11) - -typedef struct fio_fp64 { - union { - uint64_t i; - double f; - uint8_t filler[16]; - } u; -} fio_fp64_t; - -#endif diff --git a/iolog.h b/iolog.h index a523d4d2..53bb66ca 100644 --- a/iolog.h +++ b/iolog.h @@ -1,7 +1,7 @@ #ifndef FIO_IOLOG_H #define FIO_IOLOG_H -#include "ieee754.h" +#include "lib/ieee754.h" /* * Use for maintaining statistics diff --git a/lib/ieee754.c b/lib/ieee754.c new file mode 100644 index 00000000..c7742a2d --- /dev/null +++ b/lib/ieee754.c @@ -0,0 +1,84 @@ +/* + * Shamelessly lifted from Beej's Guide to Network Programming, found here: + * + * http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#serialization + * + * Below code was granted to the public domain. + */ +#include +#include "ieee754.h" + +uint64_t pack754(long double f, unsigned bits, unsigned expbits) +{ + long double fnorm; + int shift; + long long sign, exp, significand; + unsigned significandbits = bits - expbits - 1; // -1 for sign bit + + // get this special case out of the way + if (f == 0.0) + return 0; + + // check sign and begin normalization + if (f < 0) { + sign = 1; + fnorm = -f; + } else { + sign = 0; + fnorm = f; + } + + // get the normalized form of f and track the exponent + shift = 0; + while (fnorm >= 2.0) { + fnorm /= 2.0; + shift++; + } + while (fnorm < 1.0) { + fnorm *= 2.0; + shift--; + } + fnorm = fnorm - 1.0; + + // calculate the binary form (non-float) of the significand data + significand = fnorm * ((1LL << significandbits) + 0.5f); + + // get the biased exponent + exp = shift + ((1 << (expbits - 1)) - 1); // shift + bias + + // return the final answer + return (sign << (bits - 1)) | (exp << (bits-expbits - 1)) | significand; +} + +long double unpack754(uint64_t i, unsigned bits, unsigned expbits) +{ + long double result; + long long shift; + unsigned bias; + unsigned significandbits = bits - expbits - 1; // -1 for sign bit + + if (i == 0) + return 0.0; + + // pull the significand + result = (i & ((1LL << significandbits) - 1)); // mask + result /= (1LL << significandbits); // convert back to float + result += 1.0f; // add the one back on + + // deal with the exponent + bias = (1 << (expbits - 1)) - 1; + shift = ((i >> significandbits) & ((1LL << expbits) - 1)) - bias; + while (shift > 0) { + result *= 2.0; + shift--; + } + while (shift < 0) { + result /= 2.0; + shift++; + } + + // sign it + result *= (i >> (bits - 1)) & 1 ? -1.0 : 1.0; + + return result; +} diff --git a/lib/ieee754.h b/lib/ieee754.h new file mode 100644 index 00000000..5af9518e --- /dev/null +++ b/lib/ieee754.h @@ -0,0 +1,20 @@ +#ifndef FIO_IEEE754_H +#define FIO_IEEE754_H + +#include + +extern uint64_t pack754(long double f, unsigned bits, unsigned expbits); +extern long double unpack754(uint64_t i, unsigned bits, unsigned expbits); + +#define fio_double_to_uint64(val) pack754((val), 64, 11) +#define fio_uint64_to_double(val) unpack754((val), 64, 11) + +typedef struct fio_fp64 { + union { + uint64_t i; + double f; + uint8_t filler[16]; + } u; +} fio_fp64_t; + +#endif diff --git a/server.c b/server.c index 9cbe555f..e7a90572 100644 --- a/server.c +++ b/server.c @@ -20,7 +20,7 @@ #include "fio.h" #include "server.h" #include "crc/crc16.h" -#include "ieee754.h" +#include "lib/ieee754.h" #include "fio_version.h" diff --git a/stat.c b/stat.c index 558464f7..a053c8be 100644 --- a/stat.c +++ b/stat.c @@ -9,7 +9,7 @@ #include "fio.h" #include "diskutil.h" -#include "ieee754.h" +#include "lib/ieee754.h" void update_rusage_stat(struct thread_data *td) {