diff options
Diffstat (limited to 'libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c')
-rw-r--r-- | libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c b/libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c index 2ee1f31466b..723f0903221 100644 --- a/libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c +++ b/libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c @@ -1,5 +1,5 @@ /* VMDouble.c - java.lang.VMDouble native functions - Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005, 2006 + Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -125,6 +125,16 @@ Java_java_lang_VMDouble_doubleToLongBits val.d = doubleValue; +#if defined(__IEEE_BYTES_LITTLE_ENDIAN) + /* On little endian ARM processors when using FPA, word order of + doubles is still big endian. So take that into account here. When + using VFP, word order of doubles follows byte order. */ + +#define SWAP_DOUBLE(a) (((a) << 32) | (((a) >> 32) & 0x00000000ffffffff)) + + val.j = SWAP_DOUBLE(val.j); +#endif + e = val.j & 0x7ff0000000000000LL; f = val.j & 0x000fffffffffffffLL; @@ -148,6 +158,10 @@ Java_java_lang_VMDouble_doubleToRawLongBits val.d = doubleValue; +#if defined(__IEEE_BYTES_LITTLE_ENDIAN) + val.j = SWAP_DOUBLE(val.j); +#endif + return val.j; } @@ -165,6 +179,10 @@ Java_java_lang_VMDouble_longBitsToDouble val.j = longValue; +#if defined(__IEEE_BYTES_LITTLE_ENDIAN) + val.j = SWAP_DOUBLE(val.j); +#endif + return val.d; } @@ -236,7 +254,7 @@ parseDoubleFromChars(JNIEnv * env, const char * buf) #ifdef DEBUG fprintf (stderr, "java.lang.VMDouble.parseDouble val = %g\n", val); - fprintf (stderr, "java.lang.VMDouble.parseDouble %i != %i ???\n", + fprintf (stderr, "java.lang.VMDouble.parseDouble %p != %p ???\n", endptr, last_non_ws); #endif if (endptr != last_non_ws) |