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 decimal32FromString __dpd32FromString
     25       1.1  mrg #define decimal32ToString __dpd32ToString
     26       1.1  mrg #define decimal32ToEngString __dpd32ToEngString
     27       1.1  mrg #define decimal32FromNumber __dpd32FromNumber
     28       1.1  mrg #define decimal32ToNumber __dpd32ToNumber
     29       1.1  mrg 
     30       1.1  mrg #include "dpd/decimal32.c"
     31       1.1  mrg 
     32       1.1  mrg #undef decimal32FromString
     33       1.1  mrg #undef decimal32ToString
     34       1.1  mrg #undef decimal32ToEngString
     35       1.1  mrg #undef decimal32FromNumber
     36       1.1  mrg #undef decimal32ToNumber
     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 decimal32FromString __decimal32FromString
     42       1.1  mrg #define decimal32ToString __decimal32ToString
     43       1.1  mrg #define decimal32ToEngString __decimal32ToEngString
     44       1.1  mrg #define decimal32FromNumber __decimal32FromNumber
     45       1.1  mrg #define decimal32ToNumber __decimal32ToNumber
     46       1.1  mrg #endif
     47       1.1  mrg 
     48       1.1  mrg decimal32 *decimal32FromString (decimal32 *, const char *, decContext *);
     49       1.1  mrg char *decimal32ToString (const decimal32 *, char *);
     50       1.1  mrg char *decimal32ToEngString (const decimal32 *, char *);
     51       1.1  mrg decimal32 *decimal32FromNumber (decimal32 *, const decNumber *, decContext *);
     52       1.1  mrg decNumber *decimal32ToNumber (const decimal32 *, decNumber *);
     53       1.1  mrg 
     54       1.1  mrg void __host_to_ieee_32 (_Decimal32 in, decimal32 *out);
     55       1.1  mrg void __ieee_to_host_32 (decimal32 in, _Decimal32 *out);
     56       1.1  mrg 
     57       1.1  mrg decimal32 *
     58       1.1  mrg decimal32FromNumber (decimal32 *d32, const decNumber *dn,
     59       1.1  mrg 		      decContext *set)
     60       1.1  mrg {
     61       1.1  mrg   /* decimal32 and _Decimal32 are different types.  */
     62       1.1  mrg   union
     63       1.1  mrg     {
     64       1.1  mrg       _Decimal32 _Dec;
     65       1.1  mrg       decimal32 dec;
     66       1.1  mrg     } u;
     67       1.1  mrg 
     68       1.1  mrg   __dpd32FromNumber (d32, dn, set);
     69       1.1  mrg 
     70       1.1  mrg   /* __dpd32FromNumber returns in big endian. But _dpd_to_bid32 takes
     71       1.1  mrg      host endian. */
     72       1.1  mrg   __ieee_to_host_32 (*d32, &u._Dec);
     73       1.1  mrg 
     74       1.1  mrg   /* Convert DPD to BID.  */
     75       1.1  mrg   _dpd_to_bid32 (&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_32 (u._Dec, &u.dec);
     79       1.1  mrg 
     80       1.1  mrg   /* d32 is returned as a pointer to _Decimal32 here.  */
     81       1.1  mrg   *d32 = u.dec;
     82       1.1  mrg 
     83       1.1  mrg   return d32;
     84       1.1  mrg }
     85       1.1  mrg 
     86       1.1  mrg decNumber *
     87       1.1  mrg decimal32ToNumber (const decimal32 *bid32, decNumber *dn)
     88       1.1  mrg {
     89       1.1  mrg   /* decimal32 and _Decimal32 are different types.  */
     90       1.1  mrg   union
     91       1.1  mrg     {
     92       1.1  mrg       _Decimal32 _Dec;
     93       1.1  mrg       decimal32 dec;
     94       1.1  mrg     } u;
     95       1.1  mrg 
     96       1.1  mrg   /* bid32 is a pointer to _Decimal32 in bid endian. But _bid_to_dpd32
     97       1.1  mrg      takes host endian.  */
     98       1.1  mrg   __ieee_to_host_32 (*bid32, &u._Dec);
     99       1.1  mrg 
    100       1.1  mrg   /* Convert BID to DPD.  */
    101       1.1  mrg   _bid_to_dpd32 (&u._Dec, &u._Dec);
    102       1.1  mrg 
    103       1.1  mrg   /* __dpd32ToNumber is in bid endian.  */
    104       1.1  mrg   __host_to_ieee_32 (u._Dec, &u.dec);
    105       1.1  mrg 
    106       1.1  mrg   return __dpd32ToNumber (&u.dec, dn);
    107       1.1  mrg }
    108       1.1  mrg 
    109       1.1  mrg char *
    110       1.1  mrg decimal32ToString (const decimal32 *d32, char *string)
    111       1.1  mrg {
    112       1.1  mrg   decNumber dn;			/* work */
    113       1.1  mrg   decimal32ToNumber (d32, &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 decimal32ToEngString (const decimal32 *d32, char *string)
    120       1.1  mrg {
    121       1.1  mrg   decNumber dn;			/* work */
    122       1.1  mrg   decimal32ToNumber (d32, &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 decimal32 *
    128       1.1  mrg decimal32FromString (decimal32 *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_DECIMAL32);	/* 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   decimal32FromNumber (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