diff --git a/Cargo.toml b/Cargo.toml index 6b1429f..620104f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,8 +53,12 @@ blake2b_simd = { version = "1", optional = true, default-features = false } # sqrt-table dependencies lazy_static = { version = "1.4.0", optional = true } +# gpu dependencies +ec-gpu = { version = "0.1.0", optional = true } + [features] default = ["bits", "sqrt-table"] alloc = ["group/alloc", "blake2b_simd"] bits = ["ff/bits"] +gpu = ["alloc", "ec-gpu"] sqrt-table = ["alloc", "lazy_static"] diff --git a/src/fields.rs b/src/fields.rs index e19389e..70ce865 100644 --- a/src/fields.rs +++ b/src/fields.rs @@ -6,3 +6,11 @@ mod fq; pub use fp::*; pub use fq::*; + +#[cfg(feature = "gpu")] +fn u64_to_u32(limbs: &[u64]) -> alloc::vec::Vec { + limbs + .iter() + .flat_map(|limb| alloc::vec![(limb & 0xFFFF_FFFF) as u32, (limb >> 32) as u32]) + .collect() +} diff --git a/src/fields/fp.rs b/src/fields/fp.rs index 17be5d6..50dba17 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -770,6 +770,21 @@ impl FieldExt for Fp { } } +#[cfg(feature = "gpu")] +impl ec_gpu::GpuField for Fp { + fn one() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&R.0[..]) + } + + fn r2() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&R2.0[..]) + } + + fn modulus() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&MODULUS.0[..]) + } +} + #[cfg(test)] use ff::Field; diff --git a/src/fields/fq.rs b/src/fields/fq.rs index 618bf54..d01a609 100644 --- a/src/fields/fq.rs +++ b/src/fields/fq.rs @@ -769,6 +769,21 @@ impl FieldExt for Fq { } } +#[cfg(feature = "gpu")] +impl ec_gpu::GpuField for Fq { + fn one() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&R.0[..]) + } + + fn r2() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&R2.0[..]) + } + + fn modulus() -> alloc::vec::Vec { + crate::fields::u64_to_u32(&MODULUS.0[..]) + } +} + #[cfg(test)] use ff::Field;