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