]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/config/libbid/bid128_logb.c
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / libbid / bid128_logb.c
CommitLineData
a5544970 1/* Copyright (C) 2007-2019 Free Software Foundation, Inc.
200359e8
L
2
3This file is part of GCC.
4
5GCC is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free
748086b7 7Software Foundation; either version 3, or (at your option) any later
200359e8
L
8version.
9
200359e8
L
10GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or
12FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13for more details.
14
748086b7
JJ
15Under Section 7 of GPL version 3, you are granted additional
16permissions described in the GCC Runtime Library Exception, version
173.1, as published by the Free Software Foundation.
18
19You should have received a copy of the GNU General Public License and
20a copy of the GCC Runtime Library Exception along with this program;
21see 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 27BID128_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}