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