Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
016c05b
linalg: add fallible lower-triangular AAT kernel
SeliMeli Jul 28, 2026
3a17722
pipnn: add dispatched numerical kernels
SeliMeli Jul 28, 2026
b5ae8cf
pipnn: benchmark and exercise numerical kernels
SeliMeli Jul 28, 2026
7989964
pipnn: harden kernel coverage and benchmarks
SeliMeli Jul 28, 2026
07cff8c
fix(pipnn): accept finite maximum distances
SeliMeli Jul 29, 2026
2efc9f6
refactor(pipnn): make kernels architecture-neutral
SeliMeli Jul 29, 2026
c3c1f72
fix(pipnn): preserve NaN distances across SIMD backends
SeliMeli Jul 30, 2026
6fef417
docs(pipnn): explain numerical kernel invariants
SeliMeli Jul 31, 2026
ce0293f
test(pipnn): name SIMD metric boundary matrices
SeliMeli Jul 31, 2026
c73fe3b
fix(pipnn): preserve dispatched kernel semantics
SeliMeli Aug 3, 2026
27ff456
style(wide): format array trait bounds
SeliMeli Aug 3, 2026
16f733d
fix(pipnn): address kernel review feedback
SeliMeli Aug 3, 2026
ac29cb8
refactor(pipnn)!: prepare kernel dispatch
SeliMeli Aug 3, 2026
8e63abb
docs(pipnn): describe full crate scope
SeliMeli Aug 3, 2026
045f012
docs(pipnn): map dispatch hot paths
SeliMeli Aug 3, 2026
0d2a8d9
test(pipnn): confine traversal references
SeliMeli Aug 3, 2026
6fef94d
refactor(pipnn): name metric visitor by action
SeliMeli Aug 3, 2026
f97ca93
refactor(pipnn): carry dynamic leaf width
SeliMeli Aug 3, 2026
47dcb74
refactor(pipnn)!: clarify point and neighbor roles
SeliMeli Aug 3, 2026
844a50c
docs(pipnn): explain kernel pipeline
SeliMeli Aug 3, 2026
36c1763
docs(pipnn): state cosine threshold
SeliMeli Aug 3, 2026
161965f
refactor(pipnn): move kernels into diskann graph
SeliMeli Aug 5, 2026
e8cb9c7
test(pipnn): document fixture panic policy
SeliMeli Aug 5, 2026
c0d15a2
ci(pipnn): cover the in-crate feature
SeliMeli Aug 5, 2026
f671b78
bench(pipnn): add IAI kernel microbenchmarks
SeliMeli Aug 5, 2026
32f323c
fix(ci): use workspace feature name for pipnn
SeliMeli Aug 6, 2026
0f31011
fix(ci): validate every stacked layer
SeliMeli Aug 6, 2026
80c9f33
ci(pipnn): run IAI and ARM feature gates
SeliMeli Aug 6, 2026
0ce4ef3
test(pipnn): keep regression tooling local
SeliMeli Aug 6, 2026
ace78ab
ci(pipnn): validate numerical feature
SeliMeli Aug 6, 2026
699c601
fix(pipnn): enforce SIMD safety invariants
SeliMeli Aug 7, 2026
b01f0b9
refactor(pipnn): pass leaf matrices directly
SeliMeli Aug 7, 2026
a21ee9c
refactor(pipnn): cap leaf kernel at k three
SeliMeli Aug 7, 2026
4182625
fix(pipnn): return errors for invalid leaf widths
SeliMeli Aug 7, 2026
66f51bf
fix(utils): reject overflowing matrix shapes
SeliMeli Aug 7, 2026
ae89cf7
refactor(pipnn): trust validated matrix views
SeliMeli Aug 7, 2026
af4470b
perf(pipnn): retain measured fixed-k insertion
SeliMeli Aug 7, 2026
f20581a
docs(pipnn): remove stale dynamic-k reference
SeliMeli Aug 7, 2026
0826436
refactor(pipnn): constrain SIMD lanes locally
SeliMeli Aug 7, 2026
d2beeee
refactor(pipnn): remove stored kernel pointers
SeliMeli Aug 7, 2026
c3bf708
test(pipnn): cover runtime partition fanout
SeliMeli Aug 7, 2026
0a16a62
refactor(pipnn): make kernels generic-only
SeliMeli Aug 7, 2026
cfdfc3c
refactor(pipnn): keep numerical kernels private
SeliMeli Aug 7, 2026
0e3e055
refactor(pipnn): use default kernel workspaces
SeliMeli Aug 7, 2026
9a08dc2
docs(pipnn): align kernel comments with implementation
SeliMeli Aug 7, 2026
8499c7d
docs(pipnn): remove kernel performance notes
SeliMeli Aug 7, 2026
dc06de7
refactor(pipnn): report partition underfill locally
SeliMeli Aug 7, 2026
0db9350
refactor(pipnn): remove unused leaf output helper
SeliMeli Aug 7, 2026
dfc7914
refactor(pipnn): remove kernel assertions
SeliMeli Aug 7, 2026
efa4ea6
docs(pipnn): state partition row contract
SeliMeli Aug 7, 2026
89a750c
refactor(pipnn): name kernel responsibilities
SeliMeli Aug 7, 2026
a6729df
docs(pipnn): define partition leader semantics
SeliMeli Aug 7, 2026
2c15a65
docs(pipnn): state norm conversion behavior
SeliMeli Aug 7, 2026
22787fd
refactor(pipnn): name fixed-width leaf scan
SeliMeli Aug 7, 2026
64963c5
docs(pipnn): remove type-restatement comments
SeliMeli Aug 7, 2026
c069460
docs(pipnn): describe leaf insertion by domain role
SeliMeli Aug 7, 2026
185db44
refactor(pipnn): name kernel test helpers
SeliMeli Aug 7, 2026
578ab9f
refactor(pipnn): inline fixed-width leaf dispatch
SeliMeli Aug 10, 2026
3f54a31
refactor(pipnn): inline leader ID publication
SeliMeli Aug 10, 2026
70ce8e2
refactor(matrix): preserve constructor behavior
SeliMeli Aug 10, 2026
47c2089
refactor(pipnn): split stage metric contracts
SeliMeli Aug 10, 2026
44572dd
perf(pipnn): specialize stage norm handling
SeliMeli Aug 10, 2026
6bc1a96
docs(pipnn): use active metric comments
SeliMeli Aug 10, 2026
640cd7d
test(pipnn): use norm-specific terminology
SeliMeli Aug 10, 2026
552c481
perf(pipnn): bound leaf SIMD prefix once
SeliMeli Aug 10, 2026
9fa980e
refactor(pipnn): remove metric tag indirection
SeliMeli Aug 10, 2026
b42285b
docs(pipnn): keep metric comments factual
SeliMeli Aug 10, 2026
2592d70
refactor(pipnn): pass prepared norms to kernels
SeliMeli Aug 11, 2026
ac6e174
perf(pipnn): specialize prepared norm layouts
SeliMeli Aug 11, 2026
6c3d912
perf(pipnn): reuse each leaf source norm
SeliMeli Aug 11, 2026
3ff5e3c
refactor(pipnn): name prepared norm layouts
SeliMeli Aug 11, 2026
057873b
refactor(pipnn): make metric types prepare norms
SeliMeli Aug 11, 2026
c06d42c
refactor(pipnn): move norm policy into metric types
SeliMeli Aug 11, 2026
bb25e6f
test(utils): cover zero-wrapping matrix area
SeliMeli Aug 11, 2026
45364af
refactor(pipnn): give metrics exact ranking inputs
SeliMeli Aug 11, 2026
8913a72
refactor(pipnn): deepen numerical kernels
SeliMeli Aug 12, 2026
01e5148
fix(pipnn): mark unrankable kernel slots
SeliMeli Aug 18, 2026
0f1e47b
refactor(pipnn): centralize SIMD schema
SeliMeli Aug 20, 2026
286f558
refactor(pipnn): specialize sorted insertion
SeliMeli Aug 21, 2026
1fb768b
test(pipnn): clarify numerical contracts
SeliMeli Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,8 @@ jobs:
--package diskann-wide \
--package diskann-vector \
--package diskann-quantization \
--package diskann \
--features pipnn \
-- --skip compile_tests \
--skip pivots::tests::run_test_happy_path

