From dd80421094c67f442448ab7bbe84a12933c27583 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Wed, 3 Jan 2018 12:13:52 -0800 Subject: [PATCH] Move field constants to constants module --- src/backend/avx2/constants.rs | 36 +++++++++++++++++++++++++++++++++++ src/backend/avx2/edwards.rs | 3 +-- src/backend/avx2/field.rs | 18 +----------------- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/backend/avx2/constants.rs b/src/backend/avx2/constants.rs index a84d7e9..087d96c 100644 --- a/src/backend/avx2/constants.rs +++ b/src/backend/avx2/constants.rs @@ -15,6 +15,42 @@ use stdsimd::simd::u32x8; use backend::avx2::field::FieldElement32x4; use backend::avx2::edwards::ExtendedPoint; +/// The low limbs of (2p, 2p, 2p, 2p), so that +/// ```no_run +/// (2p, 2p, 2p, 2p) = [P_TIMES_2_LO, P_TIMES_2_HI, P_TIMES_2_HI, P_TIMES_2_HI, P_TIMES_2_HI] +/// ``` +pub(crate) static P_TIMES_2_LO: u32x8 = + u32x8::new(67108845 << 1, 67108845 << 1, 33554431 << 1, 33554431 << 1, 67108845 << 1, 67108845 << 1, 33554431 << 1, 33554431 << 1); + +/// The high limbs of (2p, 2p, 2p, 2p), so that +/// ```no_run +/// (2p, 2p, 2p, 2p) = [P_TIMES_2_LO, P_TIMES_2_HI, P_TIMES_2_HI, P_TIMES_2_HI, P_TIMES_2_HI] +/// ``` +pub(crate) static P_TIMES_2_HI: u32x8 = + u32x8::new(67108863 << 1, 67108863 << 1, 33554431 << 1, 33554431 << 1, 67108863 << 1, 67108863 << 1, 33554431 << 1, 33554431 << 1); + +/// The low limbs of (16p, 16p, 16p, 16p), so that +/// ```no_run +/// (16p, 16p, 16p, 16p) = [P_TIMES_16_LO, P_TIMES_16_HI, P_TIMES_16_HI, P_TIMES_16_HI, P_TIMES_16_HI] +/// ``` +pub(crate) static P_TIMES_16_LO: u32x8 = + u32x8::new(67108845 << 4, 67108845 << 4, 33554431 << 4, 33554431 << 4, 67108845 << 4, 67108845 << 4, 33554431 << 4, 33554431 << 4); + +/// The high limbs of (16p, 16p, 16p, 16p), so that +/// ```no_run +/// (16p, 16p, 16p, 16p) = [P_TIMES_16_LO, P_TIMES_16_HI, P_TIMES_16_HI, P_TIMES_16_HI, P_TIMES_16_HI] +/// ``` +pub(crate) static P_TIMES_16_HI: u32x8 = + u32x8::new(67108863 << 4, 67108863 << 4, 33554431 << 4, 33554431 << 4, 67108863 << 4, 67108863 << 4, 33554431 << 4, 33554431 << 4); + +pub(crate) static P_TIMES_2_MASKED: FieldElement32x4 = FieldElement32x4([ + u32x8::new( 0, 134217690, 0, 67108862, 134217690, 0, 67108862, 0), + u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), + u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), + u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), + u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0) +]); + /// Odd multiples of the Ed25519 basepoint: pub static ODD_MULTIPLES_OF_BASEPOINT: [ExtendedPoint; 8] = [ ExtendedPoint(FieldElement32x4([ diff --git a/src/backend/avx2/edwards.rs b/src/backend/avx2/edwards.rs index afa7b13..2d038b4 100644 --- a/src/backend/avx2/edwards.rs +++ b/src/backend/avx2/edwards.rs @@ -27,7 +27,6 @@ use curve_models::window::LookupTable; use traits::Identity; use backend::avx2::field::FieldElement32x4; -use backend::avx2::field::P_TIMES_2_MASKED; use backend::avx2::field::{A_LANES, B_LANES, C_LANES, D_LANES, ALL_LANES}; @@ -212,7 +211,7 @@ impl ExtendedPoint { let S3_2: u32x8 = _mm256_blend_epi32(zero, (t1.0[i] + t1.0[i]).into(), 0b01010000).into(); // tmp0 = (0 0 2*S3 -S4) let tmp0: u32x8 = _mm256_blend_epi32(S3_2.into(), t1.0[i].into(), 0b10100000).into(); - t0.0[i] = (P_TIMES_2_MASKED.0[i] + tmp0) + S1; + t0.0[i] = (avx2::constants::P_TIMES_2_MASKED.0[i] + tmp0) + S1; t0.0[i] = t0.0[i] + _mm256_blend_epi32(zero, S2.into(), 0b10100101).into(); t0.0[i] = t0.0[i] - _mm256_blend_epi32(S2.into(), zero, 0b10100101).into(); } diff --git a/src/backend/avx2/field.rs b/src/backend/avx2/field.rs index 12e36c1..496283c 100644 --- a/src/backend/avx2/field.rs +++ b/src/backend/avx2/field.rs @@ -26,23 +26,7 @@ use stdsimd::simd::{u32x8, i32x8, u64x4}; use backend::u64::field::FieldElement64; -pub(crate) static P_TIMES_2_LO: u32x8 = - u32x8::new(67108845 << 1, 67108845 << 1, 33554431 << 1, 33554431 << 1, 67108845 << 1, 67108845 << 1, 33554431 << 1, 33554431 << 1); -pub(crate) static P_TIMES_2_HI: u32x8 = - u32x8::new(67108863 << 1, 67108863 << 1, 33554431 << 1, 33554431 << 1, 67108863 << 1, 67108863 << 1, 33554431 << 1, 33554431 << 1); - -pub(crate) static P_TIMES_16_LO: u32x8 = - u32x8::new(67108845 << 4, 67108845 << 4, 33554431 << 4, 33554431 << 4, 67108845 << 4, 67108845 << 4, 33554431 << 4, 33554431 << 4); -pub(crate) static P_TIMES_16_HI: u32x8 = - u32x8::new(67108863 << 4, 67108863 << 4, 33554431 << 4, 33554431 << 4, 67108863 << 4, 67108863 << 4, 33554431 << 4, 33554431 << 4); - -pub(crate) static P_TIMES_2_MASKED: FieldElement32x4 = FieldElement32x4([ - u32x8::new( 0, 134217690, 0, 67108862, 134217690, 0, 67108862, 0), - u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), - u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), - u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0), - u32x8::new( 0, 134217726, 0, 67108862, 134217726, 0, 67108862, 0) -]); +use backend::avx2::constants::{P_TIMES_2_LO, P_TIMES_2_HI, P_TIMES_16_LO, P_TIMES_16_HI}; /// A vector of four `FieldElements`, implemented using AVX2. #[derive(Clone, Copy, Debug)]