Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6515 serge 1
/* Header file for dfp-bit.c.
2
   Copyright (C) 2005-2015 Free Software Foundation, Inc.
3
 
4
This file is part of GCC.
5
 
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 3, or (at your option) any later
9
version.
10
 
11
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12
WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
for more details.
15
 
16
Under Section 7 of GPL version 3, you are granted additional
17
permissions described in the GCC Runtime Library Exception, version
18
3.1, as published by the Free Software Foundation.
19
 
20
You should have received a copy of the GNU General Public License and
21
a copy of the GCC Runtime Library Exception along with this program;
22
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
.  */
24
 
25
#ifndef _DFPBIT_H
26
#define _DFPBIT_H
27
 
28
#include 
29
#include 
30
#include 
31
#include 
32
#include "tconfig.h"
33
#include "coretypes.h"
34
#include "tm.h"
35
#include "libgcc_tm.h"
36
 
37
/* We need to know the size of long double that the C library supports.
38
   Don't use LIBGCC2_HAS_XF_MODE or LIBGCC2_HAS_TF_MODE here because
39
   some targets set both of those.  */
40
 
41
#ifndef __LIBGCC_XF_MANT_DIG__
42
#define __LIBGCC_XF_MANT_DIG__ 0
43
#endif
44
#define LONG_DOUBLE_HAS_XF_MODE \
45
  (__LDBL_MANT_DIG__ == __LIBGCC_XF_MANT_DIG__)
46
 
47
#ifndef __LIBGCC_TF_MANT_DIG__
48
#define __LIBGCC_TF_MANT_DIG__ 0
49
#endif
50
#define LONG_DOUBLE_HAS_TF_MODE \
51
  (__LDBL_MANT_DIG__ == __LIBGCC_TF_MANT_DIG__)
52
 
53
/* Depending on WIDTH, define a number of macros:
54
 
55
   DFP_C_TYPE: type of the arguments to the libgcc functions;
56
	(eg _Decimal32)
57
 
58
   IEEE_TYPE: the corresponding (encoded) IEEE754 type;
59
	(eg decimal32)
60
 
61
   TO_INTERNAL: the name of the decNumber function to convert an
62
   encoded value into the decNumber internal representation;
63
 
64
   TO_ENCODED: the name of the decNumber function to convert an
65
   internally represented decNumber into the encoded
66
   representation.
67
 
68
   FROM_STRING: the name of the decNumber function to read an
69
   encoded value from a string.
70
 
71
   TO_STRING: the name of the decNumber function to write an
72
   encoded value to a string.  */
73
 
74
#if WIDTH == 32
75
#define DFP_C_TYPE	_Decimal32
76
#define IEEE_TYPE	decimal32
77
#define HOST_TO_IEEE	__host_to_ieee_32
78
#define IEEE_TO_HOST	__ieee_to_host_32
79
#define TO_INTERNAL	__decimal32ToNumber
80
#define TO_ENCODED	__decimal32FromNumber
81
#define FROM_STRING	__decimal32FromString
82
#define TO_STRING	__decimal32ToString
83
#elif WIDTH == 64
84
#define DFP_C_TYPE	_Decimal64
85
#define IEEE_TYPE	decimal64
86
#define HOST_TO_IEEE	__host_to_ieee_64
87
#define IEEE_TO_HOST	__ieee_to_host_64
88
#define TO_INTERNAL	__decimal64ToNumber
89
#define TO_ENCODED	__decimal64FromNumber
90
#define FROM_STRING	__decimal64FromString
91
#define TO_STRING	__decimal64ToString
92
#elif WIDTH == 128
93
#define DFP_C_TYPE	_Decimal128
94
#define IEEE_TYPE	decimal128
95
#define HOST_TO_IEEE	__host_to_ieee_128
96
#define IEEE_TO_HOST	__ieee_to_host_128
97
#define TO_INTERNAL	__decimal128ToNumber
98
#define TO_ENCODED	__decimal128FromNumber
99
#define FROM_STRING	__decimal128FromString
100
#define TO_STRING	__decimal128ToString
101
#else
102
#error invalid decimal float word width
103
#endif
104
 
