@@ -21,61 +21,29 @@ pub struct Fp {
2121
2222impl  Fp  { 
2323    /// Returns a correctly rounded product of itself and `other`. 
24- pub  fn  mul ( & self ,  other :  & Fp )  -> Fp  { 
25-         const  MASK :  u64  = 0xffffffff ; 
26-         let  a = self . f  >> 32 ; 
27-         let  b = self . f  &  MASK ; 
28-         let  c = other. f  >> 32 ; 
29-         let  d = other. f  &  MASK ; 
30-         let  ac = a *  c; 
31-         let  bc = b *  c; 
32-         let  ad = a *  d; 
33-         let  bd = b *  d; 
34-         let  tmp = ( bd >> 32 )  + ( ad &  MASK )  + ( bc &  MASK )  + ( 1  << 31 )  /* round */ ; 
35-         let  f = ac + ( ad >> 32 )  + ( bc >> 32 )  + ( tmp >> 32 ) ; 
24+ pub  fn  mul ( self ,  other :  Self )  -> Self  { 
25+         let  ( lo,  hi)  = self . f . widening_mul ( other. f ) ; 
26+         let  f = hi + ( lo >> 63 )  /* round */ ; 
3627        let  e = self . e  + other. e  + 64 ; 
37-         Fp  {  f,  e } 
28+         Self  {  f,  e } 
3829    } 
3930
4031    /// Normalizes itself so that the resulting mantissa is at least `2^63`. 
41- pub  fn  normalize ( & self )  -> Fp  { 
42-         let  mut  f = self . f ; 
43-         let  mut  e = self . e ; 
44-         if  f >> ( 64  - 32 )  == 0  { 
45-             f <<= 32 ; 
46-             e -= 32 ; 
47-         } 
48-         if  f >> ( 64  - 16 )  == 0  { 
49-             f <<= 16 ; 
50-             e -= 16 ; 
51-         } 
52-         if  f >> ( 64  - 8 )  == 0  { 
53-             f <<= 8 ; 
54-             e -= 8 ; 
55-         } 
56-         if  f >> ( 64  - 4 )  == 0  { 
57-             f <<= 4 ; 
58-             e -= 4 ; 
59-         } 
60-         if  f >> ( 64  - 2 )  == 0  { 
61-             f <<= 2 ; 
62-             e -= 2 ; 
63-         } 
64-         if  f >> ( 64  - 1 )  == 0  { 
65-             f <<= 1 ; 
66-             e -= 1 ; 
67-         } 
32+ pub  fn  normalize ( self )  -> Self  { 
33+         let  lz = self . f . leading_zeros ( ) ; 
34+         let  f = self . f  << lz; 
35+         let  e = self . e  - lz as  i16 ; 
6836        debug_assert ! ( f >= ( 1  << 63 ) ) ; 
69-         Fp  {  f,  e } 
37+         Self  {  f,  e } 
7038    } 
7139
7240    /// Normalizes itself to have the shared exponent. 
7341/// It can only decrease the exponent (and thus increase the mantissa). 
74- pub  fn  normalize_to ( & self ,  e :  i16 )  -> Fp  { 
42+ pub  fn  normalize_to ( self ,  e :  i16 )  -> Self  { 
7543        let  edelta = self . e  - e; 
7644        assert ! ( edelta >= 0 ) ; 
7745        let  edelta = edelta as  usize ; 
7846        assert_eq ! ( self . f << edelta >> edelta,  self . f) ; 
79-         Fp  {  f :  self . f  << edelta,  e } 
47+         Self  {  f :  self . f  << edelta,  e } 
8048    } 
8149} 
0 commit comments