summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/native/jni/java-lang/java_lang_VMDouble.c
diff options
context:
space:
mode:
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.c22
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)
OpenPOWER on IntegriCloud