LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mul_1.c 文件参考
+ mul_1.c 的引用(Include)关系图:

浏览源代码.

函数

mp_limb_t lmmp_addmul_1_ (mp_ptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_limb_t b)
 
mp_limb_t lmmp_mul_1_ (mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_limb_t x)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
void lmmp_mullo_basecase_ (mp_ptr restrict dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
 
mp_limb_t lmmp_submul_1_ (mp_ptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_limb_t b)
 

函数说明

◆ lmmp_addmul_1_()

mp_limb_t lmmp_addmul_1_ ( mp_ptr restrict  numa,
mp_srcptr restrict  numb,
mp_size_t  n,
mp_limb_t  b 
)

在文件 mul_1.c106 行定义.

106 {
107 mp_limb_t cl = 0;
108 mp_size_t i = 0;
109
115
116 if (numa == numb) {
117 for (; i + 4 <= n; i += 4) {
118 ul0 = numa[i + 0];
119 ul1 = numa[i + 1];
120 ul2 = numa[i + 2];
121 ul3 = numa[i + 3];
122
124 lpl0 += cl;
125 cl = (lpl0 < cl) + hpl0;
126 lpl0 = ul0 + lpl0;
127 cl += (lpl0 < ul0);
128
130 lpl1 += cl;
131 cl = (lpl1 < cl) + hpl1;
132 lpl1 = ul1 + lpl1;
133 cl += (lpl1 < ul1);
134
136 lpl2 += cl;
137 cl = (lpl2 < cl) + hpl2;
138 lpl2 = ul2 + lpl2;
139 cl += (lpl2 < ul2);
140
142 lpl3 += cl;
143 cl = (lpl3 < cl) + hpl3;
144 lpl3 = ul3 + lpl3;
145 cl += (lpl3 < ul3);
146
147 numa[i + 0] = lpl0;
148 numa[i + 1] = lpl1;
149 numa[i + 2] = lpl2;
150 numa[i + 3] = lpl3;
151 }
152 for (; i < n; i++) {
153 ul0 = numa[i];
155 lpl0 += cl;
156 cl = (lpl0 < cl) + hpl0;
157 lpl0 = ul0 + lpl0;
158 cl += (lpl0 < ul0);
159 numa[i] = lpl0;
160 }
161 } else {
162 /* seq(numa,numb) */
163 for (; i + 4 <= n; i += 4) {
164 ul0 = numb[i + 0];
165 ul1 = numb[i + 1];
166 ul2 = numb[i + 2];
167 ul3 = numb[i + 3];
168 rl0 = numa[i + 0];
169 rl1 = numa[i + 1];
170 rl2 = numa[i + 2];
171 rl3 = numa[i + 3];
172
174 lpl0 += cl;
175 cl = (lpl0 < cl) + hpl0;
176 lpl0 = rl0 + lpl0;
177 cl += (lpl0 < rl0);
178
180 lpl1 += cl;
181 cl = (lpl1 < cl) + hpl1;
182 lpl1 = rl1 + lpl1;
183 cl += (lpl1 < rl1);
184
186 lpl2 += cl;
187 cl = (lpl2 < cl) + hpl2;
188 lpl2 = rl2 + lpl2;
189 cl += (lpl2 < rl2);
190
192 lpl3 += cl;
193 cl = (lpl3 < cl) + hpl3;
194 lpl3 = rl3 + lpl3;
195 cl += (lpl3 < rl3);
196
197 numa[i + 0] = lpl0;
198 numa[i + 1] = lpl1;
199 numa[i + 2] = lpl2;
200 numa[i + 3] = lpl3;
201 }
202 for (; i < n; i++) {
203 ul0 = numb[i];
204 rl0 = numa[i];
206 lpl0 += cl;
207 cl = (lpl0 < cl) + hpl0;
208 lpl0 = rl0 + lpl0;
209 cl += (lpl0 < rl0);
210 numa[i] = lpl0;
211 }
212 }
213 return cl;
214}
uint64_t mp_size_t
Definition lmmp.h:114
uint64_t mp_limb_t
Definition lmmp.h:113
static void _umul64to128_(uint64_t a, uint64_t b, uint64_t *low, uint64_t *high)
Definition longlong.h:174
#define numb
#define n

引用了 _umul64to128_(), n , 以及 numb.

被这些函数引用 lmmp_mullo_basecase_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_mul_1_()

mp_limb_t lmmp_mul_1_ ( mp_ptr restrict  dst,
mp_srcptr restrict  numa,
mp_size_t  na,
mp_limb_t  x 
)

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/.

在文件 mul_1.c20 行定义.

20 {
21 mp_limb_t cl = 0;
22 mp_size_t i = 0;
23
27
28 if (dst == numa) {
29 for (; i + 4 <= na; i += 4) {
30 ul0 = dst[i + 0];
31 ul1 = dst[i + 1];
32 ul2 = dst[i + 2];
33 ul3 = dst[i + 3];
34
36 lpl0 += cl;
37 cl = (lpl0 < cl) + hpl0;
38
40 lpl1 += cl;
41 cl = (lpl1 < cl) + hpl1;
42
44 lpl2 += cl;
45 cl = (lpl2 < cl) + hpl2;
46
48 lpl3 += cl;
49 cl = (lpl3 < cl) + hpl3;
50
51 dst[i + 0] = lpl0;
52 dst[i + 1] = lpl1;
53 dst[i + 2] = lpl2;
54 dst[i + 3] = lpl3;
55 }
56
57 for (; i < na; i++) {
58 ul0 = dst[i];
60 lpl0 += cl;
61 cl = (lpl0 < cl) + hpl0;
62 dst[i] = lpl0;
63 }
64 } else {
65 /* seq(dst,numa) */
66 for (; i + 4 <= na; i += 4) {
67 ul0 = numa[i + 0];
68 ul1 = numa[i + 1];
69 ul2 = numa[i + 2];
70 ul3 = numa[i + 3];
71
73 lpl0 += cl;
74 cl = (lpl0 < cl) + hpl0;
75
77 lpl1 += cl;
78 cl = (lpl1 < cl) + hpl1;
79
81 lpl2 += cl;
82 cl = (lpl2 < cl) + hpl2;
83
85 lpl3 += cl;
86 cl = (lpl3 < cl) + hpl3;
87
88 dst[i + 0] = lpl0;
89 dst[i + 1] = lpl1;
90 dst[i + 2] = lpl2;
91 dst[i + 3] = lpl3;
92 }
93
94 for (; i < na; i++) {
95 ul0 = numa[i];
97 lpl0 += cl;
98 cl = (lpl0 < cl) + hpl0;
99 dst[i] = lpl0;
100 }
101 }
102
103 return cl;
104}

引用了 _umul64to128_() , 以及 n.

被这些函数引用 lmmp_mullo_basecase_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_mullo_basecase_()

void lmmp_mullo_basecase_ ( mp_ptr restrict  dst,
mp_srcptr  numa,
mp_srcptr  numb,
mp_size_t  n 
)

在文件 mul_1.c326 行定义.

326 {
327 mp_limb_t h;
328 h = numa[0] * numb[n - 1];
329 if (n != 1) {
330 mp_size_t i;
332
333 b0 = *numb++;
334 h += numa[n - 1] * b0 + lmmp_mul_1_(dst, numa, n - 1, b0);
335 dst++;
336
337 for (i = n - 2; i > 0; i--) {
338 b0 = *numb++;
339 h += numa[i] * b0 + lmmp_addmul_1_(dst, numa, i, b0);
340 dst++;
341 }
342 }
343
344 dst[0] = h;
345}
mp_limb_t lmmp_addmul_1_(mp_ptr restrict numa, mp_srcptr restrict numb, mp_size_t n, mp_limb_t b)
Definition mul_1.c:106
mp_limb_t lmmp_mul_1_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_limb_t x)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition mul_1.c:20
#define b0

