diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /libdecnumber/bid/decimal64.c | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'libdecnumber/bid/decimal64.c')
-rw-r--r-- | libdecnumber/bid/decimal64.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/libdecnumber/bid/decimal64.c b/libdecnumber/bid/decimal64.c new file mode 100644 index 000000000..fd637388a --- /dev/null +++ b/libdecnumber/bid/decimal64.c @@ -0,0 +1,145 @@ +/* Copyright (C) 2007, 2009 + Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +<http://www.gnu.org/licenses/>. */ + +#define decimal64FromString __dpd64FromString +#define decimal64ToString __dpd64ToString +#define decimal64ToEngString __dpd64ToEngString +#define decimal64FromNumber __dpd64FromNumber +#define decimal64ToNumber __dpd64ToNumber + +#include "dpd/decimal64.c" + +#undef decimal64FromString +#undef decimal64ToString +#undef decimal64ToEngString +#undef decimal64FromNumber +#undef decimal64ToNumber + +#include "bid-dpd.h" + +#ifdef IN_LIBGCC2 +#define decimal64FromString __decimal64FromString +#define decimal64ToString __decimal64ToString +#define decimal64ToEngString __decimal64ToEngString +#define decimal64FromNumber __decimal64FromNumber +#define decimal64ToNumber __decimal64ToNumber +#endif + +decimal64 *decimal64FromString (decimal64 *, const char *, decContext *); +char *decimal64ToString (const decimal64 *, char *); +char *decimal64ToEngString (const decimal64 *, char *); +decimal64 *decimal64FromNumber (decimal64 *, const decNumber *, decContext *); +decNumber *decimal64ToNumber (const decimal64 *, decNumber *); + +void __host_to_ieee_64 (_Decimal64 in, decimal64 *out); +void __ieee_to_host_64 (decimal64 in, _Decimal64 *out); + +decimal64 * +decimal64FromNumber (decimal64 *d64, const decNumber *dn, + decContext *set) +{ + /* decimal64 and _Decimal64 are different types. */ + union + { + _Decimal64 _Dec; + decimal64 dec; + } u; + + __dpd64FromNumber (d64, dn, set); + + /* __dpd64FromNumber returns in big endian. But _dpd_to_bid64 takes + host endian. */ + __ieee_to_host_64 (*d64, &u._Dec); + + /* Convert DPD to BID. */ + _dpd_to_bid64 (&u._Dec, &u._Dec); + + /* dfp.c is in bid endian. */ + __host_to_ieee_64 (u._Dec, &u.dec); + + /* d64 is returned as a pointer to _Decimal64 here. */ + *d64 = u.dec; + + return d64; +} + +decNumber * +decimal64ToNumber (const decimal64 *bid64, decNumber *dn) +{ + /* decimal64 and _Decimal64 are different types. */ + union + { + _Decimal64 _Dec; + decimal64 dec; + } u; + + /* bid64 is a pointer to _Decimal64 in bid endian. But _bid_to_dpd64 + takes host endian. */ + __ieee_to_host_64 (*bid64, &u._Dec); + + /* Convert BID to DPD. */ + _bid_to_dpd64 (&u._Dec, &u._Dec); + + /* __dpd64ToNumber is in bid endian. */ + __host_to_ieee_64 (u._Dec, &u.dec); + + return __dpd64ToNumber (&u.dec, dn); +} + +char * +decimal64ToString (const decimal64 *d64, char *string) +{ + decNumber dn; /* work */ + decimal64ToNumber (d64, &dn); + decNumberToString (&dn, string); + return string; +} + +char * +decimal64ToEngString (const decimal64 *d64, char *string) +{ + decNumber dn; /* work */ + decimal64ToNumber (d64, &dn); + decNumberToEngString (&dn, string); + return string; +} + +decimal64 * +decimal64FromString (decimal64 *result, const char *string, + decContext *set) +{ + decContext dc; /* work */ + decNumber dn; /* .. */ + + decContextDefault (&dc, DEC_INIT_DECIMAL64); /* no traps, please */ + dc.round = set->round; /* use supplied rounding */ + + decNumberFromString (&dn, string, &dc); /* will round if needed */ + decimal64FromNumber (result, &dn, &dc); + if (dc.status != 0) + { /* something happened */ + decContextSetStatus (set, dc.status); /* .. pass it on */ + } + return result; +} |