16#ifndef __LAMMP_INLINES_H__
17#define __LAMMP_INLINES_H__
36#if defined(__GNUC__) || defined(__clang__)
38#if defined(__x86_64__) && defined(USE_ASM)
39 __asm__
volatile(
"popcnt %1, %0" :
"=r"(count) :
"r"(x) :
"cc");
41 count = __builtin_popcountll(x);
44#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
45 return (
int)__popcnt64(x);
57 if (x == 0)
return 64;
59 return __builtin_clzll(x);
60#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
62 _BitScanReverse64(&index, x);
63 return 63 - (int)index;
66 if (x <= 0x00000000FFFFFFFF) {
n += 32; x <<= 32; }
67 if (x <= 0x0000FFFFFFFFFFFF) {
n += 16; x <<= 16; }
68 if (x <= 0x00FFFFFFFFFFFFFF) {
n += 8; x <<= 8; }
69 if (x <= 0x0FFFFFFFFFFFFFFF) {
n += 4; x <<= 4; }
70 if (x <= 0x3FFFFFFFFFFFFFFF) {
n += 2; x <<= 2; }
71 if (x <= 0x7FFFFFFFFFFFFFFF) {
n += 1; x <<= 1; }
77 if (x == 0)
return 64;
79 return __builtin_ctzll(x);
80#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
82 _BitScanForward64(&index, x);
86 if ((x & 0x00000000FFFFFFFF) == 0) {
n += 32; x >>= 32; }
87 if ((x & 0x000000000000FFFF) == 0) {
n += 16; x >>= 16; }
88 if ((x & 0x00000000000000FF) == 0) {
n += 8; x >>= 8; }
89 if ((x & 0x000000000000000F) == 0) {
n += 4; x >>= 4; }
90 if ((x & 0x0000000000000003) == 0) {
n += 2; x >>= 2; }
91 if ((x & 0x0000000000000001) == 0) {
n += 1; x >>= 1; }
97#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
98 __uint128_t prod = (__uint128_t)a * b;
101#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
102 dst[0] = _umul128(a, b, dst + 1);
104 uint64_t ah = a >> 32, bh = b >> 32;
105 a = (uint32_t)a, b = (uint32_t)b;
106 uint64_t
r0 = a * b,
r1 = a * bh,
r2 = ah * b,
r3 = ah * bh;
107 r3 += (
r1 >> 32) + (
r2 >> 32);
108 r1 = (uint32_t)
r1,
r2 = (uint32_t)
r2;
111 dst[1] =
r3 + (
r1 >> 32);
112 dst[0] = (
r1 << 32) | (uint32_t)
r0;
117#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
118 __uint128_t
t = (__uint128_t)a * (__uint128_t)b;
120#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
121 return __umulh(a, b);
123 uint64_t ah = a >> 32, bh = b >> 32;
124 a = (uint32_t)a, b = (uint32_t)b;
125 uint64_t
r0 = a * b,
r1 = a * bh,
r2 = ah * b,
r3 = ah * bh;
126 r3 += (
r1 >> 32) + (
r2 >> 32);
127 r1 = (uint32_t)
r1,
r2 = (uint32_t)
r2;
130 return r3 + (
r1 >> 32);
160#define lmmp_leading_zeros_ __lmmp_leading_zeros_
161#define lmmp_tailing_zeros_ __lmmp_tailing_zeros_
162#define lmmp_limb_bits_ __lmmp_limb_bits_
163#define lmmp_limb_popcnt_ __lmmp_limb_popcnt_
164#define lmmp_mullh_ __lmmp_mullh_
165#define lmmp_mulh_ __lmmp_mulh_
166#define lmmp_sqr_ __lmmp_sqr_
167#define lmmp_mul_n_ __lmmp_mul_n_
static int __lmmp_limb_bits_(mp_limb_t x)
Copyright (C) 2026 HJimmyK(Jericho Knox)
static void __lmmp_mul_n_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_srcptr restrict numb, mp_size_t n)
static mp_limb_t __lmmp_mulh_(mp_limb_t a, mp_limb_t b)
static int __lmmp_tailing_zeros_(mp_limb_t x)
static int __lmmp_limb_popcnt_(mp_limb_t x)
static void __lmmp_mullh_(mp_limb_t a, mp_limb_t b, mp_ptr restrict dst)
static void __lmmp_sqr_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na)
static int __lmmp_leading_zeros_(mp_limb_t x)
const mp_limb_t * mp_srcptr
void lmmp_mul_toom22_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-22乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom44_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-44乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_sqr_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
基础平方运算 [dst,2*na] = [numa,na]^2
void lmmp_mul_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
基础乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_sqr_toom2_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
Toom-2平方运算 [dst,2*na] = [numa,na]^2
void lmmp_sqr_toom3_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
Toom-3平方运算 [dst,2*na] = [numa,na]^2
void lmmp_sqr_toom4_(mp_ptr pp, mp_srcptr ap, mp_size_t an)
Toom-4平方运算 [dst,2*na] = [numa,na]^2
void lmmp_mul_fft_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
FFT乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom33_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-33乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
#define MUL_FFT_THRESHOLD
#define MUL_TOOM22_THRESHOLD
#define MUL_TOOM33_THRESHOLD
#define MUL_TOOM44_THRESHOLD