LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
add_n.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../../include/lammp/lmmpn.h"
8
10 mp_size_t i = 0;
11 mp_limb_t cy = c;
12
13 for (; i + 4 <= n; i += 4) {
14 mp_limb_t a0, b0, r0;
15 mp_limb_t a1, b1, r1;
16 mp_limb_t a2, b2, r2;
17 mp_limb_t a3, b3, r3;
18
19 a0 = numa[i + 0];
20 b0 = numb[i + 0];
21
22 a1 = numa[i + 1];
23 b1 = numb[i + 1];
24
25 a2 = numa[i + 2];
26 b2 = numb[i + 2];
27
28 a3 = numa[i + 3];
29 b3 = numb[i + 3];
30
31 r0 = a0 + cy;
32 cy = (r0 < cy);
33 r0 += b0;
34 cy += (r0 < b0);
35
36 r1 = a1 + cy;
37 cy = (r1 < cy);
38 r1 += b1;
39 cy += (r1 < b1);
40
41 r2 = a2 + cy;
42 cy = (r2 < cy);
43 r2 += b2;
44 cy += (r2 < b2);
45
46 r3 = a3 + cy;
47 cy = (r3 < cy);
48 r3 += b3;
49 cy += (r3 < b3);
50
51 dst[i + 0] = r0;
52 dst[i + 1] = r1;
53 dst[i + 2] = r2;
54 dst[i + 3] = r3;
55 }
56
57 for (; i < n; i++) {
58 mp_limb_t a, b, r;
59 a = numa[i];
60 b = numb[i];
61 r = a + cy;
62 cy = (r < cy);
63 r += b;
64 cy += (r < b);
65 dst[i] = r;
66 }
67
68 return cy;
69}
70
72 mp_size_t i = 0;
73 mp_limb_t cy = 0;
74
75 for (; i + 4 <= n; i += 4) {
76 mp_limb_t a0, b0, r0;
77 mp_limb_t a1, b1, r1;
78 mp_limb_t a2, b2, r2;
79 mp_limb_t a3, b3, r3;
80
81 a0 = numa[i + 0];
82 b0 = numb[i + 0];
83
84 a1 = numa[i + 1];
85 b1 = numb[i + 1];
86
87 a2 = numa[i + 2];
88 b2 = numb[i + 2];
89
90 a3 = numa[i + 3];
91 b3 = numb[i + 3];
92
93 r0 = a0 + cy;
94 cy = (r0 < cy);
95 r0 += b0;
96 cy += (r0 < b0);
97
98 r1 = a1 + cy;
99 cy = (r1 < cy);
100 r1 += b1;
101 cy += (r1 < b1);
102
103 r2 = a2 + cy;
104 cy = (r2 < cy);
105 r2 += b2;
106 cy += (r2 < b2);
107
108 r3 = a3 + cy;
109 cy = (r3 < cy);
110 r3 += b3;
111 cy += (r3 < b3);
112
113 dst[i + 0] = r0;
114 dst[i + 1] = r1;
115 dst[i + 2] = r2;
116 dst[i + 3] = r3;
117 }
118
119 for (; i < n; i++) {
120 mp_limb_t a, b, r;
121 a = numa[i];
122 b = numb[i];
123 r = a + cy;
124 cy = (r < cy);
125 r += b;
126 cy += (r < b);
127 dst[i] = r;
128 }
129
130 return cy;
131}
mp_limb_t lmmp_add_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带进位的n位加法 [dst,n] = [numa,n] + [numb,n] + c
Definition add_n.c:9
mp_limb_t lmmp_add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
Definition add_n.c:71
mp_limb_t * mp_ptr
Definition lmmp.h:215
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define b0
#define b1
#define a0
#define a1
#define r2
#define r1
#define a2
#define r3
#define r0
#define b2
#define a3
#define b3