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/decimal32.c | |
download | cbb-gcc-4.6.4-15d2061ac0796199866debe9ac87130894b0cdd3.tar.bz2 cbb-gcc-4.6.4-15d2061ac0796199866debe9ac87130894b0cdd3.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/decimal32.c')
-rw-r--r-- | libdecnumber/bid/decimal32.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/libdecnumber/bid/decimal32.c b/libdecnumber/bid/decimal32.c new file mode 100644 index 000000000..1cd760759 --- /dev/null +++ b/libdecnumber/bid/decimal32.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 decimal32FromString __dpd32FromString +#define decimal32ToString __dpd32ToString +#define decimal32ToEngString __dpd32ToEngString +#define decimal32FromNumber __dpd32FromNumber +#define decimal32ToNumber __dpd32ToNumber + +#include "dpd/decimal32.c" + +#undef decimal32FromString +#undef decimal32ToString +#undef decimal32ToEngString +#undef decimal32FromNumber +#undef decimal32ToNumber + +#include "bid-dpd.h" + +#ifdef IN_LIBGCC2 +#define decimal32FromString __decimal32FromString +#define decimal32ToString __decimal32ToString +#define decimal32ToEngString __decimal32ToEngString +#define decimal32FromNumber __decimal32FromNumber +#define decimal32ToNumber __decimal32ToNumber +#endif + +decimal32 *decimal32FromString (decimal32 *, const char *, decContext *); +char *decimal32ToString (const decimal32 *, char *); +char *decimal32ToEngString (const decimal32 *, char *); +decimal32 *decimal32FromNumber (decimal32 *, const decNumber *, decContext *); +decNumber *decimal32ToNumber (const decimal32 *, decNumber *); + +void __host_to_ieee_32 (_Decimal32 in, decimal32 *out); +void __ieee_to_host_32 (decimal32 in, _Decimal32 *out); + +decimal32 * +decimal32FromNumber (decimal32 *d32, const decNumber *dn, + decContext *set) +{ + /* decimal32 and _Decimal32 are different types. */ + union + { + _Decimal32 _Dec; + decimal32 dec; + } u; + + __dpd32FromNumber (d32, dn, set); + + /* __dpd32FromNumber returns in big endian. But _dpd_to_bid32 takes + host endian. */ + __ieee_to_host_32 (*d32, &u._Dec); + + /* Convert DPD to BID. */ + _dpd_to_bid32 (&u._Dec, &u._Dec); + + /* dfp.c is in bid endian. */ + __host_to_ieee_32 (u._Dec, &u.dec); + + /* d32 is returned as a pointer to _Decimal32 here. */ + *d32 = u.dec; + + return d32; +} + +decNumber * +decimal32ToNumber (const decimal32 *bid32, decNumber *dn) +{ + /* decimal32 and _Decimal32 are different types. */ + union + { + _Decimal32 _Dec; + decimal32 dec; + } u; + + /* bid32 is a pointer to _Decimal32 in bid endian. But _bid_to_dpd32 + takes host endian. */ + __ieee_to_host_32 (*bid32, &u._Dec); + + /* Convert BID to DPD. */ + _bid_to_dpd32 (&u._Dec, &u._Dec); + + /* __dpd32ToNumber is in bid endian. */ + __host_to_ieee_32 (u._Dec, &u.dec); + + return __dpd32ToNumber (&u.dec, dn); +} + +char * +decimal32ToString (const decimal32 *d32, char *string) +{ + decNumber dn; /* work */ + decimal32ToNumber (d32, &dn); + decNumberToString (&dn, string); + return string; +} + +char * +decimal32ToEngString (const decimal32 *d32, char *string) +{ + decNumber dn; /* work */ + decimal32ToNumber (d32, &dn); + decNumberToEngString (&dn, string); + return string; +} + +decimal32 * +decimal32FromString (decimal32 *result, const char *string, + decContext *set) +{ + decContext dc; /* work */ + decNumber dn; /* .. */ + + decContextDefault (&dc, DEC_INIT_DECIMAL32); /* no traps, please */ + dc.round = set->round; /* use supplied rounding */ + + decNumberFromString (&dn, string, &dc); /* will round if needed */ + decimal32FromNumber (result, &dn, &dc); + if (dc.status != 0) + { /* something happened */ + decContextSetStatus (set, dc.status); /* .. pass it on */ + } + return result; +} |