diff options
author | Christian Thalinger <twisti@complang.tuwien.ac.at> | 2007-04-05 12:41:33 +0000 |
---|---|---|
committer | Christian Thalinger <twisti@complang.tuwien.ac.at> | 2007-04-05 12:41:33 +0000 |
commit | 9650bcc78c6813e6e5b5c44e98df2922a140785c (patch) | |
tree | 502763ad85eb7418d30524f1fef24d93f606a060 /native | |
parent | 676d651101c50bbc5ee9acede3adda1703d64da4 (diff) | |
download | classpath-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.
Diffstat (limited to 'native')
-rw-r--r-- | native/jni/java-lang/java_lang_VMDouble.c | 18 |
1 files changed, 18 insertions, 0 deletions
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; } |