summaryrefslogtreecommitdiff
path: root/native
diff options
context:
space:
mode:
authorChristian Thalinger <twisti@complang.tuwien.ac.at>2006-01-26 21:09:52 +0000
committerChristian Thalinger <twisti@complang.tuwien.ac.at>2006-01-26 21:09:52 +0000
commit8078e6fd383047eec75292dd6c981b29e8741837 (patch)
tree6c5fed8b123d7db102f2c5980e10d107ddd1ca76 /native
parent33b35e99275e3f5dae33796c60139520acde41c0 (diff)
downloadclasspath-8078e6fd383047eec75292dd6c981b29e8741837.tar.gz
2006-01-26 Christian Thalinger <twisti@complang.tuwien.ac.at>
* native/jni/java-lang/java_lang_VMDouble.c (doubleToLongBits) (doubleToRawLongBits, longBitsToDouble): Swap the byte ordering for little-endian arms without VFP.
Diffstat (limited to 'native')
-rw-r--r--native/jni/java-lang/java_lang_VMDouble.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/native/jni/java-lang/java_lang_VMDouble.c b/native/jni/java-lang/java_lang_VMDouble.c
index 076f42b86..8435c3fdb 100644
--- a/native/jni/java-lang/java_lang_VMDouble.c
+++ b/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;
}