]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libgcc/config/libbid/bid128_logb.c
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / libbid / bid128_logb.c
index 38e22ae1782def0268ae04c178b24023630f91cf..0c02fde9cf5b5635cdb3f26089f747eb92e8145b 100644 (file)
@@ -1,61 +1,42 @@
-/* Copyright (C) 2007  Free Software Foundation, Inc.
+/* Copyright (C) 2007-2024 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
-In addition to the permissions in the GNU General Public License, the
-Free Software Foundation gives you unlimited permission to link the
-compiled version of this file into combinations with other programs,
-and to distribute those combinations without any restriction coming
-from the use of this file.  (The General Public License restrictions
-do apply in other respects; for example, they cover modification of
-the file, and distribution when not linked into a combine
-executable.)
-
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or
 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
 
 #define BID_128RES
 #include "bid_internal.h"
 
-BID128_FUNCTION_ARG1(__bid128_logb, x)
+BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE(int, bid128_logb, x)
 
-  UINT128 CX, L, res;
-  UINT64 sign_x, sign_e, logb_sign;
+  UINT128 CX;
+  UINT64 sign_x;
   SINT64 D;
   int_float f64, fx;
   int exponent_x, bin_expon_cx, digits;
 
   if (!unpack_BID128_value (&sign_x, &exponent_x, &CX, x)) {
-    res.w[1] = x.w[1];
-    res.w[0] = x.w[0];
-    // x is Infinity?
-    if ((x.w[1] & 0x7800000000000000ull) == 0x7800000000000000ull) {
-      if ((x.w[1] & 0x7c00000000000000ull) != 0x7c00000000000000ull)
-        // +/-Inf, return Inf
-        res.w[1] = 0x7800000000000000ull;
-      BID_RETURN (res);
-    }
-    // x is 0 otherwise
-
 #ifdef SET_STATUS_FLAGS
-    // set status flags
-    __set_status_flags (pfpsf, ZERO_DIVIDE_EXCEPTION);
+      __set_status_flags (pfpsf, INVALID_EXCEPTION);
 #endif
-    res.w[1] = 0xf800000000000000ull;
-    res.w[0] = 0;
-    BID_RETURN (res);
+    BID_RETURN_VAL (0x80000000);
   }
   // find number of digits in coefficient
   // 2^64
@@ -63,24 +44,15 @@ BID128_FUNCTION_ARG1(__bid128_logb, x)
   // fx ~ CX
   fx.d = (float) CX.w[1] * f64.d + (float) CX.w[0];
   bin_expon_cx = ((fx.i >> 23) & 0xff) - 0x7f;
-  digits = __bid_estimate_decimal_digits[bin_expon_cx];
-  // scale = 38-__bid_estimate_decimal_digits[bin_expon_cx];
-  D = CX.w[1] - __bid_power10_index_binexp_128[bin_expon_cx].w[1];
-  if (D > 0
-      || (!D && CX.w[0] >= __bid_power10_index_binexp_128[bin_expon_cx].w[0]))
+  digits = estimate_decimal_digits[bin_expon_cx];
+  // scale = 38-estimate_decimal_digits[bin_expon_cx];
+  D = CX.w[1] - power10_index_binexp_128[bin_expon_cx].w[1];
+  if (D > 0 || (!D && CX.w[0] >= power10_index_binexp_128[bin_expon_cx].w[0])) {
     digits++;
+  }
 
   exponent_x = exponent_x - DECIMAL_EXPONENT_BIAS_128 - 1 + digits;
 
-  // extract sign and absolute value from exponent_x
-  sign_e = ((SINT32) exponent_x) >> 31;
-  exponent_x = (exponent_x + sign_e) ^ sign_e;
-
-  L.w[0] = exponent_x;
-  L.w[1] = 0;
-  logb_sign = sign_e << 63;
-
-  get_BID128_very_fast (&res, logb_sign, DECIMAL_EXPONENT_BIAS_128, L);
-  BID_RETURN (res);
+  BID_RETURN_VAL (exponent_x);
 
 }