11188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/*===---- bmiintrin.h - BMI intrinsics -------------------------------------===
21188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
31188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * Permission is hereby granted, free of charge, to any person obtaining a copy
41188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * of this software and associated documentation files (the "Software"), to deal
51188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * in the Software without restriction, including without limitation the rights
61188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
71188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * copies of the Software, and to permit persons to whom the Software is
81188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * furnished to do so, subject to the following conditions:
91188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * The above copyright notice and this permission notice shall be included in
111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * all copies or substantial portions of the Software.
121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * THE SOFTWARE.
201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *===-----------------------------------------------------------------------===
221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker */
231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif
271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#ifndef __BMIINTRIN_H
291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define __BMIINTRIN_H
301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned short _tzcnt_u16(unsigned short a);
371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 16-bit integer whose trailing zeros are to be counted.
431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 16-bit integer containing the number of trailing zero
441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _tzcnt_u16(a)     (__tzcnt_u16((a)))
461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    complement of the first operand.
491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
511188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
521188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
531188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned int _andn_u32(unsigned int a, unsigned int b);
541188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
591188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing one of the operands.
601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param b
611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing one of the operands.
621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the bitwise AND of the second
631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand with the one's complement of the first operand.
641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _andn_u32(a, b)   (__andn_u32((a), (b)))
651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* _bextr_u32 != __bextr_u32 */
671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
681188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    containing a value of 1 and returns the result.
691188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
701188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
711188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
721188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
731188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned int _blsi_u32(unsigned int a);
741188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
751188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
761188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
771188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
781188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
791188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer whose bits are to be cleared.
801188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the result of clearing the bits from
811188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    the source operand.
821188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsi_u32(a)      (__blsi_u32((a)))
831188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
841188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
851188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    including the least siginificant bit that is set to 1 in the source
861188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
871188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
881188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
891188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
901188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
911188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned int _blsmsk_u32(unsigned int a);
921188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
931188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
941188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
951188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
961188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
971188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to create the mask.
981188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the newly created mask.
991188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsmsk_u32(a)    (__blsmsk_u32((a)))
1001188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1011188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
1021188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
1031188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1041188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
1051188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1061188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
1071188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned int _blsr_u32(unsigned int a);
1081188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
1091188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
1111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
1131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing the operand to be cleared.
1141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the result of clearing the source
1151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand.
1161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsr_u32(a)      (__blsr_u32((a)))
1171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
1191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
1211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
1231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned int _tzcnt_u32(unsigned int a);
1241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
1251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
1271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
1291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
1301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 32-bit integer containing the number of trailing zero
1311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
1321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _tzcnt_u32(a)     (__tzcnt_u32((a)))
1331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* Define the default attributes for the functions in this file. */
1351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
1361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT
1381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker   instruction behaves as BSF on non-BMI targets, there is code that expects
1391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker   to use it as a potentially faster version of BSF. */
1401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
1411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
1431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
1451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
1471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
1491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 16-bit integer whose trailing zeros are to be counted.
1501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 16-bit integer containing the number of trailing zero
1511188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
1521188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned short __RELAXED_FN_ATTRS
1531188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__tzcnt_u16(unsigned short __X)
1541188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
1551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_ctzs(__X) : 16;
1561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
1571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
1591188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    complement of the first operand.
1601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
1621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
1641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
1661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing one of the operands.
1671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
1681188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing one of the operands.
1691188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the bitwise AND of the second
1701188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand with the one's complement of the first operand.
1711188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
1721188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__andn_u32(unsigned int __X, unsigned int __Y)
1731188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
1741188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return ~__X & __Y;
1751188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
1761188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1771188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* AMD-specified, double-leading-underscore version of BEXTR */
1781188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
1791188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    in the least significant bits of the result.
1801188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1811188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
1821188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1831188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
1841188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
1851188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
1861188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer whose bits are to be extracted.
1871188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
1881188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
1891188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    specify the index of the least significant bit. Bits [15:8] specify the
1901188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    number of bits to be extracted.
1911188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer whose least significant bits contain the
1921188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    extracted bits.
1931188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
1941188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__bextr_u32(unsigned int __X, unsigned int __Y)
1951188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
1961188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __builtin_ia32_bextr_u32(__X, __Y);
1971188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
1981188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
1991188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* Intel-specified, single-leading-underscore version of BEXTR */
2001188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
2011188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    in the least significant bits of the result.
2021188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2031188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2041188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2051188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
2061188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2071188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2081188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer whose bits are to be extracted.
2091188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
2101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to specify the index of the least significant
2111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bit for the bits to be extracted. Bits [7:0] specify the index.
2121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Z
2131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to specify the number of bits to be extracted.
2141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    Bits [7:0] specify the number of bits.
2151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer whose least significant bits contain the
2161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    extracted bits.
2171188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z)
2191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
2201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
2211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
2221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
2231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
2241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    containing a value of 1 and returns the result.
2251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
2291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer whose bits are to be cleared.
2321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the result of clearing the bits from
2331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    the source operand.
2341188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsi_u32(unsigned int __X)
2361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
2371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X & -__X;
2381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
2391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
2401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
2411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    including the least siginificant bit that is set to 1 in the source
2421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
2431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
2471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to create the mask.
2501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the newly created mask.
2511188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2521188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsmsk_u32(unsigned int __X)
2531188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
2541188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ^ (__X - 1);
2551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
2561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
2571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
2581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
2591188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
2631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer containing the operand to be cleared.
2661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned integer containing the result of clearing the source
2671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand.
2681188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2691188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsr_u32(unsigned int __X)
2701188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
2711188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X & (__X - 1);
2721188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
2731188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
2741188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
2751188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2761188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2771188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2781188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
2791188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2801188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2811188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
2821188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 32-bit integer containing the number of trailing zero
2831188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
2841188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __RELAXED_FN_ATTRS
2851188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__tzcnt_u32(unsigned int __X)
2861188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
2871188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_ctz(__X) : 32;
2881188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
2891188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
2901188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
2911188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2921188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
2931188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2941188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
2951188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
2961188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
2971188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
2981188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An 32-bit integer containing the number of trailing zero
2991188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
3001188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ int __RELAXED_FN_ATTRS
3011188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_mm_tzcnt_32(unsigned int __X)
3021188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
3031188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_ctz(__X) : 32;
3041188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
3051188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3061188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#ifdef __x86_64__
3071188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3081188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
3091188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    complement of the first operand.
3101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
3141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned long long _andn_u64 (unsigned long long a, unsigned long long b);
3151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
3161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
3181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
3201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
3211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param b
3221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
3231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the bitwise AND of the second
3241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand with the one's complement of the first operand.
3251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _andn_u64(a, b)   (__andn_u64((a), (b)))
3261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* _bextr_u64 != __bextr_u64 */
3281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
3291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    containing a value of 1 and returns the result.
3301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
3341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned long long _blsi_u64(unsigned long long a);
3351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
3361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
3381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
3401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose bits are to be cleared.
3411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
3421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits from the source operand.
3431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsi_u64(a)      (__blsi_u64((a)))
3441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
3461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    including the least siginificant bit that is set to 1 in the source
3471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
3481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3511188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
3521188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned long long _blsmsk_u64(unsigned long long a);
3531188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
3541188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
3561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
3581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer used to create the mask.
3591188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns A unsigned 64-bit integer containing the newly created mask.
3601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsmsk_u64(a)    (__blsmsk_u64((a)))
3611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
3631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
3641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
3681188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned long long _blsr_u64(unsigned long long a);
3691188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
3701188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3711188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
3721188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3731188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
3741188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing the operand to be cleared.
3751188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
3761188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    source operand.
3771188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _blsr_u64(a)      (__blsr_u64((a)))
3781188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3791188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
3801188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3811188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3821188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3831188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \code
3841188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// unsigned long long _tzcnt_u64(unsigned long long a);
3851188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \endcode
3861188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3871188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
3881188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3891188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param a
3901188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
3911188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the number of trailing zero
3921188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
3931188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define _tzcnt_u64(a)     (__tzcnt_u64((a)))
3941188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
3951188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
3961188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    complement of the first operand.
3971188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
3981188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
3991188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4001188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
4011188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4021188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
4031188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
4041188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
4051188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
4061188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the bitwise AND of the second
4071188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand with the one's complement of the first operand.
4081188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4091188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__andn_u64 (unsigned long long __X, unsigned long long __Y)
4101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
4111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return ~__X & __Y;
4121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
4131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
4141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* AMD-specified, double-leading-underscore version of BEXTR */
4151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
4161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    in the least significant bits of the result.
4171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
4191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
4211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
4231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose bits are to be extracted.
4241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
4251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
4261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
4271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    the number of bits to be extracted.
4281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer whose least significant bits contain the
4291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    extracted bits.
4301188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__bextr_u64(unsigned long long __X, unsigned long long __Y)
4321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
4331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __builtin_ia32_bextr_u64(__X, __Y);
4341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
4351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
4361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* Intel-specified, single-leading-underscore version of BEXTR */
4371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
4381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///     in the least significant bits of the result.
4391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
4411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
4431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
4451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose bits are to be extracted.
4461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Y
4471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to specify the index of the least significant
4481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bit for the bits to be extracted. Bits [7:0] specify the index.
4491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __Z
4501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned integer used to specify the number of bits to be extracted.
4511188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    Bits [7:0] specify the number of bits.
4521188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer whose least significant bits contain the
4531188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    extracted bits.
4541188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_bextr_u64(unsigned long long __X, unsigned int __Y, unsigned int __Z)
4561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
4571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
4581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
4591188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
4601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
4611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    containing a value of 1 and returns the result.
4621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
4641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
4661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
4681188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose bits are to be cleared.
4691188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
4701188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits from the source operand.
4711188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4721188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsi_u64(unsigned long long __X)
4731188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
4741188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X & -__X;
4751188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
4761188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
4771188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
4781188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    including the least siginificant bit that is set to 1 in the source
4791188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
4801188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4811188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
4821188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4831188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
4841188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4851188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
4861188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer used to create the mask.
4871188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns A unsigned 64-bit integer containing the newly created mask.
4881188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4891188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsmsk_u64(unsigned long long __X)
4901188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
4911188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ^ (__X - 1);
4921188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
4931188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
4941188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
4951188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    operand and returns the result.
4961188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4971188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
4981188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
4991188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
5001188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5011188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
5021188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer containing the operand to be cleared.
5031188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
5041188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    source operand.
5051188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
5061188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__blsr_u64(unsigned long long __X)
5071188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
5081188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X & (__X - 1);
5091188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
5101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
5111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
5121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
5141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
5161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
5181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
5191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An unsigned 64-bit integer containing the number of trailing zero
5201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
5211188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __RELAXED_FN_ATTRS
5221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__tzcnt_u64(unsigned long long __X)
5231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
5241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_ctzll(__X) : 64;
5251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
5261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
5271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
5281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \headerfile <x86intrin.h>
5301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
5321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///
5331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \param __X
5341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
5351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/// \returns An 64-bit integer containing the number of trailing zero
5361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker///    bits in the operand.
5371188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ long long __RELAXED_FN_ATTRS
5381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_mm_tzcnt_64(unsigned long long __X)
5391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
5401188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_ctzll(__X) : 64;
5411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
5421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
5431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif /* __x86_64__ */
5441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
5451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#undef __DEFAULT_FN_ATTRS
5461188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#undef __RELAXED_FN_ATTRS
5471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
5481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif /* __BMIINTRIN_H */
549