tdiv_q_2exp.c revision 1.1.1.3 1 1.1 mrg /* mpz_tdiv_q_2exp -- Divide an integer by 2**CNT. Round the quotient
2 1.1 mrg towards -infinity.
3 1.1 mrg
4 1.1.1.2 mrg Copyright 1991, 1993, 1994, 1996, 2001, 2002, 2012 Free Software Foundation,
5 1.1.1.2 mrg Inc.
6 1.1 mrg
7 1.1 mrg This file is part of the GNU MP Library.
8 1.1 mrg
9 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
10 1.1.1.3 mrg it under the terms of either:
11 1.1.1.3 mrg
12 1.1.1.3 mrg * the GNU Lesser General Public License as published by the Free
13 1.1.1.3 mrg Software Foundation; either version 3 of the License, or (at your
14 1.1.1.3 mrg option) any later version.
15 1.1.1.3 mrg
16 1.1.1.3 mrg or
17 1.1.1.3 mrg
18 1.1.1.3 mrg * the GNU General Public License as published by the Free Software
19 1.1.1.3 mrg Foundation; either version 2 of the License, or (at your option) any
20 1.1.1.3 mrg later version.
21 1.1.1.3 mrg
22 1.1.1.3 mrg or both in parallel, as here.
23 1.1 mrg
24 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
25 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
26 1.1.1.3 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 1.1.1.3 mrg for more details.
28 1.1 mrg
29 1.1.1.3 mrg You should have received copies of the GNU General Public License and the
30 1.1.1.3 mrg GNU Lesser General Public License along with the GNU MP Library. If not,
31 1.1.1.3 mrg see https://www.gnu.org/licenses/. */
32 1.1 mrg
33 1.1 mrg #include "gmp.h"
34 1.1 mrg #include "gmp-impl.h"
35 1.1 mrg
36 1.1 mrg void
37 1.1.1.2 mrg mpz_tdiv_q_2exp (mpz_ptr r, mpz_srcptr u, mp_bitcnt_t cnt)
38 1.1 mrg {
39 1.1.1.2 mrg mp_size_t un, rn;
40 1.1 mrg mp_size_t limb_cnt;
41 1.1.1.2 mrg mp_ptr rp;
42 1.1.1.2 mrg mp_srcptr up;
43 1.1 mrg
44 1.1.1.2 mrg un = SIZ(u);
45 1.1 mrg limb_cnt = cnt / GMP_NUMB_BITS;
46 1.1.1.2 mrg rn = ABS (un) - limb_cnt;
47 1.1.1.2 mrg
48 1.1.1.2 mrg if (rn <= 0)
49 1.1.1.2 mrg rn = 0;
50 1.1 mrg else
51 1.1 mrg {
52 1.1.1.2 mrg rp = MPZ_REALLOC (r, rn);
53 1.1.1.2 mrg up = PTR(u) + limb_cnt;
54 1.1 mrg
55 1.1 mrg cnt %= GMP_NUMB_BITS;
56 1.1 mrg if (cnt != 0)
57 1.1 mrg {
58 1.1.1.2 mrg mpn_rshift (rp, up, rn, cnt);
59 1.1.1.2 mrg rn -= rp[rn - 1] == 0;
60 1.1 mrg }
61 1.1 mrg else
62 1.1 mrg {
63 1.1.1.2 mrg MPN_COPY_INCR (rp, up, rn);
64 1.1 mrg }
65 1.1 mrg }
66 1.1.1.2 mrg
67 1.1.1.2 mrg SIZ(r) = un >= 0 ? rn : -rn;
68 1.1 mrg }
69