]>
Commit | Line | Data |
---|---|---|
a5544970 | 1 | /* Copyright (C) 2007-2019 Free Software Foundation, Inc. |
200359e8 L |
2 | |
3 | This file is part of GCC. | |
4 | ||
5 | GCC is free software; you can redistribute it and/or modify it under | |
6 | the terms of the GNU General Public License as published by the Free | |
748086b7 | 7 | Software Foundation; either version 3, or (at your option) any later |
200359e8 L |
8 | version. |
9 | ||
200359e8 L |
10 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
11 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 | for more details. | |
14 | ||
748086b7 JJ |
15 | Under Section 7 of GPL version 3, you are granted additional |
16 | permissions described in the GCC Runtime Library Exception, version | |
17 | 3.1, as published by the Free Software Foundation. | |
18 | ||
19 | You should have received a copy of the GNU General Public License and | |
20 | a copy of the GCC Runtime Library Exception along with this program; | |
21 | see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
22 | <http://www.gnu.org/licenses/>. */ | |
200359e8 L |
23 | |
24 | #define BID_128RES | |
25 | #include "bid_internal.h" | |
26 | ||
b2a00c89 | 27 | BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(int, bid128_logb, x) |
200359e8 | 28 | |
b2a00c89 L |
29 | UINT128 CX; |
30 | UINT64 sign_x; | |
200359e8 L |
31 | SINT64 D; |
32 | int_float f64, fx; | |
33 | int exponent_x, bin_expon_cx, digits; | |
34 | ||
35 | if (!unpack_BID128_value (&sign_x, &exponent_x, &CX, x)) { | |
200359e8 | 36 | #ifdef SET_STATUS_FLAGS |
b2a00c89 | 37 | __set_status_flags (pfpsf, INVALID_EXCEPTION); |
200359e8 | 38 | #endif |
b2a00c89 | 39 | BID_RETURN_VAL (0x80000000); |
200359e8 L |
40 | } |
41 | // find number of digits in coefficient | |
42 | // 2^64 | |
43 | f64.i = 0x5f800000; | |
44 | // fx ~ CX | |
45 | fx.d = (float) CX.w[1] * f64.d + (float) CX.w[0]; | |
46 | bin_expon_cx = ((fx.i >> 23) & 0xff) - 0x7f; | |
b2a00c89 L |
47 | digits = estimate_decimal_digits[bin_expon_cx]; |
48 | // scale = 38-estimate_decimal_digits[bin_expon_cx]; | |
49 | D = CX.w[1] - power10_index_binexp_128[bin_expon_cx].w[1]; | |
50 | if (D > 0 || (!D && CX.w[0] >= power10_index_binexp_128[bin_expon_cx].w[0])) { | |
200359e8 | 51 | digits++; |
b2a00c89 | 52 | } |
200359e8 L |
53 | |
54 | exponent_x = exponent_x - DECIMAL_EXPONENT_BIAS_128 - 1 + digits; | |
55 | ||
b2a00c89 | 56 | BID_RETURN_VAL (exponent_x); |
200359e8 L |
57 | |
58 | } |