Expand Down Expand Up @@ -416,6 +418,8 @@ jobs:
--package diskann-wide \
--package diskann-vector \
--package diskann-quantization \
--package diskann \
--features pipnn \
-- --skip compile_tests

test-workspace:
Expand Down Expand Up @@ -459,6 +463,7 @@ jobs:
os:
- windows-latest
- ubuntu-latest
- ubuntu-24.04-arm

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions diskann-linalg/src/faer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,33 @@ pub(super) fn sgemm_impl(
faer::linalg::matmul::matmul(c, beta, a, b, alpha, Par::Seq)
}

/// Compute the lower triangle of `A * Aᵀ` with Faer.
///
/// Leaf selection reads each symmetric pair once. It does not read the upper
/// triangle. `BlockStructure::TriangularLower` prevents writes to that triangle.
///
/// `sgemm_aat_lower` checks both slice lengths and both size products. Therefore,
/// the Faer matrix views stay inside their backing slices.
pub(super) fn sgemm_aat_lower_impl(m: usize, k: usize, a: &[f32], c: &mut [f32]) {
use faer::linalg::matmul::triangular::{matmul, BlockStructure};

let a = faer::mat::MatRef::from_row_major_slice(a, m, k);
let at = a.transpose();
let c = faer::mat::MatMut::from_row_major_slice_mut(c, m, m);

matmul(
c,
BlockStructure::TriangularLower,
faer::Accum::Replace,
a,
BlockStructure::Rectangular,
at,
BlockStructure::Rectangular,
1.0,
Par::Seq,
);
}