105
/* We define __DEC_EVAL_METHOD__ to 2, saying that we evaluate all
106
   operations and constants to the range and precision of the _Decimal128
107
   type.  Make it so.  */
108
#if WIDTH == 32
109
#define CONTEXT_INIT DEC_INIT_DECIMAL32
110
#elif WIDTH == 64
111
#define CONTEXT_INIT DEC_INIT_DECIMAL64
112
#elif WIDTH == 128
113
#define CONTEXT_INIT DEC_INIT_DECIMAL128
114
#endif
115
 
116
#ifndef DFP_INIT_ROUNDMODE
117
#define DFP_INIT_ROUNDMODE(A) A = DEC_ROUND_HALF_EVEN
118
#endif
119
 
120
#ifdef DFP_EXCEPTIONS_ENABLED
121
/* Return IEEE exception flags based on decNumber status flags.  */
122
#define DFP_IEEE_FLAGS(DEC_FLAGS) __extension__			\
123
({int _fe_flags = 0;						\
124
  if ((dec_flags & DEC_IEEE_854_Division_by_zero) != 0)		\
125
    _fe_flags |= FE_DIVBYZERO;					\
126
  if ((dec_flags & DEC_IEEE_854_Inexact) != 0)			\
127
    _fe_flags |= FE_INEXACT;					\
128
  if ((dec_flags & DEC_IEEE_854_Invalid_operation) != 0)	\
129
    _fe_flags |= FE_INVALID;					\
130
  if ((dec_flags & DEC_IEEE_854_Overflow) != 0)			\
131
    _fe_flags |= FE_OVERFLOW;					\
132
  if ((dec_flags & DEC_IEEE_854_Underflow) != 0)		\
133
    _fe_flags |= FE_UNDERFLOW;					\
134
  _fe_flags; })
135
#else
136
#define DFP_EXCEPTIONS_ENABLED 0
137
#define DFP_IEEE_FLAGS(A) 0
138
#define DFP_HANDLE_EXCEPTIONS(A) do {} while (0)
139
#endif
140
 
141
/* Conversions between different decimal float types use WIDTH_TO to
142
   determine additional macros to define.  */
143
 
144
#if defined (L_dd_to_sd) || defined (L_td_to_sd)
145
#define WIDTH_TO 32
146
#elif defined (L_sd_to_dd) || defined (L_td_to_dd)
147
#define WIDTH_TO 64
148
#elif defined (L_sd_to_td) || defined (L_dd_to_td)
149
#define WIDTH_TO 128
150
#endif
151
 
152
/* If WIDTH_TO is defined, define additional macros:
153
 
154
   DFP_C_TYPE_TO: type of the result of dfp to dfp conversion.
155
 
156
   IEEE_TYPE_TO: the corresponding (encoded) IEEE754 type.
157
 
158
   TO_ENCODED_TO: the name of the decNumber function to convert an
159
   internally represented decNumber into the encoded representation
160
   for the destination.  */
161
 
162
#if WIDTH_TO == 32
163
#define DFP_C_TYPE_TO	_Decimal32
164
#define IEEE_TYPE_TO	decimal32
165
#define TO_ENCODED_TO	__decimal32FromNumber
166
#define IEEE_TO_HOST_TO __ieee_to_host_32
167
#elif WIDTH_TO == 64
168
#define DFP_C_TYPE_TO	_Decimal64
169
#define IEEE_TYPE_TO	decimal64
170
#define TO_ENCODED_TO	__decimal64FromNumber
171
#define IEEE_TO_HOST_TO __ieee_to_host_64
172
#elif WIDTH_TO == 128
173
#define DFP_C_TYPE_TO	_Decimal128
174
#define IEEE_TYPE_TO	decimal128
175
#define TO_ENCODED_TO	__decimal128FromNumber
176
#define IEEE_TO_HOST_TO __ieee_to_host_128
177
#endif
178
 
