1#ifndef SECP256K1_INT128_STRUCT_IMPL_H
2#define SECP256K1_INT128_STRUCT_IMPL_H
6#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
8# if defined(_M_ARM64) || defined(SECP256K1_MSVC_MULH_TEST_OVERRIDE)
12# if defined(SECP256K1_MSVC_MULH_TEST_OVERRIDE)
13# pragma message(__FILE__ ": SECP256K1_MSVC_MULH_TEST_OVERRIDE is defined, forcing use of __(u)mulh.")
26# define secp256k1_umul128 _umul128
27# define secp256k1_mul128 _mul128
37 *hi = hh + (lh >> 32) + (hl >> 32) + (mid34 >> 32);
47 *hi = hh + (lh >> 32) + (hl >> 32) + (mid34 >> 32);
58 r->
lo = secp256k1_umul128(
a, b, &r->
hi);
63 lo = secp256k1_umul128(
a, b, &hi);
65 r->
hi += hi + (r->
lo < lo);
79 r->
lo = r->
hi >> (n-64);
82 r->
lo = ((1U * r->
hi) << (64-n)) | r->
lo >> n;
102 return n >= 64 ? r->
hi >> (n - 64) == 0
103 : r->hi == 0 && r->lo >> n == 0;
113 r->lo = (
uint64_t)secp256k1_mul128(
a, b, &hi);
155 secp256k1_i128_mul(r,
a, d);
156 secp256k1_i128_dissip_mul(r, b, c);
168 r->lo = ((1U * r->hi) << (64-n)) | r->lo >> n;
180 return (
int64_t)secp256k1_i128_to_u64(
a);
189 return a->hi == b->hi &&
a->lo == b->lo;
194 return n >= 64 ? r->hi == (
uint64_t)1 << (n - 64) && r->lo == 0
195 : r->hi == 0 && r->lo == (
uint64_t)1 << n;
#define VERIFY_CHECK(cond)
int128_t secp256k1_int128
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
unsigned __int64 uint64_t