xref: /netbsd-src/external/gpl3/gcc/dist/libgcc/dfp-bit.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Header file for dfp-bit.c.
2    Copyright (C) 2005-2022 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19 
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 <http://www.gnu.org/licenses/>.  */
24 
25 #ifndef _DFPBIT_H
26 #define _DFPBIT_H
27 
28 #include <float.h>
29 #include <fenv.h>
30 #include <decRound.h>
31 #include <decExcept.h>
32 #include "tconfig.h"
33 #include "coretypes.h"
34 #include "tm.h"
35 #include "libgcc_tm.h"
36 
37 /* We need to know the size of long double that the C library supports.
38    Don't use LIBGCC2_HAS_XF_MODE or LIBGCC2_HAS_TF_MODE here because
39    some targets set both of those.  */
40 
41 #ifndef __LIBGCC_XF_MANT_DIG__
42 #define __LIBGCC_XF_MANT_DIG__ 0
43 #endif
44 #define LONG_DOUBLE_HAS_XF_MODE \
45   (__LDBL_MANT_DIG__ == __LIBGCC_XF_MANT_DIG__)
46 
47 #ifndef __LIBGCC_TF_MANT_DIG__
48 #define __LIBGCC_TF_MANT_DIG__ 0
49 #endif
50 #define LONG_DOUBLE_HAS_TF_MODE \
51   (__LDBL_MANT_DIG__ == __LIBGCC_TF_MANT_DIG__)
52 
53 /* Depending on WIDTH, define a number of macros:
54 
55    DFP_C_TYPE: type of the arguments to the libgcc functions;
56 	(eg _Decimal32)
57 
58    IEEE_TYPE: the corresponding (encoded) IEEE754 type;
59 	(eg decimal32)
60 
61    TO_INTERNAL: the name of the decNumber function to convert an
62    encoded value into the decNumber internal representation;
63 
64    TO_ENCODED: the name of the decNumber function to convert an
65    internally represented decNumber into the encoded
66    representation.
67 
68    FROM_STRING: the name of the decNumber function to read an
69    encoded value from a string.
70 
71    TO_STRING: the name of the decNumber function to write an
72    encoded value to a string.  */
73 
74 #if WIDTH == 32
75 #define DFP_C_TYPE	_Decimal32
76 #define IEEE_TYPE	decimal32
77 #define HOST_TO_IEEE	__host_to_ieee_32
78 #define IEEE_TO_HOST	__ieee_to_host_32
79 #define TO_INTERNAL	__decimal32ToNumber
80 #define TO_ENCODED	__decimal32FromNumber
81 #define FROM_STRING	__decimal32FromString
82 #define TO_STRING	__decimal32ToString
83 #elif WIDTH == 64
84 #define DFP_C_TYPE	_Decimal64
85 #define IEEE_TYPE	decimal64
86 #define HOST_TO_IEEE	__host_to_ieee_64
87 #define IEEE_TO_HOST	__ieee_to_host_64
88 #define TO_INTERNAL	__decimal64ToNumber
89 #define TO_ENCODED	__decimal64FromNumber
90 #define FROM_STRING	__decimal64FromString
91 #define TO_STRING	__decimal64ToString
92 #elif WIDTH == 128
93 #define DFP_C_TYPE	_Decimal128
94 #define IEEE_TYPE	decimal128
95 #define HOST_TO_IEEE	__host_to_ieee_128
96 #define IEEE_TO_HOST	__ieee_to_host_128
97 #define TO_INTERNAL	__decimal128ToNumber
98 #define TO_ENCODED	__decimal128FromNumber
99 #define FROM_STRING	__decimal128FromString
100 #define TO_STRING	__decimal128ToString
101 #else
102 #error invalid decimal float word width
103 #endif
104 
105 /* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
106    operations and constants to the range and precision of the _Decimal128
107    type.  Make it so.  */
108 #if WIDTH == 32
109 #define CONTEXT_INIT DEC_INIT_DECIMAL32
110 #elif WIDTH == 64
111 #define CONTEXT_INIT DEC_INIT_DECIMAL64
112 #elif WIDTH == 128
113 #define CONTEXT_INIT DEC_INIT_DECIMAL128
114 #endif
115 
116 #ifndef DFP_INIT_ROUNDMODE
117 #define DFP_INIT_ROUNDMODE(A) A = DEC_ROUND_HALF_EVEN
118 #endif
119 
120 #ifdef DFP_EXCEPTIONS_ENABLED
121 /* Return IEEE exception flags based on decNumber status flags.  */
122 #define DFP_IEEE_FLAGS(DEC_FLAGS) __extension__			\
123 ({int _fe_flags = 0;						\
124   if ((dec_flags & DEC_IEEE_854_Division_by_zero) != 0)		\
125     _fe_flags |= FE_DIVBYZERO;					\
126   if ((dec_flags & DEC_IEEE_854_Inexact) != 0)			\
127     _fe_flags |= FE_INEXACT;					\
128   if ((dec_flags & DEC_IEEE_854_Invalid_operation) != 0)	\
129     _fe_flags |= FE_INVALID;					\
130   if ((dec_flags & DEC_IEEE_854_Overflow) != 0)			\
131     _fe_flags |= FE_OVERFLOW;					\
132   if ((dec_flags & DEC_IEEE_854_Underflow) != 0)		\
133     _fe_flags |= FE_UNDERFLOW;					\
134   _fe_flags; })
135 #else
136 #define DFP_EXCEPTIONS_ENABLED 0
137 #define DFP_IEEE_FLAGS(A) 0
138 #define DFP_HANDLE_EXCEPTIONS(A) do {} while (0)
139 #endif
140 
141 /* Conversions between different decimal float types use WIDTH_TO to
142    determine additional macros to define.  */
143 
144 #if defined (L_dd_to_sd) || defined (L_td_to_sd)
145 #define WIDTH_TO 32
146 #elif defined (L_sd_to_dd) || defined (L_td_to_dd)
147 #define WIDTH_TO 64
148 #elif defined (L_sd_to_td) || defined (L_dd_to_td)
149 #define WIDTH_TO 128
150 #endif
151 
152 /* If WIDTH_TO is defined, define additional macros:
153 
154    DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
155 
156    IEEE_TYPE_TO: the corresponding (encoded) IEEE754 type.
157 
158    TO_ENCODED_TO: the name of the decNumber function to convert an
159    internally represented decNumber into the encoded representation
160    for the destination.  */
161 
162 #if WIDTH_TO == 32
163 #define DFP_C_TYPE_TO	_Decimal32
164 #define IEEE_TYPE_TO	decimal32
165 #define TO_ENCODED_TO	__decimal32FromNumber
166 #define IEEE_TO_HOST_TO __ieee_to_host_32
167 #elif WIDTH_TO == 64
168 #define DFP_C_TYPE_TO	_Decimal64
169 #define IEEE_TYPE_TO	decimal64
170 #define TO_ENCODED_TO	__decimal64FromNumber
171 #define IEEE_TO_HOST_TO __ieee_to_host_64
172 #elif WIDTH_TO == 128
173 #define DFP_C_TYPE_TO	_Decimal128
174 #define IEEE_TYPE_TO	decimal128
175 #define TO_ENCODED_TO	__decimal128FromNumber
176 #define IEEE_TO_HOST_TO __ieee_to_host_128
177 #endif
178 
179 /* Conversions between decimal float types and integral types use INT_KIND
180    to determine the data type and C functions to use.  */
181 
182 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si)  \
183    || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
184 #define INT_KIND 1
185 #elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
186    || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
187 #define INT_KIND 2
188 #elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
189    || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
190 #define INT_KIND 3
191 #elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
192    || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
193 #define INT_KIND 4
194 #endif
195 
196 /*  If INT_KIND is defined, define additional macros:
197 
198     INT_TYPE: The integer data type.
199 
200     INT_FMT: The format string for writing the integer to a string.
201 
202     CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
203     This works for ILP32 and LP64, won't for other type size systems.
204 
205     STR_TO_INT: The function to read the integer from a string.  */
206 
207 #if INT_KIND == 1
208 #define INT_TYPE SItype
209 #define INT_FMT "%d"
210 #define CAST_FOR_FMT(A) (int)A
211 #define STR_TO_INT strtol
212 #elif INT_KIND == 2
213 #define INT_TYPE DItype
214 #define INT_FMT "%lld"
215 #define CAST_FOR_FMT(A) (long long)A
216 #define STR_TO_INT strtoll
217 #elif INT_KIND == 3
218 #define INT_TYPE USItype
219 #define INT_FMT "%u"
220 #define CAST_FOR_FMT(A) (unsigned int)A
221 #define STR_TO_INT strtoul
222 #elif INT_KIND == 4
223 #define INT_TYPE UDItype
224 #define INT_FMT "%llu"
225 #define CAST_FOR_FMT(A) (unsigned long long)A
226 #define STR_TO_INT strtoull
227 #endif
228 
229 /* Conversions between decimal float types and binary float types use
230    BFP_KIND to determine the data type and C functions to use.  */
231 
232 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
233  || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
234 #define BFP_KIND 1
235 #elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
236  ||   defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
237 #define BFP_KIND 2
238 #elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
239  ||   defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
240 #define BFP_KIND 3
241 #elif defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf) \
242  ||   defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)
243 #define BFP_KIND 4
244 #elif defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
245  ||   defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
246 #define BFP_KIND 5
247 #endif
248 
249 /*  If BFP_KIND is defined, define additional macros:
250 
251     BFP_TYPE: The binary floating point data type.
252 
253     BFP_FMT: The format string for writing the value to a string.
254     The number of decimal digits printed is
255        ceil (nbits / log2 (10.) + 1)
256     as described in David Matula's CACM 19(3) 716-723 June 1968 paper.
257 
258     BFP_VIA_TYPE: Type to which to cast a variable of BPF_TYPE for a
259     call to sprintf.
260 
261     STR_TO_BFP: The function to read the value from a string.  */
262 
263 #if BFP_KIND == 1
264 #define BFP_TYPE SFtype
265 #define BFP_FMT "%.9e"
266 #define BFP_VIA_TYPE double
267 #define STR_TO_BFP strtof
268 
269 #elif BFP_KIND == 2
270 #define BFP_TYPE DFtype
271 #define BFP_FMT "%.17e"
272 #define BFP_VIA_TYPE double
273 #define STR_TO_BFP strtod
274 
275 #elif BFP_KIND == 3
276 #if LONG_DOUBLE_HAS_XF_MODE
277 #define BFP_TYPE XFtype
278 #define BFP_FMT "%.21Le"
279 #define BFP_VIA_TYPE long double
280 #define STR_TO_BFP strtold
281 #endif /* LONG_DOUBLE_HAS_XF_MODE */
282 
283 #elif BFP_KIND == 4
284 #if LONG_DOUBLE_HAS_TF_MODE
285 #define BFP_TYPE TFtype
286 #if LDBL_MANT_DIG == 106
287 #define BFP_FMT "%.33Le"
288 #elif LDBL_MANT_DIG == 113
289 #define BFP_FMT "%.36Le"
290 #else
291 #error "unknown long double size, cannot define BFP_FMT"
292 #endif /* LDBL_MANT_DIG */
293 #define STR_TO_BFP strtold
294 #define BFP_VIA_TYPE long double
295 #endif /* LONG_DOUBLE_HAS_TF_MODE */
296 
297 #elif BFP_KIND == 5
298 #define BFP_TYPE _Float128
299 #define BFP_FMT "%.36Le"
300 #define BFP_VIA_TYPE _Float128
301 #define STR_TO_BFP __strtoieee128
302 extern _Float128 __strtoieee128 (const char *, char **);
303 
304 #endif /* BFP_KIND */
305 
306 #if WIDTH == 128 || WIDTH_TO == 128
307 #include "decimal128.h"
308 #include "decQuad.h"
309 #endif
310 #if WIDTH == 64 || WIDTH_TO == 64
311 #include "decimal64.h"
312 #include "decDouble.h"
313 #endif
314 #if WIDTH == 32 || WIDTH_TO == 32
315 #include "decimal32.h"
316 #include "decSingle.h"
317 #endif
318 #include "decNumber.h"
319 
320 /* Names of arithmetic functions.  */
321 
322 #if ENABLE_DECIMAL_BID_FORMAT
323 #define DPD_BID_NAME(DPD,BID) BID
324 #else
325 #define DPD_BID_NAME(DPD,BID) DPD
326 #endif
327 
328 #if WIDTH == 32
329 #define DFP_ADD		DPD_BID_NAME(__dpd_addsd3,__bid_addsd3)
330 #define DFP_SUB		DPD_BID_NAME(__dpd_subsd3,__bid_subsd3)
331 #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_mulsd3,__bid_mulsd3)
332 #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divsd3,__bid_divsd3)
333 #define DFP_EQ		DPD_BID_NAME(__dpd_eqsd2,__bid_eqsd2)
334 #define DFP_NE		DPD_BID_NAME(__dpd_nesd2,__bid_nesd2)
335 #define DFP_LT		DPD_BID_NAME(__dpd_ltsd2,__bid_ltsd2)
336 #define DFP_GT		DPD_BID_NAME(__dpd_gtsd2,__bid_gtsd2)
337 #define DFP_LE		DPD_BID_NAME(__dpd_lesd2,__bid_lesd2)
338 #define DFP_GE		DPD_BID_NAME(__dpd_gesd2,__bid_gesd2)
339 #define DFP_UNORD	DPD_BID_NAME(__dpd_unordsd2,__bid_unordsd2)
340 #elif WIDTH == 64
341 #define DFP_ADD		DPD_BID_NAME(__dpd_adddd3,__bid_adddd3)
342 #define DFP_SUB		DPD_BID_NAME(__dpd_subdd3,__bid_subdd3)
343 #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_muldd3,__bid_muldd3)
344 #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divdd3,__bid_divdd3)
345 #define DFP_EQ		DPD_BID_NAME(__dpd_eqdd2,__bid_eqdd2)
346 #define DFP_NE		DPD_BID_NAME(__dpd_nedd2,__bid_nedd2)
347 #define DFP_LT		DPD_BID_NAME(__dpd_ltdd2,__bid_ltdd2)
348 #define DFP_GT		DPD_BID_NAME(__dpd_gtdd2,__bid_gtdd2)
349 #define DFP_LE		DPD_BID_NAME(__dpd_ledd2,__bid_ledd2)
350 #define DFP_GE		DPD_BID_NAME(__dpd_gedd2,__bid_gedd2)
351 #define DFP_UNORD	DPD_BID_NAME(__dpd_unorddd2,__bid_unorddd2)
352 #elif WIDTH == 128
353 #define DFP_ADD		DPD_BID_NAME(__dpd_addtd3,__bid_addtd3)
354 #define DFP_SUB		DPD_BID_NAME(__dpd_subtd3,__bid_subtd3)
355 #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_multd3,__bid_multd3)
356 #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divtd3,__bid_divtd3)
357 #define DFP_EQ		DPD_BID_NAME(__dpd_eqtd2,__bid_eqtd2)
358 #define DFP_NE		DPD_BID_NAME(__dpd_netd2,__bid_netd2)
359 #define DFP_LT		DPD_BID_NAME(__dpd_lttd2,__bid_lttd2)
360 #define DFP_GT		DPD_BID_NAME(__dpd_gttd2,__bid_gttd2)
361 #define DFP_LE		DPD_BID_NAME(__dpd_letd2,__bid_letd2)
362 #define DFP_GE		DPD_BID_NAME(__dpd_getd2,__bid_getd2)
363 #define DFP_UNORD	DPD_BID_NAME(__dpd_unordtd2,__bid_unordtd2)
364 #endif
365 
366 /* Names of decNumber functions for DPD arithmetic.  */
367 
368 #if WIDTH == 32
369 #define decFloat		decDouble
370 #define DFP_BINARY_OP		d32_binary_op
371 #define DFP_COMPARE_OP		d32_compare_op
372 #define DEC_FLOAT_ADD		decDoubleAdd
373 #define DEC_FLOAT_SUBTRACT	decDoubleSubtract
374 #define DEC_FLOAT_MULTIPLY	decDoubleMultiply
375 #define DEC_FLOAT_DIVIDE	decDoubleDivide
376 #define DEC_FLOAT_COMPARE	decDoubleCompare
377 #define DEC_FLOAT_IS_ZERO	decDoubleIsZero
378 #define DEC_FLOAT_IS_NAN	decDoubleIsNaN
379 #define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
380 #elif WIDTH == 64
381 #define DFP_BINARY_OP		dnn_binary_op
382 #define DFP_COMPARE_OP		dnn_compare_op
383 #define decFloat		decDouble
384 #define DEC_FLOAT_ADD		decDoubleAdd
385 #define DEC_FLOAT_SUBTRACT	decDoubleSubtract
386 #define DEC_FLOAT_MULTIPLY	decDoubleMultiply
387 #define DEC_FLOAT_DIVIDE	decDoubleDivide
388 #define DEC_FLOAT_COMPARE	decDoubleCompare
389 #define DEC_FLOAT_IS_ZERO	decDoubleIsZero
390 #define DEC_FLOAT_IS_NAN	decDoubleIsNaN
391 #define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
392 #elif WIDTH == 128
393 #define DFP_BINARY_OP		dnn_binary_op
394 #define DFP_COMPARE_OP		dnn_compare_op
395 #define decFloat		decQuad
396 #define DEC_FLOAT_ADD		decQuadAdd
397 #define DEC_FLOAT_SUBTRACT	decQuadSubtract
398 #define DEC_FLOAT_MULTIPLY	decQuadMultiply
399 #define DEC_FLOAT_DIVIDE	decQuadDivide
400 #define DEC_FLOAT_COMPARE	decQuadCompare
401 #define DEC_FLOAT_IS_ZERO	decQuadIsZero
402 #define DEC_FLOAT_IS_NAN	decQuadIsNaN
403 #define DEC_FLOAT_IS_SIGNED	decQuadIsSigned
404 #endif
405 
406 /* Names of functions to convert between different decimal float types.  */
407 
408 #if WIDTH == 32
409 #if WIDTH_TO == 64
410 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsddd2,__bid_extendsddd2)
411 #elif WIDTH_TO == 128
412 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsdtd2,__bid_extendsdtd2)
413 #endif
414 #elif WIDTH == 64
415 #if WIDTH_TO == 32
416 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_truncddsd2,__bid_truncddsd2)
417 #elif WIDTH_TO == 128
418 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendddtd2,__bid_extendddtd2)
419 #endif
420 #elif WIDTH == 128
421 #if WIDTH_TO == 32
422 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctdsd2,__bid_trunctdsd2)
423 #elif WIDTH_TO == 64
424 #define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctddd2,__bid_trunctddd2)
425 #endif
426 #endif
427 
428 /* Names of functions to convert between decimal float and integers.  */
429 
430 #if WIDTH == 32
431 #if INT_KIND == 1
432 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsisd,__bid_floatsisd)
433 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsdsi,__bid_fixsdsi)
434 #define DEC_FLOAT_FROM_INT decDoubleFromInt32
435 #define DEC_FLOAT_TO_INT   decDoubleToInt32
436 #elif INT_KIND == 2
437 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdisd,__bid_floatdisd)
438 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsddi,__bid_fixsddi)
439 #elif INT_KIND == 3
440 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssisd,__bid_floatunssisd)
441 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssdsi,__bid_fixunssdsi)
442 #define DEC_FLOAT_FROM_INT decDoubleFromUInt32
443 #define DEC_FLOAT_TO_INT   decDoubleToUInt32
444 #elif INT_KIND == 4
445 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdisd,__bid_floatunsdisd)
446 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssddi,__bid_fixunssddi)
447 #endif
448 #elif WIDTH == 64
449 #define decFloat	decDouble
450 #if INT_KIND == 1
451 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsidd,__bid_floatsidd)
452 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixddsi,__bid_fixddsi)
453 #define DEC_FLOAT_FROM_INT decDoubleFromInt32
454 #define DEC_FLOAT_TO_INT   decDoubleToInt32
455 #elif INT_KIND == 2
456 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdidd,__bid_floatdidd)
457 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixdddi,__bid_fixdddi)
458 #elif INT_KIND == 3
459 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssidd,__bid_floatunssidd)
460 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsddsi,__bid_fixunsddsi)
461 #define DEC_FLOAT_FROM_INT decDoubleFromUInt32
462 #define DEC_FLOAT_TO_INT   decDoubleToUInt32
463 #elif INT_KIND == 4
464 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdidd,__bid_floatunsdidd)
465 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsdddi,__bid_fixunsdddi)
466 #endif
467 #elif WIDTH == 128
468 #define decFloat	decQuad
469 #if INT_KIND == 1
470 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsitd,__bid_floatsitd)
471 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtdsi,__bid_fixtdsi)
472 #define DEC_FLOAT_FROM_INT decQuadFromInt32
473 #define DEC_FLOAT_TO_INT   decQuadToInt32
474 #elif INT_KIND == 2
475 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatditd,__bid_floatditd)
476 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtddi,__bid_fixtddi)
477 #elif INT_KIND == 3
478 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssitd,__bid_floatunssitd)
479 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstdsi,__bid_fixunstdsi)
480 #define DEC_FLOAT_FROM_INT decQuadFromUInt32
481 #define DEC_FLOAT_TO_INT   decQuadToUInt32
482 #elif INT_KIND == 4
483 #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsditd,__bid_floatunsditd)
484 #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstddi,__bid_fixunstddi)
485 #endif
486 #endif
487 
488 /* Names of functions to convert between decimal float and binary float.  */
489 
490 #if WIDTH == 32
491 #if BFP_KIND == 1
492 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfsd,__bid_extendsfsd)
493 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncsdsf,__bid_truncsdsf)
494 #elif BFP_KIND == 2
495 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncdfsd,__bid_truncdfsd)
496 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsddf,__bid_extendsddf)
497 #elif BFP_KIND == 3
498 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfsd,__bid_truncxfsd)
499 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdxf,__bid_extendsdxf)
500 #elif BFP_KIND == 4
501 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfsd,__bid_trunctfsd)
502 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdtf,__bid_extendsdtf)
503 #elif BFP_KIND == 5
504 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunckfsd,__bid_trunckfsd)
505 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdkf,__bid_extendsdkf)
506 #endif /* BFP_KIND */
507 
508 #elif WIDTH == 64
509 #if BFP_KIND == 1
510 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfdd,__bid_extendsfdd)
511 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncddsf,__bid_truncddsf)
512 #elif BFP_KIND == 2
513 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddfdd,__bid_extenddfdd)
514 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncdddf,__bid_truncdddf)
515 #elif BFP_KIND == 3
516 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfdd,__bid_truncxfdd)
517 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddxf,__bid_extendddxf)
518 #elif BFP_KIND == 4
519 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfdd,__bid_trunctfdd)
520 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddtf,__bid_extendddtf)
521 #elif BFP_KIND == 5
522 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunckfdd,__bid_trunckfdd)
523 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddkf,__bid_extendddkf)
524 #endif /* BFP_KIND */
525 
526 #elif WIDTH == 128
527 #if BFP_KIND == 1
528 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsftd,__bid_extendsftd)
529 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdsf,__bid_trunctdsf)
530 #elif BFP_KIND == 2
531 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddftd,__bid_extenddftd)
532 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctddf,__bid_trunctddf)
533 #elif BFP_KIND == 3
534 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendxftd,__bid_extendxftd)
535 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdxf,__bid_trunctdxf)
536 #elif BFP_KIND == 4
537 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendtftd,__bid_extendtftd)
538 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdtf,__bid_trunctdtf)
539 #elif BFP_KIND == 5
540 #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendkftd,__bid_extendkftd)
541 #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdkf,__bid_trunctdkf)
542 #endif /* BFP_KIND */
543 
544 #endif /* WIDTH */
545 
546 /* Some handy typedefs.  */
547 
548 typedef float SFtype __attribute__ ((mode (SF)));
549 typedef float DFtype __attribute__ ((mode (DF)));
550 #if LONG_DOUBLE_HAS_XF_MODE
551 typedef float XFtype __attribute__ ((mode (XF)));
552 #endif /* LONG_DOUBLE_HAS_XF_MODE */
553 #if LONG_DOUBLE_HAS_TF_MODE
554 typedef float TFtype __attribute__ ((mode (TF)));
555 #endif /* LONG_DOUBLE_HAS_TF_MODE */
556 
557 typedef int SItype __attribute__ ((mode (SI)));
558 typedef int DItype __attribute__ ((mode (DI)));
559 typedef unsigned int USItype __attribute__ ((mode (SI)));
560 typedef unsigned int UDItype __attribute__ ((mode (DI)));
561 
562 /* The type of the result of a decimal float comparison.  This must
563    match `__libgcc_cmp_return__' in GCC for the target.  */
564 
565 typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
566 
567 /* Prototypes.  */
568 
569 #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
570 extern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
571 #endif
572 
573 #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
574 extern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
575 #endif
576 
577 #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
578 extern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
579 extern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
580 #endif
581 
582 #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
583 extern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
584 #endif
585 
586 #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
587 extern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
588 #endif
589 
590 #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
591 extern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
592 #endif
593 
594 #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
595 extern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
596 #endif
597 
598 #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
599 extern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
600 #endif
601 
602 #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
603 extern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
604 #endif
605 
606 #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
607 extern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
608 #endif
609 
610 #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
611  || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
612 extern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
613 #endif
614 
615 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
616  || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
617  || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
618  || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
619 extern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
620 #endif
621 
622 #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
623  || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
624  || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
625  || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
626 extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
627 #endif
628 
629 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
630  || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
631  || defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
632  || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
633      && LONG_DOUBLE_HAS_XF_MODE) \
634  || ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
635      && LONG_DOUBLE_HAS_TF_MODE)
636 extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
637 #endif
638 
639 #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
640  || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
641  || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
642      && LONG_DOUBLE_HAS_XF_MODE) \
643  || ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
644      && LONG_DOUBLE_HAS_TF_MODE)
645 extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
646 #define BFP_SPRINTF sprintf
647 
648 #elif defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
649 extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
650 extern int __sprintfieee128 (char *restrict, const char *restrict, ...);
651 #define BFP_SPRINTF __sprintfieee128
652 #endif
653 
654 #endif /* _DFPBIT_H */
655