12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #include "tommath_private.h"
- #ifdef BN_MP_DIV_2_C
- /* LibTomMath, multiple-precision integer library -- Tom St Denis */
- /* SPDX-License-Identifier: Unlicense */
- /* b = a/2 */
- mp_err mp_div_2(const mp_int *a, mp_int *b)
- {
- int x, oldused;
- mp_digit r, rr, *tmpa, *tmpb;
- mp_err err;
- /* copy */
- if (b->alloc < a->used) {
- if ((err = mp_grow(b, a->used)) != MP_OKAY) {
- return err;
- }
- }
- oldused = b->used;
- b->used = a->used;
- /* source alias */
- tmpa = a->dp + b->used - 1;
- /* dest alias */
- tmpb = b->dp + b->used - 1;
- /* carry */
- r = 0;
- for (x = b->used - 1; x >= 0; x--) {
- /* get the carry for the next iteration */
- rr = *tmpa & 1u;
- /* shift the current digit, add in carry and store */
- *tmpb-- = (*tmpa-- >> 1) | (r << (MP_DIGIT_BIT - 1));
- /* forward carry to next iteration */
- r = rr;
- }
- /* zero excess digits */
- MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
- b->sign = a->sign;
- mp_clamp(b);
- return MP_OKAY;
- }
- #endif
|