Annotation of OpenXM_contrib/gmp/mpn/generic/mod_34lsub1.c, Revision 1.1.1.1
1.1 ohara 1: /* mpn_mod_34lsub1 -- remainder modulo 2^(BITS_PER_MP_LIMB*3/4)-1.
2:
3: THE FUNCTIONS IN THIS FILE ARE FOR INTERNAL USE ONLY. THEY'RE ALMOST
4: CERTAIN TO BE SUBJECT TO INCOMPATIBLE CHANGES OR DISAPPEAR COMPLETELY IN
5: FUTURE GNU MP RELEASES.
6:
7: Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
8:
9: This file is part of the GNU MP Library.
10:
11: The GNU MP Library is free software; you can redistribute it and/or modify
12: it under the terms of the GNU Lesser General Public License as published by
13: the Free Software Foundation; either version 2.1 of the License, or (at your
14: option) any later version.
15:
16: The GNU MP Library is distributed in the hope that it will be useful, but
17: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19: License for more details.
20:
21: You should have received a copy of the GNU Lesser General Public License
22: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
23: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
24: MA 02111-1307, USA. */
25:
26:
27: #include "gmp.h"
28: #include "gmp-impl.h"
29:
30:
31: /* Calculate a remainder from {p,n} divided by 2^(BITS_PER_MP_LIMB*3/4)-1.
32: The remainder is not fully reduced, it's any limb value congruent to
33: {p,n} modulo that divisor.
34:
35: This implementation is only correct when BITS_PER_MP_LIMB is a multiple
36: of 4, but that suffices for all current uses. */
37:
38: #if BITS_PER_MP_LIMB % 4 == 0
39:
40: #define B1 (BITS_PER_MP_LIMB / 4)
41: #define B2 (B1 * 2)
42: #define B3 (B1 * 3)
43:
44: #define M1 ((CNST_LIMB(1) << B1) - 1)
45: #define M2 ((CNST_LIMB(1) << B2) - 1)
46: #define M3 ((CNST_LIMB(1) << B3) - 1)
47:
48: #define LOW0(n) ((n) & M3)
49: #define HIGH0(n) ((n) >> B3)
50:
51: #define LOW1(n) (((n) & M2) << B1)
52: #define HIGH1(n) ((n) >> B2)
53:
54: #define LOW2(n) (((n) & M1) << B2)
55: #define HIGH2(n) ((n) >> B1)
56:
57: #define PARTS0(n) (LOW0(n) + HIGH0(n))
58: #define PARTS1(n) (LOW1(n) + HIGH1(n))
59: #define PARTS2(n) (LOW2(n) + HIGH2(n))
60:
61: #define ADD(c,a,val) \
62: do { \
63: mp_limb_t l = val; \
64: a += l; \
65: c += (a < l); \
66: } while (0)
67:
68: mp_limb_t
69: mpn_mod_34lsub1 (mp_srcptr p, mp_size_t n)
70: {
71: mp_limb_t c0 = 0;
72: mp_limb_t c1 = 0;
73: mp_limb_t c2 = 0;
74: mp_limb_t a0, a1, a2;
75:
76: ASSERT (n >= 1);
77:
78: a0 = a1 = a2 = 0;
79: c0 = c1 = c2 = 0;
80:
81: while ((n -= 3) >= 0)
82: {
83: ADD (c0, a0, p[0]);
84: ADD (c1, a1, p[1]);
85: ADD (c2, a2, p[2]);
86: p += 3;
87: }
88:
89: if (n != -3)
90: {
91: ADD (c0, a0, p[0]);
92: if (n != -2)
93: ADD (c1, a1, p[1]);
94: }
95:
96: return
97: PARTS0 (a0) + PARTS1 (a1) + PARTS2 (a2)
98: + PARTS1 (c0) + PARTS2 (c1) + PARTS0 (c2);
99: }
100:
101: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>