summaryrefslogtreecommitdiff
path: root/libdecnumber/bid
diff options
context:
space:
mode:
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>2008-06-10 23:43:09 +0000
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>2008-06-10 23:43:09 +0000
commit4d6f3aadf5cae5784452dc4e71596d8bfb9722dd (patch)
treeaaae18cb379d8aaa4351816af260f701d6721cc1 /libdecnumber/bid
parent5b17b7ae7a1654f4555cce7f1339d4dad60e7f56 (diff)
downloadgcc-4d6f3aadf5cae5784452dc4e71596d8bfb9722dd.tar.gz
gcc:
* dfp.c (WORDS_BIGENDIAN): Define to 0 if not defined. (encode_decimal64, decode_decimal64, encode_decimal128, decode_decimal128): Reverse order of 32-bit parts of value if host and target endianness differ. libdecnumber: * dconfig.h: New. * decContext.c, decExcept.c, decExcept.h, decLibrary.c, decNumber.c, decNumberLocal.h, decRound.c, dpd/decimal128.c, dpd/decimal32.c, dpd/decimal64.c: Include dconfig.h not config.h. * dpd/decimal128Local.h (decimal128SetSign, decimal128ClearSign, decimal128FlipSign): Use WORDS_BIGENDIAN not FLOAT_WORDS_BIG_ENDIAN. * bid/host-ieee128.c: Include dconfig.h. (__host_to_ieee_128, __ieee_to_host_128): Swap 64-bit halves of value if WORDS_BIGENDIAN. libgcc: * Makefile.in (DECNUMINC): Remove -I$(MULTIBUILDTOP)../../libdecnumber. * gstdint.h: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136641 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libdecnumber/bid')
-rw-r--r--libdecnumber/bid/host-ieee128.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/libdecnumber/bid/host-ieee128.c b/libdecnumber/bid/host-ieee128.c
index 6d493e5c9d8..12632c8aab2 100644
--- a/libdecnumber/bid/host-ieee128.c
+++ b/libdecnumber/bid/host-ieee128.c
@@ -29,20 +29,35 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include <string.h>
+#include "dconfig.h"
#include "bid-dpd.h"
#include "decimal128.h"
void __host_to_ieee_128 (_Decimal128 in, decimal128 *out);
void __ieee_to_host_128 (decimal128 in, _Decimal128 *out);
+/* The code for converting 128-bit values between DPD and BID presumes
+ that the 64-bit halves of the 128-bit value are in little-endian
+ order, so they need swapping on big-endian hosts. */
+
void
__host_to_ieee_128 (_Decimal128 in, decimal128 *out)
{
+#if WORDS_BIGENDIAN
+ memcpy ((char *) out, (char *) &in + 8, 8);
+ memcpy ((char *) out + 8, (char *) &in, 8);
+#else
memcpy ((char *) out, (char *) &in, 16);
+#endif
}
void
__ieee_to_host_128 (decimal128 in, _Decimal128 *out)
{
+#if WORDS_BIGENDIAN
+ memcpy ((char *) out, (char *) &in + 8, 8);
+ memcpy ((char *) out + 8, (char *) &in, 8);
+#else
memcpy ((char *) out, (char *) &in, 16);
+#endif
}