引用了 b0, lmmp_addmul_1_(), lmmp_mul_1_(), n , 以及 numb.

+ 函数调用图:

◆ lmmp_submul_1_()

mp_limb_t lmmp_submul_1_ ( mp_ptr restrict  numa,
mp_srcptr restrict  numb,
mp_size_t  n,
mp_limb_t  b 
)

在文件 mul_1.c216 行定义.

216 {
217 mp_limb_t cl = 0;
218 mp_size_t i = 0;
219
225
226 if (numa == numb) {
227 for (; i + 4 <= n; i += 4) {
228 ul0 = numa[i + 0];
229 ul1 = numa[i + 1];
230 ul2 = numa[i + 2];
231 ul3 = numa[i + 3];
232
234 lpl0 += cl;
235 cl = (lpl0 < cl) + hpl0;
236 lpl0 = ul0 - lpl0;
237 cl += (lpl0 > ul0);
238
240 lpl1 += cl;
241 cl = (lpl1 < cl) + hpl1;
242 lpl1 = ul1 - lpl1;
243 cl += (lpl1 > ul1);
244
246 lpl2 += cl;
247 cl = (lpl2 < cl) + hpl2;
248 lpl2 = ul2 - lpl2;
249 cl += (lpl2 > ul2);
250
252 lpl3 += cl;
253 cl = (lpl3 < cl) + hpl3;
254 lpl3 = ul3 - lpl3;
255 cl += (lpl3 > ul3);
256
257 numa[i + 0] = lpl0;
258 numa[i + 1] = lpl1;
259 numa[i + 2] = lpl2;
260 numa[i + 3] = lpl3;
261 }
262 for (; i < n; i++) {
263 ul0 = numa[i];
265 lpl0 += cl;
266 cl = (lpl0 < cl) + hpl0;
267 lpl0 = ul0 - lpl0;
268 cl += (lpl0 > ul0);
269 numa[i] = lpl0;
270 }
271 } else {
272 /* seq(numa,numb) */
273 for (; i + 4 <= n; i += 4) {
274 ul0 = numb[i + 0];
275 ul1 = numb[i + 1];
276 ul2 = numb[i + 2];
277 ul3 = numb[i + 3];
278 rl0 = numa[i + 0];
279 rl1 = numa[i + 1];
280 rl2 = numa[i + 2];
281 rl3 = numa[i + 3];
282
284 lpl0 += cl;
285 cl = (lpl0 < cl) + hpl0;
286 lpl0 = rl0 - lpl0;
287 cl += (lpl0 > rl0);
288
290 lpl1 += cl;
291 cl = (lpl1 < cl) + hpl1;
292 lpl1 = rl1 - lpl1;
293 cl += (lpl1 > rl1);
294
296 lpl2 += cl;
297 cl = (lpl2 < cl) + hpl2;
298 lpl2 = rl2 - lpl2;
299 cl += (lpl2 > rl2);
300
302 lpl3 += cl;
303 cl = (lpl3 < cl) + hpl3;
304 lpl3 = rl3 - lpl3;
305 cl += (lpl3 > rl3);
306
307 numa[i + 0] = lpl0;
308 numa[i + 1] = lpl1;
309 numa[i + 2] = lpl2;
310 numa[i + 3] = lpl3;
311 }
312 for (; i < n; i++) {
313 ul0 = numb[i];
314 rl0 = numa[i];
316 lpl0 += cl;
317 cl = (lpl0 < cl) + hpl0;
318 lpl0 = rl0 - lpl0;
319 cl += (lpl0 > rl0);
320 numa[i] = lpl0;
321 }
322 }
323 return cl;
324}

引用了 _umul64to128_(), n , 以及 numb.

+ 函数调用图: