1 /* Header file for dfp-bit.c.
2 Copyright (C) 2005, 2006 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
34 #include "coretypes.h"
37 #ifndef LIBGCC2_WORDS_BIG_ENDIAN
38 #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
41 #ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
42 #define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
45 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
46 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
49 #ifndef LIBGCC2_HAS_XF_MODE
50 #define LIBGCC2_HAS_XF_MODE \
51 (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
54 /* Depending on WIDTH, define a number of macros:
56 DFP_C_TYPE: type of the arguments to the libgcc functions;
59 IEEE_TYPE: the corresponding (encoded) IEEE754R type;
62 TO_INTERNAL: the name of the decNumber function to convert an
63 encoded value into the decNumber internal representation;
65 TO_ENCODED: the name of the decNumber function to convert an
66 internally represented decNumber into the encoded
69 FROM_STRING: the name of the decNumber function to read an
70 encoded value from a string.
72 TO_STRING: the name of the decNumber function to write an
73 encoded value to a string. */
76 #define DFP_C_TYPE _Decimal32
77 #define IEEE_TYPE decimal32
78 #define HOST_TO_IEEE __host_to_ieee_32
79 #define IEEE_TO_HOST __ieee_to_host_32
80 #define TO_INTERNAL __decimal32ToNumber
81 #define TO_ENCODED __decimal32FromNumber
82 #define FROM_STRING __decimal32FromString
83 #define TO_STRING __decimal32ToString
85 #define DFP_C_TYPE _Decimal64
86 #define IEEE_TYPE decimal64
87 #define HOST_TO_IEEE __host_to_ieee_64
88 #define IEEE_TO_HOST __ieee_to_host_64
89 #define TO_INTERNAL __decimal64ToNumber
90 #define TO_ENCODED __decimal64FromNumber
91 #define FROM_STRING __decimal64FromString
92 #define TO_STRING __decimal64ToString
94 #define DFP_C_TYPE _Decimal128
95 #define IEEE_TYPE decimal128
96 #define HOST_TO_IEEE __host_to_ieee_128
97 #define IEEE_TO_HOST __ieee_to_host_128
98 #define TO_INTERNAL __decimal128ToNumber
99 #define TO_ENCODED __decimal128FromNumber
100 #define FROM_STRING __decimal128FromString
101 #define TO_STRING __decimal128ToString
103 #error invalid decimal float word width
106 /* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
107 operations and constants to the range and precision of the _Decimal128
110 #define CONTEXT_INIT DEC_INIT_DECIMAL32
112 #define CONTEXT_INIT DEC_INIT_DECIMAL64
114 #define CONTEXT_INIT DEC_INIT_DECIMAL128
117 /* Define CONTEXT_ROUND to obtain the current decNumber rounding mode. */
118 extern enum rounding __decGetRound (void);
119 #define CONTEXT_ROUND __decGetRound ()
121 /* Conversions between different decimal float types use WIDTH_TO to
122 determine additional macros to define. */
124 #if defined (L_dd_to_sd) || defined (L_td_to_sd)
126 #elif defined (L_sd_to_dd) || defined (L_td_to_dd)
128 #elif defined (L_sd_to_td) || defined (L_dd_to_td)
132 /* If WIDTH_TO is defined, define additional macros:
134 DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
136 IEEE_TYPE_TO: the corresponding (encoded) IEEE754R type.
138 TO_ENCODED_TO: the name of the decNumber function to convert an
139 internally represented decNumber into the encoded representation
140 for the destination. */
143 #define DFP_C_TYPE_TO _Decimal32
144 #define IEEE_TYPE_TO decimal32
145 #define TO_ENCODED_TO __decimal32FromNumber
146 #define IEEE_TO_HOST_TO __ieee_to_host_32
148 #define DFP_C_TYPE_TO _Decimal64
149 #define IEEE_TYPE_TO decimal64
150 #define TO_ENCODED_TO __decimal64FromNumber
151 #define IEEE_TO_HOST_TO __ieee_to_host_64
152 #elif WIDTH_TO == 128
153 #define DFP_C_TYPE_TO _Decimal128
154 #define IEEE_TYPE_TO decimal128
155 #define TO_ENCODED_TO __decimal128FromNumber
156 #define IEEE_TO_HOST_TO __ieee_to_host_128
159 /* Conversions between decimal float types and integral types use INT_KIND
160 to determine the data type and C functions to use. */
162 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
163 || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
165 #elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
166 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
168 #elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
169 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
171 #elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
172 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
176 /* If INT_KIND is defined, define additional macros:
178 INT_TYPE: The integer data type.
180 INT_FMT: The format string for writing the integer to a string.
182 CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
183 This works for ILP32 and LP64, won't for other type size systems.
185 STR_TO_INT: The function to read the integer from a string. */
188 #define INT_TYPE SItype
190 #define CAST_FOR_FMT(A) (int)A
191 #define STR_TO_INT strtol
193 #define INT_TYPE DItype
194 #define INT_FMT "%lld"
195 #define CAST_FOR_FMT(A) (long long)A
196 #define STR_TO_INT strtoll
198 #define INT_TYPE USItype
200 #define CAST_FOR_FMT(A) (unsigned int)A
201 #define STR_TO_INT strtoul
203 #define INT_TYPE UDItype
204 #define INT_FMT "%llu"
205 #define CAST_FOR_FMT(A) (unsigned long long)A
206 #define STR_TO_INT strtoull
209 /* Conversions between decimal float types and binary float types use
210 BFP_KIND to determine the data type and C functions to use. */
212 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
213 || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
215 #elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
216 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
218 #elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
219 || defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
223 /* If BFP_KIND is defined, define additional macros:
225 BFP_TYPE: The binary floating point data type.
227 BFP_FMT: The format string for writing the value to a string.
229 STR_TO_BFP: The function to read the value from a string. */
232 /* strtof is declared in <stdlib.h> only for C99. */
233 extern float strtof (const char *, char **);
234 #define BFP_TYPE SFtype
236 #define STR_TO_BFP strtof
239 #define BFP_TYPE DFtype
241 #define STR_TO_BFP strtod
244 #if LIBGCC2_HAS_XF_MODE
245 /* These aren't used if XF mode is not supported. */
246 #define BFP_TYPE XFtype
248 #define BFP_VIA_TYPE double
249 #define STR_TO_BFP strtod
252 #endif /* BFP_KIND */
254 #if WIDTH == 128 || WIDTH_TO == 128
255 #include "decimal128.h"
257 #if WIDTH == 64 || WIDTH_TO == 64
258 #include "decimal64.h"
260 #if WIDTH == 32 || WIDTH_TO == 32
261 #include "decimal32.h"
263 #include "decNumber.h"
265 /* Names of arithmetic functions. */
268 #define DFP_ADD __addsd3
269 #define DFP_SUB __subsd3
270 #define DFP_MULTIPLY __mulsd3
271 #define DFP_DIVIDE __divsd3
272 #define DFP_EQ __eqsd2
273 #define DFP_NE __nesd2
274 #define DFP_LT __ltsd2
275 #define DFP_GT __gtsd2
276 #define DFP_LE __lesd2
277 #define DFP_GE __gesd2
278 #define DFP_UNORD __unordsd2
280 #define DFP_ADD __adddd3
281 #define DFP_SUB __subdd3
282 #define DFP_MULTIPLY __muldd3
283 #define DFP_DIVIDE __divdd3
284 #define DFP_EQ __eqdd2
285 #define DFP_NE __nedd2
286 #define DFP_LT __ltdd2
287 #define DFP_GT __gtdd2
288 #define DFP_LE __ledd2
289 #define DFP_GE __gedd2
290 #define DFP_UNORD __unorddd2
292 #define DFP_ADD __addtd3
293 #define DFP_SUB __subtd3
294 #define DFP_MULTIPLY __multd3
295 #define DFP_DIVIDE __divtd3
296 #define DFP_EQ __eqtd2
297 #define DFP_NE __netd2
298 #define DFP_LT __lttd2
299 #define DFP_GT __gttd2
300 #define DFP_LE __letd2
301 #define DFP_GE __getd2
302 #define DFP_UNORD __unordtd2
305 /* Names of functions to convert between different decimal float types. */
309 #define DFP_TO_DFP __extendsddd2
310 #elif WIDTH_TO == 128
311 #define DFP_TO_DFP __extendsdtd2
315 #define DFP_TO_DFP __truncddsd2
316 #elif WIDTH_TO == 128
317 #define DFP_TO_DFP __extendddtd2
321 #define DFP_TO_DFP __trunctdsd2
323 #define DFP_TO_DFP __trunctddd2
327 /* Names of functions to convert between decimal float and integers. */
331 #define INT_TO_DFP __floatsisd
332 #define DFP_TO_INT __fixsdsi
334 #define INT_TO_DFP __floatdisd
335 #define DFP_TO_INT __fixsddi
337 #define INT_TO_DFP __floatunssisd
338 #define DFP_TO_INT __fixunssdsi
340 #define INT_TO_DFP __floatunsdisd
341 #define DFP_TO_INT __fixunssddi
345 #define INT_TO_DFP __floatsidd
346 #define DFP_TO_INT __fixddsi
348 #define INT_TO_DFP __floatdidd
349 #define DFP_TO_INT __fixdddi
351 #define INT_TO_DFP __floatunssidd
352 #define DFP_TO_INT __fixunsddsi
354 #define INT_TO_DFP __floatunsdidd
355 #define DFP_TO_INT __fixunsdddi
359 #define INT_TO_DFP __floatsitd
360 #define DFP_TO_INT __fixtdsi
362 #define INT_TO_DFP __floatditd
363 #define DFP_TO_INT __fixtddi
365 #define INT_TO_DFP __floatunssitd
366 #define DFP_TO_INT __fixunstdsi
368 #define INT_TO_DFP __floatunsditd
369 #define DFP_TO_INT __fixunstddi
373 /* Names of functions to convert between decimal float and binary float. */
377 #define BFP_TO_DFP __extendsfsd
378 #define DFP_TO_BFP __truncsdsf
380 #define BFP_TO_DFP __truncdfsd
381 #define DFP_TO_BFP __extendsddf
383 #define BFP_TO_DFP __truncxfsd
384 #define DFP_TO_BFP __extendsdxf
385 #endif /* BFP_KIND */
389 #define BFP_TO_DFP __extendsfdd
390 #define DFP_TO_BFP __truncddsf
392 #define BFP_TO_DFP __extenddfdd
393 #define DFP_TO_BFP __truncdddf
395 #define BFP_TO_DFP __truncxfdd
396 #define DFP_TO_BFP __extendddxf
397 #endif /* BFP_KIND */
401 #define BFP_TO_DFP __extendsftd
402 #define DFP_TO_BFP __trunctdsf
404 #define BFP_TO_DFP __extenddftd
405 #define DFP_TO_BFP __trunctddf
407 #define BFP_TO_DFP __extendxftd
408 #define DFP_TO_BFP __trunctdxf
409 #endif /* BFP_KIND */
413 /* Some handy typedefs. */
415 typedef float SFtype __attribute__ ((mode (SF)));
416 typedef float DFtype __attribute__ ((mode (DF)));
417 #if LIBGCC2_HAS_XF_MODE
418 typedef float XFtype __attribute__ ((mode (XF)));
419 #endif /* LIBGCC2_HAS_XF_MODE */
421 typedef int SItype __attribute__ ((mode (SI)));
422 typedef int DItype __attribute__ ((mode (DI)));
423 typedef unsigned int USItype __attribute__ ((mode (SI)));
424 typedef unsigned int UDItype __attribute__ ((mode (DI)));
426 /* The type of the result of a decimal float comparison. This must
427 match `word_mode' in GCC for the target. */
429 typedef int CMPtype __attribute__ ((mode (word)));
433 #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
434 extern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
437 #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
438 extern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
441 #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
442 extern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
443 extern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
446 #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
447 extern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
450 #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
451 extern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
454 #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
455 extern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
458 #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
459 extern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
462 #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
463 extern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
466 #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
467 extern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
470 #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
471 extern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
474 #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
475 || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
476 extern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
479 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
480 || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
481 || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
482 || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
483 extern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
486 #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
487 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
488 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
489 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
490 extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
493 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
494 || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
495 || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
496 && LIBGCC2_HAS_XF_MODE)
497 extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
500 #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
501 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
502 || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
503 && LIBGCC2_HAS_XF_MODE)
504 extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
507 #endif /* _DFPBIT_H */