zeroize/
x86.rs

1//! [`Zeroize`] impls for x86 SIMD registers
2
3use crate::{atomic_fence, volatile_write, Zeroize};
4
5#[cfg(target_arch = "x86")]
6use core::arch::x86::*;
7
8#[cfg(target_arch = "x86_64")]
9use core::arch::x86_64::*;
10
11macro_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")]
25impl_zeroize_for_simd_register!(__m128, "sse", _mm_setzero_ps);
26
27#[cfg(target_feature = "sse2")]
28impl_zeroize_for_simd_register!(__m128d, "sse2", _mm_setzero_pd);
29
30#[cfg(target_feature = "sse2")]
31impl_zeroize_for_simd_register!(__m128i, "sse2", _mm_setzero_si128);
32
33#[cfg(target_feature = "avx")]
34impl_zeroize_for_simd_register!(__m256, "avx", _mm256_setzero_ps);
35
36#[cfg(target_feature = "avx")]
37impl_zeroize_for_simd_register!(__m256d, "avx", _mm256_setzero_pd);
38
39#[cfg(target_feature = "avx")]
40impl_zeroize_for_simd_register!(__m256i, "avx", _mm256_setzero_si256);