Hacker News new | ask | show | jobs
by deanmen 1185 days ago

    uint64_t lemur64(void) {
      static uint64_t a = 2131259787901769494ull;
      uint64_t b = 15750249268501108917ull;

      uint64_t a_lo = a & 0x00000000ffffffffull;
      uint64_t a_hi = a >> 32;
      uint64_t b_lo = b & 0x00000000ffffffffull;
      uint64_t b_hi = b >> 32;

      uint64_t a_x_b_hi = a_hi * b_hi;
      uint64_t a_x_b_mid = a_hi * b_lo;
      uint64_t b_x_a_mid = b_hi * a_lo;
      uint64_t a_x_b_lo = a_lo * b_lo;

      uint64_t carry_bit = ((0x00000000ffffffffull & a_x_b_mid) +
                        (0x00000000ffffffffull & b_x_a_mid) + (a_x_b_lo >> 32)) >>
                       32;

      uint64_t multhi =
      a_x_b_hi + (a_x_b_mid >> 32) + (b_x_a_mid >> 32) + carry_bit;

      return a = multhi;
    }