p384/arithmetic/
macros.rs1macro_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}