LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
shl.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 if (shr == 0) {
11 lmmp_copy(dst, numa, na);
12 return 0;
13 } else {
14 const mp_limb_t rshr = LIMB_BITS - shr;
15 mp_limb_t high_limb, low_limb;
16 mp_limb_t retval;
17 numa += na;
18 dst += na;
19 low_limb = *--numa;
20 retval = low_limb >> rshr;
21 high_limb = (low_limb << shr);
22 while (--na != 0) {
23 low_limb = *--numa;
24 *--dst = high_limb | (low_limb >> rshr);
25 high_limb = (low_limb << shr);
26 }
27 *--dst = high_limb;
28 return retval;
29 }
30}
31
33 if (shr == 0) {
34 lmmp_copy(dst, numa, na);
35 return 0;
36 } else {
37 const mp_limb_t rshr = LIMB_BITS - shr;
38 mp_limb_t high_limb, low_limb;
39 mp_limb_t retval;
40 numa += na;
41 dst += na;
42 low_limb = *--numa;
43 retval = low_limb >> rshr;
44 high_limb = (low_limb << shr);
45 while (--na != 0) {
46 low_limb = *--numa;
47 *--dst = high_limb | (low_limb >> rshr);
48 high_limb = (low_limb << shr);
49 }
50 c &= ((mp_limb_t)1 << shr) - 1;
51 *--dst = high_limb | c;
52 return retval;
53 }
54}
55
57 mp_size_t i, c = 0, mb = 0;
58
59 for (i = 0; i < n; i++) {
60 mp_limb_t a, b, r;
61 a = numa[i];
62 b = (numb[i] << 1) + mb;
63 mb = numb[i] >> (LIMB_BITS - 1);
64 r = a + c;
65 c = (r < c);
66 r += b;
67 c += (r < b);
68 dst[i] = r;
69 }
70 return c + mb;
71}
72
74 mp_size_t i, c = 0, mb = 0;
75
76 for (i = 0; i < n; i++) {
77 mp_limb_t a, b;
78 a = numa[i];
79 b = (numb[i] << 1) + mb;
80 mb = numb[i] >> (LIMB_BITS - 1);
81 b += c;
82 c = (b < c);
83 c += (a < b);
84 dst[i] = a - b;
85 }
86 return c + mb;
87}
mp_limb_t * mp_ptr
Definition lmmp.h:215
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
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 LIMB_BITS
Definition lmmp.h:221
mp_limb_t lmmp_shl_c_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c)
带进位的大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充c的低shl位
Definition shl.c:32
mp_limb_t lmmp_subshl1_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
减法结合左移1位操作 [dst,n] = [numa,n] - ([numb,n] << 1)
Definition shl.c:73
mp_limb_t lmmp_shl_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
Definition shl.c:9
mp_limb_t lmmp_addshl1_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
加法结合左移1位操作 [dst,n] = [numa,n] + ([numb,n] << 1)
Definition shl.c:56