blob: 3d2769da3bae4284f1400ba2c325fd8cf3a5d2b7 [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
Ekaterina Romanova06b19142016-11-18 06:26:01 +000034/// \brief Counts the number of leading zero bits in the operand.
35///
36/// \headerfile <x86intrin.h>
37///
38/// This intrinsic corresponds to the \c LZCNT instruction.
39///
40/// \param __X
41/// An unsigned 16-bit integer whose leading zeros are to be counted.
42/// \returns An unsigned 16-bit integer containing the number of leading zero
43/// bits in the operand.
Michael Kupersteine45af542015-06-30 13:36:19 +000044static __inline__ unsigned short __DEFAULT_FN_ATTRS
Craig Topperf2855ad2011-12-25 06:25:37 +000045__lzcnt16(unsigned short __X)
46{
Craig Topper3ca55d92014-11-01 22:25:23 +000047 return __X ? __builtin_clzs(__X) : 16;
Craig Topperf2855ad2011-12-25 06:25:37 +000048}
49
Ekaterina Romanova06b19142016-11-18 06:26:01 +000050/// \brief Counts the number of leading zero bits in the operand.
51///
52/// \headerfile <x86intrin.h>
53///
54/// This intrinsic corresponds to the \c LZCNT instruction.
55///
56/// \param __X
57/// An unsigned 32-bit integer whose leading zeros are to be counted.
58/// \returns An unsigned 32-bit integer containing the number of leading zero
59/// bits in the operand.
Michael Kupersteine45af542015-06-30 13:36:19 +000060static __inline__ unsigned int __DEFAULT_FN_ATTRS
Craig Topperf2855ad2011-12-25 06:25:37 +000061__lzcnt32(unsigned int __X)
62{
Craig Topper3ca55d92014-11-01 22:25:23 +000063 return __X ? __builtin_clz(__X) : 32;
Craig Topperf2855ad2011-12-25 06:25:37 +000064}
65
Ekaterina Romanova06b19142016-11-18 06:26:01 +000066/// \brief Counts the number of leading zero bits in the operand.
67///
68/// \headerfile <x86intrin.h>
69///
70/// This intrinsic corresponds to the \c LZCNT instruction.
71///
72/// \param __X
73/// An unsigned 32-bit integer whose leading zeros are to be counted.
74/// \returns An unsigned 32-bit integer containing the number of leading zero
75/// bits in the operand.
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{
79 return __X ? __builtin_clz(__X) : 32;
80}
81
Craig Topperf2855ad2011-12-25 06:25:37 +000082#ifdef __x86_64__
Ekaterina Romanova06b19142016-11-18 06:26:01 +000083/// \brief Counts the number of leading zero bits in the operand.
84///
85/// \headerfile <x86intrin.h>
86///
87/// This intrinsic corresponds to the \c LZCNT instruction.
88///
89/// \param __X
90/// An unsigned 64-bit integer whose leading zeros are to be counted.
91/// \returns An unsigned 64-bit integer containing the number of leading zero
92/// bits in the operand.
Michael Kupersteine45af542015-06-30 13:36:19 +000093static __inline__ unsigned long long __DEFAULT_FN_ATTRS
Craig Topperf2855ad2011-12-25 06:25:37 +000094__lzcnt64(unsigned long long __X)
95{
Craig Topper3ca55d92014-11-01 22:25:23 +000096 return __X ? __builtin_clzll(__X) : 64;
Craig Topperf2855ad2011-12-25 06:25:37 +000097}
Craig Toppere1c664b2014-11-01 22:50:57 +000098
Ekaterina Romanova06b19142016-11-18 06:26:01 +000099/// \brief Counts the number of leading zero bits in the operand.
100///
101/// \headerfile <x86intrin.h>
102///
103/// This intrinsic corresponds to the \c LZCNT instruction.
104///
105/// \param __X
106/// An unsigned 64-bit integer whose leading zeros are to be counted.
107/// \returns An unsigned 64-bit integer containing the number of leading zero
108/// bits in the operand.
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{
112 return __X ? __builtin_clzll(__X) : 64;
113}
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 */