106f32e7eSjoerg /*===---- bmiintrin.h - BMI intrinsics -------------------------------------===
206f32e7eSjoerg  *
306f32e7eSjoerg  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg  * See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg  *
706f32e7eSjoerg  *===-----------------------------------------------------------------------===
806f32e7eSjoerg  */
906f32e7eSjoerg 
1006f32e7eSjoerg #if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
1106f32e7eSjoerg #error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
1206f32e7eSjoerg #endif
1306f32e7eSjoerg 
1406f32e7eSjoerg #ifndef __BMIINTRIN_H
1506f32e7eSjoerg #define __BMIINTRIN_H
1606f32e7eSjoerg 
1706f32e7eSjoerg /* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT
1806f32e7eSjoerg    instruction behaves as BSF on non-BMI targets, there is code that expects
1906f32e7eSjoerg    to use it as a potentially faster version of BSF. */
2006f32e7eSjoerg #define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
2106f32e7eSjoerg 
2206f32e7eSjoerg #define _tzcnt_u16(a)     (__tzcnt_u16((a)))
2306f32e7eSjoerg 
2406f32e7eSjoerg /// Counts the number of trailing zero bits in the operand.
2506f32e7eSjoerg ///
2606f32e7eSjoerg /// \headerfile <x86intrin.h>
2706f32e7eSjoerg ///
2806f32e7eSjoerg /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
2906f32e7eSjoerg ///
3006f32e7eSjoerg /// \param __X
3106f32e7eSjoerg ///    An unsigned 16-bit integer whose trailing zeros are to be counted.
3206f32e7eSjoerg /// \returns An unsigned 16-bit integer containing the number of trailing zero
3306f32e7eSjoerg ///    bits in the operand.
3406f32e7eSjoerg static __inline__ unsigned short __RELAXED_FN_ATTRS
__tzcnt_u16(unsigned short __X)3506f32e7eSjoerg __tzcnt_u16(unsigned short __X)
3606f32e7eSjoerg {
3706f32e7eSjoerg   return __builtin_ia32_tzcnt_u16(__X);
3806f32e7eSjoerg }
3906f32e7eSjoerg 
4006f32e7eSjoerg /// Counts the number of trailing zero bits in the operand.
4106f32e7eSjoerg ///
4206f32e7eSjoerg /// \headerfile <x86intrin.h>
4306f32e7eSjoerg ///
4406f32e7eSjoerg /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
4506f32e7eSjoerg ///
4606f32e7eSjoerg /// \param __X
4706f32e7eSjoerg ///    An unsigned 32-bit integer whose trailing zeros are to be counted.
4806f32e7eSjoerg /// \returns An unsigned 32-bit integer containing the number of trailing zero
4906f32e7eSjoerg ///    bits in the operand.
5006f32e7eSjoerg static __inline__ unsigned int __RELAXED_FN_ATTRS
__tzcnt_u32(unsigned int __X)5106f32e7eSjoerg __tzcnt_u32(unsigned int __X)
5206f32e7eSjoerg {
5306f32e7eSjoerg   return __builtin_ia32_tzcnt_u32(__X);
5406f32e7eSjoerg }
5506f32e7eSjoerg 
5606f32e7eSjoerg /// Counts the number of trailing zero bits in the operand.
5706f32e7eSjoerg ///
5806f32e7eSjoerg /// \headerfile <x86intrin.h>
5906f32e7eSjoerg ///
6006f32e7eSjoerg /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
6106f32e7eSjoerg ///
6206f32e7eSjoerg /// \param __X
6306f32e7eSjoerg ///    An unsigned 32-bit integer whose trailing zeros are to be counted.
6406f32e7eSjoerg /// \returns An 32-bit integer containing the number of trailing zero bits in
6506f32e7eSjoerg ///    the operand.
6606f32e7eSjoerg static __inline__ int __RELAXED_FN_ATTRS
_mm_tzcnt_32(unsigned int __X)6706f32e7eSjoerg _mm_tzcnt_32(unsigned int __X)
6806f32e7eSjoerg {
6906f32e7eSjoerg   return __builtin_ia32_tzcnt_u32(__X);
7006f32e7eSjoerg }
7106f32e7eSjoerg 
7206f32e7eSjoerg #define _tzcnt_u32(a)     (__tzcnt_u32((a)))
7306f32e7eSjoerg 
7406f32e7eSjoerg #ifdef __x86_64__
7506f32e7eSjoerg 
7606f32e7eSjoerg /// Counts the number of trailing zero bits in the operand.
7706f32e7eSjoerg ///
7806f32e7eSjoerg /// \headerfile <x86intrin.h>
7906f32e7eSjoerg ///
8006f32e7eSjoerg /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
8106f32e7eSjoerg ///
8206f32e7eSjoerg /// \param __X
8306f32e7eSjoerg ///    An unsigned 64-bit integer whose trailing zeros are to be counted.
8406f32e7eSjoerg /// \returns An unsigned 64-bit integer containing the number of trailing zero
8506f32e7eSjoerg ///    bits in the operand.
8606f32e7eSjoerg static __inline__ unsigned long long __RELAXED_FN_ATTRS
__tzcnt_u64(unsigned long long __X)8706f32e7eSjoerg __tzcnt_u64(unsigned long long __X)
8806f32e7eSjoerg {
8906f32e7eSjoerg   return __builtin_ia32_tzcnt_u64(__X);
9006f32e7eSjoerg }
9106f32e7eSjoerg 
9206f32e7eSjoerg /// Counts the number of trailing zero bits in the operand.
9306f32e7eSjoerg ///
9406f32e7eSjoerg /// \headerfile <x86intrin.h>
9506f32e7eSjoerg ///
9606f32e7eSjoerg /// This intrinsic corresponds to the <c> TZCNT </c> instruction.
9706f32e7eSjoerg ///
9806f32e7eSjoerg /// \param __X
9906f32e7eSjoerg ///    An unsigned 64-bit integer whose trailing zeros are to be counted.
10006f32e7eSjoerg /// \returns An 64-bit integer containing the number of trailing zero bits in
10106f32e7eSjoerg ///    the operand.
10206f32e7eSjoerg static __inline__ long long __RELAXED_FN_ATTRS
_mm_tzcnt_64(unsigned long long __X)10306f32e7eSjoerg _mm_tzcnt_64(unsigned long long __X)
10406f32e7eSjoerg {
10506f32e7eSjoerg   return __builtin_ia32_tzcnt_u64(__X);
10606f32e7eSjoerg }
10706f32e7eSjoerg 
10806f32e7eSjoerg #define _tzcnt_u64(a)     (__tzcnt_u64((a)))
10906f32e7eSjoerg 
11006f32e7eSjoerg #endif /* __x86_64__ */
11106f32e7eSjoerg 
11206f32e7eSjoerg #undef __RELAXED_FN_ATTRS
11306f32e7eSjoerg 
114*13fbcb42Sjoerg #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \
115*13fbcb42Sjoerg     defined(__BMI__)
11606f32e7eSjoerg 
11706f32e7eSjoerg /* Define the default attributes for the functions in this file. */
11806f32e7eSjoerg #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
11906f32e7eSjoerg 
12006f32e7eSjoerg #define _andn_u32(a, b)   (__andn_u32((a), (b)))
12106f32e7eSjoerg 
12206f32e7eSjoerg /* _bextr_u32 != __bextr_u32 */
12306f32e7eSjoerg #define _blsi_u32(a)      (__blsi_u32((a)))
12406f32e7eSjoerg 
12506f32e7eSjoerg #define _blsmsk_u32(a)    (__blsmsk_u32((a)))
12606f32e7eSjoerg 
12706f32e7eSjoerg #define _blsr_u32(a)      (__blsr_u32((a)))
12806f32e7eSjoerg 
12906f32e7eSjoerg /// Performs a bitwise AND of the second operand with the one's
13006f32e7eSjoerg ///    complement of the first operand.
13106f32e7eSjoerg ///
13206f32e7eSjoerg /// \headerfile <x86intrin.h>
13306f32e7eSjoerg ///
13406f32e7eSjoerg /// This intrinsic corresponds to the <c> ANDN </c> instruction.
13506f32e7eSjoerg ///
13606f32e7eSjoerg /// \param __X
13706f32e7eSjoerg ///    An unsigned integer containing one of the operands.
13806f32e7eSjoerg /// \param __Y
13906f32e7eSjoerg ///    An unsigned integer containing one of the operands.
14006f32e7eSjoerg /// \returns An unsigned integer containing the bitwise AND of the second
14106f32e7eSjoerg ///    operand with the one's complement of the first operand.
14206f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
__andn_u32(unsigned int __X,unsigned int __Y)14306f32e7eSjoerg __andn_u32(unsigned int __X, unsigned int __Y)
14406f32e7eSjoerg {
14506f32e7eSjoerg   return ~__X & __Y;
14606f32e7eSjoerg }
14706f32e7eSjoerg 
14806f32e7eSjoerg /* AMD-specified, double-leading-underscore version of BEXTR */
14906f32e7eSjoerg /// Extracts the specified bits from the first operand and returns them
15006f32e7eSjoerg ///    in the least significant bits of the result.
15106f32e7eSjoerg ///
15206f32e7eSjoerg /// \headerfile <x86intrin.h>
15306f32e7eSjoerg ///
15406f32e7eSjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
15506f32e7eSjoerg ///
15606f32e7eSjoerg /// \param __X
15706f32e7eSjoerg ///    An unsigned integer whose bits are to be extracted.
15806f32e7eSjoerg /// \param __Y
15906f32e7eSjoerg ///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
16006f32e7eSjoerg ///    specify the index of the least significant bit. Bits [15:8] specify the
16106f32e7eSjoerg ///    number of bits to be extracted.
16206f32e7eSjoerg /// \returns An unsigned integer whose least significant bits contain the
16306f32e7eSjoerg ///    extracted bits.
16406f32e7eSjoerg /// \see _bextr_u32
16506f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
__bextr_u32(unsigned int __X,unsigned int __Y)16606f32e7eSjoerg __bextr_u32(unsigned int __X, unsigned int __Y)
16706f32e7eSjoerg {
16806f32e7eSjoerg   return __builtin_ia32_bextr_u32(__X, __Y);
16906f32e7eSjoerg }
17006f32e7eSjoerg 
17106f32e7eSjoerg /* Intel-specified, single-leading-underscore version of BEXTR */
17206f32e7eSjoerg /// Extracts the specified bits from the first operand and returns them
17306f32e7eSjoerg ///    in the least significant bits of the result.
17406f32e7eSjoerg ///
17506f32e7eSjoerg /// \headerfile <x86intrin.h>
17606f32e7eSjoerg ///
17706f32e7eSjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
17806f32e7eSjoerg ///
17906f32e7eSjoerg /// \param __X
18006f32e7eSjoerg ///    An unsigned integer whose bits are to be extracted.
18106f32e7eSjoerg /// \param __Y
18206f32e7eSjoerg ///    An unsigned integer used to specify the index of the least significant
18306f32e7eSjoerg ///    bit for the bits to be extracted. Bits [7:0] specify the index.
18406f32e7eSjoerg /// \param __Z
18506f32e7eSjoerg ///    An unsigned integer used to specify the number of bits to be extracted.
18606f32e7eSjoerg ///    Bits [7:0] specify the number of bits.
18706f32e7eSjoerg /// \returns An unsigned integer whose least significant bits contain the
18806f32e7eSjoerg ///    extracted bits.
18906f32e7eSjoerg /// \see __bextr_u32
19006f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
_bextr_u32(unsigned int __X,unsigned int __Y,unsigned int __Z)19106f32e7eSjoerg _bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z)
19206f32e7eSjoerg {
19306f32e7eSjoerg   return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
19406f32e7eSjoerg }
19506f32e7eSjoerg 
196*13fbcb42Sjoerg /* Intel-specified, single-leading-underscore version of BEXTR2 */
197*13fbcb42Sjoerg /// Extracts the specified bits from the first operand and returns them
198*13fbcb42Sjoerg ///    in the least significant bits of the result.
199*13fbcb42Sjoerg ///
200*13fbcb42Sjoerg /// \headerfile <x86intrin.h>
201*13fbcb42Sjoerg ///
202*13fbcb42Sjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
203*13fbcb42Sjoerg ///
204*13fbcb42Sjoerg /// \param __X
205*13fbcb42Sjoerg ///    An unsigned integer whose bits are to be extracted.
206*13fbcb42Sjoerg /// \param __Y
207*13fbcb42Sjoerg ///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
208*13fbcb42Sjoerg ///    specify the index of the least significant bit. Bits [15:8] specify the
209*13fbcb42Sjoerg ///    number of bits to be extracted.
210*13fbcb42Sjoerg /// \returns An unsigned integer whose least significant bits contain the
211*13fbcb42Sjoerg ///    extracted bits.
212*13fbcb42Sjoerg /// \see __bextr_u32
213*13fbcb42Sjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
_bextr2_u32(unsigned int __X,unsigned int __Y)214*13fbcb42Sjoerg _bextr2_u32(unsigned int __X, unsigned int __Y) {
215*13fbcb42Sjoerg   return __builtin_ia32_bextr_u32(__X, __Y);
216*13fbcb42Sjoerg }
217*13fbcb42Sjoerg 
21806f32e7eSjoerg /// Clears all bits in the source except for the least significant bit
21906f32e7eSjoerg ///    containing a value of 1 and returns the result.
22006f32e7eSjoerg ///
22106f32e7eSjoerg /// \headerfile <x86intrin.h>
22206f32e7eSjoerg ///
22306f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSI </c> instruction.
22406f32e7eSjoerg ///
22506f32e7eSjoerg /// \param __X
22606f32e7eSjoerg ///    An unsigned integer whose bits are to be cleared.
22706f32e7eSjoerg /// \returns An unsigned integer containing the result of clearing the bits from
22806f32e7eSjoerg ///    the source operand.
22906f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsi_u32(unsigned int __X)23006f32e7eSjoerg __blsi_u32(unsigned int __X)
23106f32e7eSjoerg {
23206f32e7eSjoerg   return __X & -__X;
23306f32e7eSjoerg }
23406f32e7eSjoerg 
23506f32e7eSjoerg /// Creates a mask whose bits are set to 1, using bit 0 up to and
23606f32e7eSjoerg ///    including the least significant bit that is set to 1 in the source
23706f32e7eSjoerg ///    operand and returns the result.
23806f32e7eSjoerg ///
23906f32e7eSjoerg /// \headerfile <x86intrin.h>
24006f32e7eSjoerg ///
24106f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSMSK </c> instruction.
24206f32e7eSjoerg ///
24306f32e7eSjoerg /// \param __X
24406f32e7eSjoerg ///    An unsigned integer used to create the mask.
24506f32e7eSjoerg /// \returns An unsigned integer containing the newly created mask.
24606f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsmsk_u32(unsigned int __X)24706f32e7eSjoerg __blsmsk_u32(unsigned int __X)
24806f32e7eSjoerg {
24906f32e7eSjoerg   return __X ^ (__X - 1);
25006f32e7eSjoerg }
25106f32e7eSjoerg 
25206f32e7eSjoerg /// Clears the least significant bit that is set to 1 in the source
25306f32e7eSjoerg ///    operand and returns the result.
25406f32e7eSjoerg ///
25506f32e7eSjoerg /// \headerfile <x86intrin.h>
25606f32e7eSjoerg ///
25706f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSR </c> instruction.
25806f32e7eSjoerg ///
25906f32e7eSjoerg /// \param __X
26006f32e7eSjoerg ///    An unsigned integer containing the operand to be cleared.
26106f32e7eSjoerg /// \returns An unsigned integer containing the result of clearing the source
26206f32e7eSjoerg ///    operand.
26306f32e7eSjoerg static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsr_u32(unsigned int __X)26406f32e7eSjoerg __blsr_u32(unsigned int __X)
26506f32e7eSjoerg {
26606f32e7eSjoerg   return __X & (__X - 1);
26706f32e7eSjoerg }
26806f32e7eSjoerg 
26906f32e7eSjoerg #ifdef __x86_64__
27006f32e7eSjoerg 
27106f32e7eSjoerg #define _andn_u64(a, b)   (__andn_u64((a), (b)))
27206f32e7eSjoerg 
27306f32e7eSjoerg /* _bextr_u64 != __bextr_u64 */
27406f32e7eSjoerg #define _blsi_u64(a)      (__blsi_u64((a)))
27506f32e7eSjoerg 
27606f32e7eSjoerg #define _blsmsk_u64(a)    (__blsmsk_u64((a)))
27706f32e7eSjoerg 
27806f32e7eSjoerg #define _blsr_u64(a)      (__blsr_u64((a)))
27906f32e7eSjoerg 
28006f32e7eSjoerg /// Performs a bitwise AND of the second operand with the one's
28106f32e7eSjoerg ///    complement of the first operand.
28206f32e7eSjoerg ///
28306f32e7eSjoerg /// \headerfile <x86intrin.h>
28406f32e7eSjoerg ///
28506f32e7eSjoerg /// This intrinsic corresponds to the <c> ANDN </c> instruction.
28606f32e7eSjoerg ///
28706f32e7eSjoerg /// \param __X
28806f32e7eSjoerg ///    An unsigned 64-bit integer containing one of the operands.
28906f32e7eSjoerg /// \param __Y
29006f32e7eSjoerg ///    An unsigned 64-bit integer containing one of the operands.
29106f32e7eSjoerg /// \returns An unsigned 64-bit integer containing the bitwise AND of the second
29206f32e7eSjoerg ///    operand with the one's complement of the first operand.
29306f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__andn_u64(unsigned long long __X,unsigned long long __Y)29406f32e7eSjoerg __andn_u64 (unsigned long long __X, unsigned long long __Y)
29506f32e7eSjoerg {
29606f32e7eSjoerg   return ~__X & __Y;
29706f32e7eSjoerg }
29806f32e7eSjoerg 
29906f32e7eSjoerg /* AMD-specified, double-leading-underscore version of BEXTR */
30006f32e7eSjoerg /// Extracts the specified bits from the first operand and returns them
30106f32e7eSjoerg ///    in the least significant bits of the result.
30206f32e7eSjoerg ///
30306f32e7eSjoerg /// \headerfile <x86intrin.h>
30406f32e7eSjoerg ///
30506f32e7eSjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
30606f32e7eSjoerg ///
30706f32e7eSjoerg /// \param __X
30806f32e7eSjoerg ///    An unsigned 64-bit integer whose bits are to be extracted.
30906f32e7eSjoerg /// \param __Y
31006f32e7eSjoerg ///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
31106f32e7eSjoerg ///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
31206f32e7eSjoerg ///    the number of bits to be extracted.
31306f32e7eSjoerg /// \returns An unsigned 64-bit integer whose least significant bits contain the
31406f32e7eSjoerg ///    extracted bits.
31506f32e7eSjoerg /// \see _bextr_u64
31606f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__bextr_u64(unsigned long long __X,unsigned long long __Y)31706f32e7eSjoerg __bextr_u64(unsigned long long __X, unsigned long long __Y)
31806f32e7eSjoerg {
31906f32e7eSjoerg   return __builtin_ia32_bextr_u64(__X, __Y);
32006f32e7eSjoerg }
32106f32e7eSjoerg 
32206f32e7eSjoerg /* Intel-specified, single-leading-underscore version of BEXTR */
32306f32e7eSjoerg /// Extracts the specified bits from the first operand and returns them
32406f32e7eSjoerg ///     in the least significant bits of the result.
32506f32e7eSjoerg ///
32606f32e7eSjoerg /// \headerfile <x86intrin.h>
32706f32e7eSjoerg ///
32806f32e7eSjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
32906f32e7eSjoerg ///
33006f32e7eSjoerg /// \param __X
33106f32e7eSjoerg ///    An unsigned 64-bit integer whose bits are to be extracted.
33206f32e7eSjoerg /// \param __Y
33306f32e7eSjoerg ///    An unsigned integer used to specify the index of the least significant
33406f32e7eSjoerg ///    bit for the bits to be extracted. Bits [7:0] specify the index.
33506f32e7eSjoerg /// \param __Z
33606f32e7eSjoerg ///    An unsigned integer used to specify the number of bits to be extracted.
33706f32e7eSjoerg ///    Bits [7:0] specify the number of bits.
33806f32e7eSjoerg /// \returns An unsigned 64-bit integer whose least significant bits contain the
33906f32e7eSjoerg ///    extracted bits.
34006f32e7eSjoerg /// \see __bextr_u64
34106f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
_bextr_u64(unsigned long long __X,unsigned int __Y,unsigned int __Z)34206f32e7eSjoerg _bextr_u64(unsigned long long __X, unsigned int __Y, unsigned int __Z)
34306f32e7eSjoerg {
34406f32e7eSjoerg   return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
34506f32e7eSjoerg }
34606f32e7eSjoerg 
347*13fbcb42Sjoerg /* Intel-specified, single-leading-underscore version of BEXTR2 */
348*13fbcb42Sjoerg /// Extracts the specified bits from the first operand and returns them
349*13fbcb42Sjoerg ///    in the least significant bits of the result.
350*13fbcb42Sjoerg ///
351*13fbcb42Sjoerg /// \headerfile <x86intrin.h>
352*13fbcb42Sjoerg ///
353*13fbcb42Sjoerg /// This intrinsic corresponds to the <c> BEXTR </c> instruction.
354*13fbcb42Sjoerg ///
355*13fbcb42Sjoerg /// \param __X
356*13fbcb42Sjoerg ///    An unsigned 64-bit integer whose bits are to be extracted.
357*13fbcb42Sjoerg /// \param __Y
358*13fbcb42Sjoerg ///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
359*13fbcb42Sjoerg ///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
360*13fbcb42Sjoerg ///    the number of bits to be extracted.
361*13fbcb42Sjoerg /// \returns An unsigned 64-bit integer whose least significant bits contain the
362*13fbcb42Sjoerg ///    extracted bits.
363*13fbcb42Sjoerg /// \see __bextr_u64
364*13fbcb42Sjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
_bextr2_u64(unsigned long long __X,unsigned long long __Y)365*13fbcb42Sjoerg _bextr2_u64(unsigned long long __X, unsigned long long __Y) {
366*13fbcb42Sjoerg   return __builtin_ia32_bextr_u64(__X, __Y);
367*13fbcb42Sjoerg }
368*13fbcb42Sjoerg 
36906f32e7eSjoerg /// Clears all bits in the source except for the least significant bit
37006f32e7eSjoerg ///    containing a value of 1 and returns the result.
37106f32e7eSjoerg ///
37206f32e7eSjoerg /// \headerfile <x86intrin.h>
37306f32e7eSjoerg ///
37406f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSI </c> instruction.
37506f32e7eSjoerg ///
37606f32e7eSjoerg /// \param __X
37706f32e7eSjoerg ///    An unsigned 64-bit integer whose bits are to be cleared.
37806f32e7eSjoerg /// \returns An unsigned 64-bit integer containing the result of clearing the
37906f32e7eSjoerg ///    bits from the source operand.
38006f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsi_u64(unsigned long long __X)38106f32e7eSjoerg __blsi_u64(unsigned long long __X)
38206f32e7eSjoerg {
38306f32e7eSjoerg   return __X & -__X;
38406f32e7eSjoerg }
38506f32e7eSjoerg 
38606f32e7eSjoerg /// Creates a mask whose bits are set to 1, using bit 0 up to and
38706f32e7eSjoerg ///    including the least significant bit that is set to 1 in the source
38806f32e7eSjoerg ///    operand and returns the result.
38906f32e7eSjoerg ///
39006f32e7eSjoerg /// \headerfile <x86intrin.h>
39106f32e7eSjoerg ///
39206f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSMSK </c> instruction.
39306f32e7eSjoerg ///
39406f32e7eSjoerg /// \param __X
39506f32e7eSjoerg ///    An unsigned 64-bit integer used to create the mask.
39606f32e7eSjoerg /// \returns An unsigned 64-bit integer containing the newly created mask.
39706f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsmsk_u64(unsigned long long __X)39806f32e7eSjoerg __blsmsk_u64(unsigned long long __X)
39906f32e7eSjoerg {
40006f32e7eSjoerg   return __X ^ (__X - 1);
40106f32e7eSjoerg }
40206f32e7eSjoerg 
40306f32e7eSjoerg /// Clears the least significant bit that is set to 1 in the source
40406f32e7eSjoerg ///    operand and returns the result.
40506f32e7eSjoerg ///
40606f32e7eSjoerg /// \headerfile <x86intrin.h>
40706f32e7eSjoerg ///
40806f32e7eSjoerg /// This intrinsic corresponds to the <c> BLSR </c> instruction.
40906f32e7eSjoerg ///
41006f32e7eSjoerg /// \param __X
41106f32e7eSjoerg ///    An unsigned 64-bit integer containing the operand to be cleared.
41206f32e7eSjoerg /// \returns An unsigned 64-bit integer containing the result of clearing the
41306f32e7eSjoerg ///    source operand.
41406f32e7eSjoerg static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsr_u64(unsigned long long __X)41506f32e7eSjoerg __blsr_u64(unsigned long long __X)
41606f32e7eSjoerg {
41706f32e7eSjoerg   return __X & (__X - 1);
41806f32e7eSjoerg }
41906f32e7eSjoerg 
42006f32e7eSjoerg #endif /* __x86_64__ */
42106f32e7eSjoerg 
42206f32e7eSjoerg #undef __DEFAULT_FN_ATTRS
42306f32e7eSjoerg 
424*13fbcb42Sjoerg #endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules)   \
425*13fbcb42Sjoerg           || defined(__BMI__) */
42606f32e7eSjoerg 
42706f32e7eSjoerg #endif /* __BMIINTRIN_H */
428