Home | History | Annotate | Line # | Download | only in bid
      1  1.1.1.12  mrg /* Copyright (C) 2007-2024 Free Software Foundation, Inc.
      2       1.1  mrg 
      3       1.1  mrg This file is part of GCC.
      4       1.1  mrg 
      5       1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      6       1.1  mrg the terms of the GNU General Public License as published by the Free
      7       1.1  mrg Software Foundation; either version 3, or (at your option) any later
      8       1.1  mrg version.
      9       1.1  mrg 
     10       1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     11       1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     12       1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     13       1.1  mrg for more details.
     14       1.1  mrg 
     15       1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     16       1.1  mrg permissions described in the GCC Runtime Library Exception, version
     17       1.1  mrg 3.1, as published by the Free Software Foundation.
     18       1.1  mrg 
     19       1.1  mrg You should have received a copy of the GNU General Public License and
     20       1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     21       1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     22       1.1  mrg <http://www.gnu.org/licenses/>.  */
     23       1.1  mrg 
     24       1.1  mrg #define decimal64FromString __dpd64FromString
     25       1.1  mrg #define decimal64ToString __dpd64ToString
     26       1.1  mrg #define decimal64ToEngString __dpd64ToEngString
     27       1.1  mrg #define decimal64FromNumber __dpd64FromNumber
     28       1.1  mrg #define decimal64ToNumber __dpd64ToNumber
     29       1.1  mrg 
     30       1.1  mrg #include "dpd/decimal64.c"
     31       1.1  mrg 
     32       1.1  mrg #undef decimal64FromString
     33       1.1  mrg #undef decimal64ToString
     34       1.1  mrg #undef decimal64ToEngString
     35       1.1  mrg #undef decimal64FromNumber
     36       1.1  mrg #undef decimal64ToNumber
     37       1.1  mrg 
     38       1.1  mrg #include "bid-dpd.h"
     39       1.1  mrg 
     40       1.1  mrg #ifdef IN_LIBGCC2
     41       1.1  mrg #define decimal64FromString __decimal64FromString
     42       1.1  mrg #define decimal64ToString __decimal64ToString
     43       1.1  mrg #define decimal64ToEngString __decimal64ToEngString
     44       1.1  mrg #define decimal64FromNumber __decimal64FromNumber
     45       1.1  mrg #define decimal64ToNumber __decimal64ToNumber
     46       1.1  mrg #endif
     47       1.1  mrg 
     48       1.1  mrg decimal64 *decimal64FromString (decimal64 *, const char *, decContext *);
     49       1.1  mrg char *decimal64ToString (const decimal64 *, char *);
     50       1.1  mrg char *decimal64ToEngString (const decimal64 *, char *);
     51       1.1  mrg decimal64 *decimal64FromNumber (decimal64 *, const decNumber *, decContext *);
     52       1.1  mrg decNumber *decimal64ToNumber (const decimal64 *, decNumber *);
     53       1.1  mrg 
     54       1.1  mrg void __host_to_ieee_64 (_Decimal64 in, decimal64 *out);
     55       1.1  mrg void __ieee_to_host_64 (decimal64 in, _Decimal64 *out);
     56       1.1  mrg 
     57       1.1  mrg decimal64 *
     58       1.1  mrg decimal64FromNumber (decimal64 *d64, const decNumber *dn,
     59       1.1  mrg 		      decContext *set)
     60       1.1  mrg {
     61       1.1  mrg   /* decimal64 and _Decimal64 are different types.  */
     62       1.1  mrg   union
     63       1.1  mrg     {
     64       1.1  mrg       _Decimal64 _Dec;
     65       1.1  mrg       decimal64 dec;
     66       1.1  mrg     } u;
     67       1.1  mrg 
     68       1.1  mrg   __dpd64FromNumber (d64, dn, set);
     69       1.1  mrg 
     70       1.1  mrg   /* __dpd64FromNumber returns in big endian. But _dpd_to_bid64 takes
     71       1.1  mrg      host endian. */
     72       1.1  mrg   __ieee_to_host_64 (*d64, &u._Dec);
     73       1.1  mrg 
     74       1.1  mrg   /* Convert DPD to BID.  */
     75       1.1  mrg   _dpd_to_bid64 (&u._Dec, &u._Dec);
     76       1.1  mrg 
     77       1.1  mrg   /* dfp.c is in bid endian. */
     78       1.1  mrg   __host_to_ieee_64 (u._Dec, &u.dec);
     79       1.1  mrg 
     80       1.1  mrg   /* d64 is returned as a pointer to _Decimal64 here.  */
     81       1.1  mrg   *d64 = u.dec;
     82       1.1  mrg 
     83       1.1  mrg   return d64;
     84       1.1  mrg }
     85       1.1  mrg 
     86       1.1  mrg decNumber *
     87       1.1  mrg decimal64ToNumber (const decimal64 *bid64, decNumber *dn)
     88       1.1  mrg {
     89       1.1  mrg   /* decimal64 and _Decimal64 are different types.  */
     90       1.1  mrg   union
     91       1.1  mrg     {
     92       1.1  mrg       _Decimal64 _Dec;
     93       1.1  mrg       decimal64 dec;
     94       1.1  mrg     } u;
     95       1.1  mrg 
     96       1.1  mrg   /* bid64 is a pointer to _Decimal64 in bid endian. But _bid_to_dpd64
     97       1.1  mrg      takes host endian.  */
     98       1.1  mrg   __ieee_to_host_64 (*bid64, &u._Dec);
     99       1.1  mrg 
    100       1.1  mrg   /* Convert BID to DPD.  */
    101       1.1  mrg   _bid_to_dpd64 (&u._Dec, &u._Dec);
    102       1.1  mrg 
    103       1.1  mrg   /* __dpd64ToNumber is in bid endian.  */
    104       1.1  mrg   __host_to_ieee_64 (u._Dec, &u.dec);
    105       1.1  mrg 
    106       1.1  mrg   return __dpd64ToNumber (&u.dec, dn);
    107       1.1  mrg }
    108       1.1  mrg 
    109       1.1  mrg char *
    110       1.1  mrg decimal64ToString (const decimal64 *d64, char *string)
    111       1.1  mrg {
    112       1.1  mrg   decNumber dn;			/* work */
    113       1.1  mrg   decimal64ToNumber (d64, &dn);
    114       1.1  mrg   decNumberToString (&dn, string);
    115       1.1  mrg   return string;
    116       1.1  mrg }
    117       1.1  mrg 
    118       1.1  mrg char *
    119       1.1  mrg decimal64ToEngString (const decimal64 *d64, char *string)
    120       1.1  mrg {
    121       1.1  mrg   decNumber dn;			/* work */
    122       1.1  mrg   decimal64ToNumber (d64, &dn);
    123       1.1  mrg   decNumberToEngString (&dn, string);
    124       1.1  mrg   return string;
    125       1.1  mrg }
    126       1.1  mrg 
    127       1.1  mrg decimal64 *
    128       1.1  mrg decimal64FromString (decimal64 *result, const char *string,
    129       1.1  mrg 		      decContext *set)
    130       1.1  mrg {
    131       1.1  mrg   decContext dc;		/* work */
    132       1.1  mrg   decNumber dn;			/* .. */
    133       1.1  mrg 
    134       1.1  mrg   decContextDefault (&dc, DEC_INIT_DECIMAL64);	/* no traps, please */
    135       1.1  mrg   dc.round = set->round;	/* use supplied rounding */
    136       1.1  mrg 
    137       1.1  mrg   decNumberFromString (&dn, string, &dc);	/* will round if needed */
    138       1.1  mrg   decimal64FromNumber (result, &dn, &dc);
    139       1.1  mrg   if (dc.status != 0)
    140       1.1  mrg     {				/* something happened */
    141       1.1  mrg       decContextSetStatus (set, dc.status);	/* .. pass it on */
    142       1.1  mrg     }
    143       1.1  mrg   return result;
    144       1.1  mrg }
    145