diff options
author | Michael Meissner <michael.meissner@amd.com> | 2007-03-24 17:04:47 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 2007-03-24 17:04:47 +0000 |
commit | 79b87c74d764bd42703818289685e48996b54eb8 (patch) | |
tree | ec50c8ab7786788a6da7d4f06b0cd93e9555d487 /libdecnumber/bid/decimal32.c | |
parent | cca643862ddb1f61f200b567c667576d39961fb2 (diff) | |
download | gcc-79b87c74d764bd42703818289685e48996b54eb8.zip gcc-79b87c74d764bd42703818289685e48996b54eb8.tar.gz gcc-79b87c74d764bd42703818289685e48996b54eb8.tar.bz2 |
Add BID decimal support
Co-Authored-By: H.J. Lu <hongjiu.lu@intel.com>
Co-Authored-By: Marius Cornea <marius.cornea@intel.com>
From-SVN: r123185
Diffstat (limited to 'libdecnumber/bid/decimal32.c')
-rw-r--r-- | libdecnumber/bid/decimal32.c | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/libdecnumber/bid/decimal32.c b/libdecnumber/bid/decimal32.c new file mode 100644 index 0000000..68e004e --- /dev/null +++ b/libdecnumber/bid/decimal32.c @@ -0,0 +1,148 @@ +/* Copyright (C) 2007 + 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 2, 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. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ + +/* As a special exception, if you link this library with other files, + some of which are compiled with GCC, to produce an executable, + this library does not by itself cause the resulting executable + to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +#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; +} |