summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Thalinger <twisti@complang.tuwien.ac.at>2007-04-05 12:41:33 +0000
committerChristian Thalinger <twisti@complang.tuwien.ac.at>2007-04-05 12:41:33 +0000
commit9650bcc78c6813e6e5b5c44e98df2922a140785c (patch)
tree502763ad85eb7418d30524f1fef24d93f606a060
parent676d651101c50bbc5ee9acede3adda1703d64da4 (diff)
downloadclasspath-9650bcc78c6813e6e5b5c44e98df2922a140785c.tar.gz
2007-04-05 Christian Thalinger <twisti@complang.tuwien.ac.at>
PR classpath/22800: * native/jni/java-lang/java_lang_VMDouble.c (doubleToLongBits) (doubleToRawLongBits, longBitsToDouble): Swap the byte ordering for little-endian arms without VFP.
-rw-r--r--ChangeLog7
-rw-r--r--native/jni/java-lang/java_lang_VMDouble.c18
2 files changed, 25 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index de2c7c01b..d91d3fb65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2007-04-05 Christian Thalinger <twisti@complang.tuwien.ac.at>
+ PR classpath/22800:
+ * native/jni/java-lang/java_lang_VMDouble.c (doubleToLongBits)
+ (doubleToRawLongBits, longBitsToDouble): Swap the byte
+ ordering for little-endian arms without VFP.
+
+2007-04-05 Christian Thalinger <twisti@complang.tuwien.ac.at>
+
* native/jni/java-net/java_net_VMNetworkInterface.c
[HAVE_IFADDRS_H && HAVE_GETIFADDRS] (free_netif_list): Added
#ifdef.
diff --git a/native/jni/java-lang/java_lang_VMDouble.c b/native/jni/java-lang/java_lang_VMDouble.c
index b21dd6fdc..723f09032 100644
--- a/native/jni/java-lang/java_lang_VMDouble.c
+++ b/native/jni/java-lang/java_lang_VMDouble.c
@@ -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;
}