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