1 #include "tommath_private.h"
2 #ifdef BN_MP_CNT_LSB_C
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 /* SPDX-License-Identifier: Unlicense */
5
6 static const int lnz[16] = {
7 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
8 };
9
10 /* Counts the number of lsbs which are zero before the first zero bit */
mp_cnt_lsb(const mp_int * a)11 int mp_cnt_lsb(const mp_int *a)
12 {
13 int x;
14 mp_digit q, qq;
15
16 /* easy out */
17 if (MP_IS_ZERO(a)) {
18 return 0;
19 }
20
21 /* scan lower digits until non-zero */
22 for (x = 0; (x < a->used) && (a->dp[x] == 0u); x++) {}
23 q = a->dp[x];
24 x *= MP_DIGIT_BIT;
25
26 /* now scan this digit until a 1 is found */
27 if ((q & 1u) == 0u) {
28 do {
29 qq = q & 15u;
30 x += lnz[qq];
31 q >>= 4;
32 } while (qq == 0u);
33 }
34 return x;
35 }
36
37 #endif
38