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 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 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 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