(root)/
gcc-13.2.0/
libgcc/
dfp-bit.h
       1  /* Header file for dfp-bit.c.
       2     Copyright (C) 2005-2023 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  #elif defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
     245   ||   defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
     246  #define BFP_KIND 5
     247  #endif
     248  
     249  /*  If BFP_KIND is defined, define additional macros:
     250  
     251      BFP_TYPE: The binary floating point data type.
     252  
     253      BFP_FMT: The format string for writing the value to a string.
     254      The number of decimal digits printed is
     255         ceil (nbits / log2 (10.) + 1)
     256      as described in David Matula's CACM 19(3) 716-723 June 1968 paper.
     257  
     258      BFP_VIA_TYPE: Type to which to cast a variable of BPF_TYPE for a
     259      call to sprintf.
     260      
     261      STR_TO_BFP: The function to read the value from a string.  */
     262  
     263  #if BFP_KIND == 1
     264  #define BFP_TYPE SFtype
     265  #define BFP_FMT "%.9e"
     266  #define BFP_VIA_TYPE double
     267  #define STR_TO_BFP strtof
     268  
     269  #elif BFP_KIND == 2
     270  #define BFP_TYPE DFtype
     271  #define BFP_FMT "%.17e"
     272  #define BFP_VIA_TYPE double
     273  #define STR_TO_BFP strtod
     274  
     275  #elif BFP_KIND == 3
     276  #if LONG_DOUBLE_HAS_XF_MODE
     277  #define BFP_TYPE XFtype
     278  #define BFP_FMT "%.21Le"
     279  #define BFP_VIA_TYPE long double
     280  #define STR_TO_BFP strtold
     281  #endif /* LONG_DOUBLE_HAS_XF_MODE */
     282  
     283  #elif BFP_KIND == 4
     284  #if LONG_DOUBLE_HAS_TF_MODE
     285  #define BFP_TYPE TFtype
     286  #if LDBL_MANT_DIG == 106
     287  #define BFP_FMT "%.33Le"
     288  #elif LDBL_MANT_DIG == 113
     289  #define BFP_FMT "%.36Le"
     290  #else
     291  #error "unknown long double size, cannot define BFP_FMT"
     292  #endif /* LDBL_MANT_DIG */
     293  #define STR_TO_BFP strtold
     294  #define BFP_VIA_TYPE long double
     295  #endif /* LONG_DOUBLE_HAS_TF_MODE */
     296  
     297  #elif BFP_KIND == 5
     298  #define BFP_TYPE _Float128
     299  #define BFP_FMT "%.36Le"
     300  #define BFP_VIA_TYPE _Float128
     301  #define STR_TO_BFP __strtoieee128
     302  extern _Float128 __strtoieee128 (const char *, char **);
     303  
     304  #endif /* BFP_KIND */
     305  
     306  #if WIDTH == 128 || WIDTH_TO == 128
     307  #include "decimal128.h"
     308  #include "decQuad.h"
     309  #endif
     310  #if WIDTH == 64 || WIDTH_TO == 64
     311  #include "decimal64.h"
     312  #include "decDouble.h"
     313  #endif
     314  #if WIDTH == 32 || WIDTH_TO == 32
     315  #include "decimal32.h"
     316  #include "decSingle.h"
     317  #endif
     318  #include "decNumber.h"
     319  
     320  /* Names of arithmetic functions.  */
     321  
     322  #if ENABLE_DECIMAL_BID_FORMAT
     323  #define DPD_BID_NAME(DPD,BID) BID
     324  #else
     325  #define DPD_BID_NAME(DPD,BID) DPD
     326  #endif
     327  
     328  #if WIDTH == 32
     329  #define DFP_ADD		DPD_BID_NAME(__dpd_addsd3,__bid_addsd3)
     330  #define DFP_SUB		DPD_BID_NAME(__dpd_subsd3,__bid_subsd3)
     331  #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_mulsd3,__bid_mulsd3)
     332  #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divsd3,__bid_divsd3)
     333  #define DFP_EQ		DPD_BID_NAME(__dpd_eqsd2,__bid_eqsd2)
     334  #define DFP_NE		DPD_BID_NAME(__dpd_nesd2,__bid_nesd2)
     335  #define DFP_LT		DPD_BID_NAME(__dpd_ltsd2,__bid_ltsd2)
     336  #define DFP_GT		DPD_BID_NAME(__dpd_gtsd2,__bid_gtsd2)
     337  #define DFP_LE		DPD_BID_NAME(__dpd_lesd2,__bid_lesd2)
     338  #define DFP_GE		DPD_BID_NAME(__dpd_gesd2,__bid_gesd2)
     339  #define DFP_UNORD	DPD_BID_NAME(__dpd_unordsd2,__bid_unordsd2)
     340  #elif WIDTH == 64
     341  #define DFP_ADD		DPD_BID_NAME(__dpd_adddd3,__bid_adddd3)
     342  #define DFP_SUB		DPD_BID_NAME(__dpd_subdd3,__bid_subdd3)
     343  #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_muldd3,__bid_muldd3)
     344  #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divdd3,__bid_divdd3)
     345  #define DFP_EQ		DPD_BID_NAME(__dpd_eqdd2,__bid_eqdd2)
     346  #define DFP_NE		DPD_BID_NAME(__dpd_nedd2,__bid_nedd2)
     347  #define DFP_LT		DPD_BID_NAME(__dpd_ltdd2,__bid_ltdd2)
     348  #define DFP_GT		DPD_BID_NAME(__dpd_gtdd2,__bid_gtdd2)
     349  #define DFP_LE		DPD_BID_NAME(__dpd_ledd2,__bid_ledd2)
     350  #define DFP_GE		DPD_BID_NAME(__dpd_gedd2,__bid_gedd2)
     351  #define DFP_UNORD	DPD_BID_NAME(__dpd_unorddd2,__bid_unorddd2)
     352  #elif WIDTH == 128
     353  #define DFP_ADD		DPD_BID_NAME(__dpd_addtd3,__bid_addtd3)
     354  #define DFP_SUB		DPD_BID_NAME(__dpd_subtd3,__bid_subtd3)
     355  #define DFP_MULTIPLY	DPD_BID_NAME(__dpd_multd3,__bid_multd3)
     356  #define DFP_DIVIDE	DPD_BID_NAME(__dpd_divtd3,__bid_divtd3)
     357  #define DFP_EQ		DPD_BID_NAME(__dpd_eqtd2,__bid_eqtd2)
     358  #define DFP_NE		DPD_BID_NAME(__dpd_netd2,__bid_netd2)
     359  #define DFP_LT		DPD_BID_NAME(__dpd_lttd2,__bid_lttd2)
     360  #define DFP_GT		DPD_BID_NAME(__dpd_gttd2,__bid_gttd2)
     361  #define DFP_LE		DPD_BID_NAME(__dpd_letd2,__bid_letd2)
     362  #define DFP_GE		DPD_BID_NAME(__dpd_getd2,__bid_getd2)
     363  #define DFP_UNORD	DPD_BID_NAME(__dpd_unordtd2,__bid_unordtd2)
     364  #endif
     365  
     366  /* Names of decNumber functions for DPD arithmetic.  */
     367  
     368  #if WIDTH == 32
     369  #define decFloat		decDouble
     370  #define DFP_BINARY_OP		d32_binary_op
     371  #define DFP_COMPARE_OP		d32_compare_op
     372  #define DEC_FLOAT_ADD		decDoubleAdd
     373  #define DEC_FLOAT_SUBTRACT	decDoubleSubtract
     374  #define DEC_FLOAT_MULTIPLY	decDoubleMultiply
     375  #define DEC_FLOAT_DIVIDE	decDoubleDivide
     376  #define DEC_FLOAT_COMPARE	decDoubleCompare
     377  #define DEC_FLOAT_IS_ZERO	decDoubleIsZero
     378  #define DEC_FLOAT_IS_NAN	decDoubleIsNaN
     379  #define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
     380  #elif WIDTH == 64
     381  #define DFP_BINARY_OP		dnn_binary_op
     382  #define DFP_COMPARE_OP		dnn_compare_op
     383  #define decFloat		decDouble
     384  #define DEC_FLOAT_ADD		decDoubleAdd
     385  #define DEC_FLOAT_SUBTRACT	decDoubleSubtract
     386  #define DEC_FLOAT_MULTIPLY	decDoubleMultiply
     387  #define DEC_FLOAT_DIVIDE	decDoubleDivide
     388  #define DEC_FLOAT_COMPARE	decDoubleCompare
     389  #define DEC_FLOAT_IS_ZERO	decDoubleIsZero
     390  #define DEC_FLOAT_IS_NAN	decDoubleIsNaN
     391  #define DEC_FLOAT_IS_SIGNED	decDoubleIsSigned
     392  #elif WIDTH == 128
     393  #define DFP_BINARY_OP		dnn_binary_op
     394  #define DFP_COMPARE_OP		dnn_compare_op
     395  #define decFloat		decQuad
     396  #define DEC_FLOAT_ADD		decQuadAdd
     397  #define DEC_FLOAT_SUBTRACT	decQuadSubtract
     398  #define DEC_FLOAT_MULTIPLY	decQuadMultiply
     399  #define DEC_FLOAT_DIVIDE	decQuadDivide
     400  #define DEC_FLOAT_COMPARE	decQuadCompare
     401  #define DEC_FLOAT_IS_ZERO	decQuadIsZero
     402  #define DEC_FLOAT_IS_NAN	decQuadIsNaN
     403  #define DEC_FLOAT_IS_SIGNED	decQuadIsSigned
     404  #endif
     405  
     406  /* Names of functions to convert between different decimal float types.  */
     407  
     408  #if WIDTH == 32
     409  #if WIDTH_TO == 64
     410  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsddd2,__bid_extendsddd2)
     411  #elif WIDTH_TO == 128
     412  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendsdtd2,__bid_extendsdtd2)
     413  #endif
     414  #elif WIDTH == 64	
     415  #if WIDTH_TO == 32
     416  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_truncddsd2,__bid_truncddsd2)
     417  #elif WIDTH_TO == 128
     418  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_extendddtd2,__bid_extendddtd2)
     419  #endif
     420  #elif WIDTH == 128
     421  #if WIDTH_TO == 32
     422  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctdsd2,__bid_trunctdsd2)
     423  #elif WIDTH_TO == 64
     424  #define DFP_TO_DFP	DPD_BID_NAME(__dpd_trunctddd2,__bid_trunctddd2)
     425  #endif
     426  #endif
     427  
     428  /* Names of functions to convert between decimal float and integers.  */
     429  
     430  #if WIDTH == 32
     431  #if INT_KIND == 1
     432  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsisd,__bid_floatsisd)
     433  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsdsi,__bid_fixsdsi)
     434  #define DEC_FLOAT_FROM_INT decDoubleFromInt32
     435  #define DEC_FLOAT_TO_INT   decDoubleToInt32
     436  #elif INT_KIND == 2
     437  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdisd,__bid_floatdisd)
     438  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixsddi,__bid_fixsddi)
     439  #elif INT_KIND == 3
     440  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssisd,__bid_floatunssisd)
     441  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssdsi,__bid_fixunssdsi)
     442  #define DEC_FLOAT_FROM_INT decDoubleFromUInt32
     443  #define DEC_FLOAT_TO_INT   decDoubleToUInt32
     444  #elif INT_KIND == 4
     445  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdisd,__bid_floatunsdisd)
     446  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunssddi,__bid_fixunssddi)
     447  #endif
     448  #elif WIDTH == 64
     449  #define decFloat	decDouble
     450  #if INT_KIND == 1
     451  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsidd,__bid_floatsidd)
     452  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixddsi,__bid_fixddsi)
     453  #define DEC_FLOAT_FROM_INT decDoubleFromInt32
     454  #define DEC_FLOAT_TO_INT   decDoubleToInt32
     455  #elif INT_KIND == 2
     456  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatdidd,__bid_floatdidd)
     457  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixdddi,__bid_fixdddi)
     458  #elif INT_KIND == 3
     459  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssidd,__bid_floatunssidd)
     460  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsddsi,__bid_fixunsddsi)
     461  #define DEC_FLOAT_FROM_INT decDoubleFromUInt32
     462  #define DEC_FLOAT_TO_INT   decDoubleToUInt32
     463  #elif INT_KIND == 4
     464  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsdidd,__bid_floatunsdidd)
     465  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunsdddi,__bid_fixunsdddi)
     466  #endif
     467  #elif WIDTH == 128
     468  #define decFloat	decQuad
     469  #if INT_KIND == 1
     470  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatsitd,__bid_floatsitd)
     471  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtdsi,__bid_fixtdsi)
     472  #define DEC_FLOAT_FROM_INT decQuadFromInt32
     473  #define DEC_FLOAT_TO_INT   decQuadToInt32
     474  #elif INT_KIND == 2
     475  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatditd,__bid_floatditd)
     476  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixtddi,__bid_fixtddi)
     477  #elif INT_KIND == 3
     478  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunssitd,__bid_floatunssitd)
     479  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstdsi,__bid_fixunstdsi)
     480  #define DEC_FLOAT_FROM_INT decQuadFromUInt32
     481  #define DEC_FLOAT_TO_INT   decQuadToUInt32
     482  #elif INT_KIND == 4
     483  #define INT_TO_DFP	DPD_BID_NAME(__dpd_floatunsditd,__bid_floatunsditd)
     484  #define DFP_TO_INT	DPD_BID_NAME(__dpd_fixunstddi,__bid_fixunstddi)
     485  #endif
     486  #endif
     487  
     488  /* Names of functions to convert between decimal float and binary float.  */
     489  
     490  #if WIDTH == 32
     491  #if BFP_KIND == 1
     492  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfsd,__bid_extendsfsd)
     493  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncsdsf,__bid_truncsdsf)
     494  #elif BFP_KIND == 2
     495  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncdfsd,__bid_truncdfsd)
     496  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsddf,__bid_extendsddf)
     497  #elif BFP_KIND == 3
     498  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfsd,__bid_truncxfsd)
     499  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdxf,__bid_extendsdxf)
     500  #elif BFP_KIND == 4
     501  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfsd,__bid_trunctfsd)
     502  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdtf,__bid_extendsdtf)
     503  #elif BFP_KIND == 5
     504  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunckfsd,__bid_trunckfsd)
     505  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendsdkf,__bid_extendsdkf)
     506  #endif /* BFP_KIND */
     507  
     508  #elif WIDTH == 64
     509  #if BFP_KIND == 1
     510  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsfdd,__bid_extendsfdd)
     511  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncddsf,__bid_truncddsf)
     512  #elif BFP_KIND == 2
     513  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddfdd,__bid_extenddfdd)
     514  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_truncdddf,__bid_truncdddf)
     515  #elif BFP_KIND == 3
     516  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_truncxfdd,__bid_truncxfdd)
     517  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddxf,__bid_extendddxf)
     518  #elif BFP_KIND == 4
     519  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunctfdd,__bid_trunctfdd)
     520  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddtf,__bid_extendddtf)
     521  #elif BFP_KIND == 5
     522  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_trunckfdd,__bid_trunckfdd)
     523  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_extendddkf,__bid_extendddkf)
     524  #endif /* BFP_KIND */
     525  
     526  #elif WIDTH == 128
     527  #if BFP_KIND == 1
     528  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendsftd,__bid_extendsftd)
     529  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdsf,__bid_trunctdsf)
     530  #elif BFP_KIND == 2
     531  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extenddftd,__bid_extenddftd)
     532  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctddf,__bid_trunctddf)
     533  #elif BFP_KIND == 3
     534  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendxftd,__bid_extendxftd)
     535  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdxf,__bid_trunctdxf)
     536  #elif BFP_KIND == 4
     537  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendtftd,__bid_extendtftd)
     538  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdtf,__bid_trunctdtf)
     539  #elif BFP_KIND == 5
     540  #define BFP_TO_DFP	DPD_BID_NAME(__dpd_extendkftd,__bid_extendkftd)
     541  #define DFP_TO_BFP	DPD_BID_NAME(__dpd_trunctdkf,__bid_trunctdkf)
     542  #endif /* BFP_KIND */
     543  
     544  #endif /* WIDTH */
     545  
     546  /* Some handy typedefs.  */
     547  
     548  typedef float SFtype __attribute__ ((mode (SF)));
     549  typedef float DFtype __attribute__ ((mode (DF)));
     550  #if LONG_DOUBLE_HAS_XF_MODE
     551  typedef float XFtype __attribute__ ((mode (XF)));
     552  #endif /* LONG_DOUBLE_HAS_XF_MODE */
     553  #if LONG_DOUBLE_HAS_TF_MODE
     554  typedef float TFtype __attribute__ ((mode (TF)));
     555  #endif /* LONG_DOUBLE_HAS_TF_MODE */
     556  
     557  typedef int SItype __attribute__ ((mode (SI)));
     558  typedef int DItype __attribute__ ((mode (DI)));
     559  typedef unsigned int USItype __attribute__ ((mode (SI)));
     560  typedef unsigned int UDItype __attribute__ ((mode (DI)));
     561  
     562  /* The type of the result of a decimal float comparison.  This must
     563     match `__libgcc_cmp_return__' in GCC for the target.  */
     564  
     565  typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
     566  
     567  /* Prototypes.  */
     568  
     569  #if defined (L_mul_sd) || defined (L_mul_dd) || defined (L_mul_td)
     570  extern DFP_C_TYPE DFP_MULTIPLY (DFP_C_TYPE, DFP_C_TYPE);
     571  #endif
     572  
     573  #if defined (L_div_sd) || defined (L_div_dd) || defined (L_div_td)
     574  extern DFP_C_TYPE DFP_DIVIDE (DFP_C_TYPE, DFP_C_TYPE);
     575  #endif
     576  
     577  #if defined (L_addsub_sd) || defined (L_addsub_dd) || defined (L_addsub_td)
     578  extern DFP_C_TYPE DFP_ADD (DFP_C_TYPE, DFP_C_TYPE);
     579  extern DFP_C_TYPE DFP_SUB (DFP_C_TYPE, DFP_C_TYPE);
     580  #endif
     581  
     582  #if defined (L_eq_sd) || defined (L_eq_dd) || defined (L_eq_td)
     583  extern CMPtype DFP_EQ (DFP_C_TYPE, DFP_C_TYPE);
     584  #endif
     585  
     586  #if defined (L_ne_sd) || defined (L_ne_dd) || defined (L_ne_td)
     587  extern CMPtype DFP_NE (DFP_C_TYPE, DFP_C_TYPE);
     588  #endif
     589  
     590  #if defined (L_lt_sd) || defined (L_lt_dd) || defined (L_lt_td)
     591  extern CMPtype DFP_LT (DFP_C_TYPE, DFP_C_TYPE);
     592  #endif
     593  
     594  #if defined (L_gt_sd) || defined (L_gt_dd) || defined (L_gt_td)
     595  extern CMPtype DFP_GT (DFP_C_TYPE, DFP_C_TYPE);
     596  #endif
     597  
     598  #if defined (L_le_sd) || defined (L_le_dd) || defined (L_le_td)
     599  extern CMPtype DFP_LE (DFP_C_TYPE, DFP_C_TYPE);
     600  #endif
     601  
     602  #if defined (L_ge_sd) || defined (L_ge_dd) || defined (L_ge_td)
     603  extern CMPtype DFP_GE (DFP_C_TYPE, DFP_C_TYPE);
     604  #endif
     605  
     606  #if defined (L_unord_sd) || defined (L_unord_dd) || defined (L_unord_td)
     607  extern CMPtype DFP_UNORD (DFP_C_TYPE, DFP_C_TYPE);
     608  #endif
     609  
     610  #if defined (L_sd_to_dd) || defined (L_sd_to_td) || defined (L_dd_to_sd) \
     611   || defined (L_dd_to_td) || defined (L_td_to_sd) || defined (L_td_to_dd)
     612  extern DFP_C_TYPE_TO DFP_TO_DFP (DFP_C_TYPE);
     613  #endif
     614  
     615  #if defined (L_sd_to_si) || defined (L_dd_to_si) || defined (L_td_to_si) \
     616   || defined (L_sd_to_di) || defined (L_dd_to_di) || defined (L_td_to_di) \
     617   || defined (L_sd_to_usi) || defined (L_dd_to_usi) || defined (L_td_to_usi) \
     618   || defined (L_sd_to_udi) || defined (L_dd_to_udi) || defined (L_td_to_udi)
     619  extern INT_TYPE DFP_TO_INT (DFP_C_TYPE);
     620  #endif
     621  
     622  #if defined (L_si_to_sd) || defined (L_si_to_dd) || defined (L_si_to_td) \
     623   || defined (L_di_to_sd) || defined (L_di_to_dd) || defined (L_di_to_td) \
     624   || defined (L_usi_to_sd) || defined (L_usi_to_dd) || defined (L_usi_to_td) \
     625   || defined (L_udi_to_sd) || defined (L_udi_to_dd) || defined (L_udi_to_td)
     626  extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
     627  #endif
     628  
     629  #if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
     630   || defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
     631   || defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
     632   || ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
     633       && LONG_DOUBLE_HAS_XF_MODE) \
     634   || ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
     635       && LONG_DOUBLE_HAS_TF_MODE)
     636  extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
     637  #endif
     638  
     639  #if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
     640   || defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
     641   || ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
     642       && LONG_DOUBLE_HAS_XF_MODE) \
     643   || ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
     644       && LONG_DOUBLE_HAS_TF_MODE)
     645  extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
     646  #define BFP_SPRINTF sprintf
     647  
     648  #elif defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
     649  extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
     650  extern int __sprintfieee128 (char *restrict, const char *restrict, ...);
     651  #define BFP_SPRINTF __sprintfieee128
     652  #endif
     653  
     654  #endif /* _DFPBIT_H */