1 /*===---- rdseedintrin.h - RDSEED intrinsics -------------------------------===
2 *
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 *
7 *===-----------------------------------------------------------------------===
8 */
9
10 #ifndef __IMMINTRIN_H
11 #error "Never use <rdseedintrin.h> directly; include <immintrin.h> instead."
12 #endif
13
14 #ifndef __RDSEEDINTRIN_H
15 #define __RDSEEDINTRIN_H
16
17 /* Define the default attributes for the functions in this file. */
18 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("rdseed")))
19
20 /// Stores a hardware-generated 16-bit random value in the memory at \a __p.
21 ///
22 /// The random number generator complies with NIST SP800-90B and SP800-90C.
23 ///
24 /// \code{.operation}
25 /// IF HW_NRND_GEN.ready == 1
26 /// Store16(__p, HW_NRND_GEN.data)
27 /// result := 1
28 /// ELSE
29 /// Store16(__p, 0)
30 /// result := 0
31 /// END
32 /// \endcode
33 ///
34 /// \headerfile <immintrin.h>
35 ///
36 /// This intrinsic corresponds to the \c RDSEED instruction.
37 ///
38 /// \param __p
39 /// Pointer to memory for storing the 16-bit random number.
40 /// \returns 1 if a random number was generated, 0 if not.
41 static __inline__ int __DEFAULT_FN_ATTRS
_rdseed16_step(unsigned short * __p)42 _rdseed16_step(unsigned short *__p)
43 {
44 return (int) __builtin_ia32_rdseed16_step(__p);
45 }
46
47 /// Stores a hardware-generated 32-bit random value in the memory at \a __p.
48 ///
49 /// The random number generator complies with NIST SP800-90B and SP800-90C.
50 ///
51 /// \code{.operation}
52 /// IF HW_NRND_GEN.ready == 1
53 /// Store32(__p, HW_NRND_GEN.data)
54 /// result := 1
55 /// ELSE
56 /// Store32(__p, 0)
57 /// result := 0
58 /// END
59 /// \endcode
60 ///
61 /// \headerfile <immintrin.h>
62 ///
63 /// This intrinsic corresponds to the \c RDSEED instruction.
64 ///
65 /// \param __p
66 /// Pointer to memory for storing the 32-bit random number.
67 /// \returns 1 if a random number was generated, 0 if not.
68 static __inline__ int __DEFAULT_FN_ATTRS
_rdseed32_step(unsigned int * __p)69 _rdseed32_step(unsigned int *__p)
70 {
71 return (int) __builtin_ia32_rdseed32_step(__p);
72 }
73
74 #ifdef __x86_64__
75 /// Stores a hardware-generated 64-bit random value in the memory at \a __p.
76 ///
77 /// The random number generator complies with NIST SP800-90B and SP800-90C.
78 ///
79 /// \code{.operation}
80 /// IF HW_NRND_GEN.ready == 1
81 /// Store64(__p, HW_NRND_GEN.data)
82 /// result := 1
83 /// ELSE
84 /// Store64(__p, 0)
85 /// result := 0
86 /// END
87 /// \endcode
88 ///
89 /// \headerfile <immintrin.h>
90 ///
91 /// This intrinsic corresponds to the \c RDSEED instruction.
92 ///
93 /// \param __p
94 /// Pointer to memory for storing the 64-bit random number.
95 /// \returns 1 if a random number was generated, 0 if not.
96 static __inline__ int __DEFAULT_FN_ATTRS
_rdseed64_step(unsigned long long * __p)97 _rdseed64_step(unsigned long long *__p)
98 {
99 return (int) __builtin_ia32_rdseed64_step(__p);
100 }
101 #endif
102
103 #undef __DEFAULT_FN_ATTRS
104
105 #endif /* __RDSEEDINTRIN_H */
106