1*e4b17023SJohn Marino /* Header file for fp-bit.c. */ 2*e4b17023SJohn Marino /* Copyright (C) 2000, 2002, 2003, 2006, 2009, 2010, 2011 3*e4b17023SJohn Marino Free Software Foundation, Inc. 4*e4b17023SJohn Marino 5*e4b17023SJohn Marino This file is part of GCC. 6*e4b17023SJohn Marino 7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under 8*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free 9*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later 10*e4b17023SJohn Marino version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or 14*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15*e4b17023SJohn Marino for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */ 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino #ifndef GCC_FP_BIT_H 27*e4b17023SJohn Marino #define GCC_FP_BIT_H 28*e4b17023SJohn Marino 29*e4b17023SJohn Marino /* Defining FINE_GRAINED_LIBRARIES allows one to select which routines 30*e4b17023SJohn Marino from this file are compiled via additional -D options. 31*e4b17023SJohn Marino 32*e4b17023SJohn Marino This avoids the need to pull in the entire fp emulation library 33*e4b17023SJohn Marino when only a small number of functions are needed. 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino If FINE_GRAINED_LIBRARIES is not defined, then compile every 36*e4b17023SJohn Marino suitable routine. */ 37*e4b17023SJohn Marino #ifndef FINE_GRAINED_LIBRARIES 38*e4b17023SJohn Marino #define L_pack_df 39*e4b17023SJohn Marino #define L_unpack_df 40*e4b17023SJohn Marino #define L_pack_sf 41*e4b17023SJohn Marino #define L_unpack_sf 42*e4b17023SJohn Marino #define L_addsub_sf 43*e4b17023SJohn Marino #define L_addsub_df 44*e4b17023SJohn Marino #define L_mul_sf 45*e4b17023SJohn Marino #define L_mul_df 46*e4b17023SJohn Marino #define L_div_sf 47*e4b17023SJohn Marino #define L_div_df 48*e4b17023SJohn Marino #define L_fpcmp_parts_sf 49*e4b17023SJohn Marino #define L_fpcmp_parts_df 50*e4b17023SJohn Marino #define L_compare_sf 51*e4b17023SJohn Marino #define L_compare_df 52*e4b17023SJohn Marino #define L_eq_sf 53*e4b17023SJohn Marino #define L_eq_df 54*e4b17023SJohn Marino #define L_ne_sf 55*e4b17023SJohn Marino #define L_ne_df 56*e4b17023SJohn Marino #define L_gt_sf 57*e4b17023SJohn Marino #define L_gt_df 58*e4b17023SJohn Marino #define L_ge_sf 59*e4b17023SJohn Marino #define L_ge_df 60*e4b17023SJohn Marino #define L_lt_sf 61*e4b17023SJohn Marino #define L_lt_df 62*e4b17023SJohn Marino #define L_le_sf 63*e4b17023SJohn Marino #define L_le_df 64*e4b17023SJohn Marino #define L_unord_sf 65*e4b17023SJohn Marino #define L_unord_df 66*e4b17023SJohn Marino #define L_usi_to_sf 67*e4b17023SJohn Marino #define L_usi_to_df 68*e4b17023SJohn Marino #define L_si_to_sf 69*e4b17023SJohn Marino #define L_si_to_df 70*e4b17023SJohn Marino #define L_sf_to_si 71*e4b17023SJohn Marino #define L_df_to_si 72*e4b17023SJohn Marino #define L_f_to_usi 73*e4b17023SJohn Marino #define L_df_to_usi 74*e4b17023SJohn Marino #define L_negate_sf 75*e4b17023SJohn Marino #define L_negate_df 76*e4b17023SJohn Marino #define L_make_sf 77*e4b17023SJohn Marino #define L_make_df 78*e4b17023SJohn Marino #define L_sf_to_df 79*e4b17023SJohn Marino #define L_df_to_sf 80*e4b17023SJohn Marino #ifdef FLOAT 81*e4b17023SJohn Marino #define L_thenan_sf 82*e4b17023SJohn Marino #else 83*e4b17023SJohn Marino #define L_thenan_df 84*e4b17023SJohn Marino #endif 85*e4b17023SJohn Marino #endif /* ! FINE_GRAINED_LIBRARIES */ 86*e4b17023SJohn Marino 87*e4b17023SJohn Marino #if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106 88*e4b17023SJohn Marino # if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf) 89*e4b17023SJohn Marino # define TMODES 90*e4b17023SJohn Marino # endif 91*e4b17023SJohn Marino #endif 92*e4b17023SJohn Marino 93*e4b17023SJohn Marino typedef float SFtype __attribute__ ((mode (SF))); 94*e4b17023SJohn Marino typedef float DFtype __attribute__ ((mode (DF))); 95*e4b17023SJohn Marino #ifdef TMODES 96*e4b17023SJohn Marino typedef float TFtype __attribute__ ((mode (TF))); 97*e4b17023SJohn Marino #endif 98*e4b17023SJohn Marino 99*e4b17023SJohn Marino typedef int HItype __attribute__ ((mode (HI))); 100*e4b17023SJohn Marino typedef int SItype __attribute__ ((mode (SI))); 101*e4b17023SJohn Marino typedef int DItype __attribute__ ((mode (DI))); 102*e4b17023SJohn Marino #ifdef TMODES 103*e4b17023SJohn Marino typedef int TItype __attribute__ ((mode (TI))); 104*e4b17023SJohn Marino #endif 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino /* The type of the result of a floating point comparison. This must 107*e4b17023SJohn Marino match `__libgcc_cmp_return__' in GCC for the target. */ 108*e4b17023SJohn Marino #ifndef CMPtype 109*e4b17023SJohn Marino typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); 110*e4b17023SJohn Marino #endif 111*e4b17023SJohn Marino 112*e4b17023SJohn Marino typedef unsigned int UHItype __attribute__ ((mode (HI))); 113*e4b17023SJohn Marino typedef unsigned int USItype __attribute__ ((mode (SI))); 114*e4b17023SJohn Marino typedef unsigned int UDItype __attribute__ ((mode (DI))); 115*e4b17023SJohn Marino #ifdef TMODES 116*e4b17023SJohn Marino typedef unsigned int UTItype __attribute__ ((mode (TI))); 117*e4b17023SJohn Marino #endif 118*e4b17023SJohn Marino 119*e4b17023SJohn Marino #define MAX_USI_INT (~(USItype)0) 120*e4b17023SJohn Marino #define MAX_SI_INT ((SItype) (MAX_USI_INT >> 1)) 121*e4b17023SJohn Marino #define BITS_PER_SI (4 * BITS_PER_UNIT) 122*e4b17023SJohn Marino #ifdef TMODES 123*e4b17023SJohn Marino #define MAX_UDI_INT (~(UDItype)0) 124*e4b17023SJohn Marino #define MAX_DI_INT ((DItype) (MAX_UDI_INT >> 1)) 125*e4b17023SJohn Marino #define BITS_PER_DI (8 * BITS_PER_UNIT) 126*e4b17023SJohn Marino #endif 127*e4b17023SJohn Marino 128*e4b17023SJohn Marino #ifdef FLOAT_ONLY 129*e4b17023SJohn Marino #define NO_DI_MODE 130*e4b17023SJohn Marino #endif 131*e4b17023SJohn Marino 132*e4b17023SJohn Marino #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 133*e4b17023SJohn Marino #define FLOAT_BIT_ORDER_MISMATCH 134*e4b17023SJohn Marino #endif 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino #if __BYTE_ORDER__ != __FLOAT_WORD_ORDER__ 137*e4b17023SJohn Marino #define FLOAT_WORD_ORDER_MISMATCH 138*e4b17023SJohn Marino #endif 139*e4b17023SJohn Marino 140*e4b17023SJohn Marino #ifdef TFLOAT 141*e4b17023SJohn Marino # ifndef TMODES 142*e4b17023SJohn Marino # error "TFLOAT requires long double to have 113 bits of mantissa" 143*e4b17023SJohn Marino # endif 144*e4b17023SJohn Marino 145*e4b17023SJohn Marino # define PREFIXFPDP tp 146*e4b17023SJohn Marino # define PREFIXSFDF tf 147*e4b17023SJohn Marino # define NGARDS 10L /* Is this right? */ 148*e4b17023SJohn Marino # define GARDROUND 0x1ff 149*e4b17023SJohn Marino # define GARDMASK 0x3ff 150*e4b17023SJohn Marino # define GARDMSB 0x200 151*e4b17023SJohn Marino # define FRAC_NBITS 128 152*e4b17023SJohn Marino 153*e4b17023SJohn Marino # if __LDBL_MANT_DIG__ == 113 /* IEEE quad */ 154*e4b17023SJohn Marino # define EXPBITS 15 155*e4b17023SJohn Marino # define EXPBIAS 16383 156*e4b17023SJohn Marino # define EXPMAX (0x7fff) 157*e4b17023SJohn Marino # define QUIET_NAN ((TItype)0x8 << 108) 158*e4b17023SJohn Marino # define FRACHIGH ((TItype)0x8 << 124) 159*e4b17023SJohn Marino # define FRACHIGH2 ((TItype)0xc << 124) 160*e4b17023SJohn Marino # define FRACBITS 112 161*e4b17023SJohn Marino # endif 162*e4b17023SJohn Marino 163*e4b17023SJohn Marino # if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */ 164*e4b17023SJohn Marino # define EXPBITS 11 165*e4b17023SJohn Marino # define EXPBIAS 1023 166*e4b17023SJohn Marino # define EXPMAX (0x7ff) 167*e4b17023SJohn Marino # define QUIET_NAN ((TItype)0x8 << (48 + 64)) 168*e4b17023SJohn Marino # define FRACHIGH ((TItype)0x8 << 124) 169*e4b17023SJohn Marino # define FRACHIGH2 ((TItype)0xc << 124) 170*e4b17023SJohn Marino # define FRACBITS 105 171*e4b17023SJohn Marino # define HALFFRACBITS 52 172*e4b17023SJohn Marino # define HALFSHIFT 64 173*e4b17023SJohn Marino # endif 174*e4b17023SJohn Marino 175*e4b17023SJohn Marino # define pack_d __pack_t 176*e4b17023SJohn Marino # define unpack_d __unpack_t 177*e4b17023SJohn Marino # define __fpcmp_parts __fpcmp_parts_t 178*e4b17023SJohn Marino typedef UTItype fractype; 179*e4b17023SJohn Marino typedef UDItype halffractype; 180*e4b17023SJohn Marino typedef USItype qrtrfractype; 181*e4b17023SJohn Marino #define qrtrfractype qrtrfractype 182*e4b17023SJohn Marino typedef TFtype FLO_type; 183*e4b17023SJohn Marino typedef TItype intfrac; 184*e4b17023SJohn Marino #elif defined FLOAT 185*e4b17023SJohn Marino # define NGARDS 7L 186*e4b17023SJohn Marino # define GARDROUND 0x3f 187*e4b17023SJohn Marino # define GARDMASK 0x7f 188*e4b17023SJohn Marino # define GARDMSB 0x40 189*e4b17023SJohn Marino # define EXPBITS 8 190*e4b17023SJohn Marino # define EXPBIAS 127 191*e4b17023SJohn Marino # define FRACBITS 23 192*e4b17023SJohn Marino # define EXPMAX (0xff) 193*e4b17023SJohn Marino # define QUIET_NAN 0x100000L 194*e4b17023SJohn Marino # define FRAC_NBITS 32 195*e4b17023SJohn Marino # define FRACHIGH 0x80000000L 196*e4b17023SJohn Marino # define FRACHIGH2 0xc0000000L 197*e4b17023SJohn Marino # define pack_d __pack_f 198*e4b17023SJohn Marino # define unpack_d __unpack_f 199*e4b17023SJohn Marino # define __fpcmp_parts __fpcmp_parts_f 200*e4b17023SJohn Marino typedef USItype fractype; 201*e4b17023SJohn Marino typedef UHItype halffractype; 202*e4b17023SJohn Marino typedef SFtype FLO_type; 203*e4b17023SJohn Marino typedef SItype intfrac; 204*e4b17023SJohn Marino 205*e4b17023SJohn Marino #else 206*e4b17023SJohn Marino # define PREFIXFPDP dp 207*e4b17023SJohn Marino # define PREFIXSFDF df 208*e4b17023SJohn Marino # define NGARDS 8L 209*e4b17023SJohn Marino # define GARDROUND 0x7f 210*e4b17023SJohn Marino # define GARDMASK 0xff 211*e4b17023SJohn Marino # define GARDMSB 0x80 212*e4b17023SJohn Marino # define EXPBITS 11 213*e4b17023SJohn Marino # define EXPBIAS 1023 214*e4b17023SJohn Marino # define FRACBITS 52 215*e4b17023SJohn Marino # define EXPMAX (0x7ff) 216*e4b17023SJohn Marino # define QUIET_NAN 0x8000000000000LL 217*e4b17023SJohn Marino # define FRAC_NBITS 64 218*e4b17023SJohn Marino # define FRACHIGH 0x8000000000000000LL 219*e4b17023SJohn Marino # define FRACHIGH2 0xc000000000000000LL 220*e4b17023SJohn Marino # define pack_d __pack_d 221*e4b17023SJohn Marino # define unpack_d __unpack_d 222*e4b17023SJohn Marino # define __fpcmp_parts __fpcmp_parts_d 223*e4b17023SJohn Marino typedef UDItype fractype; 224*e4b17023SJohn Marino typedef USItype halffractype; 225*e4b17023SJohn Marino typedef DFtype FLO_type; 226*e4b17023SJohn Marino typedef DItype intfrac; 227*e4b17023SJohn Marino #endif /* FLOAT */ 228*e4b17023SJohn Marino 229*e4b17023SJohn Marino #ifdef TFLOAT 230*e4b17023SJohn Marino # define add __addtf3 231*e4b17023SJohn Marino # define sub __subtf3 232*e4b17023SJohn Marino # define multiply __multf3 233*e4b17023SJohn Marino # define divide __divtf3 234*e4b17023SJohn Marino # define compare __cmptf2 235*e4b17023SJohn Marino # define _eq_f2 __eqtf2 236*e4b17023SJohn Marino # define _ne_f2 __netf2 237*e4b17023SJohn Marino # define _gt_f2 __gttf2 238*e4b17023SJohn Marino # define _ge_f2 __getf2 239*e4b17023SJohn Marino # define _lt_f2 __lttf2 240*e4b17023SJohn Marino # define _le_f2 __letf2 241*e4b17023SJohn Marino # define _unord_f2 __unordtf2 242*e4b17023SJohn Marino # define usi_to_float __floatunsitf 243*e4b17023SJohn Marino # define si_to_float __floatsitf 244*e4b17023SJohn Marino # define float_to_si __fixtfsi 245*e4b17023SJohn Marino # define float_to_usi __fixunstfsi 246*e4b17023SJohn Marino # define negate __negtf2 247*e4b17023SJohn Marino # define tf_to_sf __trunctfsf2 248*e4b17023SJohn Marino # define tf_to_df __trunctfdf2 249*e4b17023SJohn Marino #elif defined FLOAT 250*e4b17023SJohn Marino # define add __addsf3 251*e4b17023SJohn Marino # define sub __subsf3 252*e4b17023SJohn Marino # define multiply __mulsf3 253*e4b17023SJohn Marino # define divide __divsf3 254*e4b17023SJohn Marino # define compare __cmpsf2 255*e4b17023SJohn Marino # define _eq_f2 __eqsf2 256*e4b17023SJohn Marino # define _ne_f2 __nesf2 257*e4b17023SJohn Marino # define _gt_f2 __gtsf2 258*e4b17023SJohn Marino # define _ge_f2 __gesf2 259*e4b17023SJohn Marino # define _lt_f2 __ltsf2 260*e4b17023SJohn Marino # define _le_f2 __lesf2 261*e4b17023SJohn Marino # define _unord_f2 __unordsf2 262*e4b17023SJohn Marino # define usi_to_float __floatunsisf 263*e4b17023SJohn Marino # define si_to_float __floatsisf 264*e4b17023SJohn Marino # define float_to_si __fixsfsi 265*e4b17023SJohn Marino # define float_to_usi __fixunssfsi 266*e4b17023SJohn Marino # define negate __negsf2 267*e4b17023SJohn Marino # define sf_to_df __extendsfdf2 268*e4b17023SJohn Marino # define sf_to_tf __extendsftf2 269*e4b17023SJohn Marino #else 270*e4b17023SJohn Marino # define add __adddf3 271*e4b17023SJohn Marino # define sub __subdf3 272*e4b17023SJohn Marino # define multiply __muldf3 273*e4b17023SJohn Marino # define divide __divdf3 274*e4b17023SJohn Marino # define compare __cmpdf2 275*e4b17023SJohn Marino # define _eq_f2 __eqdf2 276*e4b17023SJohn Marino # define _ne_f2 __nedf2 277*e4b17023SJohn Marino # define _gt_f2 __gtdf2 278*e4b17023SJohn Marino # define _ge_f2 __gedf2 279*e4b17023SJohn Marino # define _lt_f2 __ltdf2 280*e4b17023SJohn Marino # define _le_f2 __ledf2 281*e4b17023SJohn Marino # define _unord_f2 __unorddf2 282*e4b17023SJohn Marino # define usi_to_float __floatunsidf 283*e4b17023SJohn Marino # define si_to_float __floatsidf 284*e4b17023SJohn Marino # define float_to_si __fixdfsi 285*e4b17023SJohn Marino # define float_to_usi __fixunsdfsi 286*e4b17023SJohn Marino # define negate __negdf2 287*e4b17023SJohn Marino # define df_to_sf __truncdfsf2 288*e4b17023SJohn Marino # define df_to_tf __extenddftf2 289*e4b17023SJohn Marino #endif /* FLOAT */ 290*e4b17023SJohn Marino 291*e4b17023SJohn Marino #ifndef INLINE 292*e4b17023SJohn Marino #define INLINE __inline__ 293*e4b17023SJohn Marino #endif 294*e4b17023SJohn Marino 295*e4b17023SJohn Marino /* Preserve the sticky-bit when shifting fractions to the right. */ 296*e4b17023SJohn Marino #define LSHIFT(a, s) { a = (a >> s) | !!(a & (((fractype) 1 << s) - 1)); } 297*e4b17023SJohn Marino 298*e4b17023SJohn Marino /* numeric parameters */ 299*e4b17023SJohn Marino /* F_D_BITOFF is the number of bits offset between the MSB of the mantissa 300*e4b17023SJohn Marino of a float and of a double. Assumes there are only two float types. 301*e4b17023SJohn Marino (double::FRAC_BITS+double::NGARDS-(float::FRAC_BITS-float::NGARDS)) 302*e4b17023SJohn Marino */ 303*e4b17023SJohn Marino #define F_D_BITOFF (52+8-(23+7)) 304*e4b17023SJohn Marino 305*e4b17023SJohn Marino #ifdef TMODES 306*e4b17023SJohn Marino # define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7)) 307*e4b17023SJohn Marino # define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8)) 308*e4b17023SJohn Marino #endif 309*e4b17023SJohn Marino 310*e4b17023SJohn Marino 311*e4b17023SJohn Marino #define NORMAL_EXPMIN (-(EXPBIAS)+1) 312*e4b17023SJohn Marino #define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS)) 313*e4b17023SJohn Marino #define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS)) 314*e4b17023SJohn Marino 315*e4b17023SJohn Marino /* common types */ 316*e4b17023SJohn Marino 317*e4b17023SJohn Marino typedef enum 318*e4b17023SJohn Marino { 319*e4b17023SJohn Marino CLASS_SNAN, 320*e4b17023SJohn Marino CLASS_QNAN, 321*e4b17023SJohn Marino CLASS_ZERO, 322*e4b17023SJohn Marino CLASS_NUMBER, 323*e4b17023SJohn Marino CLASS_INFINITY 324*e4b17023SJohn Marino } fp_class_type; 325*e4b17023SJohn Marino 326*e4b17023SJohn Marino typedef struct 327*e4b17023SJohn Marino { 328*e4b17023SJohn Marino #ifdef SMALL_MACHINE 329*e4b17023SJohn Marino char class; 330*e4b17023SJohn Marino unsigned char sign; 331*e4b17023SJohn Marino short normal_exp; 332*e4b17023SJohn Marino #else 333*e4b17023SJohn Marino fp_class_type class; 334*e4b17023SJohn Marino unsigned int sign; 335*e4b17023SJohn Marino int normal_exp; 336*e4b17023SJohn Marino #endif 337*e4b17023SJohn Marino 338*e4b17023SJohn Marino union 339*e4b17023SJohn Marino { 340*e4b17023SJohn Marino fractype ll; 341*e4b17023SJohn Marino halffractype l[2]; 342*e4b17023SJohn Marino } fraction; 343*e4b17023SJohn Marino } fp_number_type; 344*e4b17023SJohn Marino 345*e4b17023SJohn Marino typedef union 346*e4b17023SJohn Marino { 347*e4b17023SJohn Marino FLO_type value; 348*e4b17023SJohn Marino fractype value_raw; 349*e4b17023SJohn Marino 350*e4b17023SJohn Marino #ifndef FLOAT 351*e4b17023SJohn Marino # ifdef qrtrfractype 352*e4b17023SJohn Marino qrtrfractype qwords[4]; 353*e4b17023SJohn Marino # else 354*e4b17023SJohn Marino halffractype words[2]; 355*e4b17023SJohn Marino # endif 356*e4b17023SJohn Marino #endif 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino #ifdef FLOAT_BIT_ORDER_MISMATCH 359*e4b17023SJohn Marino struct 360*e4b17023SJohn Marino { 361*e4b17023SJohn Marino fractype fraction:FRACBITS __attribute__ ((packed)); 362*e4b17023SJohn Marino unsigned int exp:EXPBITS __attribute__ ((packed)); 363*e4b17023SJohn Marino unsigned int sign:1 __attribute__ ((packed)); 364*e4b17023SJohn Marino } 365*e4b17023SJohn Marino bits; 366*e4b17023SJohn Marino #endif 367*e4b17023SJohn Marino 368*e4b17023SJohn Marino #ifdef _DEBUG_BITFLOAT 369*e4b17023SJohn Marino struct 370*e4b17023SJohn Marino { 371*e4b17023SJohn Marino unsigned int sign:1 __attribute__ ((packed)); 372*e4b17023SJohn Marino unsigned int exp:EXPBITS __attribute__ ((packed)); 373*e4b17023SJohn Marino fractype fraction:FRACBITS __attribute__ ((packed)); 374*e4b17023SJohn Marino } 375*e4b17023SJohn Marino bits_big_endian; 376*e4b17023SJohn Marino 377*e4b17023SJohn Marino struct 378*e4b17023SJohn Marino { 379*e4b17023SJohn Marino fractype fraction:FRACBITS __attribute__ ((packed)); 380*e4b17023SJohn Marino unsigned int exp:EXPBITS __attribute__ ((packed)); 381*e4b17023SJohn Marino unsigned int sign:1 __attribute__ ((packed)); 382*e4b17023SJohn Marino } 383*e4b17023SJohn Marino bits_little_endian; 384*e4b17023SJohn Marino #endif 385*e4b17023SJohn Marino } 386*e4b17023SJohn Marino FLO_union_type; 387*e4b17023SJohn Marino 388*e4b17023SJohn Marino /* Prototypes. */ 389*e4b17023SJohn Marino 390*e4b17023SJohn Marino #if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf) 391*e4b17023SJohn Marino extern FLO_type pack_d (const fp_number_type *); 392*e4b17023SJohn Marino #endif 393*e4b17023SJohn Marino 394*e4b17023SJohn Marino extern void unpack_d (FLO_union_type *, fp_number_type *); 395*e4b17023SJohn Marino 396*e4b17023SJohn Marino #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf) 397*e4b17023SJohn Marino extern FLO_type add (FLO_type, FLO_type); 398*e4b17023SJohn Marino extern FLO_type sub (FLO_type, FLO_type); 399*e4b17023SJohn Marino #endif 400*e4b17023SJohn Marino 401*e4b17023SJohn Marino #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf) 402*e4b17023SJohn Marino extern FLO_type multiply (FLO_type, FLO_type); 403*e4b17023SJohn Marino #endif 404*e4b17023SJohn Marino 405*e4b17023SJohn Marino #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf) 406*e4b17023SJohn Marino extern FLO_type divide (FLO_type, FLO_type); 407*e4b17023SJohn Marino #endif 408*e4b17023SJohn Marino 409*e4b17023SJohn Marino extern int __fpcmp_parts (fp_number_type *, fp_number_type *); 410*e4b17023SJohn Marino 411*e4b17023SJohn Marino #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf) 412*e4b17023SJohn Marino extern CMPtype compare (FLO_type, FLO_type); 413*e4b17023SJohn Marino #endif 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf) 416*e4b17023SJohn Marino extern CMPtype _eq_f2 (FLO_type, FLO_type); 417*e4b17023SJohn Marino #endif 418*e4b17023SJohn Marino 419*e4b17023SJohn Marino #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf) 420*e4b17023SJohn Marino extern CMPtype _ne_f2 (FLO_type, FLO_type); 421*e4b17023SJohn Marino #endif 422*e4b17023SJohn Marino 423*e4b17023SJohn Marino #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf) 424*e4b17023SJohn Marino extern CMPtype _gt_f2 (FLO_type, FLO_type); 425*e4b17023SJohn Marino #endif 426*e4b17023SJohn Marino 427*e4b17023SJohn Marino #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf) 428*e4b17023SJohn Marino extern CMPtype _ge_f2 (FLO_type, FLO_type); 429*e4b17023SJohn Marino #endif 430*e4b17023SJohn Marino 431*e4b17023SJohn Marino #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf) 432*e4b17023SJohn Marino extern CMPtype _lt_f2 (FLO_type, FLO_type); 433*e4b17023SJohn Marino #endif 434*e4b17023SJohn Marino 435*e4b17023SJohn Marino #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf) 436*e4b17023SJohn Marino extern CMPtype _le_f2 (FLO_type, FLO_type); 437*e4b17023SJohn Marino #endif 438*e4b17023SJohn Marino 439*e4b17023SJohn Marino #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf) 440*e4b17023SJohn Marino extern CMPtype _unord_f2 (FLO_type, FLO_type); 441*e4b17023SJohn Marino #endif 442*e4b17023SJohn Marino 443*e4b17023SJohn Marino #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf) 444*e4b17023SJohn Marino extern FLO_type si_to_float (SItype); 445*e4b17023SJohn Marino #endif 446*e4b17023SJohn Marino 447*e4b17023SJohn Marino #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si) 448*e4b17023SJohn Marino extern SItype float_to_si (FLO_type); 449*e4b17023SJohn Marino #endif 450*e4b17023SJohn Marino 451*e4b17023SJohn Marino #if defined(L_tf_to_usi) 452*e4b17023SJohn Marino extern USItype float_to_usi (FLO_type); 453*e4b17023SJohn Marino #endif 454*e4b17023SJohn Marino 455*e4b17023SJohn Marino #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf) 456*e4b17023SJohn Marino extern FLO_type usi_to_float (USItype); 457*e4b17023SJohn Marino #endif 458*e4b17023SJohn Marino 459*e4b17023SJohn Marino #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf) 460*e4b17023SJohn Marino extern FLO_type negate (FLO_type); 461*e4b17023SJohn Marino #endif 462*e4b17023SJohn Marino 463*e4b17023SJohn Marino #ifdef FLOAT 464*e4b17023SJohn Marino #if defined(L_make_sf) 465*e4b17023SJohn Marino extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype); 466*e4b17023SJohn Marino #endif 467*e4b17023SJohn Marino #ifndef FLOAT_ONLY 468*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype); 469*e4b17023SJohn Marino #if defined(L_sf_to_df) 470*e4b17023SJohn Marino extern DFtype sf_to_df (SFtype); 471*e4b17023SJohn Marino #endif 472*e4b17023SJohn Marino #if defined(L_sf_to_tf) && defined(TMODES) 473*e4b17023SJohn Marino extern TFtype sf_to_tf (SFtype); 474*e4b17023SJohn Marino #endif 475*e4b17023SJohn Marino #endif /* ! FLOAT_ONLY */ 476*e4b17023SJohn Marino #endif /* FLOAT */ 477*e4b17023SJohn Marino 478*e4b17023SJohn Marino #ifndef FLOAT 479*e4b17023SJohn Marino extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype); 480*e4b17023SJohn Marino #if defined(L_make_df) 481*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype); 482*e4b17023SJohn Marino #endif 483*e4b17023SJohn Marino #if defined(L_df_to_sf) 484*e4b17023SJohn Marino extern SFtype df_to_sf (DFtype); 485*e4b17023SJohn Marino #endif 486*e4b17023SJohn Marino #if defined(L_df_to_tf) && defined(TMODES) 487*e4b17023SJohn Marino extern TFtype df_to_tf (DFtype); 488*e4b17023SJohn Marino #endif 489*e4b17023SJohn Marino #endif /* ! FLOAT */ 490*e4b17023SJohn Marino 491*e4b17023SJohn Marino #ifdef TMODES 492*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype); 493*e4b17023SJohn Marino extern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype); 494*e4b17023SJohn Marino #ifdef TFLOAT 495*e4b17023SJohn Marino #if defined(L_tf_to_sf) 496*e4b17023SJohn Marino extern SFtype tf_to_sf (TFtype); 497*e4b17023SJohn Marino #endif 498*e4b17023SJohn Marino #if defined(L_tf_to_df) 499*e4b17023SJohn Marino extern DFtype tf_to_df (TFtype); 500*e4b17023SJohn Marino #endif 501*e4b17023SJohn Marino #if defined(L_di_to_tf) 502*e4b17023SJohn Marino extern TFtype di_to_df (DItype); 503*e4b17023SJohn Marino #endif 504*e4b17023SJohn Marino #endif /* TFLOAT */ 505*e4b17023SJohn Marino #endif /* TMODES */ 506*e4b17023SJohn Marino 507*e4b17023SJohn Marino #endif /* ! GCC_FP_BIT_H */ 508