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
36 #include "coretypes.h"
39 #ifndef LIBGCC2_WORDS_BIG_ENDIAN
40 #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
43 #ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
44 #define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
47 #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
48 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
51 #ifndef LIBGCC2_HAS_XF_MODE
52 #define LIBGCC2_HAS_XF_MODE \
53 (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
56 /* Depending on WIDTH, define a number of macros:
58 DFP_C_TYPE: type of the arguments to the libgcc functions;
61 IEEE_TYPE: the corresponding (encoded) IEEE754R type;
64 TO_INTERNAL: the name of the decNumber function to convert an
65 encoded value into the decNumber internal representation;
67 TO_ENCODED: the name of the decNumber function to convert an
68 internally represented decNumber into the encoded
71 FROM_STRING: the name of the decNumber function to read an
72 encoded value from a string.
74 TO_STRING: the name of the decNumber function to write an
75 encoded value to a string. */
78 #define DFP_C_TYPE _Decimal32
79 #define IEEE_TYPE decimal32
80 #define HOST_TO_IEEE __host_to_ieee_32
81 #define IEEE_TO_HOST __ieee_to_host_32
82 #define TO_INTERNAL __decimal32ToNumber
83 #define TO_ENCODED __decimal32FromNumber
84 #define FROM_STRING __decimal32FromString
85 #define TO_STRING __decimal32ToString
87 #define DFP_C_TYPE _Decimal64
88 #define IEEE_TYPE decimal64
89 #define HOST_TO_IEEE __host_to_ieee_64
90 #define IEEE_TO_HOST __ieee_to_host_64
91 #define TO_INTERNAL __decimal64ToNumber
92 #define TO_ENCODED __decimal64FromNumber
93 #define FROM_STRING __decimal64FromString
94 #define TO_STRING __decimal64ToString
96 #define DFP_C_TYPE _Decimal128
97 #define IEEE_TYPE decimal128
98 #define HOST_TO_IEEE __host_to_ieee_128
99 #define IEEE_TO_HOST __ieee_to_host_128
100 #define TO_INTERNAL __decimal128ToNumber
101 #define TO_ENCODED __decimal128FromNumber
102 #define FROM_STRING __decimal128FromString
103 #define TO_STRING __decimal128ToString
105 #error invalid decimal float word width
108 /* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
109 operations and constants to the range and precision of the _Decimal128
112 #define CONTEXT_INIT DEC_INIT_DECIMAL32
114 #define CONTEXT_INIT DEC_INIT_DECIMAL64
116 #define CONTEXT_INIT DEC_INIT_DECIMAL128
119 #ifndef DFP_INIT_ROUNDMODE
120 #define DFP_INIT_ROUNDMODE(A) A = DEC_ROUND_HALF_EVEN
123 /* Conversions between different decimal float types use WIDTH_TO to
124 determine additional macros to define. */
126 #if defined (L_dd_to_sd) || defined (L_td_to_sd)
128 #elif defined (L_sd_to_dd) || defined (L_td_to_dd)
130 #elif defined (L_sd_to_td) || defined (L_dd_to_td)
134 /* If WIDTH_TO is defined, define additional macros:
136 DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
138 IEEE_TYPE_TO: the corresponding (encoded) IEEE754R type.
140 TO_ENCODED_TO: the name of the decNumber function to convert an
141 internally represented decNumber into the encoded representation
142 for the destination. */
145 #define DFP_C_TYPE_TO _Decimal32
146 #define IEEE_TYPE_TO decimal32
147 #define TO_ENCODED_TO __decimal32FromNumber
148 #define IEEE_TO_HOST_TO __ieee_to_host_32
150 #define DFP_C_TYPE_TO _Decimal64
151 #define IEEE_TYPE_TO decimal64
152 #define TO_ENCODED_TO __decimal64FromNumber
153 #define IEEE_TO_HOST_TO __ieee_to_host_64
154 #elif WIDTH_TO == 128
155 #define DFP_C_TYPE_TO _Decimal128
156 #define IEEE_TYPE_TO decimal128
157 #define TO_ENCODED_TO __decimal128FromNumber
158 #define IEEE_TO_HOST_TO __ieee_to_host_128
161 /* Conversions between decimal float types and integral types use INT_KIND
162 to determine the data type and C functions to use. */
164 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
165 || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
167 #elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
168 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
170 #elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
171 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
173 #elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
174 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
178 /* If INT_KIND is defined, define additional macros:
180 INT_TYPE: The integer data type.
182 INT_FMT: The format string for writing the integer to a string.
184 CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
185 This works for ILP32 and LP64, won't for other type size systems.
187 STR_TO_INT: The function to read the integer from a string. */
190 #define INT_TYPE SItype
192 #define CAST_FOR_FMT(A) (int)A
193 #define STR_TO_INT strtol
195 #define INT_TYPE DItype
196 #define INT_FMT "%lld"
197 #define CAST_FOR_FMT(A) (long long)A
198 #define STR_TO_INT strtoll
200 #define INT_TYPE USItype
202 #define CAST_FOR_FMT(A) (unsigned int)A
203 #define STR_TO_INT strtoul
205 #define INT_TYPE UDItype
206 #define INT_FMT "%llu"
207 #define CAST_FOR_FMT(A) (unsigned long long)A
208 #define STR_TO_INT strtoull
211 /* Conversions between decimal float types and binary float types use
212 BFP_KIND to determine the data type and C functions to use. */
214 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
215 || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
217 #elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
218 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
220 #elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
221 || defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
225 /* If BFP_KIND is defined, define additional macros:
227 BFP_TYPE: The binary floating point data type.
229 BFP_FMT: The format string for writing the value to a string.
231 STR_TO_BFP: The function to read the value from a string. */
234 /* strtof is declared in <stdlib.h> only for C99. */
235 extern float strtof (const char *, char **);
236 #define BFP_TYPE SFtype
238 #define STR_TO_BFP strtof
241 #define BFP_TYPE DFtype
243 #define STR_TO_BFP strtod
246 #if LIBGCC2_HAS_XF_MODE
247 /* These aren't used if XF mode is not supported. */
248 #define BFP_TYPE XFtype
250 #define BFP_VIA_TYPE double
251 #define STR_TO_BFP strtod
254 #endif /* BFP_KIND */
256 #if WIDTH == 128 || WIDTH_TO == 128
257 #include "decimal128.h"
259 #if WIDTH == 64 || WIDTH_TO == 64
260 #include "decimal64.h"
262 #if WIDTH == 32 || WIDTH_TO == 32
263 #include "decimal32.h"
265 #include "decNumber.h"
267 /* Names of arithmetic functions. */
270 #define DFP_ADD __addsd3
271 #define DFP_SUB __subsd3
272 #define DFP_MULTIPLY __mulsd3
273 #define DFP_DIVIDE __divsd3
274 #define DFP_EQ __eqsd2
275 #define DFP_NE __nesd2
276 #define DFP_LT __ltsd2
277 #define DFP_GT __gtsd2
278 #define DFP_LE __lesd2
279 #define DFP_GE __gesd2
280 #define DFP_UNORD __unordsd2
282 #define DFP_ADD __adddd3
283 #define DFP_SUB __subdd3
284 #define DFP_MULTIPLY __muldd3
285 #define DFP_DIVIDE __divdd3
286 #define DFP_EQ __eqdd2
287 #define DFP_NE __nedd2
288 #define DFP_LT __ltdd2
289 #define DFP_GT __gtdd2
290 #define DFP_LE __ledd2
291 #define DFP_GE __gedd2
292 #define DFP_UNORD __unorddd2
294 #define DFP_ADD __addtd3
295 #define DFP_SUB __subtd3
296 #define DFP_MULTIPLY __multd3
297 #define DFP_DIVIDE __divtd3
298 #define DFP_EQ __eqtd2
299 #define DFP_NE __netd2
300 #define DFP_LT __lttd2
301 #define DFP_GT __gttd2
302 #define DFP_LE __letd2
303 #define DFP_GE __getd2
304 #define DFP_UNORD __unordtd2
307 /* Names of functions to convert between different decimal float types. */
311 #define DFP_TO_DFP __extendsddd2
312 #elif WIDTH_TO == 128
313 #define DFP_TO_DFP __extendsdtd2
317 #define DFP_TO_DFP __truncddsd2
318 #elif WIDTH_TO == 128
319 #define DFP_TO_DFP __extendddtd2
323 #define DFP_TO_DFP __trunctdsd2
325 #define DFP_TO_DFP __trunctddd2
329 /* Names of functions to convert between decimal float and integers. */
333 #define INT_TO_DFP __floatsisd
334 #define DFP_TO_INT __fixsdsi
336 #define INT_TO_DFP __floatdisd
337 #define DFP_TO_INT __fixsddi
339 #define INT_TO_DFP __floatunssisd
340 #define DFP_TO_INT __fixunssdsi
342 #define INT_TO_DFP __floatunsdisd
343 #define DFP_TO_INT __fixunssddi
347 #define INT_TO_DFP __floatsidd
348 #define DFP_TO_INT __fixddsi
350 #define INT_TO_DFP __floatdidd
351 #define DFP_TO_INT __fixdddi
353 #define INT_TO_DFP __floatunssidd
354 #define DFP_TO_INT __fixunsddsi
356 #define INT_TO_DFP __floatunsdidd
357 #define DFP_TO_INT __fixunsdddi
361 #define INT_TO_DFP __floatsitd
362 #define DFP_TO_INT __fixtdsi
364 #define INT_TO_DFP __floatditd
365 #define DFP_TO_INT __fixtddi
367 #define INT_TO_DFP __floatunssitd
368 #define DFP_TO_INT __fixunstdsi
370 #define INT_TO_DFP __floatunsditd
371 #define DFP_TO_INT __fixunstddi
375 /* Names of functions to convert between decimal float and binary float. */
379 #define BFP_TO_DFP __extendsfsd
380 #define DFP_TO_BFP __truncsdsf
382 #define BFP_TO_DFP __truncdfsd
383 #define DFP_TO_BFP __extendsddf
385 #define BFP_TO_DFP __truncxfsd
386 #define DFP_TO_BFP __extendsdxf
387 #endif /* BFP_KIND */
391 #define BFP_TO_DFP __extendsfdd
392 #define DFP_TO_BFP __truncddsf
394 #define BFP_TO_DFP __extenddfdd
395 #define DFP_TO_BFP __truncdddf
397 #define BFP_TO_DFP __truncxfdd
398 #define DFP_TO_BFP __extendddxf
399 #endif /* BFP_KIND */
403 #define BFP_TO_DFP __extendsftd
404 #define DFP_TO_BFP __trunctdsf
406 #define BFP_TO_DFP __extenddftd
407 #define DFP_TO_BFP __trunctddf
409 #define BFP_TO_DFP __extendxftd
410 #define DFP_TO_BFP __trunctdxf
411 #endif /* BFP_KIND */
415 /* Some handy typedefs. */
417 typedef float SFtype
__attribute__ ((mode (SF
)));
418 typedef float DFtype
__attribute__ ((mode (DF
)));
419 #if LIBGCC2_HAS_XF_MODE
420 typedef float XFtype
__attribute__ ((mode (XF
)));
421 #endif /* LIBGCC2_HAS_XF_MODE */
423 typedef int SItype
__attribute__ ((mode (SI
)));
424 typedef int DItype
__attribute__ ((mode (DI
)));
425 typedef unsigned int USItype
__attribute__ ((mode (SI
)));
426 typedef unsigned int UDItype
__attribute__ ((mode (DI
)));
428 /* The type of the result of a decimal float comparison. This must
429 match `word_mode' in GCC for the target. */
431 typedef int CMPtype
__attribute__ ((mode (word
)));
435 #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
436 extern DFP_C_TYPE
DFP_MULTIPLY (DFP_C_TYPE
, DFP_C_TYPE
);
439 #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
440 extern DFP_C_TYPE
DFP_DIVIDE (DFP_C_TYPE
, DFP_C_TYPE
);
443 #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
444 extern DFP_C_TYPE
DFP_ADD (DFP_C_TYPE
, DFP_C_TYPE
);
445 extern DFP_C_TYPE
DFP_SUB (DFP_C_TYPE
, DFP_C_TYPE
);
448 #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
449 extern CMPtype
DFP_EQ (DFP_C_TYPE
, DFP_C_TYPE
);
452 #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
453 extern CMPtype
DFP_NE (DFP_C_TYPE
, DFP_C_TYPE
);
456 #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
457 extern CMPtype
DFP_LT (DFP_C_TYPE
, DFP_C_TYPE
);
460 #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
461 extern CMPtype
DFP_GT (DFP_C_TYPE
, DFP_C_TYPE
);
464 #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
465 extern CMPtype
DFP_LE (DFP_C_TYPE
, DFP_C_TYPE
);
468 #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
469 extern CMPtype
DFP_GE (DFP_C_TYPE
, DFP_C_TYPE
);
472 #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
473 extern CMPtype
DFP_UNORD (DFP_C_TYPE
, DFP_C_TYPE
);
476 #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
477 || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
478 extern DFP_C_TYPE_TO
DFP_TO_DFP (DFP_C_TYPE
);
481 #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
482 || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
483 || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
484 || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
485 extern INT_TYPE
DFP_TO_INT (DFP_C_TYPE
);
488 #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
489 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
490 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
491 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
492 extern DFP_C_TYPE
INT_TO_DFP (INT_TYPE
);
495 #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
496 || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
497 || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
498 && LIBGCC2_HAS_XF_MODE)
499 extern BFP_TYPE
DFP_TO_BFP (DFP_C_TYPE
);
502 #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
503 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
504 || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
505 && LIBGCC2_HAS_XF_MODE)
506 extern DFP_C_TYPE
BFP_TO_DFP (BFP_TYPE
);
509 #endif /* _DFPBIT_H */