795cd2013f
Originally I made those as macros. However we have many other small functions like mp_clamp, mp_exch which are also not implemented as macros right now. If we would use c99, I would implement them as private static inline functions. And mp_exch would be a public static inline function. But since we are bound to c89, we simply use normal functions. To achieve optimal performance one should either use link time optimization or amalgamation.
44 lines
996 B
C
44 lines
996 B
C
#include "tommath_private.h"
|
|
#ifdef MP_RSHD_C
|
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
|
/* SPDX-License-Identifier: Unlicense */
|
|
|
|
/* shift right a certain amount of digits */
|
|
void mp_rshd(mp_int *a, int b)
|
|
{
|
|
int x;
|
|
|
|
/* if b <= 0 then ignore it */
|
|
if (b <= 0) {
|
|
return;
|
|
}
|
|
|
|
/* if b > used then simply zero it and return */
|
|
if (a->used <= b) {
|
|
mp_zero(a);
|
|
return;
|
|
}
|
|
|
|
/* shift the digits down.
|
|
* this is implemented as a sliding window where
|
|
* the window is b-digits long and digits from
|
|
* the top of the window are copied to the bottom
|
|
*
|
|
* e.g.
|
|
|
|
b-2 | b-1 | b0 | b1 | b2 | ... | bb | ---->
|
|
/\ | ---->
|
|
\-------------------/ ---->
|
|
*/
|
|
for (x = 0; x < (a->used - b); x++) {
|
|
a->dp[x] = a->dp[x + b];
|
|
}
|
|
|
|
/* zero the top digits */
|
|
s_mp_zero_digs(a->dp + a->used - b, b);
|
|
|
|
/* remove excess digits */
|
|
a->used -= b;
|
|
}
|
|
#endif
|