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, 21 insertions, 1 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 076f42b86a3..8435c3fdba7 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, 2004i, 2005 + Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -123,6 +123,16 @@ Java_java_lang_VMDouble_doubleToLongBits jlong e, f; 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; @@ -144,6 +154,11 @@ Java_java_lang_VMDouble_doubleToRawLongBits { jvalue val; val.d = doubleValue; + +#if defined(__IEEE_BYTES_LITTLE_ENDIAN) + val.j = SWAP_DOUBLE(val.j); +#endif + return val.j; } @@ -159,6 +174,11 @@ Java_java_lang_VMDouble_longBitsToDouble { jvalue val; val.j = longValue; + +#if defined(__IEEE_BYTES_LITTLE_ENDIAN) + val.j = SWAP_DOUBLE(val.j); +#endif + return val.d; } |