179
/* Conversions between decimal float types and integral types use INT_KIND
180
   to determine the data type and C functions to use.  */
181
 
182
#if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si)  \
183
   || defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td)
184
#define INT_KIND 1
185
#elif defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
186
   || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td)
187
#define INT_KIND 2
188
#elif defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
189
   || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td)
190
#define INT_KIND 3
191
#elif defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi) \
192
   || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
193
#define INT_KIND 4
194
#endif
195
 
196
/*  If INT_KIND is defined, define additional macros:
197
 
198
    INT_TYPE: The integer data type.
199
 
200
    INT_FMT: The format string for writing the integer to a string.
201
 
202
    CAST_FOR_FMT: Cast variable of INT_KIND to C type for sprintf.
203
    This works for ILP32 and LP64, won't for other type size systems.
204
 
205
    STR_TO_INT: The function to read the integer from a string.  */
206
 
207
#if INT_KIND == 1
208
#define INT_TYPE SItype
209
#define INT_FMT "%d"
210
#define CAST_FOR_FMT(A) (int)A
211
#define STR_TO_INT strtol
212
#elif INT_KIND == 2
213
#define INT_TYPE DItype
214
#define INT_FMT "%lld"
215
#define CAST_FOR_FMT(A) (long long)A
216
#define STR_TO_INT strtoll
217
#elif INT_KIND == 3
218
#define INT_TYPE USItype
219
#define INT_FMT "%u"
220
#define CAST_FOR_FMT(A) (unsigned int)A
221
#define STR_TO_INT strtoul
222
#elif INT_KIND == 4
223
#define INT_TYPE UDItype
224
#define INT_FMT "%llu"
225
#define CAST_FOR_FMT(A) (unsigned long long)A
226
#define STR_TO_INT strtoull
227
#endif
228
 
229
/* Conversions between decimal float types and binary float types use
230
   BFP_KIND to determine the data type and C functions to use.  */
231
 
232
#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
233
 || defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td)
234
#define BFP_KIND 1
235
#elif defined (L_sd_to_df) || defined (L_dd_to_df ) || defined (L_td_to_df) \
236
 ||   defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td)
237
#define BFP_KIND 2
238
#elif defined (L_sd_to_xf) || defined (L_dd_to_xf ) || defined (L_td_to_xf) \
239
 ||   defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)
240
#define BFP_KIND 3
241
#elif defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf) \
242
 ||   defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)
243
#define BFP_KIND 4
244
#endif
245
 
246
/*  If BFP_KIND is defined, define additional macros:
247
 
248
    BFP_TYPE: The binary floating point data type.
249
 
250
    BFP_FMT: The format string for writing the value to a string.
251
    The number of decimal digits printed is
252
       ceil (nbits / log2 (10.) + 1)
253
    as described in David Matula's CACM 19(3) 716-723 June 1968 paper.
254
 
255
    BFP_VIA_TYPE: Type to which to cast a variable of BPF_TYPE for a
256
    call to sprintf.
257
 
258
    STR_TO_BFP: The function to read the value from a string.  */
259
 
260
#if BFP_KIND == 1
261
#define BFP_TYPE SFtype
262
#define BFP_FMT "%.9e"
263
#define BFP_VIA_TYPE double
264
#define STR_TO_BFP strtof
265
 
266
#elif BFP_KIND == 2
267
#define BFP_TYPE DFtype
268
#define BFP_FMT "%.17e"
269
#define BFP_VIA_TYPE double
270
#define STR_TO_BFP strtod
271
 
272
#elif BFP_KIND == 3
273
#if LONG_DOUBLE_HAS_XF_MODE
274
#define BFP_TYPE XFtype
275
#define BFP_FMT "%.21Le"
276
#define BFP_VIA_TYPE long double
277
#define STR_TO_BFP strtold
278
#endif /* LONG_DOUBLE_HAS_XF_MODE */
279
 
