diff options
author | Christian Thalinger <twisti@complang.tuwien.ac.at> | 2006-01-26 21:09:52 +0000 |
---|---|---|
committer | Christian Thalinger <twisti@complang.tuwien.ac.at> | 2006-01-26 21:09:52 +0000 |
commit | 8078e6fd383047eec75292dd6c981b29e8741837 (patch) | |
tree | 6c5fed8b123d7db102f2c5980e10d107ddd1ca76 /native | |
parent | 33b35e99275e3f5dae33796c60139520acde41c0 (diff) | |
download | classpath-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.c | 22 |
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; } |