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