blob: 35c1651cc4a80d953e52c0a3ec7eb04014c9216c [file] [log] [blame]
Craig Topperf2855ad2011-12-25 06:25:37 +00001/*===---- lzcntintrin.h - LZCNT intrinsics ---------------------------------===
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 *
21 *===-----------------------------------------------------------------------===
22 */
23
24#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
25#error "Never use <lzcntintrin.h> directly; include <x86intrin.h> instead."
26#endif
27
Craig Topperf2855ad2011-12-25 06:25:37 +000028#ifndef __LZCNTINTRIN_H
29#define __LZCNTINTRIN_H
30
Eric Christopher4d1851682015-06-17 07:09:20 +000031/* Define the default attributes for the functions in this file. */
Michael Kupersteine45af542015-06-30 13:36:19 +000032#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("lzcnt")))
Eric Christopher4d1851682015-06-17 07:09:20 +000033
Craig Topper1f2b1812018-12-14 00:21:02 +000034#ifndef _MSC_VER
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000035/// Counts the number of leading zero bits in the operand.
Ekaterina Romanova06b19142016-11-18 06:26:01 +000036///
37/// \headerfile <x86intrin.h>
38///
39/// This intrinsic corresponds to the \c LZCNT instruction.
40///
41/// \param __X
42/// An unsigned 16-bit integer whose leading zeros are to be counted.
43/// \returns An unsigned 16-bit integer containing the number of leading zero
44/// bits in the operand.
Craig Topper1f2b1812018-12-14 00:21:02 +000045#define __lzcnt16(X) __builtin_ia32_lzcnt_u16((unsigned short)(X))
46#endif // _MSC_VER
Craig Topperf2855ad2011-12-25 06:25:37 +000047
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000048/// Counts the number of leading zero bits in the operand.
Ekaterina Romanova06b19142016-11-18 06:26:01 +000049///
50/// \headerfile <x86intrin.h>
51///
52/// This intrinsic corresponds to the \c LZCNT instruction.
53///
54/// \param __X
55/// An unsigned 32-bit integer whose leading zeros are to be counted.
56/// \returns An unsigned 32-bit integer containing the number of leading zero
57/// bits in the operand.
Ekaterina Romanova9b412152018-05-23 06:33:22 +000058/// \see _lzcnt_u32
Michael Kupersteine45af542015-06-30 13:36:19 +000059static __inline__ unsigned int __DEFAULT_FN_ATTRS
Craig Topperf2855ad2011-12-25 06:25:37 +000060__lzcnt32(unsigned int __X)
61{
Craig Topperfb5d9f22018-09-26 17:01:44 +000062 return __builtin_ia32_lzcnt_u32(__X);
Craig Topperf2855ad2011-12-25 06:25:37 +000063}
64
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000065/// Counts the number of leading zero bits in the operand.
Ekaterina Romanova06b19142016-11-18 06:26:01 +000066///
67/// \headerfile <x86intrin.h>
68///
69/// This intrinsic corresponds to the \c LZCNT instruction.
70///
71/// \param __X
72/// An unsigned 32-bit integer whose leading zeros are to be counted.
73/// \returns An unsigned 32-bit integer containing the number of leading zero
74/// bits in the operand.
Ekaterina Romanova9b412152018-05-23 06:33:22 +000075/// \see __lzcnt32
Michael Kupersteine45af542015-06-30 13:36:19 +000076static __inline__ unsigned int __DEFAULT_FN_ATTRS
Craig Toppere1c664b2014-11-01 22:50:57 +000077_lzcnt_u32(unsigned int __X)
78{
Craig Topperfb5d9f22018-09-26 17:01:44 +000079 return __builtin_ia32_lzcnt_u32(__X);
Craig Toppere1c664b2014-11-01 22:50:57 +000080}
81
Craig Topperf2855ad2011-12-25 06:25:37 +000082#ifdef __x86_64__
Craig Topper1f2b1812018-12-14 00:21:02 +000083#ifndef _MSC_VER
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000084/// Counts the number of leading zero bits in the operand.
Ekaterina Romanova06b19142016-11-18 06:26:01 +000085///
86/// \headerfile <x86intrin.h>
87///
88/// This intrinsic corresponds to the \c LZCNT instruction.
89///
90/// \param __X
91/// An unsigned 64-bit integer whose leading zeros are to be counted.
92/// \returns An unsigned 64-bit integer containing the number of leading zero
93/// bits in the operand.
Ekaterina Romanova9b412152018-05-23 06:33:22 +000094/// \see _lzcnt_u64
Craig Topper1f2b1812018-12-14 00:21:02 +000095#define __lzcnt64(X) __builtin_ia32_lzcnt_u64((unsigned long long)(X))
96#endif // _MSC_VER
Craig Toppere1c664b2014-11-01 22:50:57 +000097
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000098/// Counts the number of leading zero bits in the operand.
Ekaterina Romanova06b19142016-11-18 06:26:01 +000099///
100/// \headerfile <x86intrin.h>
101///
102/// This intrinsic corresponds to the \c LZCNT instruction.
103///
104/// \param __X
105/// An unsigned 64-bit integer whose leading zeros are to be counted.
106/// \returns An unsigned 64-bit integer containing the number of leading zero
107/// bits in the operand.
Ekaterina Romanova9b412152018-05-23 06:33:22 +0000108/// \see __lzcnt64
Michael Kupersteine45af542015-06-30 13:36:19 +0000109static __inline__ unsigned long long __DEFAULT_FN_ATTRS
Craig Toppere1c664b2014-11-01 22:50:57 +0000110_lzcnt_u64(unsigned long long __X)
111{
Craig Topperfb5d9f22018-09-26 17:01:44 +0000112 return __builtin_ia32_lzcnt_u64(__X);
Craig Toppere1c664b2014-11-01 22:50:57 +0000113}
Craig Topperf2855ad2011-12-25 06:25:37 +0000114#endif
115
Michael Kupersteine45af542015-06-30 13:36:19 +0000116#undef __DEFAULT_FN_ATTRS
Eric Christopher4d1851682015-06-17 07:09:20 +0000117
Craig Topperf2855ad2011-12-25 06:25:37 +0000118#endif /* __LZCNTINTRIN_H */