Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MiniTLS-HTTPS-Example
math/bit/fp_div_2d.c@0:35aa5be3b78d, 2014-06-06 (annotated)
- Committer:
- MiniTLS
- Date:
- Fri Jun 06 10:49:02 2014 +0000
- Revision:
- 0:35aa5be3b78d
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MiniTLS | 0:35aa5be3b78d | 1 | /* TomsFastMath, a fast ISO C bignum library. |
MiniTLS | 0:35aa5be3b78d | 2 | * |
MiniTLS | 0:35aa5be3b78d | 3 | * This project is meant to fill in where LibTomMath |
MiniTLS | 0:35aa5be3b78d | 4 | * falls short. That is speed ;-) |
MiniTLS | 0:35aa5be3b78d | 5 | * |
MiniTLS | 0:35aa5be3b78d | 6 | * This project is public domain and free for all purposes. |
MiniTLS | 0:35aa5be3b78d | 7 | * |
MiniTLS | 0:35aa5be3b78d | 8 | * Tom St Denis, tomstdenis@gmail.com |
MiniTLS | 0:35aa5be3b78d | 9 | */ |
MiniTLS | 0:35aa5be3b78d | 10 | #include <tfm.h> |
MiniTLS | 0:35aa5be3b78d | 11 | |
MiniTLS | 0:35aa5be3b78d | 12 | /* c = a / 2**b */ |
MiniTLS | 0:35aa5be3b78d | 13 | void fp_div_2d(fp_int *a, int b, fp_int *c, fp_int *d) |
MiniTLS | 0:35aa5be3b78d | 14 | { |
MiniTLS | 0:35aa5be3b78d | 15 | fp_digit D, r, rr; |
MiniTLS | 0:35aa5be3b78d | 16 | int x; |
MiniTLS | 0:35aa5be3b78d | 17 | fp_int t; |
MiniTLS | 0:35aa5be3b78d | 18 | |
MiniTLS | 0:35aa5be3b78d | 19 | /* if the shift count is <= 0 then we do no work */ |
MiniTLS | 0:35aa5be3b78d | 20 | if (b <= 0) { |
MiniTLS | 0:35aa5be3b78d | 21 | fp_copy (a, c); |
MiniTLS | 0:35aa5be3b78d | 22 | if (d != NULL) { |
MiniTLS | 0:35aa5be3b78d | 23 | fp_zero (d); |
MiniTLS | 0:35aa5be3b78d | 24 | } |
MiniTLS | 0:35aa5be3b78d | 25 | return; |
MiniTLS | 0:35aa5be3b78d | 26 | } |
MiniTLS | 0:35aa5be3b78d | 27 | |
MiniTLS | 0:35aa5be3b78d | 28 | fp_init(&t); |
MiniTLS | 0:35aa5be3b78d | 29 | |
MiniTLS | 0:35aa5be3b78d | 30 | /* get the remainder */ |
MiniTLS | 0:35aa5be3b78d | 31 | if (d != NULL) { |
MiniTLS | 0:35aa5be3b78d | 32 | fp_mod_2d (a, b, &t); |
MiniTLS | 0:35aa5be3b78d | 33 | } |
MiniTLS | 0:35aa5be3b78d | 34 | |
MiniTLS | 0:35aa5be3b78d | 35 | /* copy */ |
MiniTLS | 0:35aa5be3b78d | 36 | fp_copy(a, c); |
MiniTLS | 0:35aa5be3b78d | 37 | |
MiniTLS | 0:35aa5be3b78d | 38 | /* shift by as many digits in the bit count */ |
MiniTLS | 0:35aa5be3b78d | 39 | if (b >= (int)DIGIT_BIT) { |
MiniTLS | 0:35aa5be3b78d | 40 | fp_rshd (c, b / DIGIT_BIT); |
MiniTLS | 0:35aa5be3b78d | 41 | } |
MiniTLS | 0:35aa5be3b78d | 42 | |
MiniTLS | 0:35aa5be3b78d | 43 | /* shift any bit count < DIGIT_BIT */ |
MiniTLS | 0:35aa5be3b78d | 44 | D = (fp_digit) (b % DIGIT_BIT); |
MiniTLS | 0:35aa5be3b78d | 45 | if (D != 0) { |
MiniTLS | 0:35aa5be3b78d | 46 | register fp_digit *tmpc, mask, shift; |
MiniTLS | 0:35aa5be3b78d | 47 | |
MiniTLS | 0:35aa5be3b78d | 48 | /* mask */ |
MiniTLS | 0:35aa5be3b78d | 49 | mask = (((fp_digit)1) << D) - 1; |
MiniTLS | 0:35aa5be3b78d | 50 | |
MiniTLS | 0:35aa5be3b78d | 51 | /* shift for lsb */ |
MiniTLS | 0:35aa5be3b78d | 52 | shift = DIGIT_BIT - D; |
MiniTLS | 0:35aa5be3b78d | 53 | |
MiniTLS | 0:35aa5be3b78d | 54 | /* alias */ |
MiniTLS | 0:35aa5be3b78d | 55 | tmpc = c->dp + (c->used - 1); |
MiniTLS | 0:35aa5be3b78d | 56 | |
MiniTLS | 0:35aa5be3b78d | 57 | /* carry */ |
MiniTLS | 0:35aa5be3b78d | 58 | r = 0; |
MiniTLS | 0:35aa5be3b78d | 59 | for (x = c->used - 1; x >= 0; x--) { |
MiniTLS | 0:35aa5be3b78d | 60 | /* get the lower bits of this word in a temp */ |
MiniTLS | 0:35aa5be3b78d | 61 | rr = *tmpc & mask; |
MiniTLS | 0:35aa5be3b78d | 62 | |
MiniTLS | 0:35aa5be3b78d | 63 | /* shift the current word and mix in the carry bits from the previous word */ |
MiniTLS | 0:35aa5be3b78d | 64 | *tmpc = (*tmpc >> D) | (r << shift); |
MiniTLS | 0:35aa5be3b78d | 65 | --tmpc; |
MiniTLS | 0:35aa5be3b78d | 66 | |
MiniTLS | 0:35aa5be3b78d | 67 | /* set the carry to the carry bits of the current word found above */ |
MiniTLS | 0:35aa5be3b78d | 68 | r = rr; |
MiniTLS | 0:35aa5be3b78d | 69 | } |
MiniTLS | 0:35aa5be3b78d | 70 | } |
MiniTLS | 0:35aa5be3b78d | 71 | fp_clamp (c); |
MiniTLS | 0:35aa5be3b78d | 72 | if (d != NULL) { |
MiniTLS | 0:35aa5be3b78d | 73 | fp_copy (&t, d); |
MiniTLS | 0:35aa5be3b78d | 74 | } |
MiniTLS | 0:35aa5be3b78d | 75 | } |
MiniTLS | 0:35aa5be3b78d | 76 | |
MiniTLS | 0:35aa5be3b78d | 77 | /* $Source: /cvs/libtom/tomsfastmath/src/bit/fp_div_2d.c,v $ */ |
MiniTLS | 0:35aa5be3b78d | 78 | /* $Revision: 1.1 $ */ |
MiniTLS | 0:35aa5be3b78d | 79 | /* $Date: 2006/12/31 21:25:53 $ */ |