@@ -21,61 +21,29 @@ pub struct Fp {
21
21
22
22
impl Fp {
23
23
/// 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 */ ;
36
27
let e = self . e + other. e + 64 ;
37
- Fp { f, e }
28
+ Self { f, e }
38
29
}
39
30
40
31
/// 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 ;
68
36
debug_assert ! ( f >= ( 1 << 63 ) ) ;
69
- Fp { f, e }
37
+ Self { f, e }
70
38
}
71
39
72
40
/// Normalizes itself to have the shared exponent.
73
41
/// 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 {
75
43
let edelta = self . e - e;
76
44
assert ! ( edelta >= 0 ) ;
77
45
let edelta = edelta as usize ;
78
46
assert_eq ! ( self . f << edelta >> edelta, self . f) ;
79
- Fp { f : self . f << edelta, e }
47
+ Self { f : self . f << edelta, e }
80
48
}
81
49
}
0 commit comments