Merge git://git.infradead.org/battery-2.6
[linux-2.6] / arch / powerpc / math-emu / double.h
1 /*
2  * Definitions for IEEE Double Precision
3  */
4
5 #if _FP_W_TYPE_SIZE < 32
6 #error "Here's a nickel kid.  Go buy yourself a real computer."
7 #endif
8
9 #if _FP_W_TYPE_SIZE < 64
10 #define _FP_FRACTBITS_D         (2 * _FP_W_TYPE_SIZE)
11 #else
12 #define _FP_FRACTBITS_D         _FP_W_TYPE_SIZE
13 #endif
14
15 #define _FP_FRACBITS_D          53
16 #define _FP_FRACXBITS_D         (_FP_FRACTBITS_D - _FP_FRACBITS_D)
17 #define _FP_WFRACBITS_D         (_FP_WORKBITS + _FP_FRACBITS_D)
18 #define _FP_WFRACXBITS_D        (_FP_FRACTBITS_D - _FP_WFRACBITS_D)
19 #define _FP_EXPBITS_D           11
20 #define _FP_EXPBIAS_D           1023
21 #define _FP_EXPMAX_D            2047
22
23 #define _FP_QNANBIT_D           \
24         ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE))
25 #define _FP_IMPLBIT_D           \
26         ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE))
27 #define _FP_OVERFLOW_D          \
28         ((_FP_W_TYPE)1 << (_FP_WFRACBITS_D % _FP_W_TYPE_SIZE))
29
30 #if _FP_W_TYPE_SIZE < 64
31
32 union _FP_UNION_D
33 {
34   double flt;
35   struct {
36 #if __BYTE_ORDER == __BIG_ENDIAN
37     unsigned sign  : 1;
38     unsigned exp   : _FP_EXPBITS_D;
39     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
40     unsigned frac0 : _FP_W_TYPE_SIZE;
41 #else
42     unsigned frac0 : _FP_W_TYPE_SIZE;
43     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
44     unsigned exp   : _FP_EXPBITS_D;
45     unsigned sign  : 1;
46 #endif
47   } bits __attribute__((packed));
48 };
49
50 #define FP_DECL_D(X)            _FP_DECL(2,X)
51 #define FP_UNPACK_RAW_D(X,val)  _FP_UNPACK_RAW_2(D,X,val)
52 #define FP_PACK_RAW_D(val,X)    _FP_PACK_RAW_2(D,val,X)
53
54 #define FP_UNPACK_D(X,val)              \
55   do {                                  \
56     _FP_UNPACK_RAW_2(D,X,val);          \
57     _FP_UNPACK_CANONICAL(D,2,X);        \
58   } while (0)
59
60 #define FP_PACK_D(val,X)                \
61   do {                                  \
62     _FP_PACK_CANONICAL(D,2,X);          \
63     _FP_PACK_RAW_2(D,val,X);            \
64   } while (0)
65
66 #define FP_NEG_D(R,X)           _FP_NEG(D,2,R,X)
67 #define FP_ADD_D(R,X,Y)         _FP_ADD(D,2,R,X,Y)
68 #define FP_SUB_D(R,X,Y)         _FP_SUB(D,2,R,X,Y)
69 #define FP_MUL_D(R,X,Y)         _FP_MUL(D,2,R,X,Y)
70 #define FP_DIV_D(R,X,Y)         _FP_DIV(D,2,R,X,Y)
71 #define FP_SQRT_D(R,X)          _FP_SQRT(D,2,R,X)
72
73 #define FP_CMP_D(r,X,Y,un)      _FP_CMP(D,2,r,X,Y,un)
74 #define FP_CMP_EQ_D(r,X,Y)      _FP_CMP_EQ(D,2,r,X,Y)
75
76 #define FP_TO_INT_D(r,X,rsz,rsg)  _FP_TO_INT(D,2,r,X,rsz,rsg)
77 #define FP_FROM_INT_D(X,r,rs,rt)  _FP_FROM_INT(D,2,X,r,rs,rt)
78
79 #else
80
81 union _FP_UNION_D
82 {
83   double flt;
84   struct {
85 #if __BYTE_ORDER == __BIG_ENDIAN
86     unsigned sign : 1;
87     unsigned exp  : _FP_EXPBITS_D;
88     unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
89 #else
90     unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
91     unsigned exp  : _FP_EXPBITS_D;
92     unsigned sign : 1;
93 #endif
94   } bits __attribute__((packed));
95 };
96
97 #define FP_DECL_D(X)            _FP_DECL(1,X)
98 #define FP_UNPACK_RAW_D(X,val)  _FP_UNPACK_RAW_1(D,X,val)
99 #define FP_PACK_RAW_D(val,X)    _FP_PACK_RAW_1(D,val,X)
100
101 #define FP_UNPACK_D(X,val)              \
102   do {                                  \
103     _FP_UNPACK_RAW_1(D,X,val);          \
104     _FP_UNPACK_CANONICAL(D,1,X);        \
105   } while (0)
106
107 #define FP_PACK_D(val,X)                \
108   do {                                  \
109     _FP_PACK_CANONICAL(D,1,X);          \
110     _FP_PACK_RAW_1(D,val,X);            \
111   } while (0)
112
113 #define FP_NEG_D(R,X)           _FP_NEG(D,1,R,X)
114 #define FP_ADD_D(R,X,Y)         _FP_ADD(D,1,R,X,Y)
115 #define FP_SUB_D(R,X,Y)         _FP_SUB(D,1,R,X,Y)
116 #define FP_MUL_D(R,X,Y)         _FP_MUL(D,1,R,X,Y)
117 #define FP_DIV_D(R,X,Y)         _FP_DIV(D,1,R,X,Y)
118 #define FP_SQRT_D(R,X)          _FP_SQRT(D,1,R,X)
119
120 /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
121    the target machine.  */
122
123 #define FP_CMP_D(r,X,Y,un)      _FP_CMP(D,1,r,X,Y,un)
124 #define FP_CMP_EQ_D(r,X,Y)      _FP_CMP_EQ(D,1,r,X,Y)
125
126 #define FP_TO_INT_D(r,X,rsz,rsg)  _FP_TO_INT(D,1,r,X,rsz,rsg)
127 #define FP_FROM_INT_D(X,r,rs,rt)  _FP_FROM_INT(D,1,X,r,rs,rt)
128
129 #endif /* W_TYPE_SIZE < 64 */