1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker//===------------------------------ bit ----------------------------------===// 3*58b9f456SAndroid Build Coastguard Worker// 4*58b9f456SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker// 6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker// 9*58b9f456SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_BIT 12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_BIT 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker/* 15*58b9f456SAndroid Build Coastguard Worker bit synopsis 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Workernamespace std { 18*58b9f456SAndroid Build Coastguard Worker 19*58b9f456SAndroid Build Coastguard Worker} // namespace std 20*58b9f456SAndroid Build Coastguard Worker 21*58b9f456SAndroid Build Coastguard Worker*/ 22*58b9f456SAndroid Build Coastguard Worker 23*58b9f456SAndroid Build Coastguard Worker#include <__config> 24*58b9f456SAndroid Build Coastguard Worker#include <version> 25*58b9f456SAndroid Build Coastguard Worker 26*58b9f456SAndroid Build Coastguard Worker#if defined(__IBMCPP__) 27*58b9f456SAndroid Build Coastguard Worker#include "support/ibm/support.h" 28*58b9f456SAndroid Build Coastguard Worker#endif 29*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_COMPILER_MSVC) 30*58b9f456SAndroid Build Coastguard Worker#include <intrin.h> 31*58b9f456SAndroid Build Coastguard Worker#endif 32*58b9f456SAndroid Build Coastguard Worker 33*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 34*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header 35*58b9f456SAndroid Build Coastguard Worker#endif 36*58b9f456SAndroid Build Coastguard Worker 37*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD 38*58b9f456SAndroid Build Coastguard Worker 39*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_COMPILER_MSVC 40*58b9f456SAndroid Build Coastguard Worker 41*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 42*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned __x) { return __builtin_ctz(__x); } 43*58b9f456SAndroid Build Coastguard Worker 44*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 45*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned long __x) { return __builtin_ctzl(__x); } 46*58b9f456SAndroid Build Coastguard Worker 47*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 48*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned long long __x) { return __builtin_ctzll(__x); } 49*58b9f456SAndroid Build Coastguard Worker 50*58b9f456SAndroid Build Coastguard Worker 51*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 52*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned __x) { return __builtin_clz(__x); } 53*58b9f456SAndroid Build Coastguard Worker 54*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 55*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned long __x) { return __builtin_clzl(__x); } 56*58b9f456SAndroid Build Coastguard Worker 57*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 58*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned long long __x) { return __builtin_clzll(__x); } 59*58b9f456SAndroid Build Coastguard Worker 60*58b9f456SAndroid Build Coastguard Worker 61*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 62*58b9f456SAndroid Build Coastguard Workerint __popcount(unsigned __x) { return __builtin_popcount(__x); } 63*58b9f456SAndroid Build Coastguard Worker 64*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 65*58b9f456SAndroid Build Coastguard Workerint __popcount(unsigned long __x) { return __builtin_popcountl(__x); } 66*58b9f456SAndroid Build Coastguard Worker 67*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 68*58b9f456SAndroid Build Coastguard Workerint __popcount(unsigned long long __x) { return __builtin_popcountll(__x); } 69*58b9f456SAndroid Build Coastguard Worker 70*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_COMPILER_MSVC 71*58b9f456SAndroid Build Coastguard Worker 72*58b9f456SAndroid Build Coastguard Worker// Precondition: __x != 0 73*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 74*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned __x) { 75*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned) == sizeof(unsigned long), ""); 76*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned long) == 4, ""); 77*58b9f456SAndroid Build Coastguard Worker unsigned long __where; 78*58b9f456SAndroid Build Coastguard Worker if (_BitScanForward(&__where, __x)) 79*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(__where); 80*58b9f456SAndroid Build Coastguard Worker return 32; 81*58b9f456SAndroid Build Coastguard Worker} 82*58b9f456SAndroid Build Coastguard Worker 83*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 84*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned long __x) { 85*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned long) == sizeof(unsigned), ""); 86*58b9f456SAndroid Build Coastguard Worker return __ctz(static_cast<unsigned>(__x)); 87*58b9f456SAndroid Build Coastguard Worker} 88*58b9f456SAndroid Build Coastguard Worker 89*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 90*58b9f456SAndroid Build Coastguard Workerint __ctz(unsigned long long __x) { 91*58b9f456SAndroid Build Coastguard Worker unsigned long __where; 92*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_HAS_BITSCAN64) 93*58b9f456SAndroid Build Coastguard Worker (defined(_M_AMD64) || defined(__x86_64__)) 94*58b9f456SAndroid Build Coastguard Worker if (_BitScanForward64(&__where, __x)) 95*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(__where); 96*58b9f456SAndroid Build Coastguard Worker#else 97*58b9f456SAndroid Build Coastguard Worker // Win32 doesn't have _BitScanForward64 so emulate it with two 32 bit calls. 98*58b9f456SAndroid Build Coastguard Worker if (_BitScanForward(&__where, static_cast<unsigned long>(__x))) 99*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(__where); 100*58b9f456SAndroid Build Coastguard Worker if (_BitScanForward(&__where, static_cast<unsigned long>(__x >> 32))) 101*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(__where + 32); 102*58b9f456SAndroid Build Coastguard Worker#endif 103*58b9f456SAndroid Build Coastguard Worker return 64; 104*58b9f456SAndroid Build Coastguard Worker} 105*58b9f456SAndroid Build Coastguard Worker 106*58b9f456SAndroid Build Coastguard Worker// Precondition: __x != 0 107*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 108*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned __x) { 109*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned) == sizeof(unsigned long), ""); 110*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned long) == 4, ""); 111*58b9f456SAndroid Build Coastguard Worker unsigned long __where; 112*58b9f456SAndroid Build Coastguard Worker if (_BitScanReverse(&__where, __x)) 113*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(31 - __where); 114*58b9f456SAndroid Build Coastguard Worker return 32; // Undefined Behavior. 115*58b9f456SAndroid Build Coastguard Worker} 116*58b9f456SAndroid Build Coastguard Worker 117*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 118*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned long __x) { 119*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned) == sizeof(unsigned long), ""); 120*58b9f456SAndroid Build Coastguard Worker return __clz(static_cast<unsigned>(__x)); 121*58b9f456SAndroid Build Coastguard Worker} 122*58b9f456SAndroid Build Coastguard Worker 123*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 124*58b9f456SAndroid Build Coastguard Workerint __clz(unsigned long long __x) { 125*58b9f456SAndroid Build Coastguard Worker unsigned long __where; 126*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_HAS_BITSCAN64) 127*58b9f456SAndroid Build Coastguard Worker if (_BitScanReverse64(&__where, __x)) 128*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(63 - __where); 129*58b9f456SAndroid Build Coastguard Worker#else 130*58b9f456SAndroid Build Coastguard Worker // Win32 doesn't have _BitScanReverse64 so emulate it with two 32 bit calls. 131*58b9f456SAndroid Build Coastguard Worker if (_BitScanReverse(&__where, static_cast<unsigned long>(__x >> 32))) 132*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(63 - (__where + 32)); 133*58b9f456SAndroid Build Coastguard Worker if (_BitScanReverse(&__where, static_cast<unsigned long>(__x))) 134*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(63 - __where); 135*58b9f456SAndroid Build Coastguard Worker#endif 136*58b9f456SAndroid Build Coastguard Worker return 64; // Undefined Behavior. 137*58b9f456SAndroid Build Coastguard Worker} 138*58b9f456SAndroid Build Coastguard Worker 139*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned __x) { 140*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned) == 4, ""); 141*58b9f456SAndroid Build Coastguard Worker return __popcnt(__x); 142*58b9f456SAndroid Build Coastguard Worker} 143*58b9f456SAndroid Build Coastguard Worker 144*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned long __x) { 145*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned long) == 4, ""); 146*58b9f456SAndroid Build Coastguard Worker return __popcnt(__x); 147*58b9f456SAndroid Build Coastguard Worker} 148*58b9f456SAndroid Build Coastguard Worker 149*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned long long __x) { 150*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof(unsigned long long) == 8, ""); 151*58b9f456SAndroid Build Coastguard Worker return __popcnt64(__x); 152*58b9f456SAndroid Build Coastguard Worker} 153*58b9f456SAndroid Build Coastguard Worker 154*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_COMPILER_MSVC 155*58b9f456SAndroid Build Coastguard Worker 156*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD 157*58b9f456SAndroid Build Coastguard Worker 158*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_BIT 159