/// See the documentation for `svd_into`.
///
/// The implementation may assume the the specified invariants hold for the sizes of the
Expand Down
202 changes: 157 additions & 45 deletions diskann-linalg/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,30 @@ impl fmt::Display for SgemmError {

impl std::error::Error for SgemmError {}

fn check_matrix(
matrix_name: MatrixName,
actual_len: usize,
rows: usize,
cols: usize,
) -> Result<(), SgemmError> {
let expected_len = rows
.checked_mul(cols)
.ok_or(SgemmError::DimensionOverflow {
matrix_name,
rows,
cols,
})?;
if actual_len != expected_len {
return Err(SgemmError::InvalidMatrixDimensions {
matrix_name,
expected_rows: rows,
expected_cols: cols,
actual_len,
});
}
Ok(())
}

// Make the reference implementation available for internal testing.
#[cfg(test)]
mod reference;
Expand Down Expand Up @@ -156,57 +180,33 @@ pub fn sgemm(
beta: Option<f32>,
c: &mut [f32],
) -> Result<(), SgemmError> {
// Check size requirements with overflow protection.
let expected_a_len = m.checked_mul(k).ok_or(SgemmError::DimensionOverflow {
matrix_name: MatrixName::A,
rows: m,
cols: k,
})?;

if a.len() != expected_a_len {
return Err(SgemmError::InvalidMatrixDimensions {
matrix_name: MatrixName::A,
expected_rows: m,
expected_cols: k,
actual_len: a.len(),
});
}

let expected_b_len = k.checked_mul(n).ok_or(SgemmError::DimensionOverflow {
matrix_name: MatrixName::B,
rows: k,
cols: n,
})?;

if b.len() != expected_b_len {
return Err(SgemmError::InvalidMatrixDimensions {
matrix_name: MatrixName::B,
expected_rows: k,
expected_cols: n,
actual_len: b.len(),
});
}

let expected_c_len = m.checked_mul(n).ok_or(SgemmError::DimensionOverflow {
matrix_name: MatrixName::C,
rows: m,
cols: n,
})?;

if c.len() != expected_c_len {
return Err(SgemmError::InvalidMatrixDimensions {
matrix_name: MatrixName::C,
expected_rows: m,
expected_cols: n,
actual_len: c.len(),
});
}
check_matrix(MatrixName::A, a.len(), m, k)?;
check_matrix(MatrixName::B, b.len(), k, n)?;
check_matrix(MatrixName::C, c.len(), m, n)?;

// Invoke the actual implementation.
sgemm_impl(atranspose, btranspose, m, n, k, alpha, a, b, beta, c);
Ok(())
}

/// Compute the lower triangle of $C = A A^\mathsf{T}$.
///
/// `A` is a dense row-major $m \times k$ matrix. The function overwrites the
/// lower triangle of `C`, including its diagonal. It does not change the upper
/// triangle.
///
/// # Errors
///
/// Returns an error if a size product overflows. It also returns an error if a
/// slice length does not match its declared matrix shape.
pub fn sgemm_aat_lower(m: usize, k: usize, a: &[f32], c: &mut [f32]) -> Result<(), SgemmError> {
check_matrix(MatrixName::A, a.len(), m, k)?;
check_matrix(MatrixName::C, c.len(), m, m)?;

faer::sgemm_aat_lower_impl(m, k, a, c);
Ok(())
}

/// Compute the SVD of the provided matrix implicit row-major matrix `data`.
///
/// * `m`: The number of rows in `a`.
Expand Down Expand Up @@ -690,3 +690,115 @@ mod tests {
}
}
}
#[cfg(test)]
#[allow(
clippy::expect_used,
clippy::unwrap_used,
reason = "deterministic test fixture construction must abort on invalid setup"
)]
mod sgemm_aat_lower_tests {
use super::{sgemm_aat_lower, MatrixName, SgemmError};

#[test]
fn computes_lower_triangle_and_preserves_upper_triangle() {
#[rustfmt::skip]
let a = [
1.0, 2.0,
3.0, 4.0,
5.0, 6.0,
];
let untouched = -123.0;
let mut c = [untouched; 9];

sgemm_aat_lower(3, 2, &a, &mut c).unwrap();

#[rustfmt::skip]
assert_eq!(c, [
5.0, untouched, untouched,
11.0, 25.0, untouched,
17.0, 39.0, 61.0,
]);
}

#[test]
fn accepts_a_matrix_with_no_rows() {
sgemm_aat_lower(0, 3, &[], &mut []).unwrap();
}

#[test]
fn zero_inner_dimension_zeros_only_the_lower_triangle() {
let untouched = -123.0;
let mut c = [untouched; 9];

sgemm_aat_lower(3, 0, &[], &mut c).unwrap();

#[rustfmt::skip]
assert_eq!(c, [
0.0, untouched, untouched,
0.0, 0.0, untouched,
0.0, 0.0, 0.0,
]);
}

#[test]
fn rejects_invalid_input_dimensions() {
let mut c = [0.0; 4];

let error = sgemm_aat_lower(2, 2, &[0.0; 3], &mut c).unwrap_err();

assert_eq!(
error,
SgemmError::InvalidMatrixDimensions {
matrix_name: MatrixName::A,
expected_rows: 2,
expected_cols: 2,
actual_len: 3,
}
);
}

#[test]
fn rejects_invalid_output_dimensions() {
let mut c = [0.0; 3];

let error = sgemm_aat_lower(2, 2, &[0.0; 4], &mut c).unwrap_err();

assert_eq!(
error,
SgemmError::InvalidMatrixDimensions {
matrix_name: MatrixName::C,
expected_rows: 2,
expected_cols: 2,
actual_len: 3,
}
);
}

#[test]
fn rejects_input_size_overflow() {
let error = sgemm_aat_lower(usize::MAX, 2, &[], &mut []).unwrap_err();

assert_eq!(
error,
SgemmError::DimensionOverflow {
matrix_name: MatrixName::A,
rows: usize::MAX,
cols: 2,
}
);
}

#[test]
fn rejects_output_size_overflow() {
let error = sgemm_aat_lower(usize::MAX, 0, &[], &mut []).unwrap_err();

assert_eq!(
error,
SgemmError::DimensionOverflow {
matrix_name: MatrixName::C,
rows: usize::MAX,
cols: usize::MAX,
}
);
}
}
4 changes: 3 additions & 1 deletion diskann-utils/src/views.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ where
/// The length of the base must be equal to `nrows * ncols`.
pub fn try_from(data: T, nrows: usize, ncols: usize) -> Result<Self, TryFromError<T>> {
let len = data.as_slice().len();
if len != nrows * ncols {
if nrows.checked_mul(ncols) != Some(len) {
Err(TryFromError { data, nrows, ncols })
} else {
Ok(Self { data, nrows, ncols })
Expand Down Expand Up @@ -1053,6 +1053,8 @@ mod tests {
m.unwrap_err().to_string(),
"tried to construct a matrix view with 5 rows and 4 columns over a slice of length 12"
);

assert!(MatrixView::try_from(&[] as &[usize], usize::MAX / 2 + 1, 2).is_err());
}

#[test]
Expand Down
2 changes: 2 additions & 0 deletions diskann-wide/src/arch/aarch64/f32x2_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ macros::aarch64_define_loadstore!(f32x2, vld1_f32, internal::load_first::f32x2,
helpers::unsafe_map_binary_op!(f32x2, std::ops::Add, add, vadd_f32, "neon");
helpers::unsafe_map_binary_op!(f32x2, std::ops::Sub, sub, vsub_f32, "neon");
helpers::unsafe_map_binary_op!(f32x2, std::ops::Mul, mul, vmul_f32, "neon");
helpers::unsafe_map_binary_op!(f32x2, std::ops::Div, div, vdiv_f32, "neon");
macros::aarch64_define_fma!(f32x2, vfma_f32);

macros::aarch64_define_cmp!(
Expand Down Expand Up @@ -90,6 +91,7 @@ mod tests {
test_utils::ops::test_add!(f32x2, 0xcd7a8fea9a3fb727, test_neon());
test_utils::ops::test_sub!(f32x2, 0x3f6562c94c923238, test_neon());
test_utils::ops::test_mul!(f32x2, 0x07e48666c0fc564c, test_neon());
test_utils::ops::test_div!(f32x2, 0xa0352efeb9bc5ca5, test_neon());
test_utils::ops::test_fma!(f32x2, 0xcfde9d031302cf2c, test_neon());

test_utils::ops::test_cmp!(f32x2, 0xc4f468b224622326, test_neon());
Expand Down
2 changes: 2 additions & 0 deletions diskann-wide/src/arch/aarch64/f32x4_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ macros::aarch64_splitjoin!(f32x4, f32x2, vget_low_f32, vget_high_f32, vcombine_f
helpers::unsafe_map_binary_op!(f32x4, std::ops::Add, add, vaddq_f32, "neon");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Sub, sub, vsubq_f32, "neon");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Mul, mul, vmulq_f32, "neon");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Div, div, vdivq_f32, "neon");
helpers::unsafe_map_unary_op!(f32x4, SIMDAbs, abs_simd, vabsq_f32, "neon");
macros::aarch64_define_fma!(f32x4, vfmaq_f32);

Expand Down Expand Up @@ -187,6 +188,7 @@ mod tests {
test_utils::ops::test_add!(f32x4, 0xcd7a8fea9a3fb727, test_neon());
test_utils::ops::test_sub!(f32x4, 0x3f6562c94c923238, test_neon());
test_utils::ops::test_mul!(f32x4, 0x07e48666c0fc564c, test_neon());
test_utils::ops::test_div!(f32x4, 0xa0352efeb9bc5ca5, test_neon());
test_utils::ops::test_fma!(f32x4, 0xcfde9d031302cf2c, test_neon());
test_utils::ops::test_abs!(f32x4, 0xb8f702ba85375041, test_neon());
test_utils::ops::test_minmax!(f32x4, 0x6d7fc8ed6d852187, test_neon());
Expand Down
1 change: 1 addition & 0 deletions diskann-wide/src/arch/x86_64/v3/f32x16_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ mod test_x86_f32 {
test_utils::ops::test_add!(f32x16, 0xa8989b97ca888d11, V3::new_checked_uncached());
test_utils::ops::test_sub!(f32x16, 0xb2554fc13fdc1182, V3::new_checked_uncached());
test_utils::ops::test_mul!(f32x16, 0x23becaa968b0cd71, V3::new_checked_uncached());
test_utils::ops::test_div!(f32x16, 0x6fd16af08fa1f498, V3::new_checked_uncached());
test_utils::ops::test_fma!(f32x16, 0x32a814070a93df4e, V3::new_checked_uncached());
test_utils::ops::test_minmax!(f32x16, 0x6d7fc8ed6d852187, V3::new_checked_uncached());
test_utils::ops::test_abs!(f32x16, 0x6799e60873a2efe2, V3::new_checked_uncached());
Expand Down
2 changes: 2 additions & 0 deletions diskann-wide/src/arch/x86_64/v3/f32x4_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ macros::x86_define_default!(f32x4, _mm_setzero_ps, "sse");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Add, add, _mm_add_ps, "sse");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Sub, sub, _mm_sub_ps, "sse");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Mul, mul, _mm_mul_ps, "sse");
helpers::unsafe_map_binary_op!(f32x4, std::ops::Div, div, _mm_div_ps, "sse");

impl f32x4 {
#[inline(always)]
Expand Down Expand Up @@ -253,6 +254,7 @@ mod test_x86_f32 {
test_utils::ops::test_add!(f32x4, 0xcd7a8fea9a3fb727, V3::new_checked_uncached());
test_utils::ops::test_sub!(f32x4, 0x3f6562c94c923238, V3::new_checked_uncached());
test_utils::ops::test_mul!(f32x4, 0x07e48666c0fc564c, V3::new_checked_uncached());
test_utils::ops::test_div!(f32x4, 0xa0352efeb9bc5ca5, V3::new_checked_uncached());
test_utils::ops::test_fma!(f32x4, 0xcfde9d031302cf2c, V3::new_checked_uncached());
test_utils::ops::test_minmax!(f32x4, 0x6d7fc8ed6d852187, V3::new_checked_uncached());
test_utils::ops::test_abs!(f32x4, 0x8e6d9944c9c43a74, V3::new_checked_uncached());
Expand Down
2 changes: 2 additions & 0 deletions diskann-wide/src/arch/x86_64/v3/f32x8_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ macros::x86_splitjoin!(f32x8, f32x4, _mm256_extractf128_ps, _mm256_set_m128, "av
helpers::unsafe_map_binary_op!(f32x8, std::ops::Add, add, _mm256_add_ps, "avx");
helpers::unsafe_map_binary_op!(f32x8, std::ops::Sub, sub, _mm256_sub_ps, "avx");
helpers::unsafe_map_binary_op!(f32x8, std::ops::Mul, mul, _mm256_mul_ps, "avx");
helpers::unsafe_map_binary_op!(f32x8, std::ops::Div, div, _mm256_div_ps, "avx");

impl f32x8 {
#[inline(always)]
Expand Down Expand Up @@ -266,6 +267,7 @@ mod test_x86_f32 {
test_utils::ops::test_add!(f32x8, 0x3824379d4a43a416, V3::new_checked_uncached());
test_utils::ops::test_sub!(f32x8, 0x548fc74c07ba425d, V3::new_checked_uncached());
test_utils::ops::test_mul!(f32x8, 0x6d340672ff91b256, V3::new_checked_uncached());
test_utils::ops::test_div!(f32x8, 0x776f54898c62dd0b, V3::new_checked_uncached());
test_utils::ops::test_fma!(f32x8, 0x5f566d8968d4d201, V3::new_checked_uncached());
test_utils::ops::test_minmax!(f32x8, 0x6d7fc8ed6d852187, V3::new_checked_uncached());
test_utils::ops::test_abs!(f32x8, 0x2a4a9651d8ebe912, V3::new_checked_uncached());
Expand Down
Loading
Loading