summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordarin%meer.net <devnull@localhost>2004-03-12 07:30:50 +0000
committerdarin%meer.net <devnull@localhost>2004-03-12 07:30:50 +0000
commit4dca2fb272a5ce9d8c49806b3faa5a227bdf6a45 (patch)
tree5f8eab5748dfed50a4400cc7965d1657da6ef969
parent2e1b394bd0e655a0520fd713faf16a3bdf27cee9 (diff)
downloadnspr-hg-4dca2fb272a5ce9d8c49806b3faa5a227bdf6a45.tar.gz
fixes bug 209814 "PR_dtoa blows up when executed on an ARM platform" patch by wtc r=darin a=brendanMOZILLA_1_7b_RELEASE
-rw-r--r--pr/src/misc/prdtoa.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/pr/src/misc/prdtoa.c b/pr/src/misc/prdtoa.c
index ee552229..78b509e6 100644
--- a/pr/src/misc/prdtoa.c
+++ b/pr/src/misc/prdtoa.c
@@ -97,6 +97,9 @@
* significant byte has the lowest address.
* #define IEEE_MC68k for IEEE-arithmetic machines where the most
* significant byte has the lowest address.
+ * #define IEEE_ARM for IEEE-arithmetic machines where the two words
+ * in a double are stored in big endian order but the two shorts
+ * in a word are still stored in little endian order.
* #define Long int on machines with 32-bit ints and 64-bit longs.
* #define Sudden_Underflow for IEEE-format machines without gradual
* underflow (i.e., that flush to zero on underflow).
@@ -129,7 +132,10 @@
* is not strictly legal and can cause trouble with aggressively
* optimizing compilers (e.g., gcc 2.95.1 under -O2).
*/
-#if defined(IS_LITTLE_ENDIAN)
+#if defined(__arm) || defined(__arm__) || defined(__arm26__) \
+ || defined(__arm32__)
+#define IEEE_ARM
+#elif defined(IS_LITTLE_ENDIAN)
#define IEEE_8087
#else
#define IEEE_MC68k
@@ -169,6 +175,9 @@ extern void *MALLOC(size_t);
#ifdef IEEE_8087
#define IEEE_ARITHMETIC
#endif
+#ifdef IEEE_ARM
+#define IEEE_ARITHMETIC
+#endif
#ifdef IEEE_ARITHMETIC
#define DBL_DIG 15
@@ -227,8 +236,8 @@ extern void *MALLOC(size_t);
#define Sign_Extend(a,b) /*no-op*/
#endif
-#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
-Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
+#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(IEEE_ARM) + defined(VAX) + defined(IBM) != 1
+Exactly one of IEEE_8087, IEEE_MC68k, IEEE_ARM, VAX, or IBM should be defined.
#endif
typedef union { double d; unsigned Long L[2]; } U;
@@ -257,7 +266,7 @@ typedef union { double d; unsigned Long L[2]; } U;
* An alternative that might be better on some machines is
* #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
*/
-#if defined(IEEE_8087) + defined(VAX)
+#if defined(IEEE_8087) + defined(IEEE_ARM) + defined(VAX)
#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
((unsigned short *)a)[0] = (unsigned short)c, a++)
#else
@@ -271,7 +280,7 @@ typedef union { double d; unsigned Long L[2]; } U;
/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-#if defined(IEEE_8087) + defined(IEEE_MC68k)
+#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(IEEE_ARM)
#define Exp_shift 20
#define Exp_shift1 20
#define Exp_msk1 0x100000