Browse Source

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().

Eric Andersen 18 năm trước cách đây
mục cha
commit
7635b30f9d

+ 3 - 1
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

+ 4 - 2
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

+ 4 - 4
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 */

+ 2 - 1
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

+ 3 - 1
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

+ 3 - 1
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

+ 2 - 1
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

+ 2 - 1
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

+ 3 - 1
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

+ 2 - 1
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

+ 2 - 1
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

+ 2 - 1
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

+ 2 - 1
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

+ 3 - 1
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