Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. <http://www.gnu.org/licenses/>.  */
  24.  
  25. #ifndef _DFPBIT_H
  26. #define _DFPBIT_H
  27.  
  28. #include <float.h>
  29. #include <fenv.h>
  30. #include <decRound.h>
  31. #include <decExcept.h>
  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 */
  629.