1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
//! [`Zeroize`] impls for ARM64 SIMD registers.
//!
//! Gated behind the `aarch64` feature: MSRV 1.59
//! (the overall crate is MSRV 1.51)
use crate::{atomic_fence, volatile_write, Zeroize};
use core::arch::aarch64::*;
macro_rules! impl_zeroize_for_simd_register {
($(($type:ty, $vdupq:ident)),+) => {
$(
#[cfg_attr(docsrs, doc(cfg(target_arch = "aarch64")))]
#[cfg_attr(docsrs, doc(cfg(target_feature = "neon")))]
impl Zeroize for $type {
fn zeroize(&mut self) {
volatile_write(self, unsafe { $vdupq(0) });
atomic_fence();
}
}
)+
};
}
// TODO(tarcieri): other NEON register types?
impl_zeroize_for_simd_register! {
(uint8x8_t, vdup_n_u8),
(uint8x16_t, vdupq_n_u8),
(uint16x4_t, vdup_n_u16),
(uint16x8_t, vdupq_n_u16),
(uint32x2_t, vdup_n_u32),
(uint32x4_t, vdupq_n_u32),
(uint64x1_t, vdup_n_u64),
(uint64x2_t, vdupq_n_u64)
}
|