https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97311

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Or something like:

      auto __b = [__begin, __n](size_t __i) -> _Type& {
          return __begin[__i % __n];
      };
      auto __b32 = [__b](size_t __i) { return (uint32_t)__b(__i); };

      for (size_t __k = 0; __k < __m; ++__k)
        {
          uint32_t __arg = (__b32(__k) ^ __b32(__k + __p) ^ __b32(__k - 1));
          uint32_t __r1 = 1664525u * (__arg ^ (__arg >> 27));
          uint32_t __r2 = __r1;
          if (__k == 0)
            __r2 += __s;
          else if (__k <= __s)
            __r2 += __k % __n + _M_v[__k - 1];
          else
            __r2 += __k % __n;
          __b(__k + __p) = __b32(__k + __p) +  __r1;
          __b(__k + __q) = __b32(__k + __q) + __r2;
          __b(__k) = __r2;
        }

      for (size_t __k = __m; __k < __m + __n; ++__k)
        {
          uint32_t __arg = (__b32(__k) + __b32(__k + __p) + __b32(__k - 1));
          uint32_t __r3 = (uint32_t)1566083941u * (__arg ^ (__arg >> 27));
          uint32_t __r4 = __r3 - __k % __n;
          __b(__k + __p) ^= __r3;
          __b(__k + __q) ^= __r4;
          __b(__k) = __r4;
        }

The current code will work even if the implementation only provides
uint_least32_t and not uint32_t, but I don't think we support any targets
without uint32_t. So it could be a lot simpler.

Reply via email to