patches/glibc/2.3.6/220-fp-byteorder.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 744 4bf8448536d5
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
yann@402
     1
Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
yann@402
     2
Author: addsub@eyou.com
yann@402
     3
Target: ARM
yann@402
     4
yann@402
     5
Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
yann@402
     6
and makes printf("%f", 1.0) work.
yann@402
     7
yann@402
     8
Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
yann@402
     9
 It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
yann@402
    10
 is broken' on my big-endian hardfloat FPA ARM platform. ...
yann@402
    11
 It's definitely needed for hardfloat.  So I'd think it's needed for
yann@402
    12
 big-endian systems in any case, and for VFP on little-endian systems
yann@402
    13
 too.  Someone would have to verify that though.
yann@402
    14
yann@402
    15
Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
yann@402
    16
 I just had a look at glibc-20040830, and [this patch] is still needed and useful
yann@402
    17
 for this version.  glibc-20040830 out-of-the-box still contains the
yann@402
    18
 following wrong assumptions:
yann@402
    19
 - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
yann@402
    20
   not on vfp systems)
yann@402
    21
 - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
yann@402
    22
   are not on big endian systems, neither on vfp systems)
yann@402
    23
 - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
yann@402
    24
   (which they are not on big endian systems)
yann@402
    25
 [This patch] seems the right solution for all of these issues.
yann@402
    26
yann@402
    27
Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
yann@402
    28
 It's even needed for glibc CVS, AFAICS.
yann@402
    29
 The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
yann@402
    30
 (currently at version 1.4) is only needed for proper VFP operation.
yann@402
    31
 But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
yann@402
    32
 that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
yann@402
    33
 for proper operation of *any* FP model on big endian ARM.
yann@402
    34
yann@402
    35
See also discussion in followups to
yann@402
    36
http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
yann@402
    37
yann@402
    38
Message-ID: <276985760.37584@eyou.com>
yann@402
    39
Received: from unknown (HELO eyou.com) (172.16.2.2)
yann@402
    40
 by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
yann@402
    41
Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
yann@402
    42
Date: 17 Feb 2004 10:42:38 +0800
yann@402
    43
Message-ID: <20040217104238.8237.qmail@eyou.com>
yann@402
    44
From: "add" <addsub@eyou.com>
yann@402
    45
To: dank@kegel.com
yann@402
    46
Reply-To: "add" <addsub@eyou.com>
yann@402
    47
Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
yann@402
    48
yann@402
    49
Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
yann@402
    50
toolchain can printf("%f\n",1.0). So you may have a try of this
yann@402
    51
yann@402
    52
yann@402
    53
diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
yann@402
    54
--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
yann@402
    55
+++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
yann@402
    56
@@ -9,4 +9,9 @@
yann@402
    57
 #else
yann@402
    58
 #define __BYTE_ORDER __LITTLE_ENDIAN
yann@402
    59
 #endif
yann@402
    60
+
yann@402
    61
+#ifdef __VFP_FP__
yann@402
    62
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
yann@402
    63
+#else
yann@402
    64
 #define __FLOAT_WORD_ORDER __BIG_ENDIAN
yann@402
    65
+#endif
yann@402
    66
diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
yann@402
    67
--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
yann@402
    68
+++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
yann@402
    69
@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
yann@402
    70
 #define BITS_PER_SHORTINT 16
yann@402
    71
 #define BITS_PER_CHAR 8
yann@402
    72
 
yann@402
    73
-#define IEEE_DOUBLE_BIG_ENDIAN 0
yann@402
    74
-#define IEEE_DOUBLE_MIXED_ENDIAN 1
yann@402
    75
+#if defined(__ARMEB__)
yann@402
    76
+# define IEEE_DOUBLE_MIXED_ENDIAN 0
yann@402
    77
+# define IEEE_DOUBLE_BIG_ENDIAN 1
yann@402
    78
+#elif defined(__VFP_FP__)
yann@402
    79
+# define IEEE_DOUBLE_MIXED_ENDIAN 0
yann@402
    80
+# define IEEE_DOUBLE_BIG_ENDIAN 0
yann@402
    81
+#else
yann@402
    82
+# define IEEE_DOUBLE_BIG_ENDIAN 0
yann@402
    83
+# define IEEE_DOUBLE_MIXED_ENDIAN 1
yann@402
    84
+#endif
yann@402
    85
diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
yann@402
    86
--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
yann@402
    87
+++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
yann@402
    88
@@ -1,115 +0,0 @@
yann@402
    89
-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
yann@402
    90
-   This file is part of the GNU C Library.
yann@402
    91
-
yann@402
    92
-   The GNU C Library is free software; you can redistribute it and/or
yann@402
    93
-   modify it under the terms of the GNU Lesser General Public
yann@402
    94
