xref: /openbsd-src/gnu/gcc/gcc/config/dfp-bit.h (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* Header file for dfp-bit.c.
2*404b540aSrobert    Copyright (C) 2005, 2006 Free Software Foundation, Inc.
3*404b540aSrobert 
4*404b540aSrobert This file is part of GCC.
5*404b540aSrobert 
6*404b540aSrobert GCC is free software; you can redistribute it and/or modify it under
7*404b540aSrobert the terms of the GNU General Public License as published by the Free
8*404b540aSrobert Software Foundation; either version 2, or (at your option) any later
9*404b540aSrobert version.
10*404b540aSrobert 
11*404b540aSrobert In addition to the permissions in the GNU General Public License, the
12*404b540aSrobert Free Software Foundation gives you unlimited permission to link the
13*404b540aSrobert compiled version of this file into combinations with other programs,
14*404b540aSrobert and to distribute those combinations without any restriction coming
15*404b540aSrobert from the use of this file.  (The General Public License restrictions
16*404b540aSrobert do apply in other respects; for example, they cover modification of
17*404b540aSrobert the file, and distribution when not linked into a combine
18*404b540aSrobert executable.)
19*404b540aSrobert 
20*404b540aSrobert GCC is distributed in the hope that it will be useful, but WITHOUT ANY
21*404b540aSrobert WARRANTY; without even the implied warranty of MERCHANTABILITY or
22*404b540aSrobert FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23*404b540aSrobert for more details.
24*404b540aSrobert 
25*404b540aSrobert You should have received a copy of the GNU General Public License
26*404b540aSrobert along with GCC; see the file COPYING.  If not, write to the Free
27*404b540aSrobert Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28*404b540aSrobert 02110-1301, USA.  */
29*404b540aSrobert 
30*404b540aSrobert #ifndef _DFPBIT_H
31*404b540aSrobert #define _DFPBIT_H
32*404b540aSrobert 
33*404b540aSrobert #include "tconfig.h"
34*404b540aSrobert #include "coretypes.h"
35*404b540aSrobert #include "tm.h"
36*404b540aSrobert 
37*404b540aSrobert #ifndef LIBGCC2_WORDS_BIG_ENDIAN
38*404b540aSrobert #define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
39*404b540aSrobert #endif
40*404b540aSrobert 
41*404b540aSrobert #ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
42*404b540aSrobert #define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
43*404b540aSrobert #endif
44*404b540aSrobert 
45*404b540aSrobert #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
46*404b540aSrobert #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
47*404b540aSrobert #endif
48*404b540aSrobert 
49*404b540aSrobert #ifndef LIBGCC2_HAS_XF_MODE
50*404b540aSrobert #define LIBGCC2_HAS_XF_MODE \
51*404b540aSrobert   (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
52*404b540aSrobert #endif
53*404b540aSrobert 
54*404b540aSrobert /* Depending on WIDTH, define a number of macros:
55*404b540aSrobert 
56*404b540aSrobert    DFP_C_TYPE: type of the arguments to the libgcc functions;
57*404b540aSrobert 	(eg _Decimal32)
58*404b540aSrobert 
59*404b540aSrobert    IEEE_TYPE: the corresponding (encoded) IEEE754R type;
60*404b540aSrobert 	(eg decimal32)
61*404b540aSrobert 
62*404b540aSrobert    TO_INTERNAL: the name of the decNumber function to convert an
63*404b540aSrobert    encoded value into the decNumber internal representation;
64*404b540aSrobert 
65*404b540aSrobert    TO_ENCODED: the name of the decNumber function to convert an
66*404b540aSrobert    internally represented decNumber into the encoded
67*404b540aSrobert    representation.
68*404b540aSrobert 
69*404b540aSrobert    FROM_STRING: the name of the decNumber function to read an
70*404b540aSrobert    encoded value from a string.
71*404b540aSrobert 
72*404b540aSrobert    TO_STRING: the name of the decNumber function to write an
73*404b540aSrobert    encoded value to a string.  */
74*404b540aSrobert 
75*404b540aSrobert #if WIDTH == 32
76*404b540aSrobert #define DFP_C_TYPE	_Decimal32
77*404b540aSrobert #define IEEE_TYPE	decimal32
78*404b540aSrobert #define HOST_TO_IEEE	__host_to_ieee_32
79*404b540aSrobert #define IEEE_TO_HOST	__ieee_to_host_32
80*404b540aSrobert #define TO_INTERNAL	__decimal32ToNumber
81*404b540aSrobert #define TO_ENCODED	__decimal32FromNumber
82*404b540aSrobert #define FROM_STRING	__decimal32FromString
83*404b540aSrobert #define TO_STRING	__decimal32ToString
84*404b540aSrobert #elif WIDTH == 64
85*404b540aSrobert #define DFP_C_TYPE	_Decimal64
86*404b540aSrobert #define IEEE_TYPE	decimal64
87*404b540aSrobert #define HOST_TO_IEEE	__host_to_ieee_64
88*404b540aSrobert #define IEEE_TO_HOST	__ieee_to_host_64
89*404b540aSrobert #define TO_INTERNAL	__decimal64ToNumber
90*404b540aSrobert #define TO_ENCODED	__decimal64FromNumber
91*404b540aSrobert #define FROM_STRING	__decimal64FromString
92*404b540aSrobert #define TO_STRING	__decimal64ToString
93*404b540aSrobert #elif WIDTH == 128
94*404b540aSrobert #define DFP_C_TYPE	_Decimal128
95*404b540aSrobert #define IEEE_TYPE	decimal128
96*404b540aSrobert #define HOST_TO_IEEE	__host_to_ieee_128
97*404b540aSrobert #define IEEE_TO_HOST	__ieee_to_host_128
98*404b540aSrobert #define TO_INTERNAL	__decimal128ToNumber
99*404b540aSrobert #define TO_ENCODED	__decimal128FromNumber
100*404b540aSrobert #define FROM_STRING	__decimal128FromString
101*404b540aSrobert #define TO_STRING	__decimal128ToString
102*404b540aSrobert #else
103*404b540aSrobert #error invalid decimal float word width
104*404b540aSrobert #endif
105*404b540aSrobert 
106*404b540aSrobert /* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
107*404b540aSrobert    operations and constants to the range and precision of the _Decimal128
108*404b540aSrobert    type.  Make it so.  */
109*404b540aSrobert #if WIDTH == 32
110*404b540aSrobert #define CONTEXT_INIT DEC_INIT_DECIMAL32
111*404b540aSrobert #elif WIDTH == 64
112*404b540aSrobert #define CONTEXT_INIT DEC_INIT_DECIMAL64
113*404b540aSrobert #elif WIDTH == 128
114*404b540aSrobert #define CONTEXT_INIT DEC_INIT_DECIMAL128
115*404b540aSrobert #endif
116*404b540aSrobert 
117*404b540aSrobert /* Define CONTEXT_ROUND to obtain the current decNumber rounding mode.  */
118*404b540aSrobert extern enum rounding	__decGetRound (void);
119*404b540aSrobert #define CONTEXT_ROUND	__decGetRound ()
120*404b540aSrobert 
121*404b540aSrobert extern int __dfp_traps;
122*404b540aSrobert #define CONTEXT_TRAPS	__dfp_traps
123*404b540aSrobert #define CONTEXT_ERRORS(context)	context.status & DEC_Errors
124*404b540aSrobert extern void __dfp_raise (int);
125*404b540aSrobert #define DFP_RAISE(A)	__dfp_raise(A)
126*404b540aSrobert 
127*404b540aSrobert /* Conversions between different decimal float types use WIDTH_TO to
128*404b540aSrobert    determine additional macros to define.  */
129*404b540aSrobert 
130*404b540aSrobert #if defined (L_dd_to_sd) || defined (L_td_to_sd)
131*404b540aSrobert #define WIDTH_TO 32
132*404b540aSrobert #elif defined (L_sd_to_dd) || defined (L_td_to_dd)
133*404b540aSrobert #define WIDTH_TO 64
134*404b540aSrobert #elif defined (L_sd_to_td) || defined (L_dd_to_td)
135*404b540aSrobert #define WIDTH_TO 128
136*404b540aSrobert #endif
137*404b540aSrobert 
138*404b540aSrobert /* If WIDTH_TO is defined, define additional macros:
139*404b540aSrobert 
140*404b540aSrobert    DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
141*404b540aSrobert 
142*404b540aSrobert    IEEE_TYPE_TO: the corresponding (encoded) IEEE754R type.
143*404b540aSrobert 
144*404b540aSrobert    TO_ENCODED_TO: the name of the decNumber function to convert an
145*404b540aSrobert    internally represented decNumber into the encoded representation
146*404b540aSrobert    for the destination.  */
147*404b540aSrobert 
148*404b540aSrobert #if WIDTH_TO == 32
149*404b540aSrobert #define DFP_C_TYPE_TO	_Decimal32
150*404b540aSrobert #define IEEE_TYPE_TO	decimal32
151*404b540aSrobert #define TO_ENCODED_TO	__decimal32FromNumber
152*404b540aSrobert #define IEEE_TO_HOST_TO __ieee_to_host_32
153*404b540aSrobert #elif WIDTH_TO == 64
154*404b540aSrobert #define DFP_C_TYPE_TO	_Decimal64
155*404b540aSrobert #define IEEE_TYPE_TO	decimal64
156*404b540aSrobert #define TO_ENCODED_TO	__decimal64FromNumber
157*404b540aSrobert #define IEEE_TO_HOST_TO __ieee_to_host_64
158*404b540aSrobert #elif WIDTH_TO == 128
159*404b540aSrobert #define DFP_C_TYPE_TO	_Decimal128
160*404b540aSrobert #define IEEE_TYPE_TO	decimal128
161*404b540aSrobert #define TO_ENCODED_TO	__decimal128FromNumber
162*404b540aSrobert #define IEEE_TO_HOST_TO __ieee_to_host_128
163*404b540aSrobert #endif
164*404b540aSrobert 
165*404b540aSrobert /* Conversions between decimal float types and integral types use INT_KIND
166*404b540aSrobert    to determine the data type and C functions to use.  */
167*404b540aSrobert 
168*404b540aSrobert #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si)  \
169*404b540aSrobert    || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
170*404b540aSrobert #define INT_KIND 1
171*404b540aSrobert #elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
172*404b540aSrobert    || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
173*404b540aSrobert #define INT_KIND 2
174*404b540aSrobert #elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
175*404b540aSrobert    || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
176*404b540aSrobert #define INT_KIND 3
177*404b540aSrobert #elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
178*404b540aSrobert    || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
179*404b540aSrobert #define INT_KIND 4
180*404b540aSrobert #endif
181*404b540aSrobert 
182*404b540aSrobert /*  If INT_KIND is defined, define additional macros:
183*404b540aSrobert 
184*404b540aSrobert     INT_TYPE: The integer data type.
185*404b540aSrobert 
186*404b540aSrobert     INT_FMT: The format string for writing the integer to a string.
187*404b540aSrobert 
188*404b540aSrobert     CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
189*404b540aSrobert     This works for ILP32 and LP64, won't for other type size systems.
190*404b540aSrobert 
191*404b540aSrobert     STR_TO_INT: The function to read the integer from a string.  */
192*404b540aSrobert 
193*404b540aSrobert #if INT_KIND == 1
194*404b540aSrobert #define INT_TYPE SItype
195*404b540aSrobert #define INT_FMT "%d"
196*404b540aSrobert #define CAST_FOR_FMT(A) (int)A
197*404b540aSrobert #define STR_TO_INT strtol
198*404b540aSrobert #elif INT_KIND == 2
199*404b540aSrobert #define INT_TYPE DItype
200*404b540aSrobert #define INT_FMT "%lld"
201*404b540aSrobert #define CAST_FOR_FMT(A) (long long)A
202*404b540aSrobert #define STR_TO_INT strtoll
203*404b540aSrobert #elif INT_KIND == 3
204*404b540aSrobert #define INT_TYPE USItype
205*404b540aSrobert #define INT_FMT "%u"
206*404b540aSrobert #define CAST_FOR_FMT(A) (unsigned int)A
207*404b540aSrobert #define STR_TO_INT strtoul
208*404b540aSrobert #elif INT_KIND == 4
209*404b540aSrobert #define INT_TYPE UDItype
210*404b540aSrobert #define INT_FMT "%llu"
211*404b540aSrobert #define CAST_FOR_FMT(A) (unsigned long long)A
212*404b540aSrobert #define STR_TO_INT strtoull
213*404b540aSrobert #endif
214*404b540aSrobert 
215*404b540aSrobert /* Conversions between decimal float types and binary float types use
216*404b540aSrobert    BFP_KIND to determine the data type and C functions to use.  */
217*404b540aSrobert 
218*404b540aSrobert #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
219*404b540aSrobert  || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
220*404b540aSrobert #define BFP_KIND 1
221*404b540aSrobert #elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
222*404b540aSrobert  ||   defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
223*404b540aSrobert #define BFP_KIND 2
224*404b540aSrobert #elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
225*404b540aSrobert  ||   defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
226*404b540aSrobert #define BFP_KIND 3
227*404b540aSrobert #endif
228*404b540aSrobert 
229*404b540aSrobert /*  If BFP_KIND is defined, define additional macros:
230*404b540aSrobert 
231*404b540aSrobert     BFP_TYPE: The binary floating point data type.
232*404b540aSrobert 
233*404b540aSrobert     BFP_FMT: The format string for writing the value to a string.
234*404b540aSrobert 
235*404b540aSrobert     STR_TO_BFP: The function to read the value from a string.  */
236*404b540aSrobert 
237*404b540aSrobert #if BFP_KIND == 1
238*404b540aSrobert /* strtof is declared in <stdlib.h> only for C99.  */
239*404b540aSrobert extern float strtof (const char *, char **);
240*404b540aSrobert #define BFP_TYPE SFtype
241*404b540aSrobert #define BFP_FMT "%e"
242*404b540aSrobert #define STR_TO_BFP strtof
243*404b540aSrobert 
244*404b540aSrobert #elif BFP_KIND == 2
245*404b540aSrobert #define BFP_TYPE DFtype
246*404b540aSrobert #define BFP_FMT "%e"
247*404b540aSrobert #define STR_TO_BFP strtod
248*404b540aSrobert 
249*404b540aSrobert #elif BFP_KIND == 3
250*404b540aSrobert #if LIBGCC2_HAS_XF_MODE
251*404b540aSrobert /* These aren't used if XF mode is not supported.  */
252*404b540aSrobert #define BFP_TYPE XFtype
253*404b540aSrobert #define BFP_FMT "%e"
254*404b540aSrobert #define BFP_VIA_TYPE double
255*404b540aSrobert #define STR_TO_BFP strtod
256*404b540aSrobert #endif
257*404b540aSrobert 
258*404b540aSrobert #endif /* BFP_KIND */
259*404b540aSrobert 
260*404b540aSrobert #if WIDTH == 128 || WIDTH_TO == 128
261*404b540aSrobert #include "decimal128.h"
262*404b540aSrobert #endif
263*404b540aSrobert #if WIDTH == 64 || WIDTH_TO == 64
264*404b540aSrobert #include "decimal64.h"
265*404b540aSrobert #endif
266*404b540aSrobert #if WIDTH == 32 || WIDTH_TO == 32
267*404b540aSrobert #include "decimal32.h"
268*404b540aSrobert #endif
269*404b540aSrobert #include "decNumber.h"
270*404b540aSrobert 
271*404b540aSrobert /* Names of arithmetic functions.  */
272*404b540aSrobert 
273*404b540aSrobert #if WIDTH == 32
274*404b540aSrobert #define DFP_ADD		__addsd3
275*404b540aSrobert #define DFP_SUB		__subsd3
276*404b540aSrobert #define DFP_MULTIPLY	__mulsd3
277*404b540aSrobert #define DFP_DIVIDE	__divsd3
278*404b540aSrobert #define DFP_EQ		__eqsd2
279*404b540aSrobert #define DFP_NE		__nesd2
280*404b540aSrobert #define DFP_LT		__ltsd2
281*404b540aSrobert #define DFP_GT		__gtsd2
282*404b540aSrobert #define DFP_LE		__lesd2
283*404b540aSrobert #define DFP_GE		__gesd2
284*404b540aSrobert #define DFP_UNORD	__unordsd2
285*404b540aSrobert #elif WIDTH == 64
286*404b540aSrobert #define DFP_ADD		__adddd3
287*404b540aSrobert #define DFP_SUB		__subdd3
288*404b540aSrobert #define DFP_MULTIPLY	__muldd3
289*404b540aSrobert #define DFP_DIVIDE	__divdd3
290*404b540aSrobert #define DFP_EQ		__eqdd2
291*404b540aSrobert #define DFP_NE		__nedd2
292*404b540aSrobert #define DFP_LT		__ltdd2
293*404b540aSrobert #define DFP_GT		__gtdd2
294*404b540aSrobert #define DFP_LE		__ledd2
295*404b540aSrobert #define DFP_GE		__gedd2
296*404b540aSrobert #define DFP_UNORD	__unorddd2
297*404b540aSrobert #elif WIDTH == 128
298*404b540aSrobert #define DFP_ADD		__addtd3
299*404b540aSrobert #define DFP_SUB		__subtd3
300*404b540aSrobert #define DFP_MULTIPLY	__multd3
301*404b540aSrobert #define DFP_DIVIDE	__divtd3
302*404b540aSrobert #define DFP_EQ		__eqtd2
303*404b540aSrobert #define DFP_NE		__netd2
304*404b540aSrobert #define DFP_LT		__lttd2
305*404b540aSrobert #define DFP_GT		__gttd2
306*404b540aSrobert #define DFP_LE		__letd2
307*404b540aSrobert #define DFP_GE		__getd2
308*404b540aSrobert #define DFP_UNORD	__unordtd2
309*404b540aSrobert #endif
310*404b540aSrobert 
311*404b540aSrobert /* Names of functions to convert between different decimal float types.  */
312*404b540aSrobert 
313*404b540aSrobert #if WIDTH == 32
314*404b540aSrobert #if WIDTH_TO == 64
315*404b540aSrobert #define DFP_TO_DFP	__extendsddd2
316*404b540aSrobert #elif WIDTH_TO == 128
317*404b540aSrobert #define DFP_TO_DFP	__extendsdtd2
318*404b540aSrobert #endif
319*404b540aSrobert #elif WIDTH == 64
320*404b540aSrobert #if WIDTH_TO == 32
321*404b540aSrobert #define DFP_TO_DFP	__truncddsd2
322*404b540aSrobert #elif WIDTH_TO == 128
323*404b540aSrobert #define DFP_TO_DFP	__extendddtd2
324*404b540aSrobert #endif
325*404b540aSrobert #elif WIDTH == 128
326*404b540aSrobert #if WIDTH_TO == 32
327*404b540aSrobert #define DFP_TO_DFP	__trunctdsd2
328*404b540aSrobert #elif WIDTH_TO == 64
329*404b540aSrobert #define DFP_TO_DFP	__trunctddd2
330*404b540aSrobert #endif
331*404b540aSrobert #endif
332*404b540aSrobert 
333*404b540aSrobert /* Names of functions to convert between decimal float and integers.  */
334*404b540aSrobert 
335*404b540aSrobert #if WIDTH == 32
336*404b540aSrobert #if INT_KIND == 1
337*404b540aSrobert #define INT_TO_DFP	__floatsisd
338*404b540aSrobert #define DFP_TO_INT	__fixsdsi
339*404b540aSrobert #elif INT_KIND == 2
340*404b540aSrobert #define INT_TO_DFP	__floatdisd
341*404b540aSrobert #define DFP_TO_INT	__fixsddi
342*404b540aSrobert #elif INT_KIND == 3
343*404b540aSrobert #define INT_TO_DFP	__floatunssisd
344*404b540aSrobert #define DFP_TO_INT	__fixunssdsi
345*404b540aSrobert #elif INT_KIND == 4
346*404b540aSrobert #define INT_TO_DFP	__floatunsdisd
347*404b540aSrobert #define DFP_TO_INT	__fixunssddi
348*404b540aSrobert #endif
349*404b540aSrobert #elif WIDTH == 64
350*404b540aSrobert #if INT_KIND == 1
351*404b540aSrobert #define INT_TO_DFP	__floatsidd
352*404b540aSrobert #define DFP_TO_INT	__fixddsi
353*404b540aSrobert #elif INT_KIND == 2
354*404b540aSrobert #define INT_TO_DFP	__floatdidd
355*404b540aSrobert #define DFP_TO_INT	__fixdddi
356*404b540aSrobert #elif INT_KIND == 3
357*404b540aSrobert #define INT_TO_DFP	__floatunssidd
358*404b540aSrobert #define DFP_TO_INT	__fixunsddsi
359*404b540aSrobert #elif INT_KIND == 4
360*404b540aSrobert #define INT_TO_DFP	__floatunsdidd
361*404b540aSrobert #define DFP_TO_INT	__fixunsdddi
362*404b540aSrobert #endif
363*404b540aSrobert #elif WIDTH == 128
364*404b540aSrobert #if INT_KIND == 1
365*404b540aSrobert #define INT_TO_DFP	__floatsitd
366*404b540aSrobert #define DFP_TO_INT	__fixtdsi
367*404b540aSrobert #elif INT_KIND == 2
368*404b540aSrobert #define INT_TO_DFP	__floatditd
369*404b540aSrobert #define DFP_TO_INT	__fixtddi
370*404b540aSrobert #elif INT_KIND == 3
371*404b540aSrobert #define INT_TO_DFP	__floatunssitd
372*404b540aSrobert #define DFP_TO_INT	__fixunstdsi
373*404b540aSrobert #elif INT_KIND == 4
374*404b540aSrobert #define INT_TO_DFP	__floatunsditd
375*404b540aSrobert #define DFP_TO_INT	__fixunstddi
376*404b540aSrobert #endif
377*404b540aSrobert #endif
378*404b540aSrobert 
379*404b540aSrobert /* Names of functions to convert between decimal float and binary float.  */
380*404b540aSrobert 
381*404b540aSrobert #if WIDTH == 32
382*404b540aSrobert #if BFP_KIND == 1
383*404b540aSrobert #define BFP_TO_DFP	__extendsfsd
384*404b540aSrobert #define DFP_TO_BFP	__truncsdsf
385*404b540aSrobert #elif BFP_KIND == 2
386*404b540aSrobert #define BFP_TO_DFP	__truncdfsd
387*404b540aSrobert #define DFP_TO_BFP	__extendsddf
388*404b540aSrobert #elif BFP_KIND == 3
389*404b540aSrobert #define BFP_TO_DFP	__truncxfsd
390*404b540aSrobert #define DFP_TO_BFP	__extendsdxf
391*404b540aSrobert #endif /* BFP_KIND */
392*404b540aSrobert 
393*404b540aSrobert #elif WIDTH == 64
394*404b540aSrobert #if BFP_KIND == 1
395*404b540aSrobert #define BFP_TO_DFP	__extendsfdd
396*404b540aSrobert #define DFP_TO_BFP	__truncddsf
397*404b540aSrobert #elif BFP_KIND == 2
398*404b540aSrobert #define BFP_TO_DFP	__extenddfdd
399*404b540aSrobert #define DFP_TO_BFP	__truncdddf
400*404b540aSrobert #elif BFP_KIND == 3
401*404b540aSrobert #define BFP_TO_DFP	__truncxfdd
402*404b540aSrobert #define DFP_TO_BFP	__extendddxf
403*404b540aSrobert #endif /* BFP_KIND */
404*404b540aSrobert 
405*404b540aSrobert #elif WIDTH == 128
406*404b540aSrobert #if BFP_KIND == 1
407*404b540aSrobert #define BFP_TO_DFP	__extendsftd
408*404b540aSrobert #define DFP_TO_BFP	__trunctdsf
409*404b540aSrobert #elif BFP_KIND == 2
410*404b540aSrobert #define BFP_TO_DFP	__extenddftd
411*404b540aSrobert #define DFP_TO_BFP	__trunctddf
412*404b540aSrobert #elif BFP_KIND == 3
413*404b540aSrobert #define BFP_TO_DFP	__extendxftd
414*404b540aSrobert #define DFP_TO_BFP	__trunctdxf
415*404b540aSrobert #endif /* BFP_KIND */
416*404b540aSrobert 
417*404b540aSrobert #endif /* WIDTH */
418*404b540aSrobert 
419*404b540aSrobert /* Some handy typedefs.  */
420*404b540aSrobert 
421*404b540aSrobert typedef float SFtype __attribute__ ((mode (SF)));
422*404b540aSrobert typedef float DFtype __attribute__ ((mode (DF)));
423*404b540aSrobert #if LIBGCC2_HAS_XF_MODE
424*404b540aSrobert typedef float XFtype __attribute__ ((mode (XF)));
425*404b540aSrobert #endif /* LIBGCC2_HAS_XF_MODE */
426*404b540aSrobert 
427*404b540aSrobert typedef int SItype __attribute__ ((mode (SI)));
428*404b540aSrobert typedef int DItype __attribute__ ((mode (DI)));
429*404b540aSrobert typedef unsigned int USItype __attribute__ ((mode (SI)));
430*404b540aSrobert typedef unsigned int UDItype __attribute__ ((mode (DI)));
431*404b540aSrobert 
432*404b540aSrobert /* The type of the result of a decimal float comparison.  This must
433*404b540aSrobert    match `word_mode' in GCC for the target.  */
434*404b540aSrobert 
435*404b540aSrobert typedef int CMPtype __attribute__ ((mode (word)));
436*404b540aSrobert 
437*404b540aSrobert /* Prototypes.  */
438*404b540aSrobert 
439*404b540aSrobert #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
440*404b540aSrobert extern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
441*404b540aSrobert #endif
442*404b540aSrobert 
443*404b540aSrobert #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
444*404b540aSrobert extern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
445*404b540aSrobert #endif
446*404b540aSrobert 
447*404b540aSrobert #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
448*404b540aSrobert extern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
449*404b540aSrobert extern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
450*404b540aSrobert #endif
451*404b540aSrobert 
452*404b540aSrobert #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
453*404b540aSrobert extern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
454*404b540aSrobert #endif
455*404b540aSrobert 
456*404b540aSrobert #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
457*404b540aSrobert extern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
458*404b540aSrobert #endif
459*404b540aSrobert 
460*404b540aSrobert #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
461*404b540aSrobert extern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
462*404b540aSrobert #endif
463*404b540aSrobert 
464*404b540aSrobert #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
465*404b540aSrobert extern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
466*404b540aSrobert #endif
467*404b540aSrobert 
468*404b540aSrobert #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
469*404b540aSrobert extern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
470*404b540aSrobert #endif
471*404b540aSrobert 
472*404b540aSrobert #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
473*404b540aSrobert extern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
474*404b540aSrobert #endif
475*404b540aSrobert 
476*404b540aSrobert #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
477*404b540aSrobert extern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
478*404b540aSrobert #endif
479*404b540aSrobert 
480*404b540aSrobert #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
481*404b540aSrobert  || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
482*404b540aSrobert extern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
483*404b540aSrobert #endif
484*404b540aSrobert 
485*404b540aSrobert #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
486*404b540aSrobert  || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
487*404b540aSrobert  || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
488*404b540aSrobert  || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
489*404b540aSrobert extern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
490*404b540aSrobert #endif
491*404b540aSrobert 
492*404b540aSrobert #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
493*404b540aSrobert  || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
494*404b540aSrobert  || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
495*404b540aSrobert  || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
496*404b540aSrobert extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
497*404b540aSrobert #endif
498*404b540aSrobert 
499*404b540aSrobert #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
500*404b540aSrobert  || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
501*404b540aSrobert  || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
502*404b540aSrobert      && LIBGCC2_HAS_XF_MODE)
503*404b540aSrobert extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
504*404b540aSrobert #endif
505*404b540aSrobert 
506*404b540aSrobert #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
507*404b540aSrobert  || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
508*404b540aSrobert  || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
509*404b540aSrobert      && LIBGCC2_HAS_XF_MODE)
510*404b540aSrobert extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
511*404b540aSrobert #endif
512*404b540aSrobert 
513*404b540aSrobert #endif /* _DFPBIT_H */
514