diff options
author | Andy Wingo <wingo@pobox.com> | 2012-04-26 22:17:47 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2012-04-26 22:17:47 +0200 |
commit | e7501d4a682cc2b430514280834dfc68b97f2be2 (patch) | |
tree | ff1ba27f86e7c1e896657acc633aa5cf59ddfd63 /libguile/bytevectors.c | |
parent | 649d3ea76639424fa5445a6f44896de1fdf1e309 (diff) | |
parent | d10f7b572c0ca1ccef87f9c46069daa30946e0cf (diff) | |
download | guile-e7501d4a682cc2b430514280834dfc68b97f2be2.tar.gz |
Merge commit 'd10f7b572c0ca1ccef87f9c46069daa30946e0cf'
Conflicts:
libguile/smob.c
libguile/smob.h
test-suite/tests/tree-il.test
Diffstat (limited to 'libguile/bytevectors.c')
-rw-r--r-- | libguile/bytevectors.c | 71 |
1 files changed, 20 insertions, 51 deletions
diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index 668c46d17..db132d43f 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -31,7 +31,6 @@ #include "libguile/bytevectors.h" #include "libguile/strings.h" #include "libguile/validate.h" -#include "libguile/ieee-754.h" #include "libguile/arrays.h" #include "libguile/array-handle.h" #include "libguile/uniform.h" @@ -1584,6 +1583,18 @@ SCM_DEFINE (scm_bytevector_s64_native_set_x, "bytevector-s64-native-set!", Section 2.1 of R6RS-lib (in response to http://www.r6rs.org/formal-comments/comment-187.txt). */ +union scm_ieee754_float +{ + float f; + scm_t_uint32 i; +}; + +union scm_ieee754_double +{ + double d; + scm_t_uint64 i; +}; + /* Convert to/from a floating-point number with different endianness. This method is probably not the most efficient but it should be portable. */ @@ -1592,20 +1603,10 @@ static inline void float_to_foreign_endianness (union scm_ieee754_float *target, float source) { - union scm_ieee754_float src; - - src.f = source; + union scm_ieee754_float input; -#ifdef WORDS_BIGENDIAN - /* Assuming little endian for both byte and word order. */ - target->little_endian.negative = src.big_endian.negative; - target->little_endian.exponent = src.big_endian.exponent; - target->little_endian.mantissa = src.big_endian.mantissa; -#else - target->big_endian.negative = src.little_endian.negative; - target->big_endian.exponent = src.little_endian.exponent; - target->big_endian.mantissa = src.little_endian.mantissa; -#endif + input.f = source; + target->i = bswap_32 (input.i); } static inline float @@ -1613,16 +1614,7 @@ float_from_foreign_endianness (const union scm_ieee754_float *source) { union scm_ieee754_float result; -#ifdef WORDS_BIGENDIAN - /* Assuming little endian for both byte and word order. */ - result.big_endian.negative = source->little_endian.negative; - result.big_endian.exponent = source->little_endian.exponent; - result.big_endian.mantissa = source->little_endian.mantissa; -#else - result.little_endian.negative = source->big_endian.negative; - result.little_endian.exponent = source->big_endian.exponent; - result.little_endian.mantissa = source->big_endian.mantissa; -#endif + result.i = bswap_32 (source->i); return (result.f); } @@ -1631,22 +1623,10 @@ static inline void double_to_foreign_endianness (union scm_ieee754_double *target, double source) { - union scm_ieee754_double src; + union scm_ieee754_double input; - src.d = source; - -#ifdef WORDS_BIGENDIAN - /* Assuming little endian for both byte and word order. */ - target->little_little_endian.negative = src.big_endian.negative; - target->little_little_endian.exponent = src.big_endian.exponent; - target->little_little_endian.mantissa0 = src.big_endian.mantissa0; - target->little_little_endian.mantissa1 = src.big_endian.mantissa1; -#else - target->big_endian.negative = src.little_little_endian.negative; - target->big_endian.exponent = src.little_little_endian.exponent; - target->big_endian.mantissa0 = src.little_little_endian.mantissa0; - target->big_endian.mantissa1 = src.little_little_endian.mantissa1; -#endif + input.d = source; + target->i = bswap_64 (input.i); } static inline double @@ -1654,18 +1634,7 @@ double_from_foreign_endianness (const union scm_ieee754_double *source) { union scm_ieee754_double result; -#ifdef WORDS_BIGENDIAN - /* Assuming little endian for both byte and word order. */ - result.big_endian.negative = source->little_little_endian.negative; - result.big_endian.exponent = source->little_little_endian.exponent; - result.big_endian.mantissa0 = source->little_little_endian.mantissa0; - result.big_endian.mantissa1 = source->little_little_endian.mantissa1; -#else - result.little_little_endian.negative = source->big_endian.negative; - result.little_little_endian.exponent = source->big_endian.exponent; - result.little_little_endian.mantissa0 = source->big_endian.mantissa0; - result.little_little_endian.mantissa1 = source->big_endian.mantissa1; -#endif + result.i = bswap_64 (source->i); return (result.d); } |