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