zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

rdseedintrin.h (2919B) - Raw


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