Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. /*===---- bmiintrin.h - BMI 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 <bmiintrin.h> directly; include <x86intrin.h> instead."
  12. #endif
  13.  
  14. #ifndef __BMIINTRIN_H
  15. #define __BMIINTRIN_H
  16.  
  17. /* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT
  18.    instruction behaves as BSF on non-BMI targets, there is code that expects
  19.    to use it as a potentially faster version of BSF. */
  20. #define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
  21.  
  22. #define _tzcnt_u16(a)     (__tzcnt_u16((a)))
  23.  
  24. /// Counts the number of trailing zero bits in the operand.
  25. ///
  26. /// \headerfile <x86intrin.h>
  27. ///
  28. /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
  29. ///
  30. /// \param __X
  31. ///    An unsigned 16-bit integer whose trailing zeros are to be counted.
  32. /// \returns An unsigned 16-bit integer containing the number of trailing zero
  33. ///    bits in the operand.
  34. static __inline__ unsigned short __RELAXED_FN_ATTRS
  35. __tzcnt_u16(unsigned short __X)
  36. {
  37.   return __builtin_ia32_tzcnt_u16(__X);
  38. }
  39.  
  40. /// Counts the number of trailing zero bits in the operand.
  41. ///
  42. /// \headerfile <x86intrin.h>
  43. ///
  44. /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
  45. ///
  46. /// \param __X
  47. ///    An unsigned 32-bit integer whose trailing zeros are to be counted.
  48. /// \returns An unsigned 32-bit integer containing the number of trailing zero
  49. ///    bits in the operand.
  50. /// \see _mm_tzcnt_32
  51. static __inline__ unsigned int __RELAXED_FN_ATTRS
  52. __tzcnt_u32(unsigned int __X)
  53. {
  54.   return __builtin_ia32_tzcnt_u32(__X);
  55. }
  56.  
  57. /// Counts the number of trailing zero bits in the operand.
  58. ///
  59. /// \headerfile <x86intrin.h>
  60. ///
  61. /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
  62. ///
  63. /// \param __X
  64. ///    An unsigned 32-bit integer whose trailing zeros are to be counted.
  65. /// \returns An 32-bit integer containing the number of trailing zero bits in
  66. ///    the operand.
  67. /// \see __tzcnt_u32
  68. static __inline__ int __RELAXED_FN_ATTRS
  69. _mm_tzcnt_32(unsigned int __X)
  70. {
  71.   return (int)__builtin_ia32_tzcnt_u32(__X);
  72. }
  73.  
  74. #define _tzcnt_u32(a)     (__tzcnt_u32((a)))
  75.  
  76. #ifdef __x86_64__
  77.  
  78. /// Counts the number of trailing zero bits in the operand.
  79. ///
  80. /// \headerfile <x86intrin.h>
  81. ///
  82. /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
  83. ///
  84. /// \param __X
  85. ///    An unsigned 64-bit integer whose trailing zeros are to be counted.
  86. /// \returns An unsigned 64-bit integer containing the number of trailing zero
  87. ///    bits in the operand.
  88. /// \see _mm_tzcnt_64
  89. static __inline__ unsigned long long __RELAXED_FN_ATTRS
  90. __tzcnt_u64(unsigned long long __X)
  91. {
  92.   return __builtin_ia32_tzcnt_u64(__X);
  93. }
  94.  
  95. /// Counts the number of trailing zero bits in the operand.
  96. ///
  97. /// \headerfile <x86intrin.h>
  98. ///
  99. /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
  100. ///
  101. /// \param __X
  102. ///    An unsigned 64-bit integer whose trailing zeros are to be counted.
  103. /// \returns An 64-bit integer containing the number of trailing zero bits in
  104. ///    the operand.
  105. /// \see __tzcnt_u64
  106. static __inline__ long long __RELAXED_FN_ATTRS
  107. _mm_tzcnt_64(unsigned long long __X)
  108. {
  109.   return (long long)__builtin_ia32_tzcnt_u64(__X);
  110. }
  111.  
  112. #define _tzcnt_u64(a)     (__tzcnt_u64((a)))
  113.  
  114. #endif /* __x86_64__ */
  115.  
  116. #undef __RELAXED_FN_ATTRS
  117.  
  118. #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
  119.     defined(__BMI__)
  120.  
  121. /* Define the default attributes for the functions in this file. */
  122. #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
  123.  
  124. #define _andn_u32(a, b)   (__andn_u32((a), (b)))
  125.  
  126. /* _bextr_u32 != __bextr_u32 */
  127. #define _blsi_u32(a)      (__blsi_u32((a)))
  128.  
  129. #define _blsmsk_u32(a)    (__blsmsk_u32((a)))
  130.  
  131. #define _blsr_u32(a)      (__blsr_u32((a)))
  132.  
  133. /// Performs a bitwise AND of the second operand with the one's
  134. ///    complement of the first operand.
  135. ///
  136. /// \headerfile <x86intrin.h>
  137. ///
  138. /// This intrinsic corresponds to the <c> ANDN </c> instruction.
  139. ///
  140. /// \param __X
  141. ///    An unsigned integer containing one of the operands.
  142. /// \param __Y
  143. ///    An unsigned integer containing one of the operands.
  144. /// \returns An unsigned integer containing the bitwise AND of the second
  145. ///    operand with the one's complement of the first operand.
  146. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  147. __andn_u32(unsigned int __X, unsigned int __Y)
  148. {
  149.   return ~__X & __Y;
  150. }
  151.  
  152. /* AMD-specified, double-leading-underscore version of BEXTR */
  153. /// Extracts the specified bits from the first operand and returns them
  154. ///    in the least significant bits of the result.
  155. ///
  156. /// \headerfile <x86intrin.h>
  157. ///
  158. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  159. ///
  160. /// \param __X
  161. ///    An unsigned integer whose bits are to be extracted.
  162. /// \param __Y
  163. ///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
  164. ///    specify the index of the least significant bit. Bits [15:8] specify the
  165. ///    number of bits to be extracted.
  166. /// \returns An unsigned integer whose least significant bits contain the
  167. ///    extracted bits.
  168. /// \see _bextr_u32
  169. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  170. __bextr_u32(unsigned int __X, unsigned int __Y)
  171. {
  172.   return __builtin_ia32_bextr_u32(__X, __Y);
  173. }
  174.  
  175. /* Intel-specified, single-leading-underscore version of BEXTR */
  176. /// Extracts the specified bits from the first operand and returns them
  177. ///    in the least significant bits of the result.
  178. ///
  179. /// \headerfile <x86intrin.h>
  180. ///
  181. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  182. ///
  183. /// \param __X
  184. ///    An unsigned integer whose bits are to be extracted.
  185. /// \param __Y
  186. ///    An unsigned integer used to specify the index of the least significant
  187. ///    bit for the bits to be extracted. Bits [7:0] specify the index.
  188. /// \param __Z
  189. ///    An unsigned integer used to specify the number of bits to be extracted.
  190. ///    Bits [7:0] specify the number of bits.
  191. /// \returns An unsigned integer whose least significant bits contain the
  192. ///    extracted bits.
  193. /// \see __bextr_u32
  194. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  195. _bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z)
  196. {
  197.   return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
  198. }
  199.  
  200. /* Intel-specified, single-leading-underscore version of BEXTR2 */
  201. /// Extracts the specified bits from the first operand and returns them
  202. ///    in the least significant bits of the result.
  203. ///
  204. /// \headerfile <x86intrin.h>
  205. ///
  206. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  207. ///
  208. /// \param __X
  209. ///    An unsigned integer whose bits are to be extracted.
  210. /// \param __Y
  211. ///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
  212. ///    specify the index of the least significant bit. Bits [15:8] specify the
  213. ///    number of bits to be extracted.
  214. /// \returns An unsigned integer whose least significant bits contain the
  215. ///    extracted bits.
  216. /// \see __bextr_u32
  217. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  218. _bextr2_u32(unsigned int __X, unsigned int __Y) {
  219.   return __builtin_ia32_bextr_u32(__X, __Y);
  220. }
  221.  
  222. /// Clears all bits in the source except for the least significant bit
  223. ///    containing a value of 1 and returns the result.
  224. ///
  225. /// \headerfile <x86intrin.h>
  226. ///
  227. /// This intrinsic corresponds to the <c> BLSI </c> instruction.
  228. ///
  229. /// \param __X
  230. ///    An unsigned integer whose bits are to be cleared.
  231. /// \returns An unsigned integer containing the result of clearing the bits from
  232. ///    the source operand.
  233. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  234. __blsi_u32(unsigned int __X)
  235. {
  236.   return __X & -__X;
  237. }
  238.  
  239. /// Creates a mask whose bits are set to 1, using bit 0 up to and
  240. ///    including the least significant bit that is set to 1 in the source
  241. ///    operand and returns the result.
  242. ///
  243. /// \headerfile <x86intrin.h>
  244. ///
  245. /// This intrinsic corresponds to the <c> BLSMSK </c> instruction.
  246. ///
  247. /// \param __X
  248. ///    An unsigned integer used to create the mask.
  249. /// \returns An unsigned integer containing the newly created mask.
  250. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  251. __blsmsk_u32(unsigned int __X)
  252. {
  253.   return __X ^ (__X - 1);
  254. }
  255.  
  256. /// Clears the least significant bit that is set to 1 in the source
  257. ///    operand and returns the result.
  258. ///
  259. /// \headerfile <x86intrin.h>
  260. ///
  261. /// This intrinsic corresponds to the <c> BLSR </c> instruction.
  262. ///
  263. /// \param __X
  264. ///    An unsigned integer containing the operand to be cleared.
  265. /// \returns An unsigned integer containing the result of clearing the source
  266. ///    operand.
  267. static __inline__ unsigned int __DEFAULT_FN_ATTRS
  268. __blsr_u32(unsigned int __X)
  269. {
  270.   return __X & (__X - 1);
  271. }
  272.  
  273. #ifdef __x86_64__
  274.  
  275. #define _andn_u64(a, b)   (__andn_u64((a), (b)))
  276.  
  277. /* _bextr_u64 != __bextr_u64 */
  278. #define _blsi_u64(a)      (__blsi_u64((a)))
  279.  
  280. #define _blsmsk_u64(a)    (__blsmsk_u64((a)))
  281.  
  282. #define _blsr_u64(a)      (__blsr_u64((a)))
  283.  
  284. /// Performs a bitwise AND of the second operand with the one's
  285. ///    complement of the first operand.
  286. ///
  287. /// \headerfile <x86intrin.h>
  288. ///
  289. /// This intrinsic corresponds to the <c> ANDN </c> instruction.
  290. ///
  291. /// \param __X
  292. ///    An unsigned 64-bit integer containing one of the operands.
  293. /// \param __Y
  294. ///    An unsigned 64-bit integer containing one of the operands.
  295. /// \returns An unsigned 64-bit integer containing the bitwise AND of the second
  296. ///    operand with the one's complement of the first operand.
  297. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  298. __andn_u64 (unsigned long long __X, unsigned long long __Y)
  299. {
  300.   return ~__X & __Y;
  301. }
  302.  
  303. /* AMD-specified, double-leading-underscore version of BEXTR */
  304. /// Extracts the specified bits from the first operand and returns them
  305. ///    in the least significant bits of the result.
  306. ///
  307. /// \headerfile <x86intrin.h>
  308. ///
  309. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  310. ///
  311. /// \param __X
  312. ///    An unsigned 64-bit integer whose bits are to be extracted.
  313. /// \param __Y
  314. ///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
  315. ///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
  316. ///    the number of bits to be extracted.
  317. /// \returns An unsigned 64-bit integer whose least significant bits contain the
  318. ///    extracted bits.
  319. /// \see _bextr_u64
  320. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  321. __bextr_u64(unsigned long long __X, unsigned long long __Y)
  322. {
  323.   return __builtin_ia32_bextr_u64(__X, __Y);
  324. }
  325.  
  326. /* Intel-specified, single-leading-underscore version of BEXTR */
  327. /// Extracts the specified bits from the first operand and returns them
  328. ///     in the least significant bits of the result.
  329. ///
  330. /// \headerfile <x86intrin.h>
  331. ///
  332. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  333. ///
  334. /// \param __X
  335. ///    An unsigned 64-bit integer whose bits are to be extracted.
  336. /// \param __Y
  337. ///    An unsigned integer used to specify the index of the least significant
  338. ///    bit for the bits to be extracted. Bits [7:0] specify the index.
  339. /// \param __Z
  340. ///    An unsigned integer used to specify the number of bits to be extracted.
  341. ///    Bits [7:0] specify the number of bits.
  342. /// \returns An unsigned 64-bit integer whose least significant bits contain the
  343. ///    extracted bits.
  344. /// \see __bextr_u64
  345. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  346. _bextr_u64(unsigned long long __X, unsigned int __Y, unsigned int __Z)
  347. {
  348.   return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
  349. }
  350.  
  351. /* Intel-specified, single-leading-underscore version of BEXTR2 */
  352. /// Extracts the specified bits from the first operand and returns them
  353. ///    in the least significant bits of the result.
  354. ///
  355. /// \headerfile <x86intrin.h>
  356. ///
  357. /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
  358. ///
  359. /// \param __X
  360. ///    An unsigned 64-bit integer whose bits are to be extracted.
  361. /// \param __Y
  362. ///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
  363. ///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
  364. ///    the number of bits to be extracted.
  365. /// \returns An unsigned 64-bit integer whose least significant bits contain the
  366. ///    extracted bits.
  367. /// \see __bextr_u64
  368. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  369. _bextr2_u64(unsigned long long __X, unsigned long long __Y) {
  370.   return __builtin_ia32_bextr_u64(__X, __Y);
  371. }
  372.  
  373. /// Clears all bits in the source except for the least significant bit
  374. ///    containing a value of 1 and returns the result.
  375. ///
  376. /// \headerfile <x86intrin.h>
  377. ///
  378. /// This intrinsic corresponds to the <c> BLSI </c> instruction.
  379. ///
  380. /// \param __X
  381. ///    An unsigned 64-bit integer whose bits are to be cleared.
  382. /// \returns An unsigned 64-bit integer containing the result of clearing the
  383. ///    bits from the source operand.
  384. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  385. __blsi_u64(unsigned long long __X)
  386. {
  387.   return __X & -__X;
  388. }
  389.  
  390. /// Creates a mask whose bits are set to 1, using bit 0 up to and
  391. ///    including the least significant bit that is set to 1 in the source
  392. ///    operand and returns the result.
  393. ///
  394. /// \headerfile <x86intrin.h>
  395. ///
  396. /// This intrinsic corresponds to the <c> BLSMSK </c> instruction.
  397. ///
  398. /// \param __X
  399. ///    An unsigned 64-bit integer used to create the mask.
  400. /// \returns An unsigned 64-bit integer containing the newly created mask.
  401. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  402. __blsmsk_u64(unsigned long long __X)
  403. {
  404.   return __X ^ (__X - 1);
  405. }
  406.  
  407. /// Clears the least significant bit that is set to 1 in the source
  408. ///    operand and returns the result.
  409. ///
  410. /// \headerfile <x86intrin.h>
  411. ///
  412. /// This intrinsic corresponds to the <c> BLSR </c> instruction.
  413. ///
  414. /// \param __X
  415. ///    An unsigned 64-bit integer containing the operand to be cleared.
  416. /// \returns An unsigned 64-bit integer containing the result of clearing the
  417. ///    source operand.
  418. static __inline__ unsigned long long __DEFAULT_FN_ATTRS
  419. __blsr_u64(unsigned long long __X)
  420. {
  421.   return __X & (__X - 1);
  422. }
  423.  
  424. #endif /* __x86_64__ */
  425.  
  426. #undef __DEFAULT_FN_ATTRS
  427.  
  428. #endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules)   \
  429.           || defined(__BMI__) */
  430.  
  431. #endif /* __BMIINTRIN_H */
  432.