106 lines · c
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-exception6 *7 *===-----------------------------------------------------------------------===8 */9 10#ifndef __IMMINTRIN_H11#error "Never use <rdseedintrin.h> directly; include <immintrin.h> instead."12#endif13 14#ifndef __RDSEEDINTRIN_H15#define __RDSEEDINTRIN_H16 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 == 126/// Store16(__p, HW_NRND_GEN.data)27/// result := 128/// ELSE29/// Store16(__p, 0)30/// result := 031/// END32/// \endcode33///34/// \headerfile <immintrin.h>35///36/// This intrinsic corresponds to the \c RDSEED instruction.37///38/// \param __p39/// Pointer to memory for storing the 16-bit random number.40/// \returns 1 if a random number was generated, 0 if not.41static __inline__ int __DEFAULT_FN_ATTRS42_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 == 153/// Store32(__p, HW_NRND_GEN.data)54/// result := 155/// ELSE56/// Store32(__p, 0)57/// result := 058/// END59/// \endcode60///61/// \headerfile <immintrin.h>62///63/// This intrinsic corresponds to the \c RDSEED instruction.64///65/// \param __p66/// Pointer to memory for storing the 32-bit random number.67/// \returns 1 if a random number was generated, 0 if not.68static __inline__ int __DEFAULT_FN_ATTRS69_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 == 181/// Store64(__p, HW_NRND_GEN.data)82/// result := 183/// ELSE84/// Store64(__p, 0)85/// result := 086/// END87/// \endcode88///89/// \headerfile <immintrin.h>90///91/// This intrinsic corresponds to the \c RDSEED instruction.92///93/// \param __p94/// Pointer to memory for storing the 64-bit random number.95/// \returns 1 if a random number was generated, 0 if not.96static __inline__ int __DEFAULT_FN_ATTRS97_rdseed64_step(unsigned long long *__p)98{99 return (int) __builtin_ia32_rdseed64_step(__p);100}101#endif102 103#undef __DEFAULT_FN_ATTRS104 105#endif /* __RDSEEDINTRIN_H */106