]> pd.if.org Git - zpackage/blob - tomsfastmath/src/bit/fp_div_2d.c
commit files needed for zpm-fetchurl
[zpackage] / tomsfastmath / src / bit / fp_div_2d.c
1 /* TomsFastMath, a fast ISO C bignum library.
2  * 
3  * This project is meant to fill in where LibTomMath
4  * falls short.  That is speed ;-)
5  *
6  * This project is public domain and free for all purposes.
7  * 
8  * Tom St Denis, tomstdenis@gmail.com
9  */
10 #include <tfm_private.h>
11
12 /* c = a / 2**b */
13 void fp_div_2d(fp_int *a, int b, fp_int *c, fp_int *d)
14 {
15   fp_digit D, r, rr;
16   int      x;
17   fp_int   t;
18
19   /* if the shift count is <= 0 then we do no work */
20   if (b <= 0) {
21     fp_copy (a, c);
22     if (d != NULL) {
23       fp_zero (d);
24     }
25     return;
26   }
27
28   fp_init(&t);
29
30   /* get the remainder */
31   if (d != NULL) {
32     fp_mod_2d (a, b, &t);
33   }
34
35   /* copy */
36   fp_copy(a, c);
37
38   /* shift by as many digits in the bit count */
39   if (b >= (int)DIGIT_BIT) {
40     fp_rshd (c, b / DIGIT_BIT);
41   }
42
43   /* shift any bit count < DIGIT_BIT */
44   D = (fp_digit) (b % DIGIT_BIT);
45   if (D != 0) {
46     register fp_digit *tmpc, mask, shift;
47
48     /* mask */
49     mask = (((fp_digit)1) << D) - 1;
50
51     /* shift for lsb */
52     shift = DIGIT_BIT - D;
53
54     /* alias */
55     tmpc = c->dp + (c->used - 1);
56
57     /* carry */
58     r = 0;
59     for (x = c->used - 1; x >= 0; x--) {
60       /* get the lower  bits of this word in a temp */
61       rr = *tmpc & mask;
62
63       /* shift the current word and mix in the carry bits from the previous word */
64       *tmpc = (*tmpc >> D) | (r << shift);
65       --tmpc;
66
67       /* set the carry to the carry bits of the current word found above */
68       r = rr;
69     }
70   }
71   fp_clamp (c);
72   if (d != NULL) {
73     fp_copy (&t, d);
74   }
75 }
76
77 /* $Source$ */
78 /* $Revision$ */
79 /* $Date$ */