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