1e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper/*===---- popcntintrin.h - POPCNT intrinsics -------------------------------===
2e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper *
3e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * Permission is hereby granted, free of charge, to any person obtaining a copy
4e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * of this software and associated documentation files (the "Software"), to deal
5e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * in the Software without restriction, including without limitation the rights
6e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * copies of the Software, and to permit persons to whom the Software is
8e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * furnished to do so, subject to the following conditions:
9e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper *
10e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * The above copyright notice and this permission notice shall be included in
11e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * all copies or substantial portions of the Software.
12e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper *
13e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper * THE SOFTWARE.
20e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper *
21e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper *===-----------------------------------------------------------------------===
22e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper */
23e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper
24e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper#ifndef _POPCNTINTRIN_H
25e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper#define _POPCNTINTRIN_H
26e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper
27a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar/* Define the default attributes for the functions in this file. */
28a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("popcnt")))
29a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
30a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstatic __inline__ int __DEFAULT_FN_ATTRS
31e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper_mm_popcnt_u32(unsigned int __A)
32e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper{
33e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper  return __builtin_popcount(__A);
34e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper}
35e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper
36a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstatic __inline__ int __DEFAULT_FN_ATTRS
37a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar_popcnt32(int __A)
38a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar{
39a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  return __builtin_popcount(__A);
40a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
41a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
42e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper#ifdef __x86_64__
43a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstatic __inline__ long long __DEFAULT_FN_ATTRS
44e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper_mm_popcnt_u64(unsigned long long __A)
45e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper{
46e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper  return __builtin_popcountll(__A);
47e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper}
48a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
49a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstatic __inline__ long long __DEFAULT_FN_ATTRS
50a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar_popcnt64(long long __A)
51a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar{
52a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  return __builtin_popcountll(__A);
53a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
54e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper#endif /* __x86_64__ */
55e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper
56a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#undef __DEFAULT_FN_ATTRS
57a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
58e14e08b2552b43d81a295401ddf9b8da2c499233Craig Topper#endif /* _POPCNTINTRIN_H */
59