support.h revision 9e98b34a8c03460dacab05068d900dd424e45e53
192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// -*- C++ -*- 2efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant//===----------------------- support/win32/support.h ----------------------===// 392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// The LLVM Compiler Infrastructure 592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 892a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// 992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//===----------------------------------------------------------------------===// 1092a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant 11efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#ifndef _LIBCPP_SUPPORT_WIN32_SUPPORT_H 12efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define _LIBCPP_SUPPORT_WIN32_SUPPORT_H 13efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 1492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant/* 1592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant Functions and constants used in libc++ that are missing from the Windows C library. 1692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant */ 1792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant 189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include <cwchar> // mbstate_t 199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include <cstdarg> // va_ macros 20efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define swprintf _snwprintf 21efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vswprintf _vsnwprintf 22efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantextern "C" { 24efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint vasprintf( char **sptr, const char *__restrict fmt, va_list ap ); 269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint asprintf( char **sptr, const char *__restrict fmt, ...); 2778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src, 2878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant size_t nmc, size_t len, mbstate_t *__restrict ps ); 2978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src, 3078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant size_t nwc, size_t len, mbstate_t *__restrict ps ); 319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 32f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant 3378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#if defined(_MSC_VER) 3478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define snprintf _snprintf 3578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <xlocinfo.h> 3678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define atoll _atoi64 3778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoll _strtoi64 3878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoull _strtoui64 3978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoll _wcstoi64 4078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoull _wcstoui64 4178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE float strtof( const char *nptr, char **endptr ) 4278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stof(nptr, endptr, 0); } 4378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE double strtod( const char *nptr, char **endptr ) 4478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stod(nptr, endptr, 0); } 4578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE long double strtold( const char *nptr, char **endptr ) 4678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stold(nptr, endptr, 0); } 4778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant 4878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define _Exit _exit 4978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant 509f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#ifndef __clang__ // MSVC-based Clang also defines _MSC_VER 5178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <intrin.h> 52438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant 53438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcount(unsigned int x) { 54438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned int m1 = 0x55555555; //binary: 0101... 55438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned int m2 = 0x33333333; //binary: 00110011.. 56438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned int m4 = 0x0f0f0f0f; //binary: 4 zeros, 4 ones ... 57438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned int h01= 0x01010101; //the sum of 256 to the power of 0,1,2,3... 58438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x -= (x >> 1) & m1; //put count of each 2 bits into those 2 bits 59438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits 60438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x = (x + (x >> 4)) & m4; //put count of each 8 bits into those 8 bits 61438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant return (x * h01) >> 24; //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) 62438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant} 63438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant 64438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountl(unsigned long x) { 65438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant return __builtin_popcount(static_cast<int>(x)); 66438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant} 67438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant 68438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountll(unsigned long long x) { 69438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned long long m1 = 0x5555555555555555; //binary: 0101... 70438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned long long m2 = 0x3333333333333333; //binary: 00110011.. 71438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned long long m4 = 0x0f0f0f0f0f0f0f0f; //binary: 4 zeros, 4 ones ... 72438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant static const unsigned long long h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3... 73438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x -= (x >> 1) & m1; //put count of each 2 bits into those 2 bits 74438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits 75438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant x = (x + (x >> 4)) & m4; //put count of each 8 bits into those 8 bits 76438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant return static_cast<int>((x * h01)>>56); //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... 77438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant} 7878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant 7978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctz( unsigned int x ) 8078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ 8178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant DWORD r = 0; 8278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant _BitScanReverse(&r, x); 8378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant return static_cast<int>(r); 8478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant} 859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 8678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows 8778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzl( unsigned long x ) 8878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_ctz( static_cast<int>(x) ); } 899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 9078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzll( unsigned long long x ) 9178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ 9278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant DWORD r = 0; 93f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant _BitScanReverse64(&r, x); 94f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant return static_cast<int>(r); 9578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant} 9678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clz( unsigned int x ) 9778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ 9878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant DWORD r = 0; 9978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant _BitScanForward(&r, x); 10078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant return static_cast<int>(r); 10178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant} 10278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows 10378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzl( unsigned long x ) 10478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_clz( static_cast<int>(x) ); } 10578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzll( unsigned long long x ) 10678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ 10778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant DWORD r = 0; 108f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant _BitScanForward64(&r, x); 109f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant return static_cast<int>(r); 11078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant} 1119f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#endif // !__clang__ 1129f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#endif // _MSC_VER 113efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant 114d41b60b2b42114bc7664b016f6be619c46095e59Bob Wilson#endif // _LIBCPP_SUPPORT_WIN32_SUPPORT_H 115