-   License as published by the Free Software Foundation; either
yann@402
    95
-   version 2.1 of the License, or (at your option) any later version.
yann@402
    96
-
yann@402
    97
-   The GNU C Library is distributed in the hope that it will be useful,
yann@402
    98
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
yann@402
    99
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
yann@402
   100
-   Lesser General Public License for more details.
yann@402
   101
-
yann@402
   102
-   You should have received a copy of the GNU Lesser General Public
yann@402
   103
-   License along with the GNU C Library; if not, write to the Free
yann@402
   104
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
yann@402
   105
-   02111-1307 USA.  */
yann@402
   106
-
yann@402
   107
-#ifndef _IEEE754_H
yann@402
   108
-
yann@402
   109
-#define _IEEE754_H 1
yann@402
   110
-#include <features.h>
yann@402
   111
-
yann@402
   112
-#include <endian.h>
yann@402
   113
-
yann@402
   114
-__BEGIN_DECLS
yann@402
   115
-
yann@402
   116
-union ieee754_float
yann@402
   117
-  {
yann@402
   118
-    float f;
yann@402
   119
-
yann@402
   120
-    /* This is the IEEE 754 single-precision format.  */
yann@402
   121
-    struct
yann@402
   122
-      {
yann@402
   123
-	unsigned int mantissa:23;
yann@402
   124
-	unsigned int exponent:8;
yann@402
   125
-	unsigned int negative:1;
yann@402
   126
-      } ieee;
yann@402
   127
-
yann@402
   128
-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
yann@402
   129
-    struct
yann@402
   130
-      {
yann@402
   131
-	unsigned int mantissa:22;
yann@402
   132
-	unsigned int quiet_nan:1;
yann@402
   133
-	unsigned int exponent:8;
yann@402
   134
-	unsigned int negative:1;
yann@402
   135
-      } ieee_nan;
yann@402
   136
-  };
yann@402
   137
-
yann@402
   138
-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
yann@402
   139
-
yann@402
   140
-
yann@402
   141
-union ieee754_double
yann@402
   142
-  {
yann@402
   143
-    double d;
yann@402
   144
-
yann@402
   145
-    /* This is the IEEE 754 double-precision format.  */
yann@402
   146
-    struct
yann@402
   147
-      {
yann@402
   148
-	unsigned int mantissa0:20;
yann@402
   149
-	unsigned int exponent:11;
yann@402
   150
-	unsigned int negative:1;
yann@402
   151
-	unsigned int mantissa1:32;
yann@402
   152
-      } ieee;
yann@402
   153
-
yann@402
   154
-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
yann@402
   155
-    struct
yann@402
   156
-      {
yann@402
   157
-	unsigned int mantissa0:19;
yann@402
   158
-	unsigned int quiet_nan:1;
yann@402
   159
-	unsigned int exponent:11;
yann@402
   160
-	unsigned int negative:1;
yann@402
   161
-	unsigned int mantissa1:32;
yann@402
   162
-      } ieee_nan;
yann@402
   163
-  };
yann@402
   164
-
yann@402
   165
-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
yann@402
   166
-
yann@402
   167
-
yann@402
   168
-/* The following two structures are correct for `new' floating point systems but
yann@402
   169
-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
yann@402
   170
-   old hardware.  */
yann@402
   171
-
yann@402
   172
-union ieee854_long_double
yann@402
   173
-  {
yann@402
   174
-    long double d;
yann@402
   175
-
yann@402
   176
-    /* This is the IEEE 854 double-extended-precision format.  */
yann@402
   177
-    struct
yann@402
   178
-      {
yann@402
   179
-	unsigned int exponent:15;
yann@402
   180
-	unsigned int empty:16;
yann@402
   181
-	unsigned int negative:1;
yann@402
   182
-	unsigned int mantissa1:32;
yann@402
   183
-	unsigned int mantissa0:32;
yann@402
   184
-      } ieee;
yann@402
   185
-
yann@402
   186
-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
yann@402
   187
-    struct
yann@402
   188
-      {
yann@402
   189
-	unsigned int exponent:15;
yann@402
   190
-	unsigned int empty:16;
yann@402
   191
-	unsigned int negative:1;
yann@402
   192
-	unsigned int mantissa1:32;
yann@402
   193
-	unsigned int mantissa0:30;
yann@402
   194
-	unsigned int quiet_nan:1;
yann@402
   195
-	unsigned int one:1;
yann@402
   196
-      } ieee_nan;
yann@402
   197
-  };
yann@402
   198
-
yann@402
   199
-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
yann@402
   200
-
yann@402
   201
-__END_DECLS
yann@402
   202
-
yann@402
   203
-#endif /* ieee754.h */
yann@402
   204
yann@402
   205
Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>