1 | //! RDRAND and RDSEED instructions for returning random numbers from an Intel |
2 | //! on-chip hardware random number generator which has been seeded by an |
3 | //! on-chip entropy source. |
4 | |
5 | #![allow (clippy::module_name_repetitions)] |
6 | |
7 | #[allow (improper_ctypes)] |
8 | extern "unadjusted" { |
9 | #[link_name = "llvm.x86.rdrand.64" ] |
10 | fn x86_rdrand64_step() -> (u64, i32); |
11 | #[link_name = "llvm.x86.rdseed.64" ] |
12 | fn x86_rdseed64_step() -> (u64, i32); |
13 | } |
14 | |
15 | #[cfg (test)] |
16 | use stdarch_test::assert_instr; |
17 | |
18 | /// Read a hardware generated 64-bit random value and store the result in val. |
19 | /// Returns 1 if a random value was generated, and 0 otherwise. |
20 | /// |
21 | /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_rdrand64_step) |
22 | #[inline ] |
23 | #[target_feature (enable = "rdrand" )] |
24 | #[cfg_attr (test, assert_instr(rdrand))] |
25 | #[stable (feature = "simd_x86" , since = "1.27.0" )] |
26 | pub unsafe fn _rdrand64_step(val: &mut u64) -> i32 { |
27 | let (v: u64, flag: i32) = x86_rdrand64_step(); |
28 | *val = v; |
29 | flag |
30 | } |
31 | |
32 | /// Read a 64-bit NIST SP800-90B and SP800-90C compliant random value and store |
33 | /// in val. Return 1 if a random value was generated, and 0 otherwise. |
34 | /// |
35 | /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_rdseed64_step) |
36 | #[inline ] |
37 | #[target_feature (enable = "rdseed" )] |
38 | #[cfg_attr (test, assert_instr(rdseed))] |
39 | #[stable (feature = "simd_x86" , since = "1.27.0" )] |
40 | pub unsafe fn _rdseed64_step(val: &mut u64) -> i32 { |
41 | let (v: u64, flag: i32) = x86_rdseed64_step(); |
42 | *val = v; |
43 | flag |
44 | } |
45 | |