280
#elif BFP_KIND == 4
281
#if LONG_DOUBLE_HAS_TF_MODE
282
#define BFP_TYPE TFtype
283
#if LDBL_MANT_DIG == 106
284
#define BFP_FMT "%.33Le"
285
#elif LDBL_MANT_DIG == 113
286
#define BFP_FMT "%.36Le"
287
#else
288
#error "unknown long double size, cannot define BFP_FMT"
289
#endif /* LDBL_MANT_DIG */
290
#define STR_TO_BFP strtold
291
#define BFP_VIA_TYPE long double
292
#endif /* LONG_DOUBLE_HAS_TF_MODE */
293
 
294
#endif /* BFP_KIND */
295
 
296
#if WIDTH == 128 || WIDTH_TO == 128
297
#include "decimal128.h"
298
#include "decQuad.h"
299
#endif
300
#if WIDTH == 64 || WIDTH_TO == 64
301
#include "decimal64.h"
302
#include "decDouble.h"
303
#endif
304
#if WIDTH == 32 || WIDTH_TO == 32
305
#include "decimal32.h"
306
#include "decSingle.h"
307
#endif
308
#include "decNumber.h"
309
 
310
/* Names of arithmetic functions.  */
311
 
312
#if ENABLE_DECIMAL_BID_FORMAT
313
#define DPD_BID_NAME(DPD,BID) BID
314
#else
315
#define DPD_BID_NAME(DPD,BID) DPD
316
#endif
317
 
318
#if WIDTH == 32
319
#define DFP_ADD		DPD_BID_NAME(__dpd_addsd3,__bid_addsd3)
320
#define DFP_SUB		DPD_BID_NAME(__dpd_subsd3,__bid_subsd3)
321
#define DFP_MULTIPLY	DPD_BID_NAME(__dpd_mulsd3,__bid_mulsd3)
322
#define DFP_DIVIDE	DPD_BID_NAME(__dpd_divsd3,__bid_divsd3)
323
#define DFP_EQ		DPD_BID_NAME(__dpd_eqsd2,__bid_eqsd2)
324
#define DFP_NE		DPD_BID_NAME(__dpd_nesd2,__bid_nesd2)
325
#define DFP_LT		DPD_BID_NAME(__dpd_ltsd2,__bid_ltsd2)
326
#define DFP_GT		DPD_BID_NAME(__dpd_gtsd2,__bid_gtsd2)
327
#define DFP_LE		DPD_BID_NAME(__dpd_lesd2,__bid_lesd2)
328
#define DFP_GE		DPD_BID_NAME(__dpd_gesd2,__bid_gesd2)
329
#define DFP_UNORD	DPD_BID_NAME(__dpd_unordsd2,__bid_unordsd2)
330
#elif WIDTH == 64
331
#define DFP_ADD		DPD_BID_NAME(__dpd_adddd3,__bid_adddd3)
332
#define DFP_SUB		DPD_BID_NAME(__dpd_subdd3,__bid_subdd3)
333
#define DFP_MULTIPLY	DPD_BID_NAME(__dpd_muldd3,__bid_muldd3)
334
#define DFP_DIVIDE	DPD_BID_NAME(__dpd_divdd3,__bid_divdd3)
335
#define DFP_EQ		DPD_BID_NAME(__dpd_eqdd2,__bid_eqdd2)
336
#define DFP_NE		DPD_BID_NAME(__dpd_nedd2,__bid_nedd2)
337
#define DFP_LT		DPD_BID_NAME(__dpd_ltdd2,__bid_ltdd2)
338
#define DFP_GT		DPD_BID_NAME(__dpd_gtdd2,__bid_gtdd2)
339
#define DFP_LE		DPD_BID_NAME(__dpd_ledd2,__bid_ledd2)
340
#define DFP_GE		DPD_BID_NAME(__dpd_gedd2,__bid_gedd2)
341
#define DFP_UNORD	DPD_BID_NAME(__dpd_unorddd2,__bid_unorddd2)
342
#elif WIDTH == 128
343
#define DFP_ADD		DPD_BID_NAME(__dpd_addtd3,__bid_addtd3)
344
#define DFP_SUB		DPD_BID_NAME(__dpd_subtd3,__bid_subtd3)
345
#define DFP_MULTIPLY	DPD_BID_NAME(__dpd_multd3,__bid_multd3)
346
#define DFP_DIVIDE	DPD_BID_NAME(__dpd_divtd3,__bid_divtd3)
347
#define DFP_EQ		DPD_BID_NAME(__dpd_eqtd2,__bid_eqtd2)
348
#define DFP_NE		DPD_BID_NAME(__dpd_netd2,__bid_netd2)
349
#define DFP_LT		DPD_BID_NAME(__dpd_lttd2,__bid_lttd2)
350
#define DFP_GT		DPD_BID_NAME(__dpd_gttd2,__bid_gttd2)
351
#define DFP_LE		DPD_BID_NAME(__dpd_letd2,__bid_letd2)
352
#define DFP_GE		DPD_BID_NAME(__dpd_getd2,__bid_getd2)
353
#define DFP_UNORD	DPD_BID_NAME(__dpd_unordtd2,__bid_unordtd2)
354
#endif
355
 
