Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1906 | serge | 1 | /* Software floating-point emulation. |
2 | Definitions for IEEE Single Precision. |
||
3 | Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc. |
||
4 | This file is part of the GNU C Library. |
||
5 | Contributed by Richard Henderson (rth@cygnus.com), |
||
6 | Jakub Jelinek (jj@ultra.linux.cz), |
||
7 | David S. Miller (davem@redhat.com) and |
||
8 | Peter Maydell (pmaydell@chiark.greenend.org.uk). |
||
9 | |||
10 | The GNU C Library is free software; you can redistribute it and/or |
||
11 | modify it under the terms of the GNU Lesser General Public |
||
12 | License as published by the Free Software Foundation; either |
||
13 | version 2.1 of the License, or (at your option) any later version. |
||
14 | |||
15 | In addition to the permissions in the GNU Lesser General Public |
||
16 | License, the Free Software Foundation gives you unlimited |
||
17 | permission to link the compiled version of this file into |
||
18 | combinations with other programs, and to distribute those |
||
19 | combinations without any restriction coming from the use of this |
||
20 | file. (The Lesser General Public License restrictions do apply in |
||
21 | other respects; for example, they cover modification of the file, |
||
22 | and distribution when not linked into a combine executable.) |
||
23 | |||
24 | The GNU C Library is distributed in the hope that it will be useful, |
||
25 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
26 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
27 | Lesser General Public License for more details. |
||
28 | |||
29 | You should have received a copy of the GNU Lesser General Public |
||
30 | License along with the GNU C Library; if not, write to the Free |
||
31 | Software Foundation, 51 Franklin Street, Fifth Floor, Boston, |
||
32 | MA 02110-1301, USA. */ |
||
33 | |||
34 | #if _FP_W_TYPE_SIZE < 32 |
||
35 | #error "Here's a nickel kid. Go buy yourself a real computer." |
||
36 | #endif |
||
37 | |||
38 | #define _FP_FRACTBITS_S _FP_W_TYPE_SIZE |
||
39 | |||
40 | #define _FP_FRACBITS_S 24 |
||
41 | #define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S) |
||
42 | #define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S) |
||
43 | #define _FP_WFRACXBITS_S (_FP_FRACTBITS_S - _FP_WFRACBITS_S) |
||
44 | #define _FP_EXPBITS_S 8 |
||
45 | #define _FP_EXPBIAS_S 127 |
||
46 | #define _FP_EXPMAX_S 255 |
||
47 | #define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2)) |
||
48 | #define _FP_QNANBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS)) |
||
49 | #define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1)) |
||
50 | #define _FP_IMPLBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS)) |
||
51 | #define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S)) |
||
52 | |||
53 | /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be |
||
54 | chosen by the target machine. */ |
||
55 | |||
56 | typedef float SFtype __attribute__((mode(SF))); |
||
57 | |||
58 | union _FP_UNION_S |
||
59 | { |
||
60 | SFtype flt; |
||
61 | struct { |
||
62 | #if __BYTE_ORDER == __BIG_ENDIAN |
||
63 | unsigned sign : 1; |
||
64 | unsigned exp : _FP_EXPBITS_S; |
||
65 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); |
||
66 | #else |
||
67 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); |
||
68 | unsigned exp : _FP_EXPBITS_S; |
||
69 | unsigned sign : 1; |
||
70 | #endif |
||
71 | } bits __attribute__((packed)); |
||
72 | }; |
||
73 | |||
74 | #define FP_DECL_S(X) _FP_DECL(1,X) |
||
75 | #define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) |
||
76 | #define FP_UNPACK_RAW_SP(X,val) _FP_UNPACK_RAW_1_P(S,X,val) |
||
77 | #define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X) |
||
78 | #define FP_PACK_RAW_SP(val,X) \ |
||
79 | do { \ |
||
80 | if (!FP_INHIBIT_RESULTS) \ |
||
81 | _FP_PACK_RAW_1_P(S,val,X); \ |
||
82 | } while (0) |
||
83 | |||
84 | #define FP_UNPACK_S(X,val) \ |
||
85 | do { \ |
||
86 | _FP_UNPACK_RAW_1(S,X,val); \ |
||
87 | _FP_UNPACK_CANONICAL(S,1,X); \ |
||
88 | } while (0) |
||
89 | |||
90 | #define FP_UNPACK_SP(X,val) \ |
||
91 | do { \ |
||
92 | _FP_UNPACK_RAW_1_P(S,X,val); \ |
||
93 | _FP_UNPACK_CANONICAL(S,1,X); \ |
||
94 | } while (0) |
||
95 | |||
96 | #define FP_UNPACK_SEMIRAW_S(X,val) \ |
||
97 | do { \ |
||
98 | _FP_UNPACK_RAW_1(S,X,val); \ |
||
99 | _FP_UNPACK_SEMIRAW(S,1,X); \ |
||
100 | } while (0) |
||
101 | |||
102 | #define FP_UNPACK_SEMIRAW_SP(X,val) \ |
||
103 | do { \ |
||
104 | _FP_UNPACK_RAW_1_P(S,X,val); \ |
||
105 | _FP_UNPACK_SEMIRAW(S,1,X); \ |
||
106 | } while (0) |
||
107 | |||
108 | #define FP_PACK_S(val,X) \ |
||
109 | do { \ |
||
110 | _FP_PACK_CANONICAL(S,1,X); \ |
||
111 | _FP_PACK_RAW_1(S,val,X); \ |
||
112 | } while (0) |
||
113 | |||
114 | #define FP_PACK_SP(val,X) \ |
||
115 | do { \ |
||
116 | _FP_PACK_CANONICAL(S,1,X); \ |
||
117 | if (!FP_INHIBIT_RESULTS) \ |
||
118 | _FP_PACK_RAW_1_P(S,val,X); \ |
||
119 | } while (0) |
||
120 | |||
121 | #define FP_PACK_SEMIRAW_S(val,X) \ |
||
122 | do { \ |
||
123 | _FP_PACK_SEMIRAW(S,1,X); \ |
||
124 | _FP_PACK_RAW_1(S,val,X); \ |
||
125 | } while (0) |
||
126 | |||
127 | #define FP_PACK_SEMIRAW_SP(val,X) \ |
||
128 | do { \ |
||
129 | _FP_PACK_SEMIRAW(S,1,X); \ |
||
130 | if (!FP_INHIBIT_RESULTS) \ |
||
131 | _FP_PACK_RAW_1_P(S,val,X); \ |
||
132 | } while (0) |
||
133 | |||
134 | #define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X) |
||
135 | #define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) |
||
136 | #define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y) |
||
137 | #define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y) |
||
138 | #define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y) |
||
139 | #define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y) |
||
140 | #define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X) |
||
141 | #define _FP_SQRT_MEAT_S(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q) |
||
142 | |||
143 | #define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un) |
||
144 | #define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y) |
||
145 | #define FP_CMP_UNORD_S(r,X,Y) _FP_CMP_UNORD(S,1,r,X,Y) |
||
146 | |||
147 | #define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg) |
||
148 | #define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt) |
||
149 | |||
150 | #define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1(X) |
||
151 | #define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X)><>><>><>><>><>> |