@@ -18,20 +18,11 @@ static const uint8_t s_read_radix_cutoff[65] = { 0, 0,
18
18
18 , 17 , 17 , 17 , 17 , 17 , 17 /* 58 .. 64 */
19
19
};
20
20
21
- /* This is in mp_prime_is_prime.c and can be reused */
22
- static int s_floor_ilog2 (int value )
23
- {
24
- int r = 0 ;
25
- while ((value >>= 1 ) != 0 ) {
26
- r ++ ;
27
- }
28
- return r ;
29
- }
30
-
31
21
mp_err s_mp_faster_read_radix (mp_int * a , const char * str , size_t start , size_t end , int radix )
32
22
{
33
23
size_t len , mid ;
34
24
mp_int A , B , m ;
25
+ mp_digit radix_ = (mp_digit )radix ;
35
26
mp_err err = MP_OKAY ;
36
27
37
28
len = end - start ;
@@ -42,7 +33,7 @@ mp_err s_mp_faster_read_radix(mp_int *a, const char *str, size_t start, size_t e
42
33
43
34
mid = len / 2u ;
44
35
45
- if ((err = mp_init_set (& m , ( mp_digit ) radix )) != MP_OKAY ) {
36
+ if ((err = mp_init_set (& m , radix_ )) != MP_OKAY ) {
46
37
return err ;
47
38
}
48
39
if ((err = mp_init_multi (& A , & B , NULL )) != MP_OKAY ) {
@@ -53,8 +44,8 @@ mp_err s_mp_faster_read_radix(mp_int *a, const char *str, size_t start, size_t e
53
44
if ((err = s_mp_slower_read_radix (& A , str , start , start + mid + 1 , radix )) != MP_OKAY ) goto LTM_ERR ;
54
45
if ((err = s_mp_slower_read_radix (& B , str , start + mid + 1 , end , radix )) != MP_OKAY ) goto LTM_ERR ;
55
46
56
- if (MP_IS_2EXPT (( unsigned int ) radix )) {
57
- if ((err = mp_mul_2d (& A , (int )(((len - mid ) - 1u ) * ( size_t ) s_floor_ilog2 ( radix )) , & A )) != MP_OKAY )goto LTM_ERR ;
47
+ if (MP_IS_2EXPT (radix_ )) {
48
+ if ((err = mp_mul_2d (& A , (int )(((len - mid ) - 1u ) * s_mp_floor_ilog2 ( radix_ )) , & A )) != MP_OKAY ) goto LTM_ERR ;
58
49
} else {
59
50
if ((err = mp_expt_n (& m , (int )((len - mid ) - 1u ), & m )) != MP_OKAY ) goto LTM_ERR ;
60
51
if ((err = mp_mul (& A , & m , & A )) != MP_OKAY ) goto LTM_ERR ;
0 commit comments