Annotation of OpenXM_contrib/gmp/mpz/tdiv_r_2exp.c, Revision 1.1.1.3
1.1 maekawa 1: /* mpz_tdiv_r_2exp -- Divide a integer by 2**CNT and produce a remainder.
2:
1.1.1.3 ! ohara 3: Copyright 1991, 1993, 1994, 1995, 2001, 2002 Free Software Foundation, Inc.
1.1 maekawa 4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
1.1.1.2 maekawa 8: it under the terms of the GNU Lesser General Public License as published by
9: the Free Software Foundation; either version 2.1 of the License, or (at your
1.1 maekawa 10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1.1.1.2 maekawa 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
1.1 maekawa 15: License for more details.
16:
1.1.1.2 maekawa 17: You should have received a copy of the GNU Lesser General Public License
1.1 maekawa 18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include "gmp.h"
23: #include "gmp-impl.h"
24:
25: void
26: mpz_tdiv_r_2exp (mpz_ptr res, mpz_srcptr in, unsigned long int cnt)
27: {
28: mp_size_t in_size = ABS (in->_mp_size);
29: mp_size_t res_size;
1.1.1.3 ! ohara 30: mp_size_t limb_cnt = cnt / GMP_NUMB_BITS;
1.1 maekawa 31: mp_srcptr in_ptr = in->_mp_d;
32:
33: if (in_size > limb_cnt)
34: {
35: /* The input operand is (probably) greater than 2**CNT. */
36: mp_limb_t x;
37:
1.1.1.3 ! ohara 38: x = in_ptr[limb_cnt] & (((mp_limb_t) 1 << cnt % GMP_NUMB_BITS) - 1);
1.1 maekawa 39: if (x != 0)
40: {
41: res_size = limb_cnt + 1;
42: if (res->_mp_alloc < res_size)
43: _mpz_realloc (res, res_size);
44:
45: res->_mp_d[limb_cnt] = x;
46: }
47: else
48: {
49: res_size = limb_cnt;
50: MPN_NORMALIZE (in_ptr, res_size);
51:
52: if (res->_mp_alloc < res_size)
53: _mpz_realloc (res, res_size);
54:
55: limb_cnt = res_size;
56: }
57: }
58: else
59: {
60: /* The input operand is smaller than 2**CNT. We perform a no-op,
61: apart from that we might need to copy IN to RES. */
62: res_size = in_size;
63: if (res->_mp_alloc < res_size)
64: _mpz_realloc (res, res_size);
65:
66: limb_cnt = res_size;
67: }
68:
69: if (res != in)
70: MPN_COPY (res->_mp_d, in->_mp_d, limb_cnt);
71: res->_mp_size = in->_mp_size >= 0 ? res_size : -res_size;
72: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>