iwmfw - Add version 22 firmwares for AC3168 and AC8265 chipsets.
[dragonfly.git] / contrib / gmp / mpz / tdiv_q.c
blobe78dd64dcefc02dfd95b89e21b2883ff26f28887
1 /* mpz_tdiv_q -- divide two integers and produce a quotient.
3 Copyright 1991, 1993, 1994, 1996, 2000, 2001, 2005, 2010 Free Software Foundation,
4 Inc.
6 This file is part of the GNU MP Library.
8 The GNU MP Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
13 The GNU MP Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
21 #include "gmp.h"
22 #include "gmp-impl.h"
23 #include "longlong.h"
25 void
26 mpz_tdiv_q (mpz_ptr quot, mpz_srcptr num, mpz_srcptr den)
28 mp_size_t ql;
29 mp_size_t ns, ds, nl, dl;
30 mp_ptr np, dp, qp;
31 TMP_DECL;
33 ns = SIZ (num);
34 ds = SIZ (den);
35 nl = ABS (ns);
36 dl = ABS (ds);
37 ql = nl - dl + 1;
39 if (dl == 0)
40 DIVIDE_BY_ZERO;
42 if (ql <= 0)
44 SIZ (quot) = 0;
45 return;
48 MPZ_REALLOC (quot, ql);
50 TMP_MARK;
51 qp = PTR (quot);
52 np = PTR (num);
53 dp = PTR (den);
55 /* Copy denominator to temporary space if it overlaps with the quotient. */
56 if (dp == qp)
58 mp_ptr tp;
59 tp = TMP_ALLOC_LIMBS (dl);
60 MPN_COPY (tp, dp, dl);
61 dp = tp;
63 /* Copy numerator to temporary space if it overlaps with the quotient. */
64 if (np == qp)
66 mp_ptr tp;
67 tp = TMP_ALLOC_LIMBS (nl + 1);
68 MPN_COPY (tp, np, nl);
69 /* Overlap dividend and scratch. */
70 mpn_div_q (qp, tp, nl, dp, dl, tp);
72 else
74 mp_ptr tp;
75 tp = TMP_ALLOC_LIMBS (nl + 1);
76 mpn_div_q (qp, np, nl, dp, dl, tp);
79 ql -= qp[ql - 1] == 0;
81 SIZ (quot) = (ns ^ ds) >= 0 ? ql : -ql;
82 TMP_FREE;