This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2.1] Use saturated arithmetic for overflow detection.


On 12/03/2013 09:53 AM, Joseph S. Myers wrote:
> Even for the normal case where one argument is constant?

I suppose you're right, it may be better to do that case inline.
Something like this, say:

#define HAVE___INT128 1  /* This should be configured.  */

/* An unsigned integer type that is at least twice the width of size_t.  */
#if SIZE_MAX >> 31 <= 1
# define double_size_t unsigned long long
#elif SIZE_MAX >> 31 >> 31 >> 1 <= 1 && HAVE___INT128
# define double_size_t unsigned __int128
#endif

static inline __attribute__((always_inline, unused)) size_t
mul_s (size_t x, size_t y)
{
  if (! __builtin_constant_p (y))
    {
      if (__builtin_constant_p (x))
        return mul_s (y, x);
      else
        {
#ifdef double_size_t
          double_size_t y1 = y;
          double_size_t product = x * y1;
          if (__glibc_unlikely (SIZE_MAX < product))
            return SIZE_MAX;
          return product;
#endif
        }
    }
  if (y == 0)
    return 0;
  if (__glibc_unlikely (SIZE_MAX / y < x))
    return SIZE_MAX;
  return x * y;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]