changeset 25840:31af3806a230

maint: Merge stable to default.
author John W. Eaton <jwe@octave.org>
date Wed, 29 Aug 2018 15:16:05 -0400
parents 0da1b45c23f2 (current diff) 7094f73d4ece (diff)
children e9910742d968
files liboctave/util/oct-inttypes.h test/module.mk
diffstat 1 files changed, 16 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/util/oct-inttypes.h	Wed Aug 29 09:52:43 2018 -0700
+++ b/liboctave/util/oct-inttypes.h	Wed Aug 29 15:16:05 2018 -0400
@@ -534,11 +534,7 @@
   static T
   __signbit (T x)
   {
-#if defined (OCTAVE_HAVE_FAST_INT_OPS)
-    return static_cast<UT> (x) >> std::numeric_limits<T>::digits;
-#else
     return (x < 0) ? 1 : 0;
-#endif
   }
 
   static T
@@ -617,40 +613,42 @@
   add (T x, T y)
   {
 #if defined (OCTAVE_HAVE_FAST_INT_OPS)
+
     // The typecasts do nothing, but they are here to prevent an optimizing
     // compiler from interfering.  Also, the signed operations on small types
     // actually return int.
     T u = static_cast<UT> (x) + static_cast<UT> (y);
     T ux = u ^ x;
     T uy = u ^ y;
-    if ((ux & uy) < 0)
-      {
-        u = octave_int_base<T>::max_val () + __signbit (~u);
-      }
-    return u;
+
+    return ((ux & uy) < 0
+            ? (u < 0
+               ? octave_int_base<T>::max_val ()
+               : octave_int_base<T>::min_val ())
+            : u);
+
 #else
+
     // We shall carefully avoid anything that may overflow.
     T u;
+
     if (y < 0)
       {
         if (x < octave_int_base<T>::min_val () - y)
-          {
-            u = octave_int_base<T>::min_val ();
-          }
+          u = octave_int_base<T>::min_val ();
         else
           u = x + y;
       }
     else
       {
         if (x > octave_int_base<T>::max_val () - y)
-          {
-            u = octave_int_base<T>::max_val ();
-          }
+          u = octave_int_base<T>::max_val ();
         else
           u = x + y;
       }
 
     return u;
+
 #endif
   }
 
@@ -667,7 +665,9 @@
     T uy = u ^ ~y;
     if ((ux & uy) < 0)
       {
-        u = octave_int_base<T>::max_val () + __signbit (~u);
+        u = (__signbit (~u)
+             ? octave_int_base<T>::min_val ()
+             : octave_int_base<T>::max_val ());
       }
     return u;
 #else