mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 16:23:12 +00:00
Silence Poseidon warnings for ARM targets
This commit is contained in:
parent
5b8740a729
commit
bd3834c403
@ -4,8 +4,8 @@
|
||||
//! `poseidon_constants.sage` script in the `mir-protocol/hash-constants`
|
||||
//! repository.
|
||||
|
||||
#[cfg(not(all(target_arch = "aarch64", target_feature = "neon")))]
|
||||
use plonky2_field::types::Field;
|
||||
use unroll::unroll_for_loops;
|
||||
|
||||
use crate::field::goldilocks_field::GoldilocksField;
|
||||
use crate::hash::poseidon::{Poseidon, N_PARTIAL_ROUNDS};
|
||||
@ -214,9 +214,9 @@ impl Poseidon for GoldilocksField {
|
||||
0xdcedab70f40718ba, 0xe796d293a47a64cb, 0x80772dc2645b280b, ],
|
||||
];
|
||||
|
||||
#[cfg(target_arch="x86_64")]
|
||||
#[cfg(not(all(target_arch = "aarch64", target_feature = "neon")))]
|
||||
#[inline(always)]
|
||||
#[unroll_for_loops]
|
||||
#[unroll::unroll_for_loops]
|
||||
fn mds_layer(state: &[Self; 12]) -> [Self; 12] {
|
||||
let mut result = [GoldilocksField::ZERO; 12];
|
||||
|
||||
@ -231,8 +231,8 @@ impl Poseidon for GoldilocksField {
|
||||
state_l[r] = (s as u32) as u64;
|
||||
}
|
||||
|
||||
let state_h = mds_multiply_freq(state_h);
|
||||
let state_l = mds_multiply_freq(state_l);
|
||||
let state_h = poseidon12_mds::mds_multiply_freq(state_h);
|
||||
let state_l = poseidon12_mds::mds_multiply_freq(state_l);
|
||||
|
||||
for r in 0..12 {
|
||||
let s = state_l[r] as u128 + ((state_h[r] as u128) << 32);
|
||||
@ -307,14 +307,15 @@ impl Poseidon for GoldilocksField {
|
||||
// MDS layer helper methods
|
||||
// The following code has been adapted from winterfell/crypto/src/hash/mds/mds_f64_12x12.rs
|
||||
// located at https://github.com/facebook/winterfell.
|
||||
|
||||
#[cfg(not(all(target_arch = "aarch64", target_feature = "neon")))]
|
||||
mod poseidon12_mds {
|
||||
const MDS_FREQ_BLOCK_ONE: [i64; 3] = [16, 32, 16];
|
||||
const MDS_FREQ_BLOCK_TWO: [(i64, i64); 3] = [(2, -1), (-4, 1), (16, 1)];
|
||||
const MDS_FREQ_BLOCK_THREE: [i64; 3] = [-1, -8, 2];
|
||||
|
||||
/// Split 3 x 4 FFT-based MDS vector-multiplication with the Poseidon circulant MDS matrix.
|
||||
#[inline(always)]
|
||||
fn mds_multiply_freq(state: [u64; 12]) -> [u64; 12] {
|
||||
pub(crate) fn mds_multiply_freq(state: [u64; 12]) -> [u64; 12] {
|
||||
let [s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11] = state;
|
||||
|
||||
let (u0, u1, u2) = fft4_real([s0, s3, s6, s9]);
|
||||
@ -341,45 +342,6 @@ fn mds_multiply_freq(state: [u64; 12]) -> [u64; 12] {
|
||||
[s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11]
|
||||
}
|
||||
|
||||
/// Real 2-FFT over u64 integers.
|
||||
#[inline(always)]
|
||||
fn fft2_real(x: [u64; 2]) -> [i64; 2] {
|
||||
[(x[0] as i64 + x[1] as i64), (x[0] as i64 - x[1] as i64)]
|
||||
}
|
||||
|
||||
/// Real 2-iFFT over u64 integers.
|
||||
/// Division by two to complete the inverse FFT is not performed here.
|
||||
#[inline(always)]
|
||||
fn ifft2_real_unreduced(y: [i64; 2]) -> [u64; 2] {
|
||||
[(y[0] + y[1]) as u64, (y[0] - y[1]) as u64]
|
||||
}
|
||||
|
||||
/// Real 4-FFT over u64 integers.
|
||||
#[inline(always)]
|
||||
fn fft4_real(x: [u64; 4]) -> (i64, (i64, i64), i64) {
|
||||
let [z0, z2] = fft2_real([x[0], x[2]]);
|
||||
let [z1, z3] = fft2_real([x[1], x[3]]);
|
||||
let y0 = z0 + z1;
|
||||
let y1 = (z2, -z3);
|
||||
let y2 = z0 - z1;
|
||||
(y0, y1, y2)
|
||||
}
|
||||
|
||||
/// Real 4-iFFT over u64 integers.
|
||||
/// Division by four to complete the inverse FFT is not performed here.
|
||||
#[inline(always)]
|
||||
fn ifft4_real_unreduced(y: (i64, (i64, i64), i64)) -> [u64; 4] {
|
||||
let z0 = y.0 + y.2;
|
||||
let z1 = y.0 - y.2;
|
||||
let z2 = y.1 .0;
|
||||
let z3 = -y.1 .1;
|
||||
|
||||
let [x0, x2] = ifft2_real_unreduced([z0, z2]);
|
||||
let [x1, x3] = ifft2_real_unreduced([z1, z3]);
|
||||
|
||||
[x0, x1, x2, x3]
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn block1(x: [i64; 3], y: [i64; 3]) -> [i64; 3] {
|
||||
let [x0, x1, x2] = x;
|
||||
@ -440,6 +402,46 @@ fn block3(x: [i64; 3], y: [i64; 3]) -> [i64; 3] {
|
||||
[z0, z1, z2]
|
||||
}
|
||||
|
||||
/// Real 2-FFT over u64 integers.
|
||||
#[inline(always)]
|
||||
pub(crate) fn fft2_real(x: [u64; 2]) -> [i64; 2] {
|
||||
[(x[0] as i64 + x[1] as i64), (x[0] as i64 - x[1] as i64)]
|
||||
}
|
||||
|
||||
/// Real 2-iFFT over u64 integers.
|
||||
/// Division by two to complete the inverse FFT is not performed here.
|
||||
#[inline(always)]
|
||||
pub(crate) fn ifft2_real_unreduced(y: [i64; 2]) -> [u64; 2] {
|
||||
[(y[0] + y[1]) as u64, (y[0] - y[1]) as u64]
|
||||
}
|
||||
|
||||
/// Real 4-FFT over u64 integers.
|
||||
#[inline(always)]
|
||||
pub(crate) fn fft4_real(x: [u64; 4]) -> (i64, (i64, i64), i64) {
|
||||
let [z0, z2] = fft2_real([x[0], x[2]]);
|
||||
let [z1, z3] = fft2_real([x[1], x[3]]);
|
||||
let y0 = z0 + z1;
|
||||
let y1 = (z2, -z3);
|
||||
let y2 = z0 - z1;
|
||||
(y0, y1, y2)
|
||||
}
|
||||
|
||||
/// Real 4-iFFT over u64 integers.
|
||||
/// Division by four to complete the inverse FFT is not performed here.
|
||||
#[inline(always)]
|
||||
pub(crate) fn ifft4_real_unreduced(y: (i64, (i64, i64), i64)) -> [u64; 4] {
|
||||
let z0 = y.0 + y.2;
|
||||
let z1 = y.0 - y.2;
|
||||
let z2 = y.1 .0;
|
||||
let z3 = -y.1 .1;
|
||||
|
||||
let [x0, x2] = ifft2_real_unreduced([z0, z2]);
|
||||
let [x1, x3] = ifft2_real_unreduced([z1, z3]);
|
||||
|
||||
[x0, x1, x2, x3]
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::field::goldilocks_field::GoldilocksField as F;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user