LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
inlines.h 文件参考
#include "../lmmpn.h"
#include "mparam.h"
+ inlines.h 的引用(Include)关系图:
+ 此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

宏定义

#define lmmp_leading_zeros_   __lmmp_leading_zeros_
 
#define lmmp_limb_bits_   __lmmp_limb_bits_
 
#define lmmp_limb_popcnt_   __lmmp_limb_popcnt_
 
#define lmmp_mul_n_   __lmmp_mul_n_
 
#define lmmp_mulh_   __lmmp_mulh_
 
#define lmmp_mullh_   __lmmp_mullh_
 
#define lmmp_sqr_   __lmmp_sqr_
 
#define lmmp_tailing_zeros_   __lmmp_tailing_zeros_
 

函数

static int __lmmp_leading_zeros_ (mp_limb_t x)
 
static int __lmmp_limb_bits_ (mp_limb_t x)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
static int __lmmp_limb_popcnt_ (mp_limb_t x)
 
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 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_tailing_zeros_ (mp_limb_t x)
 

宏定义说明

◆ lmmp_leading_zeros_

#define lmmp_leading_zeros_   __lmmp_leading_zeros_

在文件 inlines.h160 行定义.

◆ lmmp_limb_bits_

#define lmmp_limb_bits_   __lmmp_limb_bits_

在文件 inlines.h162 行定义.

◆ lmmp_limb_popcnt_

#define lmmp_limb_popcnt_   __lmmp_limb_popcnt_

在文件 inlines.h163 行定义.

◆ lmmp_mul_n_

#define lmmp_mul_n_   __lmmp_mul_n_

在文件 inlines.h167 行定义.

◆ lmmp_mulh_

#define lmmp_mulh_   __lmmp_mulh_

在文件 inlines.h165 行定义.

◆ lmmp_mullh_

#define lmmp_mullh_   __lmmp_mullh_

在文件 inlines.h164 行定义.

◆ lmmp_sqr_

#define lmmp_sqr_   __lmmp_sqr_

在文件 inlines.h166 行定义.

◆ lmmp_tailing_zeros_

#define lmmp_tailing_zeros_   __lmmp_tailing_zeros_

在文件 inlines.h161 行定义.

函数说明

◆ __lmmp_leading_zeros_()

static int __lmmp_leading_zeros_ ( mp_limb_t  x)
inlinestatic

在文件 inlines.h56 行定义.

56 {
57 if (x == 0) return 64;
58#ifdef __GNUC__
59 return __builtin_clzll(x);
60#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
61 unsigned long index;
62 _BitScanReverse64(&index, x);
63 return 63 - (int)index;
64#else
65 int n = 0;
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; }
72 return n;
73#endif
74}
#define n

引用了 n.

◆ __lmmp_limb_bits_()

static int __lmmp_limb_bits_ ( mp_limb_t  x)
inlinestatic

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 inlines.h26 行定义.

26 {
27 int k = 0;
28 while (x) {
29 x >>= 1;
30 k++;
31 }
32 return k;
33}
#define k

引用了 k.

◆ __lmmp_limb_popcnt_()

static int __lmmp_limb_popcnt_ ( mp_limb_t  x)
inlinestatic

在文件 inlines.h35 行定义.

35 {
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");
40#else
42#endif
43 return count;
44#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
45 return (int)__popcnt64(x);
46#else
47 int k = 0;
48 while (x) {
49 k += x & 1;
50 x >>= 1;
51 }
52 return k;
53#endif
54}
uint64_t mp_limb_t
Definition lmmp.h:76

引用了 k.

◆ __lmmp_mul_n_()

static void __lmmp_mul_n_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_srcptr restrict  numb,
mp_size_t  n 
)
inlinestatic

在文件 inlines.h134 行定义.

134 {
137 else if (n < MUL_TOOM33_THRESHOLD)
139 else if (n < MUL_TOOM44_THRESHOLD)
141 else if (n < MUL_FFT_THRESHOLD)
143 else
145}
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_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_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]
Definition mul_fft.c:1095
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
Definition mparam.h:54
#define MUL_TOOM22_THRESHOLD
Definition mparam.h:46
#define MUL_TOOM33_THRESHOLD
Definition mparam.h:50
#define MUL_TOOM44_THRESHOLD
Definition mparam.h:52
#define numb

引用了 lmmp_mul_basecase_(), lmmp_mul_fft_(), lmmp_mul_toom22_(), lmmp_mul_toom33_(), lmmp_mul_toom44_(), MUL_FFT_THRESHOLD, MUL_TOOM22_THRESHOLD, MUL_TOOM33_THRESHOLD, MUL_TOOM44_THRESHOLD, n , 以及 numb.

+ 函数调用图:

◆ __lmmp_mulh_()

static mp_limb_t __lmmp_mulh_ ( mp_limb_t  a,
mp_limb_t  b 
)
inlinestatic

在文件 inlines.h116 行定义.

116 {
117#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
119 return (mp_limb_t)(t >> 64);
120#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
121 return __umulh(a, b);
122#else
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;
128 r1 += r2;
129 r1 += (r0 >> 32);
130 return r3 + (r1 >> 32);
131#endif
132}
#define r2
#define r1
#define r3
#define r0
#define t

引用了 r0, r1, r2, r3 , 以及 t.

◆ __lmmp_mullh_()

static void __lmmp_mullh_ ( mp_limb_t  a,
mp_limb_t  b,
mp_ptr restrict  dst 
)
inlinestatic

在文件 inlines.h96 行定义.

96 {
97#if (defined(__GNUC__) || defined(__clang__)) && defined(__SIZEOF_INT128__)
99 dst[0] = (mp_limb_t)prod;
100 dst[1] = (mp_limb_t)(prod >> 64);
101#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
102 dst[0] = _umul128(a, b, dst + 1);
103#else
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;
109 r1 += r2;
110 r1 += (r0 >> 32);
111 dst[1] = r3 + (r1 >> 32);
112 dst[0] = (r1 << 32) | (uint32_t)r0;
113#endif
114}

引用了 r0, r1, r2 , 以及 r3.

◆ __lmmp_sqr_()

static void __lmmp_sqr_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  na 
)
inlinestatic

在文件 inlines.h147 行定义.

147 {
150 else if (na < MUL_TOOM33_THRESHOLD)
152 else if (na < MUL_TOOM44_THRESHOLD)
154 else if (na < MUL_FFT_THRESHOLD)
156 else
158}
void lmmp_sqr_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
基础平方运算 [dst,2*na] = [numa,na]^2
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

引用了 lmmp_mul_fft_(), lmmp_sqr_basecase_(), lmmp_sqr_toom2_(), lmmp_sqr_toom3_(), lmmp_sqr_toom4_(), MUL_FFT_THRESHOLD, MUL_TOOM22_THRESHOLD, MUL_TOOM33_THRESHOLD , 以及 MUL_TOOM44_THRESHOLD.

+ 函数调用图:

◆ __lmmp_tailing_zeros_()

static int __lmmp_tailing_zeros_ ( mp_limb_t  x)
inlinestatic

在文件 inlines.h76 行定义.

76 {
77 if (x == 0) return 64;
78#ifdef __GNUC__
79 return __builtin_ctzll(x);
80#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
81 unsigned long index;
82 _BitScanForward64(&index, x);
83 return (int)index;
84#else
85 int n = 0;
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; }
92 return n;
93#endif
94}

引用了 n.