Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*===---- lzcntintrin.h - LZCNT 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. #if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
  11. #error "Never use <lzcntintrin.h> directly; include <x86intrin.h> instead."
  12. #endif
  13.  
  14. #ifndef __LZCNTINTRIN_H
  15. #define __LZCNTINTRIN_H
  16.  
  17. /* Define the default attributes for the functions in this file. */
  18. #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("lzcnt")))
  19.  
  20. #ifndef _MSC_VER
  21. /// Counts the number of leading zero bits in the operand.
  22. ///
  23. /// \headerfile <x86intrin.h>
  24. ///
  25. /// This intrinsic corresponds to the \c LZCNT instruction.
  26. ///
  27. /// \param __X
  28. ///    An unsigned 16-bit integer whose leading zeros are to be counted.
  29. /// \returns An unsigned 16-bit integer containing the number of leading zero
  30. ///    bits in the operand.
  31. #define __lzcnt16(X) __builtin_ia32_lzcnt_u16((unsigned short)(X))
  32. #endif // _MSC_VER
  33.  
  34. /// Counts the number of leading zero bits in the operand.
  35. ///
  36. /// \headerfile <x86intrin.h>
  37. ///
  38. /// This intrinsic corresponds to the \c LZCNT instruction.
  39. ///
  40. /// \param __X
  41. ///    An unsigned 32-bit integer whose leading zeros are to be counted.
  42. /// \returns An unsigned 32-bit integer containing the number of leading zero
  43. ///    bits in the operand.
  44. /// \see _lzcnt_u32
  45. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  46. __lzcnt32(unsigned int __X)
  47. {
  48.   return __builtin_ia32_lzcnt_u32(__X);
  49. }
  50.  
  51. /// Counts the number of leading zero bits in the operand.
  52. ///
  53. /// \headerfile <x86intrin.h>
  54. ///
  55. /// This intrinsic corresponds to the \c LZCNT instruction.
  56. ///
  57. /// \param __X
  58. ///    An unsigned 32-bit integer whose leading zeros are to be counted.
  59. /// \returns An unsigned 32-bit integer containing the number of leading zero
  60. ///    bits in the operand.
  61. /// \see __lzcnt32
  62. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  63. _lzcnt_u32(unsigned int __X)
  64. {
  65.   return __builtin_ia32_lzcnt_u32(__X);
  66. }
  67.  
  68. #ifdef __x86_64__
  69. #ifndef _MSC_VER
  70. /// Counts the number of leading zero bits in the operand.
  71. ///
  72. /// \headerfile <x86intrin.h>
  73. ///
  74. /// This intrinsic corresponds to the \c LZCNT instruction.
  75. ///
  76. /// \param __X
  77. ///    An unsigned 64-bit integer whose leading zeros are to be counted.
  78. /// \returns An unsigned 64-bit integer containing the number of leading zero
  79. ///    bits in the operand.
  80. /// \see _lzcnt_u64
  81. #define __lzcnt64(X) __builtin_ia32_lzcnt_u64((unsigned long long)(X))
  82. #endif // _MSC_VER
  83.  
  84. /// Counts the number of leading zero bits in the operand.
  85. ///
  86. /// \headerfile <x86intrin.h>
  87. ///
  88. /// This intrinsic corresponds to the \c LZCNT instruction.
  89. ///
  90. /// \param __X
  91. ///    An unsigned 64-bit integer whose leading zeros are to be counted.
  92. /// \returns An unsigned 64-bit integer containing the number of leading zero
  93. ///    bits in the operand.
  94. /// \see __lzcnt64
  95. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  96. _lzcnt_u64(unsigned long long __X)
  97. {
  98.   return __builtin_ia32_lzcnt_u64(__X);
  99. }
  100. #endif
  101.  
  102. #undef __DEFAULT_FN_ATTRS
  103.  
  104. #endif /* __LZCNTINTRIN_H */
  105.