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)
 
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.c107 行定义.

107 {
108 mp_limb_t cl = 0;
109 mp_size_t i = 0;
110
116
117 if (numa == numb) {
118 for (; i + 4 <= n; i += 4) {
119 ul0 = numa[i + 0];
120 ul1 = numa[i + 1];
121 ul2 = numa[i + 2];
122 ul3 = numa[i + 3];
123
125 lpl0 += cl;
126 cl = (lpl0 < cl) + hpl0;
127 lpl0 = ul0 + lpl0;
128 cl += (lpl0 < ul0);
129
131 lpl1 += cl;
132 cl = (lpl1 < cl) + hpl1;
133 lpl1 = ul1 + lpl1;
134 cl += (lpl1 < ul1);
135
137 lpl2 += cl;
138 cl = (lpl2 < cl) + hpl2;
139 lpl2 = ul2 + lpl2;
140 cl += (lpl2 < ul2);
141
143 lpl3 += cl;
144 cl = (lpl3 < cl) + hpl3;
145 lpl3 = ul3 + lpl3;
146 cl += (lpl3 < ul3);
147
148 numa[i + 0] = lpl0;
149 numa[i + 1] = lpl1;
150 numa[i + 2] = lpl2;
151 numa[i + 3] = lpl3;
152 }
153 for (; i < n; i++) {
154 ul0 = numa[i];
156 lpl0 += cl;
157 cl = (lpl0 < cl) + hpl0;
158 lpl0 = ul0 + lpl0;
159 cl += (lpl0 < ul0);
160 numa[i] = lpl0;
161 }
162 } else {
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:77
uint64_t mp_limb_t
Definition lmmp.h:76
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_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 }
65
66 else {
67 for (; i + 4 <= na; i += 4) {
68 ul0 = numa[i + 0];
69 ul1 = numa[i + 1];
70 ul2 = numa[i + 2];
71 ul3 = numa[i + 3];
72
74 lpl0 += cl;
75 cl = (lpl0 < cl) + hpl0;
76
78 lpl1 += cl;
79 cl = (lpl1 < cl) + hpl1;
80
82 lpl2 += cl;
83 cl = (lpl2 < cl) + hpl2;
84
86 lpl3 += cl;
87 cl = (lpl3 < cl) + hpl3;
88
89 dst[i + 0] = lpl0;
90 dst[i + 1] = lpl1;
91 dst[i + 2] = lpl2;
92 dst[i + 3] = lpl3;
93 }
94
95 for (; i < na; i++) {
96 ul0 = numa[i];
98 lpl0 += cl;
99 cl = (lpl0 < cl) + hpl0;
100 dst[i] = lpl0;
101 }
102 }
103
104 return cl;
105}

引用了 _umul64to128_() , 以及 n.

+ 函数调用图:

◆ 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 for (; i + 4 <= n; i += 4) {
273 ul0 = numb[i + 0];
274 ul1 = numb[i + 1];
275 ul2 = numb[i + 2];
276 ul3 = numb[i + 3];
277 rl0 = numa[i + 0];
278 rl1 = numa[i + 1];
279 rl2 = numa[i + 2];
280 rl3 = numa[i + 3];
281
283 lpl0 += cl;
284 cl = (lpl0 < cl) + hpl0;
285 lpl0 = rl0 - lpl0;
286 cl += (lpl0 > rl0);
287
289 lpl1 += cl;
290 cl = (lpl1 < cl) + hpl1;
291 lpl1 = rl1 - lpl1;
292 cl += (lpl1 > rl1);
293
295 lpl2 += cl;
296 cl = (lpl2 < cl) + hpl2;
297 lpl2 = rl2 - lpl2;
298 cl += (lpl2 > rl2);
299
301 lpl3 += cl;
302 cl = (lpl3 < cl) + hpl3;
303 lpl3 = rl3 - lpl3;
304 cl += (lpl3 > rl3);
305
306 numa[i + 0] = lpl0;
307 numa[i + 1] = lpl1;
308 numa[i + 2] = lpl2;
309 numa[i + 3] = lpl3;
310 }
311 for (; i < n; i++) {
312 ul0 = numb[i];
313 rl0 = numa[i];
315 lpl0 += cl;
316 cl = (lpl0 < cl) + hpl0;
317 lpl0 = rl0 - lpl0;
318 cl += (lpl0 > rl0);
319 numa[i] = lpl0;
320 }
321 }
322 return cl;
323}

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

+ 函数调用图: