From 3a27994091d6d5271d804a047101ff024b2684f1 Mon Sep 17 00:00:00 2001 From: gered Date: Wed, 26 Apr 2023 18:29:02 -0400 Subject: [PATCH] add simd f32x4 nearly_equal helper function --- ggdt/src/math/mod.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ggdt/src/math/mod.rs b/ggdt/src/math/mod.rs index 6e91b1b..717eb8c 100644 --- a/ggdt/src/math/mod.rs +++ b/ggdt/src/math/mod.rs @@ -1,4 +1,6 @@ use std::ops::{Add, Div, Mul, Sub}; +use std::simd; +use std::simd::{SimdFloat, SimdPartialOrd}; mod circle; mod matrix3x3; @@ -47,6 +49,11 @@ pub fn nearly_equal(a: f32, b: f32, epsilon: f32) -> bool { a == b || (a - b).abs() <= epsilon } +#[inline] +pub fn nearly_equal_simd(a: simd::f32x4, b: simd::f32x4, epsilon: f32) -> simd::mask32x4 { + (a - b).abs().simd_le(simd::f32x4::splat(epsilon)) +} + /// Linearly interpolates between two values. /// /// # Arguments @@ -211,6 +218,34 @@ mod tests { assert!(!nearly_equal(1.0001, 1.0005, 0.0001)); } + #[test] + pub fn test_nearly_equal_simd() { + assert_eq!( + simd::mask32x4::from_array([true, true, true, true]), + nearly_equal_simd( + simd::f32x4::from_array([1.0, 2.0, 3.0, 4.0]), + simd::f32x4::from_array([1.0, 2.0, 3.0, 4.0]), + 0.1 + ) + ); + assert_eq!( + simd::mask32x4::from_array([true, true, false, false]), + nearly_equal_simd( + simd::f32x4::from_array([1.0, 1.95, 3.2, 3.7]), + simd::f32x4::from_array([1.0, 2.0, 3.0, 4.0]), + 0.1 + ) + ); + assert_eq!( + simd::mask32x4::from_array([false, false, false, false]), + nearly_equal_simd( + simd::f32x4::from_array([1.0002, 2.0003, 2.9997, 4.00015]), + simd::f32x4::from_array([1.0, 2.0, 3.0, 4.0]), + 0.0001 + ) + ); + } + #[test] pub fn test_lerp() { assert!(nearly_equal(15.0, lerp(10.0, 20.0, 0.5), 0.0001));