356
/* Names of decNumber functions for DPD arithmetic.  */
357
 
358
#if WIDTH == 32
359
#define decFloat		decDouble
360
#define DFP_BINARY_OP		d32_binary_op
361
#define DFP_COMPARE_OP		d32_compare_op
362
#define DEC_FLOAT_ADD		decDoubleAdd
363
#define DEC_FLOAT_SUBTRACT	decDoubleSubtract
364
#define DEC_FLOAT_MULTIPLY	decDoubleMultiply
365
#define DEC_FLOAT_DIVIDE	decDoubleDivide
366
#define DEC_FLOAT_COMPARE	decDoubleCompare
367
#define DEC_FLOAT_IS_ZERO	decDoubleIsZero
368
#define DEC_FLOAT_IS_NAN	decDoubleIsNaN
369
#define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
370
#elif WIDTH == 64
371
#define DFP_BINARY_OP		dnn_binary_op
372
#define DFP_COMPARE_OP		dnn_compare_op
373
#define decFloat		decDouble
374
#define DEC_FLOAT_ADD		decDoubleAdd
375
#define DEC_FLOAT_SUBTRACT	decDoubleSubtract
376
#define DEC_FLOAT_MULTIPLY	decDoubleMultiply
377
#define DEC_FLOAT_DIVIDE	decDoubleDivide
378
#define DEC_FLOAT_COMPARE	decDoubleCompare
379
#define DEC_FLOAT_IS_ZERO	decDoubleIsZero
380
#define DEC_FLOAT_IS_NAN	decDoubleIsNaN
381
#define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
382
#elif WIDTH == 128
383
#define DFP_BINARY_OP		dnn_binary_op
384
#define DFP_COMPARE_OP		dnn_compare_op
385
#define decFloat		decQuad
386
#define DEC_FLOAT_ADD		decQuadAdd
387
#define DEC_FLOAT_SUBTRACT	decQuadSubtract
388
#define DEC_FLOAT_MULTIPLY	decQuadMultiply
389
#define DEC_FLOAT_DIVIDE	decQuadDivide
390
#define DEC_FLOAT_COMPARE	decQuadCompare
391
#define DEC_FLOAT_IS_ZERO	decQuadIsZero
392
#define DEC_FLOAT_IS_NAN	decQuadIsNaN
393
#define DEC_FLOAT_IS_SIGNED	decQuadIsSigned
394
#endif
395
 
396
/* Names of functions to convert between different decimal float types.  */
397
 
