1169689Skan/* Header file for dfp-bit.c.
2169689Skan   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
3169689Skan
4169689SkanThis file is part of GCC.
5169689Skan
6169689SkanGCC is free software; you can redistribute it and/or modify it under
7169689Skanthe terms of the GNU General Public License as published by the Free
8169689SkanSoftware Foundation; either version 2, or (at your option) any later
9169689Skanversion.
10169689Skan
11169689SkanIn addition to the permissions in the GNU General Public License, the
12169689SkanFree Software Foundation gives you unlimited permission to link the
13169689Skancompiled version of this file into combinations with other programs,
14169689Skanand to distribute those combinations without any restriction coming
15169689Skanfrom the use of this file.  (The General Public License restrictions
16169689Skando apply in other respects; for example, they cover modification of
17169689Skanthe file, and distribution when not linked into a combine
18169689Skanexecutable.)
19169689Skan
20169689SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY
21169689SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or
22169689SkanFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23169689Skanfor more details.
24169689Skan
25169689SkanYou should have received a copy of the GNU General Public License
26169689Skanalong with GCC; see the file COPYING.  If not, write to the Free
27169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28169689Skan02110-1301, USA.  */
29169689Skan
30169689Skan#ifndef _DFPBIT_H
31169689Skan#define _DFPBIT_H
32169689Skan
33169689Skan#include "tconfig.h"
34169689Skan#include "coretypes.h"
35169689Skan#include "tm.h"
36169689Skan
37169689Skan#ifndef LIBGCC2_WORDS_BIG_ENDIAN
38169689Skan#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
39169689Skan#endif
40169689Skan
41169689Skan#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
42169689Skan#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
43169689Skan#endif
44169689Skan
45169689Skan#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
46169689Skan#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
47169689Skan#endif
48169689Skan
49169689Skan#ifndef LIBGCC2_HAS_XF_MODE
50169689Skan#define LIBGCC2_HAS_XF_MODE \
51169689Skan  (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
52169689Skan#endif
53169689Skan
54169689Skan/* Depending on WIDTH, define a number of macros:
55169689Skan
56169689Skan   DFP_C_TYPE: type of the arguments to the libgcc functions;
57169689Skan	(eg _Decimal32)
58169689Skan
59169689Skan   IEEE_TYPE: the corresponding (encoded) IEEE754R type;
60169689Skan	(eg decimal32)
61169689Skan
62169689Skan   TO_INTERNAL: the name of the decNumber function to convert an
63169689Skan   encoded value into the decNumber internal representation;
64169689Skan
65169689Skan   TO_ENCODED: the name of the decNumber function to convert an
66169689Skan   internally represented decNumber into the encoded
67169689Skan   representation.
68169689Skan
69169689Skan   FROM_STRING: the name of the decNumber function to read an
70169689Skan   encoded value from a string.
71169689Skan
72169689Skan   TO_STRING: the name of the decNumber function to write an
73169689Skan   encoded value to a string.  */
74169689Skan
75169689Skan#if WIDTH == 32
76169689Skan#define DFP_C_TYPE	_Decimal32
77169689Skan#define IEEE_TYPE	decimal32
78169689Skan#define HOST_TO_IEEE	__host_to_ieee_32
79169689Skan#define IEEE_TO_HOST	__ieee_to_host_32
80169689Skan#define TO_INTERNAL	__decimal32ToNumber
81169689Skan#define TO_ENCODED	__decimal32FromNumber
82169689Skan#define FROM_STRING	__decimal32FromString
83169689Skan#define TO_STRING	__decimal32ToString
84169689Skan#elif WIDTH == 64
85169689Skan#define DFP_C_TYPE	_Decimal64
86169689Skan#define IEEE_TYPE	decimal64
87169689Skan#define HOST_TO_IEEE	__host_to_ieee_64
88169689Skan#define IEEE_TO_HOST	__ieee_to_host_64
89169689Skan#define TO_INTERNAL	__decimal64ToNumber
90169689Skan#define TO_ENCODED	__decimal64FromNumber
91169689Skan#define FROM_STRING	__decimal64FromString
92169689Skan#define TO_STRING	__decimal64ToString
93169689Skan#elif WIDTH == 128
94169689Skan#define DFP_C_TYPE	_Decimal128
95169689Skan#define IEEE_TYPE	decimal128
96169689Skan#define HOST_TO_IEEE	__host_to_ieee_128
97169689Skan#define IEEE_TO_HOST	__ieee_to_host_128
98169689Skan#define TO_INTERNAL	__decimal128ToNumber
99169689Skan#define TO_ENCODED	__decimal128FromNumber
100169689Skan#define FROM_STRING	__decimal128FromString
101169689Skan#define TO_STRING	__decimal128ToString
102169689Skan#else
103169689Skan#error invalid decimal float word width
104169689Skan#endif
105169689Skan
106169689Skan/* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
107169689Skan   operations and constants to the range and precision of the _Decimal128
108169689Skan   type.  Make it so.  */
109169689Skan#if WIDTH == 32
110169689Skan#define CONTEXT_INIT DEC_INIT_DECIMAL32
111169689Skan#elif WIDTH == 64
112169689Skan#define CONTEXT_INIT DEC_INIT_DECIMAL64
113169689Skan#elif WIDTH == 128
114169689Skan#define CONTEXT_INIT DEC_INIT_DECIMAL128
115169689Skan#endif
116169689Skan
117169689Skan/* Define CONTEXT_ROUND to obtain the current decNumber rounding mode.  */
118169689Skanextern enum rounding	__decGetRound (void);
119169689Skan#define CONTEXT_ROUND	__decGetRound ()
120169689Skan
121169689Skanextern int __dfp_traps;
122169689Skan#define CONTEXT_TRAPS	__dfp_traps
123169689Skan#define CONTEXT_ERRORS(context)	context.status & DEC_Errors
124169689Skanextern void __dfp_raise (int);
125169689Skan#define DFP_RAISE(A)	__dfp_raise(A)
126169689Skan
127169689Skan/* Conversions between different decimal float types use WIDTH_TO to
128169689Skan   determine additional macros to define.  */
129169689Skan
130169689Skan#if defined (L_dd_to_sd) || defined (L_td_to_sd)
131169689Skan#define WIDTH_TO 32
132169689Skan#elif defined (L_sd_to_dd) || defined (L_td_to_dd)
133169689Skan#define WIDTH_TO 64
134169689Skan#elif defined (L_sd_to_td) || defined (L_dd_to_td)
135169689Skan#define WIDTH_TO 128
136169689Skan#endif
137169689Skan
138169689Skan/* If WIDTH_TO is defined, define additional macros:
139169689Skan
140169689Skan   DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
141169689Skan
142169689Skan   IEEE_TYPE_TO: the corresponding (encoded) IEEE754R type.
143169689Skan
144169689Skan   TO_ENCODED_TO: the name of the decNumber function to convert an
145169689Skan   internally represented decNumber into the encoded representation
146169689Skan   for the destination.  */
147169689Skan
148169689Skan#if WIDTH_TO == 32
149169689Skan#define DFP_C_TYPE_TO	_Decimal32
150169689Skan#define IEEE_TYPE_TO	decimal32
151169689Skan#define TO_ENCODED_TO	__decimal32FromNumber
152169689Skan#define IEEE_TO_HOST_TO __ieee_to_host_32
153169689Skan#elif WIDTH_TO == 64
154169689Skan#define DFP_C_TYPE_TO	_Decimal64
155169689Skan#define IEEE_TYPE_TO	decimal64
156169689Skan#define TO_ENCODED_TO	__decimal64FromNumber
157169689Skan#define IEEE_TO_HOST_TO __ieee_to_host_64
158169689Skan#elif WIDTH_TO == 128
159169689Skan#define DFP_C_TYPE_TO	_Decimal128
160169689Skan#define IEEE_TYPE_TO	decimal128
161169689Skan#define TO_ENCODED_TO	__decimal128FromNumber
162169689Skan#define IEEE_TO_HOST_TO __ieee_to_host_128
163169689Skan#endif
164169689Skan
165169689Skan/* Conversions between decimal float types and integral types use INT_KIND
166169689Skan   to determine the data type and C functions to use.  */
167169689Skan
168169689Skan#if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si)  \
169169689Skan   || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
170169689Skan#define INT_KIND 1
171169689Skan#elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
172169689Skan   || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
173169689Skan#define INT_KIND 2
174169689Skan#elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
175169689Skan   || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
176169689Skan#define INT_KIND 3
177169689Skan#elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
178169689Skan   || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
179169689Skan#define INT_KIND 4
180169689Skan#endif
181169689Skan
182169689Skan/*  If INT_KIND is defined, define additional macros:
183169689Skan
184169689Skan    INT_TYPE: The integer data type.
185169689Skan
186169689Skan    INT_FMT: The format string for writing the integer to a string.
187169689Skan
188169689Skan    CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
189169689Skan    This works for ILP32 and LP64, won't for other type size systems.
190169689Skan
191169689Skan    STR_TO_INT: The function to read the integer from a string.  */
192169689Skan
193169689Skan#if INT_KIND == 1
194169689Skan#define INT_TYPE SItype
195169689Skan#define INT_FMT "%d"
196169689Skan#define CAST_FOR_FMT(A) (int)A
197169689Skan#define STR_TO_INT strtol
198169689Skan#elif INT_KIND == 2
199169689Skan#define INT_TYPE DItype
200169689Skan#define INT_FMT "%lld"
201169689Skan#define CAST_FOR_FMT(A) (long long)A
202169689Skan#define STR_TO_INT strtoll
203169689Skan#elif INT_KIND == 3
204169689Skan#define INT_TYPE USItype
205169689Skan#define INT_FMT "%u"
206169689Skan#define CAST_FOR_FMT(A) (unsigned int)A
207169689Skan#define STR_TO_INT strtoul
208169689Skan#elif INT_KIND == 4
209169689Skan#define INT_TYPE UDItype
210169689Skan#define INT_FMT "%llu"
211169689Skan#define CAST_FOR_FMT(A) (unsigned long long)A
212169689Skan#define STR_TO_INT strtoull
213169689Skan#endif
214169689Skan
215169689Skan/* Conversions between decimal float types and binary float types use
216169689Skan   BFP_KIND to determine the data type and C functions to use.  */
217169689Skan
218169689Skan#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
219169689Skan || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
220169689Skan#define BFP_KIND 1
221169689Skan#elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
222169689Skan ||   defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
223169689Skan#define BFP_KIND 2
224169689Skan#elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
225169689Skan ||   defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
226169689Skan#define BFP_KIND 3
227169689Skan#endif
228169689Skan
229169689Skan/*  If BFP_KIND is defined, define additional macros:
230169689Skan
231169689Skan    BFP_TYPE: The binary floating point data type.
232169689Skan
233169689Skan    BFP_FMT: The format string for writing the value to a string.
234169689Skan
235169689Skan    STR_TO_BFP: The function to read the value from a string.  */
236169689Skan
237169689Skan#if BFP_KIND == 1
238169689Skan/* strtof is declared in <stdlib.h> only for C99.  */
239169689Skanextern float strtof (const char *, char **);
240169689Skan#define BFP_TYPE SFtype
241169689Skan#define BFP_FMT "%e"
242169689Skan#define STR_TO_BFP strtof
243169689Skan
244169689Skan#elif BFP_KIND == 2
245169689Skan#define BFP_TYPE DFtype
246169689Skan#define BFP_FMT "%e"
247169689Skan#define STR_TO_BFP strtod
248169689Skan
249169689Skan#elif BFP_KIND == 3
250169689Skan#if LIBGCC2_HAS_XF_MODE
251169689Skan/* These aren't used if XF mode is not supported.  */
252169689Skan#define BFP_TYPE XFtype
253169689Skan#define BFP_FMT "%e"
254169689Skan#define BFP_VIA_TYPE double
255169689Skan#define STR_TO_BFP strtod
256169689Skan#endif
257169689Skan
258169689Skan#endif /* BFP_KIND */
259169689Skan
260169689Skan#if WIDTH == 128 || WIDTH_TO == 128
261169689Skan#include "decimal128.h"
262169689Skan#endif
263169689Skan#if WIDTH == 64 || WIDTH_TO == 64
264169689Skan#include "decimal64.h"
265169689Skan#endif
266169689Skan#if WIDTH == 32 || WIDTH_TO == 32
267169689Skan#include "decimal32.h"
268169689Skan#endif
269169689Skan#include "decNumber.h"
270169689Skan
271169689Skan/* Names of arithmetic functions.  */
272169689Skan
273169689Skan#if WIDTH == 32
274169689Skan#define DFP_ADD		__addsd3
275169689Skan#define DFP_SUB		__subsd3
276169689Skan#define DFP_MULTIPLY	__mulsd3
277169689Skan#define DFP_DIVIDE	__divsd3
278169689Skan#define DFP_EQ		__eqsd2
279169689Skan#define DFP_NE		__nesd2
280169689Skan#define DFP_LT		__ltsd2
281169689Skan#define DFP_GT		__gtsd2
282169689Skan#define DFP_LE		__lesd2
283169689Skan#define DFP_GE		__gesd2
284169689Skan#define DFP_UNORD	__unordsd2
285169689Skan#elif WIDTH == 64
286169689Skan#define DFP_ADD		__adddd3
287169689Skan#define DFP_SUB		__subdd3
288169689Skan#define DFP_MULTIPLY	__muldd3
289169689Skan#define DFP_DIVIDE	__divdd3
290169689Skan#define DFP_EQ		__eqdd2
291169689Skan#define DFP_NE		__nedd2
292169689Skan#define DFP_LT		__ltdd2
293169689Skan#define DFP_GT		__gtdd2
294169689Skan#define DFP_LE		__ledd2
295169689Skan#define DFP_GE		__gedd2
296169689Skan#define DFP_UNORD	__unorddd2
297169689Skan#elif WIDTH == 128
298169689Skan#define DFP_ADD		__addtd3
299169689Skan#define DFP_SUB		__subtd3
300169689Skan#define DFP_MULTIPLY	__multd3
301169689Skan#define DFP_DIVIDE	__divtd3
302169689Skan#define DFP_EQ		__eqtd2
303169689Skan#define DFP_NE		__netd2
304169689Skan#define DFP_LT		__lttd2
305169689Skan#define DFP_GT		__gttd2
306169689Skan#define DFP_LE		__letd2
307169689Skan#define DFP_GE		__getd2
308169689Skan#define DFP_UNORD	__unordtd2
309169689Skan#endif
310169689Skan
311169689Skan/* Names of functions to convert between different decimal float types.  */
312169689Skan
313169689Skan#if WIDTH == 32
314169689Skan#if WIDTH_TO == 64
315169689Skan#define DFP_TO_DFP	__extendsddd2
316169689Skan#elif WIDTH_TO == 128
317169689Skan#define DFP_TO_DFP	__extendsdtd2
318169689Skan#endif
319169689Skan#elif WIDTH == 64
320169689Skan#if WIDTH_TO == 32
321169689Skan#define DFP_TO_DFP	__truncddsd2
322169689Skan#elif WIDTH_TO == 128
323169689Skan#define DFP_TO_DFP	__extendddtd2
324169689Skan#endif
325169689Skan#elif WIDTH == 128
326169689Skan#if WIDTH_TO == 32
327169689Skan#define DFP_TO_DFP	__trunctdsd2
328169689Skan#elif WIDTH_TO == 64
329169689Skan#define DFP_TO_DFP	__trunctddd2
330169689Skan#endif
331169689Skan#endif
332169689Skan
333169689Skan/* Names of functions to convert between decimal float and integers.  */
334169689Skan
335169689Skan#if WIDTH == 32
336169689Skan#if INT_KIND == 1
337169689Skan#define INT_TO_DFP	__floatsisd
338169689Skan#define DFP_TO_INT	__fixsdsi
339169689Skan#elif INT_KIND == 2
340169689Skan#define INT_TO_DFP	__floatdisd
341169689Skan#define DFP_TO_INT	__fixsddi
342169689Skan#elif INT_KIND == 3
343169689Skan#define INT_TO_DFP	__floatunssisd
344169689Skan#define DFP_TO_INT	__fixunssdsi
345169689Skan#elif INT_KIND == 4
346169689Skan#define INT_TO_DFP	__floatunsdisd
347169689Skan#define DFP_TO_INT	__fixunssddi
348169689Skan#endif
349169689Skan#elif WIDTH == 64
350169689Skan#if INT_KIND == 1
351169689Skan#define INT_TO_DFP	__floatsidd
352169689Skan#define DFP_TO_INT	__fixddsi
353169689Skan#elif INT_KIND == 2
354169689Skan#define INT_TO_DFP	__floatdidd
355169689Skan#define DFP_TO_INT	__fixdddi
356169689Skan#elif INT_KIND == 3
357169689Skan#define INT_TO_DFP	__floatunssidd
358169689Skan#define DFP_TO_INT	__fixunsddsi
359169689Skan#elif INT_KIND == 4
360169689Skan#define INT_TO_DFP	__floatunsdidd
361169689Skan#define DFP_TO_INT	__fixunsdddi
362169689Skan#endif
363169689Skan#elif WIDTH == 128
364169689Skan#if INT_KIND == 1
365169689Skan#define INT_TO_DFP	__floatsitd
366169689Skan#define DFP_TO_INT	__fixtdsi
367169689Skan#elif INT_KIND == 2
368169689Skan#define INT_TO_DFP	__floatditd
369169689Skan#define DFP_TO_INT	__fixtddi
370169689Skan#elif INT_KIND == 3
371169689Skan#define INT_TO_DFP	__floatunssitd
372169689Skan#define DFP_TO_INT	__fixunstdsi
373169689Skan#elif INT_KIND == 4
374169689Skan#define INT_TO_DFP	__floatunsditd
375169689Skan#define DFP_TO_INT	__fixunstddi
376169689Skan#endif
377169689Skan#endif
378169689Skan
379169689Skan/* Names of functions to convert between decimal float and binary float.  */
380169689Skan
381169689Skan#if WIDTH == 32
382169689Skan#if BFP_KIND == 1
383169689Skan#define BFP_TO_DFP	__extendsfsd
384169689Skan#define DFP_TO_BFP	__truncsdsf
385169689Skan#elif BFP_KIND == 2
386169689Skan#define BFP_TO_DFP	__truncdfsd
387169689Skan#define DFP_TO_BFP	__extendsddf
388169689Skan#elif BFP_KIND == 3
389169689Skan#define BFP_TO_DFP	__truncxfsd
390169689Skan#define DFP_TO_BFP	__extendsdxf
391169689Skan#endif /* BFP_KIND */
392169689Skan
393169689Skan#elif WIDTH == 64
394169689Skan#if BFP_KIND == 1
395169689Skan#define BFP_TO_DFP	__extendsfdd
396169689Skan#define DFP_TO_BFP	__truncddsf
397169689Skan#elif BFP_KIND == 2
398169689Skan#define BFP_TO_DFP	__extenddfdd
399169689Skan#define DFP_TO_BFP	__truncdddf
400169689Skan#elif BFP_KIND == 3
401169689Skan#define BFP_TO_DFP	__truncxfdd
402169689Skan#define DFP_TO_BFP	__extendddxf
403169689Skan#endif /* BFP_KIND */
404169689Skan
405169689Skan#elif WIDTH == 128
406169689Skan#if BFP_KIND == 1
407169689Skan#define BFP_TO_DFP	__extendsftd
408169689Skan#define DFP_TO_BFP	__trunctdsf
409169689Skan#elif BFP_KIND == 2
410169689Skan#define BFP_TO_DFP	__extenddftd
411169689Skan#define DFP_TO_BFP	__trunctddf
412169689Skan#elif BFP_KIND == 3
413169689Skan#define BFP_TO_DFP	__extendxftd
414169689Skan#define DFP_TO_BFP	__trunctdxf
415169689Skan#endif /* BFP_KIND */
416169689Skan
417169689Skan#endif /* WIDTH */
418169689Skan
419169689Skan/* Some handy typedefs.  */
420169689Skan
421169689Skantypedef float SFtype __attribute__ ((mode (SF)));
422169689Skantypedef float DFtype __attribute__ ((mode (DF)));
423169689Skan#if LIBGCC2_HAS_XF_MODE
424169689Skantypedef float XFtype __attribute__ ((mode (XF)));
425169689Skan#endif /* LIBGCC2_HAS_XF_MODE */
426169689Skan
427169689Skantypedef int SItype __attribute__ ((mode (SI)));
428169689Skantypedef int DItype __attribute__ ((mode (DI)));
429169689Skantypedef unsigned int USItype __attribute__ ((mode (SI)));
430169689Skantypedef unsigned int UDItype __attribute__ ((mode (DI)));
431169689Skan
432169689Skan/* The type of the result of a decimal float comparison.  This must
433169689Skan   match `word_mode' in GCC for the target.  */
434169689Skan
435169689Skantypedef int CMPtype __attribute__ ((mode (word)));
436169689Skan
437169689Skan/* Prototypes.  */
438169689Skan
439169689Skan#if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
440169689Skanextern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
441169689Skan#endif
442169689Skan
443169689Skan#if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
444169689Skanextern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
445169689Skan#endif
446169689Skan
447169689Skan#if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
448169689Skanextern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
449169689Skanextern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
450169689Skan#endif
451169689Skan
452169689Skan#if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
453169689Skanextern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
454169689Skan#endif
455169689Skan
456169689Skan#if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
457169689Skanextern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
458169689Skan#endif
459169689Skan
460169689Skan#if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
461169689Skanextern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
462169689Skan#endif
463169689Skan
464169689Skan#if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
465169689Skanextern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
466169689Skan#endif
467169689Skan
468169689Skan#if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
469169689Skanextern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
470169689Skan#endif
471169689Skan
472169689Skan#if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
473169689Skanextern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
474169689Skan#endif
475169689Skan
476169689Skan#if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
477169689Skanextern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
478169689Skan#endif
479169689Skan
480169689Skan#if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
481169689Skan || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
482169689Skanextern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
483169689Skan#endif
484169689Skan
485169689Skan#if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
486169689Skan || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
487169689Skan || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
488169689Skan || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
489169689Skanextern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
490169689Skan#endif
491169689Skan
492169689Skan#if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
493169689Skan || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
494169689Skan || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
495169689Skan || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
496169689Skanextern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
497169689Skan#endif
498169689Skan
499169689Skan#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
500169689Skan || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
501169689Skan || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
502169689Skan     && LIBGCC2_HAS_XF_MODE)
503169689Skanextern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
504169689Skan#endif
505169689Skan
506169689Skan#if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
507169689Skan || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
508169689Skan || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
509169689Skan     && LIBGCC2_HAS_XF_MODE)
510169689Skanextern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
511169689Skan#endif
512169689Skan
513169689Skan#endif /* _DFPBIT_H */
514