p384/arithmetic/
macros.rs

1/// Implement field element inversion.
2macro_rules! impl_field_invert {
3    (
4        $a:expr,
5        $one:expr,
6        $word_bits:expr,
7        $nlimbs:expr,
8        $mul:ident,
9        $neg:ident,
10        $divstep_precomp:ident,
11        $divstep:ident,
12        $msat:ident,
13        $selectznz:ident,
14    ) => {{
15        const ITERATIONS: usize = (49 * $nlimbs * $word_bits + 57) / 17;
16
17        let mut d = 1;
18        let mut f = $msat();
19        let mut g = [0; $nlimbs + 1];
20        let mut v = [0; $nlimbs];
21        let mut r = $one;
22        let mut i = 0;
23        let mut j = 0;
24
25        while j < $nlimbs {
26            g[j] = $a[j];
27            j += 1;
28        }
29
30        while i < ITERATIONS - ITERATIONS % 2 {
31            let (out1, out2, out3, out4, out5) = $divstep(d, &f, &g, &v, &r);
32            let (out1, out2, out3, out4, out5) = $divstep(out1, &out2, &out3, &out4, &out5);
33            d = out1;
34            f = out2;
35            g = out3;
36            v = out4;
37            r = out5;
38            i += 2;
39        }
40
41        if ITERATIONS % 2 != 0 {
42            let (_out1, out2, _out3, out4, _out5) = $divstep(d, &f, &g, &v, &r);
43            v = out4;
44            f = out2;
45        }
46
47        let s = ((f[f.len() - 1] >> $word_bits - 1) & 1) as u8;
48        let v = $selectznz(s, &v, &$neg(&v));
49        $mul(&v, &$divstep_precomp())
50    }};
51}