16bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/*===---- bmiintrin.h - BMI intrinsics -------------------------------------===
26bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker *
36bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * Permission is hereby granted, free of charge, to any person obtaining a copy
46bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * of this software and associated documentation files (the "Software"), to deal
56bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * in the Software without restriction, including without limitation the rights
66bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
76bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * copies of the Software, and to permit persons to whom the Software is
86bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * furnished to do so, subject to the following conditions:
96bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker *
106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * The above copyright notice and this permission notice shall be included in
116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * all copies or substantial portions of the Software.
126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker *
136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker * THE SOFTWARE.
206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker *
216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker *===-----------------------------------------------------------------------===
226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker */
236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#endif
276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#ifndef __BMIINTRIN_H
296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define __BMIINTRIN_H
306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned short _tzcnt_u16(unsigned short a);
376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 16-bit integer whose trailing zeros are to be counted.
436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 16-bit integer containing the number of trailing zero
446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _tzcnt_u16(a)     (__tzcnt_u16((a)))
466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    complement of the first operand.
496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned int _andn_u32(unsigned int a, unsigned int b);
546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing one of the operands.
606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param b
616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing one of the operands.
626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the bitwise AND of the second
636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand with the one's complement of the first operand.
646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _andn_u32(a, b)   (__andn_u32((a), (b)))
656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* _bextr_u32 != __bextr_u32 */
676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    containing a value of 1 and returns the result.
696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned int _blsi_u32(unsigned int a);
746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer whose bits are to be cleared.
806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the result of clearing the bits from
816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    the source operand.
826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsi_u32(a)      (__blsi_u32((a)))
836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    including the least siginificant bit that is set to 1 in the source
866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned int _blsmsk_u32(unsigned int a);
926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to create the mask.
986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the newly created mask.
996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsmsk_u32(a)    (__blsmsk_u32((a)))
1006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
1026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
1036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
1056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
1076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned int _blsr_u32(unsigned int a);
1086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
1096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
1116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
1136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing the operand to be cleared.
1146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the result of clearing the source
1156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand.
1166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsr_u32(a)      (__blsr_u32((a)))
1176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
1196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
1216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
1236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned int _tzcnt_u32(unsigned int a);
1246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
1256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
1276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
1296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
1306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 32-bit integer containing the number of trailing zero
1316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
1326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _tzcnt_u32(a)     (__tzcnt_u32((a)))
1336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* Define the default attributes for the functions in this file. */
1356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
1366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT
1386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker   instruction behaves as BSF on non-BMI targets, there is code that expects
1396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker   to use it as a potentially faster version of BSF. */
1406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
1416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
1436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
1456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
1476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
1496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 16-bit integer whose trailing zeros are to be counted.
1506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 16-bit integer containing the number of trailing zero
1516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
1526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned short __RELAXED_FN_ATTRS
1536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__tzcnt_u16(unsigned short __X)
1546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
1556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ? __builtin_ctzs(__X) : 16;
1566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
1576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
1596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    complement of the first operand.
1606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
1626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
1646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
1666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing one of the operands.
1676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
1686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing one of the operands.
1696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the bitwise AND of the second
1706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand with the one's complement of the first operand.
1716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
1726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__andn_u32(unsigned int __X, unsigned int __Y)
1736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
1746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return ~__X & __Y;
1756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
1766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* AMD-specified, double-leading-underscore version of BEXTR */
1786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
1796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    in the least significant bits of the result.
1806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
1826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
1846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
1856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
1866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer whose bits are to be extracted.
1876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
1886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to specify which bits are extracted. Bits [7:0]
1896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    specify the index of the least significant bit. Bits [15:8] specify the
1906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    number of bits to be extracted.
1916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer whose least significant bits contain the
1926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    extracted bits.
1936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
1946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__bextr_u32(unsigned int __X, unsigned int __Y)
1956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
1966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __builtin_ia32_bextr_u32(__X, __Y);
1976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
1986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* Intel-specified, single-leading-underscore version of BEXTR */
2006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
2016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    in the least significant bits of the result.
2026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
2066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer whose bits are to be extracted.
2096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
2106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to specify the index of the least significant
2116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bit for the bits to be extracted. Bits [7:0] specify the index.
2126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Z
2136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to specify the number of bits to be extracted.
2146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    Bits [7:0] specify the number of bits.
2156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer whose least significant bits contain the
2166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    extracted bits.
2176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker_bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z)
2196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
2206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
2216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
2226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
2246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    containing a value of 1 and returns the result.
2256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
2296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer whose bits are to be cleared.
2326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the result of clearing the bits from
2336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    the source operand.
2346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsi_u32(unsigned int __X)
2366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
2376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X & -__X;
2386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
2396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
2416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    including the least siginificant bit that is set to 1 in the source
2426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
2436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
2476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to create the mask.
2506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the newly created mask.
2516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsmsk_u32(unsigned int __X)
2536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
2546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ^ (__X - 1);
2556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
2566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
2586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
2596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
2636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer containing the operand to be cleared.
2666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned integer containing the result of clearing the source
2676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand.
2686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
2696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsr_u32(unsigned int __X)
2706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
2716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X & (__X - 1);
2726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
2736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
2756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
2796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
2826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 32-bit integer containing the number of trailing zero
2836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
2846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned int __RELAXED_FN_ATTRS
2856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__tzcnt_u32(unsigned int __X)
2866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
2876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ? __builtin_ctz(__X) : 32;
2886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
2896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
2916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
2936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
2956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
2966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
2976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 32-bit integer whose trailing zeros are to be counted.
2986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An 32-bit integer containing the number of trailing zero
2996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
3006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ int __RELAXED_FN_ATTRS
3016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker_mm_tzcnt_32(unsigned int __X)
3026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
3036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ? __builtin_ctz(__X) : 32;
3046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
3056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#ifdef __x86_64__
3076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
3096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    complement of the first operand.
3106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
3146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned long long _andn_u64 (unsigned long long a, unsigned long long b);
3156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
3166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
3186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
3206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
3216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param b
3226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
3236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the bitwise AND of the second
3246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand with the one's complement of the first operand.
3256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _andn_u64(a, b)   (__andn_u64((a), (b)))
3266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* _bextr_u64 != __bextr_u64 */
3286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
3296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    containing a value of 1 and returns the result.
3306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
3346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned long long _blsi_u64(unsigned long long a);
3356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
3366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
3386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
3406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose bits are to be cleared.
3416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
3426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits from the source operand.
3436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsi_u64(a)      (__blsi_u64((a)))
3446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
3466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    including the least siginificant bit that is set to 1 in the source
3476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
3486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
3526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned long long _blsmsk_u64(unsigned long long a);
3536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
3546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
3566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
3586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer used to create the mask.
3596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns A unsigned 64-bit integer containing the newly created mask.
3606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsmsk_u64(a)    (__blsmsk_u64((a)))
3616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
3636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
3646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
3686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned long long _blsr_u64(unsigned long long a);
3696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
3706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
3726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
3746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing the operand to be cleared.
3756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
3766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    source operand.
3776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _blsr_u64(a)      (__blsr_u64((a)))
3786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
3806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \code
3846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// unsigned long long _tzcnt_u64(unsigned long long a);
3856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \endcode
3866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
3886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param a
3906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
3916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the number of trailing zero
3926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
3936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#define _tzcnt_u64(a)     (__tzcnt_u64((a)))
3946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Performs a bitwise AND of the second operand with the one's
3966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    complement of the first operand.
3976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
3986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
3996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c ANDN instruction.
4016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
4036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
4046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
4056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing one of the operands.
4066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the bitwise AND of the second
4076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand with the one's complement of the first operand.
4086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__andn_u64 (unsigned long long __X, unsigned long long __Y)
4106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
4116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return ~__X & __Y;
4126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
4136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* AMD-specified, double-leading-underscore version of BEXTR */
4156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
4166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    in the least significant bits of the result.
4176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
4196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
4216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
4236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose bits are to be extracted.
4246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
4256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer used to specify which bits are extracted. Bits
4266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    [7:0] specify the index of the least significant bit. Bits [15:8] specify
4276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    the number of bits to be extracted.
4286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer whose least significant bits contain the
4296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    extracted bits.
4306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__bextr_u64(unsigned long long __X, unsigned long long __Y)
4326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
4336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __builtin_ia32_bextr_u64(__X, __Y);
4346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
4356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/* Intel-specified, single-leading-underscore version of BEXTR */
4376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Extracts the specified bits from the first operand and returns them
4386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///     in the least significant bits of the result.
4396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
4416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BEXTR instruction.
4436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
4456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose bits are to be extracted.
4466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Y
4476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to specify the index of the least significant
4486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bit for the bits to be extracted. Bits [7:0] specify the index.
4496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __Z
4506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned integer used to specify the number of bits to be extracted.
4516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    Bits [7:0] specify the number of bits.
4526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer whose least significant bits contain the
4536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    extracted bits.
4546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker_bextr_u64(unsigned long long __X, unsigned int __Y, unsigned int __Z)
4566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
4576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
4586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
4596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears all bits in the source except for the least significant bit
4616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    containing a value of 1 and returns the result.
4626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
4646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSI instruction.
4666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
4686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose bits are to be cleared.
4696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
4706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits from the source operand.
4716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsi_u64(unsigned long long __X)
4736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
4746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X & -__X;
4756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
4766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Creates a mask whose bits are set to 1, using bit 0 up to and
4786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    including the least siginificant bit that is set to 1 in the source
4796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
4806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
4826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSMSK instruction.
4846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
4866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer used to create the mask.
4876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns A unsigned 64-bit integer containing the newly created mask.
4886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
4896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsmsk_u64(unsigned long long __X)
4906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
4916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ^ (__X - 1);
4926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
4936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Clears the least siginificant bit that is set to 1 in the source
4956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    operand and returns the result.
4966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
4986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
4996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c BLSR instruction.
5006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
5026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer containing the operand to be cleared.
5036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the result of clearing the
5046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    source operand.
5056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
5066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__blsr_u64(unsigned long long __X)
5076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
5086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X & (__X - 1);
5096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
5106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
5116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
5126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
5146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
5166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
5186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
5196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An unsigned 64-bit integer containing the number of trailing zero
5206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
5216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ unsigned long long __RELAXED_FN_ATTRS
5226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker__tzcnt_u64(unsigned long long __X)
5236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
5246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ? __builtin_ctzll(__X) : 64;
5256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
5266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
5276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \brief Counts the number of trailing zero bits in the operand.
5286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \headerfile <x86intrin.h>
5306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// This intrinsic corresponds to the \c TZCNT instruction.
5326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///
5336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \param __X
5346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    An unsigned 64-bit integer whose trailing zeros are to be counted.
5356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker/// \returns An 64-bit integer containing the number of trailing zero
5366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker///    bits in the operand.
5376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerstatic __inline__ long long __RELAXED_FN_ATTRS
5386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker_mm_tzcnt_64(unsigned long long __X)
5396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker{
5406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  return __X ? __builtin_ctzll(__X) : 64;
5416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
5426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
5436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#endif /* __x86_64__ */
5446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
5456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#undef __DEFAULT_FN_ATTRS
5466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#undef __RELAXED_FN_ATTRS
5476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
5486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#endif /* __BMIINTRIN_H */
549