void fp_hlvd_low(dig_t *c, const dig_t *a) { dig_t carry = 0; if (a[0] & 1) { carry = fp_addn_low(c, a, fp_prime_get()); } else { fp_copy(c, a); } fp_add1_low(c + FP_DIGS, a + FP_DIGS, carry); carry = fp_rsh1_low(c + FP_DIGS, c + FP_DIGS); fp_rsh1_low(c, c); if (carry) { c[FP_DIGS - 1] ^= ((dig_t)1 << (FP_DIGIT - 1)); } }
void fp_rsh(fp_t c, const fp_t a, int bits) { int digits; SPLIT(bits, digits, bits, FP_DIG_LOG); if (digits) { fp_rshd_low(c, a, digits); } else { if (c != a) { fp_copy(c, a); } } switch (bits) { case 0: break; case 1: fp_rsh1_low(c, c); break; default: fp_rshb_low(c, c, bits); break; } }