1use 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")))] #[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);