00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef GCC_FP_BIT_H
00030 #define GCC_FP_BIT_H
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef FINE_GRAINED_LIBRARIES
00041 #define L_pack_df
00042 #define L_unpack_df
00043 #define L_pack_sf
00044 #define L_unpack_sf
00045 #define L_addsub_sf
00046 #define L_addsub_df
00047 #define L_mul_sf
00048 #define L_mul_df
00049 #define L_div_sf
00050 #define L_div_df
00051 #define L_fpcmp_parts_sf
00052 #define L_fpcmp_parts_df
00053 #define L_compare_sf
00054 #define L_compare_df
00055 #define L_eq_sf
00056 #define L_eq_df
00057 #define L_ne_sf
00058 #define L_ne_df
00059 #define L_gt_sf
00060 #define L_gt_df
00061 #define L_ge_sf
00062 #define L_ge_df
00063 #define L_lt_sf
00064 #define L_lt_df
00065 #define L_le_sf
00066 #define L_le_df
00067 #define L_unord_sf
00068 #define L_unord_df
00069 #define L_usi_to_sf
00070 #define L_usi_to_df
00071 #define L_si_to_sf
00072 #define L_si_to_df
00073 #define L_sf_to_si
00074 #define L_df_to_si
00075 #define L_f_to_usi
00076 #define L_df_to_usi
00077 #define L_negate_sf
00078 #define L_negate_df
00079 #define L_make_sf
00080 #define L_make_df
00081 #define L_sf_to_df
00082 #define L_df_to_sf
00083 #ifdef FLOAT
00084 #define L_thenan_sf
00085 #else
00086 #define L_thenan_df
00087 #endif
00088 #endif
00089
00090 #if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
00091 # define TMODES
00092 #endif
00093
00094 typedef float SFtype __attribute__ ((mode (SF)));
00095 typedef float DFtype __attribute__ ((mode (DF)));
00096 #ifdef TMODES
00097 typedef float TFtype __attribute__ ((mode (TF)));
00098 #endif
00099
00100 typedef int HItype __attribute__ ((mode (HI)));
00101 typedef int SItype __attribute__ ((mode (SI)));
00102 typedef int DItype __attribute__ ((mode (DI)));
00103 #ifdef TMODES
00104 typedef int TItype __attribute__ ((mode (TI)));
00105 #endif
00106
00107
00108 #ifndef CMPtype
00109 #define CMPtype SItype
00110 #endif
00111
00112 typedef unsigned int UHItype __attribute__ ((mode (HI)));
00113 typedef unsigned int USItype __attribute__ ((mode (SI)));
00114 typedef unsigned int UDItype __attribute__ ((mode (DI)));
00115 #ifdef TMODES
00116 typedef unsigned int UTItype __attribute__ ((mode (TI)));
00117 #endif
00118
00119 #define MAX_USI_INT (~(USItype)0)
00120 #define MAX_SI_INT ((SItype) (MAX_USI_INT >> 1))
00121 #define BITS_PER_SI (4 * BITS_PER_UNIT)
00122 #ifdef TMODES
00123 #define MAX_UDI_INT (~(UDItype)0)
00124 #define MAX_DI_INT ((DItype) (MAX_UDI_INT >> 1))
00125 #define BITS_PER_DI (8 * BITS_PER_UNIT)
00126 #endif
00127
00128 #ifdef FLOAT_ONLY
00129 #define NO_DI_MODE
00130 #endif
00131
00132 #ifdef TFLOAT
00133 # ifndef TMODES
00134 # error "TFLOAT requires long double to have 113 bits of mantissa"
00135 # endif
00136
00137 # define PREFIXFPDP tp
00138 # define PREFIXSFDF tf
00139 # define NGARDS 10L
00140 # define GARDROUND 0x1ff
00141 # define GARDMASK 0x3ff
00142 # define GARDMSB 0x200
00143 # define FRAC_NBITS 128
00144
00145 # if __LDBL_MANT_DIG__ == 113
00146 # define EXPBITS 15
00147 # define EXPBIAS 16383
00148 # define EXPMAX (0x7fff)
00149 # define QUIET_NAN ((TItype)0x8 << 108)
00150 # define FRACHIGH ((TItype)0x8 << 124)
00151 # define FRACHIGH2 ((TItype)0xc << 124)
00152 # define FRACBITS 112
00153 # endif
00154
00155 # if __LDBL_MANT_DIG__ == 106
00156 # define EXPBITS 11
00157 # define EXPBIAS 1023
00158 # define EXPMAX (0x7ff)
00159 # define QUIET_NAN ((TItype)0x8 << (48 + 64))
00160 # define FRACHIGH ((TItype)0x8 << 124)
00161 # define FRACHIGH2 ((TItype)0xc << 124)
00162 # define FRACBITS 105
00163 # define HALFFRACBITS 52
00164 # define HALFSHIFT 64
00165 # endif
00166
00167 # define pack_d __pack_t
00168 # define unpack_d __unpack_t
00169 # define __fpcmp_parts __fpcmp_parts_t
00170 typedef UTItype fractype;
00171 typedef UDItype halffractype;
00172 typedef USItype qrtrfractype;
00173 #define qrtrfractype qrtrfractype
00174 typedef TFtype FLO_type;
00175 typedef TItype intfrac;
00176 #elif defined FLOAT
00177 # define NGARDS 7L
00178 # define GARDROUND 0x3f
00179 # define GARDMASK 0x7f
00180 # define GARDMSB 0x40
00181 # define EXPBITS 8
00182 # define EXPBIAS 127
00183 # define FRACBITS 23
00184 # define EXPMAX (0xff)
00185 # define QUIET_NAN 0x100000L
00186 # define FRAC_NBITS 32
00187 # define FRACHIGH 0x80000000L
00188 # define FRACHIGH2 0xc0000000L
00189 # define pack_d __pack_f
00190 # define unpack_d __unpack_f
00191 # define __fpcmp_parts __fpcmp_parts_f
00192 typedef USItype fractype;
00193 typedef UHItype halffractype;
00194 typedef SFtype FLO_type;
00195 typedef SItype intfrac;
00196
00197 #else
00198 # define PREFIXFPDP dp
00199 # define PREFIXSFDF df
00200 # define NGARDS 8L
00201 # define GARDROUND 0x7f
00202 # define GARDMASK 0xff
00203 # define GARDMSB 0x80
00204 # define EXPBITS 11
00205 # define EXPBIAS 1023
00206 # define FRACBITS 52
00207 # define EXPMAX (0x7ff)
00208 # define QUIET_NAN 0x8000000000000LL
00209 # define FRAC_NBITS 64
00210 # define FRACHIGH 0x8000000000000000LL
00211 # define FRACHIGH2 0xc000000000000000LL
00212 # define pack_d __pack_d
00213 # define unpack_d __unpack_d
00214 # define __fpcmp_parts __fpcmp_parts_d
00215 typedef UDItype fractype;
00216 typedef USItype halffractype;
00217 typedef DFtype FLO_type;
00218 typedef DItype intfrac;
00219 #endif
00220
00221 #ifdef US_SOFTWARE_GOFAST
00222 # ifdef TFLOAT
00223 # error "GOFAST TFmode not supported"
00224 # elif defined FLOAT
00225 # define add fpadd
00226 # define sub fpsub
00227 # define multiply fpmul
00228 # define divide fpdiv
00229 # define compare fpcmp
00230 # define _unord_f2 __unordsf2
00231 # define usi_to_float __floatunsisf
00232 # define si_to_float sitofp
00233 # define float_to_si fptosi
00234 # define float_to_usi fptoui
00235 # define negate __negsf2
00236 # define sf_to_df fptodp
00237 # define sf_to_tf __extendsftf2
00238 # else
00239 # define add dpadd
00240 # define sub dpsub
00241 # define multiply dpmul
00242 # define divide dpdiv
00243 # define compare dpcmp
00244 # define _unord_f2 __unorddf2
00245 # define usi_to_float __floatunsidf
00246 # define si_to_float litodp
00247 # define float_to_si dptoli
00248 # define float_to_usi dptoul
00249 # define negate __negdf2
00250 # define df_to_sf dptofp
00251 # define df_to_tf __extenddftf2
00252 # endif
00253 #else
00254 # ifdef TFLOAT
00255 # define add __addtf3
00256 # define sub __subtf3
00257 # define multiply __multf3
00258 # define divide __divtf3
00259 # define compare __cmptf2
00260 # define _eq_f2 __eqtf2
00261 # define _ne_f2 __netf2
00262 # define _gt_f2 __gttf2
00263 # define _ge_f2 __getf2
00264 # define _lt_f2 __lttf2
00265 # define _le_f2 __letf2
00266 # define _unord_f2 __unordtf2
00267 # define usi_to_float __floatunsitf
00268 # define si_to_float __floatsitf
00269 # define float_to_si __fixtfsi
00270 # define float_to_usi __fixunstfsi
00271 # define negate __negtf2
00272 # define tf_to_sf __trunctfsf2
00273 # define tf_to_df __trunctfdf2
00274 # elif defined FLOAT
00275 # define add __addsf3
00276 # define sub __subsf3
00277 # define multiply __mulsf3
00278 # define divide __divsf3
00279 # define compare __cmpsf2
00280 # define _eq_f2 __eqsf2
00281 # define _ne_f2 __nesf2
00282 # define _gt_f2 __gtsf2
00283 # define _ge_f2 __gesf2
00284 # define _lt_f2 __ltsf2
00285 # define _le_f2 __lesf2
00286 # define _unord_f2 __unordsf2
00287 # define usi_to_float __floatunsisf
00288 # define si_to_float __floatsisf
00289 # define float_to_si __fixsfsi
00290 # define float_to_usi __fixunssfsi
00291 # define negate __negsf2
00292 # define sf_to_df __extendsfdf2
00293 # define sf_to_tf __extendsftf2
00294 # else
00295 # define add __adddf3
00296 # define sub __subdf3
00297 # define multiply __muldf3
00298 # define divide __divdf3
00299 # define compare __cmpdf2
00300 # define _eq_f2 __eqdf2
00301 # define _ne_f2 __nedf2
00302 # define _gt_f2 __gtdf2
00303 # define _ge_f2 __gedf2
00304 # define _lt_f2 __ltdf2
00305 # define _le_f2 __ledf2
00306 # define _unord_f2 __unorddf2
00307 # define usi_to_float __floatunsidf
00308 # define si_to_float __floatsidf
00309 # define float_to_si __fixdfsi
00310 # define float_to_usi __fixunsdfsi
00311 # define negate __negdf2
00312 # define df_to_sf __truncdfsf2
00313 # define df_to_tf __extenddftf2
00314 # endif
00315 #endif
00316
00317 #ifndef INLINE
00318 #define INLINE __inline__
00319 #endif
00320
00321
00322 #define LSHIFT(a) { a = (a & 1) | (a >> 1); }
00323
00324
00325
00326
00327
00328
00329 #define F_D_BITOFF (52+8-(23+7))
00330
00331 #ifdef TMODES
00332 # define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7))
00333 # define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8))
00334 #endif
00335
00336
00337 #define NORMAL_EXPMIN (-(EXPBIAS)+1)
00338 #define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
00339 #define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
00340
00341
00342
00343 typedef enum
00344 {
00345 CLASS_SNAN,
00346 CLASS_QNAN,
00347 CLASS_ZERO,
00348 CLASS_NUMBER,
00349 CLASS_INFINITY
00350 } fp_class_type;
00351
00352 typedef struct
00353 {
00354 #ifdef SMALL_MACHINE
00355 char class;
00356 unsigned char sign;
00357 short normal_exp;
00358 #else
00359 fp_class_type class;
00360 unsigned int sign;
00361 int normal_exp;
00362 #endif
00363
00364 union
00365 {
00366 fractype ll;
00367 halffractype l[2];
00368 } fraction;
00369 } fp_number_type;
00370
00371 typedef union
00372 {
00373 FLO_type value;
00374 fractype value_raw;
00375
00376 #ifndef FLOAT
00377 # ifdef qrtrfractype
00378 qrtrfractype qwords[4];
00379 # else
00380 halffractype words[2];
00381 # endif
00382 #endif
00383
00384 #ifdef FLOAT_BIT_ORDER_MISMATCH
00385 struct
00386 {
00387 fractype fraction:FRACBITS __attribute__ ((packed));
00388 unsigned int exp:EXPBITS __attribute__ ((packed));
00389 unsigned int sign:1 __attribute__ ((packed));
00390 }
00391 bits;
00392 #endif
00393
00394 #ifdef _DEBUG_BITFLOAT
00395 struct
00396 {
00397 unsigned int sign:1 __attribute__ ((packed));
00398 unsigned int exp:EXPBITS __attribute__ ((packed));
00399 fractype fraction:FRACBITS __attribute__ ((packed));
00400 }
00401 bits_big_endian;
00402
00403 struct
00404 {
00405 fractype fraction:FRACBITS __attribute__ ((packed));
00406 unsigned int exp:EXPBITS __attribute__ ((packed));
00407 unsigned int sign:1 __attribute__ ((packed));
00408 }
00409 bits_little_endian;
00410 #endif
00411 }
00412 FLO_union_type;
00413
00414
00415
00416 #if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
00417 extern FLO_type pack_d (fp_number_type *);
00418 #endif
00419
00420 extern void unpack_d (FLO_union_type *, fp_number_type *);
00421
00422 #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
00423 extern FLO_type add (FLO_type, FLO_type);
00424 extern FLO_type sub (FLO_type, FLO_type);
00425 #endif
00426
00427 #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
00428 extern FLO_type multiply (FLO_type, FLO_type);
00429 #endif
00430
00431 #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
00432 extern FLO_type divide (FLO_type, FLO_type);
00433 #endif
00434
00435 extern int __fpcmp_parts (fp_number_type *, fp_number_type *);
00436
00437 #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
00438 extern CMPtype compare (FLO_type, FLO_type);
00439 #endif
00440
00441 #ifndef US_SOFTWARE_GOFAST
00442
00443 #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
00444 extern CMPtype _eq_f2 (FLO_type, FLO_type);
00445 #endif
00446
00447 #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
00448 extern CMPtype _ne_f2 (FLO_type, FLO_type);
00449 #endif
00450
00451 #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
00452 extern CMPtype _gt_f2 (FLO_type, FLO_type);
00453 #endif
00454
00455 #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
00456 extern CMPtype _ge_f2 (FLO_type, FLO_type);
00457 #endif
00458
00459 #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
00460 extern CMPtype _lt_f2 (FLO_type, FLO_type);
00461 #endif
00462
00463 #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
00464 extern CMPtype _le_f2 (FLO_type, FLO_type);
00465 #endif
00466
00467 #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
00468 extern CMPtype _unord_f2 (FLO_type, FLO_type);
00469 #endif
00470
00471 #endif
00472
00473 #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
00474 extern FLO_type si_to_float (SItype);
00475 #endif
00476
00477 #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
00478 extern SItype float_to_si (FLO_type);
00479 #endif
00480
00481 #if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
00482 #if defined(US_SOFTWARE_GOFAST) || defined(L_tf_to_usi)
00483 extern USItype float_to_usi (FLO_type);
00484 #endif
00485 #endif
00486
00487 #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
00488 extern FLO_type usi_to_float (USItype);
00489 #endif
00490
00491 #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
00492 extern FLO_type negate (FLO_type);
00493 #endif
00494
00495 #ifdef FLOAT
00496 #if defined(L_make_sf)
00497 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
00498 #endif
00499 #ifndef FLOAT_ONLY
00500 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
00501 #if defined(L_sf_to_df)
00502 extern DFtype sf_to_df (SFtype);
00503 #endif
00504 #if defined(L_sf_to_tf) && defined(TMODES)
00505 extern TFtype sf_to_tf (SFtype);
00506 #endif
00507 #endif
00508 #endif
00509
00510 #ifndef FLOAT
00511 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
00512 #if defined(L_make_df)
00513 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
00514 #endif
00515 #if defined(L_df_to_sf)
00516 extern SFtype df_to_sf (DFtype);
00517 #endif
00518 #if defined(L_df_to_tf) && defined(TMODES)
00519 extern TFtype df_to_tf (DFtype);
00520 #endif
00521 #endif
00522
00523 #ifdef TMODES
00524 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
00525 extern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype);
00526 #ifdef TFLOAT
00527 #if defined(L_tf_to_sf)
00528 extern SFtype tf_to_sf (TFtype);
00529 #endif
00530 #if defined(L_tf_to_df)
00531 extern DFtype tf_to_df (TFtype);
00532 #endif
00533 #if defined(L_di_to_tf)
00534 extern TFtype di_to_df (DItype);
00535 #endif
00536 #endif
00537 #endif
00538
00539 #endif