]>
Commit | Line | Data |
---|---|---|
f8e8b8ed | 1 | /* Get NaN payload. ldbl-128 version. |
d614a753 | 2 | Copyright (C) 2016-2020 Free Software Foundation, Inc. |
f8e8b8ed JM |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
16 | License along with the GNU C Library; if not, see | |
5a82c748 | 17 | <https://www.gnu.org/licenses/>. */ |
f8e8b8ed JM |
18 | |
19 | #include <math.h> | |
20 | #include <math_private.h> | |
fd3b4e7c | 21 | #include <libm-alias-ldouble.h> |
f8e8b8ed JM |
22 | #include <stdint.h> |
23 | ||
6dc07416 | 24 | _Float128 |
01f28812 | 25 | __getpayloadl (const _Float128 *x) |
f8e8b8ed JM |
26 | { |
27 | uint64_t hx, lx; | |
28 | GET_LDOUBLE_WORDS64 (hx, lx, *x); | |
29 | hx &= 0x7fffffffffffULL; | |
30 | /* Construct the representation of the return value directly, since | |
31 | 128-bit integers may not be available. */ | |
32 | int lz; | |
33 | if (hx == 0) | |
34 | { | |
35 | if (lx == 0) | |
36 | return 0.0L; | |
37 | else | |
38 | lz = __builtin_clzll (lx) + 64; | |
39 | } | |
40 | else | |
41 | lz = __builtin_clzll (hx); | |
42 | int shift = lz - 15; | |
43 | if (shift >= 64) | |
44 | { | |
45 | hx = lx << (shift - 64); | |
46 | lx = 0; | |
47 | } | |
48 | else | |
49 | { | |
50 | /* 2 <= SHIFT <= 63. */ | |
51 | hx = (hx << shift) | (lx >> (64 - shift)); | |
52 | lx <<= shift; | |
53 | } | |
54 | hx = (hx & 0xffffffffffffULL) | ((0x3fffULL + 127 - lz) << 48); | |
6dc07416 | 55 | _Float128 ret; |
f8e8b8ed JM |
56 | SET_LDOUBLE_WORDS64 (ret, hx, lx); |
57 | return ret; | |
58 | } | |
fd3b4e7c | 59 | libm_alias_ldouble (__getpayload, getpayload) |