1 /* Header file for dfp-bit.c.
2 Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
4 This file is part of GCC.
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 2, or (at your option) any later
11 In addition to the permissions in the GNU General Public License, the
12 Free Software Foundation gives you unlimited permission to link the
13 compiled version of this file into combinations with other programs,
14 and to distribute those combinations without any restriction coming
15 from the use of this file. (The General Public License restrictions
16 do apply in other respects; for example, they cover modification of
17 the file, and distribution when not linked into a combine
20 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
21 WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 You should have received a copy of the GNU General Public License
26 along with GCC; see the file COPYING. If not, write to the Free
27 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
36 #include <decExcept.h>
38 #include "coretypes.h"
41 #ifndef LIBGCC2_WORDS_BIG_ENDIAN
42 #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
45 #ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
46 #define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
49 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
50 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
53 /* We need to know the size of long double that the C library supports.
54 Don't use LIBGCC2_HAS_XF_MODE or LIBGCC2_HAS_TF_MODE here because
55 some targets set both of those. */
57 #define LONG_DOUBLE_HAS_XF_MODE \
58 (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
60 #define LONG_DOUBLE_HAS_TF_MODE \
61 (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
63 /* Depending on WIDTH, define a number of macros:
65 DFP_C_TYPE: type of the arguments to the libgcc functions;
68 IEEE_TYPE: the corresponding (encoded) IEEE754 type;
71 TO_INTERNAL: the name of the decNumber function to convert an
72 encoded value into the decNumber internal representation;
74 TO_ENCODED: the name of the decNumber function to convert an
75 internally represented decNumber into the encoded
78 FROM_STRING: the name of the decNumber function to read an
79 encoded value from a string.
81 TO_STRING: the name of the decNumber function to write an
82 encoded value to a string. */
85 #define DFP_C_TYPE _Decimal32
86 #define IEEE_TYPE decimal32
87 #define HOST_TO_IEEE __host_to_ieee_32
88 #define IEEE_TO_HOST __ieee_to_host_32
89 #define TO_INTERNAL __decimal32ToNumber
90 #define TO_ENCODED __decimal32FromNumber
91 #define FROM_STRING __decimal32FromString
92 #define TO_STRING __decimal32ToString
94 #define DFP_C_TYPE _Decimal64
95 #define IEEE_TYPE decimal64
96 #define HOST_TO_IEEE __host_to_ieee_64
97 #define IEEE_TO_HOST __ieee_to_host_64
98 #define TO_INTERNAL __decimal64ToNumber
99 #define TO_ENCODED __decimal64FromNumber
100 #define FROM_STRING __decimal64FromString
101 #define TO_STRING __decimal64ToString
103 #define DFP_C_TYPE _Decimal128
104 #define IEEE_TYPE decimal128
105 #define HOST_TO_IEEE __host_to_ieee_128
106 #define IEEE_TO_HOST __ieee_to_host_128
107 #define TO_INTERNAL __decimal128ToNumber
108 #define TO_ENCODED __decimal128FromNumber
109 #define FROM_STRING __decimal128FromString
110 #define TO_STRING __decimal128ToString
112 #error invalid decimal float word width
115 /* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
116 operations and constants to the range and precision of the _Decimal128
119 #define CONTEXT_INIT DEC_INIT_DECIMAL32
121 #define CONTEXT_INIT DEC_INIT_DECIMAL64
123 #define CONTEXT_INIT DEC_INIT_DECIMAL128
126 #ifndef DFP_INIT_ROUNDMODE
127 #define DFP_INIT_ROUNDMODE(A) A = DEC_ROUND_HALF_EVEN
130 #ifdef DFP_EXCEPTIONS_ENABLED
131 /* Return IEEE exception flags based on decNumber status flags. */
132 #define DFP_IEEE_FLAGS(DEC_FLAGS) __extension__ \
133 ({int _fe_flags = 0; \
134 if ((dec_flags & DEC_IEEE_854_Division_by_zero) != 0) \
135 _fe_flags |= FE_DIVBYZERO; \
136 if ((dec_flags & DEC_IEEE_854_Inexact) != 0) \
137 _fe_flags |= FE_INEXACT; \
138 if ((dec_flags & DEC_IEEE_854_Invalid_operation) != 0) \
139 _fe_flags |= FE_INVALID; \
140 if ((dec_flags & DEC_IEEE_854_Overflow) != 0) \
141 _fe_flags |= FE_OVERFLOW; \
142 if ((dec_flags & DEC_IEEE_854_Underflow) != 0) \
143 _fe_flags |= FE_UNDERFLOW; \
146 #define DFP_EXCEPTIONS_ENABLED 0
147 #define DFP_IEEE_FLAGS(A) 0
148 #define DFP_HANDLE_EXCEPTIONS(A) do {} while (0)
151 /* Conversions between different decimal float types use WIDTH_TO to
152 determine additional macros to define. */
154 #if defined (L_dd_to_sd) || defined (L_td_to_sd)
156 #elif defined (L_sd_to_dd) || defined (L_td_to_dd)
158 #elif defined (L_sd_to_td) || defined (L_dd_to_td)
162 /* If WIDTH_TO is defined, define additional macros:
164 DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
166 IEEE_TYPE_TO: the corresponding (encoded) IEEE754 type.
168 TO_ENCODED_TO: the name of the decNumber function to convert an
169 internally represented decNumber into the encoded representation
170 for the destination. */
173 #define DFP_C_TYPE_TO _Decimal32
174 #define IEEE_TYPE_TO decimal32
175 #define TO_ENCODED_TO __decimal32FromNumber
176 #define IEEE_TO_HOST_TO __ieee_to_host_32
178 #define DFP_C_TYPE_TO _Decimal64
179 #define IEEE_TYPE_TO decimal64
180 #define TO_ENCODED_TO __decimal64FromNumber
181 #define IEEE_TO_HOST_TO __ieee_to_host_64
182 #elif WIDTH_TO == 128
183 #define DFP_C_TYPE_TO _Decimal128
184 #define IEEE_TYPE_TO decimal128
185 #define TO_ENCODED_TO __decimal128FromNumber
186 #define IEEE_TO_HOST_TO __ieee_to_host_128
189 /* Conversions between decimal float types and integral types use INT_KIND
190 to determine the data type and C functions to use. */
192 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
193 || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
195 #elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
196 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
198 #elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
199 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
201 #elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
202 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
206 /* If INT_KIND is defined, define additional macros:
208 INT_TYPE: The integer data type.
210 INT_FMT: The format string for writing the integer to a string.
212 CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
213 This works for ILP32 and LP64, won't for other type size systems.
215 STR_TO_INT: The function to read the integer from a string. */
218 #define INT_TYPE SItype
220 #define CAST_FOR_FMT(A) (int)A
221 #define STR_TO_INT strtol
223 #define INT_TYPE DItype
224 #define INT_FMT "%lld"
225 #define CAST_FOR_FMT(A) (long long)A
226 #define STR_TO_INT strtoll
228 #define INT_TYPE USItype
230 #define CAST_FOR_FMT(A) (unsigned int)A
231 #define STR_TO_INT strtoul
233 #define INT_TYPE UDItype
234 #define INT_FMT "%llu"
235 #define CAST_FOR_FMT(A) (unsigned long long)A
236 #define STR_TO_INT strtoull
239 /* Conversions between decimal float types and binary float types use
240 BFP_KIND to determine the data type and C functions to use. */
242 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
243 || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
245 #elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
246 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
248 #elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
249 || defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
251 #elif defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf) \
252 || defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)
256 /* If BFP_KIND is defined, define additional macros:
258 BFP_TYPE: The binary floating point data type.
260 BFP_FMT: The format string for writing the value to a string.
261 The number of decimal digits printed is
262 ceil (nbits / log2 (10.) + 1)
263 as described in David Matula's CACM 19(3) 716-723 June 1968 paper.
265 BFP_VIA_TYPE: Type to which to cast a variable of BPF_TYPE for a
268 STR_TO_BFP: The function to read the value from a string. */
271 #define BFP_TYPE SFtype
272 #define BFP_FMT "%.9e"
273 #define BFP_VIA_TYPE double
274 #define STR_TO_BFP strtof
277 #define BFP_TYPE DFtype
278 #define BFP_FMT "%.17e"
279 #define BFP_VIA_TYPE double
280 #define STR_TO_BFP strtod
283 #if LONG_DOUBLE_HAS_XF_MODE
284 #define BFP_TYPE XFtype
285 #define BFP_FMT "%.21Le"
286 #define BFP_VIA_TYPE long double
287 #define STR_TO_BFP strtold
288 #endif /* LONG_DOUBLE_HAS_XF_MODE */
291 #if LONG_DOUBLE_HAS_TF_MODE
292 #define BFP_TYPE TFtype
293 #if LDBL_MANT_DIG == 106
294 #define BFP_FMT "%.33Le"
295 #elif LDBL_MANT_DIG == 113
296 #define BFP_FMT "%.36Le"
298 #error "unknown long double size, cannot define BFP_FMT"
299 #endif /* LDBL_MANT_DIG */
300 #define STR_TO_BFP strtold
301 #define BFP_VIA_TYPE long double
302 #endif /* LONG_DOUBLE_HAS_TF_MODE */
304 #endif /* BFP_KIND */
306 #if WIDTH == 128 || WIDTH_TO == 128
307 #include "decimal128.h"
310 #if WIDTH == 64 || WIDTH_TO == 64
311 #include "decimal64.h"
312 #include "decDouble.h"
314 #if WIDTH == 32 || WIDTH_TO == 32
315 #include "decimal32.h"
316 #include "decSingle.h"
318 #include "decNumber.h"
320 /* Names of arithmetic functions. */
322 #if ENABLE_DECIMAL_BID_FORMAT
323 #define DPD_BID_NAME(DPD,BID) BID
325 #define DPD_BID_NAME(DPD,BID) DPD
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)
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)
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)
366 /* Names of decNumber functions for DPD arithmetic. */
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
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
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
406 /* Names of functions to convert between different decimal float types. */
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)
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)
422 #define DFP_TO_DFP DPD_BID_NAME(__dpd_trunctdsd2,__bid_trunctdsd2)
424 #define DFP_TO_DFP DPD_BID_NAME(__dpd_trunctddd2,__bid_trunctddd2)
428 /* Names of functions to convert between decimal float and integers. */
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
437 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatdisd,__bid_floatdisd)
438 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixsddi,__bid_fixsddi)
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
445 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatunsdisd,__bid_floatunsdisd)
446 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixunssddi,__bid_fixunssddi)
449 #define decFloat decDouble
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
456 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatdidd,__bid_floatdidd)
457 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixdddi,__bid_fixdddi)
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
464 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatunsdidd,__bid_floatunsdidd)
465 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixunsdddi,__bid_fixunsdddi)
468 #define decFloat decQuad
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
475 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatditd,__bid_floatditd)
476 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixtddi,__bid_fixtddi)
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
483 #define INT_TO_DFP DPD_BID_NAME(__dpd_floatunsditd,__bid_floatunsditd)
484 #define DFP_TO_INT DPD_BID_NAME(__dpd_fixunstddi,__bid_fixunstddi)
488 /* Names of functions to convert between decimal float and binary float. */
492 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extendsfsd,__bid_extendsfsd)
493 #define DFP_TO_BFP DPD_BID_NAME(__dpd_truncsdsf,__bid_truncsdsf)
495 #define BFP_TO_DFP DPD_BID_NAME(__dpd_truncdfsd,__bid_truncdfsd)
496 #define DFP_TO_BFP DPD_BID_NAME(__dpd_extendsddf,__bid_extendsddf)
498 #define BFP_TO_DFP DPD_BID_NAME(__dpd_truncxfsd,__bid_truncxfsd)
499 #define DFP_TO_BFP DPD_BID_NAME(__dpd_extendsdxf,__bid_extendsdxf)
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 #endif /* BFP_KIND */
507 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extendsfdd,__bid_extendsfdd)
508 #define DFP_TO_BFP DPD_BID_NAME(__dpd_truncddsf,__bid_truncddsf)
510 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extenddfdd,__bid_extenddfdd)
511 #define DFP_TO_BFP DPD_BID_NAME(__dpd_truncdddf,__bid_truncdddf)
513 #define BFP_TO_DFP DPD_BID_NAME(__dpd_truncxfdd,__bid_truncxfdd)
514 #define DFP_TO_BFP DPD_BID_NAME(__dpd_extendddxf,__bid_extendddxf)
516 #define BFP_TO_DFP DPD_BID_NAME(__dpd_trunctfdd,__bid_trunctfdd)
517 #define DFP_TO_BFP DPD_BID_NAME(__dpd_extendddtf,__bid_extendddtf)
518 #endif /* BFP_KIND */
522 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extendsftd,__bid_extendsftd)
523 #define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctdsf,__bid_trunctdsf)
525 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extenddftd,__bid_extenddftd)
526 #define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctddf,__bid_trunctddf)
528 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extendxftd,__bid_extendxftd)
529 #define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctdxf,__bid_trunctdxf)
531 #define BFP_TO_DFP DPD_BID_NAME(__dpd_extendtftd,__bid_extendtftd)
532 #define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctdtf,__bid_trunctdtf)
533 #endif /* BFP_KIND */
537 /* Some handy typedefs. */
539 typedef float SFtype
__attribute__ ((mode (SF
)));
540 typedef float DFtype
__attribute__ ((mode (DF
)));
541 #if LONG_DOUBLE_HAS_XF_MODE
542 typedef float XFtype
__attribute__ ((mode (XF
)));
543 #endif /* LONG_DOUBLE_HAS_XF_MODE */
544 #if LONG_DOUBLE_HAS_TF_MODE
545 typedef float TFtype
__attribute__ ((mode (TF
)));
546 #endif /* LONG_DOUBLE_HAS_TF_MODE */
548 typedef int SItype
__attribute__ ((mode (SI
)));
549 typedef int DItype
__attribute__ ((mode (DI
)));
550 typedef unsigned int USItype
__attribute__ ((mode (SI
)));
551 typedef unsigned int UDItype
__attribute__ ((mode (DI
)));
553 /* The type of the result of a decimal float comparison. This must
554 match `__libgcc_cmp_return__' in GCC for the target. */
556 typedef int CMPtype
__attribute__ ((mode (__libgcc_cmp_return__
)));
560 #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
561 extern DFP_C_TYPE
DFP_MULTIPLY (DFP_C_TYPE
, DFP_C_TYPE
);
564 #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
565 extern DFP_C_TYPE
DFP_DIVIDE (DFP_C_TYPE
, DFP_C_TYPE
);
568 #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
569 extern DFP_C_TYPE
DFP_ADD (DFP_C_TYPE
, DFP_C_TYPE
);
570 extern DFP_C_TYPE
DFP_SUB (DFP_C_TYPE
, DFP_C_TYPE
);
573 #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
574 extern CMPtype
DFP_EQ (DFP_C_TYPE
, DFP_C_TYPE
);
577 #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
578 extern CMPtype
DFP_NE (DFP_C_TYPE
, DFP_C_TYPE
);
581 #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
582 extern CMPtype
DFP_LT (DFP_C_TYPE
, DFP_C_TYPE
);
585 #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
586 extern CMPtype
DFP_GT (DFP_C_TYPE
, DFP_C_TYPE
);
589 #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
590 extern CMPtype
DFP_LE (DFP_C_TYPE
, DFP_C_TYPE
);
593 #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
594 extern CMPtype
DFP_GE (DFP_C_TYPE
, DFP_C_TYPE
);
597 #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
598 extern CMPtype
DFP_UNORD (DFP_C_TYPE
, DFP_C_TYPE
);
601 #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
602 || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
603 extern DFP_C_TYPE_TO
DFP_TO_DFP (DFP_C_TYPE
);
606 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
607 || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
608 || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
609 || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
610 extern INT_TYPE
DFP_TO_INT (DFP_C_TYPE
);
613 #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
614 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
615 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
616 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
617 extern DFP_C_TYPE
INT_TO_DFP (INT_TYPE
);
620 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
621 || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
622 || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
623 && LONG_DOUBLE_HAS_XF_MODE) \
624 || ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
625 && LONG_DOUBLE_HAS_TF_MODE)
626 extern BFP_TYPE
DFP_TO_BFP (DFP_C_TYPE
);
629 #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
630 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
631 || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
632 && LONG_DOUBLE_HAS_XF_MODE) \
633 || ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
634 && LONG_DOUBLE_HAS_TF_MODE)
635 extern DFP_C_TYPE
BFP_TO_DFP (BFP_TYPE
);
638 #endif /* _DFPBIT_H */