16#include "../../../../include/lammp/impl/longlong.h"
17#include "../../../../include/lammp/lmmpn.h"
18#include "../../../../include/lammp/numth.h"
31#if defined(__GNUC__) || defined(__clang__)
33#if defined(__x86_64__) && defined(USE_ASM)
34 __asm__ volatile(
"popcnt %1, %0" :
"=r"(
count) :
"r"(
x) :
"cc");
39#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
52 if (
x == 0)
return 64;
55#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
58 return 63 - (int)index;
61 if (
x <= 0x00000000FFFFFFFF) {
n += 32;
x <<= 32; }
62 if (
x <= 0x0000FFFFFFFFFFFF) {
n += 16;
x <<= 16; }
63 if (
x <= 0x00FFFFFFFFFFFFFF) {
n += 8;
x <<= 8; }
64 if (
x <= 0x0FFFFFFFFFFFFFFF) {
n += 4;
x <<= 4; }
65 if (
x <= 0x3FFFFFFFFFFFFFFF) {
n += 2;
x <<= 2; }
66 if (
x <= 0x7FFFFFFFFFFFFFFF) {
n += 1;
x <<= 1; }
72 if (
x == 0)
return 64;
75#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
81 if ((
x & 0x00000000FFFFFFFF) == 0) {
n += 32;
x >>= 32; }
82 if ((
x & 0x000000000000FFFF) == 0) {
n += 16;
x >>= 16; }
83 if ((
x & 0x00000000000000FF) == 0) {
n += 8;
x >>= 8; }
84 if ((
x & 0x000000000000000F) == 0) {
n += 4;
x >>= 4; }
85 if ((
x & 0x0000000000000003) == 0) {
n += 2;
x >>= 2; }
86 if ((
x & 0x0000000000000001) == 0) {
n += 1;
x >>= 1; }
92#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
95#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
98 uint64_t
ah =
a >> 32,
bh =
b >> 32;
99 a = (uint32_t)
a,
b = (uint32_t)
b;
101 r3 += (
r1 >> 32) + (
r2 >> 32);
102 r1 = (uint32_t)
r1,
r2 = (uint32_t)
r2;
105 return r3 + (
r1 >> 32);
110#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
114#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
117 uint64_t
ah =
a >> 32,
bh =
b >> 32;
118 a = (uint32_t)
a,
b = (uint32_t)
b;
120 r3 += (
r1 >> 32) + (
r2 >> 32);
121 r1 = (uint32_t)
r1,
r2 = (uint32_t)
r2;
125 dst[0] = (
r1 << 32) | (uint32_t)
r0;
#define lmmp_leading_zeros_
#define lmmp_limb_popcnt_
#define lmmp_tailing_zeros_
mp_limb_t lmmp_inv_1_(mp_limb_t x)
1阶逆元计算 (inv1)
static void _umul64to128_(uint64_t a, uint64_t b, uint64_t *low, uint64_t *high)
#define _u128lshl(x, y, n)
#define _udiv_qrnnd_preinv(q, r, nh, nl, d, di)
ulong lmmp_mulmod_ulong_(ulong a, ulong b, ulong mod, ulongp restrict q)