398
#if WIDTH == 32
399
#if WIDTH_TO == 64
400
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsddd2,__bid_extendsddd2)
401
#elif WIDTH_TO == 128
402
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsdtd2,__bid_extendsdtd2)
403
#endif
404
#elif WIDTH == 64
405
#if WIDTH_TO == 32
406
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_truncddsd2,__bid_truncddsd2)
407
#elif WIDTH_TO == 128
408
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendddtd2,__bid_extendddtd2)
409
#endif
410
#elif WIDTH == 128
411
#if WIDTH_TO == 32
412
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctdsd2,__bid_trunctdsd2)
413
#elif WIDTH_TO == 64
414
#define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctddd2,__bid_trunctddd2)
415
#endif
416
#endif
417
 
418
/* Names of functions to convert between decimal float and integers.  */
419
 
420
#if WIDTH == 32
421
#if INT_KIND == 1
422
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsisd,__bid_floatsisd)
423
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsdsi,__bid_fixsdsi)
424
#define DEC_FLOAT_FROM_INT decDoubleFromInt32
425
#define DEC_FLOAT_TO_INT   decDoubleToInt32
426
#elif INT_KIND == 2
427
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdisd,__bid_floatdisd)
428
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsddi,__bid_fixsddi)
429
#elif INT_KIND == 3
430
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssisd,__bid_floatunssisd)
431
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssdsi,__bid_fixunssdsi)
432
#define DEC_FLOAT_FROM_INT decDoubleFromUInt32
433
#define DEC_FLOAT_TO_INT   decDoubleToUInt32
434
#elif INT_KIND == 4
435
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdisd,__bid_floatunsdisd)
436
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssddi,__bid_fixunssddi)
437
#endif
438
#elif WIDTH == 64
439
#define decFloat	decDouble
440
#if INT_KIND == 1
441
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsidd,__bid_floatsidd)
442
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixddsi,__bid_fixddsi)
443
#define DEC_FLOAT_FROM_INT decDoubleFromInt32
444
#define DEC_FLOAT_TO_INT   decDoubleToInt32
445
#elif INT_KIND == 2
446
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdidd,__bid_floatdidd)
447
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixdddi,__bid_fixdddi)
448
#elif INT_KIND == 3
449
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssidd,__bid_floatunssidd)
450
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsddsi,__bid_fixunsddsi)
451
#define DEC_FLOAT_FROM_INT decDoubleFromUInt32
452
#define DEC_FLOAT_TO_INT   decDoubleToUInt32
453
#elif INT_KIND == 4
454
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdidd,__bid_floatunsdidd)
455
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsdddi,__bid_fixunsdddi)
456
#endif
457
#elif WIDTH == 128
458
#define decFloat	decQuad
459
#if INT_KIND == 1
460
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsitd,__bid_floatsitd)
461
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtdsi,__bid_fixtdsi)
462
#define DEC_FLOAT_FROM_INT decQuadFromInt32
463
#define DEC_FLOAT_TO_INT   decQuadToInt32
464
#elif INT_KIND == 2
465
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatditd,__bid_floatditd)
466
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtddi,__bid_fixtddi)
467
#elif INT_KIND == 3
468
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssitd,__bid_floatunssitd)
469
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstdsi,__bid_fixunstdsi)
470
#define DEC_FLOAT_FROM_INT decQuadFromUInt32
471
#define DEC_FLOAT_TO_INT   decQuadToUInt32
472
#elif INT_KIND == 4
473
#define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsditd,__bid_floatunsditd)
474
#define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstddi,__bid_fixunstddi)
475
#endif
476
#endif
477
 
478
/* Names of functions to convert between decimal float and binary float.  */
479
 
480
#if WIDTH == 32
481
#if BFP_KIND == 1
482
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfsd,__bid_extendsfsd)
483
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncsdsf,__bid_truncsdsf)
484
#elif BFP_KIND == 2
485
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncdfsd,__bid_truncdfsd)
486
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsddf,__bid_extendsddf)
487
#elif BFP_KIND == 3
488
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfsd,__bid_truncxfsd)
489
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdxf,__bid_extendsdxf)
490
#elif BFP_KIND == 4
491
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfsd,__bid_trunctfsd)
492
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdtf,__bid_extendsdtf)
493
#endif /* BFP_KIND */
494
 
