svn commit: trunk/uClibc: libc/string/sh64 libc/sysdeps/linux/sh/b etc...
andersen at uclibc.org
andersen at uclibc.org
Wed Dec 14 02:33:37 UTC 2005
Author: andersen
Date: 2005-12-13 18:33:36 -0800 (Tue, 13 Dec 2005)
New Revision: 12880
Log:
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().
Modified:
trunk/uClibc/libc/string/sh64/memset.S
trunk/uClibc/libc/string/sh64/strcpy.S
trunk/uClibc/libc/sysdeps/linux/sh/bits/kernel_stat.h
trunk/uClibc/libm/fp_private.h
trunk/uClibc/libm/powerpc/s_ceil.c
trunk/uClibc/libm/powerpc/s_floor.c
trunk/uClibc/libm/powerpc/s_frexp.c
trunk/uClibc/libm/powerpc/s_ldexp.c
trunk/uClibc/libm/powerpc/s_logb.c
trunk/uClibc/libm/powerpc/s_modf.c
trunk/uClibc/libm/powerpc/s_rint.c
trunk/uClibc/libm/powerpc/s_round.c
trunk/uClibc/libm/powerpc/s_trunc.c
trunk/uClibc/libm/powerpc/w_scalb.c
Changeset:
Modified: trunk/uClibc/libc/string/sh64/memset.S
===================================================================
--- trunk/uClibc/libc/string/sh64/memset.S 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libc/string/sh64/memset.S 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libc/string/sh64/strcpy.S
===================================================================
--- trunk/uClibc/libc/string/sh64/strcpy.S 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libc/string/sh64/strcpy.S 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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 @@
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
Modified: trunk/uClibc/libc/sysdeps/linux/sh/bits/kernel_stat.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/sh/bits/kernel_stat.h 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libc/sysdeps/linux/sh/bits/kernel_stat.h 2005-12-14 02:33:36 UTC (rev 12880)
@@ -30,10 +30,10 @@
};
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 @@
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 @@
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 */
Modified: trunk/uClibc/libm/fp_private.h
===================================================================
--- trunk/uClibc/libm/fp_private.h 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/fp_private.h 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_ceil.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_ceil.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_ceil.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_floor.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_floor.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_floor.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_frexp.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_frexp.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_frexp.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_ldexp.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_ldexp.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_ldexp.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_logb.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_logb.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_logb.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_modf.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_modf.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_modf.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_rint.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_rint.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_rint.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_round.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_round.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_round.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/s_trunc.c
===================================================================
--- trunk/uClibc/libm/powerpc/s_trunc.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/s_trunc.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
Modified: trunk/uClibc/libm/powerpc/w_scalb.c
===================================================================
--- trunk/uClibc/libm/powerpc/w_scalb.c 2005-12-13 21:38:57 UTC (rev 12879)
+++ trunk/uClibc/libm/powerpc/w_scalb.c 2005-12-14 02:33:36 UTC (rev 12880)
@@ -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
More information about the uClibc-cvs
mailing list