Subversion Repositories HelenOS

Rev

Rev 2479 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2479 Rev 2798
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#ifndef __SFTYPES_H__
35
#ifndef __SFTYPES_H__
36
#define __SFTYPES_H__
36
#define __SFTYPES_H__
37
 
37
 
38
#include <endian.h>
38
#include <byteorder.h>
39
#include <stdint.h>
39
#include <stdint.h>
40
 
40
 
41
typedef union {
41
typedef union {
42
    float f;
42
    float f;
43
    uint32_t binary;
43
    uint32_t binary;
44
 
44
 
45
    struct  {
45
    struct  {
46
        #if __BYTE_ORDER == __BIG_ENDIAN
46
#if defined(ARCH_IS_BIG_ENDIAN)
47
        uint32_t sign:1;
47
        uint32_t sign:1;
48
        uint32_t exp:8;
48
        uint32_t exp:8;
49
        uint32_t fraction:23;
49
        uint32_t fraction:23;
50
        #elif __BYTE_ORDER == __LITTLE_ENDIAN
50
#elif defined(ARCH_IS_LITTLE_ENDIAN)
51
        uint32_t fraction:23;
51
        uint32_t fraction:23;
52
        uint32_t exp:8;
52
        uint32_t exp:8;
53
        uint32_t sign:1;
53
        uint32_t sign:1;
54
        #else 
54
#else 
55
            #error "Unknown endians."
55
#error "Unknown endians."
56
        #endif
56
#endif
57
        } parts __attribute__ ((packed));
57
        } parts __attribute__ ((packed));
58
    } float32;
58
    } float32;
59
   
59
   
60
typedef union {
60
typedef union {
61
    double d;
61
    double d;
62
    uint64_t binary;
62
    uint64_t binary;
63
   
63
   
64
    struct  {
64
    struct  {
65
        #if __BYTE_ORDER == __BIG_ENDIAN
65
#if defined(ARCH_IS_BIG_ENDIAN)
66
        uint64_t sign:1;
66
        uint64_t sign:1;
67
        uint64_t exp:11;
67
        uint64_t exp:11;
68
        uint64_t fraction:52;
68
        uint64_t fraction:52;
69
        #elif __BYTE_ORDER == __LITTLE_ENDIAN
69
#elif defined(ARCH_IS_LITTLE_ENDIAN)
70
        uint64_t fraction:52;
70
        uint64_t fraction:52;
71
        uint64_t exp:11;
71
        uint64_t exp:11;
72
        uint64_t sign:1;
72
        uint64_t sign:1;
73
        #else 
73
#else 
74
            #error "Unknown endians."
74
#error "Unknown endians."
75
        #endif
75
#endif
76
        } parts __attribute__ ((packed));
76
        } parts __attribute__ ((packed));
77
    } float64;
77
    } float64;
78
 
78
 
79
#define FLOAT32_MAX 0x7f800000
79
#define FLOAT32_MAX 0x7f800000
80
#define FLOAT32_MIN 0xff800000
80
#define FLOAT32_MIN 0xff800000
81
#define FLOAT64_MAX
81
#define FLOAT64_MAX
82
#define FLOAT64_MIN
82
#define FLOAT64_MIN
83
 
83
 
-
 
84
/*
84
/* For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf, comparing with this constants is not sufficient */
85
 * For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf,
-
 
86
 * comparing with these constants is not sufficient.
-
 
87
 */
85
#define FLOAT32_NAN 0x7FC00001
88
#define FLOAT32_NAN 0x7FC00001
86
#define FLOAT32_SIGNAN 0x7F800001
89
#define FLOAT32_SIGNAN 0x7F800001
87
#define FLOAT32_INF 0x7F800000
90
#define FLOAT32_INF 0x7F800000
88
 
91
 
89
#define FLOAT64_NAN 0x7FF8000000000001ll
92
#define FLOAT64_NAN 0x7FF8000000000001ll