1*bed243d3SAndroid Build Coastguard Worker /*===---- bmiintrin.h - BMI intrinsics -------------------------------------===
2*bed243d3SAndroid Build Coastguard Worker *
3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker *
7*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker */
9*bed243d3SAndroid Build Coastguard Worker
10*bed243d3SAndroid Build Coastguard Worker #if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
11*bed243d3SAndroid Build Coastguard Worker #error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
12*bed243d3SAndroid Build Coastguard Worker #endif
13*bed243d3SAndroid Build Coastguard Worker
14*bed243d3SAndroid Build Coastguard Worker #ifndef __BMIINTRIN_H
15*bed243d3SAndroid Build Coastguard Worker #define __BMIINTRIN_H
16*bed243d3SAndroid Build Coastguard Worker
17*bed243d3SAndroid Build Coastguard Worker /* Allow using the tzcnt intrinsics even for non-BMI targets. Since the TZCNT
18*bed243d3SAndroid Build Coastguard Worker instruction behaves as BSF on non-BMI targets, there is code that expects
19*bed243d3SAndroid Build Coastguard Worker to use it as a potentially faster version of BSF. */
20*bed243d3SAndroid Build Coastguard Worker #define __RELAXED_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
21*bed243d3SAndroid Build Coastguard Worker
22*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
23*bed243d3SAndroid Build Coastguard Worker ///
24*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
25*bed243d3SAndroid Build Coastguard Worker ///
26*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
27*bed243d3SAndroid Build Coastguard Worker ///
28*bed243d3SAndroid Build Coastguard Worker /// \param __X
29*bed243d3SAndroid Build Coastguard Worker /// An unsigned 16-bit integer whose trailing zeros are to be counted.
30*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 16-bit integer containing the number of trailing zero
31*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
32*bed243d3SAndroid Build Coastguard Worker /// \see _tzcnt_u16
33*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned short __RELAXED_FN_ATTRS
__tzcnt_u16(unsigned short __X)34*bed243d3SAndroid Build Coastguard Worker __tzcnt_u16(unsigned short __X)
35*bed243d3SAndroid Build Coastguard Worker {
36*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_tzcnt_u16(__X);
37*bed243d3SAndroid Build Coastguard Worker }
38*bed243d3SAndroid Build Coastguard Worker
39*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
40*bed243d3SAndroid Build Coastguard Worker ///
41*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
42*bed243d3SAndroid Build Coastguard Worker ///
43*bed243d3SAndroid Build Coastguard Worker /// \code
44*bed243d3SAndroid Build Coastguard Worker /// unsigned short _tzcnt_u16(unsigned short __X);
45*bed243d3SAndroid Build Coastguard Worker /// \endcode
46*bed243d3SAndroid Build Coastguard Worker ///
47*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
48*bed243d3SAndroid Build Coastguard Worker ///
49*bed243d3SAndroid Build Coastguard Worker /// \param __X
50*bed243d3SAndroid Build Coastguard Worker /// An unsigned 16-bit integer whose trailing zeros are to be counted.
51*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 16-bit integer containing the number of trailing zero
52*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
53*bed243d3SAndroid Build Coastguard Worker /// \see __tzcnt_u16
54*bed243d3SAndroid Build Coastguard Worker #define _tzcnt_u16 __tzcnt_u16
55*bed243d3SAndroid Build Coastguard Worker
56*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
57*bed243d3SAndroid Build Coastguard Worker ///
58*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
59*bed243d3SAndroid Build Coastguard Worker ///
60*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
61*bed243d3SAndroid Build Coastguard Worker ///
62*bed243d3SAndroid Build Coastguard Worker /// \param __X
63*bed243d3SAndroid Build Coastguard Worker /// An unsigned 32-bit integer whose trailing zeros are to be counted.
64*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 32-bit integer containing the number of trailing zero
65*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
66*bed243d3SAndroid Build Coastguard Worker /// \see { _mm_tzcnt_32 _tzcnt_u32 }
67*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __RELAXED_FN_ATTRS
__tzcnt_u32(unsigned int __X)68*bed243d3SAndroid Build Coastguard Worker __tzcnt_u32(unsigned int __X)
69*bed243d3SAndroid Build Coastguard Worker {
70*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_tzcnt_u32(__X);
71*bed243d3SAndroid Build Coastguard Worker }
72*bed243d3SAndroid Build Coastguard Worker
73*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
74*bed243d3SAndroid Build Coastguard Worker ///
75*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
76*bed243d3SAndroid Build Coastguard Worker ///
77*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
78*bed243d3SAndroid Build Coastguard Worker ///
79*bed243d3SAndroid Build Coastguard Worker /// \param __X
80*bed243d3SAndroid Build Coastguard Worker /// An unsigned 32-bit integer whose trailing zeros are to be counted.
81*bed243d3SAndroid Build Coastguard Worker /// \returns A 32-bit integer containing the number of trailing zero bits in
82*bed243d3SAndroid Build Coastguard Worker /// the operand.
83*bed243d3SAndroid Build Coastguard Worker /// \see { __tzcnt_u32 _tzcnt_u32 }
84*bed243d3SAndroid Build Coastguard Worker static __inline__ int __RELAXED_FN_ATTRS
_mm_tzcnt_32(unsigned int __X)85*bed243d3SAndroid Build Coastguard Worker _mm_tzcnt_32(unsigned int __X)
86*bed243d3SAndroid Build Coastguard Worker {
87*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_ia32_tzcnt_u32(__X);
88*bed243d3SAndroid Build Coastguard Worker }
89*bed243d3SAndroid Build Coastguard Worker
90*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
91*bed243d3SAndroid Build Coastguard Worker ///
92*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
93*bed243d3SAndroid Build Coastguard Worker ///
94*bed243d3SAndroid Build Coastguard Worker /// \code
95*bed243d3SAndroid Build Coastguard Worker /// unsigned int _tzcnt_u32(unsigned int __X);
96*bed243d3SAndroid Build Coastguard Worker /// \endcode
97*bed243d3SAndroid Build Coastguard Worker ///
98*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
99*bed243d3SAndroid Build Coastguard Worker ///
100*bed243d3SAndroid Build Coastguard Worker /// \param __X
101*bed243d3SAndroid Build Coastguard Worker /// An unsigned 32-bit integer whose trailing zeros are to be counted.
102*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 32-bit integer containing the number of trailing zero
103*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
104*bed243d3SAndroid Build Coastguard Worker /// \see { _mm_tzcnt_32 __tzcnt_u32 }
105*bed243d3SAndroid Build Coastguard Worker #define _tzcnt_u32 __tzcnt_u32
106*bed243d3SAndroid Build Coastguard Worker
107*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
108*bed243d3SAndroid Build Coastguard Worker
109*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
110*bed243d3SAndroid Build Coastguard Worker ///
111*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
112*bed243d3SAndroid Build Coastguard Worker ///
113*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
114*bed243d3SAndroid Build Coastguard Worker ///
115*bed243d3SAndroid Build Coastguard Worker /// \param __X
116*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose trailing zeros are to be counted.
117*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the number of trailing zero
118*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
119*bed243d3SAndroid Build Coastguard Worker /// \see { _mm_tzcnt_64 _tzcnt_u64 }
120*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __RELAXED_FN_ATTRS
__tzcnt_u64(unsigned long long __X)121*bed243d3SAndroid Build Coastguard Worker __tzcnt_u64(unsigned long long __X)
122*bed243d3SAndroid Build Coastguard Worker {
123*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_tzcnt_u64(__X);
124*bed243d3SAndroid Build Coastguard Worker }
125*bed243d3SAndroid Build Coastguard Worker
126*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
127*bed243d3SAndroid Build Coastguard Worker ///
128*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
129*bed243d3SAndroid Build Coastguard Worker ///
130*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
131*bed243d3SAndroid Build Coastguard Worker ///
132*bed243d3SAndroid Build Coastguard Worker /// \param __X
133*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose trailing zeros are to be counted.
134*bed243d3SAndroid Build Coastguard Worker /// \returns An 64-bit integer containing the number of trailing zero bits in
135*bed243d3SAndroid Build Coastguard Worker /// the operand.
136*bed243d3SAndroid Build Coastguard Worker /// \see { __tzcnt_u64 _tzcnt_u64 }
137*bed243d3SAndroid Build Coastguard Worker static __inline__ long long __RELAXED_FN_ATTRS
_mm_tzcnt_64(unsigned long long __X)138*bed243d3SAndroid Build Coastguard Worker _mm_tzcnt_64(unsigned long long __X)
139*bed243d3SAndroid Build Coastguard Worker {
140*bed243d3SAndroid Build Coastguard Worker return (long long)__builtin_ia32_tzcnt_u64(__X);
141*bed243d3SAndroid Build Coastguard Worker }
142*bed243d3SAndroid Build Coastguard Worker
143*bed243d3SAndroid Build Coastguard Worker /// Counts the number of trailing zero bits in the operand.
144*bed243d3SAndroid Build Coastguard Worker ///
145*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
146*bed243d3SAndroid Build Coastguard Worker ///
147*bed243d3SAndroid Build Coastguard Worker /// \code
148*bed243d3SAndroid Build Coastguard Worker /// unsigned long long _tzcnt_u64(unsigned long long __X);
149*bed243d3SAndroid Build Coastguard Worker /// \endcode
150*bed243d3SAndroid Build Coastguard Worker ///
151*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c TZCNT instruction.
152*bed243d3SAndroid Build Coastguard Worker ///
153*bed243d3SAndroid Build Coastguard Worker /// \param __X
154*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose trailing zeros are to be counted.
155*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the number of trailing zero
156*bed243d3SAndroid Build Coastguard Worker /// bits in the operand.
157*bed243d3SAndroid Build Coastguard Worker /// \see { _mm_tzcnt_64 __tzcnt_u64
158*bed243d3SAndroid Build Coastguard Worker #define _tzcnt_u64 __tzcnt_u64
159*bed243d3SAndroid Build Coastguard Worker
160*bed243d3SAndroid Build Coastguard Worker #endif /* __x86_64__ */
161*bed243d3SAndroid Build Coastguard Worker
162*bed243d3SAndroid Build Coastguard Worker #undef __RELAXED_FN_ATTRS
163*bed243d3SAndroid Build Coastguard Worker
164*bed243d3SAndroid Build Coastguard Worker #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
165*bed243d3SAndroid Build Coastguard Worker defined(__BMI__)
166*bed243d3SAndroid Build Coastguard Worker
167*bed243d3SAndroid Build Coastguard Worker /* Define the default attributes for the functions in this file. */
168*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
169*bed243d3SAndroid Build Coastguard Worker
170*bed243d3SAndroid Build Coastguard Worker /// Performs a bitwise AND of the second operand with the one's
171*bed243d3SAndroid Build Coastguard Worker /// complement of the first operand.
172*bed243d3SAndroid Build Coastguard Worker ///
173*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
174*bed243d3SAndroid Build Coastguard Worker ///
175*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c ANDN instruction.
176*bed243d3SAndroid Build Coastguard Worker ///
177*bed243d3SAndroid Build Coastguard Worker /// \param __X
178*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing one of the operands.
179*bed243d3SAndroid Build Coastguard Worker /// \param __Y
180*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing one of the operands.
181*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the bitwise AND of the second
182*bed243d3SAndroid Build Coastguard Worker /// operand with the one's complement of the first operand.
183*bed243d3SAndroid Build Coastguard Worker /// \see _andn_u32
184*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
__andn_u32(unsigned int __X,unsigned int __Y)185*bed243d3SAndroid Build Coastguard Worker __andn_u32(unsigned int __X, unsigned int __Y)
186*bed243d3SAndroid Build Coastguard Worker {
187*bed243d3SAndroid Build Coastguard Worker return ~__X & __Y;
188*bed243d3SAndroid Build Coastguard Worker }
189*bed243d3SAndroid Build Coastguard Worker
190*bed243d3SAndroid Build Coastguard Worker /// Performs a bitwise AND of the second operand with the one's
191*bed243d3SAndroid Build Coastguard Worker /// complement of the first operand.
192*bed243d3SAndroid Build Coastguard Worker ///
193*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
194*bed243d3SAndroid Build Coastguard Worker ///
195*bed243d3SAndroid Build Coastguard Worker /// \code
196*bed243d3SAndroid Build Coastguard Worker /// unsigned int _andn_u32(unsigned int __X, unsigned int __Y);
197*bed243d3SAndroid Build Coastguard Worker /// \endcode
198*bed243d3SAndroid Build Coastguard Worker ///
199*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c ANDN instruction.
200*bed243d3SAndroid Build Coastguard Worker ///
201*bed243d3SAndroid Build Coastguard Worker /// \param __X
202*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing one of the operands.
203*bed243d3SAndroid Build Coastguard Worker /// \param __Y
204*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing one of the operands.
205*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the bitwise AND of the second
206*bed243d3SAndroid Build Coastguard Worker /// operand with the one's complement of the first operand.
207*bed243d3SAndroid Build Coastguard Worker /// \see __andn_u32
208*bed243d3SAndroid Build Coastguard Worker #define _andn_u32 __andn_u32
209*bed243d3SAndroid Build Coastguard Worker
210*bed243d3SAndroid Build Coastguard Worker /* AMD-specified, double-leading-underscore version of BEXTR */
211*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
212*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
213*bed243d3SAndroid Build Coastguard Worker ///
214*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
215*bed243d3SAndroid Build Coastguard Worker ///
216*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
217*bed243d3SAndroid Build Coastguard Worker ///
218*bed243d3SAndroid Build Coastguard Worker /// \param __X
219*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer whose bits are to be extracted.
220*bed243d3SAndroid Build Coastguard Worker /// \param __Y
221*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify which bits are extracted. Bits [7:0]
222*bed243d3SAndroid Build Coastguard Worker /// specify the index of the least significant bit. Bits [15:8] specify the
223*bed243d3SAndroid Build Coastguard Worker /// number of bits to be extracted.
224*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer whose least significant bits contain the
225*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
226*bed243d3SAndroid Build Coastguard Worker /// \see _bextr_u32
227*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
__bextr_u32(unsigned int __X,unsigned int __Y)228*bed243d3SAndroid Build Coastguard Worker __bextr_u32(unsigned int __X, unsigned int __Y)
229*bed243d3SAndroid Build Coastguard Worker {
230*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u32(__X, __Y);
231*bed243d3SAndroid Build Coastguard Worker }
232*bed243d3SAndroid Build Coastguard Worker
233*bed243d3SAndroid Build Coastguard Worker /* Intel-specified, single-leading-underscore version of BEXTR */
234*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
235*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
236*bed243d3SAndroid Build Coastguard Worker ///
237*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
238*bed243d3SAndroid Build Coastguard Worker ///
239*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
240*bed243d3SAndroid Build Coastguard Worker ///
241*bed243d3SAndroid Build Coastguard Worker /// \param __X
242*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer whose bits are to be extracted.
243*bed243d3SAndroid Build Coastguard Worker /// \param __Y
244*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify the index of the least significant
245*bed243d3SAndroid Build Coastguard Worker /// bit for the bits to be extracted. Bits [7:0] specify the index.
246*bed243d3SAndroid Build Coastguard Worker /// \param __Z
247*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify the number of bits to be extracted.
248*bed243d3SAndroid Build Coastguard Worker /// Bits [7:0] specify the number of bits.
249*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer whose least significant bits contain the
250*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
251*bed243d3SAndroid Build Coastguard Worker /// \see __bextr_u32
252*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
_bextr_u32(unsigned int __X,unsigned int __Y,unsigned int __Z)253*bed243d3SAndroid Build Coastguard Worker _bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z)
254*bed243d3SAndroid Build Coastguard Worker {
255*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
256*bed243d3SAndroid Build Coastguard Worker }
257*bed243d3SAndroid Build Coastguard Worker
258*bed243d3SAndroid Build Coastguard Worker /* Intel-specified, single-leading-underscore version of BEXTR2 */
259*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
260*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
261*bed243d3SAndroid Build Coastguard Worker ///
262*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
263*bed243d3SAndroid Build Coastguard Worker ///
264*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
265*bed243d3SAndroid Build Coastguard Worker ///
266*bed243d3SAndroid Build Coastguard Worker /// \param __X
267*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer whose bits are to be extracted.
268*bed243d3SAndroid Build Coastguard Worker /// \param __Y
269*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify which bits are extracted. Bits [7:0]
270*bed243d3SAndroid Build Coastguard Worker /// specify the index of the least significant bit. Bits [15:8] specify the
271*bed243d3SAndroid Build Coastguard Worker /// number of bits to be extracted.
272*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer whose least significant bits contain the
273*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
274*bed243d3SAndroid Build Coastguard Worker /// \see __bextr_u32
275*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
_bextr2_u32(unsigned int __X,unsigned int __Y)276*bed243d3SAndroid Build Coastguard Worker _bextr2_u32(unsigned int __X, unsigned int __Y) {
277*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u32(__X, __Y);
278*bed243d3SAndroid Build Coastguard Worker }
279*bed243d3SAndroid Build Coastguard Worker
280*bed243d3SAndroid Build Coastguard Worker /// Clears all bits in the source except for the least significant bit
281*bed243d3SAndroid Build Coastguard Worker /// containing a value of 1 and returns the result.
282*bed243d3SAndroid Build Coastguard Worker ///
283*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
284*bed243d3SAndroid Build Coastguard Worker ///
285*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSI instruction.
286*bed243d3SAndroid Build Coastguard Worker ///
287*bed243d3SAndroid Build Coastguard Worker /// \param __X
288*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer whose bits are to be cleared.
289*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the result of clearing the bits from
290*bed243d3SAndroid Build Coastguard Worker /// the source operand.
291*bed243d3SAndroid Build Coastguard Worker /// \see _blsi_u32
292*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsi_u32(unsigned int __X)293*bed243d3SAndroid Build Coastguard Worker __blsi_u32(unsigned int __X)
294*bed243d3SAndroid Build Coastguard Worker {
295*bed243d3SAndroid Build Coastguard Worker return __X & -__X;
296*bed243d3SAndroid Build Coastguard Worker }
297*bed243d3SAndroid Build Coastguard Worker
298*bed243d3SAndroid Build Coastguard Worker /// Clears all bits in the source except for the least significant bit
299*bed243d3SAndroid Build Coastguard Worker /// containing a value of 1 and returns the result.
300*bed243d3SAndroid Build Coastguard Worker ///
301*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
302*bed243d3SAndroid Build Coastguard Worker ///
303*bed243d3SAndroid Build Coastguard Worker /// \code
304*bed243d3SAndroid Build Coastguard Worker /// unsigned int _blsi_u32(unsigned int __X);
305*bed243d3SAndroid Build Coastguard Worker /// \endcode
306*bed243d3SAndroid Build Coastguard Worker ///
307*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSI instruction.
308*bed243d3SAndroid Build Coastguard Worker ///
309*bed243d3SAndroid Build Coastguard Worker /// \param __X
310*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer whose bits are to be cleared.
311*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the result of clearing the bits from
312*bed243d3SAndroid Build Coastguard Worker /// the source operand.
313*bed243d3SAndroid Build Coastguard Worker /// \see __blsi_u32
314*bed243d3SAndroid Build Coastguard Worker #define _blsi_u32 __blsi_u32
315*bed243d3SAndroid Build Coastguard Worker
316*bed243d3SAndroid Build Coastguard Worker /// Creates a mask whose bits are set to 1, using bit 0 up to and
317*bed243d3SAndroid Build Coastguard Worker /// including the least significant bit that is set to 1 in the source
318*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
319*bed243d3SAndroid Build Coastguard Worker ///
320*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
321*bed243d3SAndroid Build Coastguard Worker ///
322*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSMSK instruction.
323*bed243d3SAndroid Build Coastguard Worker ///
324*bed243d3SAndroid Build Coastguard Worker /// \param __X
325*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to create the mask.
326*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the newly created mask.
327*bed243d3SAndroid Build Coastguard Worker /// \see _blsmsk_u32
328*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsmsk_u32(unsigned int __X)329*bed243d3SAndroid Build Coastguard Worker __blsmsk_u32(unsigned int __X)
330*bed243d3SAndroid Build Coastguard Worker {
331*bed243d3SAndroid Build Coastguard Worker return __X ^ (__X - 1);
332*bed243d3SAndroid Build Coastguard Worker }
333*bed243d3SAndroid Build Coastguard Worker
334*bed243d3SAndroid Build Coastguard Worker /// Creates a mask whose bits are set to 1, using bit 0 up to and
335*bed243d3SAndroid Build Coastguard Worker /// including the least significant bit that is set to 1 in the source
336*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
337*bed243d3SAndroid Build Coastguard Worker ///
338*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
339*bed243d3SAndroid Build Coastguard Worker ///
340*bed243d3SAndroid Build Coastguard Worker /// \code
341*bed243d3SAndroid Build Coastguard Worker /// unsigned int _blsmsk_u32(unsigned int __X);
342*bed243d3SAndroid Build Coastguard Worker /// \endcode
343*bed243d3SAndroid Build Coastguard Worker ///
344*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSMSK instruction.
345*bed243d3SAndroid Build Coastguard Worker ///
346*bed243d3SAndroid Build Coastguard Worker /// \param __X
347*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to create the mask.
348*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the newly created mask.
349*bed243d3SAndroid Build Coastguard Worker /// \see __blsmsk_u32
350*bed243d3SAndroid Build Coastguard Worker #define _blsmsk_u32 __blsmsk_u32
351*bed243d3SAndroid Build Coastguard Worker
352*bed243d3SAndroid Build Coastguard Worker /// Clears the least significant bit that is set to 1 in the source
353*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
354*bed243d3SAndroid Build Coastguard Worker ///
355*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
356*bed243d3SAndroid Build Coastguard Worker ///
357*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSR instruction.
358*bed243d3SAndroid Build Coastguard Worker ///
359*bed243d3SAndroid Build Coastguard Worker /// \param __X
360*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing the operand to be cleared.
361*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the result of clearing the source
362*bed243d3SAndroid Build Coastguard Worker /// operand.
363*bed243d3SAndroid Build Coastguard Worker /// \see _blsr_u32
364*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __DEFAULT_FN_ATTRS
__blsr_u32(unsigned int __X)365*bed243d3SAndroid Build Coastguard Worker __blsr_u32(unsigned int __X)
366*bed243d3SAndroid Build Coastguard Worker {
367*bed243d3SAndroid Build Coastguard Worker return __X & (__X - 1);
368*bed243d3SAndroid Build Coastguard Worker }
369*bed243d3SAndroid Build Coastguard Worker
370*bed243d3SAndroid Build Coastguard Worker /// Clears the least significant bit that is set to 1 in the source
371*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
372*bed243d3SAndroid Build Coastguard Worker ///
373*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
374*bed243d3SAndroid Build Coastguard Worker ///
375*bed243d3SAndroid Build Coastguard Worker /// \code
376*bed243d3SAndroid Build Coastguard Worker /// unsigned int _bls4_u32(unsigned int __X);
377*bed243d3SAndroid Build Coastguard Worker /// \endcode
378*bed243d3SAndroid Build Coastguard Worker ///
379*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSR instruction.
380*bed243d3SAndroid Build Coastguard Worker ///
381*bed243d3SAndroid Build Coastguard Worker /// \param __X
382*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer containing the operand to be cleared.
383*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned integer containing the result of clearing the source
384*bed243d3SAndroid Build Coastguard Worker /// operand.
385*bed243d3SAndroid Build Coastguard Worker /// \see __blsr_u32
386*bed243d3SAndroid Build Coastguard Worker #define _blsr_u32 __blsr_u32
387*bed243d3SAndroid Build Coastguard Worker
388*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__
389*bed243d3SAndroid Build Coastguard Worker
390*bed243d3SAndroid Build Coastguard Worker /// Performs a bitwise AND of the second operand with the one's
391*bed243d3SAndroid Build Coastguard Worker /// complement of the first operand.
392*bed243d3SAndroid Build Coastguard Worker ///
393*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
394*bed243d3SAndroid Build Coastguard Worker ///
395*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c ANDN instruction.
396*bed243d3SAndroid Build Coastguard Worker ///
397*bed243d3SAndroid Build Coastguard Worker /// \param __X
398*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing one of the operands.
399*bed243d3SAndroid Build Coastguard Worker /// \param __Y
400*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing one of the operands.
401*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the bitwise AND of the second
402*bed243d3SAndroid Build Coastguard Worker /// operand with the one's complement of the first operand.
403*bed243d3SAndroid Build Coastguard Worker /// \see _andn_u64
404*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__andn_u64(unsigned long long __X,unsigned long long __Y)405*bed243d3SAndroid Build Coastguard Worker __andn_u64 (unsigned long long __X, unsigned long long __Y)
406*bed243d3SAndroid Build Coastguard Worker {
407*bed243d3SAndroid Build Coastguard Worker return ~__X & __Y;
408*bed243d3SAndroid Build Coastguard Worker }
409*bed243d3SAndroid Build Coastguard Worker
410*bed243d3SAndroid Build Coastguard Worker /// Performs a bitwise AND of the second operand with the one's
411*bed243d3SAndroid Build Coastguard Worker /// complement of the first operand.
412*bed243d3SAndroid Build Coastguard Worker ///
413*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
414*bed243d3SAndroid Build Coastguard Worker ///
415*bed243d3SAndroid Build Coastguard Worker /// \code
416*bed243d3SAndroid Build Coastguard Worker /// unsigned long long _andn_u64(unsigned long long __X,
417*bed243d3SAndroid Build Coastguard Worker /// unsigned long long __Y);
418*bed243d3SAndroid Build Coastguard Worker /// \endcode
419*bed243d3SAndroid Build Coastguard Worker ///
420*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c ANDN instruction.
421*bed243d3SAndroid Build Coastguard Worker ///
422*bed243d3SAndroid Build Coastguard Worker /// \param __X
423*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing one of the operands.
424*bed243d3SAndroid Build Coastguard Worker /// \param __Y
425*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing one of the operands.
426*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the bitwise AND of the second
427*bed243d3SAndroid Build Coastguard Worker /// operand with the one's complement of the first operand.
428*bed243d3SAndroid Build Coastguard Worker /// \see __andn_u64
429*bed243d3SAndroid Build Coastguard Worker #define _andn_u64 __andn_u64
430*bed243d3SAndroid Build Coastguard Worker
431*bed243d3SAndroid Build Coastguard Worker /* AMD-specified, double-leading-underscore version of BEXTR */
432*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
433*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
434*bed243d3SAndroid Build Coastguard Worker ///
435*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
436*bed243d3SAndroid Build Coastguard Worker ///
437*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
438*bed243d3SAndroid Build Coastguard Worker ///
439*bed243d3SAndroid Build Coastguard Worker /// \param __X
440*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose bits are to be extracted.
441*bed243d3SAndroid Build Coastguard Worker /// \param __Y
442*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer used to specify which bits are extracted. Bits
443*bed243d3SAndroid Build Coastguard Worker /// [7:0] specify the index of the least significant bit. Bits [15:8] specify
444*bed243d3SAndroid Build Coastguard Worker /// the number of bits to be extracted.
445*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer whose least significant bits contain the
446*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
447*bed243d3SAndroid Build Coastguard Worker /// \see _bextr_u64
448*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__bextr_u64(unsigned long long __X,unsigned long long __Y)449*bed243d3SAndroid Build Coastguard Worker __bextr_u64(unsigned long long __X, unsigned long long __Y)
450*bed243d3SAndroid Build Coastguard Worker {
451*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u64(__X, __Y);
452*bed243d3SAndroid Build Coastguard Worker }
453*bed243d3SAndroid Build Coastguard Worker
454*bed243d3SAndroid Build Coastguard Worker /* Intel-specified, single-leading-underscore version of BEXTR */
455*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
456*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
457*bed243d3SAndroid Build Coastguard Worker ///
458*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
459*bed243d3SAndroid Build Coastguard Worker ///
460*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
461*bed243d3SAndroid Build Coastguard Worker ///
462*bed243d3SAndroid Build Coastguard Worker /// \param __X
463*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose bits are to be extracted.
464*bed243d3SAndroid Build Coastguard Worker /// \param __Y
465*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify the index of the least significant
466*bed243d3SAndroid Build Coastguard Worker /// bit for the bits to be extracted. Bits [7:0] specify the index.
467*bed243d3SAndroid Build Coastguard Worker /// \param __Z
468*bed243d3SAndroid Build Coastguard Worker /// An unsigned integer used to specify the number of bits to be extracted.
469*bed243d3SAndroid Build Coastguard Worker /// Bits [7:0] specify the number of bits.
470*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer whose least significant bits contain the
471*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
472*bed243d3SAndroid Build Coastguard Worker /// \see __bextr_u64
473*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
_bextr_u64(unsigned long long __X,unsigned int __Y,unsigned int __Z)474*bed243d3SAndroid Build Coastguard Worker _bextr_u64(unsigned long long __X, unsigned int __Y, unsigned int __Z)
475*bed243d3SAndroid Build Coastguard Worker {
476*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
477*bed243d3SAndroid Build Coastguard Worker }
478*bed243d3SAndroid Build Coastguard Worker
479*bed243d3SAndroid Build Coastguard Worker /* Intel-specified, single-leading-underscore version of BEXTR2 */
480*bed243d3SAndroid Build Coastguard Worker /// Extracts the specified bits from the first operand and returns them
481*bed243d3SAndroid Build Coastguard Worker /// in the least significant bits of the result.
482*bed243d3SAndroid Build Coastguard Worker ///
483*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
484*bed243d3SAndroid Build Coastguard Worker ///
485*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BEXTR instruction.
486*bed243d3SAndroid Build Coastguard Worker ///
487*bed243d3SAndroid Build Coastguard Worker /// \param __X
488*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose bits are to be extracted.
489*bed243d3SAndroid Build Coastguard Worker /// \param __Y
490*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer used to specify which bits are extracted. Bits
491*bed243d3SAndroid Build Coastguard Worker /// [7:0] specify the index of the least significant bit. Bits [15:8] specify
492*bed243d3SAndroid Build Coastguard Worker /// the number of bits to be extracted.
493*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer whose least significant bits contain the
494*bed243d3SAndroid Build Coastguard Worker /// extracted bits.
495*bed243d3SAndroid Build Coastguard Worker /// \see __bextr_u64
496*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
_bextr2_u64(unsigned long long __X,unsigned long long __Y)497*bed243d3SAndroid Build Coastguard Worker _bextr2_u64(unsigned long long __X, unsigned long long __Y) {
498*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_bextr_u64(__X, __Y);
499*bed243d3SAndroid Build Coastguard Worker }
500*bed243d3SAndroid Build Coastguard Worker
501*bed243d3SAndroid Build Coastguard Worker /// Clears all bits in the source except for the least significant bit
502*bed243d3SAndroid Build Coastguard Worker /// containing a value of 1 and returns the result.
503*bed243d3SAndroid Build Coastguard Worker ///
504*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
505*bed243d3SAndroid Build Coastguard Worker ///
506*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSI instruction.
507*bed243d3SAndroid Build Coastguard Worker ///
508*bed243d3SAndroid Build Coastguard Worker /// \param __X
509*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose bits are to be cleared.
510*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the result of clearing the
511*bed243d3SAndroid Build Coastguard Worker /// bits from the source operand.
512*bed243d3SAndroid Build Coastguard Worker /// \see _blsi_u64
513*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsi_u64(unsigned long long __X)514*bed243d3SAndroid Build Coastguard Worker __blsi_u64(unsigned long long __X)
515*bed243d3SAndroid Build Coastguard Worker {
516*bed243d3SAndroid Build Coastguard Worker return __X & -__X;
517*bed243d3SAndroid Build Coastguard Worker }
518*bed243d3SAndroid Build Coastguard Worker
519*bed243d3SAndroid Build Coastguard Worker /// Clears all bits in the source except for the least significant bit
520*bed243d3SAndroid Build Coastguard Worker /// containing a value of 1 and returns the result.
521*bed243d3SAndroid Build Coastguard Worker ///
522*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
523*bed243d3SAndroid Build Coastguard Worker ///
524*bed243d3SAndroid Build Coastguard Worker /// \code
525*bed243d3SAndroid Build Coastguard Worker /// unsigned long long _blsi_u64(unsigned long long __X);
526*bed243d3SAndroid Build Coastguard Worker /// \endcode
527*bed243d3SAndroid Build Coastguard Worker ///
528*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSI instruction.
529*bed243d3SAndroid Build Coastguard Worker ///
530*bed243d3SAndroid Build Coastguard Worker /// \param __X
531*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer whose bits are to be cleared.
532*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the result of clearing the
533*bed243d3SAndroid Build Coastguard Worker /// bits from the source operand.
534*bed243d3SAndroid Build Coastguard Worker /// \see __blsi_u64
535*bed243d3SAndroid Build Coastguard Worker #define _blsi_u64 __blsi_u64
536*bed243d3SAndroid Build Coastguard Worker
537*bed243d3SAndroid Build Coastguard Worker /// Creates a mask whose bits are set to 1, using bit 0 up to and
538*bed243d3SAndroid Build Coastguard Worker /// including the least significant bit that is set to 1 in the source
539*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
540*bed243d3SAndroid Build Coastguard Worker ///
541*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
542*bed243d3SAndroid Build Coastguard Worker ///
543*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSMSK instruction.
544*bed243d3SAndroid Build Coastguard Worker ///
545*bed243d3SAndroid Build Coastguard Worker /// \param __X
546*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer used to create the mask.
547*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the newly created mask.
548*bed243d3SAndroid Build Coastguard Worker /// \see _blsmsk_u64
549*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsmsk_u64(unsigned long long __X)550*bed243d3SAndroid Build Coastguard Worker __blsmsk_u64(unsigned long long __X)
551*bed243d3SAndroid Build Coastguard Worker {
552*bed243d3SAndroid Build Coastguard Worker return __X ^ (__X - 1);
553*bed243d3SAndroid Build Coastguard Worker }
554*bed243d3SAndroid Build Coastguard Worker
555*bed243d3SAndroid Build Coastguard Worker /// Creates a mask whose bits are set to 1, using bit 0 up to and
556*bed243d3SAndroid Build Coastguard Worker /// including the least significant bit that is set to 1 in the source
557*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
558*bed243d3SAndroid Build Coastguard Worker ///
559*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
560*bed243d3SAndroid Build Coastguard Worker ///
561*bed243d3SAndroid Build Coastguard Worker /// \code
562*bed243d3SAndroid Build Coastguard Worker /// unsigned long long _blsmsk_u64(unsigned long long __X);
563*bed243d3SAndroid Build Coastguard Worker /// \endcode
564*bed243d3SAndroid Build Coastguard Worker ///
565*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSMSK instruction.
566*bed243d3SAndroid Build Coastguard Worker ///
567*bed243d3SAndroid Build Coastguard Worker /// \param __X
568*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer used to create the mask.
569*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the newly created mask.
570*bed243d3SAndroid Build Coastguard Worker /// \see __blsmsk_u64
571*bed243d3SAndroid Build Coastguard Worker #define _blsmsk_u64 __blsmsk_u64
572*bed243d3SAndroid Build Coastguard Worker
573*bed243d3SAndroid Build Coastguard Worker /// Clears the least significant bit that is set to 1 in the source
574*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
575*bed243d3SAndroid Build Coastguard Worker ///
576*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
577*bed243d3SAndroid Build Coastguard Worker ///
578*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSR instruction.
579*bed243d3SAndroid Build Coastguard Worker ///
580*bed243d3SAndroid Build Coastguard Worker /// \param __X
581*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing the operand to be cleared.
582*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the result of clearing the
583*bed243d3SAndroid Build Coastguard Worker /// source operand.
584*bed243d3SAndroid Build Coastguard Worker /// \see _blsr_u64
585*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__blsr_u64(unsigned long long __X)586*bed243d3SAndroid Build Coastguard Worker __blsr_u64(unsigned long long __X)
587*bed243d3SAndroid Build Coastguard Worker {
588*bed243d3SAndroid Build Coastguard Worker return __X & (__X - 1);
589*bed243d3SAndroid Build Coastguard Worker }
590*bed243d3SAndroid Build Coastguard Worker
591*bed243d3SAndroid Build Coastguard Worker /// Clears the least significant bit that is set to 1 in the source
592*bed243d3SAndroid Build Coastguard Worker /// operand and returns the result.
593*bed243d3SAndroid Build Coastguard Worker ///
594*bed243d3SAndroid Build Coastguard Worker /// \headerfile <x86intrin.h>
595*bed243d3SAndroid Build Coastguard Worker ///
596*bed243d3SAndroid Build Coastguard Worker /// \code
597*bed243d3SAndroid Build Coastguard Worker /// unsigned long long _blsr_u64(unsigned long long __X);
598*bed243d3SAndroid Build Coastguard Worker /// \endcode
599*bed243d3SAndroid Build Coastguard Worker ///
600*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c BLSR instruction.
601*bed243d3SAndroid Build Coastguard Worker ///
602*bed243d3SAndroid Build Coastguard Worker /// \param __X
603*bed243d3SAndroid Build Coastguard Worker /// An unsigned 64-bit integer containing the operand to be cleared.
604*bed243d3SAndroid Build Coastguard Worker /// \returns An unsigned 64-bit integer containing the result of clearing the
605*bed243d3SAndroid Build Coastguard Worker /// source operand.
606*bed243d3SAndroid Build Coastguard Worker /// \see __blsr_u64
607*bed243d3SAndroid Build Coastguard Worker #define _blsr_u64 __blsr_u64
608*bed243d3SAndroid Build Coastguard Worker
609*bed243d3SAndroid Build Coastguard Worker #endif /* __x86_64__ */
610*bed243d3SAndroid Build Coastguard Worker
611*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS
612*bed243d3SAndroid Build Coastguard Worker
613*bed243d3SAndroid Build Coastguard Worker #endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
614*bed243d3SAndroid Build Coastguard Worker || defined(__BMI__) */
615*bed243d3SAndroid Build Coastguard Worker
616*bed243d3SAndroid Build Coastguard Worker #endif /* __BMIINTRIN_H */
617