From 79c7c4a1836f60e56098c5f5db0c934169c1024f Mon Sep 17 00:00:00 2001 From: Eirik Ogilvie-Wigley Date: Thu, 6 Sep 2018 10:54:41 -0600 Subject: [PATCH] Use existing utility functions --- src/fq.rs | 66 +++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/src/fq.rs b/src/fq.rs index b86af28..8b2dd27 100644 --- a/src/fq.rs +++ b/src/fq.rs @@ -72,6 +72,13 @@ fn adc2(a: u64, b: u64, carry: u64) -> (u64, u64) { (adc as u64, (adc >> 64) as u64) } +/// Compute a + b, returning the result and the carry over. +#[inline(always)] +fn overflowing_add(a: u64, b: u64) -> (u64, u64) { + let (sum, overflow) = a.overflowing_add(b); + (sum, overflow as u64) +} + /// Compute a - (b + borrow), returning the result and setting borrow to /// the borrow value. #[inline(always)] @@ -262,42 +269,16 @@ impl Fq { res } - /// Calculate a + (b * c) + carry, returning the least significant digit - /// and setting carry to the most significant digit. - #[inline(always)] - fn mac_with_carry(a: u64, b: u64, c: u64, carry: &mut u64) -> u64 { - let tmp = (u128::from(a)) + u128::from(b) * u128::from(c) + u128::from(*carry); - - *carry = (tmp >> 64) as u64; - - tmp as u64 - } - - /// Calculate a + b + carry, returning the sum and modifying the - /// carry value. - #[inline(always)] - fn adc(a: u64, b: u64, carry: &mut u64) -> u64 { - let tmp = u128::from(a) + u128::from(b) + u128::from(*carry); - - *carry = (tmp >> 64) as u64; - - tmp as u64 - } - /// Squares this element. pub fn square_assign(&mut self) { - let mut carry = 0; - let r1 = Fq::mac_with_carry(0, self.0[0], self.0[1], &mut carry); - let r2 = Fq::mac_with_carry(0, self.0[0], self.0[2], &mut carry); - let r3 = Fq::mac_with_carry(0, self.0[0], self.0[3], &mut carry); - let r4 = carry; - let mut carry = 0; - let r3 = Fq::mac_with_carry(r3, self.0[1], self.0[2], &mut carry); - let r4 = Fq::mac_with_carry(r4, self.0[1], self.0[3], &mut carry); - let r5 = carry; - let mut carry = 0; - let r5 = Fq::mac_with_carry(r5, self.0[2], self.0[3], &mut carry); - let r6 = carry; + let (r1, carry) = overflowing_mul(self.0[0], self.0[1]); + let (r2, carry) = mac(carry, self.0[0], self.0[2]); + let (r3, r4) = mac(carry, self.0[0], self.0[3]); + + let (r3, carry) = mac(r3, self.0[1], self.0[2]); + let (r4, r5) = mac_with_carry(r4, self.0[1], self.0[3], carry); + + let (r5, r6) = mac(r5, self.0[2], self.0[3]); let r7 = r6 >> 63; let r6 = (r6 << 1) | (r5 >> 63); @@ -307,15 +288,14 @@ impl Fq { let r2 = (r2 << 1) | (r1 >> 63); let r1 = r1 << 1; - let mut carry = 0; - let r0 = Fq::mac_with_carry(0, self.0[0], self.0[0], &mut carry); - let r1 = Fq::adc(r1, 0, &mut carry); - let r2 = Fq::mac_with_carry(r2, self.0[1], self.0[1], &mut carry); - let r3 = Fq::adc(r3, 0, &mut carry); - let r4 = Fq::mac_with_carry(r4, self.0[2], self.0[2], &mut carry); - let r5 = Fq::adc(r5, 0, &mut carry); - let r6 = Fq::mac_with_carry(r6, self.0[3], self.0[3], &mut carry); - let r7 = Fq::adc(r7, 0, &mut carry); + let (r0, carry) = overflowing_mul(self.0[0], self.0[0]); + let (r1, carry) = overflowing_add(r1, carry); + let (r2, carry) = mac_with_carry(r2, self.0[1], self.0[1], carry); + let (r3, carry) = overflowing_add(r3, carry); + let (r4, carry) = mac_with_carry(r4, self.0[2], self.0[2], carry); + let (r5, carry) = overflowing_add(r5, carry); + let (r6, carry) = mac_with_carry(r6, self.0[3], self.0[3], carry); + let r7 = r7 + carry; self.montgomery_reduce(r0, r1, r2, r3, r4, r5, r6, r7); }