16 inline uint128_t MultiplyUInt64(uint64_t x, uint64_t y) {
17 return uint128_t(x) * uint128_t(y);
20 inline uint64_t BarrettReduce128(uint64_t input_hi, uint64_t input_lo,
23 uint128_t n = (static_cast<uint128_t>(input_hi) << 64) |
24 (static_cast<uint128_t>(input_lo));
31 inline uint64_t DivideUInt128UInt64Lo(uint64_t x1, uint64_t x0, uint64_t y) {
33 (
static_cast<uint128_t
>(x1) << 64) | (
static_cast<uint128_t
>(x0));
36 return static_cast<uint64_t
>(q);
42 inline void MultiplyUInt64(uint64_t x, uint64_t y, uint64_t* prod_hi,
44 uint128_t prod = MultiplyUInt64(x, y);
45 *prod_hi =
static_cast<uint64_t
>(prod >> 64);
46 *prod_lo =
static_cast<uint64_t
>(prod);
50 template <
int BitShift>
51 inline uint64_t MultiplyUInt64Hi(uint64_t x, uint64_t y) {
52 uint128_t product =
static_cast<uint128_t
>(x) * y;
53 return static_cast<uint64_t
>(product >> BitShift);
57 inline uint64_t MSB(uint64_t input) {
58 return static_cast<uint64_t
>(std::log2l(input));
61 #define HEXL_LOOP_UNROLL_4 _Pragma("clang loop unroll_count(4)") 62 #define HEXL_LOOP_UNROLL_8 _Pragma("clang loop unroll_count(8)")
#define HEXL_CHECK(cond, expr)
Definition: check.hpp:39
Definition: eltwise-add-mod.hpp:8