Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/softfloat/include/sftypes.h

    r88d5c1e rc67aff2  
    4040#include <stdint.h>
    4141
    42 /*
    43  * For recognizing NaNs or infinity use specialized comparison
    44  * functions, comparing with these constants is not sufficient.
    45  */
    46 
    47 #define FLOAT32_NAN     UINT32_C(0x7FC00001)
    48 #define FLOAT32_SIGNAN  UINT32_C(0x7F800001)
    49 #define FLOAT32_INF     UINT32_C(0x7F800000)
    50 
    51 #define FLOAT64_NAN     UINT64_C(0x7FF8000000000001)
    52 #define FLOAT64_SIGNAN  UINT64_C(0x7FF0000000000001)
    53 #define FLOAT64_INF     UINT64_C(0x7FF0000000000000)
    54 
    55 #define FLOAT96_NAN_HI     UINT64_C(0x7FFF80000000)
    56 #define FLOAT96_NAN_LO     UINT32_C(0x00010000)
    57 #define FLOAT96_SIGNAN_HI  UINT64_C(0x7FFF00000000)
    58 #define FLOAT96_SIGNAN_LO  UINT32_C(0x00010000)
    59 
    60 #define FLOAT128_NAN_HI     UINT64_C(0x7FFF800000000000)
    61 #define FLOAT128_NAN_LO     UINT64_C(0x0000000000000001)
    62 #define FLOAT128_SIGNAN_HI  UINT64_C(0x7FFF000000000000)
    63 #define FLOAT128_SIGNAN_LO  UINT64_C(0x0000000000000001)
    64 #define FLOAT128_INF_HI     UINT64_C(0x7FFF000000000000)
    65 #define FLOAT128_INF_LO     UINT64_C(0x0000000000000000)
    66 
    67 #define FLOAT32_FRACTION_SIZE   23
    68 #define FLOAT64_FRACTION_SIZE   52
    69 #define FLOAT96_FRACTION_SIZE   64
    70 #define FLOAT128_FRACTION_SIZE  112
    71 #define FLOAT128_FRAC_HI_SIZE   48
    72 #define FLOAT128_FRAC_LO_SIZE   64
    73 
    74 #define FLOAT32_HIDDEN_BIT_MASK      UINT32_C(0x800000)
    75 #define FLOAT64_HIDDEN_BIT_MASK      UINT64_C(0x10000000000000)
    76 #define FLOAT128_HIDDEN_BIT_MASK_HI  UINT64_C(0x1000000000000)
    77 #define FLOAT128_HIDDEN_BIT_MASK_LO  UINT64_C(0x0000000000000000)
    78 
    79 #define FLOAT32_MAX_EXPONENT   0xFF
    80 #define FLOAT64_MAX_EXPONENT   0x7FF
    81 #define FLOAT96_MAX_EXPONENT   0x7FFF
    82 #define FLOAT128_MAX_EXPONENT  0x7FFF
    83 
    84 #define FLOAT32_BIAS   0x7F
    85 #define FLOAT64_BIAS   0x3FF
    86 #define FLOAT96_BIAS   0x3FFF
    87 #define FLOAT128_BIAS  0x3FFF
    88 
    89 #if defined(__BE__)
    90 
    9142typedef union {
    92         uint32_t bin;
     43        float f;
     44        uint32_t binary;
    9345       
    9446        struct {
     47#if defined(__BE__)
    9548                uint32_t sign : 1;
    9649                uint32_t exp : 8;
    9750                uint32_t fraction : 23;
    98         } parts __attribute__((packed));
     51#elif defined(__LE__)
     52                uint32_t fraction : 23;
     53                uint32_t exp : 8;
     54                uint32_t sign : 1;
     55#else
     56        #error Unknown endianess
     57#endif
     58        } parts __attribute__ ((packed));
    9959} float32;
    10060
    10161typedef union {
    102         uint64_t bin;
     62        double d;
     63        uint64_t binary;
    10364       
    10465        struct {
     66#if defined(__BE__)
    10567                uint64_t sign : 1;
    10668                uint64_t exp : 11;
    10769                uint64_t fraction : 52;
    108         } parts __attribute__((packed));
     70#elif defined(__LE__)
     71                uint64_t fraction : 52;
     72                uint64_t exp : 11;
     73                uint64_t sign : 1;
     74#else
     75        #error Unknown endianess
     76#endif
     77        } parts __attribute__ ((packed));
    10978} float64;
    11079
    11180typedef union {
     81        long double ld;
    11282        struct {
    113                 uint64_t hi;
    114                 uint32_t lo;
    115         } bin __attribute__((packed));
    116        
    117         struct {
    118                 uint64_t padding : 16;
    119                 uint64_t sign : 1;
    120                 uint64_t exp : 15;
    121                 uint64_t fraction : 64;
    122         } parts __attribute__((packed));
    123 } float96;
    124 
    125 typedef union {
    126         struct {
     83#if defined(__BE__)
    12784                uint64_t hi;
    12885                uint64_t lo;
    129         } bin __attribute__((packed));
    130        
     86#elif defined(__LE__)
     87                uint64_t lo;
     88                uint64_t hi;
     89#else
     90        #error Unknown endianess
     91#endif
     92        } binary;
     93
    13194        struct {
     95#if defined(__BE__)
    13296                uint64_t sign : 1;
    13397                uint64_t exp : 15;
    13498                uint64_t frac_hi : 48;
    13599                uint64_t frac_lo : 64;
    136         } parts __attribute__((packed));
    137 } float128;
    138 
    139100#elif defined(__LE__)
    140 
    141 typedef union {
    142         uint32_t bin;
    143        
    144         struct {
    145                 uint32_t fraction : 23;
    146                 uint32_t exp : 8;
    147                 uint32_t sign : 1;
    148         } parts __attribute__((packed));
    149 } float32;
    150 
    151 typedef union {
    152         uint64_t bin;
    153        
    154         struct {
    155                 uint64_t fraction : 52;
    156                 uint64_t exp : 11;
    157                 uint64_t sign : 1;
    158         } parts __attribute__((packed));
    159 } float64;
    160 
    161 typedef union {
    162         struct {
    163                 uint32_t lo;
    164                 uint64_t hi;
    165         } bin __attribute__((packed));
    166        
    167         struct {
    168                 uint64_t fraction : 64;
    169                 uint64_t exp : 15;
    170                 uint64_t sign : 1;
    171                 uint64_t padding : 16;
    172         } parts __attribute__((packed));
    173 } float96;
    174 
    175 typedef union {
    176         struct {
    177                 uint64_t lo;
    178                 uint64_t hi;
    179         } bin __attribute__((packed));
    180        
    181         struct {
    182101                uint64_t frac_lo : 64;
    183102                uint64_t frac_hi : 48;
    184103                uint64_t exp : 15;
    185104                uint64_t sign : 1;
    186         } parts __attribute__((packed));
    187 } float128;
    188 
    189105#else
    190106        #error Unknown endianess
    191107#endif
     108        } parts __attribute__ ((packed));
     109} float128;
    192110
    193 typedef union {
    194         float val;
    195        
    196 #if defined(FLOAT_SIZE_32)
    197         float32 data;
    198 #elif defined(FLOAT_SIZE_64)
    199         float64 data;
    200 #elif defined(FLOAT_SIZE_96)
    201         float96 data;
    202 #elif defined(FLOAT_SIZE_128)
    203         float128 data;
    204 #else
    205         #error Unsupported float size
    206 #endif
    207 } float_t;
     111/*
     112 * For recognizing NaNs or infinity use specialized comparison functions,
     113 * comparing with these constants is not sufficient.
     114 */
    208115
    209 typedef union {
    210         double val;
    211        
    212 #if defined(DOUBLE_SIZE_32)
    213         float32 data;
    214 #elif defined(DOUBLE_SIZE_64)
    215         float64 data;
    216 #elif defined(DOUBLE_SIZE_96)
    217         float96 data;
    218 #elif defined(DOUBLE_SIZE_128)
    219         float128 data;
    220 #else
    221         #error Unsupported double size
    222 #endif
    223 } double_t;
     116#define FLOAT32_NAN     0x7FC00001
     117#define FLOAT32_SIGNAN  0x7F800001
     118#define FLOAT32_INF     0x7F800000
    224119
    225 typedef union {
    226         long double val;
    227        
    228 #if defined(LONG_DOUBLE_SIZE_32)
    229         float32 data;
    230 #elif defined(LONG_DOUBLE_SIZE_64)
    231         float64 data;
    232 #elif defined(LONG_DOUBLE_SIZE_96)
    233         float96 data;
    234 #elif defined(LONG_DOUBLE_SIZE_128)
    235         float128 data;
    236 #else
    237         #error Unsupported long double size
    238 #endif
    239 } long_double_t;
     120#define FLOAT64_NAN     0x7FF8000000000001ll
     121#define FLOAT64_SIGNAN  0x7FF0000000000001ll
     122#define FLOAT64_INF     0x7FF0000000000000ll
    240123
     124#define FLOAT128_NAN_HI     0x7FFF800000000000ll
     125#define FLOAT128_NAN_LO     0x0000000000000001ll
     126#define FLOAT128_SIGNAN_HI  0x7FFF000000000000ll
     127#define FLOAT128_SIGNAN_LO  0x0000000000000001ll
     128#define FLOAT128_INF_HI     0x7FFF000000000000ll
     129#define FLOAT128_INF_LO     0x0000000000000000ll
    241130
    242 #if defined(INT_SIZE_8)
     131#define FLOAT32_FRACTION_SIZE   23
     132#define FLOAT64_FRACTION_SIZE   52
     133#define FLOAT128_FRACTION_SIZE 112
     134#define FLOAT128_FRAC_HI_SIZE   48
     135#define FLOAT128_FRAC_LO_SIZE   64
    243136
    244 #define _to_int   _to_int8
    245 #define from_int  int8
     137#define FLOAT32_HIDDEN_BIT_MASK      0x800000
     138#define FLOAT64_HIDDEN_BIT_MASK      0x10000000000000ll
     139#define FLOAT128_HIDDEN_BIT_MASK_HI  0x1000000000000ll
     140#define FLOAT128_HIDDEN_BIT_MASK_LO  0x0000000000000000ll
    246141
    247 #elif defined(INT_SIZE_16)
     142#define FLOAT32_MAX_EXPONENT  0xFF
     143#define FLOAT64_MAX_EXPONENT  0x7FF
     144#define FLOAT128_MAX_EXPONENT 0x7FFF
    248145
    249 #define _to_int   _to_int16
    250 #define from_int  int16
    251 
    252 #elif defined(INT_SIZE_32)
    253 
    254 #define _to_int   _to_int32
    255 #define from_int  int32
    256 
    257 #elif defined(INT_SIZE_64)
    258 
    259 #define _to_int   _to_int64
    260 #define from_int  int64
    261 
    262 #endif
    263 
    264 
    265 #if defined(UINT_SIZE_8)
    266 
    267 #define _to_uint   _to_uint8
    268 #define from_uint  uint8
    269 
    270 #elif defined(UINT_SIZE_16)
    271 
    272 #define _to_uint   _to_uint16
    273 #define from_uint  uint16
    274 
    275 #elif defined(UINT_SIZE_32)
    276 
    277 #define _to_uint   _to_uint32
    278 #define from_uint  uint32
    279 
    280 #elif defined(UINT_SIZE_64)
    281 
    282 #define _to_uint   _to_uint64
    283 #define from_uint  uint64
    284 
    285 #endif
    286 
    287 
    288 #if defined(LONG_SIZE_8)
    289 
    290 #define _to_long   _to_int8
    291 #define from_long  int8
    292 
    293 #elif defined(LONG_SIZE_16)
    294 
    295 #define _to_long   _to_int16
    296 #define from_long  int16
    297 
    298 #elif defined(LONG_SIZE_32)
    299 
    300 #define _to_long   _to_int32
    301 #define from_long  int32
    302 
    303 #elif defined(LONG_SIZE_64)
    304 
    305 #define _to_long   _to_int64
    306 #define from_long  int64
    307 
    308 #endif
    309 
    310 
    311 #if defined(ULONG_SIZE_8)
    312 
    313 #define _to_ulong   _to_uint8
    314 #define from_ulong  uint8
    315 
    316 #elif defined(ULONG_SIZE_16)
    317 
    318 #define _to_ulong   _to_uint16
    319 #define from_ulong  uint16
    320 
    321 #elif defined(ULONG_SIZE_32)
    322 
    323 #define _to_ulong   _to_uint32
    324 #define from_ulong  uint32
    325 
    326 #elif defined(ULONG_SIZE_64)
    327 
    328 #define _to_ulong   _to_uint64
    329 #define from_ulong  uint64
    330 
    331 #endif
    332 
    333 
    334 #if defined(LLONG_SIZE_8)
    335 
    336 #define _to_llong   _to_int8
    337 #define from_llong  int8
    338 
    339 #elif defined(LLONG_SIZE_16)
    340 
    341 #define _to_llong   _to_int16
    342 #define from_llong  int16
    343 
    344 #elif defined(LLONG_SIZE_32)
    345 
    346 #define _to_llong   _to_int32
    347 #define from_llong  int32
    348 
    349 #elif defined(LLONG_SIZE_64)
    350 
    351 #define _to_llong   _to_int64
    352 #define from_llong  int64
    353 
    354 #endif
    355 
    356 
    357 #if defined(ULLONG_SIZE_8)
    358 
    359 #define _to_ullong   _to_uint8
    360 #define from_ullong  uint8
    361 
    362 #elif defined(ULLONG_SIZE_16)
    363 
    364 #define _to_ullong   _to_uint16
    365 #define from_ullong  uint16
    366 
    367 #elif defined(ULLONG_SIZE_32)
    368 
    369 #define _to_ullong   _to_uint32
    370 #define from_ullong  uint32
    371 
    372 #elif defined(ULLONG_SIZE_64)
    373 
    374 #define _to_ullong   _to_uint64
    375 #define from_ullong  uint64
    376 
    377 #endif
    378 
    379 
    380 #if defined(FLOAT_SIZE_32)
    381 
    382 #define add_float     add_float32
    383 #define sub_float     sub_float32
    384 #define mul_float     mul_float32
    385 #define div_float     div_float32
    386 #define _to_float     _to_float32
    387 #define from_float    float32
    388 #define is_float_nan  is_float32_nan
    389 #define is_float_eq   is_float32_eq
    390 #define is_float_lt   is_float32_lt
    391 #define is_float_gt   is_float32_gt
    392 
    393 #elif defined(FLOAT_SIZE_64)
    394 
    395 #define add_float     add_float64
    396 #define sub_float     sub_float64
    397 #define mul_float     mul_float64
    398 #define div_float     div_float64
    399 #define _to_float     _to_float64
    400 #define from_float    float64
    401 #define is_float_nan  is_float64_nan
    402 #define is_float_eq   is_float64_eq
    403 #define is_float_lt   is_float64_lt
    404 #define is_float_gt   is_float64_gt
    405 
    406 #elif defined(FLOAT_SIZE_96)
    407 
    408 #define add_float     add_float96
    409 #define sub_float     sub_float96
    410 #define mul_float     mul_float96
    411 #define div_float     div_float96
    412 #define _to_float     _to_float96
    413 #define from_float    float96
    414 #define is_float_nan  is_float96_nan
    415 #define is_float_eq   is_float96_eq
    416 #define is_float_lt   is_float96_lt
    417 #define is_float_gt   is_float96_gt
    418 
    419 #elif defined(FLOAT_SIZE_128)
    420 
    421 #define add_float     add_float128
    422 #define sub_float     sub_float128
    423 #define mul_float     mul_float128
    424 #define div_float     div_float128
    425 #define _to_float     _to_float128
    426 #define from_float    float128
    427 #define is_float_nan  is_float128_nan
    428 #define is_float_eq   is_float128_eq
    429 #define is_float_lt   is_float128_lt
    430 #define is_float_gt   is_float128_gt
    431 
    432 #endif
    433 
    434 
    435 #if defined(DOUBLE_SIZE_32)
    436 
    437 #define add_double     add_float32
    438 #define sub_double     sub_float32
    439 #define mul_double     mul_float32
    440 #define div_double     div_float32
    441 #define _to_double     _to_float32
    442 #define from_double    float32
    443 #define is_double_nan  is_float32_nan
    444 #define is_double_eq   is_float32_eq
    445 #define is_double_lt   is_float32_lt
    446 #define is_double_gt   is_float32_gt
    447 
    448 #elif defined(DOUBLE_SIZE_64)
    449 
    450 #define add_double     add_float64
    451 #define sub_double     sub_float64
    452 #define mul_double     mul_float64
    453 #define div_double     div_float64
    454 #define _to_double     _to_float64
    455 #define from_double    float64
    456 #define is_double_nan  is_float64_nan
    457 #define is_double_eq   is_float64_eq
    458 #define is_double_lt   is_float64_lt
    459 #define is_double_gt   is_float64_gt
    460 
    461 #elif defined(DOUBLE_SIZE_96)
    462 
    463 #define add_double     add_float96
    464 #define sub_double     sub_float96
    465 #define mul_double     mul_float96
    466 #define div_double     div_float96
    467 #define _to_double     _to_float96
    468 #define from_double    float96
    469 #define is_double_nan  is_float96_nan
    470 #define is_double_eq   is_float96_eq
    471 #define is_double_lt   is_float96_lt
    472 #define is_double_gt   is_float96_gt
    473 
    474 #elif defined(DOUBLE_SIZE_128)
    475 
    476 #define add_double     add_float128
    477 #define sub_double     sub_float128
    478 #define mul_double     mul_float128
    479 #define div_double     div_float128
    480 #define _to_double     _to_float128
    481 #define from_double    float128
    482 #define is_double_nan  is_float128_nan
    483 #define is_double_eq   is_float128_eq
    484 #define is_double_lt   is_float128_lt
    485 #define is_double_gt   is_float128_gt
    486 
    487 #endif
    488 
    489 
    490 #if defined(LONG_DOUBLE_SIZE_32)
    491 
    492 #define add_long_double     add_float32
    493 #define sub_long_double     sub_float32
    494 #define mul_long_double     mul_float32
    495 #define div_long_double     div_float32
    496 #define _to_long_double     _to_float32
    497 #define from_long_double    float32
    498 #define is_long_double_nan  is_float32_nan
    499 #define is_long_double_eq   is_float32_eq
    500 #define is_long_double_lt   is_float32_lt
    501 #define is_long_double_gt   is_float32_gt
    502 
    503 #elif defined(LONG_DOUBLE_SIZE_64)
    504 
    505 #define add_long_double     add_float64
    506 #define sub_long_double     sub_float64
    507 #define mul_long_double     mul_float64
    508 #define div_long_double     div_float64
    509 #define _to_long_double     _to_float64
    510 #define from_long_double    float64
    511 #define is_long_double_nan  is_float64_nan
    512 #define is_long_double_eq   is_float64_eq
    513 #define is_long_double_lt   is_float64_lt
    514 #define is_long_double_gt   is_float64_gt
    515 
    516 #elif defined(LONG_DOUBLE_SIZE_96)
    517 
    518 #define add_long_double     add_float96
    519 #define sub_long_double     sub_float96
    520 #define mul_long_double     mul_float96
    521 #define div_long_double     div_float96
    522 #define _to_long_double     _to_float96
    523 #define from_long_double    float96
    524 #define is_long_double_nan  is_float96_nan
    525 #define is_long_double_eq   is_float96_eq
    526 #define is_long_double_lt   is_float96_lt
    527 #define is_long_double_gt   is_float96_gt
    528 
    529 #elif defined(LONG_DOUBLE_SIZE_128)
    530 
    531 #define add_long_double     add_float128
    532 #define sub_long_double     sub_float128
    533 #define mul_long_double     mul_float128
    534 #define div_long_double     div_float128
    535 #define _to_long_double     _to_float128
    536 #define from_long_double    float128
    537 #define is_long_double_nan  is_float128_nan
    538 #define is_long_double_eq   is_float128_eq
    539 #define is_long_double_lt   is_float128_lt
    540 #define is_long_double_gt   is_float128_gt
    541 
    542 #endif
    543 
    544 
    545 #define CONCAT(a, b)       CONCAT_ARGS(a, b)
    546 #define CONCAT_ARGS(a, b)  a ## b
    547 
    548 #define float32_to_float32(arg)    (arg)
    549 #define float64_to_float64(arg)    (arg)
    550 #define float96_to_float96(arg)    (arg)
    551 #define float128_to_float128(arg)  (arg)
    552 
    553 #define float_to_double       CONCAT(from_float, _to_double)
    554 #define float_to_long_double  CONCAT(from_float, _to_long_double)
    555 #define float_to_int          CONCAT(from_float, _to_int)
    556 #define float_to_uint         CONCAT(from_float, _to_uint)
    557 #define float_to_long         CONCAT(from_float, _to_long)
    558 #define float_to_ulong        CONCAT(from_float, _to_ulong)
    559 #define float_to_llong        CONCAT(from_float, _to_llong)
    560 #define float_to_ullong       CONCAT(from_float, _to_ullong)
    561 
    562 #define double_to_float        CONCAT(from_double, _to_float)
    563 #define double_to_long_double  CONCAT(from_double, _to_long_double)
    564 #define double_to_int          CONCAT(from_double, _to_int)
    565 #define double_to_uint         CONCAT(from_double, _to_uint)
    566 #define double_to_long         CONCAT(from_double, _to_long)
    567 #define double_to_ulong        CONCAT(from_double, _to_ulong)
    568 #define double_to_llong        CONCAT(from_double, _to_llong)
    569 #define double_to_ullong       CONCAT(from_double, _to_ullong)
    570 
    571 #define long_double_to_float   CONCAT(from_long_double, _to_float)
    572 #define long_double_to_double  CONCAT(from_long_double, _to_double)
    573 #define long_double_to_int     CONCAT(from_long_double, _to_int)
    574 #define long_double_to_uint    CONCAT(from_long_double, _to_uint)
    575 #define long_double_to_long    CONCAT(from_long_double, _to_long)
    576 #define long_double_to_ulong   CONCAT(from_long_double, _to_ulong)
    577 #define long_double_to_llong   CONCAT(from_long_double, _to_llong)
    578 #define long_double_to_ullong  CONCAT(from_long_double, _to_ullong)
    579 
    580 #define int_to_float        CONCAT(from_int, _to_float)
    581 #define int_to_double       CONCAT(from_int, _to_double)
    582 #define int_to_long_double  CONCAT(from_int, _to_long_double)
    583 
    584 #define uint_to_float        CONCAT(from_uint, _to_float)
    585 #define uint_to_double       CONCAT(from_uint, _to_double)
    586 #define uint_to_long_double  CONCAT(from_uint, _to_long_double)
    587 
    588 #define long_to_float        CONCAT(from_long, _to_float)
    589 #define long_to_double       CONCAT(from_long, _to_double)
    590 #define long_to_long_double  CONCAT(from_long, _to_long_double)
    591 
    592 #define ulong_to_float        CONCAT(from_ulong, _to_float)
    593 #define ulong_to_double       CONCAT(from_ulong, _to_double)
    594 #define ulong_to_long_double  CONCAT(from_ulong, _to_long_double)
    595 
    596 #define llong_to_float        CONCAT(from_llong, _to_float)
    597 #define llong_to_double       CONCAT(from_llong, _to_double)
    598 #define llong_to_long_double  CONCAT(from_llong, _to_long_double)
    599 
    600 #define ullong_to_float        CONCAT(from_ullong, _to_float)
    601 #define ullong_to_double       CONCAT(from_ullong, _to_double)
    602 #define ullong_to_long_double  CONCAT(from_ullong, _to_long_double)
    603 
     146#define FLOAT32_BIAS  0x7F
     147#define FLOAT64_BIAS  0x3FF
     148#define FLOAT80_BIAS  0x3FFF
     149#define FLOAT128_BIAS 0x3FFF
    604150
    605151#endif
Note: See TracChangeset for help on using the changeset viewer.