1 //! [`Zeroize`] impls for x86 SIMD registers 2 3 use crate::{atomic_fence, volatile_write, Zeroize}; 4 5 #[cfg(target_arch = "x86")] 6 use core::arch::x86::*; 7 8 #[cfg(target_arch = "x86_64")] 9 use core::arch::x86_64::*; 10 11 macro_rules! impl_zeroize_for_simd_register { 12 ($type:ty, $feature:expr, $zero_value:ident) => { 13 #[cfg_attr(docsrs, doc(cfg(target_arch = "x86")))] // also `x86_64` 14 #[cfg_attr(docsrs, doc(cfg(target_feature = $feature)))] 15 impl Zeroize for $type { 16 fn zeroize(&mut self) { 17 volatile_write(self, unsafe { $zero_value() }); 18 atomic_fence(); 19 } 20 } 21 }; 22 } 23 24 #[cfg(target_feature = "sse")] 25 impl_zeroize_for_simd_register!(__m128, "sse", _mm_setzero_ps); 26 27 #[cfg(target_feature = "sse2")] 28 impl_zeroize_for_simd_register!(__m128d, "sse2", _mm_setzero_pd); 29 30 #[cfg(target_feature = "sse2")] 31 impl_zeroize_for_simd_register!(__m128i, "sse2", _mm_setzero_si128); 32 33 #[cfg(target_feature = "avx")] 34 impl_zeroize_for_simd_register!(__m256, "avx", _mm256_setzero_ps); 35 36 #[cfg(target_feature = "avx")] 37 impl_zeroize_for_simd_register!(__m256d, "avx", _mm256_setzero_pd); 38 39 #[cfg(target_feature = "avx")] 40 impl_zeroize_for_simd_register!(__m256i, "avx", _mm256_setzero_si256); 41