use crate::kernel::proven_checks::{check_elem_multiple, check_equal, check_row_span};
pub mod bytes {
use super::*;
pub fn xor_neon(_proof: crate::kernel::NeonToken, dst: &mut [u8], src: &[u8]) {
check_equal("xor_neon", "dst", dst.len(), "src", src.len());
super::super::xor_neon(dst, src);
}
pub fn xor_rows_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
src: &[u8],
row_len: usize,
) {
check_equal("xor_rows_neon", "dst", dst.len(), "src", src.len());
assert_ne!(row_len, 0, "xor_rows_neon: row length must be nonzero");
assert_eq!(
dst.len() % row_len,
0,
"xor_rows_neon: partial trailing row"
);
super::super::xor_rows_neon(dst, src, row_len);
}
}
pub mod gf8 {
use super::super::gf8 as selected;
use super::*;
use crate::gf8b::Elem;
use crate::kernel::tables::ScaleTable;
pub fn mul_add_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
table: &ScaleTable,
src: &[u8],
) {
check_equal("gf8::mul_add_neon", "dst", dst.len(), "src", src.len());
selected::mul_add_neon(dst, table, src);
}
pub fn mul_assign_neon(_proof: crate::kernel::NeonToken, dst: &mut [u8], table: &ScaleTable) {
selected::mul_assign_neon(dst, table);
}
pub fn mul_into_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
table: &ScaleTable,
src: &[u8],
) {
check_equal("gf8::mul_into_neon", "dst", dst.len(), "src", src.len());
selected::mul_into_neon(dst, table, src);
}
pub fn scatter_neon(
_proof: crate::kernel::NeonToken,
rows: &mut [u8],
row_len: usize,
coeffs: &[Elem],
src: &[u8],
) {
check_equal("gf8::scatter_neon", "row_len", row_len, "src", src.len());
check_row_span("gf8::scatter_neon", rows.len(), row_len, coeffs.len());
if row_len == 0 || coeffs.is_empty() {
return;
}
selected::scatter_neon(rows, row_len, coeffs, src);
}
pub fn gather_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
coeffs: &[Elem],
srcs: &[&[u8]],
) {
check_equal(
"gf8::gather_neon",
"coefficients",
coeffs.len(),
"sources",
srcs.len(),
);
for (index, &src) in srcs.iter().enumerate() {
check_equal(
"gf8::gather_neon",
"dst",
dst.len(),
format_args!("source {index}"),
src.len(),
);
}
if dst.is_empty() || srcs.is_empty() {
return;
}
selected::gather_neon(dst, coeffs, srcs);
}
pub fn matrix_neon(
_proof: crate::kernel::NeonToken,
rows: &mut [u8],
row_len: usize,
nrows: usize,
terms: &[(&[Elem], &[u8])],
) {
check_row_span("gf8::matrix_neon", rows.len(), row_len, nrows);
terms_geometry("gf8::matrix_neon", row_len, nrows, terms);
if row_len == 0 || nrows == 0 || terms.is_empty() {
return;
}
selected::matrix_neon(rows, row_len, nrows, terms);
}
pub fn elementwise_pmull(
_proof: crate::kernel::NeonAesToken,
dst: &mut [u8],
a: &[u8],
b: &[u8],
) {
check_equal("gf8::elementwise_pmull", "dst", dst.len(), "a", a.len());
check_equal("gf8::elementwise_pmull", "dst", dst.len(), "b", b.len());
selected::elementwise_pmull(dst, a, b);
}
pub fn elementwise_neon(_proof: crate::kernel::NeonToken, dst: &mut [u8], a: &[u8], b: &[u8]) {
check_equal("gf8::elementwise_neon", "dst", dst.len(), "a", a.len());
check_equal("gf8::elementwise_neon", "dst", dst.len(), "b", b.len());
selected::elementwise_neon(dst, a, b);
}
}
pub mod gf16 {
use super::super::gf16 as selected;
use super::*;
use crate::gf16::Elem;
use crate::kernel::tables::TowerTables;
pub fn mul_add_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
tables: &TowerTables,
src: &[u8],
) {
check_equal("gf16::mul_add_neon", "dst", dst.len(), "src", src.len());
check_elem_multiple("gf16::mul_add_neon", dst.len(), 2);
selected::mul_add_neon(dst, tables, src);
}
pub fn mul_assign_neon(_proof: crate::kernel::NeonToken, dst: &mut [u8], tables: &TowerTables) {
check_elem_multiple("gf16::mul_assign_neon", dst.len(), 2);
selected::mul_assign_neon(dst, tables);
}
pub fn mul_into_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
tables: &TowerTables,
src: &[u8],
) {
check_equal("gf16::mul_into_neon", "dst", dst.len(), "src", src.len());
check_elem_multiple("gf16::mul_into_neon", dst.len(), 2);
selected::mul_into_neon(dst, tables, src);
}
pub fn scatter_neon(
_proof: crate::kernel::NeonToken,
rows: &mut [u8],
row_len: usize,
coeffs: &[Elem],
src: &[u8],
) {
check_equal("gf16::scatter_neon", "row_len", row_len, "src", src.len());
check_elem_multiple("gf16::scatter_neon", row_len, 2);
check_row_span("gf16::scatter_neon", rows.len(), row_len, coeffs.len());
if row_len == 0 || coeffs.is_empty() {
return;
}
selected::scatter_neon(rows, row_len, coeffs, src);
}
pub fn gather_neon(
_proof: crate::kernel::NeonToken,
dst: &mut [u8],
coeffs: &[Elem],
srcs: &[&[u8]],
) {
check_equal(
"gf16::gather_neon",
"coefficients",
coeffs.len(),
"sources",
srcs.len(),
);
check_elem_multiple("gf16::gather_neon", dst.len(), 2);
for (index, &src) in srcs.iter().enumerate() {
check_equal(
"gf16::gather_neon",
"dst",
dst.len(),
format_args!("source {index}"),
src.len(),
);
}
if dst.is_empty() || srcs.is_empty() {
return;
}
selected::gather_neon(dst, coeffs, srcs);
}
pub fn matrix_neon(
_proof: crate::kernel::NeonToken,
rows: &mut [u8],
row_len: usize,
nrows: usize,
terms: &[(&[Elem], &[u8])],
) {
check_elem_multiple("gf16::matrix_neon", row_len, 2);
check_row_span("gf16::matrix_neon", rows.len(), row_len, nrows);
terms_geometry("gf16::matrix_neon", row_len, nrows, terms);
if row_len == 0 || nrows == 0 || terms.is_empty() {
return;
}
selected::matrix_neon(rows, row_len, nrows, terms);
}
pub fn elementwise_neon(_proof: crate::kernel::NeonToken, dst: &mut [u8], a: &[u8], b: &[u8]) {
check_equal("gf16::elementwise_neon", "dst", dst.len(), "a", a.len());
check_equal("gf16::elementwise_neon", "dst", dst.len(), "b", b.len());
check_elem_multiple("gf16::elementwise_neon", dst.len(), 2);
selected::elementwise_neon(dst, a, b);
}
}
fn terms_geometry<E>(name: &str, row_len: usize, nrows: usize, terms: &[(&[E], &[u8])]) {
for (t, &(coeffs, src)) in terms.iter().enumerate() {
check_equal(
name,
format_args!("term {t} coefficients"),
coeffs.len(),
"rows",
nrows,
);
check_equal(
name,
format_args!("term {t} source"),
src.len(),
"row_len",
row_len,
);
}
}