diff options
author | Eric Andersen <andersen@codepoet.org> | 2005-12-14 02:33:36 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2005-12-14 02:33:36 +0000 |
commit | 7635b30f9d62e33b057d830780a937c6c1d140f5 (patch) | |
tree | 9991bb6bc9f6233ed784521c588cf9e90c8520b3 | |
parent | f32600208f4e9db972eb47f7d4959994b31199e6 (diff) |
Fixup byte order handling. Not all architectures define __BIG_ENDIAN__ so i.e.
on big endian mips the code is compiled as little-endian and the wrong half of
the 64-bit point value is examined to check for NaN, etc. This bug also broke
fpclassify(), isfinite(), isnormal(), isinf(), finite(), and signbit().
-rw-r--r-- | libc/string/sh64/memset.S | 4 | ||||
-rw-r--r-- | libc/string/sh64/strcpy.S | 6 | ||||
-rw-r--r-- | libc/sysdeps/linux/sh/bits/kernel_stat.h | 8 | ||||
-rw-r--r-- | libm/fp_private.h | 3 | ||||
-rw-r--r-- | libm/powerpc/s_ceil.c | 4 | ||||
-rw-r--r-- | libm/powerpc/s_floor.c | 4 | ||||
-rw-r--r-- | libm/powerpc/s_frexp.c | 3 | ||||
-rw-r--r-- | libm/powerpc/s_ldexp.c | 3 | ||||
-rw-r--r-- | libm/powerpc/s_logb.c | 4 | ||||
-rw-r--r-- | libm/powerpc/s_modf.c | 3 | ||||
-rw-r--r-- | libm/powerpc/s_rint.c | 3 | ||||
-rw-r--r-- | libm/powerpc/s_round.c | 3 | ||||
-rw-r--r-- | libm/powerpc/s_trunc.c | 3 | ||||
-rw-r--r-- | libm/powerpc/w_scalb.c | 4 |
14 files changed, 37 insertions, 18 deletions
diff --git a/libc/string/sh64/memset.S b/libc/string/sh64/memset.S index e1679230b..d87879717 100644 --- a/libc/string/sh64/memset.S +++ b/libc/string/sh64/memset.S @@ -9,7 +9,9 @@ ! Copyright 2002 SuperH Ltd. ! -#ifdef __LITTLE_ENDIAN__ +#include <endian.h> + +#if __BYTE_ORDER == __LITTLE_ENDIAN #define SHHI shlld #define SHLO shlrd #else diff --git a/libc/string/sh64/strcpy.S b/libc/string/sh64/strcpy.S index faa071c50..f662cc859 100644 --- a/libc/string/sh64/strcpy.S +++ b/libc/string/sh64/strcpy.S @@ -6,7 +6,9 @@ ! ! SH5 code Copyright 2002 SuperH Ltd. -#ifdef __LITTLE_ENDIAN__ +#include <endian.h> + +#if __BYTE_ORDER == __LITTLE_ENDIAN #define SHHI shlld #define SHLO shlrd #else @@ -67,7 +69,7 @@ no_lddst: add r5, r63, r4 addi r0, 8, r0 shortstring: -#ifndef __LITTLE_ENDIAN__ +#if __BYTE_ORDER != __LITTLE_ENDIAN pta/l shortstring2,tr1 byterev r4,r4 #endif diff --git a/libc/sysdeps/linux/sh/bits/kernel_stat.h b/libc/sysdeps/linux/sh/bits/kernel_stat.h index cd818464d..c841b0cee 100644 --- a/libc/sysdeps/linux/sh/bits/kernel_stat.h +++ b/libc/sysdeps/linux/sh/bits/kernel_stat.h @@ -30,10 +30,10 @@ struct kernel_stat { }; struct kernel_stat64 { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned char __pad0b[6]; unsigned short st_dev; -#elif defined(__LITTLE_ENDIAN__) +#elif (__BYTE_ORDER == __LITTLE_ENDIAN) unsigned short st_dev; unsigned char __pad0b[6]; #else @@ -48,7 +48,7 @@ struct kernel_stat64 { unsigned long st_uid; unsigned long st_gid; -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned char __pad3b[6]; unsigned short st_rdev; #else /* Must be little */ @@ -60,7 +60,7 @@ struct kernel_stat64 { long long st_size; unsigned long st_blksize; -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long __pad4; /* Future possible st_blocks hi bits */ unsigned long st_blocks; /* Number 512-byte blocks allocated. */ #else /* Must be little */ diff --git a/libm/fp_private.h b/libm/fp_private.h index 505400e33..0ddb616c4 100644 --- a/libm/fp_private.h +++ b/libm/fp_private.h @@ -70,10 +70,11 @@ *******************************************************************************/ #include <stdint.h> +#include <endian.h> typedef struct /* Hex representation of a double. */ { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) uint32_t high; uint32_t low; #else diff --git a/libm/powerpc/s_ceil.c b/libm/powerpc/s_ceil.c index fd073de7b..f6680eedf 100644 --- a/libm/powerpc/s_ceil.c +++ b/libm/powerpc/s_ceil.c @@ -21,13 +21,15 @@ * * *******************************************************************************/ +#include <endian.h> + static const double twoTo52 = 4503599627370496.0; static const unsigned long signMask = 0x80000000ul; typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_floor.c b/libm/powerpc/s_floor.c index 94677b4d2..0ddbb9b66 100644 --- a/libm/powerpc/s_floor.c +++ b/libm/powerpc/s_floor.c @@ -21,13 +21,15 @@ * * *******************************************************************************/ +#include <endian.h> + static const double twoTo52 = 4503599627370496.0; static const unsigned long signMask = 0x80000000ul; typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_frexp.c b/libm/powerpc/s_frexp.c index 9909f2ce7..7c998f81a 100644 --- a/libm/powerpc/s_frexp.c +++ b/libm/powerpc/s_frexp.c @@ -21,13 +21,14 @@ #include <limits.h> #include <math.h> +#include <endian.h> static const double two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_ldexp.c b/libm/powerpc/s_ldexp.c index ce9ec8b1b..7e52352ae 100644 --- a/libm/powerpc/s_ldexp.c +++ b/libm/powerpc/s_ldexp.c @@ -21,11 +21,12 @@ #include <limits.h> #include <math.h> +#include <endian.h> typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_logb.c b/libm/powerpc/s_logb.c index 23c7270f9..3caecd95f 100644 --- a/libm/powerpc/s_logb.c +++ b/libm/powerpc/s_logb.c @@ -32,10 +32,12 @@ * Standard 754. * *******************************************************************************/ +#include <endian.h> + typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_modf.c b/libm/powerpc/s_modf.c index f4344bda8..cb8338a90 100644 --- a/libm/powerpc/s_modf.c +++ b/libm/powerpc/s_modf.c @@ -45,13 +45,14 @@ #include <limits.h> #include <math.h> +#include <endian.h> #define SET_INVALID 0x01000000UL typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_rint.c b/libm/powerpc/s_rint.c index 72c4834d0..c229515c4 100644 --- a/libm/powerpc/s_rint.c +++ b/libm/powerpc/s_rint.c @@ -46,13 +46,14 @@ #include <limits.h> #include <math.h> +#include <endian.h> #define SET_INVALID 0x01000000UL typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_round.c b/libm/powerpc/s_round.c index 81f4d0fec..a0f72ebe3 100644 --- a/libm/powerpc/s_round.c +++ b/libm/powerpc/s_round.c @@ -1,10 +1,11 @@ #include <limits.h> #include <math.h> +#include <endian.h> typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/s_trunc.c b/libm/powerpc/s_trunc.c index 4b61355ea..7db7606b6 100644 --- a/libm/powerpc/s_trunc.c +++ b/libm/powerpc/s_trunc.c @@ -1,10 +1,11 @@ #include <limits.h> #include <math.h> +#include <endian.h> typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else diff --git a/libm/powerpc/w_scalb.c b/libm/powerpc/w_scalb.c index c93c74b68..fe23ece53 100644 --- a/libm/powerpc/w_scalb.c +++ b/libm/powerpc/w_scalb.c @@ -19,10 +19,12 @@ ** ***********************************************************************/ +#include <endian.h> + typedef union { struct { -#if defined(__BIG_ENDIAN__) +#if (__BYTE_ORDER == __BIG_ENDIAN) unsigned long int hi; unsigned long int lo; #else |