]> git.ipfire.org Git - thirdparty/glibc.git/blame - soft-fp/double.h
ARM: Pass dl_hwcap to IFUNC resolver functions.
[thirdparty/glibc.git] / soft-fp / double.h
CommitLineData
d876f532
UD
1/* Software floating-point emulation.
2 Definitions for IEEE Double Precision
568035b7 3 Copyright (C) 1997-2013 Free Software Foundation, Inc.
d876f532
UD
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
41bdb6e2
AJ
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.
d876f532 14
638a783c
RM
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
d876f532
UD
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
41bdb6e2 27 Lesser General Public License for more details.
d876f532 28
41bdb6e2 29 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
30 License along with the GNU C Library; if not, see
31 <http://www.gnu.org/licenses/>. */
d876f532
UD
32
33#if _FP_W_TYPE_SIZE < 32
34#error "Here's a nickel kid. Go buy yourself a real computer."
35#endif
36
37#if _FP_W_TYPE_SIZE < 64
38#define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE)
39#else
40#define _FP_FRACTBITS_D _FP_W_TYPE_SIZE
41#endif
42
43#define _FP_FRACBITS_D 53
44#define _FP_FRACXBITS_D (_FP_FRACTBITS_D - _FP_FRACBITS_D)
45#define _FP_WFRACBITS_D (_FP_WORKBITS + _FP_FRACBITS_D)
46#define _FP_WFRACXBITS_D (_FP_FRACTBITS_D - _FP_WFRACBITS_D)
47#define _FP_EXPBITS_D 11
48#define _FP_EXPBIAS_D 1023
49#define _FP_EXPMAX_D 2047
50
51#define _FP_QNANBIT_D \
52 ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
fe0b1e85
RM
53#define _FP_QNANBIT_SH_D \
54 ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
d876f532
UD
55#define _FP_IMPLBIT_D \
56 ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
fe0b1e85
RM
57#define _FP_IMPLBIT_SH_D \
58 ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
d876f532
UD
59#define _FP_OVERFLOW_D \
60 ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
61
fe0b1e85
RM
62typedef float DFtype __attribute__((mode(DF)));
63
d876f532
UD
64#if _FP_W_TYPE_SIZE < 64
65
66union _FP_UNION_D
67{
fe0b1e85 68 DFtype flt;
f775c276 69 struct _FP_STRUCT_LAYOUT {
d876f532
UD
70#if __BYTE_ORDER == __BIG_ENDIAN
71 unsigned sign : 1;
72 unsigned exp : _FP_EXPBITS_D;
73 unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
74 unsigned frac0 : _FP_W_TYPE_SIZE;
75#else
76 unsigned frac0 : _FP_W_TYPE_SIZE;
77 unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
78 unsigned exp : _FP_EXPBITS_D;
79 unsigned sign : 1;
80#endif
81 } bits __attribute__((packed));
82};
83
84#define FP_DECL_D(X) _FP_DECL(2,X)
85#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val)
86#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_2_P(D,X,val)
87#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_2(D,val,X)
88#define FP_PACK_RAW_DP(val,X) \
89 do { \
90 if (!FP_INHIBIT_RESULTS) \
91 _FP_PACK_RAW_2_P(D,val,X); \
92 } while (0)
93
94#define FP_UNPACK_D(X,val) \
95 do { \
96 _FP_UNPACK_RAW_2(D,X,val); \
97 _FP_UNPACK_CANONICAL(D,2,X); \
98 } while (0)
99
100#define FP_UNPACK_DP(X,val) \
101 do { \
102 _FP_UNPACK_RAW_2_P(D,X,val); \
103 _FP_UNPACK_CANONICAL(D,2,X); \
104 } while (0)
105
fe0b1e85
RM
106#define FP_UNPACK_SEMIRAW_D(X,val) \
107 do { \
108 _FP_UNPACK_RAW_2(D,X,val); \
109 _FP_UNPACK_SEMIRAW(D,2,X); \
110 } while (0)
111
112#define FP_UNPACK_SEMIRAW_DP(X,val) \
113 do { \
114 _FP_UNPACK_RAW_2_P(D,X,val); \
115 _FP_UNPACK_SEMIRAW(D,2,X); \
116 } while (0)
117
d876f532
UD
118#define FP_PACK_D(val,X) \
119 do { \
120 _FP_PACK_CANONICAL(D,2,X); \
121 _FP_PACK_RAW_2(D,val,X); \
122 } while (0)
123
124#define FP_PACK_DP(val,X) \
125 do { \
126 _FP_PACK_CANONICAL(D,2,X); \
127 if (!FP_INHIBIT_RESULTS) \
128 _FP_PACK_RAW_2_P(D,val,X); \
129 } while (0)
130
fe0b1e85
RM
131#define FP_PACK_SEMIRAW_D(val,X) \
132 do { \
133 _FP_PACK_SEMIRAW(D,2,X); \
134 _FP_PACK_RAW_2(D,val,X); \
135 } while (0)
136
137#define FP_PACK_SEMIRAW_DP(val,X) \
138 do { \
139 _FP_PACK_SEMIRAW(D,2,X); \
140 if (!FP_INHIBIT_RESULTS) \
141 _FP_PACK_RAW_2_P(D,val,X); \
142 } while (0)
143
d876f532
UD
144#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,2,X)
145#define FP_NEG_D(R,X) _FP_NEG(D,2,R,X)
146#define FP_ADD_D(R,X,Y) _FP_ADD(D,2,R,X,Y)
147#define FP_SUB_D(R,X,Y) _FP_SUB(D,2,R,X,Y)
148#define FP_MUL_D(R,X,Y) _FP_MUL(D,2,R,X,Y)
149#define FP_DIV_D(R,X,Y) _FP_DIV(D,2,R,X,Y)
150#define FP_SQRT_D(R,X) _FP_SQRT(D,2,R,X)
151#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q)
152
153#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,2,r,X,Y,un)
154#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,2,r,X,Y)
e7b8c7bc 155#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,2,r,X,Y)
d876f532
UD
156
157#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,2,r,X,rsz,rsg)
158#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,2,X,r,rs,rt)
159
160#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_2(X)
161#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2(X)
162
163#else
164
165union _FP_UNION_D
166{
fe0b1e85 167 DFtype flt;
f775c276 168 struct _FP_STRUCT_LAYOUT {
d876f532 169#if __BYTE_ORDER == __BIG_ENDIAN
06029c20
JJ
170 unsigned sign : 1;
171 unsigned exp : _FP_EXPBITS_D;
172 _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
d876f532 173#else
06029c20
JJ
174 _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
175 unsigned exp : _FP_EXPBITS_D;
176 unsigned sign : 1;
d876f532
UD
177#endif
178 } bits __attribute__((packed));
179};
180
181#define FP_DECL_D(X) _FP_DECL(1,X)
182#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val)
183#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_1_P(D,X,val)
184#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_1(D,val,X)
185#define FP_PACK_RAW_DP(val,X) \
186 do { \
187 if (!FP_INHIBIT_RESULTS) \
188 _FP_PACK_RAW_1_P(D,val,X); \
189 } while (0)
190
191#define FP_UNPACK_D(X,val) \
192 do { \
193 _FP_UNPACK_RAW_1(D,X,val); \
194 _FP_UNPACK_CANONICAL(D,1,X); \
195 } while (0)
196
197#define FP_UNPACK_DP(X,val) \
198 do { \
199 _FP_UNPACK_RAW_1_P(D,X,val); \
200 _FP_UNPACK_CANONICAL(D,1,X); \
201 } while (0)
202
fe0b1e85
RM
203#define FP_UNPACK_SEMIRAW_D(X,val) \
204 do { \
58a7457e 205 _FP_UNPACK_RAW_1(D,X,val); \
fe0b1e85
RM
206 _FP_UNPACK_SEMIRAW(D,1,X); \
207 } while (0)
208
209#define FP_UNPACK_SEMIRAW_DP(X,val) \
210 do { \
58a7457e 211 _FP_UNPACK_RAW_1_P(D,X,val); \
fe0b1e85
RM
212 _FP_UNPACK_SEMIRAW(D,1,X); \
213 } while (0)
214
d876f532
UD
215#define FP_PACK_D(val,X) \
216 do { \
217 _FP_PACK_CANONICAL(D,1,X); \
218 _FP_PACK_RAW_1(D,val,X); \
219 } while (0)
220
221#define FP_PACK_DP(val,X) \
222 do { \
223 _FP_PACK_CANONICAL(D,1,X); \
224 if (!FP_INHIBIT_RESULTS) \
225 _FP_PACK_RAW_1_P(D,val,X); \
226 } while (0)
227
fe0b1e85
RM
228#define FP_PACK_SEMIRAW_D(val,X) \
229 do { \
230 _FP_PACK_SEMIRAW(D,1,X); \
231 _FP_PACK_RAW_1(D,val,X); \
232 } while (0)
233
234#define FP_PACK_SEMIRAW_DP(val,X) \
235 do { \
236 _FP_PACK_SEMIRAW(D,1,X); \
237 if (!FP_INHIBIT_RESULTS) \
238 _FP_PACK_RAW_1_P(D,val,X); \
239 } while (0)
240
d876f532
UD
241#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,1,X)
242#define FP_NEG_D(R,X) _FP_NEG(D,1,R,X)
243#define FP_ADD_D(R,X,Y) _FP_ADD(D,1,R,X,Y)
244#define FP_SUB_D(R,X,Y) _FP_SUB(D,1,R,X,Y)
245#define FP_MUL_D(R,X,Y) _FP_MUL(D,1,R,X,Y)
246#define FP_DIV_D(R,X,Y) _FP_DIV(D,1,R,X,Y)
247#define FP_SQRT_D(R,X) _FP_SQRT(D,1,R,X)
248#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q)
249
250/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
251 the target machine. */
252
253#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,1,r,X,Y,un)
254#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,1,r,X,Y)
1e832e37 255#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,1,r,X,Y)
d876f532
UD
256
257#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,1,r,X,rsz,rsg)
258#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,1,X,r,rs,rt)
259
260#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_1(X)
261#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1(X)
262
263#endif /* W_TYPE_SIZE < 64 */