495
#elif WIDTH == 64
496
#if BFP_KIND == 1
497
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfdd,__bid_extendsfdd)
498
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncddsf,__bid_truncddsf)
499
#elif BFP_KIND == 2
500
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddfdd,__bid_extenddfdd)
501
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncdddf,__bid_truncdddf)
502
#elif BFP_KIND == 3
503
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfdd,__bid_truncxfdd)
504
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddxf,__bid_extendddxf)
505
#elif BFP_KIND == 4
506
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfdd,__bid_trunctfdd)
507
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddtf,__bid_extendddtf)
508
#endif /* BFP_KIND */
509
 
510
#elif WIDTH == 128
511
#if BFP_KIND == 1
512
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsftd,__bid_extendsftd)
513
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdsf,__bid_trunctdsf)
514
#elif BFP_KIND == 2
515
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddftd,__bid_extenddftd)
516
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctddf,__bid_trunctddf)
517
#elif BFP_KIND == 3
518
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendxftd,__bid_extendxftd)
519
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdxf,__bid_trunctdxf)
520
#elif BFP_KIND == 4
521
#define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendtftd,__bid_extendtftd)
522
#define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdtf,__bid_trunctdtf)
523
#endif /* BFP_KIND */
524
 
525
#endif /* WIDTH */
526
 
527
/* Some handy typedefs.  */
528
 
529
typedef float SFtype __attribute__ ((mode (SF)));
530
typedef float DFtype __attribute__ ((mode (DF)));
531
#if LONG_DOUBLE_HAS_XF_MODE
532
typedef float XFtype __attribute__ ((mode (XF)));
533
#endif /* LONG_DOUBLE_HAS_XF_MODE */
534
#if LONG_DOUBLE_HAS_TF_MODE
535
typedef float TFtype __attribute__ ((mode (TF)));
536
#endif /* LONG_DOUBLE_HAS_TF_MODE */
537
 
538
typedef int SItype __attribute__ ((mode (SI)));
539
typedef int DItype __attribute__ ((mode (DI)));
540
typedef unsigned int USItype __attribute__ ((mode (SI)));
541
typedef unsigned int UDItype __attribute__ ((mode (DI)));
542
 
543
/* The type of the result of a decimal float comparison.  This must
544
   match `__libgcc_cmp_return__' in GCC for the target.  */
545
 
546
typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
547
 
548
/* Prototypes.  */
549
 
550
#if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
551
extern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
552
#endif
553
 
554
#if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
555
extern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
556
#endif
557
 
558
#if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
559
extern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
560
extern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
561
#endif
562
 
563
#if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
564
extern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
565
#endif
566
 
567
#if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
568
extern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
569
#endif
570
 
571
#if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
572
extern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
573
#endif
574
 
575
#if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
576
extern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
577
#endif
578
 
579
#if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
580
extern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
581
#endif
582
 
583
#if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
584
extern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
585
#endif
586
 
587
#if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
588
extern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
589
#endif
590
 
591
#if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
592
 || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
593
extern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
594
#endif
595
 
596
#if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
597
 || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
598
 || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
599
 || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
600
extern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
601
#endif
602
 
603
#if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
604
 || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
605
 || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
606
 || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
607
extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
608
#endif
609
 
610
#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
611
 || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
612
 || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
613
     && LONG_DOUBLE_HAS_XF_MODE) \
614
 || ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
615
     && LONG_DOUBLE_HAS_TF_MODE)
616
extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
617
#endif
618
 
619
#if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
620
 || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
621
 || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
622
     && LONG_DOUBLE_HAS_XF_MODE) \
623
 || ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
624
     && LONG_DOUBLE_HAS_TF_MODE)
625
extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
626
#endif
627
 
628
#endif /* _DFPBIT_H */